tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: device vnodes, and structural confusion



On Jun 17, 2013, at 5:02 AM, David Holland <dholland-tech%netbsd.org@localhost> 
wrote:

> As has come up many times in the past, we have a long-standing
> problem, or family of problems, where in the course of operating on a
> particular file system we end up not calling the file system's own
> vnode or fs operations, but the root file system's operations. This
> causes varying degrees of lossage depending on exactly what happens.
> 
> One of the ways this happens came up today while working on PR 47937.
> The vnode structure has both a v_mount field and a v_specmountpoint
> field(*); both are pointers to a struct mount (that is, a filesystem)
> and it's very easy for people to use the wrong one, or not be sure
> which is which.
> 
> (*) v_specmountpoint is not actually a field, it's a fake field
> provided by a macro.
> 
> In the short term, to reduce the confusion I would like to make the
> following changes:
> 
>   1. Rename v_mount, which is the filesystem the vnode is on (almost
>   always / for device vnodes), to "v_myfs".

What is wrong with this name?  `v_mount' is the `struct mount' this
vnode resides on and I don't see any confusion.

>   2. Rather than renaming v_specmountpoint, which is the filesystem
>   mounted on a device vnode, kill it off entirely, and replace it
>   with an inline (or noninline) function "specvn_getmountedfs()".
>   Make this function assert if called on a non-VBLK vnode instead of
>   silently producing trash.

Yes, please.  While here, you could account for spec node aliases like:

int
spec_node_mount_by_node(vnode_t devvp, struct mount **mpp)
{       
        vnode_t *vp;

        KASSERT(vp->v_type == VBLK);
        *mpp = NULL;
        mutex_enter(&device_lock);
        for (vp = SPECHASH(devvp->v_rdev); vp; vp = vp->v_specnext) {
                if (vp->v_specmountpoint) {
                        KASSERT(*mpp == NULL);
                        *mpp = vp->v_specmount;
#ifndef DIAGNOSTIC
                        break;
#endif
                }
        }
        mutex_exit(&device_lock);

        return 0;
}

> 
> This is going to be a fairly large massedit, but I think it's
> worthwhile for clarity even if it doesn't turn up any mistakes.
> And I expect it to turn up at least a couple howlers. :-/
> 
> Also, while doing the edit, where feasible stop retrieving the fs
> structure from the vnode structure (or other structures) by going
> through the device-mounted-on. There should in general be no reason to
> do this at all; a filesystem's own structures should all have adequate
> pointers to one another without going through the device.
> 
> In the long run, I think we should rearrange the way device vnodes are
> handled, so that the device vnodes seen and handled belong entirely to
> specfs and the vnodes for the on-disk inodes are stubs hidden behind
> the specfs vnodes. This would make it much more obvious when the wrong
> fs's ops get called; also it would have the generally beneficial
> effect of allowing a lot of rote cut and paste filesystem stuff for
> supporting device nodes to be flushed.
> 
> More on that when my ideas solidify a bit.
> 
> -- 
> David A. Holland
> dholland%netbsd.org@localhost

--
J. Hannken-Illjes - hannken%eis.cs.tu-bs.de@localhost - TU Braunschweig 
(Germany)



Home | Main Index | Thread Index | Old Index