[PATCH v3 00/19] Prepare to lift lookup out of exclusive lock for directory ops

NeilBrown <[email protected]>
Newsgroups org.kernel.vger.linux-unionfs,org.kernel.vger.linux-efi,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-nfs
Message-ID <[email protected]>
[[ sorry - this v3 is identical to v2 except that the linux-kernel@vger
   address is actually correct.  Please reply to this one so that you don't
   get bounces like I did - NB ]]

This patch set progresses my effort to improve concurrency of
directory operations and specifically to allow concurrent updates
in a given directory.

It is a selection of patches from the 53-patch set I posted in March
which got relatively little response.  Maybe a shorter set will be more
approachable.

This set:
 - prepares the VFS in various ways
 - make use of these preparations in ovl and NFS (the most challenging
   filesystems for lookup as they do the most interesting things)
 - make use in efivars and shmem which for different reasons need a small 
   change that seemed worth including here.

The goal that these patch work towards is moving lookup out of i_rwsem
on the directory - except for the actual ->lookup call.  This is itself
a step towards allowing broad concurrency of operations in a given
directory.

There are two particular requirements before lookup can move outside the lock:
1/ d_drop() mustn't be used before an operation completes: the dentry being present
   in the dcache becomes part of the locking protocol.  This in turn requires
   d_splice_alias() to work with hashed negative dentries.
2/ d_alloc_parallel() mustn't be called while i_rw_sem is held, as this would
   result in a lock inversion.  So d_alloc_noblock and others are introduced
   to handle the various cases.
   In a few cases we need to drop and re-take i_rw_sem inside ->lookup.
   As lookup might be called with a shared or exclusive lock this requires
   a new LOOKUP_SHARED flag which is ugly but can be removed after the
   lookup is moved out of the lock (then ->lookup will only ever be called
   with a shared lock).

The full set of patches including these 19 and the rest to complete the
lifting of lookup out of the exclusive lock can be found at
   github/neilbrown/linux in branch pdirops

Significant changes since last time are:
 - use wait_var_event for d_alloc_parallel() rather than effectively
   duplicating that infrastructure - as suggested by Christop
 - changes to ovl_readdir handling as discussed with Amir.

Thanks,
NeilBrown

 [PATCH v3 01/19] VFS: fix various typos in documentation for
 [PATCH v3 02/19] VFS: enhance d_splice_alias() to handle in-lookup
 [PATCH v3 03/19] VFS: allow d_alloc_name() to be used with ->d_hash
 [PATCH v3 04/19] VFS: use wait_var_event for waiting in
 [PATCH v3 05/19] VFS: introduce d_alloc_noblock()
 [PATCH v3 06/19] VFS: add d_duplicate()
 [PATCH v3 07/19] VFS: Add LOOKUP_SHARED flag.
 [PATCH v3 08/19] VFS/xfs/ntfs: drop parent lock across
 [PATCH v3 09/19] ovl: stop using lookup_one() in iterate_shared()
 [PATCH v3 10/19] VFS/ovl: add d_alloc_noblock_return()
 [PATCH v3 11/19] efivarfs: use d_alloc_name()
 [PATCH v3 12/19] shmem: use d_duplicate()
 [PATCH v3 13/19] nfs: remove d_drop()/d_alloc_parallel() from
 [PATCH v3 14/19] nfs: use d_splice_alias() in nfs_link()
 [PATCH v3 15/19] nfs: don't d_drop() before d_splice_alias()
 [PATCH v3 16/19] nfs: don't d_drop() before d_splice_alias() in
 [PATCH v3 17/19] nfs: Use d_alloc_noblock() in nfs_prime_dcache()
 [PATCH v3 18/19] nfs: use d_alloc_noblock() in silly-rename
 [PATCH v3 19/19] nfs: use d_duplicate()
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.