From owner-svn-src-projects@freebsd.org Tue Aug 27 01:40:40 2019 Return-Path: Delivered-To: svn-src-projects@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 109A3C40E4 for ; Tue, 27 Aug 2019 01:40:40 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 46HWm76dBsz4BHW; Tue, 27 Aug 2019 01:40:39 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 8B89DF56E; Tue, 27 Aug 2019 01:40:39 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x7R1edtj011074; Tue, 27 Aug 2019 01:40:39 GMT (envelope-from rmacklem@FreeBSD.org) Received: (from rmacklem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x7R1edvC010782; Tue, 27 Aug 2019 01:40:39 GMT (envelope-from rmacklem@FreeBSD.org) Message-Id: <201908270140.x7R1edvC010782@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to rmacklem@FreeBSD.org using -f From: Rick Macklem Date: Tue, 27 Aug 2019 01:40:39 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r351525 - projects/nfsv42/sys/fs/nfsclient X-SVN-Group: projects X-SVN-Commit-Author: rmacklem X-SVN-Commit-Paths: projects/nfsv42/sys/fs/nfsclient X-SVN-Commit-Revision: 351525 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Aug 2019 01:40:40 -0000 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) \