Date: Sun, 20 May 2018 21:07:29 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r333940 - in projects/pnfs-planb-server/sys/fs: nfs nfsserver Message-ID: <201805202107.w4KL7T4h071526@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Sun May 20 21:07:29 2018 New Revision: 333940 URL: https://svnweb.freebsd.org/changeset/base/333940 Log: Add code to free layouts in the NFSv4.1 pNFS server when the file is deleted. Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h Sun May 20 20:48:26 2018 (r333939) +++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h Sun May 20 21:07:29 2018 (r333940) @@ -155,6 +155,7 @@ int nfsrv_layoutreturn(struct nfsrv_descript *, vnode_ int nfsrv_getdevinfo(char *, int, uint32_t *, uint32_t *, int *, char **); void nfsrv_freeonedevid(struct nfsdevice *); void nfsrv_freealllayoutsanddevids(void); +void nfsrv_freefilelayouts(fhandle_t *); int nfsrv_deldsserver(char *, NFSPROC_T *); struct nfsdevice *nfsrv_deldsnmp(struct nfsmount *, NFSPROC_T *); int nfsrv_createdevids(struct nfsd_nfsd_args *, NFSPROC_T *); Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c Sun May 20 20:48:26 2018 (r333939) +++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c Sun May 20 21:07:29 2018 (r333940) @@ -106,8 +106,9 @@ extern struct nfsdevicehead nfsrv_devidhead; static void nfsrv_pnfscreate(struct vnode *, struct vattr *, struct ucred *, NFSPROC_T *); static void nfsrv_pnfsremovesetup(struct vnode *, NFSPROC_T *, struct vnode **, - int *, char *); -static void nfsrv_pnfsremove(struct vnode **, int, char *, NFSPROC_T *); + int *, char *, fhandle_t *); +static void nfsrv_pnfsremove(struct vnode **, int, char *, fhandle_t *, + NFSPROC_T *); static int nfsrv_proxyds(struct nfsrv_descript *, struct vnode *, off_t, int, struct ucred *, struct thread *, int, struct mbuf **, char *, struct mbuf **, struct nfsvattr *, struct acl *); @@ -1209,6 +1210,7 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, str struct vnode *vp, *dsdvp[NFSDEV_MAXMIRRORS]; int error = 0, i, mirrorcnt; char fname[PNFS_FILENAME_LEN + 1]; + fhandle_t fh; vp = ndp->ni_vp; dsdvp[0] = NULL; @@ -1217,12 +1219,12 @@ nfsvno_removesub(struct nameidata *ndp, int is_v4, str else if (is_v4) error = nfsrv_checkremove(vp, 1, p); if (error == 0) - nfsrv_pnfsremovesetup(vp, p, dsdvp, &mirrorcnt, fname); + nfsrv_pnfsremovesetup(vp, p, dsdvp, &mirrorcnt, fname, &fh); if (!error) error = VOP_REMOVE(ndp->ni_dvp, vp, &ndp->ni_cnd); if (dsdvp[0] != NULL) { if (error == 0) - nfsrv_pnfsremove(dsdvp, mirrorcnt, fname, p); + nfsrv_pnfsremove(dsdvp, mirrorcnt, fname, &fh, p); for (i = 0; i < mirrorcnt; i++) NFSVOPUNLOCK(dsdvp[i], 0); } @@ -1288,6 +1290,7 @@ nfsvno_rename(struct nameidata *fromndp, struct nameid struct vnode *fvp, *tvp, *tdvp, *dsdvp[NFSDEV_MAXMIRRORS]; int error = 0, i, mirrorcnt; char fname[PNFS_FILENAME_LEN + 1]; + fhandle_t fh; dsdvp[0] = NULL; fvp = fromndp->ni_vp; @@ -1365,7 +1368,7 @@ nfsvno_rename(struct nameidata *fromndp, struct nameid nfsd_recalldelegation(fvp, p); } if (error == 0 && tvp != NULL) { - nfsrv_pnfsremovesetup(tvp, p, dsdvp, &mirrorcnt, fname); + nfsrv_pnfsremovesetup(tvp, p, dsdvp, &mirrorcnt, fname, &fh); NFSD_DEBUG(4, "nfsvno_rename: pnfsremovesetup" " dsdvp=%p\n", dsdvp[0]); } @@ -1394,7 +1397,7 @@ out: */ if (dsdvp[0] != NULL) { if (error == 0) { - nfsrv_pnfsremove(dsdvp, mirrorcnt, fname, p); + nfsrv_pnfsremove(dsdvp, mirrorcnt, fname, &fh, p); NFSD_DEBUG(4, "nfsvno_rename: pnfsremove\n"); } for (i = 0; i < mirrorcnt; i++) @@ -3970,7 +3973,7 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, */ static void nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, struct vnode **dvpp, - int *mirrorcntp, char *fname) + int *mirrorcntp, char *fname, fhandle_t *fhp) { struct vattr va; struct ucred *tcred; @@ -3994,6 +3997,12 @@ nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, if (va.va_nlink > 1) return; + error = nfsvno_getfh(vp, fhp, p); + if (error != 0) { + printf("pNFS: nfsrv_pnfsremovesetup getfh=%d\n", error); + return; + } + buflen = 1024; buf = malloc(buflen, M_TEMP, M_WAITOK); /* Get the directory vnode for the DS mount and the file handle. */ @@ -4073,7 +4082,8 @@ start_dsremove(void *arg, int pending) * removed to set up the dvp and fill in the FH. */ static void -nfsrv_pnfsremove(struct vnode **dvp, int mirrorcnt, char *fname, NFSPROC_T *p) +nfsrv_pnfsremove(struct vnode **dvp, int mirrorcnt, char *fname, fhandle_t *fhp, + NFSPROC_T *p) { struct ucred *tcred; struct nfsrvdsremove *dsrm, *tdsrm; @@ -4145,6 +4155,9 @@ nfsrv_pnfsremove(struct vnode **dvp, int mirrorcnt, ch } NFSUNLOCKMNT(nmp); } + + /* Get rid all layouts for the file. */ + nfsrv_freefilelayouts(fhp); NFSFREECRED(tcred); free(dsrm, M_TEMP); Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Sun May 20 20:48:26 2018 (r333939) +++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Sun May 20 21:07:29 2018 (r333940) @@ -7027,6 +7027,27 @@ nfsrv_freelayouts(nfsquad_t *clid, fsid_t *fs, int lay } /* + * Free all layouts for the argument file. + */ +void +nfsrv_freefilelayouts(fhandle_t *fhp) +{ + 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 (NFSBCMP(&lyp->lay_fh, fhp, sizeof(*fhp)) == 0) + nfsrv_freelayout(lyp); + } + NFSUNLOCKLAYOUT(lhyp); + } +} + +/* * Free all layouts. */ static void
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201805202107.w4KL7T4h071526>