Skip to content

Commit 40f92e7

Browse files
committed
Merge tag 'block-6.16-20250710' of git://git.kernel.dk/linux
Pull block fixes from Jens Axboe: - MD changes via Yu: - fix UAF due to stack memory used for bio mempool (Jinchao) - fix raid10/raid1 nowait IO error path (Nigel and Qixing) - fix kernel crash from reading bitmap sysfs entry (Håkon) - Fix for a UAF in the nbd connect error path - Fix for blocksize being bigger than pagesize, if THP isn't enabled * tag 'block-6.16-20250710' of git://git.kernel.dk/linux: block: reject bs > ps block devices when THP is disabled nbd: fix uaf in nbd_genl_connect() error path md/md-bitmap: fix GPF in bitmap_get_stats() md/raid1,raid10: strip REQ_NOWAIT from member bios raid10: cleanup memleak at raid10_make_request md/raid1: Fix stack memory use after return in raid1_reshape
2 parents cb3002e + 4cdf1bd commit 40f92e7

File tree

5 files changed

+22
-8
lines changed

5 files changed

+22
-8
lines changed

drivers/block/nbd.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2198,9 +2198,7 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
21982198
goto out;
21992199
}
22002200
}
2201-
ret = nbd_start_device(nbd);
2202-
if (ret)
2203-
goto out;
2201+
22042202
if (info->attrs[NBD_ATTR_BACKEND_IDENTIFIER]) {
22052203
nbd->backend = nla_strdup(info->attrs[NBD_ATTR_BACKEND_IDENTIFIER],
22062204
GFP_KERNEL);
@@ -2216,6 +2214,8 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
22162214
goto out;
22172215
}
22182216
set_bit(NBD_RT_HAS_BACKEND_FILE, &config->runtime_flags);
2217+
2218+
ret = nbd_start_device(nbd);
22192219
out:
22202220
mutex_unlock(&nbd->config_lock);
22212221
if (!ret) {

drivers/md/md-bitmap.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2366,8 +2366,7 @@ static int bitmap_get_stats(void *data, struct md_bitmap_stats *stats)
23662366

23672367
if (!bitmap)
23682368
return -ENOENT;
2369-
if (!bitmap->mddev->bitmap_info.external &&
2370-
!bitmap->storage.sb_page)
2369+
if (!bitmap->storage.sb_page)
23712370
return -EINVAL;
23722371
sb = kmap_local_page(bitmap->storage.sb_page);
23732372
stats->sync_size = le64_to_cpu(sb->sync_size);

drivers/md/raid1.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1399,7 +1399,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
13991399
}
14001400
read_bio = bio_alloc_clone(mirror->rdev->bdev, bio, gfp,
14011401
&mddev->bio_set);
1402-
1402+
read_bio->bi_opf &= ~REQ_NOWAIT;
14031403
r1_bio->bios[rdisk] = read_bio;
14041404

14051405
read_bio->bi_iter.bi_sector = r1_bio->sector +
@@ -1649,6 +1649,7 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
16491649
wait_for_serialization(rdev, r1_bio);
16501650
}
16511651

1652+
mbio->bi_opf &= ~REQ_NOWAIT;
16521653
r1_bio->bios[i] = mbio;
16531654

16541655
mbio->bi_iter.bi_sector = (r1_bio->sector + rdev->data_offset);
@@ -3428,6 +3429,7 @@ static int raid1_reshape(struct mddev *mddev)
34283429
/* ok, everything is stopped */
34293430
oldpool = conf->r1bio_pool;
34303431
conf->r1bio_pool = newpool;
3432+
init_waitqueue_head(&conf->r1bio_pool.wait);
34313433

34323434
for (d = d2 = 0; d < conf->raid_disks; d++) {
34333435
struct md_rdev *rdev = conf->mirrors[d].rdev;

drivers/md/raid10.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,8 +1182,11 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
11821182
}
11831183
}
11841184

1185-
if (!regular_request_wait(mddev, conf, bio, r10_bio->sectors))
1185+
if (!regular_request_wait(mddev, conf, bio, r10_bio->sectors)) {
1186+
raid_end_bio_io(r10_bio);
11861187
return;
1188+
}
1189+
11871190
rdev = read_balance(conf, r10_bio, &max_sectors);
11881191
if (!rdev) {
11891192
if (err_rdev) {
@@ -1221,6 +1224,7 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,
12211224
r10_bio->master_bio = bio;
12221225
}
12231226
read_bio = bio_alloc_clone(rdev->bdev, bio, gfp, &mddev->bio_set);
1227+
read_bio->bi_opf &= ~REQ_NOWAIT;
12241228

12251229
r10_bio->devs[slot].bio = read_bio;
12261230
r10_bio->devs[slot].rdev = rdev;
@@ -1256,6 +1260,7 @@ static void raid10_write_one_disk(struct mddev *mddev, struct r10bio *r10_bio,
12561260
conf->mirrors[devnum].rdev;
12571261

12581262
mbio = bio_alloc_clone(rdev->bdev, bio, GFP_NOIO, &mddev->bio_set);
1263+
mbio->bi_opf &= ~REQ_NOWAIT;
12591264
if (replacement)
12601265
r10_bio->devs[n_copy].repl_bio = mbio;
12611266
else
@@ -1370,8 +1375,11 @@ static void raid10_write_request(struct mddev *mddev, struct bio *bio,
13701375
}
13711376

13721377
sectors = r10_bio->sectors;
1373-
if (!regular_request_wait(mddev, conf, bio, sectors))
1378+
if (!regular_request_wait(mddev, conf, bio, sectors)) {
1379+
raid_end_bio_io(r10_bio);
13741380
return;
1381+
}
1382+
13751383
if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
13761384
(mddev->reshape_backwards
13771385
? (bio->bi_iter.bi_sector < conf->reshape_safe &&

include/linux/blkdev.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,16 @@ static inline dev_t disk_devt(struct gendisk *disk)
269269
return MKDEV(disk->major, disk->first_minor);
270270
}
271271

272+
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
272273
/*
273274
* We should strive for 1 << (PAGE_SHIFT + MAX_PAGECACHE_ORDER)
274275
* however we constrain this to what we can validate and test.
275276
*/
276277
#define BLK_MAX_BLOCK_SIZE SZ_64K
278+
#else
279+
#define BLK_MAX_BLOCK_SIZE PAGE_SIZE
280+
#endif
281+
277282

278283
/* blk_validate_limits() validates bsize, so drivers don't usually need to */
279284
static inline int blk_validate_block_size(unsigned long bsize)

0 commit comments

Comments
 (0)