Skip to content

Commit 6da127a

Browse files
Christof SchmittJens Axboe
Christof Schmitt
authored and
Jens Axboe
committed
blktrace: Add blktrace ioctls to SCSI generic devices
Since the SCSI layer uses the request queues from the block layer, blktrace can also be used to trace the requests to all SCSI devices (like SCSI tape drives), not only disks. The only missing part is the ioctl interface to start and stop tracing. This patch adds the SETUP, START, STOP and TEARDOWN ioctls from blktrace to the sg device files. With this change, blktrace can be used for SCSI devices like for disks, e.g.: blktrace -d /dev/sg1 -o - | blkparse -i - Signed-off-by: Christof Schmitt <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 9152530 commit 6da127a

File tree

4 files changed

+40
-13
lines changed

4 files changed

+40
-13
lines changed

block/blktrace.c

+14-10
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ static void blk_trace_cleanup(struct blk_trace *bt)
235235
kfree(bt);
236236
}
237237

238-
static int blk_trace_remove(struct request_queue *q)
238+
int blk_trace_remove(struct request_queue *q)
239239
{
240240
struct blk_trace *bt;
241241

@@ -249,6 +249,7 @@ static int blk_trace_remove(struct request_queue *q)
249249

250250
return 0;
251251
}
252+
EXPORT_SYMBOL_GPL(blk_trace_remove);
252253

