From: Jaegeuk Kim <jaegeuk@kernel.org>
To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net
Cc: Jaegeuk Kim <jaegeuk@kernel.org>, Al Viro <viro@zeniv.linux.org.uk>
Subject: [PATCH] vfs: introduce UMOUNT_WAIT which waits for umount completion
Date: Wed, 13 Sep 2017 13:09:41 -0700 [thread overview]
Message-ID: <20170913200941.39420-1-jaegeuk@kernel.org> (raw)
This patch introduces UMOUNT_WAIT flag for umount(2) which let user wait for
its completion. This would fix a kernel panic caused by block device access by
filesystem, after device_shutdown during kernel_restart. This can happen due
to delayed umount -- reboot process already succeeded to unmount filesystem,
but its instance is sitll alive.
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
fs/namespace.c | 12 +++++++++++-
include/linux/fs.h | 1 +
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/fs/namespace.c b/fs/namespace.c
index f8893dc6a989..b1ac89915b10 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -21,6 +21,7 @@
#include <linux/fs_struct.h> /* get_fs_root et.al. */
#include <linux/fsnotify.h> /* fsnotify_vfsmount_delete */
#include <linux/uaccess.h>
+#include <linux/file.h>
#include <linux/proc_ns.h>
#include <linux/magic.h>
#include <linux/bootmem.h>
@@ -1629,7 +1630,8 @@ SYSCALL_DEFINE2(umount, char __user *, name, int, flags)
int retval;
int lookup_flags = 0;
- if (flags & ~(MNT_FORCE | MNT_DETACH | MNT_EXPIRE | UMOUNT_NOFOLLOW))
+ if (flags & ~(MNT_FORCE | MNT_DETACH | MNT_EXPIRE | UMOUNT_NOFOLLOW |
+ UMOUNT_WAIT))
return -EINVAL;
if (!may_mount())
@@ -1652,12 +1654,20 @@ SYSCALL_DEFINE2(umount, char __user *, name, int, flags)
retval = -EPERM;
if (flags & MNT_FORCE && !capable(CAP_SYS_ADMIN))
goto dput_and_out;
+ if (flags & UMOUNT_WAIT)
+ flush_delayed_fput();
retval = do_umount(mnt, flags);
dput_and_out:
/* we mustn't call path_put() as that would clear mnt_expiry_mark */
dput(path.dentry);
mntput_no_expire(mnt);
+ if (!retval && (flags & UMOUNT_WAIT)) {
+ if (likely(!(current->flags & PF_KTHREAD)))
+ task_work_run();
+ else
+ flush_scheduled_work();
+ }
out:
return retval;
}
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 83341a6a553e..cb62af7a03e7 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1283,6 +1283,7 @@ struct mm_struct;
#define MNT_DETACH 0x00000002 /* Just detach from the tree */
#define MNT_EXPIRE 0x00000004 /* Mark for expiry */
#define UMOUNT_NOFOLLOW 0x00000008 /* Don't follow symlink on umount */
+#define UMOUNT_WAIT 0x00000010 /* Wait to unmount completely */
#define UMOUNT_UNUSED 0x80000000 /* Flag guaranteed to be unused */
/* sb->s_iflags */
--
2.14.0.rc1.383.gd1ce394fe2-goog
next reply other threads:[~2017-09-13 20:10 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-13 20:09 Jaegeuk Kim [this message]
2017-09-13 23:04 ` [PATCH] vfs: introduce UMOUNT_WAIT which waits for umount completion Al Viro
2017-09-13 23:31 ` Jaegeuk Kim
2017-09-13 23:44 ` Al Viro
2017-09-14 1:10 ` Jaegeuk Kim
2017-09-14 1:10 ` Jaegeuk Kim
2017-09-14 1:30 ` Al Viro
2017-09-14 18:37 ` Al Viro
2017-09-14 19:14 ` Jaegeuk Kim
2017-09-15 0:19 ` Jaegeuk Kim
2017-09-15 2:06 ` Al Viro
2017-09-15 2:06 ` Al Viro
2017-09-15 3:45 ` Jaegeuk Kim
2017-09-15 4:21 ` Al Viro
2017-09-15 18:44 ` Jaegeuk Kim
2017-09-15 22:12 ` Theodore Ts'o
2017-09-15 22:12 ` Theodore Ts'o
2017-09-15 23:29 ` Jaegeuk Kim
2017-09-15 23:43 ` Al Viro
2017-09-19 15:55 ` Jaegeuk Kim
2017-09-16 7:11 ` Amir Goldstein
2017-09-16 7:11 ` Amir Goldstein
2017-09-20 17:38 ` [PATCH v2] " Jaegeuk Kim
2017-09-20 18:38 ` Al Viro
2017-09-21 0:34 ` Jaegeuk Kim
2017-09-21 2:42 ` Al Viro
2017-09-21 5:02 ` Jaegeuk Kim
2017-09-21 14:48 ` Theodore Ts'o
2017-09-21 17:16 ` Jaegeuk Kim
2017-09-21 18:20 ` [PATCH v3] vfs: introduce UMOUNT_WAIT to wait for delayed_fput/mntput completion Jaegeuk Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170913200941.39420-1-jaegeuk@kernel.org \
--to=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.