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
ocfs2/acl: use 'ip_xattr_sem' to protect getting extended attribute
2018-01-31 17:18:35 -08:00
acl.h
alloc.c
ocfs2: fix the application IO timeout when fstrim is running
2019-03-05 21:07:13 -08:00
alloc.h
ocfs2: try to reuse extent block in dealloc without meta_alloc
2018-01-31 17:18:35 -08:00
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
ocfs2: clean up some unused function declarations
2017-11-15 18:21:01 -08:00
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
ocfs2: add ocfs2_overwrite_io()
2018-01-31 17:18:35 -08:00
extent_map.h
ocfs2: add ocfs2_overwrite_io()
2018-01-31 17:18:35 -08:00
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.h
ocfs2: fix the application IO timeout when fstrim is running
2019-03-05 21:07:13 -08:00
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: add trimfs dlm lock resource
2018-01-31 17:18:35 -08:00
ocfs2_lockingver.h
ocfs2_trace.h
ocfs2: fix the application IO timeout when fstrim is running
2019-03-05 21:07:13 -08:00
quota.h
quota_global.c
ocfs2: convert to new i_version API
2018-01-29 06:42:21 -05:00
quota_local.c
ocfs2: return -EROFS when filesystem becomes read-only
2018-08-17 16:20:27 -07:00
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
ocfs2: remove unused declaration ocfs2_publish_get_mount_state()
2017-11-15 18:21:01 -08:00
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