253254
static int blk_dropped_open(struct inode *inode, struct file *filp)
254255
{
@@ -316,18 +317,17 @@ static struct rchan_callbacks blk_relay_callbacks = {
316317
/*
317318
* Setup everything required to start tracing
318319
*/
319-
int do_blk_trace_setup(struct request_queue *q, struct block_device *bdev,
320+
int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
320321
struct blk_user_trace_setup *buts)
321322
{
322323
struct blk_trace *old_bt, *bt = NULL;
323324
struct dentry *dir = NULL;
324-
char b[BDEVNAME_SIZE];
325325
int ret, i;
326326

327327
if (!buts->buf_size || !buts->buf_nr)
328328
return -EINVAL;
329329

330-
strcpy(buts->name, bdevname(bdev, b));
330+
strcpy(buts->name, name);
331331

332332
/*
333333
* some device names have larger paths - convert the slashes
@@ -352,7 +352,7 @@ int do_blk_trace_setup(struct request_queue *q, struct block_device *bdev,
352352
goto err;
353353

354354
bt->dir = dir;
355-
bt->dev = bdev->bd_dev;
355+
bt->dev = dev;
356356
atomic_set(&bt->dropped, 0);
357357

358358
ret = -EIO;
@@ -399,8 +399,8 @@ int do_blk_trace_setup(struct request_queue *q, struct block_device *bdev,
399399
return ret;
400400
}
401401

402-
static int blk_trace_setup(struct request_queue *q, struct block_device *bdev,
403-
char __user *arg)
402+
int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
403+
char __user *arg)
404404
{
405405
struct blk_user_trace_setup buts;
406406
int ret;
@@ -409,7 +409,7 @@ static int blk_trace_setup(struct request_queue *q, struct block_device *bdev,
409409
if (ret)
410410
return -EFAULT;
411411

412-
ret = do_blk_trace_setup(q, bdev, &buts);
412+
ret = do_blk_trace_setup(q, name, dev, &buts);
413413
if (ret)
414414
return ret;
415415

@@ -418,8 +418,9 @@ static int blk_trace_setup(struct request_queue *q, struct block_device *bdev,
418418

419419
return 0;
420420
}
421+
EXPORT_SYMBOL_GPL(blk_trace_setup);
421422

422-
static int blk_trace_startstop(struct request_queue *q, int start)
423+
int blk_trace_startstop(struct request_queue *q, int start)
423424
{
424425
struct blk_trace *bt;
425426
int ret;
@@ -452,6 +453,7 @@ static int blk_trace_startstop(struct request_queue *q, int start)
452453

453454
return ret;
454455
}
456+
EXPORT_SYMBOL_GPL(blk_trace_startstop);
455457

456458
/**
457459
* blk_trace_ioctl: - handle the ioctls associated with tracing
@@ -464,6 +466,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
464466
{
465467
struct request_queue *q;
466468
int ret, start = 0;
469+
char b[BDEVNAME_SIZE];
467470

468471
q = bdev_get_queue(bdev);
469472
if (!q)
@@ -473,7 +476,8 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)
473476

474477
switch (cmd) {
475478
case BLKTRACESETUP:
476-
ret = blk_trace_setup(q, bdev, arg);
479+
strcpy(b, bdevname(bdev, b));
480+
ret = blk_trace_setup(q, b, bdev->bd_dev, arg);
477481
break;
478482
case BLKTRACESTART:
479483
start = 1;

block/compat_ioctl.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ static int compat_blk_trace_setup(struct block_device *bdev, char __user *arg)
545545
struct blk_user_trace_setup buts;
546546
struct compat_blk_user_trace_setup cbuts;
547547
struct request_queue *q;
548+
char b[BDEVNAME_SIZE];
548549
int ret;
549550

550551
q = bdev_get_queue(bdev);
@@ -554,6 +555,8 @@ static int compat_blk_trace_setup(struct block_device *bdev, char __user *arg)
554555
if (copy_from_user(&cbuts, arg, sizeof(cbuts)))
555556
return -EFAULT;
556557

558+
strcpy(b, bdevname(bdev, b));
559+
557560
buts = (struct blk_user_trace_setup) {
558561
.act_mask = cbuts.act_mask,
559562
.buf_size = cbuts.buf_size,
@@ -565,7 +568,7 @@ static int compat_blk_trace_setup(struct block_device *bdev, char __user *arg)
565568
memcpy(&buts.name, &cbuts.name, 32);
566569

567570
mutex_lock(&bdev->bd_mutex);
568-
ret = do_blk_trace_setup(q, bdev, &buts);
571+
ret = do_blk_trace_setup(q, b, bdev->bd_dev, &buts);
569572
mutex_unlock(&bdev->bd_mutex);
570573
if (ret)
571574
return ret;

drivers/scsi/sg.c

+12
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ static int sg_version_num = 30534; /* 2 digits for each component */
4848
#include <linux/blkdev.h>
4949
#include <linux/delay.h>
5050
#include <linux/scatterlist.h>
51+
#include <linux/blktrace_api.h>
5152

5253
#include "scsi.h"
5354
#include <scsi/scsi_dbg.h>
@@ -1067,6 +1068,17 @@ sg_ioctl(struct inode *inode, struct file *filp,
10671068
case BLKSECTGET:
10681069
return put_user(sdp->device->request_queue->max_sectors * 512,
10691070
ip);
1071+
case BLKTRACESETUP:
1072+
return blk_trace_setup(sdp->device->request_queue,
1073+
sdp->disk->disk_name,
1074+
sdp->device->sdev_gendev.devt,
1075+
(char *)arg);
1076+
case BLKTRACESTART:
1077+
return blk_trace_startstop(sdp->device->request_queue, 1);
1078+
case BLKTRACESTOP:
1079+
return blk_trace_startstop(sdp->device->request_queue, 0);
1080+
case BLKTRACETEARDOWN:
1081+
return blk_trace_remove(sdp->device->request_queue);
10701082
default:
10711083
if (read_only)
10721084
return -EPERM; /* don't know so take safe approach */

include/linux/blktrace_api.h

+10-2
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ extern int blk_trace_ioctl(struct block_device *, unsigned, char __user *);
148148
extern void blk_trace_shutdown(struct request_queue *);
149149
extern void __blk_add_trace(struct blk_trace *, sector_t, int, int, u32, int, int, void *);
150150
extern int do_blk_trace_setup(struct request_queue *q,
151-
struct block_device *bdev, struct blk_user_trace_setup *buts);
151+
char *name, dev_t dev, struct blk_user_trace_setup *buts);
152152

153153

154154
/**
@@ -282,6 +282,11 @@ static inline void blk_add_trace_remap(struct request_queue *q, struct bio *bio,
282282
__blk_add_trace(bt, from, bio->bi_size, bio->bi_rw, BLK_TA_REMAP, !bio_flagged(bio, BIO_UPTODATE), sizeof(r), &r);
283283
}
284284

285+
extern int blk_trace_setup(request_queue_t *q, char *name, dev_t dev,
286+
char __user *arg);
287+
extern int blk_trace_startstop(request_queue_t *q, int start);
288+
extern int blk_trace_remove(request_queue_t *q);
289+
285290
#else /* !CONFIG_BLK_DEV_IO_TRACE */
286291
#define blk_trace_ioctl(bdev, cmd, arg) (-ENOTTY)
287292
#define blk_trace_shutdown(q) do { } while (0)
@@ -290,7 +295,10 @@ static inline void blk_add_trace_remap(struct request_queue *q, struct bio *bio,
290295
#define blk_add_trace_generic(q, rq, rw, what) do { } while (0)
291296
#define blk_add_trace_pdu_int(q, what, bio, pdu) do { } while (0)
292297
#define blk_add_trace_remap(q, bio, dev, f, t) do {} while (0)
293-
#define do_blk_trace_setup(q, bdev, buts) (-ENOTTY)
298+
#define do_blk_trace_setup(q, name, dev, buts) (-ENOTTY)
299+
#define blk_trace_setup(q, name, dev, arg) (-ENOTTY)
300+
#define blk_trace_startstop(q, start) (-ENOTTY)
301+
#define blk_trace_remove(q) (-ENOTTY)
294302
#endif /* CONFIG_BLK_DEV_IO_TRACE */
295303
#endif /* __KERNEL__ */
296304
#endif

0 commit comments

Comments
 (0)