aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/trace/blktrace.c92
1 files changed, 22 insertions, 70 deletions
diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c
index 14986afdbc1c..dfee6f915179 100644
--- a/kernel/trace/blktrace.c
+++ b/kernel/trace/blktrace.c
@@ -1284,72 +1284,6 @@ static int blk_trace_setup_queue(struct request_queue *q, dev_t dev)
1284 * sysfs interface to enable and configure tracing 1284 * sysfs interface to enable and configure tracing
1285 */ 1285 */
1286 1286
1287static ssize_t sysfs_blk_trace_enable_show(struct device *dev,
1288 struct device_attribute *attr,
1289 char *buf)
1290{
1291 struct hd_struct *p = dev_to_part(dev);
1292 struct block_device *bdev;
1293 ssize_t ret = -ENXIO;
1294
1295 lock_kernel();
1296 bdev = bdget(part_devt(p));
1297 if (bdev != NULL) {
1298 struct request_queue *q = bdev_get_queue(bdev);
1299
1300 if (q != NULL) {
1301 mutex_lock(&bdev->bd_mutex);
1302 ret = sprintf(buf, "%u\n", !!q->blk_trace);
1303 mutex_unlock(&bdev->bd_mutex);
1304 }
1305
1306 bdput(bdev);
1307 }
1308
1309 unlock_kernel();
1310 return ret;
1311}
1312
1313static ssize_t sysfs_blk_trace_enable_store(struct device *dev,
1314 struct device_attribute *attr,
1315 const char *buf, size_t count)
1316{
1317 struct block_device *bdev;
1318 struct request_queue *q;
1319 struct hd_struct *p;
1320 int value;
1321 ssize_t ret = -ENXIO;
1322
1323 if (count == 0 || sscanf(buf, "%d", &value) != 1)
1324 goto out;
1325
1326 lock_kernel();
1327 p = dev_to_part(dev);
1328 bdev = bdget(part_devt(p));
1329 if (bdev == NULL)
1330 goto out_unlock_kernel;
1331
1332 q = bdev_get_queue(bdev);
1333 if (q == NULL)
1334 goto out_bdput;
1335
1336 mutex_lock(&bdev->bd_mutex);
1337 if (value)
1338 ret = blk_trace_setup_queue(q, bdev->bd_dev);
1339 else
1340 ret = blk_trace_remove_queue(q);
1341 mutex_unlock(&bdev->bd_mutex);
1342
1343 if (ret == 0)
1344 ret = count;
1345out_bdput:
1346 bdput(bdev);
1347out_unlock_kernel:
1348 unlock_kernel();
1349out:
1350 return ret;
1351}
1352
1353static ssize_t sysfs_blk_trace_attr_show(struct device *dev, 1287static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
1354 struct device_attribute *attr, 1288 struct device_attribute *attr,
1355 char *buf); 1289 char *buf);
@@ -1361,8 +1295,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,
1361 sysfs_blk_trace_attr_show, \ 1295 sysfs_blk_trace_attr_show, \
1362 sysfs_blk_trace_attr_store) 1296 sysfs_blk_trace_attr_store)
1363 1297
1364static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, 1298static BLK_TRACE_DEVICE_ATTR(enable);
1365 sysfs_blk_trace_enable_show, sysfs_blk_trace_enable_store);
1366static BLK_TRACE_DEVICE_ATTR(act_mask); 1299static BLK_TRACE_DEVICE_ATTR(act_mask);
1367static BLK_TRACE_DEVICE_ATTR(pid); 1300static BLK_TRACE_DEVICE_ATTR(pid);
1368static BLK_TRACE_DEVICE_ATTR(start_lba); 1301static BLK_TRACE_DEVICE_ATTR(start_lba);
@@ -1447,6 +1380,12 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
1447 if (q == NULL) 1380 if (q == NULL)
1448 goto out_bdput; 1381 goto out_bdput;
1449 mutex_lock(&bdev->bd_mutex); 1382 mutex_lock(&bdev->bd_mutex);
1383
1384 if (attr == &dev_attr_enable) {
1385 ret = sprintf(buf, "%u\n", !!q->blk_trace);
1386 goto out_unlock_bdev;
1387 }
1388
1450 if (q->blk_trace == NULL) 1389 if (q->blk_trace == NULL)
1451 ret = sprintf(buf, "disabled\n"); 1390 ret = sprintf(buf, "disabled\n");
1452 else if (attr == &dev_attr_act_mask) 1391 else if (attr == &dev_attr_act_mask)
@@ -1457,6 +1396,8 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,
1457 ret = sprintf(buf, "%llu\n", q->blk_trace->start_lba); 1396 ret = sprintf(buf, "%llu\n", q->blk_trace->start_lba);
1458 else if (attr == &dev_attr_end_lba) 1397 else if (attr == &dev_attr_end_lba)
1459 ret = sprintf(buf, "%llu\n", q->blk_trace->end_lba); 1398 ret = sprintf(buf, "%llu\n", q->blk_trace->end_lba);
1399
1400out_unlock_bdev:
1460 mutex_unlock(&bdev->bd_mutex); 1401 mutex_unlock(&bdev->bd_mutex);
1461out_bdput: 1402out_bdput:
1462 bdput(bdev); 1403 bdput(bdev);
@@ -1499,6 +1440,15 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,
1499 goto out_bdput; 1440 goto out_bdput;
1500 1441
1501 mutex_lock(&bdev->bd_mutex); 1442 mutex_lock(&bdev->bd_mutex);
1443
1444 if (attr == &dev_attr_enable) {
1445 if (value)
1446 ret = blk_trace_setup_queue(q, bdev->bd_dev);
1447 else
1448 ret = blk_trace_remove_queue(q);
1449 goto out_unlock_bdev;
1450 }
1451
1502 ret = 0; 1452 ret = 0;
1503 if (q->blk_trace == NULL) 1453 if (q->blk_trace == NULL)
1504 ret = blk_trace_setup_queue(q, bdev->bd_dev); 1454 ret = blk_trace_setup_queue(q, bdev->bd_dev);
@@ -1512,13 +1462,15 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,
1512 q->blk_trace->start_lba = value; 1462 q->blk_trace->start_lba = value;
1513 else if (attr == &dev_attr_end_lba) 1463 else if (attr == &dev_attr_end_lba)
1514 q->blk_trace->end_lba = value; 1464 q->blk_trace->end_lba = value;
1515 ret = count;
1516 } 1465 }
1466
1467out_unlock_bdev:
1517 mutex_unlock(&bdev->bd_mutex); 1468 mutex_unlock(&bdev->bd_mutex);
1518out_bdput: 1469out_bdput:
1519 bdput(bdev); 1470 bdput(bdev);
1520out_unlock_kernel: 1471out_unlock_kernel:
1521 unlock_kernel(); 1472 unlock_kernel();
1522out: 1473out:
1523 return ret; 1474 return ret ? ret : count;
1524} 1475}
1476