tech-kern archive

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

Re: Vnode API cleanup pass 2a



On Dec 30, 2013, at 10:58 PM, David Holland 
<dholland-tech%netbsd.org@localhost> wrote:

> On Mon, Dec 30, 2013 at 11:35:48AM +0100, J. Hannken-Illjes wrote:
>> The layered file systems hashlists currently have to work on locked
>> vnodes as the vnode operations returning vnodes return them locked.
>> 
>> This leads to some very dirty hacks -- see layer_node_find() from
>> sys/miscfs/genfs/layer_subr.c for example.
>> 
>> The best solution is to change these vnode operations to return
>> unlocked (and referenced) vnodes.
>> 
>> The attached diff implements this change for operations create, mknod,
>> mkdir and symlink.  It passes the atf test suite and some file system
>> stress tests I use here.
>> 
>> Comments or objections anyone?
> 
> My first thought is that I really don't think it's a good idea to
> change important semantic properties (particularly locking) of calls
> from what's effectively a public API without changing the signatures
> too so old code won't compile.

Ok.  Will add an API version argument to vnode_if.src so

        vop_mkdir {
+               VERSION 1
                IN LOCKED=YES WILLPUT struct vnode *dvp;

will rename vop_mkdir_desc to vop_mkdir1_desc and then change all
file systems to use the new desc.

> Also, since what you're doing is basically unlocking before return in
> every implementation, and then relocking after return at every call
> site, it's possible to do one op at a time; it seems like that would
> be a good idea in case unexpected problems crop up.

This is not what I'm doing.

Many file systems use one internal function to create a new inode and
where possible I change this function to return the node unlocked.

Relocking is done only for nfs server, vn_open() and temporarily for
layered file systems.  The operations from vfs_syscalls.c all change
vput() to vrele().

> Unlocking and relocking should not itself be a problem since AFAIK
> there isn't any reason for those locks to be held in the first place;
> however, I think I'd better go review all the call sites just in case.
> 
> Plus I think it would be advisable to make this change first, so that
> in case we do find a site where it matters we can lock the returned
> object before anyone else can see it:
> 
> #
> -#% mkdir      dvp     L U U
> +#% mkdir      dvp     L L L

Where should it matter? VOP_MKDIR is only used from:

external/cddl/osnet/dist/uts/common/fs/zfs/zfs_replay.c:zfs_replay_create()
sys/kern/vfs_syscalls.c:do_sys_mkdirat()
sys/nfs/nfs_serv.c:nfsrv_mkdir()
sys/fs/union/union_vnops.c:union_mkdir()
sys/fs/union/union_subr.c:union_mkshadow()
sys/rump/librump/rumpvfs/rumpvnode_if.c:RUMP_VOP_MKDIR()

and I don't see any problems here.

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



Home | Main Index | Thread Index | Old Index