From owner-svn-src-projects@freebsd.org Fri May 18 22:22:10 2018 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id BCAC8EDE607 for ; Fri, 18 May 2018 22:22:09 +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.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 6E0DC6C990; Fri, 18 May 2018 22:22:09 +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 50A901E339; Fri, 18 May 2018 22:22:09 +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 w4IMM9Qi045351; Fri, 18 May 2018 22:22:09 GMT (envelope-from rmacklem@FreeBSD.org) Received: (from rmacklem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w4IMM9El045350; Fri, 18 May 2018 22:22:09 GMT (envelope-from rmacklem@FreeBSD.org) Message-Id: <201805182222.w4IMM9El045350@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to rmacklem@FreeBSD.org using -f From: Rick Macklem Date: Fri, 18 May 2018 22:22:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r333815 - projects/pnfs-planb-server/sys/fs/nfsserver X-SVN-Group: projects X-SVN-Commit-Author: rmacklem X-SVN-Commit-Paths: projects/pnfs-planb-server/sys/fs/nfsserver X-SVN-Commit-Revision: 333815 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.26 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: Fri, 18 May 2018 22:22:10 -0000 Author: rmacklem Date: Fri May 18 22:22:08 2018 New Revision: 333815 URL: https://svnweb.freebsd.org/changeset/base/333815 Log: Fix LayoutReturn for the FSID and ALL cases. At this time, I do not know of any client that actually do these, so this isn't actually tested. Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Fri May 18 20:24:19 2018 (r333814) +++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Fri May 18 22:22:08 2018 (r333815) @@ -203,7 +203,9 @@ static int nfsrv_addlayout(struct nfsrv_descript *nd, nfsv4stateid_t *stateidp, char *layp, int *layoutlenp, NFSPROC_T *p); static void nfsrv_freelayout(struct nfslayout *lyp); static void nfsrv_freelayoutlist(nfsquad_t clientid); -static void nfsrv_freealllayouts(int *fndp); +static void nfsrv_freelayouts(nfsquad_t *clid, fsid_t *fs, int laytype, + int iomode); +static void nfsrv_freealllayouts(void); static void nfsrv_freedevid(struct nfsdevice *ds); static int nfsrv_setdsserver(char *dspathp, char *mirrorp, NFSPROC_T *p, struct nfsdevice **dsp); @@ -218,9 +220,9 @@ static int nfsrv_findlayout(struct nfsrv_descript *nd, int laytype, NFSPROC_T *, struct nfslayout **lypp); static int nfsrv_fndclid(nfsquad_t *clidvec, nfsquad_t clid, int clidcnt); static struct nfslayout *nfsrv_filelayout(struct nfsrv_descript *nd, int iomode, - fhandle_t *fhp, fhandle_t *dsfhp, char *devid); + fhandle_t *fhp, fhandle_t *dsfhp, char *devid, fsid_t fs); static struct nfslayout *nfsrv_flexlayout(struct nfsrv_descript *nd, int iomode, - int mirrorcnt, fhandle_t *fhp, fhandle_t *dsfhp, char *devid); + int mirrorcnt, fhandle_t *fhp, fhandle_t *dsfhp, char *devid, fsid_t fs); static int nfsrv_dontlayout(fhandle_t *fhp); static int nfsrv_createdsfile(vnode_t vp, fhandle_t *fhp, struct pnfsdsfile *pf, vnode_t dvp, struct nfsdevice *ds, struct ucred *cred, NFSPROC_T *p, @@ -6367,13 +6369,14 @@ nfsrv_layoutget(struct nfsrv_descript *nd, vnode_t vp, error = NFSERR_TOOSMALL; else lyp = nfsrv_filelayout(nd, *iomode, &fh, dsfhp, - devid); + devid, vp->v_mount->mnt_stat.f_fsid); } else { if (NFSX_V4FLEXLAYOUT(mirrorcnt) > maxcnt) error = NFSERR_TOOSMALL; else lyp = nfsrv_flexlayout(nd, *iomode, mirrorcnt, - &fh, dsfhp, devid); + &fh, dsfhp, devid, + vp->v_mount->mnt_stat.f_fsid); } } free(dsfhp, M_TEMP); @@ -6399,7 +6402,7 @@ nfsrv_layoutget(struct nfsrv_descript *nd, vnode_t vp, */ static struct nfslayout * nfsrv_filelayout(struct nfsrv_descript *nd, int iomode, fhandle_t *fhp, - fhandle_t *dsfhp, char *devid) + fhandle_t *dsfhp, char *devid, fsid_t fs) { uint32_t *tl; struct nfslayout *lyp; @@ -6414,6 +6417,7 @@ nfsrv_filelayout(struct nfsrv_descript *nd, int iomode lyp->lay_flags = NFSLAY_READ; NFSBCOPY(fhp, &lyp->lay_fh, sizeof(*fhp)); lyp->lay_clientid.qval = nd->nd_clientid.qval; + lyp->lay_fsid = fs; /* Fill in the xdr for the files layout. */ tl = (uint32_t *)lyp->lay_xdr; @@ -6451,7 +6455,7 @@ nfsrv_filelayout(struct nfsrv_descript *nd, int iomode */ static struct nfslayout * nfsrv_flexlayout(struct nfsrv_descript *nd, int iomode, int mirrorcnt, - fhandle_t *fhp, fhandle_t *dsfhp, char *devid) + fhandle_t *fhp, fhandle_t *dsfhp, char *devid, fsid_t fs) { uint32_t *tl; struct nfslayout *lyp; @@ -6467,6 +6471,7 @@ nfsrv_flexlayout(struct nfsrv_descript *nd, int iomode lyp->lay_flags = NFSLAY_READ; NFSBCOPY(fhp, &lyp->lay_fh, sizeof(*fhp)); lyp->lay_clientid.qval = nd->nd_clientid.qval; + lyp->lay_fsid = fs; lyp->lay_mirrorcnt = mirrorcnt; /* Fill in the xdr for the files layout. */ @@ -6719,8 +6724,13 @@ nfsrv_layoutreturn(struct nfsrv_descript *nd, vnode_t } if (layouttype == NFSLAYOUT_FLEXFILE) nfsrv_flexlayouterr(nd, layp, maxcnt, p); - } else - nfsrv_freealllayouts(fndp); + } else if (kind == NFSV4LAYOUTRET_FSID) + nfsrv_freelayouts(&nd->nd_clientid, + &vp->v_mount->mnt_stat.f_fsid, layouttype, iomode); + else if (kind == NFSV4LAYOUTRET_ALL) + nfsrv_freelayouts(&nd->nd_clientid, NULL, layouttype, iomode); + else + error = NFSERR_INVAL; if (error == -1) error = 0; return (error); @@ -6963,7 +6973,6 @@ nfsrv_freealllayoutsanddevids(void) { struct nfsdontlist *mrp, *nmrp; struct nfslayout *lyp, *nlyp; - int fnd; /* Get rid of the deviceid structures. */ nfsrv_freealldevids(); @@ -6971,7 +6980,7 @@ nfsrv_freealllayoutsanddevids(void) nfsrv_devidcnt = 0; /* Get rid of all layouts. */ - nfsrv_freealllayouts(&fnd); + nfsrv_freealllayouts(); /* Get rid of any nfsdontlist entries. */ LIST_FOREACH_SAFE(mrp, &nfsrv_dontlisthead, nfsmr_list, nmrp) @@ -6986,21 +6995,50 @@ nfsrv_freealllayoutsanddevids(void) } /* + * Free layouts that match the arguments. + */ +static void +nfsrv_freelayouts(nfsquad_t *clid, fsid_t *fs, int laytype, int iomode) +{ + struct nfslayouthash *lhyp; + struct nfslayout *lyp, *nlyp; + int i; + + for (i = 0; i < nfsrv_layouthashsize; i++) { + lhyp = &nfslayouthash[i]; + NFSLOCKLAYOUT(lhyp); + LIST_FOREACH_SAFE(lyp, &lhyp->list, lay_list, nlyp) { + if (clid->qval != lyp->lay_clientid.qval) + continue; + if (fs != NULL && (fs->val[0] != lyp->lay_fsid.val[0] || + fs->val[1] != lyp->lay_fsid.val[1])) + continue; + if (laytype != lyp->lay_type) + continue; + if ((iomode & NFSLAYOUTIOMODE_READ) != 0) + lyp->lay_flags &= ~NFSLAY_READ; + if ((iomode & NFSLAYOUTIOMODE_RW) != 0) + lyp->lay_flags &= ~NFSLAY_RW; + if ((lyp->lay_flags & (NFSLAY_READ | NFSLAY_RW)) == 0) + nfsrv_freelayout(lyp); + } + NFSUNLOCKLAYOUT(lhyp); + } +} + +/* * Free all layouts. */ static void -nfsrv_freealllayouts(int *fndp) +nfsrv_freealllayouts(void) { struct nfslayouthash *lhyp; struct nfslayout *lyp, *nlyp; int i; - *fndp = 0; for (i = 0; i < nfsrv_layouthashsize; i++) { lhyp = &nfslayouthash[i]; NFSLOCKLAYOUT(lhyp); - if (!LIST_EMPTY(&lhyp->list)) - *fndp = 1; LIST_FOREACH_SAFE(lyp, &lhyp->list, lay_list, nlyp) nfsrv_freelayout(lyp); NFSUNLOCKLAYOUT(lhyp);