Skip to content

Commit a3b111b

Browse files
committed
Merge tag 'for-6.4/block-2023-05-06' of git://git.kernel.dk/linux
Pull more block updates from Jens Axboe: - MD pull request via Song: - Improve raid5 sequential IO performance on spinning disks, which fixes a regression since v6.0 (Jan Kara) - Fix bitmap offset types, which fixes an issue introduced in this merge window (Jonathan Derrick) - Cleanup of hweight type used for cgroup writeback (Maxim) - Fix a regression with the "has_submit_bio" changes across partitions (Ming) - Cleanup of QUEUE_FLAG_ADD_RANDOM clearing. We used to set this flag on queues non blk-mq queues, and hence some drivers clear it unconditionally. Since all of these have since been converted to true blk-mq drivers, drop the useless clear as the bit is not set (Chaitanya) - Fix the flags being set in a bio for a flush for drbd (Christoph) - Cleanup and deduplication of the code handling setting block device capacity (Damien) - Fix for ublk handling IO timeouts (Ming) - Fix for a regression in blk-cgroup teardown (Tao) - NBD documentation and code fixes (Eric) - Convert blk-integrity to using device_attributes rather than a second kobject to manage lifetimes (Thomas) * tag 'for-6.4/block-2023-05-06' of git://git.kernel.dk/linux: ublk: add timeout handler drbd: correctly submit flush bio on barrier mailmap: add mailmap entries for Jens Axboe block: Skip destroyed blkg when restart in blkg_destroy_all() writeback: fix call of incorrect macro md: Fix bitmap offset type in sb writer md/raid5: Improve performance for sequential IO docs nbd: userspace NBD now favors github over sourceforge block nbd: use req.cookie instead of req.handle uapi nbd: add cookie alias to handle uapi nbd: improve doc links to userspace spec blk-integrity: register sysfs attributes on struct device blk-integrity: convert to struct device_attribute blk-integrity: use sysfs_emit block/drivers: remove dead clear of random flag block: sync part's ->bd_has_submit_bio with disk's block: Cleanup set_capacity()/bdev_set_nr_sectors()
2 parents 7644c82 + c0b79b0 commit a3b111b

File tree

20 files changed

+192
-170
lines changed

20 files changed

+192
-170
lines changed

.mailmap

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,10 @@ Jeff Garzik <jgarzik@pretzel.yyz.us>
213213
Jeff Layton <jlayton@kernel.org> <jlayton@poochiereds.net>
214214
Jeff Layton <jlayton@kernel.org> <jlayton@primarydata.com>
215215
Jeff Layton <jlayton@kernel.org> <jlayton@redhat.com>
216-
Jens Axboe <axboe@suse.de>
216+
Jens Axboe <axboe@kernel.dk> <axboe@suse.de>
217+
Jens Axboe <axboe@kernel.dk> <jens.axboe@oracle.com>
218+
Jens Axboe <axboe@kernel.dk> <axboe@fb.com>
219+
Jens Axboe <axboe@kernel.dk> <axboe@meta.com>
217220
Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
218221
Jernej Skrabec <jernej.skrabec@gmail.com> <jernej.skrabec@siol.net>
219222
Jessica Zhang <quic_jesszhan@quicinc.com> <jesszhan@codeaurora.org>

Documentation/admin-guide/blockdev/nbd.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ to borrow disk space from another computer.
1414
Unlike NFS, it is possible to put any filesystem on it, etc.
1515

1616
For more information, or to download the nbd-client and nbd-server
17-
tools, go to http://nbd.sf.net/.
17+
tools, go to https://github.com/NetworkBlockDevice/nbd.
1818

1919
The nbd kernel module need only be installed on the client
2020
system, as the nbd-server is completely in userspace. In fact,

