linux/fs/ocfs2
Darrick J. Wong e6a9467ea1 ocfs2: fix inode bh swapping mixup in ocfs2_reflink_inodes_lock
ocfs2_reflink_inodes_lock() can swap the inode1/inode2 variables so that
we always grab cluster locks in order of increasing inode number.

Unfortunately, we forget to swap the inode record buffer head pointers
when we've done this, which leads to incorrect bookkeepping when we're
trying to make the two inodes have the same refcount tree.

This has the effect of causing filesystem shutdowns if you're trying to
reflink data from inode 100 into inode 97, where inode 100 already has a
refcount tree attached and inode 97 doesn't.  The reflink code decides
to copy the refcount tree pointer from 100 to 97, but uses inode 97's
inode record to open the tree root (which it doesn't have) and blows up.
This issue causes filesystem shutdowns and metadata corruption!

Link: http://lkml.kernel.org/r/20190312214910.GK20533@magnolia
Fixes: 29ac8e856c ("ocfs2: implement the VFS clone_range, copy_range, and dedupe_range features")
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Joseph Qi <jiangqi903@gmail.com>
Cc: Mark Fasheh <mfasheh@versity.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Junxiao Bi <junxiao.bi@oracle.com>
Cc: Joseph Qi <joseph.qi@huawei.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2019-03-29 10:01:37 -07:00
..
cluster ocfs2: fix a panic problem caused by o2cb_ctl 2019-03-05 21:07:13 -08:00
dlm ocfs2: improve ocfs2 Makefile 2018-12-28 12:11:45 -08:00
dlmfs Remove 'type' argument from access_ok() function 2019-01-03 18:57:57 -08:00
acl.c
acl.h
alloc.c ocfs2: fix the application IO timeout when fstrim is running 2019-03-05 21:07:13 -08:00
alloc.h
aops.c fs: don't open code lru_to_page() 2019-01-04 13:13:48 -08:00
aops.h ocfs2: keep the trace point consistent with the function name 2018-04-05 21:36:21 -07:00
blockcheck.c
blockcheck.h
buffer_head_io.c ocfs2: don't clear bh uptodate for block read 2018-12-28 12:11:46 -08:00
buffer_head_io.h
dcache.c
dcache.h
dir.c ocfs2: fix a misuse a of brelse after failing ocfs2_check_dir_entry 2018-11-03 10:09:37 -07:00
dir.h
dlmglue.c ocfs2: fix the application IO timeout when fstrim is running 2019-03-05 21:07:13 -08:00
dlmglue.h ocfs2: ocfs2_inode_lock_tracker does not distinguish lock level 2018-06-07 17:34:33 -07:00
export.c ocfs2: fix potential use after free 2018-11-30 14:56:15 -08:00
export.h
extent_map.c
extent_map.h
file.c ocfs2: don't use iocb when EIOCBQUEUED returns 2018-11-03 10:09:37 -07:00
file.h ocfs2: clean up redundant function declarations 2018-06-07 17:34:33 -07:00
filecheck.c ocfs2: add duplicated ino number check 2018-04-05 21:36:22 -07:00
filecheck.h ocfs2: add kobject for online file check 2018-04-05 21:36:22 -07:00
heartbeat.c
heartbeat.h
inode.c ocfs2: clean up some unnecessary code 2018-08-17 16:20:27 -07:00
inode.h
ioctl.c ocfs2: eliminate a misreported warning 2018-06-07 17:34:33 -07:00
ioctl.h
journal.c ocfs2: clear journal dirty flag after shutdown journal 2018-12-28 12:11:45 -08:00
journal.h
Kconfig
localalloc.c ocfs2: fix panic due to unrecovered local alloc 2018-12-28 12:11:45 -08:00
localalloc.h
locks.c ocfs2: properly initial file_lock used for unlock. 2018-11-30 11:26:12 -05:00
locks.h
Makefile ocfs2: improve ocfs2 Makefile 2018-12-28 12:11:45 -08:00
mmap.c fs: ocfs2: use new return type vm_fault_t 2018-06-07 17:34:34 -07:00
mmap.h
move_extents.c ocfs2: fix deadlock caused by ocfs2_defrag_extent() 2018-11-30 14:56:13 -08:00
move_extents.h
namei.c ocfs2: drop a VLA in ocfs2_orphan_del() 2018-06-07 17:34:34 -07:00
namei.h
ocfs1_fs_compat.h
ocfs2_fs.h ocfs2: correct the comments position of struct ocfs2_dir_block_trailer 2018-06-07 17:34:34 -07:00
ocfs2_ioctl.h
ocfs2_lockid.h
ocfs2_lockingver.h
ocfs2_trace.h ocfs2: fix the application IO timeout when fstrim is running 2019-03-05 21:07:13 -08:00
ocfs2.h ocfs2: fix the application IO timeout when fstrim is running 2019-03-05 21:07:13 -08:00
quota_global.c
quota_local.c ocfs2: return -EROFS when filesystem becomes read-only 2018-08-17 16:20:27 -07:00
quota.h
refcounttree.c ocfs2: fix inode bh swapping mixup in ocfs2_reflink_inodes_lock 2019-03-29 10:01:37 -07:00
refcounttree.h ocfs2: remove ocfs2_reflink_remap_range 2018-10-30 10:45:48 +11:00
reservations.c
reservations.h
resize.c
resize.h
slot_map.c ocfs2: Use zero-sized array and struct_size() in kzalloc() 2019-03-05 21:07:13 -08:00
slot_map.h
stack_o2cb.c
stack_user.c treewide: Align function definition open/close braces 2018-03-26 11:13:09 +02:00
stackglue.c ocfs2: remove ocfs2_is_o2cb_active() 2018-11-03 10:09:37 -07:00
stackglue.h ocfs2: remove ocfs2_is_o2cb_active() 2018-11-03 10:09:37 -07:00
suballoc.c ocfs2: remove two unused functions from suballoc.c 2018-04-05 21:36:22 -07:00
suballoc.h
super.c ocfs2: fix the application IO timeout when fstrim is running 2019-03-05 21:07:13 -08:00
super.h
symlink.c
symlink.h
sysfile.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
sysfile.h
uptodate.c ocfs2: remove unnecessary null pointer check before kmem_cache_destroy() 2018-04-05 21:36:22 -07:00
uptodate.h
xattr.c ocfs2: use 'osb' instead of 'OCFS2_SB()' 2018-04-05 21:36:21 -07:00
xattr.h