diff options
author | Jan Kara <jack@suse.cz> | 2008-09-23 18:24:08 +0200 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2008-11-27 17:38:28 +0100 |
commit | 52b19ac993f1aeadbce15b55302be9a35346e235 (patch) | |
tree | 90695f8fdaa97d3a30b1e5f82016fb1cce3da16b | |
parent | Merge master.kernel.org:/home/rmk/linux-2.6-arm (diff) | |
download | linux-52b19ac993f1aeadbce15b55302be9a35346e235.tar.xz linux-52b19ac993f1aeadbce15b55302be9a35346e235.zip |
udf: Fix BUG_ON() in destroy_inode()
udf_clear_inode() can leave behind buffers on mapping's i_private list (when
we truncated preallocation). Call invalidate_inode_buffers() so that the list
is properly cleaned-up before we return from udf_clear_inode(). This is ugly
and suggest that we should cleanup preallocation earlier than in clear_inode()
but currently there's no such call available since drop_inode() is called under
inode lock and thus is unusable for disk operations.
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | fs/buffer.c | 1 | ||||
-rw-r--r-- | fs/udf/inode.c | 1 |
2 files changed, 2 insertions, 0 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index 6569fda5cfed..10179cfa1152 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -878,6 +878,7 @@ void invalidate_inode_buffers(struct inode *inode) spin_unlock(&buffer_mapping->private_lock); } } +EXPORT_SYMBOL(invalidate_inode_buffers); /* * Remove any clean buffers from the inode's buffer list. This is called diff --git a/fs/udf/inode.c b/fs/udf/inode.c index 6e74b117aaf0..30ebde490f7f 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c @@ -106,6 +106,7 @@ void udf_clear_inode(struct inode *inode) udf_truncate_tail_extent(inode); unlock_kernel(); write_inode_now(inode, 0); + invalidate_inode_buffers(inode); } iinfo = UDF_I(inode); kfree(iinfo->i_ext.i_data); |