Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 Jan 2021 18:24:03 +0000
From:      Mark de Groot <mark@markict.nl>
To:        "src-committers@FreeBSD.org" <src-committers@FreeBSD.org>, "dev-commits-src-all@FreeBSD.org" <dev-commits-src-all@FreeBSD.org>, "dev-commits-src-main@FreeBSD.org" <dev-commits-src-main@FreeBSD.org>
Subject:   Re: git: 51a9b978e750 - main - nfs server: improve use of the VFS KPI
Message-ID:  <AM0PR08MB3363372E8E9856E8ED01B50CA8D40@AM0PR08MB3363.eurprd08.prod.outlook.com>
In-Reply-To: <202101021818.102IIK6C032104@gitrepo.freebsd.org>
References:  <202101021818.102IIK6C032104@gitrepo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
unsubscribe
________________________________
Van: owner-dev-commits-src-all@freebsd.org <owner-dev-commits-src-all@freeb=
sd.org> namens Konstantin Belousov <kib@FreeBSD.org>
Verzonden: zaterdag 2 januari 2021 19:18
Aan: src-committers@FreeBSD.org <src-committers@FreeBSD.org>; dev-commits-s=
rc-all@FreeBSD.org <dev-commits-src-all@FreeBSD.org>; dev-commits-src-main@=
FreeBSD.org <dev-commits-src-main@FreeBSD.org>
Onderwerp: git: 51a9b978e750 - main - nfs server: improve use of the VFS KP=
I

The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=3D51a9b978e75021415fdced616b4e=
4bc373a20a8a

commit 51a9b978e75021415fdced616b4e4bc373a20a8a
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-01-01 15:35:44 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-01-02 18:17:12 +0000

    nfs server: improve use of the VFS KPI

    In particular, do not assume that vn_start_write() returns the same mp
    as it was passed in, or never returns error.

    Also be more accurate to return NULL vp and mp when error occured, to
    catch wrong control flow easier.

    Stop checking for NULL mp before calling vn_finished_write(), NULL mp
    is handled transparently by the function.

    Reviewed by:    rmacklem
    Tested by:      pho
    MFC after:      1 week
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D27881
---
 sys/fs/nfsserver/nfs_nfsdport.c   | 33 ++++++++++++++++++++-------------
 sys/fs/nfsserver/nfs_nfsdsocket.c |  6 ++----
 2 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdpor=
t.c
index e9a9443dc08c..727a83005fa0 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -3243,28 +3243,35 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrv=
fh *nfp, int lktype,
     struct vnode **vpp, struct nfsexstuff *exp,
     struct mount **mpp, int startwrite)
 {
-       struct mount *mp;
+       struct mount *mp, *mpw;
         struct ucred *credanon;
         fhandle_t *fhp;
+       int error;

+       if (mpp !=3D NULL)
+               *mpp =3D NULL;
+       *vpp =3D NULL;
         fhp =3D (fhandle_t *)nfp->nfsrvfh_data;
-       /*
-        * Check for the special case of the nfsv4root_fh.
-        */
         mp =3D vfs_busyfs(&fhp->fh_fsid);
-       if (mpp !=3D NULL)
-               *mpp =3D mp;
         if (mp =3D=3D NULL) {
-               *vpp =3D NULL;
                 nd->nd_repstat =3D ESTALE;
                 goto out;
         }

         if (startwrite) {
-               vn_start_write(NULL, mpp, V_WAIT);
+               mpw =3D mp;
+               error =3D vn_start_write(NULL, &mpw, V_WAIT);
+               if (error !=3D 0) {
+                       mpw =3D NULL;
+                       vfs_unbusy(mp);
+                       nd->nd_repstat =3D ESTALE;
+                       goto out;
+               }
                 if (lktype =3D=3D LK_SHARED && !(MNT_SHARED_WRITES(mp)))
                         lktype =3D LK_EXCLUSIVE;
-       }
+       } else
+               mpw =3D NULL;
+
         nd->nd_repstat =3D nfsvno_fhtovp(mp, fhp, nd->nd_nam, lktype, vpp,=
 exp,
             &credanon);
         vfs_unbusy(mp);
@@ -3276,6 +3283,7 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrvfh=
 *nfp, int lktype,
         if (!nd->nd_repstat && exp->nes_exflag =3D=3D 0 &&
             !(nd->nd_flag & ND_NFSV4)) {
                 vput(*vpp);
+               *vpp =3D NULL;
                 nd->nd_repstat =3D EACCES;
         }

@@ -3336,11 +3344,10 @@ nfsd_fhtovp(struct nfsrv_descript *nd, struct nfsrv=
fh *nfp, int lktype,
         if (credanon !=3D NULL)
                 crfree(credanon);
         if (nd->nd_repstat) {
-               if (startwrite)
-                       vn_finished_write(mp);
+               vn_finished_write(mpw);
                 *vpp =3D NULL;
-               if (mpp !=3D NULL)
-                       *mpp =3D NULL;
+       } else if (mpp !=3D NULL) {
+               *mpp =3D mpw;
         }

 out:
diff --git a/sys/fs/nfsserver/nfs_nfsdsocket.c b/sys/fs/nfsserver/nfs_nfsds=
ocket.c
index 530ebb8a8cc8..e9602c352420 100644
--- a/sys/fs/nfsserver/nfs_nfsdsocket.c
+++ b/sys/fs/nfsserver/nfs_nfsdsocket.c
@@ -612,8 +612,7 @@ tryagain:
                 nfsrvd_statstart(nfsv3to4op[nd->nd_procnum], /*now*/ NULL)=
;
                 nfsrvd_statend(nfsv3to4op[nd->nd_procnum], /*bytes*/ 0,
                    /*now*/ NULL, /*then*/ NULL);
-               if (mp !=3D NULL && nfsrv_writerpc[nd->nd_procnum] !=3D 0)
-                       vn_finished_write(mp);
+               vn_finished_write(mp);
                 goto out;
         }

@@ -643,8 +642,7 @@ tryagain:
                         error =3D (*(nfsrv3_procs0[nd->nd_procnum]))(nd, i=
sdgram,
                             vp, &nes);
                 }
-               if (mp !=3D NULL && nfsrv_writerpc[nd->nd_procnum] !=3D 0)
-                       vn_finished_write(mp);
+               vn_finished_write(mp);

                 if (error =3D=3D 0 && nd->nd_repstat =3D=3D ERELOOKUP) {
                         /*
_______________________________________________
dev-commits-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-all
To unsubscribe, send any mail to "dev-commits-src-all-unsubscribe@freebsd.o=
rg"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AM0PR08MB3363372E8E9856E8ED01B50CA8D40>