[Devel] [PATCH rh7] fs/nfs: don't use delayed unmount for nfs.
Andrei Vagin
avagin at virtuozzo.com
Fri Oct 27 20:45:38 MSK 2017
On Fri, Oct 27, 2017 at 06:31:18PM +0300, Andrey Ryabinin wrote:
> 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.
You change a general scenario to fix your small case. For users, it will
be unexpected behaviour. They call umount -l and don't expect any
delays.
How nfs mounts are umounted when a host is shutdowned? I think they are
umounted from init scripts (systemd). Why we can't umount nfs mounts
with the force flag when we stop a container?
>
> https://jira.sw.ru/browse/PSBM-76086
> Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
> ---
> 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(-)
>
> diff --git a/drivers/net/venetdev.c b/drivers/net/venetdev.c
> index 1c4ae90b7ba8..11f4a66aaf3d 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 2c9824985bc5..c2489dd2f520 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 8f29ad17e29e..65a0ac8a3d16 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 79011b4bc040..2f3a983741f8 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;
> --
> 2.13.6
>
> _______________________________________________
> Devel mailing list
> Devel at openvz.org
> https://lists.openvz.org/mailman/listinfo/devel
More information about the Devel
mailing list