svn commit: r332862 - in projects/pnfs-planb-server/sys/fs: nfs nfsclient
Rick Macklem
rmacklem at FreeBSD.org
Sat Apr 21 19:54:07 UTC 2018
Author: rmacklem
Date: Sat Apr 21 19:54:06 2018
New Revision: 332862
URL: https://svnweb.freebsd.org/changeset/base/332862
Log:
Add NFSv4.1 client support for Flexible File Layout callbacks and the
generation of Ioerr stats for the LayoutReturn reply.
These changes are needed by the client to do testing of the mirrored
pNFS server configuration.
Modified:
projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
projects/pnfs-planb-server/sys/fs/nfs/nfsclstate.h
projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clport.c
projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clstate.c
projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clvfsops.c
Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h Sat Apr 21 18:43:09 2018 (r332861)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_var.h Sat Apr 21 19:54:06 2018 (r332862)
@@ -525,7 +525,7 @@ int nfsrpc_layoutcommit(struct nfsmount *, uint8_t *,
NFSPROC_T *, void *);
int nfsrpc_layoutreturn(struct nfsmount *, uint8_t *, int, int, int, uint32_t,
int, uint64_t, uint64_t, nfsv4stateid_t *, struct ucred *, NFSPROC_T *,
- void *);
+ uint32_t, uint32_t, char *);
int nfsrpc_reclaimcomplete(struct nfsmount *, struct ucred *, NFSPROC_T *);
int nfscl_doiods(vnode_t, struct uio *, int *, int *, uint32_t, int,
struct ucred *, NFSPROC_T *);
@@ -598,6 +598,7 @@ int nfscl_layout(struct nfsmount *, vnode_t, u_int8_t
NFSPROC_T *);
struct nfscllayout *nfscl_getlayout(struct nfsclclient *, uint8_t *, int,
uint64_t, struct nfsclflayout **, int *);
+void nfscl_dserr(uint32_t, struct nfscldevinfo *, struct nfscllayout *);
void nfscl_rellayout(struct nfscllayout *, int);
struct nfscldevinfo *nfscl_getdevinfo(struct nfsclclient *, uint8_t *,
struct nfscldevinfo *);
Modified: projects/pnfs-planb-server/sys/fs/nfs/nfsclstate.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfsclstate.h Sat Apr 21 18:43:09 2018 (r332861)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfsclstate.h Sat Apr 21 19:54:06 2018 (r332862)
@@ -340,6 +340,9 @@ struct nfsclrecalllayout {
int nfsrecly_recalltype;
uint32_t nfsrecly_iomode;
uint32_t nfsrecly_stateseqid;
+ uint32_t nfsrecly_stat;
+ uint32_t nfsrecly_op;
+ char nfsrecly_devid[NFSX_V4DEVICEID];
};
/*
Modified: projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clport.c Sat Apr 21 18:43:09 2018 (r332861)
+++ projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clport.c Sat Apr 21 19:54:06 2018 (r332862)
@@ -86,6 +86,7 @@ extern int nfs_numnfscbd;
extern int nfscl_inited;
struct mtx ncl_iod_mutex;
NFSDLOCKMUTEX;
+extern struct mtx nfsrv_dslock_mtx;
extern void (*ncl_call_invalcaches)(struct vnode *);
@@ -1383,6 +1384,14 @@ nfssvc_nfscl(struct thread *td, struct nfssvc_args *ua
0 && strcmp(mp->mnt_stat.f_fstypename,
"nfs") == 0 && mp->mnt_data != NULL) {
nmp = VFSTONFS(mp);
+ NFSDDSLOCK();
+ if (nfsv4_findmirror(nmp, NULL) != NULL
+ ) {
+ NFSDDSUNLOCK();
+ error = ENXIO;
+ nmp = NULL;
+ break;
+ }
mtx_lock(&nmp->nm_mtx);
if ((nmp->nm_privflag &
NFSMNTP_FORCEDISM) == 0) {
@@ -1391,9 +1400,10 @@ nfssvc_nfscl(struct thread *td, struct nfssvc_args *ua
NFSMNTP_CANCELRPCS);
mtx_unlock(&nmp->nm_mtx);
} else {
- nmp = NULL;
mtx_unlock(&nmp->nm_mtx);
+ nmp = NULL;
}
+ NFSDDSUNLOCK();
break;
}
}
@@ -1418,7 +1428,7 @@ nfssvc_nfscl(struct thread *td, struct nfssvc_args *ua
nmp->nm_privflag &= ~NFSMNTP_CANCELRPCS;
wakeup(nmp);
mtx_unlock(&nmp->nm_mtx);
- } else
+ } else if (error == 0)
error = EINVAL;
}
free(buf, M_TEMP);
Modified: projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clstate.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clstate.c Sat Apr 21 18:43:09 2018 (r332861)
+++ projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clstate.c Sat Apr 21 19:54:06 2018 (r332862)
@@ -164,7 +164,7 @@ static void nfscl_emptylockowner(struct nfscllockowner
static void nfscl_mergeflayouts(struct nfsclflayouthead *,
struct nfsclflayouthead *);
static int nfscl_layoutrecall(int, struct nfscllayout *, uint32_t, uint64_t,
- uint64_t, uint32_t, struct nfsclrecalllayout *);
+ uint64_t, uint32_t, uint32_t, uint32_t, char *, struct nfsclrecalllayout *);
static int nfscl_seq(uint32_t, uint32_t);
static void nfscl_layoutreturn(struct nfsmount *, struct nfscllayout *,
struct ucred *, NFSPROC_T *);
@@ -2762,7 +2762,8 @@ tryagain2:
break;
(void)nfscl_layoutrecall(NFSLAYOUTRETURN_FILE,
lyp, NFSLAYOUTIOMODE_ANY, 0, UINT64_MAX,
- lyp->nfsly_stateid.seqid, recallp);
+ lyp->nfsly_stateid.seqid, 0, 0, NULL,
+ recallp);
}
lyp = nlyp;
}
@@ -3422,9 +3423,12 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
else
changed = 0;
recalltype = fxdr_unsigned(int, *tl);
+ NFSCL_DEBUG(4, "layt=%d iom=%d ch=%d rectyp=%d\n",
+ laytype, iomode, changed, recalltype);
recallp = malloc(sizeof(*recallp), M_NFSLAYRECALL,
M_WAITOK);
- if (laytype != NFSLAYOUT_NFSV4_1_FILES)
+ if (laytype != NFSLAYOUT_NFSV4_1_FILES &&
+ laytype != NFSLAYOUT_FLEXFILE)
error = NFSERR_NOMATCHLAYOUT;
else if (recalltype == NFSLAYOUTRETURN_FILE) {
error = nfsm_getfh(nd, &nfhp);
@@ -3441,6 +3445,9 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
error = NFSERR_NOTSUPP;
else if (i == 0)
error = NFSERR_OPNOTINSESS;
+ NFSCL_DEBUG(4, "off=%ju len=%ju sq=%u err=%d\n",
+ (uintmax_t)off, (uintmax_t)len,
+ stateid.seqid, error);
if (error == 0) {
NFSLOCKCLSTATE();
clp = nfscl_getclntsess(sessionid);
@@ -3453,7 +3460,8 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
lyp);
if (lyp != NULL &&
(lyp->nfsly_flags &
- NFSLY_FILES) != 0 &&
+ (NFSLY_FILES |
+ NFSLY_FLEXFILE)) != 0 &&
!NFSBCMP(stateid.other,
lyp->nfsly_stateid.other,
NFSX_STATEIDOTHER)) {
@@ -3462,6 +3470,7 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
recalltype,
lyp, iomode, off,
len, stateid.seqid,
+ 0, 0, NULL,
recallp);
recallp = NULL;
wakeup(clp);
@@ -3496,6 +3505,7 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
lyp, iomode, 0,
UINT64_MAX,
lyp->nfsly_stateid.seqid,
+ 0, 0, NULL,
recallp);
recallp = NULL;
gotone = 1;
@@ -3519,7 +3529,7 @@ nfscl_docb(struct nfsrv_descript *nd, NFSPROC_T *p)
recalltype, lyp, iomode, 0,
UINT64_MAX,
lyp->nfsly_stateid.seqid,
- recallp);
+ 0, 0, NULL, recallp);
recallp = NULL;
gotone = 1;
}
@@ -4952,13 +4962,42 @@ nfscl_retoncloselayout(vnode_t vp, struct nfsclclient
if (!LIST_EMPTY(&lyp->nfsly_flayrw))
iomode |= NFSLAYOUTIOMODE_RW;
(void)nfscl_layoutrecall(NFSLAYOUTRETURN_FILE, lyp, iomode,
- 0, UINT64_MAX, lyp->nfsly_stateid.seqid, *recallpp);
+ 0, UINT64_MAX, lyp->nfsly_stateid.seqid, 0, 0, NULL,
+ *recallpp);
NFSCL_DEBUG(4, "retoncls recall iomode=%d\n", iomode);
*recallpp = NULL;
}
}
/*
+ * Mark the layout to be recalled and with an error.
+ */
+void
+nfscl_dserr(uint32_t op, struct nfscldevinfo *dp, struct nfscllayout *lyp)
+{
+ struct nfsclrecalllayout *recallp;
+ uint32_t iomode;
+
+ recallp = malloc(sizeof(*recallp), M_NFSLAYRECALL, M_WAITOK);
+ iomode = 0;
+ NFSLOCKCLSTATE();
+ if ((lyp->nfsly_flags & NFSLY_RECALL) == 0) {
+ if (!LIST_EMPTY(&lyp->nfsly_flayread))
+ iomode |= NFSLAYOUTIOMODE_READ;
+ if (!LIST_EMPTY(&lyp->nfsly_flayrw))
+ iomode |= NFSLAYOUTIOMODE_RW;
+ (void)nfscl_layoutrecall(NFSLAYOUTRETURN_FILE, lyp, iomode,
+ 0, UINT64_MAX, lyp->nfsly_stateid.seqid, NFSERR_IO, op,
+ dp->nfsdi_deviceid, recallp);
+ NFSUNLOCKCLSTATE();
+ NFSCL_DEBUG(4, "retoncls recall iomode=%d\n", iomode);
+ } else {
+ NFSUNLOCKCLSTATE();
+ free(recallp, M_NFSLAYRECALL);
+ }
+}
+
+/*
* Dereference a layout.
*/
void
@@ -5175,8 +5214,8 @@ nfscl_freedevinfo(struct nfscldevinfo *dip)
*/
static int
nfscl_layoutrecall(int recalltype, struct nfscllayout *lyp, uint32_t iomode,
- uint64_t off, uint64_t len, uint32_t stateseqid,
- struct nfsclrecalllayout *recallp)
+ uint64_t off, uint64_t len, uint32_t stateseqid, uint32_t stat, uint32_t op,
+ char *devid, struct nfsclrecalllayout *recallp)
{
struct nfsclrecalllayout *rp, *orp;
@@ -5185,6 +5224,10 @@ nfscl_layoutrecall(int recalltype, struct nfscllayout
recallp->nfsrecly_stateseqid = stateseqid;
recallp->nfsrecly_off = off;
recallp->nfsrecly_len = len;
+ recallp->nfsrecly_stat = stat;
+ recallp->nfsrecly_op = op;
+ if (devid != NULL)
+ NFSBCOPY(devid, recallp->nfsrecly_devid, NFSX_V4DEVICEID);
/*
* Order the list as file returns first, followed by fsid and any
* returns, both in increasing stateseqid order.
@@ -5259,7 +5302,8 @@ nfscl_layoutreturn(struct nfsmount *nmp, struct nfscll
lyp->nfsly_fhlen, 0, layouttype,
rp->nfsrecly_iomode, rp->nfsrecly_recalltype,
rp->nfsrecly_off, rp->nfsrecly_len,
- &stateid, cred, p, NULL);
+ &stateid, cred, p, rp->nfsrecly_stat, rp->nfsrecly_op,
+ rp->nfsrecly_devid);
}
}
Modified: projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clvfsops.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clvfsops.c Sat Apr 21 18:43:09 2018 (r332861)
+++ projects/pnfs-planb-server/sys/fs/nfsclient/nfs_clvfsops.c Sat Apr 21 19:54:06 2018 (r332862)
@@ -86,6 +86,7 @@ extern enum nfsiod_state ncl_iodwant[NFS_MAXASYNCDAEMO
extern struct nfsmount *ncl_iodmount[NFS_MAXASYNCDAEMON];
extern struct mtx ncl_iod_mutex;
NFSCLSTATEMUTEX;
+extern struct mtx nfsrv_dslock_mtx;
MALLOC_DEFINE(M_NEWNFSREQ, "newnfsclient_req", "NFS request header");
MALLOC_DEFINE(M_NEWNFSMNT, "newnfsmnt", "NFS mount struct");
@@ -1672,6 +1673,7 @@ nfs_unmount(struct mount *mp, int mntflags)
if (mntflags & MNT_FORCE)
flags |= FORCECLOSE;
nmp = VFSTONFS(mp);
+ error = 0;
/*
* Goes something like this..
* - Call vflush() to clear out vnodes for this filesystem
@@ -1680,6 +1682,12 @@ nfs_unmount(struct mount *mp, int mntflags)
*/
/* In the forced case, cancel any outstanding requests. */
if (mntflags & MNT_FORCE) {
+ NFSDDSLOCK();
+ if (nfsv4_findmirror(nmp, NULL) != NULL)
+ error = ENXIO;
+ NFSDDSUNLOCK();
+ if (error)
+ goto out;
error = newnfs_nmcancelreqs(nmp);
if (error)
goto out;
More information about the svn-src-projects
mailing list