android_kernel_oneplus_msm8998/fs/ceph
Luis Henriques 1d86cb8d32 ceph: fix buffer free while holding i_ceph_lock in __ceph_setxattr()
[ Upstream commit 86968ef21596515958d5f0a40233d02be78ecec0 ]

Calling ceph_buffer_put() in __ceph_setxattr() may end up freeing the
i_xattrs.prealloc_blob buffer while holding the i_ceph_lock.  This can be
fixed by postponing the call until later, when the lock is released.

The following backtrace was triggered by fstests generic/117.

  BUG: sleeping function called from invalid context at mm/vmalloc.c:2283
  in_atomic(): 1, irqs_disabled(): 0, pid: 650, name: fsstress
  3 locks held by fsstress/650:
   #0: 00000000870a0fe8 (sb_writers#8){.+.+}, at: mnt_want_write+0x20/0x50
   #1: 00000000ba0c4c74 (&type->i_mutex_dir_key#6){++++}, at: vfs_setxattr+0x55/0xa0
   #2: 000000008dfbb3f2 (&(&ci->i_ceph_lock)->rlock){+.+.}, at: __ceph_setxattr+0x297/0x810
  CPU: 1 PID: 650 Comm: fsstress Not tainted 5.2.0+ #437
  Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.12.1-0-ga5cab58-prebuilt.qemu.org 04/01/2014
  Call Trace:
   dump_stack+0x67/0x90
   ___might_sleep.cold+0x9f/0xb1
   vfree+0x4b/0x60
   ceph_buffer_release+0x1b/0x60
   __ceph_setxattr+0x2b4/0x810
   __vfs_setxattr+0x66/0x80
   __vfs_setxattr_noperm+0x59/0xf0
   vfs_setxattr+0x81/0xa0
   setxattr+0x115/0x230
   ? filename_lookup+0xc9/0x140
   ? rcu_read_lock_sched_held+0x74/0x80
   ? rcu_sync_lockdep_assert+0x2e/0x60
   ? __sb_start_write+0x142/0x1a0
   ? mnt_want_write+0x20/0x50
   path_setxattr+0xba/0xd0
   __x64_sys_lsetxattr+0x24/0x30
   do_syscall_64+0x50/0x1c0
   entry_SYSCALL_64_after_hwframe+0x49/0xbe
  RIP: 0033:0x7ff23514359a

Signed-off-by: Luis Henriques <lhenriques@suse.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2019-09-10 10:29:48 +01:00
..
acl.c ceph: fix recursion between ceph_set_acl() and __ceph_setattr() 2017-05-25 14:30:13 +02:00
addr.c ceph: fix readpage from fscache 2017-09-07 08:34:09 +02:00
cache.c ceph: fix readpage from fscache 2017-09-07 08:34:09 +02:00
cache.h
caps.c ceph: hold i_ceph_lock when removing caps for freeing inode 2019-08-04 09:35:02 +02:00
ceph_frag.c
debugfs.c
dir.c ceph: ensure d_name stability in ceph_dentry_hash() 2019-05-16 19:44:43 +02:00
export.c
file.c
inode.c ceph: fix use-after-free on symlink traversal 2019-05-16 19:44:59 +02:00
ioctl.c
ioctl.h
Kconfig
locks.c
Makefile
mds_client.c ceph: fix ci->i_head_snapc leak 2019-05-16 19:44:43 +02:00
mds_client.h
mdsmap.c
snap.c ceph: fix ci->i_head_snapc leak 2019-05-16 19:44:43 +02:00
strings.c
super.c ceph: flush dirty inodes before proceeding with remount 2019-06-11 12:23:46 +02:00
super.h ceph: fix improper use of smp_mb__before_atomic() 2019-08-06 18:28:26 +02:00
xattr.c ceph: fix buffer free while holding i_ceph_lock in __ceph_setxattr() 2019-09-10 10:29:48 +01:00