1 From: Jens Axboe <jens.axboe@oracle.com>
2 Date: Mon Jan 5 10:17:25 2009 +0100
3 Subject: block: get rid of the manual directory counting in blktrace
6 It can result in a stuck blktrace system, if --kill is used.
8 Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
10 Acked-by: Jan Blunck <jblunck@suse.de>
12 block/blktrace.c | 72 ++++++++++++++++---------------------------------------
13 1 file changed, 21 insertions(+), 51 deletions(-)
15 Index: b/block/blktrace.c
16 ===================================================================
17 --- a/block/blktrace.c
18 +++ b/block/blktrace.c
19 @@ -181,59 +181,12 @@ EXPORT_SYMBOL_GPL(__blk_add_trace);
21 static struct dentry *blk_tree_root;
22 static DEFINE_MUTEX(blk_tree_mutex);
23 -static unsigned int root_users;
25 -static inline void blk_remove_root(void)
27 - if (blk_tree_root) {
28 - debugfs_remove(blk_tree_root);
29 - blk_tree_root = NULL;
33 -static void blk_remove_tree(struct dentry *dir)
35 - mutex_lock(&blk_tree_mutex);
36 - debugfs_remove(dir);
37 - if (--root_users == 0)
39 - mutex_unlock(&blk_tree_mutex);
42 -static struct dentry *blk_create_tree(const char *blk_name)
44 - struct dentry *dir = NULL;
47 - mutex_lock(&blk_tree_mutex);
49 - if (!blk_tree_root) {
50 - blk_tree_root = debugfs_create_dir("block", NULL);
56 - dir = debugfs_create_dir(blk_name, blk_tree_root);
60 - /* Delete root only if we created it */
66 - mutex_unlock(&blk_tree_mutex);
70 static void blk_trace_cleanup(struct blk_trace *bt)
72 - relay_close(bt->rchan);
73 debugfs_remove(bt->msg_file);
74 debugfs_remove(bt->dropped_file);
75 - blk_remove_tree(bt->dir);
76 + relay_close(bt->rchan);
77 free_percpu(bt->sequence);
78 free_percpu(bt->msg_data);
80 @@ -336,7 +289,18 @@ static int blk_subbuf_start_callback(str
82 static int blk_remove_buf_file_callback(struct dentry *dentry)
84 + struct dentry *parent = dentry->d_parent;
85 debugfs_remove(dentry);
88 + * this will fail for all but the last file, but that is ok. what we
89 + * care about is the top level buts->name directory going away, when
90 + * the last trace file is gone. Then we don't have to rmdir() that
91 + * manually on trace stop, so it nicely solves the issue with
92 + * force killing of running traces.
95 + debugfs_remove(parent);
99 @@ -393,7 +357,15 @@ int do_blk_trace_setup(struct request_qu
103 - dir = blk_create_tree(buts->name);
105 + if (!blk_tree_root) {
106 + blk_tree_root = debugfs_create_dir("block", NULL);
107 + if (!blk_tree_root)
111 + dir = debugfs_create_dir(buts->name, blk_tree_root);
116 @@ -436,8 +408,6 @@ int do_blk_trace_setup(struct request_qu
121 - blk_remove_tree(dir);
124 debugfs_remove(bt->msg_file);