Remove double removal of blktrace directory
Subsystems (2)
PATCH 1/1 Remove double removal of blktrace directory
Remove double removal of blktrace directory
commit fd51d251e4cdb21f68e9dbc4336514d64a105a79
Author: Stefan Raspl <[email protected]> Date: Tue May 19 09:59:08 2009 +0200
blktrace: remove debugfs entries on bad path
added in an explicit invocation of debugfs_remove for bt->dir, in blk_remove_buf_file_callback we are also getting the directory removed. On occasion I am seeing memory corruption that I have bisected down to this commit. [The testing involves a (long) series of I/O benchmarks with blktrace invoked around the actual runs.] I believe that this committed patch is correct, but the problem actually lies in the code in blk_remove_buf_file_callback.
With this patch I am able to consistently get complete runs whereas previously I could not get a single run to complete.
The first part of the patch simply moves the debugfs_remove below therelay_close: the relay_close call will remove files under bt->dir, and so we should not remove the directory until all the files we created have been removed. (Note: This is not sufficient to fix the problem - the file system code has ref counts on the directoy, so our invocation does not cause the directory to actually be removed. Nonetheless, we should not rely upon that feature.)
--- kernel/trace/blktrace.c | 12 +----------- 1 files changed, 1 insertions(+), 11 deletions(-)
kernel/trace/blktrace.c +1 -11
@@ -267,8 +267,8 @@ static void blk_trace_free(struct blk_trace *bt) {debugfs_remove (bt->msg_file);debugfs_remove (bt->dropped_file); -debugfs_remove (bt->dir);relay_close (bt->rchan); +debugfs_remove (bt->dir);free_percpu (bt->sequence);free_percpu (bt->msg_data);kfree (bt);
@@ -378,18 +378,8 @@ static int blk_subbuf_start_callback(struct rchan_buf *buf, void *subbuf,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 ; }
Signature · 1 line
1.6.0.4