aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLi Zefan <lizf@cn.fujitsu.com>2009-03-19 22:34:00 -0400
committerIngo Molnar <mingo@elte.hu>2009-03-21 11:17:24 -0400
commitb125130b22d67f249beba10b71a254558b5279d0 (patch)
treef42f4f732a2d7920009f34d798d1803def38ea44 /kernel
parentcd649b8bb830d65c57c3c8b98d57b5402256d8bd (diff)
blktrace: avoid accessing NULL bdev->bd_disk
bdev->bd_disk can be NULL, if the block device is not opened. Try this against an unmounted partition, and you'll see NULL dereference: # echo 1 > /sys/block/sda/sda5/enable Signed-off-by: Li Zefan <lizf@cn.fujitsu.com> Acked-by: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jens Axboe <jens.axboe@oracle.com> Cc: Steven Rostedt <rostedt@goodmis.org> LKML-Reference: <49C30098.6080107@cn.fujitsu.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/trace/blktrace.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
index dfee6f915179..108f4f7715a5 100644
--- a/kernel/trace/blktrace.c
+++ b/kernel/trace/blktrace.c
@@ -1362,6 +1362,14 @@ static int blk_str2act_mask(const char *str)
1362 return mask; 1362 return mask;
1363} 1363}
1364 1364
1365static struct request_queue *blk_trace_get_queue(struct block_device *bdev)
1366{
1367 if (bdev->bd_disk == NULL)
1368 return NULL;
1369
1370 return bdev_get_queue(bdev);
1371}
1372
1365static ssize_t sysfs_blk_trace_attr_show(struct device *dev, 1373static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
1366 struct device_attribute *attr, 1374 struct device_attribute *attr,
1367 char *buf) 1375 char *buf)
@@ -1376,9 +1384,10 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
1376 if (bdev == NULL) 1384 if (bdev == NULL)
1377 goto out_unlock_kernel; 1385 goto out_unlock_kernel;
1378 1386
1379 q = bdev_get_queue(bdev); 1387 q = blk_trace_get_queue(bdev);
1380 if (q == NULL) 1388 if (q == NULL)
1381 goto out_bdput; 1389 goto out_bdput;
1390
1382 mutex_lock(&bdev->bd_mutex); 1391 mutex_lock(&bdev->bd_mutex);
1383 1392
1384 if (attr == &dev_attr_enable) { 1393 if (attr == &dev_attr_enable) {
@@ -1435,7 +1444,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,
1435 if (bdev == NULL) 1444 if (bdev == NULL)
1436 goto out_unlock_kernel; 1445 goto out_unlock_kernel;
1437 1446
1438 q = bdev_get_queue(bdev); 1447 q = blk_trace_get_queue(bdev);
1439 if (q == NULL) 1448 if (q == NULL)
1440 goto out_bdput; 1449 goto out_bdput;
1441 1450