[RHEL7,COMMIT] fs/nfs: don't use delayed unmount for nfs.

Submitted by Konstantin Khorenko on Oct. 30, 2017, 10:40 a.m.

Details

Message ID 201710301040.v9UAeBVm005277@finist_ce7.work
State New
Series "fs/nfs: don't use delayed unmount for nfs."
Headers show

Commit Message

Konstantin Khorenko Oct. 30, 2017, 10:40 a.m.
The commit is pushed to "branch-rh7-3.10.0-693.1.1.vz7.37.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-693.1.1.vz7.37.19
------>
commit abd3253f6ac9760e27243c6376df765f4ce8ad32
Author: Andrey Ryabinin <aryabinin@virtuozzo.com>
Date:   Mon Oct 30 13:40:11 2017 +0300

    fs/nfs: don't use delayed unmount for nfs.
    
    Delayed nfs unmount causes too much PITA. We must destroy VENET ip after
    unmount, but in that case we can't reuse that IP on restarted container
    because it migh be still alive.
    
    So let's just unmount NFS synchronously and destroy veip after it.
    
    https://jira.sw.ru/browse/PSBM-76086
    Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
    
    khorenko@: initially all umounts were syncronous, rebase to RHEL7.4
    brought us async umounts.
    It's about ordinary "umounts", do not mix it with "umount -l".
---
 drivers/net/venetdev.c | 9 ++-------
 fs/namespace.c         | 3 ++-
 fs/nfs/super.c         | 1 +
 include/linux/fs.h     | 4 ++++
 4 files changed, 9 insertions(+), 8 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/net/venetdev.c b/drivers/net/venetdev.c
index 1c4ae90..11f4a66 100644
--- a/drivers/net/venetdev.c
+++ b/drivers/net/venetdev.c
@@ -765,7 +765,7 @@  static void venet_dellink(struct net_device *dev, struct list_head *head)
 	 * has VE_FEATURE_NFS enabled. Thus here we have to destroy veip in
 	 * this case.
 	 */
-	if (env->ve_netns || (env->features & VE_FEATURE_NFS))
+	if (env->ve_netns)
 		veip_shutdown(env);
 
 	env->_venet_dev = NULL;
@@ -1182,12 +1182,7 @@  static struct rtnl_link_ops venet_link_ops = {
 
 static void veip_shutdown_fini(void *data)
 {
-	struct ve_struct *ve = data;
-
-	if (ve->features & VE_FEATURE_NFS)
-		return;
-
-	veip_shutdown(ve);
+	veip_shutdown(data);
 }
 
 static struct ve_hook veip_shutdown_hook = {
diff --git a/fs/namespace.c b/fs/namespace.c
index 2c98249..c2489dd 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1134,7 +1134,8 @@  static void mntput_no_expire(struct mount *mnt)
 	}
 	unlock_mount_hash();
 
-	if (likely(!(mnt->mnt.mnt_flags & MNT_INTERNAL))) {
+	if (likely(!(mnt->mnt.mnt_flags & MNT_INTERNAL))
+	    && !(mnt->mnt.mnt_sb->s_iflags & SB_I_UMOUNT_SYNC)) {
 		struct task_struct *task = current;
 		if (likely(!(task->flags & PF_KTHREAD))) {
 			init_task_work(&mnt->mnt_rcu, __cleanup_mnt);
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 8f29ad1..65a0ac8 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2414,6 +2414,7 @@  static int nfs_set_super(struct super_block *s, void *data)
 	int ret;
 
 	s->s_flags = sb_mntdata->mntflags;
+	s->s_iflags |= SB_I_UMOUNT_SYNC;
 	s->s_fs_info = server;
 	s->s_d_op = server->nfs_client->rpc_ops->dentry_ops;
 	ret = set_anon_super(s, server);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 79011b4..2f3a983 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1526,6 +1526,9 @@  struct mm_struct;
 #define UMOUNT_NOFOLLOW	0x00000008	/* Don't follow symlink on umount */
 #define UMOUNT_UNUSED	0x80000000	/* Flag guaranteed to be unused */
 
+/* sb->s_iflags */
+#define SB_I_UMOUNT_SYNC		0x10000000 /* don't use delayed unmount */
+
 extern struct list_head super_blocks;
 extern spinlock_t sb_lock;
 
@@ -1566,6 +1569,7 @@  struct super_block {
 	const struct quotactl_ops	*s_qcop;
 	const struct export_operations *s_export_op;
 	unsigned long		s_flags;
+	unsigned long           s_iflags;       /* internal SB_I_* flags */
 	unsigned long		s_magic;
 	struct dentry		*s_root;
 	struct rw_semaphore	s_umount;