android_kernel_xiaomi_sm8350/fs/ocfs2
Tristan Ye b54c2ca475 Ocfs2: Handle deletion of reflinked oprhan inodes correctly.
The rule is that all inodes in the orphan dir have ORPHANED_FL,
otherwise we treated it as an ERROR.  This rule works well except
for some rare cases of reflink operation:

http://oss.oracle.com/bugzilla/show_bug.cgi?id=1215

The problem is caused by how reflink and our orphan_scan thread
interact.

 * The orphan scan pulls the orphans into a queue first, then runs the
   queue at a later time.  We only hold the orphan_dir's lock
   during scanning.

 * Reflink create a oprhaned target in orphan_dir as its first step.
   It removes the target and clears the flag as the final step.
   These two steps take the orphan_dir's lock, but it is not held for
   the duration.

Based on the above semantics, a reflink inode can be moved out of the
orphan dir and have its ORPHANED_FL cleared before the queue of orphans
is run.  This leads to a ERROR in ocfs2_query_wipde_inode().

This patch teaches ocfs2_query_wipe_inode() to detect previously
orphaned reflink targets.  If a reflink fails or a crash occurs during
the relfink operation, the inode will retain ORPHANED_FL and will be
properly wiped.

Signed-off-by: Tristan Ye <tristan.ye@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
2010-03-23 18:22:55 -07:00
..
cluster fs/ocfs2/cluster/tcp.c: remove use of NIPQUAD, use %pI4 2010-03-12 15:52:27 -08:00
dlm dlm: allow dlm do recovery during shutdown 2010-02-26 15:41:19 -08:00
dlmfs ocfs2/userdlm: Add tracing in userdlm 2010-02-27 19:57:07 -08:00
acl.c ocfs2: set i_mode on disk during acl operations 2010-03-17 12:28:22 -07:00
acl.h
alloc.c Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 2010-03-05 13:20:53 -08:00
alloc.h
aops.c Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 2010-03-05 13:20:53 -08:00
aops.h
blockcheck.c
blockcheck.h
buffer_head_io.c ocfs2/trivial: Remove trailing whitespaces 2010-01-25 19:20:51 -08:00
buffer_head_io.h
dcache.c
dcache.h
dir.c Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 2010-03-05 13:20:53 -08:00
dir.h
dlmglue.c Merge branch 'for-next' into for-linus 2010-03-08 16:55:37 +01:00
dlmglue.h
export.c ocfs2/trivial: Remove trailing whitespaces 2010-01-25 19:20:51 -08:00
export.h
extent_map.c Merge branch 'for-next' into for-linus 2010-03-08 16:55:37 +01:00
extent_map.h
file.c Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs-2.6 2010-03-05 13:20:53 -08:00
file.h
heartbeat.c
heartbeat.h
inode.c Ocfs2: Handle deletion of reflinked oprhan inodes correctly. 2010-03-23 18:22:55 -07:00
inode.h
ioctl.c ocfs2: Use compat_ptr in reflink_arguments. 2010-02-02 18:56:37 -08:00
ioctl.h Ocfs2: Move ocfs2 ioctl definitions from ocfs2_fs.h to newly added ocfs2_ioctl.h 2010-03-02 14:10:20 -08:00
journal.c ocfs2/trivial: Remove trailing whitespaces 2010-01-25 19:20:51 -08:00
journal.h
Kconfig
localalloc.c ocfs2: Clear undo bits when local alloc is freed 2010-03-23 18:22:40 -07:00
localalloc.h
locks.c [PATCH] Skip check for mandatory locks when unlocking 2010-03-17 12:07:16 -07:00
locks.h
Makefile ocfs2_dlmfs: Move to its own directory 2010-02-26 15:41:14 -08:00
mmap.c
mmap.h
namei.c Ocfs2: Journaling i_flags and i_orphaned_slot when adding inode to orphan dir. 2010-03-23 18:22:51 -07:00
namei.h
ocfs1_fs_compat.h
ocfs2_fs.h Ocfs2: Move ocfs2 ioctl definitions from ocfs2_fs.h to newly added ocfs2_ioctl.h 2010-03-02 14:10:20 -08:00
ocfs2_ioctl.h Ocfs2: Move ocfs2 ioctl definitions from ocfs2_fs.h to newly added ocfs2_ioctl.h 2010-03-02 14:10:20 -08:00
ocfs2_lockid.h
ocfs2_lockingver.h ocfs2_dlmfs: Enable the use of user cluster stacks. 2010-02-26 15:41:18 -08:00
ocfs2.h ocfs2: Clear undo bits when local alloc is freed 2010-03-23 18:22:40 -07:00
quota_global.c dquot: cleanup dquot initialize routine 2010-03-05 00:20:30 +01:00
quota_local.c bitops: rename for_each_bit() to for_each_set_bit() 2010-03-06 11:26:23 -08:00
quota.h
refcounttree.c ocfs2: Update i_blocks in reflink operations. 2010-03-17 12:28:00 -07:00
refcounttree.h
resize.c
resize.h
slot_map.c
slot_map.h
stack_o2cb.c ocfs2: Hang the locking proto on the cluster conn and use it in asts. 2010-02-26 15:41:16 -08:00
stack_user.c ocfs2: Remove the ast pointers from ocfs2_stack_plugins 2010-02-26 15:41:16 -08:00
stackglue.c ocfs2_dlmfs: Enable the use of user cluster stacks. 2010-02-26 15:41:18 -08:00
stackglue.h ocfs2_dlmfs: Enable the use of user cluster stacks. 2010-02-26 15:41:18 -08:00
suballoc.c ocfs2: Clear undo bits when local alloc is freed 2010-03-23 18:22:40 -07:00
suballoc.h ocfs2: Clear undo bits when local alloc is freed 2010-03-23 18:22:40 -07:00
super.c ocfs2: add extent block stealing for ocfs2 v5 2010-02-26 15:41:07 -08:00
super.h
symlink.c ocfs2: Fix refcnt leak on ocfs2_fast_follow_link() error path 2010-01-11 15:38:50 -08:00
symlink.h
sysfile.c
sysfile.h
uptodate.c ocfs2/trivial: Remove trailing whitespaces 2010-01-25 19:20:51 -08:00
uptodate.h
ver.c
ver.h
xattr.c ocfs2: Init meta_ac properly in ocfs2_create_empty_xattr_block. 2010-03-19 14:53:52 -07:00
xattr.h