svn commit: r297881 - in projects/pnfs-server/sys/fs: nfs nfsclient nfsserver
Rick Macklem
rmacklem at FreeBSD.org
Tue Apr 12 21:47:39 UTC 2016
Author: rmacklem
Date: Tue Apr 12 21:47:37 2016
New Revision: 297881
URL: https://svnweb.freebsd.org/changeset/base/297881
Log:
Put the pNFS server/client changes into the new NFS kernel directories.
More to come, before it is ready for build/test.
Modified:
projects/pnfs-server/sys/fs/nfs/nfs.h
projects/pnfs-server/sys/fs/nfs/nfs_commonsubs.c
projects/pnfs-server/sys/fs/nfs/nfs_var.h
projects/pnfs-server/sys/fs/nfs/nfscl.h
projects/pnfs-server/sys/fs/nfs/nfsclstate.h
projects/pnfs-server/sys/fs/nfs/nfsport.h
projects/pnfs-server/sys/fs/nfs/nfsproto.h
projects/pnfs-server/sys/fs/nfs/nfsrvstate.h
projects/pnfs-server/sys/fs/nfsclient/nfs_clcomsubs.c
projects/pnfs-server/sys/fs/nfsclient/nfs_clnode.c
projects/pnfs-server/sys/fs/nfsclient/nfs_clport.c
projects/pnfs-server/sys/fs/nfsclient/nfs_clrpcops.c
projects/pnfs-server/sys/fs/nfsclient/nfs_clstate.c
projects/pnfs-server/sys/fs/nfsclient/nfs_clvnops.c
projects/pnfs-server/sys/fs/nfsclient/nfsnode.h
projects/pnfs-server/sys/fs/nfsserver/nfs_nfsdkrpc.c
projects/pnfs-server/sys/fs/nfsserver/nfs_nfsdport.c
projects/pnfs-server/sys/fs/nfsserver/nfs_nfsdserv.c
projects/pnfs-server/sys/fs/nfsserver/nfs_nfsdsocket.c
projects/pnfs-server/sys/fs/nfsserver/nfs_nfsdstate.c
Modified: projects/pnfs-server/sys/fs/nfs/nfs.h
==============================================================================
--- projects/pnfs-server/sys/fs/nfs/nfs.h Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfs/nfs.h Tue Apr 12 21:47:37 2016 (r297881)
@@ -130,6 +130,9 @@
#endif
#define NFSV4_CBPORT 7745 /* Callback port for testing */
+/* This value is defined in GlusterFS as GF_NFS3_FILE_IO_SIZE_MAX. */
+#define NFSV4SRV_PNFS_MAXIO 1048576 /* Max I/O size for the DS */
+
/*
* This macro defines the high water mark for issuing V4 delegations.
* (It is currently set at a conservative 20% of nfsrv_v4statelimit. This
@@ -168,12 +171,39 @@ struct nfsd_addsock_args {
};
/*
+ * The file handle used by the pNFS Data Servers, which are actually
+ * GlusterFS servers. The userland nfsd passes in the value for the
+ * GlusterFS volume root. The only field that changes for files within the
+ * volume is the gfid field.
+ */
+struct pnfsfh {
+ char id[4]; /* Always ":OGL". */
+ char expid[16]; /* Export ID. */
+ char gfid[16]; /* Gfid. */
+ char mntid[16]; /* Mount ID. */
+};
+
+/*
* nfsd argument for new krpc.
+ * (New version supports pNFS, indicated by NFSSVC_NEWSTRUCT flag.)
*/
struct nfsd_nfsd_args {
const char *principal; /* GSS-API service principal name */
int minthreads; /* minimum service thread count */
int maxthreads; /* maximum service thread count */
+ int version; /* Allow multiple variants */
+ struct pnfsfh nfsfh; /* pNFS DS file handle */
+ char *addr; /* pNFS DS addresses */
+ int addrlen; /* Length of addrs */
+ char *dnshost; /* DNS names for DS addresses */
+ int dnshostlen; /* Length of DNS names */
+};
+
+/* Old version. */
+struct nfsd_nfsd_oargs {
+ const char *principal; /* GSS-API service principal name */
+ int minthreads; /* minimum service thread count */
+ int maxthreads; /* maximum service thread count */
};
/*
@@ -333,6 +363,7 @@ struct nfsreferral {
#define NFSLCK_WANTWDELEG 0x10000000
#define NFSLCK_WANTRDELEG 0x20000000
#define NFSLCK_WANTNODELEG 0x40000000
+#define NFSLCK_LAYOUT 0x80000000
#define NFSLCK_WANTBITS \
(NFSLCK_WANTWDELEG | NFSLCK_WANTRDELEG | NFSLCK_WANTNODELEG)
Modified: projects/pnfs-server/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- projects/pnfs-server/sys/fs/nfs/nfs_commonsubs.c Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfs/nfs_commonsubs.c Tue Apr 12 21:47:37 2016 (r297881)
@@ -71,6 +71,7 @@ int nfsd_enable_stringtouid = 0;
NFSNAMEIDMUTEX;
NFSSOCKMUTEX;
extern int nfsrv_lughashsize;
+extern int nfscl_debuglevel;
/*
* This array of structures indicates, for V4:
@@ -507,7 +508,7 @@ nfsm_fhtom(struct nfsrv_descript *nd, u_
}
(void) nfsm_strtom(nd, fhp, size);
break;
- }
+ };
return (bytesize);
}
@@ -544,7 +545,7 @@ nfsaddr_match(int family, union nethosta
}
break;
#endif
- }
+ };
return (0);
}
@@ -581,7 +582,7 @@ nfsaddr2_match(NFSSOCKADDR_T nam1, NFSSO
}
break;
#endif
- }
+ };
return (0);
}
@@ -1203,7 +1204,8 @@ nfsv4_loadattr(struct nfsrv_descript *nd
}
} else if (nap != NULL) {
if (*tl++)
- printf("NFSv4 fileid > 32bits\n");
+ NFSCL_DEBUG(1,
+ "NFSv4 fileid > 32bits\n");
nap->na_fileid = thyp;
}
attrsum += NFSX_HYPER;
@@ -1741,7 +1743,8 @@ nfsv4_loadattr(struct nfsrv_descript *nd
}
} else if (nap != NULL) {
if (*tl++)
- printf("NFSv4 mounted on fileid > 32bits\n");
+ NFSCL_DEBUG(1,
+ "NFSv4 mounted on fileid > 32bits\n");
nap->na_mntonfileno = thyp;
}
attrsum += NFSX_HYPER;
@@ -1774,7 +1777,7 @@ nfsv4_loadattr(struct nfsrv_descript *nd
*/
bitpos = NFSATTRBIT_MAX;
break;
- }
+ };
}
/*
@@ -2508,7 +2511,7 @@ nfsv4_fillattr(struct nfsrv_descript *nd
break;
default:
printf("EEK! Bad V4 attribute bitpos=%d\n", bitpos);
- }
+ };
}
}
if (naclp != NULL)
@@ -3916,122 +3919,6 @@ newnfs_sndunlock(int *flagp)
NFSUNLOCKSOCK();
}
-APPLESTATIC int
-nfsv4_getipaddr(struct nfsrv_descript *nd, struct sockaddr_storage *sa,
- int *isudp)
-{
- struct sockaddr_in *sad;
- struct sockaddr_in6 *sad6;
- struct in_addr saddr;
- uint32_t portnum, *tl;
- int af = 0, i, j, k;
- char addr[64], protocol[5], *cp;
- int cantparse = 0, error = 0;
- uint16_t portv;
-
- NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
- i = fxdr_unsigned(int, *tl);
- if (i >= 3 && i <= 4) {
- error = nfsrv_mtostr(nd, protocol, i);
- if (error)
- goto nfsmout;
- if (strcmp(protocol, "tcp") == 0) {
- af = AF_INET;
- *isudp = 0;
- } else if (strcmp(protocol, "udp") == 0) {
- af = AF_INET;
- *isudp = 1;
- } else if (strcmp(protocol, "tcp6") == 0) {
- af = AF_INET6;
- *isudp = 0;
- } else if (strcmp(protocol, "udp6") == 0) {
- af = AF_INET6;
- *isudp = 1;
- } else
- cantparse = 1;
- } else {
- cantparse = 1;
- if (i > 0) {
- error = nfsm_advance(nd, NFSM_RNDUP(i), -1);
- if (error)
- goto nfsmout;
- }
- }
- NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
- i = fxdr_unsigned(int, *tl);
- if (i < 0) {
- error = NFSERR_BADXDR;
- goto nfsmout;
- } else if (cantparse == 0 && i >= 11 && i < 64) {
- /*
- * The shortest address is 11chars and the longest is < 64.
- */
- error = nfsrv_mtostr(nd, addr, i);
- if (error)
- goto nfsmout;
-
- /* Find the port# at the end and extract that. */
- i = strlen(addr);
- k = 0;
- cp = &addr[i - 1];
- /* Count back two '.'s from end to get port# field. */
- for (j = 0; j < i; j++) {
- if (*cp == '.') {
- k++;
- if (k == 2)
- break;
- }
- cp--;
- }
- if (k == 2) {
- /*
- * The NFSv4 port# is appended as .N.N, where N is
- * a decimal # in the range 0-255, just like an inet4
- * address. Cheat and use inet_aton(), which will
- * return a Class A address and then shift the high
- * order 8bits over to convert it to the port#.
- */
- *cp++ = '\0';
- if (inet_aton(cp, &saddr) == 1) {
- portnum = ntohl(saddr.s_addr);
- portv = (uint16_t)((portnum >> 16) |
- (portnum & 0xff));
- } else
- cantparse = 1;
- } else
- cantparse = 1;
- if (cantparse == 0) {
- if (af == AF_INET) {
- sad = (struct sockaddr_in *)sa;
- if (inet_pton(af, addr, &sad->sin_addr) == 1) {
- sad->sin_len = sizeof(*sad);
- sad->sin_family = AF_INET;
- sad->sin_port = htons(portv);
- return (0);
- }
- } else {
- sad6 = (struct sockaddr_in6 *)sa;
- if (inet_pton(af, addr, &sad6->sin6_addr)
- == 1) {
- sad6->sin6_len = sizeof(*sad6);
- sad6->sin6_family = AF_INET6;
- sad6->sin6_port = htons(portv);
- return (0);
- }
- }
- }
- } else {
- if (i > 0) {
- error = nfsm_advance(nd, NFSM_RNDUP(i), -1);
- if (error)
- goto nfsmout;
- }
- }
- error = EPERM;
-nfsmout:
- return (error);
-}
-
/*
* Handle an NFSv4.1 Sequence request for the session.
* If reply != NULL, use it to return the cached reply, as required.
Modified: projects/pnfs-server/sys/fs/nfs/nfs_var.h
==============================================================================
--- projects/pnfs-server/sys/fs/nfs/nfs_var.h Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfs/nfs_var.h Tue Apr 12 21:47:37 2016 (r297881)
@@ -136,6 +136,15 @@ int nfsrv_checksequence(struct nfsrv_des
int nfsrv_checkreclaimcomplete(struct nfsrv_descript *);
void nfsrv_cache_session(uint8_t *, uint32_t, int, struct mbuf **);
void nfsrv_freeallbackchannel_xprts(void);
+int nfsrv_layoutget(struct nfsrv_descript *, vnode_t, struct nfsexstuff *,
+ int, int *, uint64_t *, uint64_t *, uint64_t, nfsv4stateid_t *, int, int *,
+ int *, char *, struct ucred *, NFSPROC_T *);
+int nfsrv_layoutreturn(struct nfsrv_descript *, vnode_t, int, int, uint64_t,
+ uint64_t, int, int, nfsv4stateid_t *, int, char *, int *, struct ucred *,
+ NFSPROC_T *);
+int nfsrv_getdevinfo(char *, int, int *, uint32_t *, int *, char **);
+void nfsrv_freealllayoutsanddevids(void);
+void nfsrv_createdevids(struct nfsd_nfsd_args *);
/* nfs_nfsdserv.c */
int nfsrvd_access(struct nfsrv_descript *, int,
@@ -234,8 +243,16 @@ int nfsrvd_destroysession(struct nfsrv_d
vnode_t, NFSPROC_T *, struct nfsexstuff *);
int nfsrvd_freestateid(struct nfsrv_descript *, int,
vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_getdevinfo(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_layoutget(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_layoutreturn(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
int nfsrvd_notsupp(struct nfsrv_descript *, int,
vnode_t, NFSPROC_T *, struct nfsexstuff *);
+int nfsrvd_notsuppvp(struct nfsrv_descript *, int,
+ vnode_t, NFSPROC_T *, struct nfsexstuff *);
/* nfs_nfsdsocket.c */
void nfsrvd_rephead(struct nfsrv_descript *);
@@ -287,8 +304,6 @@ void nfsrv_cleanusergroup(void);
int nfsrv_checkutf8(u_int8_t *, int);
int newnfs_sndlock(int *);
void newnfs_sndunlock(int *);
-int nfsv4_getipaddr(struct nfsrv_descript *, struct sockaddr_storage *,
- int *);
int nfsv4_seqsession(uint32_t, uint32_t, uint32_t, struct nfsslot *,
struct mbuf **, uint16_t);
void nfsv4_seqsess_cacherep(uint32_t, struct nfsslot *, int, struct mbuf **);
@@ -302,11 +317,11 @@ struct ucred *nfsrv_getgrpscred(struct u
/* nfs_clcomsubs.c */
void nfsm_uiombuf(struct nfsrv_descript *, struct uio *, int);
void nfscl_reqstart(struct nfsrv_descript *, int, struct nfsmount *,
- u_int8_t *, int, u_int32_t **, struct nfsclsession *);
+ u_int8_t *, int, u_int32_t **, struct nfsclsession *, int, int);
nfsuint64 *nfscl_getcookie(struct nfsnode *, off_t off, int);
void nfscl_fillsattr(struct nfsrv_descript *, struct vattr *,
vnode_t, int, u_int32_t);
-u_int8_t *nfscl_getmyip(struct nfsmount *, struct in6_addr *, int *);
+u_int8_t *nfscl_getmyip(struct nfsmount *, int *);
int nfsm_getfh(struct nfsrv_descript *, struct nfsfh **);
int nfscl_mtofh(struct nfsrv_descript *, struct nfsfh **,
struct nfsvattr *, int *);
@@ -481,8 +496,6 @@ int nfsrpc_destroyclient(struct nfsmount
int nfsrpc_layoutget(struct nfsmount *, uint8_t *, int, int, uint64_t, uint64_t,
uint64_t, int, nfsv4stateid_t *, int *, struct nfsclflayouthead *,
struct ucred *, NFSPROC_T *, void *);
-int nfsrpc_getdeviceinfo(struct nfsmount *, uint8_t *, int, uint32_t *,
- struct nfscldevinfo **, struct ucred *, NFSPROC_T *);
int nfsrpc_layoutcommit(struct nfsmount *, uint8_t *, int, int,
uint64_t, uint64_t, uint64_t, nfsv4stateid_t *, int, int, uint8_t *,
struct ucred *, NFSPROC_T *, void *);
@@ -490,8 +503,8 @@ int nfsrpc_layoutreturn(struct nfsmount
int, uint64_t, uint64_t, nfsv4stateid_t *, int, uint32_t *, struct ucred *,
NFSPROC_T *, void *);
int nfsrpc_reclaimcomplete(struct nfsmount *, struct ucred *, NFSPROC_T *);
-int nfscl_doiods(vnode_t, struct uio *, int *, int *, uint32_t,
- struct ucred *, NFSPROC_T *);
+int nfscl_doiods(vnode_t, struct uio *, int *, int *, uint32_t, int,
+ struct ucred *, NFSPROC_T *, struct nfsvattr *, int *);
int nfscl_findlayoutforio(struct nfscllayout *, uint64_t, uint32_t,
struct nfsclflayout **);
void nfscl_freenfsclds(struct nfsclds *);
Modified: projects/pnfs-server/sys/fs/nfs/nfscl.h
==============================================================================
--- projects/pnfs-server/sys/fs/nfs/nfscl.h Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfs/nfscl.h Tue Apr 12 21:47:37 2016 (r297881)
@@ -49,7 +49,8 @@ struct nfsv4node {
*/
#define NFSCL_REQSTART(n, p, v) \
nfscl_reqstart((n), (p), VFSTONFS((v)->v_mount), \
- VTONFS(v)->n_fhp->nfh_fh, VTONFS(v)->n_fhp->nfh_len, NULL, NULL)
+ VTONFS(v)->n_fhp->nfh_fh, VTONFS(v)->n_fhp->nfh_len, NULL, \
+ NULL, 0, 0)
/*
* These two macros convert between a lease duration and renew interval.
Modified: projects/pnfs-server/sys/fs/nfs/nfsclstate.h
==============================================================================
--- projects/pnfs-server/sys/fs/nfs/nfsclstate.h Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfs/nfsclstate.h Tue Apr 12 21:47:37 2016 (r297881)
@@ -70,6 +70,7 @@ struct nfsclsession {
/*
* This structure holds the session, clientid and related information
* needed for an NFSv4.1 Meta Data Server (MDS) or Data Server (DS).
+ * If NFSCLDS_V3CONN is set, it holds the connection for an NFSv3 DS.
* It is malloc'd to the correct length.
*/
struct nfsclds {
@@ -90,6 +91,7 @@ struct nfsclds {
#define NFSCLDS_HASWRITEVERF 0x0001
#define NFSCLDS_MDS 0x0002
#define NFSCLDS_DS 0x0004
+#define NFSCLDS_V3CONN 0x0008
struct nfsclclient {
LIST_ENTRY(nfsclclient) nfsc_list;
@@ -257,6 +259,18 @@ struct nfscllayout {
#define NFSLY_RECALLALL 0x0040
#define NFSLY_RETONCLOSE 0x0080
#define NFSLY_WRITTEN 0x0100 /* Has been used to write to a DS. */
+#define NFSLY_FLEXFILE 0x0200
+
+/*
+ * Flex Files Data Server structures.
+ */
+struct nfsffds {
+ uint32_t nfsffds_efficiency;
+ nfsv4stateid_t nfsffds_stateid;
+ uid_t nfsffds_uid;
+ gid_t nfsffds_gid;
+ struct nfsfh *nfsffds_fh[4];
+};
/*
* MALLOC'd to the correct length to accommodate the file handle list.
@@ -270,20 +284,46 @@ struct nfsclflayout {
uint8_t nfsfl_dev[NFSX_V4DEVICEID];
uint64_t nfsfl_off;
uint64_t nfsfl_end;
- uint64_t nfsfl_patoff;
struct nfscldevinfo *nfsfl_devp;
uint32_t nfsfl_iomode;
- uint32_t nfsfl_util;
- uint32_t nfsfl_stripe1;
uint16_t nfsfl_flags;
- uint16_t nfsfl_fhcnt;
- struct nfsfh *nfsfl_fh[1]; /* FH list for DS */
-};
+ uint16_t nfsfl_cnt;
+ union {
+ struct {
+ uint8_t dev[NFSX_V4DEVICEID];
+ uint64_t patoff;
+ uint32_t util;
+ uint32_t stripe1;
+ struct nfsfh *fh[1];
+ } nfsfl_unfl;
+ struct {
+ uint64_t stripeunit;
+ uint32_t stripecnt;
+ uint32_t fflags;
+ struct nfsffds ds;
+ } nfsfl_unff;
+ };
+};
+
+#define nfsfl_fhcnt nfsfl_cnt
+#define nfsfl_patoff nfsfl_unfl.patoff
+#define nfsfl_util nfsfl_unfl.util
+#define nfsfl_stripe1 nfsfl_unfl.stripe1
+#define nfsfl_fh nfsfl_unfl.fh
+#define nfsfl_stripeunit nfsfl_unff.stripeunit
+#define nfsfl_stripecnt nfsfl_unff.stripecnt
+#define nfsfl_fflags nfsfl_unff.fflags
+#define nfsfl_ffdsefficiency nfsfl_unff.ds.nfsffds_efficiency
+#define nfsfl_ffdsstateid nfsfl_unff.ds.nfsffds_stateid
+#define nfsfl_ffdsuid nfsfl_unff.ds.nfsffds_uid
+#define nfsfl_ffdsgid nfsfl_unff.ds.nfsffds_gid
+#define nfsfl_ffdsfh nfsfl_unff.ds.nfsffds_fh
/*
* Flags for nfsfl_flags.
*/
#define NFSFL_RECALL 0x0001 /* File layout has been recalled */
+#define NFSFL_FLEXFILE 0x0002 /* Flex Files layout */
/*
* Structure that is used to store a LAYOUTRECALL.
@@ -298,25 +338,46 @@ struct nfsclrecalllayout {
};
/*
+ * Structure for the Flex Files layout versions.
+ */
+struct nfsffvers {
+ uint32_t vers;
+ uint32_t minorvers;
+ uint32_t rsize;
+ uint32_t wsize;
+ uint32_t tightlycoupled;
+};
+
+/*
* Stores the NFSv4.1 Device Info. Malloc'd to the correct length to
* store the list of network connections and list of indices.
* nfsdi_data[] is allocated the following way:
- * - nfsdi_addrcnt * struct nfsclds
+ * - nfsdi_addrcnt * struct nfsclds ptrs
+ * For NFSv4.1 Files Layout:
* - stripe indices, each stored as one byte, since there can be many
* of them. (This implies a limit of 256 on nfsdi_addrcnt, since the
* indices select which address.)
+ * We currently only support 4 Flex Files versions. (That covers us up to
+ * NFSv4.2.)
*/
struct nfscldevinfo {
LIST_ENTRY(nfscldevinfo) nfsdi_list;
+ struct nfsffvers nfsdi_ffvers[4];
uint8_t nfsdi_deviceid[NFSX_V4DEVICEID];
struct nfsclclient *nfsdi_clp;
uint32_t nfsdi_refcnt;
uint32_t nfsdi_layoutrefs;
- uint16_t nfsdi_stripecnt;
+ union {
+ uint16_t stripecnt;
+ uint16_t verspos;
+ } nfsdi_un;
uint16_t nfsdi_addrcnt;
struct nfsclds *nfsdi_data[0];
};
+#define nfsdi_stripecnt nfsdi_un.stripecnt
+#define nfsdi_verspos nfsdi_un.verspos
+
/* These inline functions return values from nfsdi_data[]. */
/*
* Return a pointer to the address at "pos".
Modified: projects/pnfs-server/sys/fs/nfs/nfsport.h
==============================================================================
--- projects/pnfs-server/sys/fs/nfs/nfsport.h Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfs/nfsport.h Tue Apr 12 21:47:37 2016 (r297881)
@@ -833,6 +833,7 @@ int newnfs_realign(struct mbuf **, int);
*/
#define NFSSTA_HASWRITEVERF 0x00040000 /* Has write verifier */
#define NFSSTA_GOTFSINFO 0x00100000 /* Got the fsinfo */
+#define NFSSTA_PNFSFLEXFILE 0x00200000 /* Use Flex File layout */
#define NFSSTA_NOLAYOUTCOMMIT 0x04000000 /* Don't do LayoutCommit */
#define NFSSTA_SESSPERSIST 0x08000000 /* Has a persistent session */
#define NFSSTA_TIMEO 0x10000000 /* Experiencing a timeout */
@@ -863,6 +864,7 @@ int newnfs_realign(struct mbuf **, int);
#define NFSHASNOLAYOUTCOMMIT(n) ((n)->nm_state & NFSSTA_NOLAYOUTCOMMIT)
#define NFSHASSESSPERSIST(n) ((n)->nm_state & NFSSTA_SESSPERSIST)
#define NFSHASPNFS(n) ((n)->nm_state & NFSSTA_PNFS)
+#define NFSHASFLEXFILE(n) ((n)->nm_state & NFSSTA_PNFSFLEXFILE)
/*
* Gets the stats field out of the mount structure.
Modified: projects/pnfs-server/sys/fs/nfs/nfsproto.h
==============================================================================
--- projects/pnfs-server/sys/fs/nfs/nfsproto.h Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfs/nfsproto.h Tue Apr 12 21:47:37 2016 (r297881)
@@ -244,13 +244,17 @@
#define NFSX_V4SETTIME (NFSX_UNSIGNED + NFSX_V4TIME)
#define NFSX_V4SESSIONID 16
#define NFSX_V4DEVICEID 16
+#define NFSX_V4PNFSFH (sizeof(struct pnfsfh))
+#define NFSX_V4FLEXFILELAYOUT (10 * NFSX_UNSIGNED + NFSX_V4DEVICEID + \
+ NFSX_HYPER + NFSX_STATEID + NFSX_V4PNFSFH)
+#define NFSX_V4MAXLAYOUT NFSX_V4FLEXFILELAYOUT
+#define NFSX_STATEIDOTHER 12
+#define NFSX_STATEID (NFSX_UNSIGNED + NFSX_STATEIDOTHER)
/* sizes common to multiple NFS versions */
#define NFSX_FHMAX (NFSX_V4FHMAX)
#define NFSX_MYFH (sizeof (fhandle_t)) /* size this server uses */
#define NFSX_VERF 8
-#define NFSX_STATEIDOTHER 12
-#define NFSX_STATEID (NFSX_UNSIGNED + NFSX_STATEIDOTHER)
#define NFSX_GSSH 12
/* variants for multiple versions */
@@ -453,6 +457,11 @@
#define NFSV4ACE_SYNCHRONIZE 0x00100000
/*
+ * Flags for layout get for Flex files layout.
+ */
+#define NFSFFLAYOUT_NO_COMMIT 0x1
+
+/*
* Here are the mappings between mode bits and acl mask bits for
* directories and other files.
* (Named attributes have not been included, since named attributes are
@@ -621,6 +630,7 @@
#define NFSLAYOUT_NFSV4_1_FILES 0x1
#define NFSLAYOUT_OSD2_OBJECTS 0x2
#define NFSLAYOUT_BLOCK_VOLUME 0x3
+#define NFSLAYOUT_FLEXFILE 0x4
#define NFSLAYOUTIOMODE_READ 1
#define NFSLAYOUTIOMODE_RW 2
@@ -1343,4 +1353,14 @@ struct nfsv4stateid {
};
typedef struct nfsv4stateid nfsv4stateid_t;
+/* Notify bits and notify bitmap size. */
+#define NFSV4NOTIFY_CHANGE 1
+#define NFSV4NOTIFY_DELETE 2
+#define NFSV4_NOTIFYBITMAP 1 /* # of 32bit values needed for bits */
+
+/* Layoutreturn kinds. */
+#define NFSV4LAYOUTRET_FILE 1
+#define NFSV4LAYOUTRET_FSID 2
+#define NFSV4LAYOUTRET_ALL 3
+
#endif /* _NFS_NFSPROTO_H_ */
Modified: projects/pnfs-server/sys/fs/nfs/nfsrvstate.h
==============================================================================
--- projects/pnfs-server/sys/fs/nfs/nfsrvstate.h Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfs/nfsrvstate.h Tue Apr 12 21:47:37 2016 (r297881)
@@ -84,6 +84,7 @@ struct nfsclient {
struct nfsstatehead lc_open; /* Open owner list */
struct nfsstatehead lc_deleg; /* Delegations */
struct nfsstatehead lc_olddeleg; /* and old delegations */
+ struct nfsstatehead lc_layout; /* NFSv4.1 layouts */
struct nfssessionhead lc_session; /* List of NFSv4.1 sessions */
time_t lc_expiry; /* Expiry time (sec) */
time_t lc_delegtime; /* Old deleg expiry (sec) */
@@ -153,6 +154,7 @@ struct nfsdsession {
* - open file structures chained off an open_owner structure
* - lock_owner structures chained off an open file structure
* - delegated file structures chained off of nfsclient and nfslockfile
+ * - pNFS layouts chained off of nfsclient and nfslockfile
* - the ls_list field is used for the chain it is in
* - the ls_head structure is used to chain off the sibling structure
* (it is a union between an nfsstate and nfslock structure head)
@@ -186,8 +188,9 @@ struct nfsstate {
struct nfslockfile *ls_lfp; /* Back pointer */
struct nfsrvcache *ls_op; /* Op cache reference */
struct nfsclient *ls_clp; /* Back pointer */
- u_short ls_ownerlen; /* Length of ls_owner */
+ u_int32_t ls_ownerlen; /* Length of ls_owner */
u_char ls_owner[1]; /* malloc'd the correct size */
+ /* Must be uint32_t * aligned */
};
#define ls_lock ls_head.lock
#define ls_open ls_head.open
@@ -199,6 +202,8 @@ struct nfsstate {
#define ls_delegtime ls_un.deleg.expiry
#define ls_delegtimelimit ls_un.deleg.limit
#define ls_compref ls_un.deleg.compref
+#define ls_layout ls_owner
+#define ls_layoutlen ls_ownerlen
/*
* Nfs lock structure.
@@ -249,6 +254,7 @@ struct nfsrollback {
struct nfslockfile {
LIST_HEAD(, nfsstate) lf_open; /* Open list */
LIST_HEAD(, nfsstate) lf_deleg; /* Delegation list */
+ LIST_HEAD(, nfsstate) lf_layout; /* Layout list */
LIST_HEAD(, nfslock) lf_lock; /* Lock list */
LIST_HEAD(, nfslock) lf_locallock; /* Local lock list */
LIST_HEAD(, nfsrollback) lf_rollback; /* Local lock rollback list */
@@ -291,6 +297,24 @@ struct nfsf_rec {
#if defined(_KERNEL) || defined(KERNEL)
void nfsrv_cleanclient(struct nfsclient *, NFSPROC_T *);
void nfsrv_freedeleglist(struct nfsstatehead *);
+void nfsrv_freelayoutlist(struct nfsstatehead *);
+
+/*
+ * This structure is used to create the list of device info entries for
+ * a GetDeviceInfo operation.
+ * The nfsdev_addrandhost field has the fully qualified host domain name
+ * followed by the network address in XDR.
+ */
+struct nfsdevice {
+ LIST_ENTRY(nfsdevice) nfsdev_list;
+ char nfsdev_deviceid[NFSX_V4DEVICEID];
+ uint16_t nfsdev_hostnamelen;
+ uint16_t nfsdev_addrlen;
+ char *nfsdev_addr;
+ char *nfsdev_host;
+};
+LIST_HEAD(nfsdevicehead, nfsdevice);
+
#endif
#endif /* _NFS_NFSRVSTATE_H_ */
Modified: projects/pnfs-server/sys/fs/nfsclient/nfs_clcomsubs.c
==============================================================================
--- projects/pnfs-server/sys/fs/nfsclient/nfs_clcomsubs.c Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfsclient/nfs_clcomsubs.c Tue Apr 12 21:47:37 2016 (r297881)
@@ -129,7 +129,8 @@ static int nfs_bigrequest[NFSV41_NPROCS]
*/
APPLESTATIC void
nfscl_reqstart(struct nfsrv_descript *nd, int procnum, struct nfsmount *nmp,
- u_int8_t *nfhp, int fhlen, u_int32_t **opcntpp, struct nfsclsession *sep)
+ u_int8_t *nfhp, int fhlen, u_int32_t **opcntpp, struct nfsclsession *sep,
+ int vers, int minorvers)
{
struct mbuf *mb;
u_int32_t *tl;
@@ -140,11 +141,12 @@ nfscl_reqstart(struct nfsrv_descript *nd
* First, fill in some of the fields of nd.
*/
nd->nd_slotseq = NULL;
- if (NFSHASNFSV4(nmp)) {
+ if ((NFSHASNFSV4(nmp) && vers == 0) || vers == NFS_VER4) {
nd->nd_flag = ND_NFSV4 | ND_NFSCL;
- if (NFSHASNFSV4N(nmp))
+ if ((NFSHASNFSV4N(nmp) && vers == 0) || minorvers ==
+ NFSV41_MINORVERSION)
nd->nd_flag |= ND_NFSV41;
- } else if (NFSHASNFSV3(nmp))
+ } else if ((NFSHASNFSV3(nmp) && vers == 0) || vers == NFS_VER3)
nd->nd_flag = ND_NFSV3 | ND_NFSCL;
else
nd->nd_flag = ND_NFSV2 | ND_NFSCL;
@@ -179,7 +181,7 @@ nfscl_reqstart(struct nfsrv_descript *nd
else if (procnum == NFSPROC_WRITEDS ||
procnum == NFSPROC_COMMITDS)
/*
- * For the special case of a Writeor Commit to
+ * For the special case of a Write or Commit to
* a DS, the opcnt == 3, for Sequence, PutFH,
* Write/Commit.
*/
Modified: projects/pnfs-server/sys/fs/nfsclient/nfs_clnode.c
==============================================================================
--- projects/pnfs-server/sys/fs/nfsclient/nfs_clnode.c Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfsclient/nfs_clnode.c Tue Apr 12 21:47:37 2016 (r297881)
@@ -246,7 +246,7 @@ ncl_inactive(struct vop_inactive_args *a
taskqueue_enqueue(taskqueue_thread, &sp->s_task);
mtx_lock(&np->n_mtx);
}
- np->n_flag &= NMODIFIED;
+ np->n_flag &= (NMODIFIED | NDSCOMMIT);
mtx_unlock(&np->n_mtx);
return (0);
}
Modified: projects/pnfs-server/sys/fs/nfsclient/nfs_clport.c
==============================================================================
--- projects/pnfs-server/sys/fs/nfsclient/nfs_clport.c Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfsclient/nfs_clport.c Tue Apr 12 21:47:37 2016 (r297881)
@@ -741,6 +741,8 @@ nfscl_wcc_data(struct nfsrv_descript *nd
}
}
error = nfscl_postop_attr(nd, nap, flagp, stuff);
+ if (wccflagp != NULL && *flagp == 0)
+ *wccflagp = 0;
} else if ((nd->nd_flag & (ND_NOMOREDATA | ND_NFSV4 | ND_V4WCCATTR))
== (ND_NFSV4 | ND_V4WCCATTR)) {
error = nfsv4_loadattr(nd, NULL, &nfsva, NULL,
Modified: projects/pnfs-server/sys/fs/nfsclient/nfs_clrpcops.c
==============================================================================
--- projects/pnfs-server/sys/fs/nfsclient/nfs_clrpcops.c Tue Apr 12 21:40:54 2016 (r297880)
+++ projects/pnfs-server/sys/fs/nfsclient/nfs_clrpcops.c Tue Apr 12 21:47:37 2016 (r297881)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include "opt_inet6.h"
#include <fs/nfs/nfsport.h>
+#include <fs/nfsclient/nfs_kdtrace.h>
#include <sys/sysctl.h>
SYSCTL_DECL(_vfs_nfs);
@@ -109,24 +110,49 @@ static int nfsrpc_setaclrpc(vnode_t, str
static int nfsrpc_getlayout(struct nfsmount *, vnode_t, struct nfsfh *, int,
uint32_t *, nfsv4stateid_t *, uint64_t, struct nfscllayout **,
struct ucred *, NFSPROC_T *);
-static int nfsrpc_fillsa(struct nfsmount *, struct sockaddr_storage *,
- struct nfsclds **, NFSPROC_T *);
+static int nfsrpc_fillsa(struct nfsmount *, sa_family_t, struct sockaddr_in *,
+ struct sockaddr_in6 *, int, int, struct nfsclds **, NFSPROC_T *);
static void nfscl_initsessionslots(struct nfsclsession *);
-static int nfscl_doflayoutio(vnode_t, struct uio *, int *, int *, int *,
+static int nfscl_dofllayoutio(vnode_t, struct uio *, int *, int *, int *,
nfsv4stateid_t *, int, struct nfscldevinfo *, struct nfscllayout *,
- struct nfsclflayout *, uint64_t, uint64_t, struct ucred *, NFSPROC_T *);
-static int nfsrpc_readds(vnode_t, struct uio *, nfsv4stateid_t *, int *,
+ struct nfsclflayout *, uint64_t, uint64_t, int, struct ucred *,
+ NFSPROC_T *, struct nfsvattr *, int *);
+static int nfscl_dofflayoutio(vnode_t, struct uio *, int *, int *, int *,
+ nfsv4stateid_t *, int, struct nfscldevinfo *, struct nfscllayout *,
+ struct nfsclflayout *, uint64_t, uint64_t, int, struct ucred *,
+ NFSPROC_T *, struct nfsvattr *, int *);
+static int nfsrpc_readds41(vnode_t, struct uio *, nfsv4stateid_t *, int *,
+ struct nfsclds *, uint64_t, int, struct nfsfh *, struct ucred *,
+ NFSPROC_T *, struct nfsvattr *, int *);
+static int nfsrpc_readds3(vnode_t, struct uio *, int *,
struct nfsclds *, uint64_t, int, struct nfsfh *, struct ucred *,
- NFSPROC_T *);
-static int nfsrpc_writeds(vnode_t, struct uio *, int *, int *,
+ NFSPROC_T *, struct nfsvattr *, int *);
+static int nfsrpc_writeds41(vnode_t, struct uio *, int *, int *,
nfsv4stateid_t *, struct nfsclds *, uint64_t, int,
- struct nfsfh *, int, struct ucred *, NFSPROC_T *);
+ struct nfsfh *, int, struct ucred *, NFSPROC_T *, struct nfsvattr *, int *);
+static int nfsrpc_writeds3(vnode_t, struct uio *, int *, int *,
+ struct nfsclds *, uint64_t, int,
+ struct nfsfh *, int, struct ucred *, NFSPROC_T *, struct nfsvattr *, int *);
static enum nfsclds_state nfscl_getsameserver(struct nfsmount *,
struct nfsclds *, struct nfsclds **);
-#ifdef notyet
-static int nfsrpc_commitds(vnode_t, uint64_t, int, struct nfsclds *,
- struct nfsfh *, struct ucred *, NFSPROC_T *, void *);
-#endif
+static int nfsrpc_commitds41(vnode_t, uint64_t, int, struct nfsclds *,
+ struct nfsfh *, struct ucred *, NFSPROC_T *, struct nfsvattr *, int *);
+static int nfsrpc_commitds3(vnode_t, uint64_t, int, struct nfsclds *,
+ struct nfsfh *, struct ucred *, NFSPROC_T *, struct nfsvattr *, int *);
+static int nfsrpc_getattrds3(vnode_t, struct nfsclds *, struct nfsfh *,
+ struct nfsvattr *, struct ucred *, NFSPROC_T *);
+static struct nfsclflayout *nfscl_parsefl(struct nfsrv_descript *, uint64_t,
+ uint64_t, int);
+static struct nfsclflayout *nfscl_parseff(struct nfsrv_descript *, uint64_t,
+ uint64_t, int);
+static int nfsrpc_getdeviceinfo(struct nfsmount *, uint8_t *, uint32_t *,
+ struct nfscldevinfo **, struct ucred *, NFSPROC_T *);
+static int nfsv4_getipaddr(struct nfsrv_descript *, struct sockaddr_in *,
+ struct sockaddr_in6 *, sa_family_t *);
+static int nfsrpc_flparseaddr(struct nfsmount *, struct nfsrv_descript *,
+ struct nfscldevinfo *, int, int *, NFSPROC_T *);
+static int nfsrpc_ffparseaddr(struct nfsmount *, struct nfsrv_descript *,
+ struct nfscldevinfo *, int *, NFSPROC_T *);
/*
* nfs null call from vfs.
@@ -387,7 +413,7 @@ nfsrpc_openrpc(struct nfsmount *nmp, vno
dp = *dpp;
*dpp = NULL;
- nfscl_reqstart(nd, NFSPROC_OPEN, nmp, nfhp, fhlen, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_OPEN, nmp, nfhp, fhlen, NULL, NULL, 0, 0);
NFSM_BUILD(tl, u_int32_t *, 5 * NFSX_UNSIGNED);
*tl++ = txdr_unsigned(op->nfso_own->nfsow_seqid);
*tl++ = txdr_unsigned(mode & NFSV4OPEN_ACCESSBOTH);
@@ -487,7 +513,7 @@ nfsrpc_openrpc(struct nfsmount *nmp, vno
default:
error = NFSERR_BADXDR;
goto nfsmout;
- }
+ };
} else {
ndp->nfsdl_flags = NFSCLDL_READ;
}
@@ -742,7 +768,7 @@ nfsrpc_closerpc(struct nfsrv_descript *n
int error;
nfscl_reqstart(nd, NFSPROC_CLOSE, nmp, op->nfso_fh,
- op->nfso_fhlen, NULL, NULL);
+ op->nfso_fhlen, NULL, NULL, 0, 0);
NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED + NFSX_STATEID);
*tl++ = txdr_unsigned(op->nfso_own->nfsow_seqid);
if (NFSHASNFSV4N(nmp))
@@ -784,7 +810,8 @@ nfsrpc_openconfirm(vnode_t vp, u_int8_t
nmp = VFSTONFS(vnode_mount(vp));
if (NFSHASNFSV4N(nmp))
return (0); /* No confirmation for NFSv4.1. */
- nfscl_reqstart(nd, NFSPROC_OPENCONFIRM, nmp, nfhp, fhlen, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_OPENCONFIRM, nmp, nfhp, fhlen, NULL, NULL, 0,
+ 0);
NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED + NFSX_STATEID);
*tl++ = op->nfso_stateid.seqid;
*tl++ = op->nfso_stateid.other[0];
@@ -829,7 +856,6 @@ nfsrpc_setclient(struct nfsmount *nmp, s
u_int32_t lease;
static u_int32_t rev = 0;
struct nfsclds *dsp, *ndsp, *tdsp;
- struct in6_addr a6;
if (nfsboottime.tv_sec == 0)
NFSSETBOOTTIME(nfsboottime);
@@ -877,7 +903,7 @@ nfsrpc_setclient(struct nfsmount *nmp, s
TAILQ_INSERT_HEAD(&nmp->nm_sess, dsp, nfsclds_list);
NFSUNLOCKMNT(nmp);
- nfscl_reqstart(nd, NFSPROC_SETCLIENTID, nmp, NULL, 0, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_SETCLIENTID, nmp, NULL, 0, NULL, NULL, 0, 0);
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
*tl++ = txdr_unsigned(nfsboottime.tv_sec);
*tl = txdr_unsigned(clp->nfsc_rev);
@@ -890,7 +916,7 @@ nfsrpc_setclient(struct nfsmount *nmp, s
*tl = txdr_unsigned(NFS_CALLBCKPROG);
callblen = strlen(nfsv4_callbackaddr);
if (callblen == 0)
- cp = nfscl_getmyip(nmp, &a6, &isinet6);
+ cp = nfscl_getmyip(nmp, &isinet6);
if (nfscl_enablecallb && nfs_numnfscbd > 0 &&
(callblen > 0 || cp != NULL)) {
port = htons(nfsv4_cbport);
@@ -947,7 +973,7 @@ nfsrpc_setclient(struct nfsmount *nmp, s
* and confirm it.
*/
nfscl_reqstart(nd, NFSPROC_SETCLIENTIDCFRM, nmp, NULL, 0, NULL,
- NULL);
+ NULL, 0, 0);
NFSM_BUILD(tl, u_int32_t *, 4 * NFSX_UNSIGNED);
*tl++ = NFSMNT_MDSSESSION(nmp)->nfsess_clientid.lval[0];
*tl++ = NFSMNT_MDSSESSION(nmp)->nfsess_clientid.lval[1];
@@ -962,7 +988,7 @@ nfsrpc_setclient(struct nfsmount *nmp, s
nd->nd_mrep = NULL;
if (nd->nd_repstat == 0) {
nfscl_reqstart(nd, NFSPROC_GETATTR, nmp, nmp->nm_fh,
- nmp->nm_fhsize, NULL, NULL);
+ nmp->nm_fhsize, NULL, NULL, 0, 0);
NFSZERO_ATTRBIT(&attrbits);
NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_LEASETIME);
(void) nfsrv_putattrbit(nd, &attrbits);
@@ -1029,7 +1055,7 @@ nfsrpc_getattrnovp(struct nfsmount *nmp,
int error, vers = NFS_VER2;
nfsattrbit_t attrbits;
- nfscl_reqstart(nd, NFSPROC_GETATTR, nmp, fhp, fhlen, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_GETATTR, nmp, fhp, fhlen, NULL, NULL, 0, 0);
if (nd->nd_flag & ND_NFSV4) {
vers = NFS_VER4;
NFSGETATTR_ATTRBIT(&attrbits);
@@ -2086,7 +2112,7 @@ nfsrpc_createv4(vnode_t dvp, char *name,
default:
error = NFSERR_BADXDR;
goto nfsmout;
- }
+ };
} else {
dp->nfsdl_flags = NFSCLDL_READ;
}
@@ -3646,7 +3672,9 @@ nfsrpc_commit(vnode_t vp, u_quad_t offse
NFSLOCKMNT(nmp);
if (NFSBCMP(nmp->nm_verf, tl, NFSX_VERF)) {
NFSBCOPY(tl, nmp->nm_verf, NFSX_VERF);
+#ifdef notnow
nd->nd_repstat = NFSERR_STALEWRITEVERF;
+#endif
}
NFSUNLOCKMNT(nmp);
if (nd->nd_flag & ND_NFSV4)
@@ -3698,7 +3726,7 @@ nfsrpc_advlock(vnode_t vp, off_t size, i
break;
default:
return (EINVAL);
- }
+ };
if (start < 0)
return (EINVAL);
if (fl->l_len != 0) {
@@ -3913,7 +3941,7 @@ nfsrpc_locku(struct nfsrv_descript *nd,
int error;
nfscl_reqstart(nd, NFSPROC_LOCKU, nmp, lp->nfsl_open->nfso_fh,
- lp->nfsl_open->nfso_fhlen, NULL, NULL);
+ lp->nfsl_open->nfso_fhlen, NULL, NULL, 0, 0);
NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID + 6 * NFSX_UNSIGNED);
*tl++ = txdr_unsigned(type);
*tl = txdr_unsigned(lp->nfsl_seqid);
@@ -3965,7 +3993,7 @@ nfsrpc_lock(struct nfsrv_descript *nd, s
int error, size;
uint8_t own[NFSV4CL_LOCKNAMELEN + NFSX_V4FHMAX];
- nfscl_reqstart(nd, NFSPROC_LOCK, nmp, nfhp, fhlen, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_LOCK, nmp, nfhp, fhlen, NULL, NULL, 0, 0);
NFSM_BUILD(tl, u_int32_t *, 7 * NFSX_UNSIGNED);
if (type == F_RDLCK)
*tl++ = txdr_unsigned(NFSV4LOCKT_READ);
@@ -4237,7 +4265,7 @@ nfsrpc_renew(struct nfsclclient *clp, st
if (nmp == NULL)
return (0);
nfscl_reqstart(nd, NFSPROC_RENEW, nmp, NULL, 0, NULL,
- &dsp->nfsclds_sess);
+ &dsp->nfsclds_sess, 0, 0);
if (!NFSHASNFSV4N(nmp)) {
/* NFSv4.1 just uses a Sequence Op and not a Renew. */
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
@@ -4273,11 +4301,11 @@ nfsrpc_rellockown(struct nfsmount *nmp,
if (NFSHASNFSV4N(nmp)) {
/* For NFSv4.1, do a FreeStateID. */
nfscl_reqstart(nd, NFSPROC_FREESTATEID, nmp, NULL, 0, NULL,
- NULL);
+ NULL, 0, 0);
nfsm_stateidtom(nd, &lp->nfsl_stateid, NFSSTATEID_PUTSTATEID);
} else {
nfscl_reqstart(nd, NFSPROC_RELEASELCKOWN, nmp, NULL, 0, NULL,
- NULL);
+ NULL, 0, 0);
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
*tl++ = NFSMNT_MDSSESSION(nmp)->nfsess_clientid.lval[0];
*tl = NFSMNT_MDSSESSION(nmp)->nfsess_clientid.lval[1];
@@ -4309,7 +4337,8 @@ nfsrpc_getdirpath(struct nfsmount *nmp,
int error, cnt, len, setnil;
u_int32_t *opcntp;
- nfscl_reqstart(nd, NFSPROC_PUTROOTFH, nmp, NULL, 0, &opcntp, NULL);
+ nfscl_reqstart(nd, NFSPROC_PUTROOTFH, nmp, NULL, 0, &opcntp, NULL, 0,
+ 0);
cp = dirpath;
cnt = 0;
do {
@@ -4376,7 +4405,7 @@ nfsrpc_delegreturn(struct nfscldeleg *dp
int error;
nfscl_reqstart(nd, NFSPROC_DELEGRETURN, nmp, dp->nfsdl_fh,
- dp->nfsdl_fhlen, NULL, NULL);
+ dp->nfsdl_fhlen, NULL, NULL, 0, 0);
NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
if (NFSHASNFSV4N(nmp))
*tl++ = 0;
@@ -4486,7 +4515,7 @@ nfsrpc_exchangeid(struct nfsmount *nmp,
int error, len;
*dspp = NULL;
- nfscl_reqstart(nd, NFSPROC_EXCHANGEID, nmp, NULL, 0, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_EXCHANGEID, nmp, NULL, 0, NULL, NULL, 0, 0);
NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
*tl++ = txdr_unsigned(nfsboottime.tv_sec); /* Client owner */
*tl = txdr_unsigned(clp->nfsc_rev);
@@ -4568,7 +4597,8 @@ nfsrpc_createsession(struct nfsmount *nm
struct nfsrv_descript *nd = &nfsd;
int error, irdcnt;
- nfscl_reqstart(nd, NFSPROC_CREATESESSION, nmp, NULL, 0, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_CREATESESSION, nmp, NULL, 0, NULL, NULL, 0,
+ 0);
NFSM_BUILD(tl, uint32_t *, 4 * NFSX_UNSIGNED);
*tl++ = sep->nfsess_clientid.lval[0];
*tl++ = sep->nfsess_clientid.lval[1];
@@ -4662,7 +4692,8 @@ nfsrpc_destroysession(struct nfsmount *n
struct nfsrv_descript *nd = &nfsd;
int error;
- nfscl_reqstart(nd, NFSPROC_DESTROYSESSION, nmp, NULL, 0, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_DESTROYSESSION, nmp, NULL, 0, NULL, NULL, 0,
+ 0);
NFSM_BUILD(tl, uint32_t *, NFSX_V4SESSIONID);
bcopy(NFSMNT_MDSSESSION(nmp)->nfsess_sessionid, tl, NFSX_V4SESSIONID);
nd->nd_flag |= ND_USEGSSNAME;
@@ -4687,7 +4718,8 @@ nfsrpc_destroyclient(struct nfsmount *nm
struct nfsrv_descript *nd = &nfsd;
int error;
- nfscl_reqstart(nd, NFSPROC_DESTROYCLIENT, nmp, NULL, 0, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_DESTROYCLIENT, nmp, NULL, 0, NULL, NULL, 0,
+ 0);
NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
*tl++ = NFSMNT_MDSSESSION(nmp)->nfsess_clientid.lval[0];
*tl = NFSMNT_MDSSESSION(nmp)->nfsess_clientid.lval[1];
@@ -4712,19 +4744,22 @@ nfsrpc_layoutget(struct nfsmount *nmp, u
{
uint32_t *tl;
struct nfsrv_descript nfsd, *nd = &nfsd;
- struct nfsfh *nfhp;
struct nfsclflayout *flp, *prevflp, *tflp;
- int cnt, error, gotiomode, fhcnt, nfhlen, i, j;
- uint8_t *cp;
- uint64_t retlen;
+ int cnt, error, gotiomode, i;
+ int retiomode, ltyp;
+ uint64_t off, retlen;
flp = NULL;
gotiomode = -1;
- nfscl_reqstart(nd, NFSPROC_LAYOUTGET, nmp, fhp, fhlen, NULL, NULL);
+ nfscl_reqstart(nd, NFSPROC_LAYOUTGET, nmp, fhp, fhlen, NULL, NULL, 0,
+ 0);
NFSM_BUILD(tl, uint32_t *, 4 * NFSX_UNSIGNED + 3 * NFSX_HYPER +
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list