Skip to content

Commit 1ddeeb2

Browse files
committed
Merge tag 'for-6.9/block-20240310' of git://git.kernel.dk/linux
Pull block updates from Jens Axboe: - MD pull requests via Song: - Cleanup redundant checks (Yu Kuai) - Remove deprecated headers (Marc Zyngier, Song Liu) - Concurrency fixes (Li Lingfeng) - Memory leak fix (Li Nan) - Refactor raid1 read_balance (Yu Kuai, Paul Luse) - Clean up and fix for md_ioctl (Li Nan) - Other small fixes (Gui-Dong Han, Heming Zhao) - MD atomic limits (Christoph) - NVMe pull request via Keith: - RDMA target enhancements (Max) - Fabrics fixes (Max, Guixin, Hannes) - Atomic queue_limits usage (Christoph) - Const use for class_register (Ricardo) - Identification error handling fixes (Shin'ichiro, Keith) - Improvement and cleanup for cached request handling (Christoph) - Moving towards atomic queue limits. Core changes and driver bits so far (Christoph) - Fix UAF issues in aoeblk (Chun-Yi) - Zoned fix and cleanups (Damien) - s390 dasd cleanups and fixes (Jan, Miroslav) - Block issue timestamp caching (me) - noio scope guarding for zoned IO (Johannes) - block/nvme PI improvements (Kanchan) - Ability to terminate long running discard loop (Keith) - bdev revalidation fix (Li) - Get rid of old nr_queues hack for kdump kernels (Ming) - Support for async deletion of ublk (Ming) - Improve IRQ bio recycling (Pavel) - Factor in CPU capacity for remote vs local completion (Qais) - Add shared_tags configfs entry for null_blk (Shin'ichiro - Fix for a regression in page refcounts introduced by the folio unification (Tony) - Misc fixes and cleanups (Arnd, Colin, John, Kunwu, Li, Navid, Ricardo, Roman, Tang, Uwe) * tag 'for-6.9/block-20240310' of git://git.kernel.dk/linux: (221 commits) block: partitions: only define function mac_fix_string for CONFIG_PPC_PMAC block/swim: Convert to platform remove callback returning void cdrom: gdrom: Convert to platform remove callback returning void block: remove disk_stack_limits md: remove mddev->queue md: don't initialize queue limits md/raid10: use the atomic queue limit update APIs md/raid5: use the atomic queue limit update APIs md/raid1: use the atomic queue limit update APIs md/raid0: use the atomic queue limit update APIs md: add queue limit helpers md: add a mddev_is_dm helper md: add a mddev_add_trace_msg helper md: add a mddev_trace_remap helper bcache: move calculation of stripe_size and io_opt into bcache_device_init virtio_blk: Do not use disk_set_max_open/active_zones() aoe: fix the potential use-after-free problem in aoecmd_cfg_pkts block: move capacity validation to blkpg_do_ioctl() block: prevent division by zero in blk_rq_stat_sum() drbd: atomically update queue limits in drbd_reconsider_queue_parameters ...
2 parents d2c84bd + 5205a4a commit 1ddeeb2

File tree

138 files changed

+3444
-3171
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

138 files changed

+3444
-3171
lines changed

arch/m68k/emu/nfblock.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ static const struct block_device_operations nfhd_ops = {
9696

9797
static int __init nfhd_init_one(int id, u32 blocks, u32 bsize)
9898
{
99+
struct queue_limits lim = {
100+
.logical_block_size = bsize,
101+
};
99102
struct nfhd_device *dev;
100103
int dev_id = id - NFHD_DEV_OFFSET;
101104
int err = -ENOMEM;
@@ -117,9 +120,11 @@ static int __init nfhd_init_one(int id, u32 blocks, u32 bsize)
117120
dev->bsize = bsize;
118121
dev->bshift = ffs(bsize) - 10;
119122

120-
dev->disk = blk_alloc_disk(NUMA_NO_NODE);
121-
if (!dev->disk)
123+
dev->disk = blk_alloc_disk(&lim, NUMA_NO_NODE);
124+
if (IS_ERR(dev->disk)) {
125+
err = PTR_ERR(dev->disk);
122126
goto free_dev;
127+
}
123128

124129
dev->disk->major = major_num;
125130
dev->disk->first_minor = dev_id * 16;
@@ -128,7 +133,6 @@ static int __init nfhd_init_one(int id, u32 blocks, u32 bsize)
128133
dev->disk->private_data = dev;
129134
sprintf(dev->disk->disk_name, "nfhd%u", dev_id);
130135
set_capacity(dev->disk, (sector_t)blocks * (bsize / 512));
131-
blk_queue_logical_block_size(dev->disk->queue, bsize);
132136
err = add_disk(dev->disk);
133137
if (err)
134138
goto out_cleanup_disk;

arch/um/drivers/ubd_kern.c

Lines changed: 49 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,6 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data)
108108
static DEFINE_MUTEX(ubd_lock);
109109
static DEFINE_MUTEX(ubd_mutex); /* replaces BKL, might not be needed */
110110

111-
static int ubd_open(struct gendisk *disk, blk_mode_t mode);
112-
static void ubd_release(struct gendisk *disk);
113111
static int ubd_ioctl(struct block_device *bdev, blk_mode_t mode,
114112
unsigned int cmd, unsigned long arg);
115113
static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo);
@@ -118,16 +116,11 @@ static int ubd_getgeo(struct block_device *bdev, struct hd_geometry *geo);
118116

119117
static const struct block_device_operations ubd_blops = {
120118
.owner = THIS_MODULE,
121-
.open = ubd_open,
122-
.release = ubd_release,
123119
.ioctl = ubd_ioctl,
124120
.compat_ioctl = blkdev_compat_ptr_ioctl,
125121
.getgeo = ubd_getgeo,
126122
};
127123

128-
/* Protected by ubd_lock */
129-
static struct gendisk *ubd_gendisk[MAX_DEV];
130-
131124
#ifdef CONFIG_BLK_DEV_UBD_SYNC
132125
#define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 1, .c = 0, \
133126
.cl = 1 })
@@ -155,7 +148,6 @@ struct ubd {
155148
* backing or the cow file. */
156149
char *file;
157150
char *serial;
158-
int count;
159151
int fd;
160152
__u64 size;
161153
struct openflags boot_openflags;
@@ -165,7 +157,7 @@ struct ubd {
165157
unsigned no_trim:1;
166158
struct cow cow;
167159
struct platform_device pdev;
168-
struct request_queue *queue;
160+
struct gendisk *disk;
169161
struct blk_mq_tag_set tag_set;
170162
spinlock_t lock;
171163
};
@@ -181,7 +173,6 @@ struct ubd {
181173
#define DEFAULT_UBD { \
182174
.file = NULL, \
183175
.serial = NULL, \
184-
.count = 0, \
185176
.fd = -1, \
186177
.size = -1, \
187178
.boot_openflags = OPEN_FLAGS, \
@@ -774,8 +765,6 @@ static int ubd_open_dev(struct ubd *ubd_dev)
774765
ubd_dev->fd = fd;
775766

776767
if(ubd_dev->cow.file != NULL){
777-
blk_queue_max_hw_sectors(ubd_dev->queue, 8 * sizeof(long));
778-
779768
err = -ENOMEM;
780769
ubd_dev->cow.bitmap = vmalloc(ubd_dev->cow.bitmap_len);
781770
if(ubd_dev->cow.bitmap == NULL){
@@ -797,11 +786,6 @@ static int ubd_open_dev(struct ubd *ubd_dev)
797786
if(err < 0) goto error;
798787
ubd_dev->cow.fd = err;
799788
}
800-
if (ubd_dev->no_trim == 0) {
801-
blk_queue_max_discard_sectors(ubd_dev->queue, UBD_MAX_REQUEST);
802-
blk_queue_max_write_zeroes_sectors(ubd_dev->queue, UBD_MAX_REQUEST);
803-
}
804-
blk_queue_flag_set(QUEUE_FLAG_NONROT, ubd_dev->queue);
805789
return 0;
806790
error:
807791
os_close_file(ubd_dev->fd);
@@ -851,27 +835,6 @@ static const struct attribute_group *ubd_attr_groups[] = {
851835
NULL,
852836
};
853837

854-
static int ubd_disk_register(int major, u64 size, int unit,
855-
struct gendisk *disk)
856-
{
857-
disk->major = major;
858-
disk->first_minor = unit << UBD_SHIFT;
859-
disk->minors = 1 << UBD_SHIFT;
860-
disk->fops = &ubd_blops;
861-
set_capacity(disk, size / 512);
862-
sprintf(disk->disk_name, "ubd%c", 'a' + unit);
863-
864-
ubd_devs[unit].pdev.id = unit;
865-
ubd_devs[unit].pdev.name = DRIVER_NAME;
866-
ubd_devs[unit].pdev.dev.release = ubd_device_release;
867-
dev_set_drvdata(&ubd_devs[unit].pdev.dev, &ubd_devs[unit]);
868-
platform_device_register(&ubd_devs[unit].pdev);
869-
870-
disk->private_data = &ubd_devs[unit];
871-
disk->queue = ubd_devs[unit].queue;
872-
return device_add_disk(&ubd_devs[unit].pdev.dev, disk, ubd_attr_groups);
873-
}
874-
875838
#define ROUND_BLOCK(n) ((n + (SECTOR_SIZE - 1)) & (-SECTOR_SIZE))
876839

877840
static const struct blk_mq_ops ubd_mq_ops = {
@@ -881,18 +844,36 @@ static const struct blk_mq_ops ubd_mq_ops = {
881844
static int ubd_add(int n, char **error_out)
882845
{
883846
struct ubd *ubd_dev = &ubd_devs[n];
847+
struct queue_limits lim = {
848+
.max_segments = MAX_SG,
849+
.seg_boundary_mask = PAGE_SIZE - 1,
850+
};
884851
struct gendisk *disk;
885852
int err = 0;
886853

887854
if(ubd_dev->file == NULL)
888855
goto out;
889856

857+
if (ubd_dev->cow.file)
858+
lim.max_hw_sectors = 8 * sizeof(long);
859+
if (!ubd_dev->no_trim) {
860+
lim.max_hw_discard_sectors = UBD_MAX_REQUEST;
861+
lim.max_write_zeroes_sectors = UBD_MAX_REQUEST;
862+
}
863+
890864
err = ubd_file_size(ubd_dev, &ubd_dev->size);
891865
if(err < 0){
892866
*error_out = "Couldn't determine size of device's file";
893867
goto out;
894868
}
895869

870+
err = ubd_open_dev(ubd_dev);
871+
if (err) {
872+
pr_err("ubd%c: Can't open \"%s\": errno = %d\n",
873+
'a' + n, ubd_dev->file, -err);
874+
goto out;
875+
}
876+
896877
ubd_dev->size = ROUND_BLOCK(ubd_dev->size);
897878

898879
ubd_dev->tag_set.ops = &ubd_mq_ops;
@@ -904,29 +885,43 @@ static int ubd_add(int n, char **error_out)
904885

905886
err = blk_mq_alloc_tag_set(&ubd_dev->tag_set);
906887
if (err)
907-
goto out;
888+
goto out_close;
908889

909-
disk = blk_mq_alloc_disk(&ubd_dev->tag_set, ubd_dev);
890+
disk = blk_mq_alloc_disk(&ubd_dev->tag_set, &lim, ubd_dev);
910891
if (IS_ERR(disk)) {
911892
err = PTR_ERR(disk);
912893
goto out_cleanup_tags;
913894
}
914-
ubd_dev->queue = disk->queue;
915895

916-
blk_queue_write_cache(ubd_dev->queue, true, false);
917-
blk_queue_max_segments(ubd_dev->queue, MAX_SG);
918-
blk_queue_segment_boundary(ubd_dev->queue, PAGE_SIZE - 1);
919-
err = ubd_disk_register(UBD_MAJOR, ubd_dev->size, n, disk);
896+
blk_queue_flag_set(QUEUE_FLAG_NONROT, disk->queue);
897+
blk_queue_write_cache(disk->queue, true, false);
898+
disk->major = UBD_MAJOR;
899+
disk->first_minor = n << UBD_SHIFT;
900+
disk->minors = 1 << UBD_SHIFT;
901+
disk->fops = &ubd_blops;
902+
set_capacity(disk, ubd_dev->size / 512);
903+
sprintf(disk->disk_name, "ubd%c", 'a' + n);
904+
disk->private_data = ubd_dev;
905+
set_disk_ro(disk, !ubd_dev->openflags.w);
906+
907+
ubd_dev->pdev.id = n;
908+
ubd_dev->pdev.name = DRIVER_NAME;
909+
ubd_dev->pdev.dev.release = ubd_device_release;
910+
dev_set_drvdata(&ubd_dev->pdev.dev, ubd_dev);
911+
platform_device_register(&ubd_dev->pdev);
912+
913+
err = device_add_disk(&ubd_dev->pdev.dev, disk, ubd_attr_groups);
920914
if (err)
921915
goto out_cleanup_disk;
922916

923-
ubd_gendisk[n] = disk;
924917
return 0;
925918

926919
out_cleanup_disk:
927920
put_disk(disk);
928921
out_cleanup_tags:
929922
blk_mq_free_tag_set(&ubd_dev->tag_set);
923+
out_close:
924+
ubd_close_dev(ubd_dev);
930925
out:
931926
return err;
932927
}
@@ -1012,7 +1007,6 @@ static int ubd_id(char **str, int *start_out, int *end_out)
10121007

10131008
static int ubd_remove(int n, char **error_out)
10141009
{
1015-
struct gendisk *disk = ubd_gendisk[n];
10161010
struct ubd *ubd_dev;
10171011
int err = -ENODEV;
10181012

@@ -1023,15 +1017,15 @@ static int ubd_remove(int n, char **error_out)
10231017
if(ubd_dev->file == NULL)
10241018
goto out;
10251019

1026-
/* you cannot remove a open disk */
1027-
err = -EBUSY;
1028-
if(ubd_dev->count > 0)
1029-
goto out;
1020+
if (ubd_dev->disk) {
1021+
/* you cannot remove a open disk */
1022+
err = -EBUSY;
1023+
if (disk_openers(ubd_dev->disk))
1024+
goto out;
10301025

1031-
ubd_gendisk[n] = NULL;
1032-
if(disk != NULL){
1033-
del_gendisk(disk);
1034-
put_disk(disk);
1026+
del_gendisk(ubd_dev->disk);
1027+
ubd_close_dev(ubd_dev);
1028+
put_disk(ubd_dev->disk);
10351029
}
10361030

10371031
err = 0;
@@ -1153,37 +1147,6 @@ static int __init ubd_driver_init(void){
11531147

11541148
device_initcall(ubd_driver_init);
11551149

1156-
static int ubd_open(struct gendisk *disk, blk_mode_t mode)
1157-
{
1158-
struct ubd *ubd_dev = disk->private_data;
1159-
int err = 0;
1160-
1161-
mutex_lock(&ubd_mutex);
1162-
if(ubd_dev->count == 0){
1163-
err = ubd_open_dev(ubd_dev);
1164-
if(err){
1165-
printk(KERN_ERR "%s: Can't open \"%s\": errno = %d\n",
1166-
disk->disk_name, ubd_dev->file, -err);
1167-
goto out;
1168-
}
1169-
}
1170-
ubd_dev->count++;
1171-
set_disk_ro(disk, !ubd_dev->openflags.w);
1172-
out:
1173-
mutex_unlock(&ubd_mutex);
1174-
return err;
1175-
}
1176-
1177-
static void ubd_release(struct gendisk *disk)
1178-
{
1179-
struct ubd *ubd_dev = disk->private_data;
1180-
1181-
mutex_lock(&ubd_mutex);
1182-
if(--ubd_dev->count == 0)
1183-
ubd_close_dev(ubd_dev);
1184-
mutex_unlock(&ubd_mutex);
1185-
}
1186-
11871150
static void cowify_bitmap(__u64 io_offset, int length, unsigned long *cow_mask,
11881151
__u64 *cow_offset, unsigned long *bitmap,
11891152
__u64 bitmap_offset, unsigned long *bitmap_words,

arch/xtensa/platforms/iss/simdisk.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,16 +264,18 @@ static int __init simdisk_setup(struct simdisk *dev, int which,
264264
struct proc_dir_entry *procdir)
265265
{
266266
char tmp[2] = { '0' + which, 0 };
267-
int err = -ENOMEM;
267+
int err;
268268

269269
dev->fd = -1;
270270
dev->filename = NULL;
271271
spin_lock_init(&dev->lock);
272272
dev->users = 0;
273273

274-
dev->gd = blk_alloc_disk(NUMA_NO_NODE);
275-
if (!dev->gd)
274+
dev->gd = blk_alloc_disk(NULL, NUMA_NO_NODE);
275+
if (IS_ERR(dev->gd)) {
276+
err = PTR_ERR(dev->gd);
276277
goto out;
278+
}
277279
dev->gd->major = simdisk_major;
278280
dev->gd->first_minor = which;
279281
dev->gd->minors = SIMDISK_MINORS;

block/bdev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ void __init bdev_cache_init(void)
383383

384384
bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
385385
0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
386-
SLAB_MEM_SPREAD|SLAB_ACCOUNT|SLAB_PANIC),
386+
SLAB_ACCOUNT|SLAB_PANIC),
387387
init_once);
388388
err = register_filesystem(&bd_type);
389389
if (err)

block/bfq-cgroup.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ static void bfqg_stats_update_group_wait_time(struct bfqg_stats *stats)
127127
if (!bfqg_stats_waiting(stats))
128128
return;
129129

130-
now = ktime_get_ns();
130+
now = blk_time_get_ns();
131131
if (now > stats->start_group_wait_time)
132132
bfq_stat_add(&stats->group_wait_time,
133133
now - stats->start_group_wait_time);
@@ -144,7 +144,7 @@ static void bfqg_stats_set_start_group_wait_time(struct bfq_group *bfqg,
144144
return;
145145
if (bfqg == curr_bfqg)
146146
return;
147-
stats->start_group_wait_time = ktime_get_ns();
147+
stats->start_group_wait_time = blk_time_get_ns();
148148
bfqg_stats_mark_waiting(stats);
149149
}
150150

@@ -156,7 +156,7 @@ static void bfqg_stats_end_empty_time(struct bfqg_stats *stats)
156156
if (!bfqg_stats_empty(stats))
157157
return;
158158

159-
now = ktime_get_ns();
159+
now = blk_time_get_ns();
160160
if (now > stats->start_empty_time)
161161
bfq_stat_add(&stats->empty_time,
162162
now - stats->start_empty_time);
@@ -183,7 +183,7 @@ void bfqg_stats_set_start_empty_time(struct bfq_group *bfqg)
183183
if (bfqg_stats_empty(stats))
184184
return;
185185

186-
stats->start_empty_time = ktime_get_ns();
186+
stats->start_empty_time = blk_time_get_ns();
187187
bfqg_stats_mark_empty(stats);
188188
}
189189

@@ -192,7 +192,7 @@ void bfqg_stats_update_idle_time(struct bfq_group *bfqg)
192192
struct bfqg_stats *stats = &bfqg->stats;
193193

194194
if (bfqg_stats_idling(stats)) {
195-
u64 now = ktime_get_ns();
195+
u64 now = blk_time_get_ns();
196196

197197
if (now > stats->start_idle_time)
198198
bfq_stat_add(&stats->idle_time,
@@ -205,7 +205,7 @@ void bfqg_stats_set_start_idle_time(struct bfq_group *bfqg)
205205
{
206206
struct bfqg_stats *stats = &bfqg->stats;
207207

208-
stats->start_idle_time = ktime_get_ns();
208+
stats->start_idle_time = blk_time_get_ns();
209209
bfqg_stats_mark_idling(stats);
210210
}
211211

@@ -242,7 +242,7 @@ void bfqg_stats_update_completion(struct bfq_group *bfqg, u64 start_time_ns,
242242
u64 io_start_time_ns, blk_opf_t opf)
243243
{
244244
struct bfqg_stats *stats = &bfqg->stats;
245-
u64 now = ktime_get_ns();
245+
u64 now = blk_time_get_ns();
246246

247247
if (now > io_start_time_ns)
248248
blkg_rwstat_add(&stats->service_time, opf,

0 commit comments

Comments
 (0)