Date: Sat, 4 Feb 2012 03:08:23 +0000 (UTC) From: Rick Macklem <rmacklem@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r230974 - in projects/nfsv4.1-client/sys/fs: nfs nfsclient Message-ID: <201202040308.q1438NB5016456@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rmacklem Date: Sat Feb 4 03:08:23 2012 New Revision: 230974 URL: http://svn.freebsd.org/changeset/base/230974 Log: Replace length with end offset in the nfsclflayout structure and keep the layouts that can be used for writing on a separate list from the ones that are for reading. These changes make it easier to find the correct layout(s) to use for reading or writing from/to the DS. This layout handling code is not yet tested. Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h Sat Feb 4 02:00:33 2012 (r230973) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsclstate.h Sat Feb 4 03:08:23 2012 (r230974) @@ -219,7 +219,8 @@ struct nfscllayout { TAILQ_ENTRY(nfscllayout) nfsly_list; LIST_ENTRY(nfscllayout) nfsly_hash; nfsv4stateid_t nfsly_stateid; - struct nfsclflayouthead nfsly_flay; + struct nfsclflayouthead nfsly_flayread; + struct nfsclflayouthead nfsly_flayrw; struct nfsclclient *nfsly_clp; uint32_t nfsly_refcnt; uint16_t nfsly_retonclose; @@ -229,13 +230,16 @@ struct nfscllayout { /* * MALLOC'd to the correct length to accommodate the file handle list. - * These hang off of nfsly_flay, sorted in increasing offset order. + * These hang off of nfsly_flayread and nfsly_flayrw, sorted in increasing + * offset order. + * The nfsly_flayread list holds the ones with iomode == NFSLAYOUTIOMODE_READ, + * whereas the nfsly_flayrw holds the ones with iomode == NFSLAYOUTIOMODE_RW. */ struct nfsclflayout { LIST_ENTRY(nfsclflayout) nfsfl_list; uint8_t nfsfl_dev[NFSX_V4DEVICEID]; uint64_t nfsfl_off; - uint64_t nfsfl_len; + uint64_t nfsfl_end; uint64_t nfsfl_patoff; uint32_t nfsfl_iomode; uint32_t nfsfl_util; Modified: projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sat Feb 4 02:00:33 2012 (r230973) +++ projects/nfsv4.1-client/sys/fs/nfs/nfsproto.h Sat Feb 4 03:08:23 2012 (r230974) @@ -585,6 +585,10 @@ #define NFSDEVICEIDNOTIFY_CHANGEBIT 0x1 #define NFSDEVICEIDNOTIFY_DELETEBIT 0x2 +/* Flags for File Layout. */ +#define NFSFLAYUTIL_DENSE 0x1 +#define NFSFLAYUTIL_COMMIT_THRU_MDS 0x2 + /* Conversion macros */ #define vtonfsv2_mode(t,m) \ txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \ Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Sat Feb 4 02:00:33 2012 (r230973) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clrpcops.c Sat Feb 4 03:08:23 2012 (r230974) @@ -4522,6 +4522,7 @@ nfsrpc_layoutget(struct nfsmount *nmp, u struct nfsclflayout *flp, *prevflp, *tflp; int cnt, error, fhcnt, nfhlen, i, j; uint8_t *cp; + uint64_t retlen; flp = NULL; nfscl_reqstart(nd, NFSPROC_LAYOUTGET, nmp, fhp, fhlen, NULL, NULL); @@ -4585,7 +4586,11 @@ printf("fhcnt=%d\n", fhcnt); M_NFSFLAYOUT, M_WAITOK); flp->nfsfl_fhcnt = 0; flp->nfsfl_off = fxdr_hyper(tl); tl += 2; - flp->nfsfl_len = fxdr_hyper(tl); tl += 2; + retlen = fxdr_hyper(tl); tl += 2; + if (flp->nfsfl_off + retlen < flp->nfsfl_off) + flp->nfsfl_end = UINT64_MAX - flp->nfsfl_off; + else + flp->nfsfl_end = flp->nfsfl_off + retlen; flp->nfsfl_iomode = fxdr_unsigned(int, *tl++); printf("layg iom=%d\n", iomode); if (fxdr_unsigned(int, *tl++) != @@ -4619,18 +4624,24 @@ printf("layg iom=%d\n", iomode); NFSM_DISSECT(cp, uint8_t *, NFSM_RNDUP(fhlen)); NFSBCOPY(cp, nfhp->nfh_fh, nfhlen); } - /* Maintain the list in increasing offset order. */ - tflp = LIST_FIRST(flhp); - prevflp = NULL; - while (tflp != NULL && - tflp->nfsfl_off < flp->nfsfl_off) { - prevflp = tflp; - tflp = LIST_NEXT(tflp, nfsfl_list); + if (flp->nfsfl_iomode == iomode) { + /* Keep the list in increasing offset order. */ + tflp = LIST_FIRST(flhp); + prevflp = NULL; + while (tflp != NULL && + tflp->nfsfl_off < flp->nfsfl_off) { + prevflp = tflp; + tflp = LIST_NEXT(tflp, nfsfl_list); + } + if (prevflp == NULL) + LIST_INSERT_HEAD(flhp, flp, nfsfl_list); + else + LIST_INSERT_AFTER(prevflp, flp, + nfsfl_list); + } else { + printf("nfscl_layoutget(): got wrong iomode\n"); + nfscl_freeflayout(flp); } - if (prevflp == NULL) - LIST_INSERT_HEAD(flhp, flp, nfsfl_list); - else - LIST_INSERT_AFTER(prevflp, flp, nfsfl_list); flp = NULL; } } Modified: projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c ============================================================================== --- projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Sat Feb 4 02:00:33 2012 (r230973) +++ projects/nfsv4.1-client/sys/fs/nfsclient/nfs_clstate.c Sat Feb 4 03:08:23 2012 (r230974) @@ -4405,6 +4405,7 @@ nfscl_layout(struct nfsmount *nmp, u_int { struct nfsclclient *clp; struct nfscllayout *lyp, *tlyp; + struct nfsclflayout *flp; *lypp = NULL; tlyp = malloc(sizeof(*tlyp) + fhlen - 1, M_NFSLAYOUT, M_WAITOK); @@ -4424,7 +4425,8 @@ nfscl_layout(struct nfsmount *nmp, u_int lyp->nfsly_stateid.other[0] = stateidp->other[0]; lyp->nfsly_stateid.other[1] = stateidp->other[1]; lyp->nfsly_stateid.other[2] = stateidp->other[2]; - LIST_INIT(&lyp->nfsly_flay); + LIST_INIT(&lyp->nfsly_flayread); + LIST_INIT(&lyp->nfsly_flayrw); lyp->nfsly_clp = clp; lyp->nfsly_retonclose = retonclose; lyp->nfsly_refcnt = 1; /* Return with a reference cnt. */ @@ -4444,7 +4446,13 @@ nfscl_layout(struct nfsmount *nmp, u_int } /* Merge the new list of File Layouts into the list. */ - nfscl_mergeflayouts(&lyp->nfsly_flay, fhlp); + flp = LIST_FIRST(fhlp); + if (flp != NULL) { + if (flp->nfsfl_iomode == NFSLAYOUTIOMODE_READ) + nfscl_mergeflayouts(&lyp->nfsly_flayread, fhlp); + else + nfscl_mergeflayouts(&lyp->nfsly_flayrw, fhlp); + } NFSUNLOCKCLSTATE(); if (tlyp != NULL) free(tlyp, M_NFSLAYOUT); @@ -4599,7 +4607,11 @@ nfscl_freelayout(struct nfscllayout *lay { struct nfsclflayout *flp, *nflp; - LIST_FOREACH_SAFE(flp, &layp->nfsly_flay, nfsfl_list, nflp) { + LIST_FOREACH_SAFE(flp, &layp->nfsly_flayread, nfsfl_list, nflp) { + LIST_REMOVE(flp, nfsfl_list); + nfscl_freeflayout(flp); + } + LIST_FOREACH_SAFE(flp, &layp->nfsly_flayrw, nfsfl_list, nflp) { LIST_REMOVE(flp, nfsfl_list); nfscl_freeflayout(flp); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202040308.q1438NB5016456>