svn commit: r351525 - projects/nfsv42/sys/fs/nfsclient
Rick Macklem
rmacklem at FreeBSD.org
Tue Aug 27 01:40:40 UTC 2019
Author: rmacklem
Date: Tue Aug 27 01:40:38 2019
New Revision: 351525
URL: https://svnweb.freebsd.org/changeset/base/351525
Log:
Add support for _PC_MIN_HOLE_SIZE to the NFSv4.2 client.
Unfortunately there is no NFSv4.2 attribute for this, so all I could come
up with was to try Seek to see if it supported and, if it is, return
mnt_stat.f_iosize as a "best guess".
At least this allows applications to use hole size non-zero to indicate
support for holes.
Modified:
projects/nfsv42/sys/fs/nfsclient/nfs_clvnops.c
projects/nfsv42/sys/fs/nfsclient/nfsmount.h
Modified: projects/nfsv42/sys/fs/nfsclient/nfs_clvnops.c
==============================================================================
--- projects/nfsv42/sys/fs/nfsclient/nfs_clvnops.c Tue Aug 27 01:16:02 2019 (r351524)
+++ projects/nfsv42/sys/fs/nfsclient/nfs_clvnops.c Tue Aug 27 01:40:38 2019 (r351525)
@@ -3754,7 +3754,10 @@ nfs_pathconf(struct vop_pathconf_args *ap)
struct nfsv3_pathconf pc;
struct nfsvattr nfsva;
struct vnode *vp = ap->a_vp;
+ struct nfsmount *nmp;
struct thread *td = curthread;
+ off_t off;
+ bool eof;
int attrflag, error;
if ((NFS_ISV34(vp) && (ap->a_name == _PC_LINK_MAX ||
@@ -3852,6 +3855,40 @@ nfs_pathconf(struct vop_pathconf_args *ap)
break;
case _PC_SYMLINK_MAX:
*ap->a_retval = NFS_MAXPATHLEN;
+ break;
+ case _PC_MIN_HOLE_SIZE:
+ /* Only some NFSv4.2 servers support Seek for Holes. */
+ *ap->a_retval = 0;
+ nmp = VFSTONFS(vp->v_mount);
+ if (NFS_ISV4(vp) && nmp->nm_minorvers == NFSV42_MINORVERSION) {
+ /*
+ * NFSv4.2 doesn't have an attribute for hole size,
+ * so all we can do is see if the Seek operation is
+ * supported and then use f_iosize as a "best guess".
+ */
+ mtx_lock(&nmp->nm_mtx);
+ if ((nmp->nm_privflag & NFSMNTP_SEEKTESTED) == 0) {
+ mtx_unlock(&nmp->nm_mtx);
+ off = 0;
+ attrflag = 0;
+ error = nfsrpc_seek(vp, &off, &eof,
+ NFSV4CONTENT_HOLE, td->td_ucred, &nfsva,
+ &attrflag);
+ if (attrflag != 0)
+ nfscl_loadattrcache(&vp, &nfsva,
+ NULL, NULL, 0, 1);
+ mtx_lock(&nmp->nm_mtx);
+ if (error == NFSERR_NOTSUPP)
+ nmp->nm_privflag |= NFSMNTP_SEEKTESTED;
+ else
+ nmp->nm_privflag |= NFSMNTP_SEEKTESTED |
+ NFSMNTP_SEEK;
+ error = 0;
+ }
+ if ((nmp->nm_privflag & NFSMNTP_SEEK) != 0)
+ *ap->a_retval = vp->v_mount->mnt_stat.f_iosize;
+ mtx_unlock(&nmp->nm_mtx);
+ }
break;
default:
Modified: projects/nfsv42/sys/fs/nfsclient/nfsmount.h
==============================================================================
--- projects/nfsv42/sys/fs/nfsclient/nfsmount.h Tue Aug 27 01:16:02 2019 (r351524)
+++ projects/nfsv42/sys/fs/nfsclient/nfsmount.h Tue Aug 27 01:40:38 2019 (r351525)
@@ -108,6 +108,8 @@ struct nfsmount {
#define NFSMNTP_IOADVISETHRUMDS 0x00000004
#define NFSMNTP_NOCOPY 0x00000008
#define NFSMNTP_NOCONSECUTIVE 0x00000010
+#define NFSMNTP_SEEK 0x00000020
+#define NFSMNTP_SEEKTESTED 0x00000040
#define NFSMNT_DIRPATH(m) (&((m)->nm_name[(m)->nm_krbnamelen + 1]))
#define NFSMNT_SRVKRBNAME(m) \
More information about the svn-src-projects
mailing list