* [PATCH] MD RAID5: Avoid accessing gendisk or queue structs when not available
@ 2013-03-07 22:22 Jonathan Brassow
2013-03-11 0:35 ` NeilBrown
0 siblings, 1 reply; 2+ messages in thread
From: Jonathan Brassow @ 2013-03-07 22:22 UTC (permalink / raw)
To: linux-raid; +Cc: neilb, jbrassow
MD RAID5: Fix kernel oops when RAID4/5/6 is used via device-mapper
Commit a9add5d (v3.8-rc1) added blktrace calls to the RAID4/5/6 driver.
However, when device-mapper is used to create RAID4/5/6 arrays, the
mddev->gendisk and mddev->queue fields are not setup. Therefore, calling
things like trace_block_bio_remap will cause a kernel oops. This patch
conditionalizes those calls on whether the proper fields exist to make
the calls. (Device-mapper will call trace_block_bio_remap on its own.)
Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
Index: linux-upstream/drivers/md/raid5.c
===================================================================
--- linux-upstream.orig/drivers/md/raid5.c
+++ linux-upstream/drivers/md/raid5.c
@@ -671,9 +671,11 @@ static void ops_run_io(struct stripe_hea
bi->bi_next = NULL;
if (rrdev)
set_bit(R5_DOUBLE_LOCKED, &sh->dev[i].flags);
- trace_block_bio_remap(bdev_get_queue(bi->bi_bdev),
- bi, disk_devt(conf->mddev->gendisk),
- sh->dev[i].sector);
+
+ if (conf->mddev->gendisk)
+ trace_block_bio_remap(bdev_get_queue(bi->bi_bdev),
+ bi, disk_devt(conf->mddev->gendisk),
+ sh->dev[i].sector);
generic_make_request(bi);
}
if (rrdev) {
@@ -701,9 +703,10 @@ static void ops_run_io(struct stripe_hea
rbi->bi_io_vec[0].bv_offset = 0;
rbi->bi_size = STRIPE_SIZE;
rbi->bi_next = NULL;
- trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev),
- rbi, disk_devt(conf->mddev->gendisk),
- sh->dev[i].sector);
+ if (conf->mddev->gendisk)
+ trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev),
+ rbi, disk_devt(conf->mddev->gendisk),
+ sh->dev[i].sector);
generic_make_request(rbi);
}
if (!rdev && !rrdev) {
@@ -2862,8 +2865,10 @@ static void handle_stripe_dirtying(struc
set_bit(STRIPE_HANDLE, &sh->state);
if (rmw < rcw && rmw > 0) {
/* prefer read-modify-write, but need to get some data */
- blk_add_trace_msg(conf->mddev->queue, "raid5 rmw %llu %d",
- (unsigned long long)sh->sector, rmw);
+ if (conf->mddev->queue)
+ blk_add_trace_msg(conf->mddev->queue,
+ "raid5 rmw %llu %d",
+ (unsigned long long)sh->sector, rmw);
for (i = disks; i--; ) {
struct r5dev *dev = &sh->dev[i];
if ((dev->towrite || i == sh->pd_idx) &&
@@ -2913,7 +2918,7 @@ static void handle_stripe_dirtying(struc
}
}
}
- if (rcw)
+ if (rcw && conf->mddev->queue)
blk_add_trace_msg(conf->mddev->queue, "raid5 rcw %llu %d %d %d",
(unsigned long long)sh->sector,
rcw, qread, test_bit(STRIPE_DELAYED, &sh->state));
@@ -4018,9 +4023,10 @@ static int chunk_aligned_read(struct mdd
atomic_inc(&conf->active_aligned_reads);
spin_unlock_irq(&conf->device_lock);
- trace_block_bio_remap(bdev_get_queue(align_bi->bi_bdev),
- align_bi, disk_devt(mddev->gendisk),
- raid_bio->bi_sector);
+ if (mddev->gendisk)
+ trace_block_bio_remap(bdev_get_queue(align_bi->bi_bdev),
+ align_bi, disk_devt(mddev->gendisk),
+ raid_bio->bi_sector);
generic_make_request(align_bi);
return 1;
} else {
@@ -4114,7 +4120,8 @@ static void raid5_unplug(struct blk_plug
}
spin_unlock_irq(&conf->device_lock);
}
- trace_block_unplug(mddev->queue, cnt, !from_schedule);
+ if (mddev->queue)
+ trace_block_unplug(mddev->queue, cnt, !from_schedule);
kfree(cb);
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] MD RAID5: Avoid accessing gendisk or queue structs when not available
2013-03-07 22:22 [PATCH] MD RAID5: Avoid accessing gendisk or queue structs when not available Jonathan Brassow
@ 2013-03-11 0:35 ` NeilBrown
0 siblings, 0 replies; 2+ messages in thread
From: NeilBrown @ 2013-03-11 0:35 UTC (permalink / raw)
To: Jonathan Brassow; +Cc: linux-raid
[-- Attachment #1: Type: text/plain, Size: 3836 bytes --]
On Thu, 07 Mar 2013 16:22:01 -0600 Jonathan Brassow <jbrassow@redhat.com>
wrote:
> MD RAID5: Fix kernel oops when RAID4/5/6 is used via device-mapper
>
> Commit a9add5d (v3.8-rc1) added blktrace calls to the RAID4/5/6 driver.
> However, when device-mapper is used to create RAID4/5/6 arrays, the
> mddev->gendisk and mddev->queue fields are not setup. Therefore, calling
> things like trace_block_bio_remap will cause a kernel oops. This patch
> conditionalizes those calls on whether the proper fields exist to make
> the calls. (Device-mapper will call trace_block_bio_remap on its own.)
>
> Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
>
> Index: linux-upstream/drivers/md/raid5.c
> ===================================================================
> --- linux-upstream.orig/drivers/md/raid5.c
> +++ linux-upstream/drivers/md/raid5.c
> @@ -671,9 +671,11 @@ static void ops_run_io(struct stripe_hea
> bi->bi_next = NULL;
> if (rrdev)
> set_bit(R5_DOUBLE_LOCKED, &sh->dev[i].flags);
> - trace_block_bio_remap(bdev_get_queue(bi->bi_bdev),
> - bi, disk_devt(conf->mddev->gendisk),
> - sh->dev[i].sector);
> +
> + if (conf->mddev->gendisk)
> + trace_block_bio_remap(bdev_get_queue(bi->bi_bdev),
> + bi, disk_devt(conf->mddev->gendisk),
> + sh->dev[i].sector);
> generic_make_request(bi);
> }
> if (rrdev) {
> @@ -701,9 +703,10 @@ static void ops_run_io(struct stripe_hea
> rbi->bi_io_vec[0].bv_offset = 0;
> rbi->bi_size = STRIPE_SIZE;
> rbi->bi_next = NULL;
> - trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev),
> - rbi, disk_devt(conf->mddev->gendisk),
> - sh->dev[i].sector);
> + if (conf->mddev->gendisk)
> + trace_block_bio_remap(bdev_get_queue(rbi->bi_bdev),
> + rbi, disk_devt(conf->mddev->gendisk),
> + sh->dev[i].sector);
> generic_make_request(rbi);
> }
> if (!rdev && !rrdev) {
> @@ -2862,8 +2865,10 @@ static void handle_stripe_dirtying(struc
> set_bit(STRIPE_HANDLE, &sh->state);
> if (rmw < rcw && rmw > 0) {
> /* prefer read-modify-write, but need to get some data */
> - blk_add_trace_msg(conf->mddev->queue, "raid5 rmw %llu %d",
> - (unsigned long long)sh->sector, rmw);
> + if (conf->mddev->queue)
> + blk_add_trace_msg(conf->mddev->queue,
> + "raid5 rmw %llu %d",
> + (unsigned long long)sh->sector, rmw);
> for (i = disks; i--; ) {
> struct r5dev *dev = &sh->dev[i];
> if ((dev->towrite || i == sh->pd_idx) &&
> @@ -2913,7 +2918,7 @@ static void handle_stripe_dirtying(struc
> }
> }
> }
> - if (rcw)
> + if (rcw && conf->mddev->queue)
> blk_add_trace_msg(conf->mddev->queue, "raid5 rcw %llu %d %d %d",
> (unsigned long long)sh->sector,
> rcw, qread, test_bit(STRIPE_DELAYED, &sh->state));
> @@ -4018,9 +4023,10 @@ static int chunk_aligned_read(struct mdd
> atomic_inc(&conf->active_aligned_reads);
> spin_unlock_irq(&conf->device_lock);
>
> - trace_block_bio_remap(bdev_get_queue(align_bi->bi_bdev),
> - align_bi, disk_devt(mddev->gendisk),
> - raid_bio->bi_sector);
> + if (mddev->gendisk)
> + trace_block_bio_remap(bdev_get_queue(align_bi->bi_bdev),
> + align_bi, disk_devt(mddev->gendisk),
> + raid_bio->bi_sector);
> generic_make_request(align_bi);
> return 1;
> } else {
> @@ -4114,7 +4120,8 @@ static void raid5_unplug(struct blk_plug
> }
> spin_unlock_irq(&conf->device_lock);
> }
> - trace_block_unplug(mddev->queue, cnt, !from_schedule);
> + if (mddev->queue)
> + trace_block_unplug(mddev->queue, cnt, !from_schedule);
> kfree(cb);
> }
>
>
Applied, thanks (and sorry for breaking it...)
NeilBrown
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 828 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-03-11 0:35 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-07 22:22 [PATCH] MD RAID5: Avoid accessing gendisk or queue structs when not available Jonathan Brassow
2013-03-11 0:35 ` NeilBrown
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.