Date: Mon, 9 Jul 2018 00:38:39 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r336116 - in projects/pnfs-planb-server/sys/fs: nfs nfsserver Message-ID: <201807090038.w690cd2W014972@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Mon Jul 9 00:38:39 2018 New Revision: 336116 URL: https://svnweb.freebsd.org/changeset/base/336116 Log: Modify the pNFS server kernel code so that a "force" option can be implemented for pnfsdskill(8). pnfsdskill(8) will fail if there isn't a mirror for the DS that is being disabled. However, if the DS has failed, it may be necessary to do a pnfsdskill on the DS even when there is no valid mirror, so that the nfsd threads can be killed. This patch modifies the kernel to add a PNFSDOP_FORCEDELDS option that pnfsdkill(8) can use to force the disable. Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs.h 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.h ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfs/nfs.h Sun Jul 8 23:22:04 2018 (r336115) +++ projects/pnfs-planb-server/sys/fs/nfs/nfs.h Mon Jul 9 00:38:39 2018 (r336116) @@ -207,6 +207,7 @@ struct nfsd_pnfsd_args { #define PNFSDOP_DELDSSERVER 1 #define PNFSDOP_COPYMR 2 +#define PNFSDOP_FORCEDELDS 3 /* Old version. */ struct nfsd_nfsd_oargs { Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h Sun Jul 8 23:22:04 2018 (r336115) +++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h Mon Jul 9 00:38:39 2018 (r336116) @@ -159,8 +159,8 @@ int nfsrv_getdevinfo(char *, int, uint32_t *, uint32_t 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_deldsserver(int, char *, NFSPROC_T *); +struct nfsdevice *nfsrv_deldsnmp(int, struct nfsmount *, NFSPROC_T *); int nfsrv_createdevids(struct nfsd_nfsd_args *, NFSPROC_T *); int nfsrv_checkdsattr(struct nfsrv_descript *, vnode_t, NFSPROC_T *); int nfsrv_copymr(vnode_t, vnode_t, vnode_t, struct nfsdevice *, Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c Sun Jul 8 23:22:04 2018 (r336115) +++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c Mon Jul 9 00:38:39 2018 (r336116) @@ -3433,12 +3433,13 @@ nfssvc_nfsd(struct thread *td, struct nfssvc_args *uap free(nfsdarg.mdspath, M_TEMP); } else if (uap->flag & NFSSVC_PNFSDS) { error = copyin(uap->argp, &pnfsdarg, sizeof(pnfsdarg)); - if (error == 0 && pnfsdarg.op == PNFSDOP_DELDSSERVER) { + if (error == 0 && (pnfsdarg.op == PNFSDOP_DELDSSERVER || + pnfsdarg.op == PNFSDOP_FORCEDELDS)) { cp = malloc(PATH_MAX + 1, M_TEMP, M_WAITOK); error = copyinstr(pnfsdarg.dspath, cp, PATH_MAX + 1, NULL); if (error == 0) - error = nfsrv_deldsserver(cp, td); + error = nfsrv_deldsserver(pnfsdarg.op, cp, td); free(cp, M_TEMP); } else if (error == 0 && pnfsdarg.op == PNFSDOP_COPYMR) { cp = malloc(PATH_MAX + 1, M_TEMP, M_WAITOK); @@ -4014,7 +4015,7 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, NFSMNTP_CANCELRPCS)) == 0) { nmp->nm_privflag |= NFSMNTP_CANCELRPCS; NFSUNLOCKMNT(nmp); - ds = nfsrv_deldsnmp(nmp, p); + ds = nfsrv_deldsnmp(PNFSDOP_DELDSSERVER, nmp, p); NFSD_DEBUG(4, "dscreatfail fail=%d ds=%p\n", failpos, ds); if (ds != NULL) @@ -4248,7 +4249,7 @@ nfsrv_pnfsremove(struct vnode **dvp, int mirrorcnt, ch NFSMNTP_CANCELRPCS)) == 0) { nmp->nm_privflag |= NFSMNTP_CANCELRPCS; NFSUNLOCKMNT(nmp); - ds = nfsrv_deldsnmp(nmp, p); + ds = nfsrv_deldsnmp(PNFSDOP_DELDSSERVER, nmp, p); NFSD_DEBUG(4, "dsremovefail fail=%d ds=%p\n", failpos, ds); if (ds != NULL) @@ -4463,9 +4464,10 @@ tryagain: NFSMNTP_CANCELRPCS)) == 0) { failnmp->nm_privflag |= NFSMNTP_CANCELRPCS; NFSUNLOCKMNT(failnmp); - ds = nfsrv_deldsnmp(failnmp, p); - NFSD_DEBUG(4, "dsldsnmp fail=%d ds=%p\n", - failpos, ds); + ds = nfsrv_deldsnmp(PNFSDOP_DELDSSERVER, + failnmp, p); + NFSD_DEBUG(4, "nfsrv_proxyds: deldsnmp fail=%d " + "ds=%p\n", failpos, ds); if (ds != NULL) nfsrv_killrpcs(failnmp); NFSLOCKMNT(failnmp); Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Sun Jul 8 23:22:04 2018 (r336115) +++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Mon Jul 9 00:38:39 2018 (r336116) @@ -7482,7 +7482,7 @@ out: * Look up the mount path for the DS server and delete it. */ int -nfsrv_deldsserver(char *dspathp, NFSPROC_T *p) +nfsrv_deldsserver(int op, char *dspathp, NFSPROC_T *p) { struct mount *mp; struct nfsmount *nmp; @@ -7524,7 +7524,7 @@ nfsrv_deldsserver(char *dspathp, NFSPROC_T *p) mtx_unlock(&mountlist_mtx); if (nmp != NULL) { - ds = nfsrv_deldsnmp(nmp, p); + ds = nfsrv_deldsnmp(op, nmp, p); NFSD_DEBUG(4, "deldsnmp=%p\n", ds); if (ds != NULL) { nfsrv_killrpcs(nmp); @@ -7544,20 +7544,26 @@ nfsrv_deldsserver(char *dspathp, NFSPROC_T *p) * Search for and remove a DS entry which matches the "nmp" argument. * The nfsdevice structure pointer is returned so that the caller can * free it via nfsrv_freeonedevid(). + * For the forced case, do not try to do LayoutRecalls, since the server + * must be shut down now anyhow. */ struct nfsdevice * -nfsrv_deldsnmp(struct nfsmount *nmp, NFSPROC_T *p) +nfsrv_deldsnmp(int op, struct nfsmount *nmp, NFSPROC_T *p) { struct nfsdevice *fndds; NFSD_DEBUG(4, "deldsdvp\n"); NFSDDSLOCK(); - fndds = nfsrv_findmirroredds(nmp); + if (op == PNFSDOP_FORCEDELDS) + fndds = nfsv4_findmirror(nmp); + else + fndds = nfsrv_findmirroredds(nmp); if (fndds != NULL) nfsrv_deleteds(fndds); NFSDDSUNLOCK(); if (fndds != NULL) { - nfsrv_flexmirrordel(fndds->nfsdev_deviceid, p); + if (op != PNFSDOP_FORCEDELDS) + nfsrv_flexmirrordel(fndds->nfsdev_deviceid, p); printf("pNFS server: mirror %s failed\n", fndds->nfsdev_host); } return (fndds);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201807090038.w690cd2W014972>