summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/fs/nfsserver/nfs_fha_new.c18
-rw-r--r--sys/nfs/nfs_fha.c5
-rw-r--r--sys/nfs/nfs_fha.h2
-rw-r--r--sys/nfsserver/nfs_fha_old.c30
4 files changed, 40 insertions, 15 deletions
diff --git a/sys/fs/nfsserver/nfs_fha_new.c b/sys/fs/nfsserver/nfs_fha_new.c
index c05ad28..2e7115f 100644
--- a/sys/fs/nfsserver/nfs_fha_new.c
+++ b/sys/fs/nfsserver/nfs_fha_new.c
@@ -41,7 +41,7 @@ static void fhanew_init(void *foo);
static void fhanew_uninit(void *foo);
rpcproc_t fhanew_get_procnum(rpcproc_t procnum);
int fhanew_realign(struct mbuf **mb, int malloc_flags);
-int fhanew_get_fh(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
+int fhanew_get_fh(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
int fhanew_is_read(rpcproc_t procnum);
int fhanew_is_write(rpcproc_t procnum);
int fhanew_get_offset(struct mbuf **md, caddr_t *dpos, int v3,
@@ -128,11 +128,13 @@ fhanew_realign(struct mbuf **mb, int malloc_flags)
}
int
-fhanew_get_fh(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos)
+fhanew_get_fh(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos)
{
struct nfsrv_descript lnd, *nd;
uint32_t *tl;
- int error, len;
+ uint8_t *buf;
+ uint64_t t;
+ int error, len, i;
error = 0;
len = 0;
@@ -151,11 +153,13 @@ fhanew_get_fh(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos)
len = NFSX_V2FH;
}
+ t = 0;
if (len != 0) {
- NFSM_DISSECT_NONBLOCK(tl, uint32_t *, len);
- bcopy(tl, fh, len);
- } else
- bzero(fh, sizeof(*fh));
+ NFSM_DISSECT_NONBLOCK(buf, uint8_t *, len);
+ for (i = 0; i < len; i++)
+ t ^= ((uint64_t)buf[i] << (i & 7) * 8);
+ }
+ *fh = t;
nfsmout:
*md = nd->nd_md;
diff --git a/sys/nfs/nfs_fha.c b/sys/nfs/nfs_fha.c
index 2290804..1892729 100644
--- a/sys/nfs/nfs_fha.c
+++ b/sys/nfs/nfs_fha.c
@@ -130,7 +130,6 @@ fha_extract_info(struct svc_req *req, struct fha_info *i,
struct fha_callbacks *cb)
{
struct mbuf *md;
- fhandle_t fh;
caddr_t dpos;
static u_int64_t random_fh = 0;
int error;
@@ -177,12 +176,10 @@ fha_extract_info(struct svc_req *req, struct fha_info *i,
dpos = mtod(md, caddr_t);
/* Grab the filehandle. */
- error = cb->get_fh(&fh, v3, &md, &dpos);
+ error = cb->get_fh(&i->fh, v3, &md, &dpos);
if (error)
goto out;
- bcopy(fh.fh_fid.fid_data, &i->fh, sizeof(i->fh));
-
/* Content ourselves with zero offset for all but reads. */
if (cb->is_read(procnum) || cb->is_write(procnum))
cb->get_offset(&md, &dpos, v3, i);
diff --git a/sys/nfs/nfs_fha.h b/sys/nfs/nfs_fha.h
index ef5ada0..d3dd039 100644
--- a/sys/nfs/nfs_fha.h
+++ b/sys/nfs/nfs_fha.h
@@ -82,7 +82,7 @@ struct fha_info {
struct fha_callbacks {
rpcproc_t (*get_procnum)(rpcproc_t procnum);
int (*realign)(struct mbuf **mb, int malloc_flags);
- int (*get_fh)(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
+ int (*get_fh)(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
int (*is_read)(rpcproc_t procnum);
int (*is_write)(rpcproc_t procnum);
int (*get_offset)(struct mbuf **md, caddr_t *dpos, int v3, struct
diff --git a/sys/nfsserver/nfs_fha_old.c b/sys/nfsserver/nfs_fha_old.c
index 82149b8..a928278 100644
--- a/sys/nfsserver/nfs_fha_old.c
+++ b/sys/nfsserver/nfs_fha_old.c
@@ -49,7 +49,7 @@ static void fhaold_init(void *foo);
static void fhaold_uninit(void *foo);
rpcproc_t fhaold_get_procnum(rpcproc_t procnum);
int fhaold_realign(struct mbuf **mb, int malloc_flags);
-int fhaold_get_fh(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
+int fhaold_get_fh(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
int fhaold_is_read(rpcproc_t procnum);
int fhaold_is_write(rpcproc_t procnum);
int fhaold_get_offset(struct mbuf **md, caddr_t *dpos, int v3,
@@ -135,9 +135,33 @@ fhaold_realign(struct mbuf **mb, int malloc_flags)
}
int
-fhaold_get_fh(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos)
+fhaold_get_fh(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos)
{
- return (nfsm_srvmtofh_xx(fh, v3, md, dpos));
+ u_int32_t *tl;
+ uint8_t *buf;
+ uint64_t t;
+ int fhlen, i;
+
+ if (v3) {
+ tl = nfsm_dissect_xx_nonblock(NFSX_UNSIGNED, md, dpos);
+ if (tl == NULL)
+ return EBADRPC;
+ fhlen = fxdr_unsigned(int, *tl);
+ if (fhlen != 0 && fhlen != NFSX_V3FH)
+ return EBADRPC;
+ } else {
+ fhlen = NFSX_V2FH;
+ }
+ t = 0;
+ if (fhlen != 0) {
+ buf = nfsm_dissect_xx_nonblock(fhlen, md, dpos);
+ if (buf == NULL)
+ return EBADRPC;
+ for (i = 0; i < fhlen; i++)
+ t ^= ((uint64_t)buf[i] << (i & 7) * 8);
+ }
+ *fh = t;
+ return 0;
}
int
OpenPOWER on IntegriCloud