Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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()

+192 -170
+4 -1
.mailmap
··· 213 213 Jeff Layton <jlayton@kernel.org> <jlayton@poochiereds.net> 214 214 Jeff Layton <jlayton@kernel.org> <jlayton@primarydata.com> 215 215 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> 217 220 Jens Osterkamp <Jens.Osterkamp@de.ibm.com> 218 221 Jernej Skrabec <jernej.skrabec@gmail.com> <jernej.skrabec@siol.net> 219 222 Jessica Zhang <quic_jesszhan@quicinc.com> <jesszhan@codeaurora.org>
+1 -1
Documentation/admin-guide/blockdev/nbd.rst
··· 14 14 Unlike NFS, it is possible to put any filesystem on it, etc. 15 15 16 16 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. 18 18 19 19 The nbd kernel module need only be installed on the client 20 20 system, as the nbd-server is completely in userspace. In fact,
+12 -1
block/bdev.c
··· 418 418 bdev->bd_partno = partno; 419 419 bdev->bd_inode = inode; 420 420 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; 421 425 bdev->bd_stats = alloc_percpu(struct disk_stats); 422 - bdev->bd_has_submit_bio = false; 423 426 if (!bdev->bd_stats) { 424 427 iput(inode); 425 428 return NULL; 426 429 } 427 430 bdev->bd_disk = disk; 428 431 return bdev; 432 + } 433 + 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); 429 440 } 430 441 431 442 void bdev_add(struct block_device *bdev, dev_t dev)
+3
block/blk-cgroup.c
··· 567 567 list_for_each_entry_safe(blkg, n, &q->blkg_list, q_node) { 568 568 struct blkcg *blkcg = blkg->blkcg; 569 569 570 + if (hlist_unhashed(&blkg->blkcg_node)) 571 + continue; 572 + 570 573 spin_lock(&blkcg->lock); 571 574 blkg_destroy(blkg); 572 575 spin_unlock(&blkcg->lock);
+61 -114
block/blk-integrity.c
··· 212 212 return true; 213 213 } 214 214 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) 223 216 { 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; 230 218 } 231 219 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) 235 222 { 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); 241 224 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 - { 250 225 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"); 254 228 } 255 229 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) 257 232 { 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); 259 236 } 260 237 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) 262 241 { 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); 265 246 } 266 247 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) 269 251 { 252 + struct blk_integrity *bi = dev_to_bi(dev); 270 253 char *p = (char *) page; 271 254 unsigned long val = simple_strtoul(p, &p, 10); 272 255 ··· 261 278 return count; 262 279 } 263 280 264 - static ssize_t integrity_verify_show(struct blk_integrity *bi, char *page) 281 + static ssize_t read_verify_show(struct device *dev, 282 + struct device_attribute *attr, char *page) 265 283 { 266 - return sprintf(page, "%d\n", (bi->flags & BLK_INTEGRITY_VERIFY) != 0); 284 + struct blk_integrity *bi = dev_to_bi(dev); 285 + 286 + return sysfs_emit(page, "%d\n", !!(bi->flags & BLK_INTEGRITY_VERIFY)); 267 287 } 268 288 269 - static ssize_t integrity_generate_store(struct blk_integrity *bi, 270 - const char *page, size_t count) 289 + static ssize_t write_generate_store(struct device *dev, 290 + struct device_attribute *attr, 291 + const char *page, size_t count) 271 292 { 293 + struct blk_integrity *bi = dev_to_bi(dev); 294 + 272 295 char *p = (char *) page; 273 296 unsigned long val = simple_strtoul(p, &p, 10); 274 297 ··· 286 297 return count; 287 298 } 288 299 289 - static ssize_t integrity_generate_show(struct blk_integrity *bi, char *page) 300 + static ssize_t write_generate_show(struct device *dev, 301 + struct device_attribute *attr, char *page) 290 302 { 291 - return sprintf(page, "%d\n", (bi->flags & BLK_INTEGRITY_GENERATE) != 0); 303 + struct blk_integrity *bi = dev_to_bi(dev); 304 + 305 + return sysfs_emit(page, "%d\n", !!(bi->flags & BLK_INTEGRITY_GENERATE)); 292 306 } 293 307 294 - static ssize_t integrity_device_show(struct blk_integrity *bi, char *page) 308 + static ssize_t device_is_integrity_capable_show(struct device *dev, 309 + struct device_attribute *attr, 310 + char *page) 295 311 { 296 - return sprintf(page, "%u\n", 297 - (bi->flags & BLK_INTEGRITY_DEVICE_CAPABLE) != 0); 312 + struct blk_integrity *bi = dev_to_bi(dev); 313 + 314 + return sysfs_emit(page, "%u\n", 315 + !!(bi->flags & BLK_INTEGRITY_DEVICE_CAPABLE)); 298 316 } 299 317 300 - static struct integrity_sysfs_entry integrity_format_entry = { 301 - .attr = { .name = "format", .mode = 0444 }, 302 - .show = integrity_format_show, 303 - }; 304 - 305 - static struct integrity_sysfs_entry integrity_tag_size_entry = { 306 - .attr = { .name = "tag_size", .mode = 0444 }, 307 - .show = integrity_tag_size_show, 308 - }; 309 - 310 - static struct integrity_sysfs_entry integrity_interval_entry = { 311 - .attr = { .name = "protection_interval_bytes", .mode = 0444 }, 312 - .show = integrity_interval_show, 313 - }; 314 - 315 - static struct integrity_sysfs_entry integrity_verify_entry = { 316 - .attr = { .name = "read_verify", .mode = 0644 }, 317 - .show = integrity_verify_show, 318 - .store = integrity_verify_store, 319 - }; 320 - 321 - static struct integrity_sysfs_entry integrity_generate_entry = { 322 - .attr = { .name = "write_generate", .mode = 0644 }, 323 - .show = integrity_generate_show, 324 - .store = integrity_generate_store, 325 - }; 326 - 327 - static struct integrity_sysfs_entry integrity_device_entry = { 328 - .attr = { .name = "device_is_integrity_capable", .mode = 0444 }, 329 - .show = integrity_device_show, 330 - }; 318 + static DEVICE_ATTR_RO(format); 319 + static DEVICE_ATTR_RO(tag_size); 320 + static DEVICE_ATTR_RO(protection_interval_bytes); 321 + static DEVICE_ATTR_RW(read_verify); 322 + static DEVICE_ATTR_RW(write_generate); 323 + static DEVICE_ATTR_RO(device_is_integrity_capable); 331 324 332 325 static struct attribute *integrity_attrs[] = { 333 - &integrity_format_entry.attr, 334 - &integrity_tag_size_entry.attr, 335 - &integrity_interval_entry.attr, 336 - &integrity_verify_entry.attr, 337 - &integrity_generate_entry.attr, 338 - &integrity_device_entry.attr, 339 - NULL, 340 - }; 341 - ATTRIBUTE_GROUPS(integrity); 342 - 343 - static const struct sysfs_ops integrity_ops = { 344 - .show = &integrity_attr_show, 345 - .store = &integrity_attr_store, 326 + &dev_attr_format.attr, 327 + &dev_attr_tag_size.attr, 328 + &dev_attr_protection_interval_bytes.attr, 329 + &dev_attr_read_verify.attr, 330 + &dev_attr_write_generate.attr, 331 + &dev_attr_device_is_integrity_capable.attr, 332 + NULL 346 333 }; 347 334 348 - static const struct kobj_type integrity_ktype = { 349 - .default_groups = integrity_groups, 350 - .sysfs_ops = &integrity_ops, 335 + const struct attribute_group blk_integrity_attr_group = { 336 + .name = "integrity", 337 + .attrs = integrity_attrs, 351 338 }; 352 339 353 340 static blk_status_t blk_integrity_nop_fn(struct blk_integrity_iter *iter) ··· 402 437 memset(bi, 0, sizeof(*bi)); 403 438 } 404 439 EXPORT_SYMBOL(blk_integrity_unregister); 405 - 406 - int blk_integrity_add(struct gendisk *disk) 407 - { 408 - int ret; 409 - 410 - ret = kobject_init_and_add(&disk->integrity_kobj, &integrity_ktype, 411 - &disk_to_dev(disk)->kobj, "%s", "integrity"); 412 - if (!ret) 413 - kobject_uevent(&disk->integrity_kobj, KOBJ_ADD); 414 - return ret; 415 - } 416 - 417 - void blk_integrity_del(struct gendisk *disk) 418 - { 419 - kobject_uevent(&disk->integrity_kobj, KOBJ_REMOVE); 420 - kobject_del(&disk->integrity_kobj); 421 - kobject_put(&disk->integrity_kobj); 422 - }
+3 -9
block/blk.h
··· 214 214 bip_next->bip_vec[0].bv_offset); 215 215 } 216 216 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; 219 218 #else /* CONFIG_BLK_DEV_INTEGRITY */ 220 219 static inline bool blk_integrity_merge_rq(struct request_queue *rq, 221 220 struct request *r1, struct request *r2) ··· 245 246 return true; 246 247 } 247 248 static inline void bio_integrity_free(struct bio *bio) 248 - { 249 - } 250 - static inline int blk_integrity_add(struct gendisk *disk) 251 - { 252 - return 0; 253 - } 254 - static inline void blk_integrity_del(struct gendisk *disk) 255 249 { 256 250 } 257 251 #endif /* CONFIG_BLK_DEV_INTEGRITY */ ··· 410 418 int bdev_resize_partition(struct gendisk *disk, int partno, sector_t start, 411 419 sector_t length); 412 420 void blk_drop_partitions(struct gendisk *disk); 421 + 422 + void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors); 413 423 414 424 struct gendisk *__alloc_disk_node(struct request_queue *q, int node_id, 415 425 struct lock_class_key *lkclass);
+5 -14
block/genhd.c
··· 57 57 58 58 void set_capacity(struct gendisk *disk, sector_t sectors) 59 59 { 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); 66 61 } 67 62 EXPORT_SYMBOL(set_capacity); 68 63 ··· 482 487 */ 483 488 pm_runtime_set_memalloc_noio(ddev, true); 484 489 485 - ret = blk_integrity_add(disk); 486 - if (ret) 487 - goto out_del_block_link; 488 - 489 490 disk->part0->bd_holder_dir = 490 491 kobject_create_and_add("holders", &ddev->kobj); 491 492 if (!disk->part0->bd_holder_dir) { 492 493 ret = -ENOMEM; 493 - goto out_del_integrity; 494 + goto out_del_block_link; 494 495 } 495 496 disk->slave_dir = kobject_create_and_add("slaves", &ddev->kobj); 496 497 if (!disk->slave_dir) { ··· 549 558 disk->slave_dir = NULL; 550 559 out_put_holder_dir: 551 560 kobject_put(disk->part0->bd_holder_dir); 552 - out_del_integrity: 553 - blk_integrity_del(disk); 554 561 out_del_block_link: 555 562 sysfs_remove_link(block_depr, dev_name(ddev)); 556 563 out_device_del: ··· 610 621 if (WARN_ON_ONCE(!disk_live(disk) && !(disk->flags & GENHD_FL_HIDDEN))) 611 622 return; 612 623 613 - blk_integrity_del(disk); 614 624 disk_del_events(disk); 615 625 616 626 mutex_lock(&disk->open_mutex); ··· 1143 1155 &disk_attr_group, 1144 1156 #ifdef CONFIG_BLK_DEV_IO_TRACE 1145 1157 &blk_trace_attr_group, 1158 + #endif 1159 + #ifdef CONFIG_BLK_DEV_INTEGRITY 1160 + &blk_integrity_attr_group, 1146 1161 #endif 1147 1162 NULL 1148 1163 };
-8
block/partitions/core.c
··· 85 85 NULL 86 86 }; 87 87 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 - 96 88 static struct parsed_partitions *allocate_partitions(struct gendisk *hd) 97 89 { 98 90 struct parsed_partitions *state;
-1
drivers/block/brd.c
··· 404 404 /* Tell the block layer that this is not a rotational device */ 405 405 blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue); 406 406 blk_queue_flag_set(QUEUE_FLAG_SYNCHRONOUS, disk->queue); 407 - blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, disk->queue); 408 407 blk_queue_flag_set(QUEUE_FLAG_NOWAIT, disk->queue); 409 408 err = add_disk(disk); 410 409 if (err)
+1 -1
drivers/block/drbd/drbd_receiver.c
··· 1283 1283 static void submit_one_flush(struct drbd_device *device, struct issue_flush_context *ctx) 1284 1284 { 1285 1285 struct bio *bio = bio_alloc(device->ldev->backing_bdev, 0, 1286 - REQ_OP_FLUSH | REQ_PREFLUSH, GFP_NOIO); 1286 + REQ_OP_WRITE | REQ_PREFLUSH, GFP_NOIO); 1287 1287 struct one_flush_context *octx = kmalloc(sizeof(*octx), GFP_NOIO); 1288 1288 1289 1289 if (!octx) {
+3 -4
drivers/block/nbd.c
··· 609 609 request.len = htonl(size); 610 610 } 611 611 handle = nbd_cmd_handle(cmd); 612 - memcpy(request.handle, &handle, sizeof(handle)); 612 + request.cookie = cpu_to_be64(handle); 613 613 614 614 trace_nbd_send_request(&request, nbd->index, blk_mq_rq_from_pdu(cmd)); 615 615 ··· 621 621 trace_nbd_header_sent(req, handle); 622 622 if (result < 0) { 623 623 if (was_interrupted(result)) { 624 - /* If we havne't sent anything we can just return BUSY, 624 + /* If we haven't sent anything we can just return BUSY, 625 625 * however if we have sent something we need to make 626 626 * sure we only allow this req to be sent until we are 627 627 * completely done. ··· 735 735 u32 tag; 736 736 int ret = 0; 737 737 738 - memcpy(&handle, reply->handle, sizeof(handle)); 738 + handle = be64_to_cpu(reply->cookie); 739 739 tag = nbd_handle_to_tag(handle); 740 740 hwq = blk_mq_unique_tag_to_hwq(tag); 741 741 if (hwq < nbd->tag_set.nr_hw_queues) ··· 1805 1805 * Tell the block layer that we are not a rotational device 1806 1806 */ 1807 1807 blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue); 1808 - blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, disk->queue); 1809 1808 disk->queue->limits.discard_granularity = 0; 1810 1809 blk_queue_max_discard_sectors(disk->queue, 0); 1811 1810 blk_queue_max_segment_size(disk->queue, UINT_MAX);
-1
drivers/block/null_blk/main.c
··· 2144 2144 2145 2145 nullb->q->queuedata = nullb; 2146 2146 blk_queue_flag_set(QUEUE_FLAG_NONROT, nullb->q); 2147 - blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, nullb->q); 2148 2147 2149 2148 mutex_lock(&lock); 2150 2149 rv = ida_simple_get(&nullb_indexes, 0, 0, GFP_KERNEL);
+31
drivers/block/ublk_drv.c
··· 129 129 unsigned long io_addr; /* mapped vm address */ 130 130 unsigned int max_io_sz; 131 131 bool force_abort; 132 + bool timeout; 132 133 unsigned short nr_io_ready; /* how many ios setup */ 133 134 struct ublk_device *dev; 134 135 struct ublk_io ios[]; ··· 899 898 } 900 899 } 901 900 901 + static enum blk_eh_timer_return ublk_timeout(struct request *rq) 902 + { 903 + struct ublk_queue *ubq = rq->mq_hctx->driver_data; 904 + 905 + if (ubq->flags & UBLK_F_UNPRIVILEGED_DEV) { 906 + if (!ubq->timeout) { 907 + send_sig(SIGKILL, ubq->ubq_daemon, 0); 908 + ubq->timeout = true; 909 + } 910 + 911 + return BLK_EH_DONE; 912 + } 913 + 914 + return BLK_EH_RESET_TIMER; 915 + } 916 + 902 917 static blk_status_t ublk_queue_rq(struct blk_mq_hw_ctx *hctx, 903 918 const struct blk_mq_queue_data *bd) 904 919 { ··· 974 957 .queue_rq = ublk_queue_rq, 975 958 .init_hctx = ublk_init_hctx, 976 959 .init_request = ublk_init_rq, 960 + .timeout = ublk_timeout, 977 961 }; 978 962 979 963 static int ublk_ch_open(struct inode *inode, struct file *filp) ··· 1755 1737 else if (!(info.flags & UBLK_F_UNPRIVILEGED_DEV)) 1756 1738 return -EPERM; 1757 1739 1740 + /* 1741 + * unprivileged device can't be trusted, but RECOVERY and 1742 + * RECOVERY_REISSUE still may hang error handling, so can't 1743 + * support recovery features for unprivileged ublk now 1744 + * 1745 + * TODO: provide forward progress for RECOVERY handler, so that 1746 + * unprivileged device can benefit from it 1747 + */ 1748 + if (info.flags & UBLK_F_UNPRIVILEGED_DEV) 1749 + info.flags &= ~(UBLK_F_USER_RECOVERY_REISSUE | 1750 + UBLK_F_USER_RECOVERY); 1751 + 1758 1752 /* the created device is always owned by current user */ 1759 1753 ublk_store_owner_uid_gid(&info.owner_uid, &info.owner_gid); 1760 1754 ··· 2037 2007 put_task_struct(ubq->ubq_daemon); 2038 2008 /* We have to reset it to NULL, otherwise ub won't accept new FETCH_REQ */ 2039 2009 ubq->ubq_daemon = NULL; 2010 + ubq->timeout = false; 2040 2011 2041 2012 for (i = 0; i < ubq->q_depth; i++) { 2042 2013 struct ublk_io *io = &ubq->ios[i];
-1
drivers/block/zram/zram_drv.c
··· 2215 2215 /* zram devices sort of resembles non-rotational disks */ 2216 2216 blk_queue_flag_set(QUEUE_FLAG_NONROT, zram->disk->queue); 2217 2217 blk_queue_flag_set(QUEUE_FLAG_SYNCHRONOUS, zram->disk->queue); 2218 - blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, zram->disk->queue); 2219 2218 2220 2219 /* 2221 2220 * To ensure that we always get PAGE_SIZE aligned
-1
drivers/md/bcache/super.c
··· 971 971 } 972 972 973 973 blk_queue_flag_set(QUEUE_FLAG_NONROT, d->disk->queue); 974 - blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, d->disk->queue); 975 974 976 975 blk_queue_write_cache(q, true, true); 977 976
+3 -3
drivers/md/md-bitmap.c
··· 219 219 } 220 220 221 221 static unsigned int bitmap_io_size(unsigned int io_size, unsigned int opt_size, 222 - sector_t start, sector_t boundary) 222 + loff_t start, loff_t boundary) 223 223 { 224 224 if (io_size != opt_size && 225 225 start + opt_size / SECTOR_SIZE <= boundary) ··· 237 237 struct block_device *bdev; 238 238 struct mddev *mddev = bitmap->mddev; 239 239 struct bitmap_storage *store = &bitmap->storage; 240 - sector_t offset = mddev->bitmap_info.offset; 241 - sector_t ps, sboff, doff; 240 + loff_t sboff, offset = mddev->bitmap_info.offset; 241 + sector_t ps, doff; 242 242 unsigned int size = PAGE_SIZE; 243 243 unsigned int opt_size = PAGE_SIZE; 244 244
+44 -1
drivers/md/raid5.c
··· 6079 6079 return ret; 6080 6080 } 6081 6081 6082 + /* 6083 + * If the bio covers multiple data disks, find sector within the bio that has 6084 + * the lowest chunk offset in the first chunk. 6085 + */ 6086 + static sector_t raid5_bio_lowest_chunk_sector(struct r5conf *conf, 6087 + struct bio *bi) 6088 + { 6089 + int sectors_per_chunk = conf->chunk_sectors; 6090 + int raid_disks = conf->raid_disks; 6091 + int dd_idx; 6092 + struct stripe_head sh; 6093 + unsigned int chunk_offset; 6094 + sector_t r_sector = bi->bi_iter.bi_sector & ~((sector_t)RAID5_STRIPE_SECTORS(conf)-1); 6095 + sector_t sector; 6096 + 6097 + /* We pass in fake stripe_head to get back parity disk numbers */ 6098 + sector = raid5_compute_sector(conf, r_sector, 0, &dd_idx, &sh); 6099 + chunk_offset = sector_div(sector, sectors_per_chunk); 6100 + if (sectors_per_chunk - chunk_offset >= bio_sectors(bi)) 6101 + return r_sector; 6102 + /* 6103 + * Bio crosses to the next data disk. Check whether it's in the same 6104 + * chunk. 6105 + */ 6106 + dd_idx++; 6107 + while (dd_idx == sh.pd_idx || dd_idx == sh.qd_idx) 6108 + dd_idx++; 6109 + if (dd_idx >= raid_disks) 6110 + return r_sector; 6111 + return r_sector + sectors_per_chunk - chunk_offset; 6112 + } 6113 + 6082 6114 static bool raid5_make_request(struct mddev *mddev, struct bio * bi) 6083 6115 { 6084 6116 DEFINE_WAIT_FUNC(wait, woken_wake_function); ··· 6182 6150 } 6183 6151 md_account_bio(mddev, &bi); 6184 6152 6153 + /* 6154 + * Lets start with the stripe with the lowest chunk offset in the first 6155 + * chunk. That has the best chances of creating IOs adjacent to 6156 + * previous IOs in case of sequential IO and thus creates the most 6157 + * sequential IO pattern. We don't bother with the optimization when 6158 + * reshaping as the performance benefit is not worth the complexity. 6159 + */ 6160 + if (likely(conf->reshape_progress == MaxSector)) 6161 + logical_sector = raid5_bio_lowest_chunk_sector(conf, bi); 6162 + s = (logical_sector - ctx.first_sector) >> RAID5_STRIPE_SHIFT(conf); 6163 + 6185 6164 add_wait_queue(&conf->wait_for_overlap, &wait); 6186 6165 while (1) { 6187 6166 res = make_stripe_request(mddev, conf, &ctx, logical_sector, ··· 6221 6178 continue; 6222 6179 } 6223 6180 6224 - s = find_first_bit(ctx.sectors_to_do, stripe_cnt); 6181 + s = find_next_bit_wrap(ctx.sectors_to_do, stripe_cnt, s); 6225 6182 if (s == stripe_cnt) 6226 6183 break; 6227 6184
+1 -1
fs/fs-writeback.c
··· 829 829 * is okay. The main goal is avoiding keeping an inode on 830 830 * the wrong wb for an extended period of time. 831 831 */ 832 - if (hweight32(history) > WB_FRN_HIST_THR_SLOTS) 832 + if (hweight16(history) > WB_FRN_HIST_THR_SLOTS) 833 833 inode_switch_wbs(inode, max_id); 834 834 } 835 835
-3
include/linux/blkdev.h
··· 157 157 struct timer_rand_state *random; 158 158 atomic_t sync_io; /* RAID */ 159 159 struct disk_events *ev; 160 - #ifdef CONFIG_BLK_DEV_INTEGRITY 161 - struct kobject integrity_kobj; 162 - #endif /* CONFIG_BLK_DEV_INTEGRITY */ 163 160 164 161 #ifdef CONFIG_BLK_DEV_ZONED 165 162 /*
+20 -5
include/uapi/linux/nbd.h
··· 11 11 * Cleanup PARANOIA usage & code. 12 12 * 2004/02/19 Paul Clements 13 13 * Removed PARANOIA, plus various cleanup and comments 14 + * 2023 Copyright Red Hat 15 + * Link to userspace extensions, favor cookie over handle. 14 16 */ 15 17 16 18 #ifndef _UAPILINUX_NBD_H ··· 32 30 #define NBD_SET_TIMEOUT _IO( 0xab, 9 ) 33 31 #define NBD_SET_FLAGS _IO( 0xab, 10) 34 32 33 + /* 34 + * See also https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md 35 + * for additional userspace extensions not yet utilized in the kernel module. 36 + */ 37 + 35 38 enum { 36 39 NBD_CMD_READ = 0, 37 40 NBD_CMD_WRITE = 1, 38 41 NBD_CMD_DISC = 2, 39 42 NBD_CMD_FLUSH = 3, 40 43 NBD_CMD_TRIM = 4 44 + /* userspace defines additional extension commands */ 41 45 }; 42 46 43 47 /* values for flags field, these are server interaction specific. */ ··· 72 64 #define NBD_REQUEST_MAGIC 0x25609513 73 65 #define NBD_REPLY_MAGIC 0x67446698 74 66 /* Do *not* use magics: 0x12560953 0x96744668. */ 67 + /* magic 0x668e33ef for structured reply not supported by kernel yet */ 75 68 76 69 /* 77 70 * This is the packet used for communication between client and 78 71 * server. All data are in network byte order. 79 72 */ 80 73 struct nbd_request { 81 - __be32 magic; 82 - __be32 type; /* == READ || == WRITE */ 83 - char handle[8]; 74 + __be32 magic; /* NBD_REQUEST_MAGIC */ 75 + __be32 type; /* See NBD_CMD_* */ 76 + union { 77 + __be64 cookie; /* Opaque identifier for request */ 78 + char handle[8]; /* older spelling of cookie */ 79 + }; 84 80 __be64 from; 85 81 __be32 len; 86 82 } __attribute__((packed)); ··· 94 82 * it has completed an I/O request (or an error occurs). 95 83 */ 96 84 struct nbd_reply { 97 - __be32 magic; 85 + __be32 magic; /* NBD_REPLY_MAGIC */ 98 86 __be32 error; /* 0 = ok, else error */ 99 - char handle[8]; /* handle you got from request */ 87 + union { 88 + __be64 cookie; /* Opaque identifier from request */ 89 + char handle[8]; /* older spelling of cookie */ 90 + }; 100 91 }; 101 92 #endif /* _UAPILINUX_NBD_H */