linux/fs/orangefs
Martin Brandenburg dc62935ce0 orangefs: move features validation to fix filesystem hang
commit cefdc26e86 upstream.

Without this fix (and another to the userspace component itself
described later), the kernel will be unable to process any OrangeFS
requests after the userspace component is restarted (due to a crash or
at the administrator's behest).

The bug here is that inside orangefs_remount, the orangefs_request_mutex
is locked.  When the userspace component restarts while the filesystem
is mounted, it sends a ORANGEFS_DEV_REMOUNT_ALL ioctl to the device,
which causes the kernel to send it a few requests aimed at synchronizing
the state between the two.  While this is happening the
orangefs_request_mutex is locked to prevent any other requests going
through.

This is only half of the bugfix.  The other half is in the userspace
component which outright ignores(!) requests made before it considers
the filesystem remounted, which is after the ioctl returns.  Of course
the ioctl doesn't return until after the userspace component responds to
the request it ignores.  The userspace component has been changed to
allow ORANGEFS_VFS_OP_FEATURES regardless of the mount status.

Mike Marshall says:
 "I've tested this patch against the fixed userspace part. This patch is
  real important, I hope it can make it into 4.11...

  Here's what happens when the userspace daemon is restarted, without
  the patch:

    =============================================
    [ INFO: possible recursive locking detected ]
    [   4.10.0-00007-ge98bdb3 #1 Not tainted    ]
    ---------------------------------------------
    pvfs2-client-co/29032 is trying to acquire lock:
     (orangefs_request_mutex){+.+.+.}, at: service_operation+0x3c7/0x7b0 [orangefs]
                  but task is already holding lock:
     (orangefs_request_mutex){+.+.+.}, at: dispatch_ioctl_command+0x1bf/0x330 [orangefs]

    CPU: 0 PID: 29032 Comm: pvfs2-client-co Not tainted 4.10.0-00007-ge98bdb3 #1
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.9.3-1.fc25 04/01/2014
    Call Trace:
     __lock_acquire+0x7eb/0x1290
     lock_acquire+0xe8/0x1d0
     mutex_lock_killable_nested+0x6f/0x6e0
     service_operation+0x3c7/0x7b0 [orangefs]
     orangefs_remount+0xea/0x150 [orangefs]
     dispatch_ioctl_command+0x227/0x330 [orangefs]
     orangefs_devreq_ioctl+0x29/0x70 [orangefs]
     do_vfs_ioctl+0xa3/0x6e0
     SyS_ioctl+0x79/0x90"

Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Acked-by: Mike Marshall <hubcap@omnibond.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2017-04-12 12:41:12 +02:00
..
acl.c posix_acl: Clear SGID bit when setting file permissions 2016-09-22 10:55:32 +02:00
dcache.c orangefs: don't use d_time 2016-10-24 14:50:07 -04:00
devorangefs-req.c Merge branch 'misc' into for-next 2016-09-28 14:50:46 -04:00
dir.c orangefs: use %pd/%pD 2016-08-07 23:38:47 -04:00
downcall.h orangefs: add features op 2016-08-12 15:12:54 -04:00
file.c orangefs: user file_inode() where it is due 2016-10-24 14:29:39 -04:00
inode.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2016-10-10 20:16:43 -07:00
Kconfig Orangefs: kernel client part 7 2015-10-03 11:40:00 -04:00
Makefile Orangefs: change pvfs2 filenames to orangefs 2015-12-04 12:56:14 -05:00
namei.c orangefs: don't use d_time 2016-10-24 14:50:07 -04:00
orangefs-bufmap.c mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros 2016-04-04 10:41:08 -07:00
orangefs-bufmap.h orangefs-bufmap.h: trim unused junk 2016-03-25 22:30:54 -04:00
orangefs-cache.c orangefs: add features op 2016-08-12 15:12:54 -04:00
orangefs-debug.h Orangef: remove overlooked old-style userspace debug parts 2015-12-11 11:00:12 -05:00
orangefs-debugfs.c orangefs: add .owner to debugfs file_operations 2016-11-16 11:52:19 -05:00
orangefs-debugfs.h orangefs: clean up debugfs globals 2016-08-15 11:38:36 -04:00
orangefs-dev-proto.h orangefs: add features op 2016-08-12 15:12:54 -04:00
orangefs-kernel.h orangefs: don't use d_time 2016-10-24 14:50:07 -04:00
orangefs-mod.c orangefs: clean up debugfs 2016-11-07 10:41:55 -05:00
orangefs-sysfs.c Merge branch 'misc' into for-next 2016-09-28 14:50:46 -04:00
orangefs-sysfs.h Orangefs: change pvfs2 filenames to orangefs 2015-12-04 12:56:14 -05:00
orangefs-utils.c orangefs: rename most remaining global variables 2016-08-16 11:41:24 -04:00
protocol.h orangefs: clean up debugfs globals 2016-08-15 11:38:36 -04:00
super.c orangefs: move features validation to fix filesystem hang 2017-04-12 12:41:12 +02:00
symlink.c vfs: Remove {get,set,remove}xattr inode operations 2016-10-07 21:48:36 -04:00
upcall.h orangefs: add features op 2016-08-12 15:12:54 -04:00
waitqueue.c orangefs: rename most remaining global variables 2016-08-16 11:41:24 -04:00
xattr.c xattr: Stop calling {get,set,remove}xattr inode operations 2016-10-07 20:10:44 -04:00