Am Wed, 11 Aug 2021 21:13:55 GMT
Toomas Soome <tso...@freebsd.org> schrieb:

> The branch main has been updated by tsoome:
> 
> URL: 
> https://cgit.FreeBSD.org/src/commit/?id=97cbd5e722389a575e820c4e03f38053308f08ea
> 
> commit 97cbd5e722389a575e820c4e03f38053308f08ea
> Author:     Toomas Soome <tso...@freebsd.org>
> AuthorDate: 2021-07-31 08:09:48 +0000
> Commit:     Toomas Soome <tso...@freebsd.org>
> CommitDate: 2021-08-10 18:54:32 +0000
> 
>     loader: open file list should be dynamic
>     
>     Summary:
>     Open file list is currently created as statically allocated array (64 
> items).
>     Once this array is filled up, loader will not be able to operate with 
> files.
>     In most cases, this mechanism is good enough, but the problem appears, 
> when
>     we have many disks with zfs pool(s). In current loader implementation, all
>     discovered zfs pool configurations are kept in memory and disk devices 
> open -
>     consuming the open file array. Rewrite the open file mechanism to use
>     dynamically allocated list.
>     
>     Reviewed by:    imp
>     MFC after:      2 weeks
>     Differential Revision: https://reviews.freebsd.org/D31364
> ---
>  stand/libsa/close.c    |  33 +++++++++----
>  stand/libsa/closeall.c |  58 ++++++-----------------
>  stand/libsa/fstat.c    |   9 ++--
>  stand/libsa/ioctl.c    |  22 ++++-----
>  stand/libsa/iodesc.h   |   2 +
>  stand/libsa/lseek.c    |   5 +-
>  stand/libsa/net.h      |   2 -
>  stand/libsa/netif.c    | 122 
> +++++++++++++++++++++++++++++++++++++++----------
>  stand/libsa/open.c     |  66 ++++++++++++++++++++++----
>  stand/libsa/read.c     |   5 +-
>  stand/libsa/readdir.c  |   5 +-
>  stand/libsa/stand.h    |   8 +++-
>  stand/libsa/write.c    |   5 +-
>  13 files changed, 227 insertions(+), 115 deletions(-)
> 
> diff --git a/stand/libsa/close.c b/stand/libsa/close.c
> index d8f62fef6198..a177eb85eb3a 100644
> --- a/stand/libsa/close.c
> +++ b/stand/libsa/close.c
> @@ -68,23 +68,38 @@ __FBSDID("$FreeBSD$");
>  int
>  close(int fd)
>  {
> -     struct open_file *f = &files[fd];
> +     struct open_file *f, *last;
>       int err1 = 0, err2 = 0;
>  
> -     if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
> +     f = fd2open_file(fd);
> +     if (f == NULL) {
>               errno = EBADF;
>               return (-1);
>       }
>       free(f->f_rabuf);
>       f->f_rabuf = NULL;
>  
> -     if (!(f->f_flags & F_RAW) && f->f_ops)
> -             err1 = (f->f_ops->fo_close)(f);
> -     if (!(f->f_flags & F_NODEV) && f->f_dev)
> -             err2 = (f->f_dev->dv_close)(f);
> -     if (f->f_devdata != NULL)
> -             devclose(f);
> -     f->f_flags = 0;
> +     if (f->f_flags != 0) {
> +             if (!(f->f_flags & F_RAW) && f->f_ops)
> +                     err1 = (f->f_ops->fo_close)(f);
> +             if (!(f->f_flags & F_NODEV) && f->f_dev)
> +                     err2 = (f->f_dev->dv_close)(f);
> +             if (f->f_devdata != NULL)
> +                     devclose(f);
> +             f->f_flags = 0;
> +     } else {
> +             /* Attempt to close already closed file. */
> +             err1 = EBADF;
> +     }
> +
> +     /* free unused entries from tail. */
> +     TAILQ_FOREACH_REVERSE_SAFE(last, &files, file_list, f_link, f) {
> +             if (last->f_flags != 0)
> +                     break;
> +             TAILQ_REMOVE(&files, last, f_link);
> +             free(last);
> +     }
> +
>       if (err1) {
>               errno = err1;
>               return (-1);
> diff --git a/stand/libsa/closeall.c b/stand/libsa/closeall.c
> index 9693130ebf9b..92c6955cf5da 100644
> --- a/stand/libsa/closeall.c
> +++ b/stand/libsa/closeall.c
> @@ -1,11 +1,7 @@
> -/*   $NetBSD: closeall.c,v 1.1 1996/01/13 22:25:36 leo Exp $ */
> -
>  /*-
> - * Copyright (c) 1993
> - *   The Regents of the University of California.  All rights reserved.
> + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
>   *
> - * This code is derived from software contributed to Berkeley by
> - * The Mach Operating System project at Carnegie-Mellon University.
> + * Copyright (c) 2021 Toomas Soome <tso...@me.com>
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -15,14 +11,11 @@
>   * 2. Redistributions in binary form must reproduce the above copyright
>   *    notice, this list of conditions and the following disclaimer in the
>   *    documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - *    may be used to endorse or promote products derived from this software
> - *    without specific prior written permission.
>   *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
>   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
>   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> + * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
>   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
>   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
>   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> @@ -31,33 +24,6 @@
>   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
>   * SUCH DAMAGE.
>   *
> - *   @(#)close.c     8.1 (Berkeley) 6/11/93
> - *  
> - *
> - * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
> - * All Rights Reserved.
> - *
> - * Author: Alessandro Forin
> - * 
> - * Permission to use, copy, modify and distribute this software and its
> - * documentation is hereby granted, provided that both the copyright
> - * notice and this permission notice appear in all copies of the
> - * software, derivative works or modified versions, and any portions
> - * thereof, and that both notices appear in supporting documentation.
> - * 
> - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
> - * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
> - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
> - * 
> - * Carnegie Mellon requests users of this software to return to
> - * 
> - *  Software Distribution Coordinator  or  software.distribut...@cs.cmu.edu
> - *  School of Computer Science
> - *  Carnegie Mellon University
> - *  Pittsburgh PA 15213-3890
> - * 
> - * any improvements or extensions that they make and grant Carnegie the
> - * rights to redistribute these changes.
>   */
>  
>  #include <sys/cdefs.h>
> @@ -66,11 +32,17 @@ __FBSDID("$FreeBSD$");
>  #include "stand.h"
>  
>  void
> -closeall()
> +closeall(void)
>  {
> -     int i;
> +     struct open_file *f;
>  
> -        for (i = 0; i < SOPEN_MAX; i++)
> -            if (files[i].f_flags != 0)
> -                (void)close(i);
> +     /*
> +      * Pick up last entry and close it, this will also trigger
> +      * the removal of this entry, and we end up with empty list.
> +      */
> +     while ((f = TAILQ_LAST(&files, file_list)) != NULL) {
> +             (void)close(f->f_id);
> +     }
> +     /* reset errno from close() */
> +     errno = 0;
>  }
> diff --git a/stand/libsa/fstat.c b/stand/libsa/fstat.c
> index cb2df8cbf0ac..47893416e0bf 100644
> --- a/stand/libsa/fstat.c
> +++ b/stand/libsa/fstat.c
> @@ -37,13 +37,12 @@ __FBSDID("$FreeBSD$");
>  #include "stand.h"
>  
>  int
> -fstat(fd, sb)
> -     int fd;
> -     struct stat *sb;
> +fstat(int fd, struct stat *sb)
>  {
> -     struct open_file *f = &files[fd];
> +     struct open_file *f;
>  
> -     if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
> +     f = fd2open_file(fd);
> +     if (f == NULL || f->f_flags == 0) {
>               errno = EBADF;
>               return (-1);
>       }
> diff --git a/stand/libsa/ioctl.c b/stand/libsa/ioctl.c
> index 807b308e5e50..7363236ada0e 100644
> --- a/stand/libsa/ioctl.c
> +++ b/stand/libsa/ioctl.c
> @@ -32,30 +32,30 @@
>   * SUCH DAMAGE.
>   *
>   *   @(#)ioctl.c     8.1 (Berkeley) 6/11/93
> - *  
> + *
>   *
>   * Copyright (c) 1989, 1990, 1991 Carnegie Mellon University
>   * All Rights Reserved.
>   *
>   * Author: Alessandro Forin
> - * 
> + *
>   * Permission to use, copy, modify and distribute this software and its
>   * documentation is hereby granted, provided that both the copyright
>   * notice and this permission notice appear in all copies of the
>   * software, derivative works or modified versions, and any portions
>   * thereof, and that both notices appear in supporting documentation.
> - * 
> + *
>   * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
>   * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
>   * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
> - * 
> + *
>   * Carnegie Mellon requests users of this software to return to
> - * 
> + *
>   *  Software Distribution Coordinator  or  software.distribut...@cs.cmu.edu
>   *  School of Computer Science
>   *  Carnegie Mellon University
>   *  Pittsburgh PA 15213-3890
> - * 
> + *
>   * any improvements or extensions that they make and grant Carnegie the
>   * rights to redistribute these changes.
>   */
> @@ -66,14 +66,12 @@ __FBSDID("$FreeBSD$");
>  #include "stand.h"
>  
>  int
> -ioctl(fd, cmd, arg)
> -     int fd;
> -     u_long cmd;
> -     char *arg;
> +ioctl(int fd, u_long cmd, char *arg)
>  {
> -     struct open_file *f = &files[fd];
> +     struct open_file *f;
>  
> -     if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
> +     f = fd2open_file(fd);
> +     if (f == NULL || f->f_flags == 0) {
>               errno = EBADF;
>               return (-1);
>       }
> diff --git a/stand/libsa/iodesc.h b/stand/libsa/iodesc.h
> index 37ae044af9d9..199fbcf74e98 100644
> --- a/stand/libsa/iodesc.h
> +++ b/stand/libsa/iodesc.h
> @@ -47,6 +47,8 @@ struct iodesc {
>       u_long  xid;                    /* transaction identification */
>       u_char  myea[6];                /* my ethernet address */
>       struct netif *io_netif;
> +     int io_id;                      /* descriptor id */
> +     TAILQ_ENTRY(iodesc) io_link;    /* next entry in list */
>  };
>  
>  #endif /* __SYS_LIBNETBOOT_IODESC_H */
> diff --git a/stand/libsa/lseek.c b/stand/libsa/lseek.c
> index 1a39eb31421b..c4ca97b148d6 100644
> --- a/stand/libsa/lseek.c
> +++ b/stand/libsa/lseek.c
> @@ -69,9 +69,10 @@ off_t
>  lseek(int fd, off_t offset, int where)
>  {
>       off_t bufpos, filepos, target;
> -     struct open_file *f = &files[fd];
> +     struct open_file *f;
>  
> -     if ((unsigned)fd >= SOPEN_MAX || f->f_flags == 0) {
> +     f = fd2open_file(fd);
> +     if (f == NULL || f->f_flags == 0) {
>               errno = EBADF;
>               return (-1);
>       }
> diff --git a/stand/libsa/net.h b/stand/libsa/net.h
> index 36b7cacc95ef..77a11c8dcab6 100644
> --- a/stand/libsa/net.h
> +++ b/stand/libsa/net.h
> @@ -97,8 +97,6 @@ extern      u_int intf_mtu;
>  
>  extern       int debug;                      /* defined in the machdep 
> sources */
>  
> -extern struct iodesc sockets[SOPEN_MAX];
> -
>  /* ARP/RevARP functions: */
>  u_char       *arpwhohas(struct iodesc *, struct in_addr);
>  void arp_reply(struct iodesc *, void *);
> diff --git a/stand/libsa/netif.c b/stand/libsa/netif.c
> index d255cc663d5a..2d32ccd9de7e 100644
> --- a/stand/libsa/netif.c
> +++ b/stand/libsa/netif.c
> @@ -47,7 +47,19 @@ __FBSDID("$FreeBSD$");
>  #include "net.h"
>  #include "netif.h"
>  
> -struct iodesc sockets[SOPEN_MAX];
> +typedef TAILQ_HEAD(socket_list, iodesc) socket_list_t;
> +
> +/*
> + * Open socket list. The current implementation and assumption is,
> + * we only remove entries from tail and we only add new entries to tail.
> + * This decision is to keep iodesc id management simple - we get list
> + * entries ordered by continiously growing io_id field.
> + * If we do have multiple sockets open and we do close socket not from tail,
> + * this entry will be marked unused. netif_open() will reuse unused entry, or
> + * netif_close() will free all unused tail entries.
> + */
> +static socket_list_t sockets = TAILQ_HEAD_INITIALIZER(sockets);
> +
>  #ifdef NETIF_DEBUG
>  int netif_debug = 0;
>  #endif
> @@ -63,7 +75,7 @@ netif_init(void)
>  {
>       struct netif_driver *drv;
>       int d, i;
> -    
> +
>  #ifdef NETIF_DEBUG
>       if (netif_debug)
>               printf("netif_init: called\n");
> @@ -108,7 +120,7 @@ netif_select(void *machdep_hint)
>               for (u = 0; u < drv->netif_nifs; u++) {
>                       cur_if.nif_unit = u;
>                       unit_done = 0;
> -             
> +
>  #ifdef NETIF_DEBUG
>                       if (netif_debug)
>                               printf("\t%s%d:", drv->netif_bname,
> @@ -179,14 +191,14 @@ netif_attach(struct netif *nif, struct iodesc *desc, 
> void
> *machdep_hint) if (netif_debug)
>               printf("%s%d: netif_attach\n", drv->netif_bname, nif->nif_unit);
>  #endif
> -     desc->io_netif = nif; 
> +     desc->io_netif = nif;
>  #ifdef PARANOID
>       if (drv->netif_init == NULL)
>               panic("%s%d: no netif_init support", drv->netif_bname,
>                   nif->nif_unit);
>  #endif
>       drv->netif_init(desc, machdep_hint);
> -     bzero(drv->netif_ifs[nif->nif_unit].dif_stats, 
> +     bzero(drv->netif_ifs[nif->nif_unit].dif_stats,
>           sizeof(struct netif_stats));
>  }
>  
> @@ -261,35 +273,71 @@ netif_put(struct iodesc *desc, void *pkt, size_t len)
>       return (rv);
>  }
>  
> +/*
> + * socktodesc_impl:
> + *
> + * Walk socket list and return pointer to iodesc structure.
> + * if id is < 0, return first unused iodesc.
> + */
> +static struct iodesc *
> +socktodesc_impl(int socket)
> +{
> +     struct iodesc *s;
> +
> +     TAILQ_FOREACH(s, &sockets, io_link) {
> +             /* search by socket id */
> +             if (socket >= 0) {
> +                     if (s->io_id == socket)
> +                             break;
> +                     continue;
> +             }
> +             /* search for first unused entry */
> +             if (s->io_netif == NULL)
> +                     break;
> +     }
> +     return (s);
> +}
> +
>  struct iodesc *
>  socktodesc(int sock)
>  {
> -     if (sock >= SOPEN_MAX) {
> +     struct iodesc *desc;
> +
> +     if (sock < 0)
> +             desc = NULL;
> +     else
> +             desc = socktodesc_impl(sock);
> +
> +     if (desc == NULL)
>               errno = EBADF;
> -             return (NULL);
> -     }
> -     return (&sockets[sock]);
> +
> +     return (desc);
>  }
>  
>  int
>  netif_open(void *machdep_hint)
>  {
> -     int fd;
>       struct iodesc *s;
>       struct netif *nif;
> -     
> +
>       /* find a free socket */
> -     for (fd = 0, s = sockets; fd < SOPEN_MAX; fd++, s++)
> -             if (s->io_netif == (struct netif *)0)
> -                     goto fnd;
> -     errno = EMFILE;
> -     return (-1);
> -
> -fnd:
> -     bzero(s, sizeof(*s));
> +     s = socktodesc_impl(-1);
> +     if (s == NULL) {
> +             struct iodesc *last;
> +
> +             s = calloc(1, sizeof (*s));
> +             if (s == NULL)
> +                     return (-1);
> +
> +             last = TAILQ_LAST(&sockets, socket_list);
> +             if (last != NULL)
> +                     s->io_id = last->io_id + 1;
> +             TAILQ_INSERT_TAIL(&sockets, s, io_link);
> +     }
> +
>       netif_init();
>       nif = netif_select(machdep_hint);
> -     if (!nif) 
> +     if (!nif)
>               panic("netboot: no interfaces left untried");
>       if (netif_probe(nif, machdep_hint)) {
>               printf("netboot: couldn't probe %s%d\n",
> @@ -299,18 +347,42 @@ fnd:
>       }
>       netif_attach(nif, s, machdep_hint);
>  
> -     return (fd);
> +     return (s->io_id);
>  }
>  
>  int
>  netif_close(int sock)
>  {
> -     if (sock >= SOPEN_MAX) {
> -             errno = EBADF;
> +     struct iodesc *s, *last;
> +     int err;
> +
> +     err = 0;
> +     s = socktodesc_impl(sock);
> +     if (s == NULL || sock < 0) {
> +             err = EBADF;
> +             return (-1);
> +     }
> +     netif_detach(s->io_netif);
> +     bzero(&s->destip, sizeof (s->destip));
> +     bzero(&s->myip, sizeof (s->myip));
> +     s->destport = 0;
> +     s->myport = 0;
> +     s->xid = 0;
> +     bzero(s->myea, sizeof (s->myea));
> +     s->io_netif = NULL;
> +
> +     /* free unused entries from tail. */
> +     TAILQ_FOREACH_REVERSE_SAFE(last, &sockets, socket_list, io_link, s) {
> +             if (last->io_netif != NULL)
> +                     break;
> +             TAILQ_REMOVE(&sockets, last, io_link);
> +             free(last);
> +     }
> +
> +     if (err) {
> +             errno = err;
>               return (-1);
>       }
> -     netif_detach(sockets[sock].io_netif);
> -     sockets[sock].io_netif = (struct netif *)0;
>  
>       return (0);
>  }
> diff --git a/stand/libsa/open.c b/stand/libsa/open.c
> index 9590508b0015..c62e48f0e1d8 100644
> --- a/stand/libsa/open.c
> +++ b/stand/libsa/open.c
> @@ -67,17 +67,66 @@ __FBSDID("$FreeBSD$");
>  
>  struct fs_ops *exclusive_file_system;
>  
> -struct open_file files[SOPEN_MAX];
> +/*
> + * Open file list. The current implementation and assumption is,
> + * we only remove entries from tail and we only add new entries to tail.
> + * This decision is to keep file id management simple - we get list
> + * entries ordered by continiously growing f_id field.
> + * If we do have multiple files open and we do close file not from tail,
> + * this entry will be marked unused. open() will reuse unused entry, or
> + * close will free all unused tail entries.
> + *
> + * Only case we expect open file list to grow long, is with zfs pools with
> + * many disks. 
> + */
> +file_list_t files = TAILQ_HEAD_INITIALIZER(files);
> +
> +/*
> + * Walk file list and return pointer to open_file structure.
> + * if fd is < 0, return first unused open_file.
> + */
> +struct open_file *
> +fd2open_file(int fd)
> +{
> +     struct open_file *f;
> +
> +     TAILQ_FOREACH(f, &files, f_link) {
> +             if (fd >= 0) {
> +                     if (f->f_id == fd)
> +                             break;
> +                     continue;
> +             }
> +
> +             if (f->f_flags == 0)
> +                     break;
> +     }
> +     return (f);
> +}
>  
>  static int
> -o_gethandle(void)
> +o_gethandle(struct open_file **ptr)
>  {
> -     int fd;
> +     struct open_file *f, *last;
>  
> -     for (fd = 0; fd < SOPEN_MAX; fd++)
> -             if (files[fd].f_flags == 0)
> -                     return (fd);
> -     return (-1);
> +     /* Pick up unused entry */
> +     f = fd2open_file(-1);
> +     if (f != NULL) {
> +             *ptr = f;
> +             return (f->f_id);
> +     }
> +
> +     /* Add new entry */
> +     f = calloc(1, sizeof (*f));
> +     if (f == NULL)
> +             return (-1);
> +
> +     last = TAILQ_LAST(&files, file_list);
> +     if (last != NULL)
> +             f->f_id = last->f_id + 1;
> +     TAILQ_INSERT_TAIL(&files, f, f_link);
> +
> +     *ptr = f;
> +     return (f->f_id);
>  }
>  
>  static void
> @@ -98,12 +147,11 @@ open(const char *fname, int mode)
>  
>       TSENTER();
>  
> -     if ((fd = o_gethandle()) == -1) {
> +     if ((fd = o_gethandle(&f)) == -1) {
>               errno = EMFILE;
>               return (-1);
>       }
>  
> -     f = &files[fd];
>       f->f_flags = mode + 1;
>       f->f_dev = NULL;
>       f->f_ops = NULL;
> diff --git a/stand/libsa/read.c b/stand/libsa/read.c
> index 7ad75c387a5d..d079944bf5d0 100644
> --- a/stand/libsa/read.c
> +++ b/stand/libsa/read.c
> @@ -69,12 +69,13 @@ __FBSDID("$FreeBSD$");
>  ssize_t
>  read(int fd, void *dest, size_t bcount)
>  {
> -     struct open_file *f = &files[fd];
> +     struct open_file *f;
>       size_t resid;
>  
>       TSENTER();
>  
> -     if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_READ)) {
> +     f = fd2open_file(fd);
> +     if (f == NULL || !(f->f_flags & F_READ)) {
>               errno = EBADF;
>               return (-1);
>       }
> diff --git a/stand/libsa/readdir.c b/stand/libsa/readdir.c
> index e49d93d15ed6..7757647e11e8 100644
> --- a/stand/libsa/readdir.c
> +++ b/stand/libsa/readdir.c
> @@ -34,9 +34,10 @@ struct dirent *
>  readdirfd(int fd)
>  {
>       static struct dirent dir;               /* XXX not thread safe */
> -     struct open_file *f = &files[fd];
> +     struct open_file *f;
>  
> -     if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_READ)) {
> +     f = fd2open_file(fd);
> +     if (f == NULL || !(f->f_flags & F_READ)) {
>               errno = EBADF;
>               return (NULL);
>       }
> diff --git a/stand/libsa/stand.h b/stand/libsa/stand.h
> index eb95afe4b169..535fee31d586 100644
> --- a/stand/libsa/stand.h
> +++ b/stand/libsa/stand.h
> @@ -65,6 +65,7 @@
>  #include <sys/cdefs.h>
>  #include <sys/stat.h>
>  #include <sys/dirent.h>
> +#include <sys/queue.h>
>  
>  /* this header intentionally exports NULL from <string.h> */
>  #include <string.h>
> @@ -182,11 +183,14 @@ struct open_file {
>      char             *f_rabuf;       /* readahead buffer pointer */
>      size_t           f_ralen;        /* valid data in readahead buffer */
>      off_t            f_raoffset;     /* consumer offset in readahead buffer 
> */
> +    int                      f_id;           /* file number */
> +    TAILQ_ENTRY(open_file) f_link;   /* next entry */
>  #define SOPEN_RASIZE 512
>  };
>  
> -#define      SOPEN_MAX       64
> -extern struct open_file files[];
> +typedef TAILQ_HEAD(file_list, open_file) file_list_t;
> +extern file_list_t files;
> +extern struct open_file *fd2open_file(int);
>  
>  /* f_flags values */
>  #define      F_READ          0x0001  /* file opened for reading */
> diff --git a/stand/libsa/write.c b/stand/libsa/write.c
> index 7d054e005cda..db82d7eaf4f6 100644
> --- a/stand/libsa/write.c
> +++ b/stand/libsa/write.c
> @@ -69,10 +69,11 @@ __FBSDID("$FreeBSD$");
>  ssize_t
>  write(int fd, const void *dest, size_t bcount)
>  {
> -     struct open_file *f = &files[fd];
> +     struct open_file *f;
>       size_t resid;
>  
> -     if ((unsigned)fd >= SOPEN_MAX || !(f->f_flags & F_WRITE)) {
> +     f = fd2open_file(fd);
> +     if (f == NULL || !(f->f_flags & F_WRITE)) {
>               errno = EBADF;
>               return (-1);
>       }
> _______________________________________________
> dev-commits-src-main@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
> To unsubscribe, send any mail to 
> "dev-commits-src-main-unsubscr...@freebsd.org"
This commit inflicts a buildworld error:

[...]
--- all_subdir_stand/libsa ---
/usr/src/lib/libsecureboot/verify_file.c:59:22: error: use of undeclared 
identifier 'SOPEN_MAX'
static int ve_status[SOPEN_MAX+1];
                     ^
/usr/src/lib/libsecureboot/verify_file.c:74:22: error: use of undeclared 
identifier 'SOPEN_MAX'
        if (fd >= 0 && fd < SOPEN_MAX) {
                            ^
/usr/src/lib/libsecureboot/verify_file.c:78:12: error: use of undeclared 
identifier 'SOPEN_MAX'
        ve_status[SOPEN_MAX] = ves;
                  ^
/usr/src/lib/libsecureboot/verify_file.c:98:19: error: use of undeclared 
identifier 'SOPEN_MAX'
                fd >= 0 && fd < SOPEN_MAX)
                                ^
/usr/src/lib/libsecureboot/verify_file.c:100:20: error: use of undeclared 
identifier
'SOPEN_MAX' return (ve_status[SOPEN_MAX]);  /* most recent */


-- 
O. Hartmann
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to