Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] move truncate_inode_pages() into ->delete_inode()

Allow file systems supporting ->delete_inode() to call
truncate_inode_pages() on their own. OCFS2 wants this so it can query the
cluster before making a final decision on whether to wipe an inode from
disk or not. In some corner cases an inode marked on the local node via
voting may not actually get orphaned. A good example is node death before
the transaction moving the inode to the orphan dir commits to the journal.
Without this patch, the truncate_inode_pages() call in
generic_delete_inode() would discard valid data for such inodes.

During earlier discussion in the 2.6.13 merge plan thread, Christoph
Hellwig indicated that other file systems might also find this useful.

IMHO, the best solution would be to just allow ->drop_inode() to do the
cluster query but it seems that would require a substantial reworking of
that section of the code. Assuming it is safe to call write_inode_now() in
ocfs2_delete_inode() for those inodes which won't actually get wiped, this
solution should get us by for now.

Trivial testing of this patch (and a related OCFS2 update) has shown this
to avoid the corruption I'm seeing.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Acked-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Mark Fasheh and committed by
Linus Torvalds
e85b5652 7f6fd5db

+7 -5
+7 -5
fs/inode.c
··· 1034 1034 inodes_stat.nr_inodes--; 1035 1035 spin_unlock(&inode_lock); 1036 1036 1037 - if (inode->i_data.nrpages) 1038 - truncate_inode_pages(&inode->i_data, 0); 1039 - 1040 1037 security_inode_delete(inode); 1041 1038 1042 1039 if (op->delete_inode) { 1043 1040 void (*delete)(struct inode *) = op->delete_inode; 1044 1041 if (!is_bad_inode(inode)) 1045 1042 DQUOT_INIT(inode); 1046 - /* s_op->delete_inode internally recalls clear_inode() */ 1043 + /* Filesystems implementing their own 1044 + * s_op->delete_inode are required to call 1045 + * truncate_inode_pages and clear_inode() 1046 + * internally */ 1047 1047 delete(inode); 1048 - } else 1048 + } else { 1049 + truncate_inode_pages(&inode->i_data, 0); 1049 1050 clear_inode(inode); 1051 + } 1050 1052 spin_lock(&inode_lock); 1051 1053 hlist_del_init(&inode->i_hash); 1052 1054 spin_unlock(&inode_lock);