svn commit: r332795 - projects/pnfs-planb-server/sys/fs/nfs
Rick Macklem
rmacklem at FreeBSD.org
Thu Apr 19 21:05:24 UTC 2018
Author: rmacklem
Date: Thu Apr 19 21:05:23 2018
New Revision: 332795
URL: https://svnweb.freebsd.org/changeset/base/332795
Log:
Update the first two files for mirrored recovery.
Modified:
projects/pnfs-planb-server/sys/fs/nfs/nfs.h
projects/pnfs-planb-server/sys/fs/nfs/nfs_commonkrpc.c
Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs.h
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs.h Thu Apr 19 20:58:09 2018 (r332794)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs.h Thu Apr 19 21:05:23 2018 (r332795)
@@ -200,6 +200,16 @@ struct nfsd_nfsd_args {
#define NFSDEV_MAXMIRRORS 4
#define NFSDEV_MAXVERS 4
+struct nfsd_pnfsd_args {
+ int op; /* Which pNFSd op to perform. */
+ char *mdspath; /* Path of MDS file. */
+ char *dspath; /* Path of recovered DS mounted on dir. */
+ char *curdspath; /* Path of current DS mounted on dir. */
+};
+
+#define PNFSDOP_DELDSSERVER 1
+#define PNFSDOP_COPYMR 2
+
/* Old version. */
struct nfsd_nfsd_oargs {
const char *principal; /* GSS-API service principal name */
Modified: projects/pnfs-planb-server/sys/fs/nfs/nfs_commonkrpc.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfs/nfs_commonkrpc.c Thu Apr 19 20:58:09 2018 (r332794)
+++ projects/pnfs-planb-server/sys/fs/nfs/nfs_commonkrpc.c Thu Apr 19 21:05:23 2018 (r332795)
@@ -157,6 +157,9 @@ static int nfsv2_procid[NFS_V3NPROCS] = {
/*
* Initialize sockets and congestion for a new NFS connection.
* We do not free the sockaddr if error.
+ * Which arguments are set to NULL indicate what kind of call it is.
+ * cred == NULL --> a call to connect to a pNFS DS
+ * nmp == NULL --> indicates an upcall to userland or a NFSv4.0 callback
*/
int
newnfs_connect(struct nfsmount *nmp, struct nfssockreq *nrp,
@@ -293,24 +296,38 @@ newnfs_connect(struct nfsmount *nmp, struct nfssockreq
retries = nmp->nm_retry;
} else
retries = INT_MAX;
- /* cred == NULL for DS connects. */
- if (NFSHASNFSV4N(nmp) && cred != NULL) {
- /*
- * Make sure the nfscbd_pool doesn't get destroyed
- * while doing this.
- */
- NFSD_LOCK();
- if (nfs_numnfscbd > 0) {
- nfs_numnfscbd++;
- NFSD_UNLOCK();
- xprt = svc_vc_create_backchannel(nfscbd_pool);
- CLNT_CONTROL(client, CLSET_BACKCHANNEL, xprt);
+ if (NFSHASNFSV4N(nmp)) {
+ if (cred != NULL) {
+ /*
+ * Make sure the nfscbd_pool doesn't get
+ * destroyed while doing this.
+ */
NFSD_LOCK();
- nfs_numnfscbd--;
- if (nfs_numnfscbd == 0)
- wakeup(&nfs_numnfscbd);
+ if (nfs_numnfscbd > 0) {
+ nfs_numnfscbd++;
+ NFSD_UNLOCK();
+ xprt = svc_vc_create_backchannel(
+ nfscbd_pool);
+ CLNT_CONTROL(client, CLSET_BACKCHANNEL,
+ xprt);
+ NFSD_LOCK();
+ nfs_numnfscbd--;
+ if (nfs_numnfscbd == 0)
+ wakeup(&nfs_numnfscbd);
+ }
+ NFSD_UNLOCK();
+ } else {
+ /*
+ * cred == NULL for a DS connect.
+ * For connects to a DS, set a retry limit
+ * so that failed DSs will be detected.
+ * This is ok for NFSv4.1, since a DS does
+ * not maintain open/lock state and is the
+ * only case where using a "soft" mount is
+ * recommended for NFSv4.
+ */
+ retries = 2;
}
- NFSD_UNLOCK();
}
} else {
/*
@@ -493,7 +510,7 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmo
uint32_t retseq, retval, slotseq, *tl;
time_t waituntil;
int i = 0, j = 0, opcnt, set_sigset = 0, slot;
- int error = 0, usegssname = 0, secflavour = AUTH_SYS;
+ int error = 0, usegssname = 0, secflavour = AUTH_SYS, trycnt;
int freeslot, maxslot, reterr, slotpos, timeo;
u_int16_t procnum;
u_int trylater_delay = 1;
@@ -702,6 +719,7 @@ newnfs_request(struct nfsrv_descript *nd, struct nfsmo
}
#endif
}
+ trycnt = 0;
freeslot = -1; /* Set to slot that needs to be free'd */
tryagain:
slot = -1; /* Slot that needs a sequence# increment. */
@@ -762,6 +780,7 @@ tryagain:
else
stat = CLNT_CALL_MBUF(nrp->nr_client, &ext, procnum,
nd->nd_mreq, &nd->nd_mrep, timo);
+ NFSCL_DEBUG(2, "clnt call=%d\n", stat);
if (rep != NULL) {
/*
@@ -789,6 +808,10 @@ tryagain:
error = EPROTONOSUPPORT;
} else if (stat == RPC_INTR) {
error = EINTR;
+ } else if (stat == RPC_CANTSEND || stat == RPC_CANTRECV ||
+ stat == RPC_SYSTEMERROR) {
+ NFSINCRGLOBAL(nfsstatsv1.rpcinvalid);
+ error = ENXIO;
} else {
NFSINCRGLOBAL(nfsstatsv1.rpcinvalid);
error = EACCES;
More information about the svn-src-projects
mailing list