On Fri, Jan 02 2009, Vinay Sridhar wrote: > Hello, > > On executing "blktrace -k" on a running trace, the trace hangs. After > killing the trace, rerunning it results in "BLKTRACESTOP: invalid > argument" messages. > > This was discussed earlier here: > http://www.mail-archive.com/linux-btrace@xxxxxxxxxxxxxxx/msg00229.html > > But I dont see this fix to have been included as I'm still seeing this > error with the the latest kernel. Could someone please indicate why this > fix didnt go in? I was able to port the above suggested fix to 2.6.28. I think I wanted to test it a bit more. I'll toss it in for 2.6.29 and give it some testing! Thanks for the reminder... > > > diff -Nuarp a/block/blktrace.c b/block/blktrace.c > --- a/block/blktrace.c 2008-12-24 17:26:37.000000000 -0600 > +++ b/block/blktrace.c 2009-01-02 11:13:11.000000000 -0600 > @@ -181,59 +181,12 @@ EXPORT_SYMBOL_GPL(__blk_add_trace); > > static struct dentry *blk_tree_root; > static DEFINE_MUTEX(blk_tree_mutex); > -static unsigned int root_users; > - > -static inline void blk_remove_root(void) > -{ > - if (blk_tree_root) { > - debugfs_remove(blk_tree_root); > - blk_tree_root = NULL; > - } > -} > - > -static void blk_remove_tree(struct dentry *dir) > -{ > - mutex_lock(&blk_tree_mutex); > - debugfs_remove(dir); > - if (--root_users == 0) > - blk_remove_root(); > - mutex_unlock(&blk_tree_mutex); > -} > - > -static struct dentry *blk_create_tree(const char *blk_name) > -{ > - struct dentry *dir = NULL; > - int created = 0; > - > - mutex_lock(&blk_tree_mutex); > - > - if (!blk_tree_root) { > - blk_tree_root = debugfs_create_dir("block", NULL); > - if (!blk_tree_root) > - goto err; > - created = 1; > - } > - > - dir = debugfs_create_dir(blk_name, blk_tree_root); > - if (dir) > - root_users++; > - else { > - /* Delete root only if we created it */ > - if (created) > - blk_remove_root(); > - } > - > -err: > - mutex_unlock(&blk_tree_mutex); > - return dir; > -} > > 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); > + relay_close(bt->rchan); > free_percpu(bt->sequence); > free_percpu(bt->msg_data); > kfree(bt); > @@ -336,7 +289,18 @@ static int blk_subbuf_start_callback(str > > static int blk_remove_buf_file_callback(struct dentry *dentry) > { > + struct dentry *parent = dentry->d_parent; > debugfs_remove(dentry); > + > + /* > + * this will fail for all but the last file, but that is ok. what we > + * care about is the top level buts->name directory going away, when > + * the last trace file is gone. Then we don't have to rmdir() that > + * manually on trace stop, so it nicely solves the issue with > + * force killing of running traces. > + */ > + > + debugfs_remove(parent); > return 0; > } > > @@ -394,7 +358,15 @@ int do_blk_trace_setup(struct request_qu > goto err; > > ret = -ENOENT; > - dir = blk_create_tree(buts->name); > + > + if (!blk_tree_root) { > + blk_tree_root = debugfs_create_dir("block", NULL); > + if (!blk_tree_root) > + return -ENOMEM; > + } > + > + dir = debugfs_create_dir(buts->name, blk_tree_root); > + > if (!dir) > goto err; > > @@ -437,8 +409,6 @@ int do_blk_trace_setup(struct request_qu > > return 0; > err: > - if (dir) > - blk_remove_tree(dir); > if (bt) { > if (bt->msg_file) > debugfs_remove(bt->msg_file); > > > > Vinay Sridhar, > Linux Technology Center, > IBM ISTL, > Bangalore, India > > -- Jens Axboe -- To unsubscribe from this list: send the line "unsubscribe linux-btrace" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html