From owner-svn-src-projects@freebsd.org Fri Aug 18 01:23:55 2017 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9D780DE4648 for ; Fri, 18 Aug 2017 01:23:55 +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 mx1.freebsd.org (Postfix) with ESMTPS id 74A0B6CDC5; Fri, 18 Aug 2017 01:23:55 +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 v7I1NsBp045283; Fri, 18 Aug 2017 01:23:54 GMT (envelope-from rmacklem@FreeBSD.org) Received: (from rmacklem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v7I1NsmL045281; Fri, 18 Aug 2017 01:23:54 GMT (envelope-from rmacklem@FreeBSD.org) Message-Id: <201708180123.v7I1NsmL045281@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to rmacklem@FreeBSD.org using -f From: Rick Macklem Date: Fri, 18 Aug 2017 01:23:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r322640 - 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: 322640 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.23 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 Aug 2017 01:23:55 -0000 Author: rmacklem Date: Fri Aug 18 01:23:54 2017 New Revision: 322640 URL: https://svnweb.freebsd.org/changeset/base/322640 Log: Fix the searches of the device id lists so that they include the mirror entries. Also, modify nfsrv_dssetsockmnt() so that it only returns ENOENT if none of the DSs were found. This will allow a mirrored system to run in a degraded mode when one mirror is offline. The mirroring is now working for normal operation, although Flex File layout has not yet been tested (all I/O goes through MDS when mirroring is set up). Now, the fun part is to code handling of a DS mirror failure and resilvering of a DS mirror to bring it back online. Also, testing of Flex File layout against a recent Linux client needs to be done. Modified: 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/nfsserver/nfs_nfsdport.c ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c Fri Aug 18 01:19:46 2017 (r322639) +++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c Fri Aug 18 01:23:54 2017 (r322640) @@ -4188,10 +4188,10 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char struct vnode *dvp, **tdvpp; struct nfsmount *nmp; struct sockaddr *sad; - struct nfsdevice *ds; + struct nfsdevice *ds, *mds; struct pnfsdsfile *pf; uint32_t dsdir; - int error, fhiszero, i, j, mirrorcnt; + int done, error, fhiszero, gotone, i, j, mirrorcnt; *mirrorcntp = 1; fhiszero = 0; @@ -4209,6 +4209,7 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char buflen != sizeof(*pf) * mirrorcnt)) error = ENOATTR; pf = (struct pnfsdsfile *)buf; + gotone = 0; for (i = 0; i < mirrorcnt && error == 0; i++, pf++) { sad = (struct sockaddr *)&pf->dsf_sin; dsdir = pf->dsf_dir; @@ -4220,8 +4221,21 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char if (NFSBCMP(&zerofh, &pf->dsf_fh, sizeof(zerofh)) == 0) fhiszero = 1; /* Use the socket address to find the mount point. */ + done = 0; NFSDDSLOCK(); TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) { + TAILQ_FOREACH(mds, &ds->nfsdev_mirrors, + nfsdev_list) { + dvp = mds->nfsdev_dvp; + nmp = VFSTONFS(dvp->v_mount); + if (nfsaddr2_match(sad, nmp->nm_nam)) { + ds = mds; + done = 1; + break; + } + } + if (done != 0) + break; dvp = ds->nfsdev_dvp; nmp = VFSTONFS(dvp->v_mount); if (nfsaddr2_match(sad, nmp->nm_nam)) @@ -4229,6 +4243,7 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char } NFSDDSUNLOCK(); if (ds != NULL) { + gotone = 1; if (dvpp != NULL || fhiszero != 0) { dvp = ds->nfsdev_dsdir[dsdir]; error = vn_lock(dvp, lktype); @@ -4251,26 +4266,30 @@ nfsrv_dsgetsockmnt(struct vnode *vp, int lktype, char NFSX_V4DEVICEID); devid += NFSX_V4DEVICEID; } - } else - error = ENOENT; - } - if (error == 0) { - if (dvpp != NULL) { - *tdvpp++ = dvp; - *nmpp++ = nmp; + if (error == 0) { + if (dvpp != NULL) { + *tdvpp++ = dvp; + *nmpp++ = nmp; + } + if (fhp != NULL) + NFSBCOPY(&pf->dsf_fh, fhp++, + NFSX_MYFH); + if (fnamep != NULL && i == 0) + strlcpy(fnamep, + pf->dsf_filename, + sizeof(pf->dsf_filename)); + } else + NFSD_DEBUG(4, "nfsrv_dsgetsockmnt " + "err=%d\n", error); } - if (fhp != NULL) - NFSBCOPY(&pf->dsf_fh, fhp++, NFSX_MYFH); - if (fnamep != NULL && i == 0) - strlcpy(fnamep, pf->dsf_filename, - sizeof(pf->dsf_filename)); - } else - NFSD_DEBUG(4, "nfsrv_dsgetsockmnt err=%d\n", error); + } } + if (error == 0 && gotone == 0) + error = ENOENT; if (error == 0) *mirrorcntp = mirrorcnt; - else if (i > 1 && dvpp != NULL) { + else if (i > 1 && dvpp != NULL && gotone != 0) { /* * If the error didn't occur on the first one and dvpp != NULL, * the one(s) prior to the failure will have locked dvp's that Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Fri Aug 18 01:19:46 2017 (r322639) +++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Fri Aug 18 01:23:54 2017 (r322640) @@ -6596,8 +6596,8 @@ int nfsrv_getdevinfo(char *devid, int layouttype, uint32_t *maxcnt, uint32_t *notify, int *devaddrlen, char **devaddr) { - struct nfsdevice *ds; - int i; + struct nfsdevice *ds, *mds; + int done, i; if (layouttype != NFSLAYOUT_NFSV4_1_FILES) return (NFSERR_UNKNLAYOUTTYPE); @@ -6607,8 +6607,19 @@ nfsrv_getdevinfo(char *devid, int layouttype, uint32_t * away, but the order changes in the list. As such, the lock only * needs to be held during the search through the list. */ + done = 0; NFSDDSLOCK(); TAILQ_FOREACH(ds, &nfsrv_devidhead, nfsdev_list) { + TAILQ_FOREACH(mds, &ds->nfsdev_mirrors, nfsdev_list) { + if (NFSBCMP(devid, mds->nfsdev_deviceid, + NFSX_V4DEVICEID) == 0) { + ds = mds; + done = 1; + break; + } + } + if (done != 0) + break; if (NFSBCMP(devid, ds->nfsdev_deviceid, NFSX_V4DEVICEID) == 0) break; }