Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 7 Aug 2014 14:46:29 -0700
From:      hiren panchasara <hiren@freebsd.org>
To:        Xin LI <d@delphij.net>
Cc:        "freebsd-hackers@freebsd.org" <freebsd-hackers@freebsd.org>
Subject:   Re: Where is loader.conf.gz?
Message-ID:  <CALCpEUGBMD=qmOF65dv6m%2BGRTenjZZ8BTDF68KQZ2OPs3AnaOA@mail.gmail.com>
In-Reply-To: <53E3C44C.9000500@delphij.net>
References:  <CALCpEUGuC06iKcOHRkLmJr13ycpP%2Bnmm3fL2QT-iszJP3UiVjA@mail.gmail.com> <53E3C44C.9000500@delphij.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Aug 7, 2014 at 11:24 AM, Xin Li <delphij@delphij.net> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA512
>
> On 08/07/14 11:11, hiren panchasara wrote:
>> I am trying to netboot minnowboard max with loader.efi and then
>> nfsmount the root fs from my FreeBSD-Current zfs laptop.
>>
>> It gets stuck right at "Loading /boot/defaults/loader.conf"
>>
>> Looking at tcpdump (on interface serving nfsd on laptop), it tries
>> to find loader.conf.gz and fails.
>>
>> I've failed to find loader.conf.gz anywhere on box or in the source
>> code. Where does it come from and who is looking for it?
>
> lib/libstand/gzipfs.c I think? (zf_open)
>
> It's weird that it didn't handle the ENOENT error, though...
>

Xin,
You are right. lib/libstand/open.c: open() looks like this:

    /* pass file name to the different filesystem open routines */
    besterror = ENOENT;
    for (i = 0; file_system[i] != NULL; i++) {
         fs = file_system[i];
         error = (fs->fo_open)(file, f);    <-----zf_open() is called
which returns ENOENT
         if (error == 0)
             goto ok;
         if (error != EINVAL)
             besterror = error;
    }
    error = besterror;

So, the error is ENOENT at this point. But it fails in what happens after this:

    fail:
       if ((f->f_flags & F_NODEV) == 0 && f->f_dev != NULL)
            f->f_dev->dv_close(f);
       if (error)
            devclose(f);

Here, it gets into both if() conditions and stalls/hangs in the call
to devclose():

    int
    devclose(struct open_file *f)
    {

         if (f->f_devdata != NULL) {
             free(f->f_devdata);                <-- hangs right here
and never returns.
         }
     return (0);
    }

It probably panics and doesn't tell me. I have to hard reset the
board. Is it because we are trying to close something we couldn't
open?

cheers,
Hiren



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CALCpEUGBMD=qmOF65dv6m%2BGRTenjZZ8BTDF68KQZ2OPs3AnaOA>