svn commit: r329099 - in stable/11: lib/libstand sys/boot/common sys/boot/efi/include sys/boot/efi/libefi sys/boot/efi/loader sys/boot/forth sys/boot/geli sys/boot/i386/boot2 sys/boot/i386/btx/lib ...
Kyle Evans
kevans at FreeBSD.org
Sat Feb 10 04:37:45 UTC 2018
Author: kevans
Date: Sat Feb 10 04:37:44 2018
New Revision: 329099
URL: https://svnweb.freebsd.org/changeset/base/329099
Log:
MFC Loader Fixes 2017q1: r311458,r312237,r312314,r312374,r312947,r313042,
r313047,r313166,r313328,r313332,r313333,r313337,r313348,r313349,r313389,
r313442,r313451,r313575,r313645,r313710,r314114,r314213,r314275,r314945,
r314948,r315008,r315408,r315427,r315645,r315646,r315648,r315653,r315850,
r316064,r316078,r316079,r316100,r316104,r316111,r316112,r316171,r316279,
r316280,r316287,r316311,r316343,r316424,r316436
r311458: Use compiler driver to link BERI boot loaders
r312237: loader.efi: find_currdev() can leak memory
r312314: loader: move device path definitions to include/efidevp.h
r312374: loader: efi devpath api usage should be more aware of NULL pointers
r312947: Remove "-Xassembler -G0" from CFLAGS.
r313042: loader.efi environment related cleanups
r313047: loader: disk/part api needs to use uint64_t offsets
r313166: loader: libefi/env.c warnings in arm build
r313328: loader: Implement disk_ioctl() to support DIOCGSECTORSIZE and
DIOCGMEDIASIZE.
r313332: loader: bcache read ahead block count should take account the large
sectors
r313333: loader: Replace EFI part devices.
r313337: loader: 313329 missed ZFS guard in loader/main.c
r313348: loader: biosdisk fix for 2+TB disks
r313349: loader: disk io should not use alloca()
r313389: efipart is also using the '%S' printf format, add -Wno-format for
it.
r313442: loader: possible NULL pointer dereference in efipart.c
r313451: loader: possible NULL pointer dereference in bcache.c
r313575: makefs: make the buffer functions look exactly like the kernel ones
r313645: loader: implement MEDIA_FILEPATH_DP support in efipart
r313710: loader: cstyle fixes and DIOCGMEDIASIZE should use uint64_t
r314114: Use LDFLAGS with CC instead of _LDFLAGS.
r314213: Remove control+r handling from geliboot's pwgets()
r314275: Remove unused macro from common/drv.c.
r314945: Some style(9) fixes. No functional changes.
r314948: Try to extract the RFC1048 data from PXE.
r315008: r314948 seems to be missing a variable or two that will break
r315408: loader: remove open_disk cache
r315427: loader: biosdisk should report IO error from INT13
r315645: loader: disk_cleanup was left in userboot_disk.c
r315646: loader: pxe.h constants have wrong values
r315648: libstand: verify value provided by nfs.read_size
r315653: loader: verify the value from dhcp.interface-mtu and use snprintf
o set mtu
r315850: The original author abused Nd (one-line description, used by
makewhatis)
r316064: Fix build with path names with 'align' or 'nop' in them.
r316078: gpt*boot: Save a bit more memory when LOADER_NO_GELI_SUPPORT is
specified
r316079: Simply retire the sedification of the boot2.s file.
r316100: Remove -fno-guess-branch-probability and -fno-unit-at-a-time.
r316104: Use `NO_WCAST_ALIGN` instead of spelling it out as -Wno-cast-align
in CFLAGS
r316111: loader: move bios getsecs into time.c
r316112: loader: ls command should display file types properly
r316171: xfsread inlined uses more space, so remove the inline tag.
r316279: loader: efipart should check disk size from partition table
r316280: loader: simplify efi_zfs_probe and avoid double probing for zfs.
r316287: Remove OLD_NFSV2 from loader and libstand
r316311: Add explicit_bzero() to libstand, and switch GELIBoot to using it
r316343: Implement boot-time encryption key passing (keybuf)
r316424: Fix sparc64 build broken by r316343 and r316076
r316436: Restore EFI boot environment functionality broken in r313333
PR: 216940 217298 217935
Added:
stable/11/sys/boot/efi/libefi/wchar.c
- copied unchanged from r313042, head/sys/boot/efi/libefi/wchar.c
stable/11/sys/boot/geli/geliboot_internal.h
- copied unchanged from r316343, head/sys/boot/geli/geliboot_internal.h
stable/11/sys/crypto/intake.h
- copied unchanged from r316343, head/sys/crypto/intake.h
Modified:
stable/11/lib/libstand/Makefile
stable/11/lib/libstand/bootp.c
stable/11/lib/libstand/bootp.h
stable/11/lib/libstand/nfs.c
stable/11/lib/libstand/nfsv2.h
stable/11/lib/libstand/stand.h
stable/11/sys/boot/common/bcache.c
stable/11/sys/boot/common/bootstrap.h
stable/11/sys/boot/common/dev_net.c
stable/11/sys/boot/common/disk.c
stable/11/sys/boot/common/disk.h
stable/11/sys/boot/common/ls.c
stable/11/sys/boot/common/part.c
stable/11/sys/boot/common/part.h
stable/11/sys/boot/efi/include/efidevp.h
stable/11/sys/boot/efi/include/efilib.h
stable/11/sys/boot/efi/libefi/Makefile
stable/11/sys/boot/efi/libefi/devpath.c
stable/11/sys/boot/efi/libefi/efinet.c
stable/11/sys/boot/efi/libefi/efipart.c
stable/11/sys/boot/efi/libefi/env.c
stable/11/sys/boot/efi/loader/conf.c
stable/11/sys/boot/efi/loader/devicename.c
stable/11/sys/boot/efi/loader/main.c
stable/11/sys/boot/forth/beastie.4th.8
stable/11/sys/boot/forth/loader.4th
stable/11/sys/boot/geli/Makefile
stable/11/sys/boot/geli/geliboot.c
stable/11/sys/boot/geli/geliboot.h
stable/11/sys/boot/geli/geliboot_crypto.c
stable/11/sys/boot/geli/pwgets.c
stable/11/sys/boot/i386/boot2/Makefile
stable/11/sys/boot/i386/boot2/boot2.c
stable/11/sys/boot/i386/btx/lib/btxv86.h
stable/11/sys/boot/i386/common/bootargs.h
stable/11/sys/boot/i386/common/drv.c
stable/11/sys/boot/i386/gptboot/Makefile
stable/11/sys/boot/i386/gptboot/gptboot.c
stable/11/sys/boot/i386/gptzfsboot/Makefile
stable/11/sys/boot/i386/libi386/bioscd.c
stable/11/sys/boot/i386/libi386/biosdisk.c
stable/11/sys/boot/i386/libi386/bootinfo32.c
stable/11/sys/boot/i386/libi386/bootinfo64.c
stable/11/sys/boot/i386/libi386/pxe.c
stable/11/sys/boot/i386/libi386/pxe.h
stable/11/sys/boot/i386/libi386/time.c
stable/11/sys/boot/i386/loader/Makefile
stable/11/sys/boot/i386/loader/main.c
stable/11/sys/boot/i386/zfsboot/zfsboot.c
stable/11/sys/boot/mips/beri/boot2/Makefile
stable/11/sys/boot/mips/beri/common/common.ldscript
stable/11/sys/boot/mips/beri/loader/beri_disk_cfi.c
stable/11/sys/boot/mips/beri/loader/beri_disk_sdcard.c
stable/11/sys/boot/mips/beri/loader/loader.ldscript
stable/11/sys/boot/sparc64/loader/Makefile
stable/11/sys/boot/uboot/lib/disk.c
stable/11/sys/boot/usb/storage/umass_loader.c
stable/11/sys/boot/userboot/userboot/userboot_disk.c
stable/11/sys/boot/zfs/libzfs.h
stable/11/sys/boot/zfs/zfs.c
stable/11/sys/geom/eli/g_eli.c
stable/11/sys/geom/eli/g_eli.h
stable/11/sys/opencrypto/crypto.c
stable/11/sys/sys/linker.h
stable/11/usr.sbin/makefs/ffs.c
stable/11/usr.sbin/makefs/ffs/buf.c
stable/11/usr.sbin/makefs/ffs/buf.h
stable/11/usr.sbin/makefs/ffs/ffs_alloc.c
stable/11/usr.sbin/makefs/ffs/ffs_balloc.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/lib/libstand/Makefile
==============================================================================
--- stable/11/lib/libstand/Makefile Sat Feb 10 01:52:58 2018 (r329098)
+++ stable/11/lib/libstand/Makefile Sat Feb 10 04:37:44 2018 (r329099)
@@ -155,5 +155,9 @@ SRCS+= pkgfs.c
SRCS+= nandfs.c
.endif
+# explicit_bzero
+.PATH: ${SRCTOP}/sys/libkern
+SRCS+= explicit_bzero.c
+
.include <bsd.stand.mk>
.include <bsd.lib.mk>
Modified: stable/11/lib/libstand/bootp.c
==============================================================================
--- stable/11/lib/libstand/bootp.c Sat Feb 10 01:52:58 2018 (r329098)
+++ stable/11/lib/libstand/bootp.c Sat Feb 10 04:37:44 2018 (r329099)
@@ -39,6 +39,7 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
+#include <sys/limits.h>
#include <sys/endian.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -344,6 +345,17 @@ bad:
return (-1);
}
+int
+dhcp_try_rfc1048(u_char *cp, u_int len)
+{
+
+ expected_dhcpmsgtype = DHCPACK;
+ if (bcmp(vm_rfc1048, cp, sizeof(vm_rfc1048)) == 0) {
+ return (vend_rfc1048(cp, len));
+ }
+ return (-1);
+}
+
static int
vend_rfc1048(cp, len)
u_char *cp;
@@ -392,11 +404,29 @@ vend_rfc1048(cp, len)
strlcpy(hostname, val, sizeof(hostname));
}
if (tag == TAG_INTF_MTU) {
+ intf_mtu = 0;
if ((val = getenv("dhcp.interface-mtu")) != NULL) {
- intf_mtu = (u_int)strtoul(val, NULL, 0);
- } else {
- intf_mtu = be16dec(cp);
+ unsigned long tmp;
+ char *end;
+
+ errno = 0;
+ /*
+ * Do not allow MTU to exceed max IPv4 packet
+ * size, max value of 16-bit word.
+ */
+ tmp = strtoul(val, &end, 0);
+ if (errno != 0 ||
+ *val == '\0' || *end != '\0' ||
+ tmp > USHRT_MAX) {
+ printf("%s: bad value: \"%s\", "
+ "ignoring\n",
+ "dhcp.interface-mtu", val);
+ } else {
+ intf_mtu = (u_int)tmp;
+ }
}
+ if (intf_mtu <= 0)
+ intf_mtu = be16dec(cp);
}
#ifdef SUPPORT_DHCP
if (tag == TAG_DHCP_MSGTYPE) {
Modified: stable/11/lib/libstand/bootp.h
==============================================================================
--- stable/11/lib/libstand/bootp.h Sat Feb 10 01:52:58 2018 (r329098)
+++ stable/11/lib/libstand/bootp.h Sat Feb 10 04:37:44 2018 (r329099)
@@ -22,6 +22,8 @@
* $FreeBSD$
*/
+#ifndef _BOOTP_H_
+#define _BOOTP_H_
struct bootp {
unsigned char bp_op; /* packet opcode type */
@@ -145,3 +147,7 @@ struct cmu_vend {
/* v_flags values */
#define VF_SMASK 1 /* Subnet mask field contains valid data */
+
+int dhcp_try_rfc1048(u_char *cp, u_int len);
+
+#endif /* _BOOTP_H_ */
Modified: stable/11/lib/libstand/nfs.c
==============================================================================
--- stable/11/lib/libstand/nfs.c Sat Feb 10 01:52:58 2018 (r329098)
+++ stable/11/lib/libstand/nfs.c Sat Feb 10 04:37:44 2018 (r329099)
@@ -54,73 +54,6 @@ __FBSDID("$FreeBSD$");
#define NFSREAD_MIN_SIZE 1024
#define NFSREAD_MAX_SIZE 4096
-/* Define our own NFS attributes without NQNFS stuff. */
-#ifdef OLD_NFSV2
-struct nfsv2_fattrs {
- n_long fa_type;
- n_long fa_mode;
- n_long fa_nlink;
- n_long fa_uid;
- n_long fa_gid;
- n_long fa_size;
- n_long fa_blocksize;
- n_long fa_rdev;
- n_long fa_blocks;
- n_long fa_fsid;
- n_long fa_fileid;
- struct nfsv2_time fa_atime;
- struct nfsv2_time fa_mtime;
- struct nfsv2_time fa_ctime;
-};
-
-struct nfs_read_args {
- u_char fh[NFS_FHSIZE];
- n_long off;
- n_long len;
- n_long xxx; /* XXX what's this for? */
-};
-
-/* Data part of nfs rpc reply (also the largest thing we receive) */
-struct nfs_read_repl {
- n_long errno;
- struct nfsv2_fattrs fa;
- n_long count;
- u_char data[NFSREAD_MAX_SIZE];
-};
-
-#ifndef NFS_NOSYMLINK
-struct nfs_readlnk_repl {
- n_long errno;
- n_long len;
- char path[NFS_MAXPATHLEN];
-};
-#endif
-
-struct nfs_readdir_args {
- u_char fh[NFS_FHSIZE];
- n_long cookie;
- n_long count;
-};
-
-struct nfs_readdir_data {
- n_long fileid;
- n_long len;
- char name[0];
-};
-
-struct nfs_readdir_off {
- n_long cookie;
- n_long follows;
-};
-
-struct nfs_iodesc {
- struct iodesc *iodesc;
- off_t off;
- u_char fh[NFS_FHSIZE];
- struct nfsv2_fattrs fa; /* all in network order */
-};
-#else /* !OLD_NFSV2 */
-
/* NFSv3 definitions */
#define NFS_V3MAXFHSIZE 64
#define NFS_VER3 3
@@ -185,7 +118,6 @@ struct nfs_iodesc {
struct nfsv3_fattrs fa; /* all in network order */
uint64_t cookie;
};
-#endif /* OLD_NFSV2 */
/*
* XXX interactions with tftp? See nfswrapper.c for a confusing
@@ -214,622 +146,39 @@ struct fs_ops nfs_fsops = {
static int nfs_read_size = NFSREAD_MIN_SIZE;
-#ifdef OLD_NFSV2
/*
- * Fetch the root file handle (call mount daemon)
- * Return zero or error number.
+ * Improve boot performance over NFS
*/
-int
-nfs_getrootfh(struct iodesc *d, char *path, u_char *fhp)
+static void
+set_nfs_read_size(void)
{
- int len;
- struct args {
- n_long len;
- char path[FNAME_SIZE];
- } *args;
- struct repl {
- n_long errno;
- u_char fh[NFS_FHSIZE];
- } *repl;
- struct {
- n_long h[RPC_HEADER_WORDS];
- struct args d;
- } sdata;
- struct {
- n_long h[RPC_HEADER_WORDS];
- struct repl d;
- } rdata;
- size_t cc;
+ char *env, *end;
+ char buf[10];
-#ifdef NFS_DEBUG
- if (debug)
- printf("nfs_getrootfh: %s\n", path);
-#endif
-
- args = &sdata.d;
- repl = &rdata.d;
-
- bzero(args, sizeof(*args));
- len = strlen(path);
- if (len > sizeof(args->path))
- len = sizeof(args->path);
- args->len = htonl(len);
- bcopy(path, args->path, len);
- len = 4 + roundup(len, 4);
-
- cc = rpc_call(d, RPCPROG_MNT, RPCMNT_VER1, RPCMNT_MOUNT,
- args, len, repl, sizeof(*repl));
- if (cc == -1) {
- /* errno was set by rpc_call */
- return (errno);
+ if ((env = getenv("nfs.read_size")) != NULL) {
+ errno = 0;
+ nfs_read_size = (int)strtol(env, &end, 0);
+ if (errno != 0 || *env == '\0' || *end != '\0') {
+ printf("%s: bad value: \"%s\", defaulting to %d\n",
+ "nfs.read_size", env, NFSREAD_MIN_SIZE);
+ nfs_read_size = NFSREAD_MIN_SIZE;
+ }
}
- if (cc < 4)
- return (EBADRPC);
- if (repl->errno)
- return (ntohl(repl->errno));
- bcopy(repl->fh, fhp, sizeof(repl->fh));
-
- /*
- * Improve boot performance over NFS
- */
- if (getenv("nfs.read_size") != NULL)
- nfs_read_size = strtol(getenv("nfs.read_size"), NULL, 0);
- if (nfs_read_size < NFSREAD_MIN_SIZE)
+ if (nfs_read_size < NFSREAD_MIN_SIZE) {
+ printf("%s: bad value: \"%d\", defaulting to %d\n",
+ "nfs.read_size", nfs_read_size, NFSREAD_MIN_SIZE);
nfs_read_size = NFSREAD_MIN_SIZE;
- if (nfs_read_size > NFSREAD_MAX_SIZE)
+ }
+ if (nfs_read_size > NFSREAD_MAX_SIZE) {
+ printf("%s: bad value: \"%d\", defaulting to %d\n",
+ "nfs.read_size", nfs_read_size, NFSREAD_MIN_SIZE);
nfs_read_size = NFSREAD_MAX_SIZE;
-
- return (0);
-}
-
-/*
- * Lookup a file. Store handle and attributes.
- * Return zero or error number.
- */
-int
-nfs_lookupfh(struct nfs_iodesc *d, const char *name, struct nfs_iodesc *newfd)
-{
- int len, rlen;
- struct args {
- u_char fh[NFS_FHSIZE];
- n_long len;
- char name[FNAME_SIZE];
- } *args;
- struct repl {
- n_long errno;
- u_char fh[NFS_FHSIZE];
- struct nfsv2_fattrs fa;
- } *repl;
- struct {
- n_long h[RPC_HEADER_WORDS];
- struct args d;
- } sdata;
- struct {
- n_long h[RPC_HEADER_WORDS];
- struct repl d;
- } rdata;
- ssize_t cc;
-
-#ifdef NFS_DEBUG
- if (debug)
- printf("lookupfh: called\n");
-#endif
-
- args = &sdata.d;
- repl = &rdata.d;
-
- bzero(args, sizeof(*args));
- bcopy(d->fh, args->fh, sizeof(args->fh));
- len = strlen(name);
- if (len > sizeof(args->name))
- len = sizeof(args->name);
- bcopy(name, args->name, len);
- args->len = htonl(len);
- len = 4 + roundup(len, 4);
- len += NFS_FHSIZE;
-
- rlen = sizeof(*repl);
-
- cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER2, NFSPROC_LOOKUP,
- args, len, repl, rlen);
- if (cc == -1)
- return (errno); /* XXX - from rpc_call */
- if (cc < 4)
- return (EIO);
- if (repl->errno) {
- /* saerrno.h now matches NFS error numbers. */
- return (ntohl(repl->errno));
}
- bcopy( repl->fh, &newfd->fh, sizeof(newfd->fh));
- bcopy(&repl->fa, &newfd->fa, sizeof(newfd->fa));
- return (0);
+ snprintf(buf, sizeof (buf), "%d", nfs_read_size);
+ setenv("nfs.read_size", buf, 1);
}
-#ifndef NFS_NOSYMLINK
/*
- * Get the destination of a symbolic link.
- */
-int
-nfs_readlink(struct nfs_iodesc *d, char *buf)
-{
- struct {
- n_long h[RPC_HEADER_WORDS];
- u_char fh[NFS_FHSIZE];
- } sdata;
- struct {
- n_long h[RPC_HEADER_WORDS];
- struct nfs_readlnk_repl d;
- } rdata;
- ssize_t cc;
-
-#ifdef NFS_DEBUG
- if (debug)
- printf("readlink: called\n");
-#endif
-
- bcopy(d->fh, sdata.fh, NFS_FHSIZE);
- cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER2, NFSPROC_READLINK,
- sdata.fh, NFS_FHSIZE,
- &rdata.d, sizeof(rdata.d));
- if (cc == -1)
- return (errno);
-
- if (cc < 4)
- return (EIO);
-
- if (rdata.d.errno)
- return (ntohl(rdata.d.errno));
-
- rdata.d.len = ntohl(rdata.d.len);
- if (rdata.d.len > NFS_MAXPATHLEN)
- return (ENAMETOOLONG);
-
- bcopy(rdata.d.path, buf, rdata.d.len);
- buf[rdata.d.len] = 0;
- return (0);
-}
-#endif
-
-/*
- * Read data from a file.
- * Return transfer count or -1 (and set errno)
- */
-ssize_t
-nfs_readdata(struct nfs_iodesc *d, off_t off, void *addr, size_t len)
-{
- struct nfs_read_args *args;
- struct nfs_read_repl *repl;
- struct {
- n_long h[RPC_HEADER_WORDS];
- struct nfs_read_args d;
- } sdata;
- struct {
- n_long h[RPC_HEADER_WORDS];
- struct nfs_read_repl d;
- } rdata;
- size_t cc;
- long x;
- int hlen, rlen;
-
- args = &sdata.d;
- repl = &rdata.d;
-
- bcopy(d->fh, args->fh, NFS_FHSIZE);
- args->off = htonl((n_long)off);
- if (len > nfs_read_size)
- len = nfs_read_size;
- args->len = htonl((n_long)len);
- args->xxx = htonl((n_long)0);
- hlen = offsetof(struct nfs_read_rpl, data[0]);
-
- cc = rpc_call(d->iodesc, NFS_PROG, NFS_VER2, NFSPROC_READ,
- args, sizeof(*args),
- repl, sizeof(*repl));
- if (cc == -1) {
- /* errno was already set by rpc_call */
- return (-1);
- }
- if (cc < hlen) {
- errno = EBADRPC;
- return (-1);
- }
- if (repl->errno) {
- errno = ntohl(repl->errno);
- return (-1);
- }
- rlen = cc - hlen;
- x = ntohl(repl->count);
- if (rlen < x) {
- printf("nfsread: short packet, %d < %ld\n", rlen, x);
- errno = EBADRPC;
- return(-1);
- }
- bcopy(repl->data, addr, x);
- return (x);
-}
-
-/*
- * Open a file.
- * return zero or error number
- */
-int
-nfs_open(const char *upath, struct open_file *f)
-{
- struct iodesc *desc;
- struct nfs_iodesc *currfd;
- char buf[2 * NFS_FHSIZE + 3];
- u_char *fh;
- char *cp;
- int i;
-#ifndef NFS_NOSYMLINK
- struct nfs_iodesc *newfd;
- struct nfsv2_fattrs *fa;
- char *ncp;
- int c;
- char namebuf[NFS_MAXPATHLEN + 1];
- char linkbuf[NFS_MAXPATHLEN + 1];
- int nlinks = 0;
-#endif
- int error;
- char *path;
-
- if (netproto != NET_NFS)
- return (EINVAL);
-
-#ifdef NFS_DEBUG
- if (debug)
- printf("nfs_open: %s (rootpath=%s)\n", upath, rootpath);
-#endif
- if (!rootpath[0]) {
- printf("no rootpath, no nfs\n");
- return (ENXIO);
- }
-
- /*
- * This is silly - we should look at dv_type but that value is
- * arch dependant and we can't use it here.
- */
-#ifndef __i386__
- if (strcmp(f->f_dev->dv_name, "net") != 0)
- return(EINVAL);
-#else
- if (strcmp(f->f_dev->dv_name, "pxe") != 0)
- return(EINVAL);
-#endif
-
- if (!(desc = socktodesc(*(int *)(f->f_devdata))))
- return(EINVAL);
-
- /* Bind to a reserved port. */
- desc->myport = htons(--rpc_port);
- desc->destip = rootip;
- if ((error = nfs_getrootfh(desc, rootpath, nfs_root_node.fh)))
- return (error);
- nfs_root_node.fa.fa_type = htonl(NFDIR);
- nfs_root_node.fa.fa_mode = htonl(0755);
- nfs_root_node.fa.fa_nlink = htonl(2);
- nfs_root_node.iodesc = desc;
-
- fh = &nfs_root_node.fh[0];
- buf[0] = 'X';
- cp = &buf[1];
- for (i = 0; i < NFS_FHSIZE; i++, cp += 2)
- sprintf(cp, "%02x", fh[i]);
- sprintf(cp, "X");
- setenv("boot.nfsroot.server", inet_ntoa(rootip), 1);
- setenv("boot.nfsroot.path", rootpath, 1);
- setenv("boot.nfsroot.nfshandle", buf, 1);
-
- /* Allocate file system specific data structure */
- currfd = malloc(sizeof(*newfd));
- if (currfd == NULL) {
- error = ENOMEM;
- goto out;
- }
-
-#ifndef NFS_NOSYMLINK
- bcopy(&nfs_root_node, currfd, sizeof(*currfd));
- newfd = NULL;
-
- cp = path = strdup(upath);
- if (path == NULL) {
- error = ENOMEM;
- goto out;
- }
- while (*cp) {
- /*
- * Remove extra separators
- */
- while (*cp == '/')
- cp++;
-
- if (*cp == '\0')
- break;
- /*
- * Check that current node is a directory.
- */
- if (currfd->fa.fa_type != htonl(NFDIR)) {
- error = ENOTDIR;
- goto out;
- }
-
- /* allocate file system specific data structure */
- newfd = malloc(sizeof(*newfd));
- newfd->iodesc = currfd->iodesc;
-
- /*
- * Get next component of path name.
- */
- {
- int len = 0;
-
- ncp = cp;
- while ((c = *cp) != '\0' && c != '/') {
- if (++len > NFS_MAXNAMLEN) {
- error = ENOENT;
- goto out;
- }
- cp++;
- }
- *cp = '\0';
- }
-
- /* lookup a file handle */
- error = nfs_lookupfh(currfd, ncp, newfd);
- *cp = c;
- if (error)
- goto out;
-
- /*
- * Check for symbolic link
- */
- if (newfd->fa.fa_type == htonl(NFLNK)) {
- int link_len, len;
-
- error = nfs_readlink(newfd, linkbuf);
- if (error)
- goto out;
-
- link_len = strlen(linkbuf);
- len = strlen(cp);
-
- if (link_len + len > MAXPATHLEN
- || ++nlinks > MAXSYMLINKS) {
- error = ENOENT;
- goto out;
- }
-
- bcopy(cp, &namebuf[link_len], len + 1);
- bcopy(linkbuf, namebuf, link_len);
-
- /*
- * If absolute pathname, restart at root.
- * If relative pathname, restart at parent directory.
- */
- cp = namebuf;
- if (*cp == '/')
- bcopy(&nfs_root_node, currfd, sizeof(*currfd));
-
- free(newfd);
- newfd = NULL;
-
- continue;
- }
-
- free(currfd);
- currfd = newfd;
- newfd = NULL;
- }
-
- error = 0;
-
-out:
- free(newfd);
- free(path);
-#else
- currfd->iodesc = desc;
-
- error = nfs_lookupfh(&nfs_root_node, upath, currfd);
-#endif
- if (!error) {
- currfd->off = 0;
- f->f_fsdata = (void *)currfd;
- return (0);
- }
-
-#ifdef NFS_DEBUG
- if (debug)
- printf("nfs_open: %s lookupfh failed: %s\n",
- path, strerror(error));
-#endif
- free(currfd);
-
- return (error);
-}
-
-int
-nfs_close(struct open_file *f)
-{
- struct nfs_iodesc *fp = (struct nfs_iodesc *)f->f_fsdata;
-
-#ifdef NFS_DEBUG
- if (debug)
- printf("nfs_close: fp=0x%lx\n", (u_long)fp);
-#endif
-
- if (fp)
- free(fp);
- f->f_fsdata = (void *)0;
-
- return (0);
-}
-
-/*
- * read a portion of a file
- */
-int
-nfs_read(struct open_file *f, void *buf, size_t size, size_t *resid)
-{
- struct nfs_iodesc *fp = (struct nfs_iodesc *)f->f_fsdata;
- ssize_t cc;
- char *addr = buf;
-
-#ifdef NFS_DEBUG
- if (debug)
- printf("nfs_read: size=%lu off=%d\n", (u_long)size,
- (int)fp->off);
-#endif
- while ((int)size > 0) {
- twiddle(16);
- cc = nfs_readdata(fp, fp->off, (void *)addr, size);
- /* XXX maybe should retry on certain errors */
- if (cc == -1) {
-#ifdef NFS_DEBUG
- if (debug)
- printf("nfs_read: read: %s", strerror(errno));
-#endif
- return (errno); /* XXX - from nfs_readdata */
- }
- if (cc == 0) {
-#ifdef NFS_DEBUG
- if (debug)
- printf("nfs_read: hit EOF unexpectantly");
-#endif
- goto ret;
- }
- fp->off += cc;
- addr += cc;
- size -= cc;
- }
-ret:
- if (resid)
- *resid = size;
-
- return (0);
-}
-
-/*
- * Not implemented.
- */
-int
-nfs_write(struct open_file *f, void *buf, size_t size, size_t *resid)
-{
- return (EROFS);
-}
-
-off_t
-nfs_seek(struct open_file *f, off_t offset, int where)
-{
- struct nfs_iodesc *d = (struct nfs_iodesc *)f->f_fsdata;
- n_long size = ntohl(d->fa.fa_size);
-
- switch (where) {
- case SEEK_SET:
- d->off = offset;
- break;
- case SEEK_CUR:
- d->off += offset;
- break;
- case SEEK_END:
- d->off = size - offset;
- break;
- default:
- errno = EINVAL;
- return (-1);
- }
-
- return (d->off);
-}
-
-/* NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5 */
-int nfs_stat_types[8] = {
- 0, S_IFREG, S_IFDIR, S_IFBLK, S_IFCHR, S_IFLNK, 0 };
-
-int
-nfs_stat(struct open_file *f, struct stat *sb)
-{
- struct nfs_iodesc *fp = (struct nfs_iodesc *)f->f_fsdata;
- n_long ftype, mode;
-
- ftype = ntohl(fp->fa.fa_type);
- mode = ntohl(fp->fa.fa_mode);
- mode |= nfs_stat_types[ftype & 7];
-
- sb->st_mode = mode;
- sb->st_nlink = ntohl(fp->fa.fa_nlink);
- sb->st_uid = ntohl(fp->fa.fa_uid);
- sb->st_gid = ntohl(fp->fa.fa_gid);
- sb->st_size = ntohl(fp->fa.fa_size);
-
- return (0);
-}
-
-static int
-nfs_readdir(struct open_file *f, struct dirent *d)
-{
- struct nfs_iodesc *fp = (struct nfs_iodesc *)f->f_fsdata;
- struct nfs_readdir_args *args;
- struct nfs_readdir_data *rd;
- struct nfs_readdir_off *roff = NULL;
- static char *buf;
- static struct nfs_iodesc *pfp = NULL;
- static n_long cookie = 0;
- size_t cc;
- n_long eof;
-
- struct {
- n_long h[RPC_HEADER_WORDS];
- struct nfs_readdir_args d;
- } sdata;
- static struct {
- n_long h[RPC_HEADER_WORDS];
- u_char d[NFS_READDIRSIZE];
- } rdata;
-
- if (fp != pfp || fp->off != cookie) {
- pfp = NULL;
- refill:
- args = &sdata.d;
- bzero(args, sizeof(*args));
-
- bcopy(fp->fh, args->fh, NFS_FHSIZE);
- args->cookie = htonl(fp->off);
- args->count = htonl(NFS_READDIRSIZE);
-
- cc = rpc_call(fp->iodesc, NFS_PROG, NFS_VER2, NFSPROC_READDIR,
- args, sizeof(*args),
- rdata.d, sizeof(rdata.d));
- buf = rdata.d;
- roff = (struct nfs_readdir_off *)buf;
- if (ntohl(roff->cookie) != 0)
- return EIO;
- pfp = fp;
- cookie = fp->off;
- }
- roff = (struct nfs_readdir_off *)buf;
-
- if (ntohl(roff->follows) == 0) {
- eof = ntohl((roff+1)->cookie);
- if (eof) {
- cookie = 0;
- return ENOENT;
- }
- goto refill;
- }
-
- buf += sizeof(struct nfs_readdir_off);
- rd = (struct nfs_readdir_data *)buf;
- d->d_namlen = ntohl(rd->len);
- bcopy(rd->name, d->d_name, d->d_namlen);
- d->d_name[d->d_namlen] = '\0';
-
- buf += (sizeof(struct nfs_readdir_data) + roundup(htonl(rd->len),4));
- roff = (struct nfs_readdir_off *)buf;
- fp->off = cookie = ntohl(roff->cookie);
- return 0;
-}
-#else /* !OLD_NFSV2 */
-/*
* Fetch the root file handle (call mount daemon)
* Return zero or error number.
*/
@@ -885,6 +234,8 @@ nfs_getrootfh(struct iodesc *d, char *path, uint32_t *
return (ntohl(repl->errno));
*fhlenp = ntohl(repl->fhsize);
bcopy(repl->fh, fhp, *fhlenp);
+
+ set_nfs_read_size();
return (0);
}
@@ -1492,4 +843,3 @@ nfs_readdir(struct open_file *f, struct dirent *d)
buf = (u_char *)&rent->nameplus[pos];
return (0);
}
-#endif /* OLD_NFSV2 */
Modified: stable/11/lib/libstand/nfsv2.h
==============================================================================
--- stable/11/lib/libstand/nfsv2.h Sat Feb 10 01:52:58 2018 (r329098)
+++ stable/11/lib/libstand/nfsv2.h Sat Feb 10 04:37:44 2018 (r329099)
@@ -119,46 +119,3 @@ typedef enum {
NFCHR=4,
NFLNK=5
} nfstype;
-
-/* Structs for common parts of the rpc's */
-struct nfsv2_time {
- n_long nfs_sec;
- n_long nfs_usec;
-};
-
-/*
- * File attributes and setable attributes.
- */
-struct nfsv2_fattr {
- n_long fa_type;
- n_long fa_mode;
- n_long fa_nlink;
- n_long fa_uid;
- n_long fa_gid;
- n_long fa_size;
- n_long fa_blocksize;
- n_long fa_rdev;
- n_long fa_blocks;
- n_long fa_fsid;
- n_long fa_fileid;
- struct nfsv2_time fa_atime;
- struct nfsv2_time fa_mtime;
- struct nfsv2_time fa_ctime;
-};
-
-struct nfsv2_sattr {
- n_long sa_mode;
- n_long sa_uid;
- n_long sa_gid;
- n_long sa_size;
- struct nfsv2_time sa_atime;
- struct nfsv2_time sa_mtime;
-};
-
-struct nfsv2_statfs {
- n_long sf_tsize;
- n_long sf_bsize;
- n_long sf_blocks;
- n_long sf_bfree;
- n_long sf_bavail;
-};
Modified: stable/11/lib/libstand/stand.h
==============================================================================
--- stable/11/lib/libstand/stand.h Sat Feb 10 01:52:58 2018 (r329098)
+++ stable/11/lib/libstand/stand.h Sat Feb 10 04:37:44 2018 (r329099)
@@ -168,6 +168,7 @@ struct devdesc
#define DEVT_NET 2
#define DEVT_CD 3
#define DEVT_ZFS 4
+#define DEVT_FD 5
int d_unit;
void *d_opendata;
};
Modified: stable/11/sys/boot/common/bcache.c
==============================================================================
--- stable/11/sys/boot/common/bcache.c Sat Feb 10 01:52:58 2018 (r329098)
+++ stable/11/sys/boot/common/bcache.c Sat Feb 10 04:37:44 2018 (r329099)
@@ -64,7 +64,7 @@ struct bcachectl
struct bcache {
struct bcachectl *bcache_ctl;
caddr_t bcache_data;
- u_int bcache_nblks;
+ size_t bcache_nblks;
size_t ra;
};
@@ -86,6 +86,7 @@ static u_int bcache_rablks;
((bc)->bcache_ctl[BHASH((bc), (blkno))].bc_blkno != (blkno))
#define BCACHE_READAHEAD 256
#define BCACHE_MINREADAHEAD 32
+#define BCACHE_MARKER 0xdeadbeef
static void bcache_invalidate(struct bcache *bc, daddr_t blkno);
static void bcache_insert(struct bcache *bc, daddr_t blkno);
@@ -95,7 +96,7 @@ static void bcache_free_instance(struct bcache *bc);
* Initialise the cache for (nblks) of (bsize).
*/
void
-bcache_init(u_int nblks, size_t bsize)
+bcache_init(size_t nblks, size_t bsize)
{
/* set up control data */
bcache_total_nblks = nblks;
@@ -122,6 +123,7 @@ bcache_allocate(void)
u_int i;
struct bcache *bc = malloc(sizeof (struct bcache));
int disks = bcache_numdev;
+ uint32_t *marker;
if (disks == 0)
disks = 1; /* safe guard */
@@ -140,11 +142,13 @@ bcache_allocate(void)
bc->bcache_nblks = bcache_total_nblks >> i;
bcache_unit_nblks = bc->bcache_nblks;
- bc->bcache_data = malloc(bc->bcache_nblks * bcache_blksize);
+ bc->bcache_data = malloc(bc->bcache_nblks * bcache_blksize +
+ sizeof(uint32_t));
if (bc->bcache_data == NULL) {
/* dont error out yet. fall back to 32 blocks and try again */
bc->bcache_nblks = 32;
- bc->bcache_data = malloc(bc->bcache_nblks * bcache_blksize);
+ bc->bcache_data = malloc(bc->bcache_nblks * bcache_blksize +
+ sizeof(uint32_t));
}
bc->bcache_ctl = malloc(bc->bcache_nblks * sizeof(struct bcachectl));
@@ -152,8 +156,11 @@ bcache_allocate(void)
if ((bc->bcache_data == NULL) || (bc->bcache_ctl == NULL)) {
bcache_free_instance(bc);
errno = ENOMEM;
- return(NULL);
+ return (NULL);
}
+ /* Insert cache end marker. */
+ marker = (uint32_t *)(bc->bcache_data + bc->bcache_nblks * bcache_blksize);
+ *marker = BCACHE_MARKER;
/* Flush the cache */
for (i = 0; i < bc->bcache_nblks; i++) {
@@ -215,12 +222,15 @@ read_strategy(void *devdata, int rw, daddr_t blk, size
int result;
daddr_t p_blk;
caddr_t p_buf;
+ uint32_t *marker;
if (bc == NULL) {
errno = ENODEV;
return (-1);
}
+ marker = (uint32_t *)(bc->bcache_data + bc->bcache_nblks * bcache_blksize);
+
if (rsize != NULL)
*rsize = 0;
@@ -261,9 +271,34 @@ read_strategy(void *devdata, int rw, daddr_t blk, size
p_size = MIN(r_size, nblk - i); /* read at least those blocks */
+ /*
+ * The read ahead size setup.
+ * While the read ahead can save us IO, it also can complicate things:
+ * 1. We do not want to read ahead by wrapping around the
+ * bcache end - this would complicate the cache management.
+ * 2. We are using bc->ra as dynamic hint for read ahead size,
+ * detected cache hits will increase the read-ahead block count, and
+ * misses will decrease, see the code above.
+ * 3. The bcache is sized by 512B blocks, however, the underlying device
+ * may have a larger sector size, and we should perform the IO by
+ * taking into account these larger sector sizes. We could solve this by
+ * passing the sector size to bcache_allocate(), or by using ioctl(), but
+ * in this version we are using the constant, 16 blocks, and are rounding
+ * read ahead block count down to multiple of 16.
+ * Using the constant has two reasons, we are not entirely sure if the
+ * BIOS disk interface is providing the correct value for sector size.
+ * And secondly, this way we get the most conservative setup for the ra.
+ *
+ * The selection of multiple of 16 blocks (8KB) is quite arbitrary, however,
+ * we want to cover CDs (2K) and 4K disks.
+ * bcache_allocate() will always fall back to a minimum of 32 blocks.
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-stable
mailing list