udf: Fix BUG_ON() in destroy_inode()
authorJan Kara <jack@suse.cz>
Tue, 23 Sep 2008 16:24:08 +0000 (18:24 +0200)
committerJan Kara <jack@suse.cz>
Thu, 27 Nov 2008 16:38:28 +0000 (17:38 +0100)
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>
fs/buffer.c
fs/udf/inode.c

index 6569fda5cfed892c7e4ed53daa2e9677e60c36d5..10179cfa11528683495886657bd643ebde590ce8 100644 (file)
@@ -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
index 6e74b117aaf0e58d078e59d88817562de8379a1d..30ebde490f7f5ebc3a4b79331191706c180b5a8f 100644 (file)
@@ -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);