block/bdev.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,8 +418,11 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
418418
bdev->bd_partno = partno;
419419
bdev->bd_inode = inode;
420420
bdev->bd_queue = disk->queue;
421+
if (partno)
422+
bdev->bd_has_submit_bio = disk->part0->bd_has_submit_bio;
423+
else
424+
bdev->bd_has_submit_bio = false;
421425
bdev->bd_stats = alloc_percpu(struct disk_stats);
422-
bdev->bd_has_submit_bio = false;
423426
if (!bdev->bd_stats) {
424427
iput(inode);
425428
return NULL;
@@ -428,6 +431,14 @@ struct block_device *bdev_alloc(struct gendisk *disk, u8 partno)
428431
return bdev;
429432
}
430433

434+
void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors)
435+
{
436+
spin_lock(&bdev->bd_size_lock);
437+
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
438+
bdev->bd_nr_sectors = sectors;
439+
spin_unlock(&bdev->bd_size_lock);
440+
}
441+
431442
void bdev_add(struct block_device *bdev, dev_t dev)
432443
{
433444
bdev->bd_dev = dev;

block/blk-cgroup.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,9 @@ static void blkg_destroy_all(struct gendisk *disk)
567567
list_for_each_entry_safe(blkg, n, &q->blkg_list, q_node) {
568568
struct blkcg *blkcg = blkg->blkcg;
569569

570+
if (hlist_unhashed(&blkg->blkcg_node))
571+
continue;
572+
570573
spin_lock(&blkcg->lock);
571574
blkg_destroy(blkg);
572575
spin_unlock(&blkcg->lock);

block/blk-integrity.c

Lines changed: 61 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -212,61 +212,44 @@ bool blk_integrity_merge_bio(struct request_queue *q, struct request *req,
212212
return true;
213213
}
214214

215-
struct integrity_sysfs_entry {
216-
struct attribute attr;
217-
ssize_t (*show)(struct blk_integrity *, char *);
218-
ssize_t (*store)(struct blk_integrity *, const char *, size_t);
219-
};
220-
221-
static ssize_t integrity_attr_show(struct kobject *kobj, struct attribute *attr,
222-
char *page)
215+
static inline struct blk_integrity *dev_to_bi(struct device *dev)
223216
{
224-
struct gendisk *disk = container_of(kobj, struct gendisk, integrity_kobj);
225-
struct blk_integrity *bi = &disk->queue->integrity;
226-
struct integrity_sysfs_entry *entry =
227-
container_of(attr, struct integrity_sysfs_entry, attr);
228-
229-
return entry->show(bi, page);
217+
return &dev_to_disk(dev)->queue->integrity;
230218
}
231219

232-
static ssize_t integrity_attr_store(struct kobject *kobj,
233-
struct attribute *attr, const char *page,
234-
size_t count)
220+
static ssize_t format_show(struct device *dev, struct device_attribute *attr,
221+
char *page)
235222
{
236-
struct gendisk *disk = container_of(kobj, struct gendisk, integrity_kobj);
237-
struct blk_integrity *bi = &disk->queue->integrity;
238-
struct integrity_sysfs_entry *entry =
239-
container_of(attr, struct integrity_sysfs_entry, attr);
240-
ssize_t ret = 0;
223+
struct blk_integrity *bi = dev_to_bi(dev);
241224

242-
if (entry->store)
243-
ret = entry->store(bi, page, count);
244-
245-
return ret;
246-
}
247-
248-
static ssize_t integrity_format_show(struct blk_integrity *bi, char *page)
249-
{
250225
if (bi->profile && bi->profile->name)
251-
return sprintf(page, "%s\n", bi->profile->name);
252-
else
253-
return sprintf(page, "none\n");
226+
return sysfs_emit(page, "%s\n", bi->profile->name);
227+
return sysfs_emit(page, "none\n");
254228
}
255229

256-
static ssize_t integrity_tag_size_show(struct blk_integrity *bi, char *page)
230+
static ssize_t tag_size_show(struct device *dev, struct device_attribute *attr,
231+
char *page)
257232
{
258-
return sprintf(page, "%u\n", bi->tag_size);
233+
struct blk_integrity *bi = dev_to_bi(dev);
234+
235+
return sysfs_emit(page, "%u\n", bi->tag_size);
259236
}
260237

261-
static ssize_t integrity_interval_show(struct blk_integrity *bi, char *page)
238+
static ssize_t protection_interval_bytes_show(struct device *dev,
239+
struct device_attribute *attr,
240+
char *page)
262241
{
263-
return sprintf(page, "%u\n",
264-
bi->interval_exp ? 1 << bi->interval_exp : 0);
242+
struct blk_integrity *bi = dev_to_bi(dev);
243+
244+
return sysfs_emit(page, "%u\n",
245+
bi->interval_exp ? 1 << bi->interval_exp : 0);
265246
}
266247

267-
static ssize_t integrity_verify_store(struct blk_integrity *bi,
268-
const char *page, size_t count)
248+
static ssize_t read_verify_store(struct device *dev,
249+
struct device_attribute *attr,
250+
const char *page, size_t count)
269251
{
252+
struct blk_integrity *bi = dev_to_bi(dev);
270253
char *p = (char *) page;
271254
unsigned long val = simple_strtoul(p, &p, 10);
272255

@@ -278,14 +261,20 @@ static ssize_t integrity_verify_store(struct blk_integrity *bi,
278261
return count;
279262
}
280263

281-
static ssize_t integrity_verify_show(struct blk_integrity *bi, char *page)
264+
static ssize_t read_verify_show(struct device *dev,
265+
struct device_attribute *attr, char *page)
282266
{
283-
return sprintf(page, "%d\n", (bi->flags & BLK_INTEGRITY_VERIFY) != 0);
267+
struct blk_integrity *bi = dev_to_bi(dev);
268+
269+
return sysfs_emit(page, "%d\n", !!(bi->flags & BLK_INTEGRITY_VERIFY));
284270
}
285271

286-
static ssize_t integrity_generate_store(struct blk_integrity *bi,
287-
const char *page, size_t count)
272+
static ssize_t write_generate_store(struct device *dev,
273+
struct device_attribute *attr,
274+
const char *page, size_t count)
288275
{
276+
struct blk_integrity *bi = dev_to_bi(dev);
277+
289278
char *p = (char *) page;
290279
unsigned long val = simple_strtoul(p, &p, 10);
291280

@@ -297,68 +286,44 @@ static ssize_t integrity_generate_store(struct blk_integrity *bi,
297286
return count;
298287
}
299288

300-
static ssize_t integrity_generate_show(struct blk_integrity *bi, char *page)
289+
static ssize_t write_generate_show(struct device *dev,
290+
struct device_attribute *attr, char *page)
301291
{
302-
return sprintf(page, "%d\n", (bi->flags & BLK_INTEGRITY_GENERATE) != 0);
303-
}
292+
struct blk_integrity *bi = dev_to_bi(dev);
304293

305-
static ssize_t integrity_device_show(struct blk_integrity *bi, char *page)
306-
{
307-
return sprintf(page, "%u\n",
308-
(bi->flags & BLK_INTEGRITY_DEVICE_CAPABLE) != 0);
294+
return sysfs_emit(page, "%d\n", !!(bi->flags & BLK_INTEGRITY_GENERATE));
309295
}
310296

311-
static struct integrity_sysfs_entry integrity_format_entry = {
312-
.attr = { .name = "format", .mode = 0444 },
313-
.show = integrity_format_show,
314-
};
315-
316-
static struct integrity_sysfs_entry integrity_tag_size_entry = {
317-
.attr = { .name = "tag_size", .mode = 0444 },
318-
.show = integrity_tag_size_show,
319-
};
320-
321-
static struct integrity_sysfs_entry integrity_interval_entry = {
322-
.attr = { .name = "protection_interval_bytes", .mode = 0444 },
323-
.show = integrity_interval_show,
324-
};
325-
326-
static struct integrity_sysfs_entry integrity_verify_entry = {
327-
.attr = { .name = "read_verify", .mode = 0644 },
328-
.show = integrity_verify_show,
329-
.store = integrity_verify_store,
330-
};
297+
static ssize_t device_is_integrity_capable_show(struct device *dev,
298+
struct device_attribute *attr,
299+
char *page)
300+
{
301+
struct blk_integrity *bi = dev_to_bi(dev);
331302

332-
static struct integrity_sysfs_entry integrity_generate_entry = {
333-
.attr = { .name = "write_generate", .mode = 0644 },
334-
.show = integrity_generate_show,
335-
.store = integrity_generate_store,
336-
};
303+
return sysfs_emit(page, "%u\n",
304+
!!(bi->flags & BLK_INTEGRITY_DEVICE_CAPABLE));
305+
}
337306

338-
static struct integrity_sysfs_entry integrity_device_entry = {
339-
.attr = { .name = "device_is_integrity_capable", .mode = 0444 },
340-
.show = integrity_device_show,
341-
};
307+
static DEVICE_ATTR_RO(format);
308+
static DEVICE_ATTR_RO(tag_size);
309+
static DEVICE_ATTR_RO(protection_interval_bytes);
310+
static DEVICE_ATTR_RW(read_verify);
311+
static DEVICE_ATTR_RW(write_generate);
312+
static DEVICE_ATTR_RO(device_is_integrity_capable);
342313

343314
static struct attribute *integrity_attrs[] = {
344-
&integrity_format_entry.attr,
345-
&integrity_tag_size_entry.attr,
346-
&integrity_interval_entry.attr,
347-
&integrity_verify_entry.attr,
348-
&integrity_generate_entry.attr,
349-
&integrity_device_entry.attr,
350-
NULL,
315+
&dev_attr_format.attr,
316+
&dev_attr_tag_size.attr,
317+
&dev_attr_protection_interval_bytes.attr,
318+
&dev_attr_read_verify.attr,
319+
&dev_attr_write_generate.attr,
320+
&dev_attr_device_is_integrity_capable.attr,
321+
NULL
351322
};
352-
ATTRIBUTE_GROUPS(integrity);
353323

354-
static const struct sysfs_ops integrity_ops = {
355-
.show = &integrity_attr_show,
356-
.store = &integrity_attr_store,
357-
};
358-
359-
static const struct kobj_type integrity_ktype = {
360-
.default_groups = integrity_groups,
361-
.sysfs_ops = &integrity_ops,
324+
const struct attribute_group blk_integrity_attr_group = {
325+
.name = "integrity",
326+
.attrs = integrity_attrs,
362327
};
363328

364329
static blk_status_t blk_integrity_nop_fn(struct blk_integrity_iter *iter)
@@ -437,21 +402,3 @@ void blk_integrity_unregister(struct gendisk *disk)
437402
memset(bi, 0, sizeof(*bi));
438403
}
439404
EXPORT_SYMBOL(blk_integrity_unregister);
440-
441-
int blk_integrity_add(struct gendisk *disk)
442-
{
443-
int ret;
444-
445-
ret = kobject_init_and_add(&disk->integrity_kobj, &integrity_ktype,
446-
&disk_to_dev(disk)->kobj, "%s", "integrity");
447-
if (!ret)
448-
kobject_uevent(&disk->integrity_kobj, KOBJ_ADD);
449-
return ret;
450-
}
451-
452-
void blk_integrity_del(struct gendisk *disk)
453-
{
454-
kobject_uevent(&disk->integrity_kobj, KOBJ_REMOVE);
455-
kobject_del(&disk->integrity_kobj);
456-
kobject_put(&disk->integrity_kobj);
457-
}

block/blk.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,7 @@ static inline bool integrity_req_gap_front_merge(struct request *req,
214214
bip_next->bip_vec[0].bv_offset);
215215
}
216216

217-
int blk_integrity_add(struct gendisk *disk);
218-
void blk_integrity_del(struct gendisk *);
217+
extern const struct attribute_group blk_integrity_attr_group;
219218
#else /* CONFIG_BLK_DEV_INTEGRITY */
220219
static inline bool blk_integrity_merge_rq(struct request_queue *rq,
221220
struct request *r1, struct request *r2)
@@ -248,13 +247,6 @@ static inline bool bio_integrity_endio(struct bio *bio)
248247
static inline void bio_integrity_free(struct bio *bio)
249248
{
250249
}
251-
static inline int blk_integrity_add(struct gendisk *disk)
252-
{
253-
return 0;
254-
}
255-
static inline void blk_integrity_del(struct gendisk *disk)
256-
{
257-
}
258250
#endif /* CONFIG_BLK_DEV_INTEGRITY */
259251

260252
unsigned long blk_rq_timeout(unsigned long timeout);
@@ -419,6 +411,8 @@ int bdev_resize_partition(struct gendisk *disk, int partno, sector_t start,
419411
sector_t length);
420412
void blk_drop_partitions(struct gendisk *disk);
421413

414+
void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors);
415+
422416
struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id,
423417
struct lock_class_key *lkclass);
424418

block/genhd.c

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,7 @@ static DEFINE_IDA(ext_devt_ida);
5757

5858
void set_capacity(struct gendisk *disk, sector_t sectors)
5959
{
60-
struct block_device *bdev = disk->part0;
61-
62-
spin_lock(&bdev->bd_size_lock);
63-
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
64-
bdev->bd_nr_sectors = sectors;
65-
spin_unlock(&bdev->bd_size_lock);
60+
bdev_set_nr_sectors(disk->part0, sectors);
6661
}
6762
EXPORT_SYMBOL(set_capacity);
6863

@@ -487,15 +482,11 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
487482
*/
488483
pm_runtime_set_memalloc_noio(ddev, true);
489484

490-
ret = blk_integrity_add(disk);
491-
if (ret)
492-
goto out_del_block_link;
493-
494485
disk->part0->bd_holder_dir =
495486
kobject_create_and_add("holders", &ddev->kobj);
496487
if (!disk->part0->bd_holder_dir) {
497488
ret = -ENOMEM;
498-
goto out_del_integrity;
489+
goto out_del_block_link;
499490
}
500491
disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj);
501492
if (!disk->slave_dir) {
@@ -558,8 +549,6 @@ int __must_check device_add_disk(struct device *parent, struct gendisk *disk,
558549
disk->slave_dir = NULL;
559550
out_put_holder_dir:
560551
kobject_put(disk->part0->bd_holder_dir);
561-
out_del_integrity:
562-
blk_integrity_del(disk);
563552
out_del_block_link:
564553
sysfs_remove_link(block_depr, dev_name(ddev));
565554
out_device_del:
@@ -621,7 +610,6 @@ void del_gendisk(struct gendisk *disk)
621610
if (WARN_ON_ONCE(!disk_live(disk) && !(disk->flags & GENHD_FL_HIDDEN)))
622611
return;
623612

624-
blk_integrity_del(disk);
625613
disk_del_events(disk);
626614

627615
mutex_lock(&disk->open_mutex);
@@ -1155,6 +1143,9 @@ static const struct attribute_group *disk_attr_groups[] = {
11551143
&disk_attr_group,
11561144
#ifdef CONFIG_BLK_DEV_IO_TRACE
11571145
&blk_trace_attr_group,
1146+
#endif
1147+
#ifdef CONFIG_BLK_DEV_INTEGRITY
1148+
&blk_integrity_attr_group,
11581149
#endif
11591150
NULL
11601151
};

block/partitions/core.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,6 @@ static int (*check_part[])(struct parsed_partitions *) = {
8585
NULL
8686
};
8787

88-
static void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors)
89-
{
90-
spin_lock(&bdev->bd_size_lock);
91-
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
92-
bdev->bd_nr_sectors = sectors;
93-
spin_unlock(&bdev->bd_size_lock);
94-
}
95-
9688
static struct parsed_partitions *allocate_partitions(struct gendisk *hd)
9789
{
9890
struct parsed_partitions *state;

0 commit comments

Comments
 (0)