From owner-svn-src-projects@freebsd.org Mon Aug 7 19:56:10 2017 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id BBC2CDC52C2 for ; Mon, 7 Aug 2017 19:56:10 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 940B580C37; Mon, 7 Aug 2017 19:56:10 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v77Ju9xU068999; Mon, 7 Aug 2017 19:56:09 GMT (envelope-from rmacklem@FreeBSD.org) Received: (from rmacklem@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id v77Ju9gl068997; Mon, 7 Aug 2017 19:56:09 GMT (envelope-from rmacklem@FreeBSD.org) Message-Id: <201708071956.v77Ju9gl068997@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: rmacklem set sender to rmacklem@FreeBSD.org using -f From: Rick Macklem Date: Mon, 7 Aug 2017 19:56:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r322195 - in projects/pnfs-planb-server/sys/fs: nfs nfsserver X-SVN-Group: projects X-SVN-Commit-Author: rmacklem X-SVN-Commit-Paths: in projects/pnfs-planb-server/sys/fs: nfs nfsserver X-SVN-Commit-Revision: 322195 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Aug 2017 19:56:10 -0000 Author: rmacklem Date: Mon Aug 7 19:56:09 2017 New Revision: 322195 URL: https://svnweb.freebsd.org/changeset/base/322195 Log: Add some code for Flex Files layout. No semantic change. Modified: projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Modified: projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h Mon Aug 7 19:52:15 2017 (r322194) +++ projects/pnfs-planb-server/sys/fs/nfs/nfsrvstate.h Mon Aug 7 19:56:09 2017 (r322195) @@ -336,7 +336,9 @@ struct nfsdevice { char nfsdev_deviceid[NFSX_V4DEVICEID]; uint16_t nfsdev_hostnamelen; uint16_t nfsdev_fileaddrlen; + uint16_t nfsdev_flexaddrlen; char *nfsdev_fileaddr; + char *nfsdev_flexaddr; char *nfsdev_host; uint32_t nfsdev_nextdir; vnode_t nfsdev_dsdir[0]; Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c ============================================================================== --- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Mon Aug 7 19:52:15 2017 (r322194) +++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdstate.c Mon Aug 7 19:56:09 2017 (r322195) @@ -6608,25 +6608,29 @@ nfsrv_getdevinfo(char *devid, int layouttype, uint32_t return (NFSERR_NOENT); /* If the correct nfsdev_XXXXaddrlen is > 0, we have the device info. */ - if (layouttype == NFSLAYOUT_NFSV4_1_FILES && - ds->nfsdev_fileaddrlen > 0) { - /* - * The XDR overhead is 3 unsigned values: layout_type, - * length_of_address and notify bitmap. - * If the notify array is changed to not all zeros, the - * count of unsigned values must be increased. - */ - if (*maxcnt > 0 && *maxcnt < - NFSM_RNDUP(ds->nfsdev_fileaddrlen) + 3 * NFSX_UNSIGNED) { - *maxcnt = NFSM_RNDUP(ds->nfsdev_fileaddrlen) + - 3 * NFSX_UNSIGNED; - return (NFSERR_TOOSMALL); - } + *devaddrlen = 0; + if (layouttype == NFSLAYOUT_NFSV4_1_FILES) { *devaddrlen = ds->nfsdev_fileaddrlen; *devaddr = ds->nfsdev_fileaddr; - } else + } else if (layouttype == NFSLAYOUT_FLEXFILE) { + *devaddrlen = ds->nfsdev_flexaddrlen; + *devaddr = ds->nfsdev_flexaddr; + } + if (*devaddrlen == 0) return (NFSERR_UNKNLAYOUTTYPE); + /* + * The XDR overhead is 3 unsigned values: layout_type, + * length_of_address and notify bitmap. + * If the notify array is changed to not all zeros, the + * count of unsigned values must be increased. + */ + if (*maxcnt > 0 && *maxcnt < NFSM_RNDUP(*devaddrlen) + + 3 * NFSX_UNSIGNED) { + *maxcnt = NFSM_RNDUP(*devaddrlen) + 3 * NFSX_UNSIGNED; + return (NFSERR_TOOSMALL); + } + /* No notifies for now. */ for (i = 0; i < NFSV4_NOTIFYBITMAP; i++) *notify++ = 0; @@ -6682,6 +6686,7 @@ nfsrv_freedevid(struct nfsdevice *ds) if (ds->nfsdev_dsdir[i] != NULL) vrele(ds->nfsdev_dsdir[i]); free(ds->nfsdev_fileaddr, M_NFSDSTATE); + free(ds->nfsdev_flexaddr, M_NFSDSTATE); free(ds->nfsdev_host, M_NFSDSTATE); free(ds, M_NFSDSTATE); } @@ -6845,6 +6850,31 @@ nfsrv_allocdevid(struct nfsdevice *ds, char *addr, cha tl += (NFSM_RNDUP(strlen(netprot)) / NFSX_UNSIGNED); *tl++ = txdr_unsigned(strlen(addr)); NFSBCOPY(addr, tl, strlen(addr)); + + /* + * Fill in the flex file addr (actually the ff_device_addr4 + * as defined for Flexible File Layout) in XDR. + */ + addrlen = NFSM_RNDUP(strlen(addr)) + NFSM_RNDUP(strlen(netprot)) + + 10 * NFSX_UNSIGNED; + ds->nfsdev_flexaddrlen = addrlen; + tl = malloc(addrlen, M_NFSDSTATE, M_WAITOK | M_ZERO); + ds->nfsdev_flexaddr = (char *)tl; + *tl++ = txdr_unsigned(1); /* One multipath list */ + *tl++ = txdr_unsigned(1); /* with one entry in it. */ + /* The netaddr for this one entry. */ + *tl++ = txdr_unsigned(strlen(netprot)); + NFSBCOPY(netprot, tl, strlen(netprot)); + tl += (NFSM_RNDUP(strlen(netprot)) / NFSX_UNSIGNED); + *tl++ = txdr_unsigned(strlen(addr)); + NFSBCOPY(addr, tl, strlen(addr)); + tl += (NFSM_RNDUP(strlen(addr)) / NFSX_UNSIGNED); + *tl++ = txdr_unsigned(1); /* One NFS Version. */ + *tl++ = txdr_unsigned(NFS_VER4); /* NFSv4. */ + *tl++ = txdr_unsigned(NFSV41_MINORVERSION); /* Minor version 1. */ + *tl++ = txdr_unsigned(NFS_SRVMAXIO); /* DS max rsize. */ + *tl++ = txdr_unsigned(NFS_SRVMAXIO); /* DS max wsize. */ + *tl = newnfs_true; /* Tightly coupled. */ ds->nfsdev_hostnamelen = strlen(dnshost); ds->nfsdev_host = malloc(ds->nfsdev_hostnamelen, M_NFSDSTATE,