On Thu, 29 Jun 2000, Richard Gooch wrote:

> Tigran Aivazian writes:
> > On Sat, 10 Jun 2000, Alexander Viro wrote:
> > > > - although not documented, you need to do kern_mount() before trying
> > >   Yup.
> > > >   normal mounts of a FS_SINGLE; perhaps kern_mount()/kern_umount()
> > > >   should be called automatically in
> > > >   register_filesystem()/unregister_filesystem()?
> > > 
> > > I don't think so. They are different operations and I'm not too happy
> > > about mixing them together. Matter of taste, but...
> > 
> > In get_sb_single() you wrote:
> > 
> >         sb = fs_type->kern_mnt->mnt_sb;
> >         if (!sb)
> >                 BUG();
> > 
> > and it is kern_mount() that initialises type->kern_mnt. So, if one forgot
> > to kern_mount a FS_SINGLE filesystem prior to letting userspace try to
> > mount(2) it, then it is not the BUG() that we hit but an oops of this
> > kind:
> > 
> > Code;  c013c6b1 <get_sb_single+59/98>   <=====
> >    0:   8b 58 1c                  mov    0x1c(%eax),%ebx   <=====
> > 
> > (0x1c being offset of mnt_sb in vfsmount)
> > 
> > i.e. maybe we should really have in get_sb_single():
> > 
> > if (!fs_type->kern_mnt || !(sb = fs_type->kern_mnt->mnt_sb))
> >     BUG();
> > 
> > I.e. if one forgot to kern_mount then fs_type->kern_mnt will be probably
> > left at NULL so one is more likely to follow a NULL pointer via ->kern_mnt
> > rather that follow somewhere valid and then find NULL via ->mnt_sb?
> > 
> > Richard, how is it that you actually hit the BUG() above?
> 
> Hm. Digging back into my archives, I see I said I got a kernel BUG. So
> that means I got a BUG, not an Oops. Perhaps that means that *fs_type
> hasn't been initialised to 0, or perhaps that fs_type->kern_mnt gets
> initialised elsewhere even when kern_mount() isn't called (and perhaps
> kern_mount() just initialises fs_type->kern_mnt->mnt_sb).
> Speculations only: I haven't RTFS.


all I am really saying is that this simple filesystem should generate a
BUG() (pointing to the fact that it should be kern_mount-ed first) and not
an oops:

static DECLARE_FSTYPE(single_fs_type, "single", NULL, FS_SINGLE);
static int __init init_single_fs(void)
{
        return register_filesystem(&single_fs_type);
}
static void __exit exit_single_fs(void)
{
        unregister_filesystem(&single_fs_type);
}

Regards,
Tigran

Reply via email to