使用同步选项挂载 NFS,但不使用 noac 选项

使用同步选项挂载 NFS,但不使用 noac 选项

当我使用以下sync选项挂载时:

sudo mount -o vers=4,soft,sync,sec=none -t nfs 192.168.1.198:/js.js /mnt/self

同步选项似乎未应用:

$ cat /proc/mounts | grep nfs
192.168.1.198:/js.js /mnt/self nfs4 rw,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,port=0,timeo=600,retrans=2,sec=null,clientaddr=192.168.1.198,local_lock=none,addr=192.168.1.198 0 0

但是,如果我使用该noac选项,则意味着sync

sudo mount -o vers=4,soft,noac,sec=none -t nfs 192.168.1.198:/js.js /mnt/self

那么我确实看到它被应用:

$ cat /proc/mounts | grep nfs
192.168.1.198:/js.js /mnt/self nfs4 rw,sync,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=0,acregmax=0,acdirmin=0,acdirmax=0,soft,noac,proto=tcp,port=0,timeo=600,retrans=2,sec=null,clientaddr=192.168.1.198,local_lock=none,addr=192.168.1.198 0 0

另外,如果我挂载服务器的根目录而不是子目录:

sudo mount -o vers=4,sync,sec=none -t nfs 192.168.1.198:/ /mnt/self

然后我还看到同步选项被应用:

$ cat /proc/mounts | grep nfs
192.168.1.198:/ /mnt/self nfs4 rw,sync,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=null,clientaddr=192.168.1.198,local_lock=none,addr=192.168.1.198 0 0

这是 Ubuntu 上的内核 3.8.0-28-generic。当我在 CentOS 上使用 2.6.32 尝试同样的事情时,同步选项在所有情况下都适用。

在较新版本的内核中以及挂载子目录时,如何启用没有 noac 模式的同步模式?

答案1

这次提交将解决这个问题。

提交 e890db0104826742818cbfb8fdb3000a38a9b97c

NFSv4:修复 nfs4 挂载的同步挂载选项

diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 71fdc0d..f6db66d 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2478,6 +2478,10 @@ struct dentry *nfs_fs_mount_common(struct nfs_server *server,
    if (server->flags & NFS_MOUNT_NOAC)
        sb_mntdata.mntflags |= MS_SYNCHRONOUS;

+   if (mount_info->cloned != NULL && mount_info->cloned->sb != NULL)
+       if (mount_info->cloned->sb->s_flags & MS_SYNCHRONOUS)
+           sb_mntdata.mntflags |= MS_SYNCHRONOUS;
+
    /* Get a superblock - note that we may end up sharing one that already exists */
    s = sget(nfs_mod->nfs_fs, compare_super, nfs_set_super, flags, &sb_mntdata);
    if (IS_ERR(s)) {

相关内容