Re: git: b44cc1b479fe - main - loader: do not try to open directories with TFTP
Date: Thu, 21 Aug 2025 06:57:26 UTC
> On 21. Aug 2025, at 09:40, Bjoern A. Zeeb <bz@FreeBSD.org> wrote:
>
> On Thu, 21 Aug 2025, A FreeBSD User wrote:
>
>> Am Tage des Herren Wed, 20 Aug 2025 22:48:38 GMT
>> "Simon J. Gerraty" <sjg@FreeBSD.org> schrieb:
>>
>>> The branch main has been updated by sjg:
>>>
>>> URL: https://cgit.FreeBSD.org/src/commit/?id=b44cc1b479fefc8570611309c3f5a6966fb26e3b
>>>
>>> commit b44cc1b479fefc8570611309c3f5a6966fb26e3b
>>> Author: Simon J. Gerraty <sjg@FreeBSD.org>
>>> AuthorDate: 2025-08-20 22:45:54 +0000
>>> Commit: Simon J. Gerraty <sjg@FreeBSD.org>
>>> CommitDate: 2025-08-20 22:45:54 +0000
>>>
>>> loader: do not try to open directories with TFTP
>>>
>>> Attempting to mount or even open / with some tftp servers
>>> causes a several minute delay in boot.
>>>
>>> Since opening a directory via TFTP does not make sense, we
>>> avoid it. We don't know if using TFTP until after net_open()
>>> has been called.
>>>
>>> Add an is_tftp() accessor to avoid everyone having to include
>>> all the net* headers.
>>>
>>> Sponsored by: Juniper Networks, Inc.
>>> Differential Revision: https://reviews.freebsd.org/D51447
>>> ---
>>> stand/common/dev_net.c | 9 ++++++++-
>>> stand/libsa/mount.c | 5 ++++-
>>> stand/libsa/open.c | 8 ++++++++
>>> stand/libsa/stand.h | 3 +++
>>> 4 files changed, 23 insertions(+), 2 deletions(-)
>>
>> Build of world/kernel fails with the error below:
>>
>> [...]
>>
>> --- all_subdir_stand/i386 ---
>> --- all_subdir_stand/i386/gptzfsboot ---
>> ld: error: undefined symbol: is_tftp
>>>>> referenced by open.c
>>>>> open.o:(open) in archive /usr/obj/usr/src/amd64.amd64/stand/libsa32/libsa32.a
>>>>> referenced by mount.c
>>>>> mount.o:(mount) in archive
>>>>> /usr/obj/usr/src/amd64.amd64/stand/libsa32/libsa32.a
>> --- all_subdir_usr.sbin ---
>> -function -Wno-enum-conversion -Wno-unused-local-typedef -Wno-address-of-packed-member
>> -Qunused-arguments -c /usr/src/contrib/tcpdump/print-ntp.c -o print-ntp.pieo ---
>> all_subdir_stand --- *** [gptzfsboot.out] Error code 1
>
> shot in the dark (haven't checked that LOADER_NET_SUPPORT would be defined for these files):
I do not think it is the approach you want to take there, because this means you would need to build all those variants to build different components…
I would think of having weak is_tftp() implementation returning false for case the dev_net.c is not built or move dev_net.c into libsa. I’m not quite sure why dev_net.c is outside libsa anyhow;)
rgds,
toomas
>
> diff --git stand/libsa/mount.c stand/libsa/mount.c
> index c866dc9c7055..4b579c17a782 100644
> --- stand/libsa/mount.c
> +++ stand/libsa/mount.c
> @@ -109,8 +109,10 @@ mount(const char *dev, const char *path, int flags __unused, void *data)
> continue;
> DEBUG_PRINTF(1,("%s: fs=%s path=%s\n",
> __func__, fs->fs_name, path));
> +#ifdef LOADER_NET_SUPPORT
> if (is_tftp())
> break;
> +#endif
> if (fs->fo_mount(dev, path, &data) != 0)
> continue;
>
> diff --git stand/libsa/open.c stand/libsa/open.c
> index 91848aca7dbe..0e44dc7b0942 100644
> --- stand/libsa/open.c
> +++ stand/libsa/open.c
> @@ -138,8 +138,10 @@ open(const char *fname, int mode)
> struct fs_ops *fs;
> struct open_file *f;
> int fd, i, error, besterror;
> +#ifdef LOADER_NET_SUPPORT
> bool is_dir;
> size_t n;
> +#endif
> const char *file;
>
> TSENTER();
> @@ -184,14 +186,18 @@ open(const char *fname, int mode)
>
> /* pass file name to the different filesystem open routines */
> besterror = ENOENT;
> +#ifdef LOADER_NET_SUPPORT
> n = strlen(file);
> is_dir = (n > 0 && file[n - 1] == '/');
> +#endif
> for (i = 0; file_system[i] != NULL; i++) {
> fs = file_system[i];
> +#ifdef LOADER_NET_SUPPORT
> if (is_dir && is_tftp()) {
> error = EOPNOTSUPP;
> goto err;
> }
> +#endif
> error = (fs->fo_open)(file, f);
> if (error == 0)
> goto ok;
>
>
> --
> Bjoern A. Zeeb r15:7