Skip to content

Commit

Permalink
Added in user-injected messages into blk traces
Browse files Browse the repository at this point in the history
This allows a user to annotate the blk trace stream: writing a suitable
message to {/sys/kernel/debug}/block/<dsf>/msg will have it propagated
into the trace stream.

Signed-off-by: Alan D. Brunelle <alan.brunelle@hp.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
  • Loading branch information
Alan D. Brunelle authored and Jens Axboe committed Jul 3, 2008
1 parent 7b67913 commit 02c6230
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
45 changes: 45 additions & 0 deletions block/blktrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ static struct dentry *blk_create_tree(const char *blk_name)
static void blk_trace_cleanup(struct blk_trace *bt)
{
relay_close(bt->rchan);
debugfs_remove(bt->msg_file);
debugfs_remove(bt->dropped_file);
blk_remove_tree(bt->dir);
free_percpu(bt->sequence);
Expand Down Expand Up @@ -291,6 +292,44 @@ static const struct file_operations blk_dropped_fops = {
.read = blk_dropped_read,
};

static int blk_msg_open(struct inode *inode, struct file *filp)
{
filp->private_data = inode->i_private;

return 0;
}

static ssize_t blk_msg_write(struct file *filp, const char __user *buffer,
size_t count, loff_t *ppos)
{
char *msg;
struct blk_trace *bt;

if (count > BLK_TN_MAX_MSG)
return -EINVAL;

msg = kmalloc(count, GFP_KERNEL);
if (msg == NULL)
return -ENOMEM;

if (copy_from_user(msg, buffer, count)) {
kfree(msg);
return -EFAULT;
}

bt = filp->private_data;
__trace_note_message(bt, "%s", msg);
kfree(msg);

return count;
}

static const struct file_operations blk_msg_fops = {
.owner = THIS_MODULE,
.open = blk_msg_open,
.write = blk_msg_write,
};

/*
* Keep track of how many times we encountered a full subbuffer, to aid
* the user space app in telling how many lost events there were.
Expand Down Expand Up @@ -380,6 +419,10 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
if (!bt->dropped_file)
goto err;

bt->msg_file = debugfs_create_file("msg", 0222, dir, bt, &blk_msg_fops);
if (!bt->msg_file)
goto err;

bt->rchan = relay_open("trace", dir, buts->buf_size,
buts->buf_nr, &blk_relay_callbacks, bt);
if (!bt->rchan)
Expand Down Expand Up @@ -409,6 +452,8 @@ int do_blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
if (dir)
blk_remove_tree(dir);
if (bt) {
if (bt->msg_file)
debugfs_remove(bt->msg_file);
if (bt->dropped_file)
debugfs_remove(bt->dropped_file);
free_percpu(bt->sequence);
Expand Down
1 change: 1 addition & 0 deletions include/linux/blktrace_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ struct blk_trace {
u32 dev;
struct dentry *dir;
struct dentry *dropped_file;
struct dentry *msg_file;
atomic_t dropped;
};

Expand Down

0 comments on commit 02c6230

Please sign in to comment.