On 22 May 2014, at 00:48, David Holland <dholland-t...@netbsd.org> wrote:
<snip> > As I discovered while prodding lfs last weekend, this is too > optimistic, as there's another family of cases: allocating a new inode > and constructing a vnode for it. > > It is *possible* to do this by allocating an inode number and then > using vcache_get to procure the vnode, such that when the vnode cache > calls VFS_LOADVNODE it will load a blank inode. This is what ffs does, > and it works fine there since unallocated inodes have fixed known > locations that are in a known on-disk state. > > It doesn't work for lfs, and it won't work for any other filesystem > where inode locations aren't fixed, at least not without some ugly > hackery: you can update the fs state with a location for the new > inode, and write a buffer with the intended inode contents, and then > have VFS_LOADVNODE find and use this buffer, but this is inefficient > and gross. (This isn't itself adequate for lfs because lfs has some > additional self-inflicted issues.) > > After sleeping on this a few times, ISTM that the best way to handle > this is as follows: > > - add an additional call vcache_new to the API; > - have vcache_new take a type argument; > - have vcache_new assert that no vnode with the same key already > exists (FS-level locking should guarantee this); > - have vcache_new call a new op VFS_NEWVNODE instead of > VFS_LOADVNODE and pass the type in. <snip> Here comes the new operation "vcache_new()" to allocate and initialise a new vnode/fsnode pair. Passing the type is not sufficient, therefore pass all information we get from VOP_MKNOD: int vcache_new(struct mount *mp, struct vnode *dvp, struct vattr *vap, kauth_cred_t cred, struct vnode **vpp) where dvp is the (referenced) directory where we want to create the new node, vap passes va_type, va_mode and possibly va_rdev and cred gives the credentials to setup uid/guid. The node returned from vcache_new() is referenced, fully initialised and has link count zero. A diff showing the implementation is here: http://www.netbsd.org/~hannken/vnode-pass7-1a.diff and a diff showing its usage for ffs is here: http://www.netbsd.org/~hannken/vnode-pass7-1b.diff Comments or objections anyone? -- J. Hannken-Illjes - hann...@eis.cs.tu-bs.de - TU Braunschweig (Germany)