diff options
Diffstat (limited to 'Documentation/filesystems/directory-locking.rst')
| -rw-r--r-- | Documentation/filesystems/directory-locking.rst | 26 | 
1 files changed, 14 insertions, 12 deletions
| diff --git a/Documentation/filesystems/directory-locking.rst b/Documentation/filesystems/directory-locking.rst index 504ba940c36c..dccd61c7c5c3 100644 --- a/Documentation/filesystems/directory-locking.rst +++ b/Documentation/filesystems/directory-locking.rst @@ -22,12 +22,11 @@ exclusive.  3) object removal.  Locking rules: caller locks parent, finds victim,  locks victim and calls the method.  Locks are exclusive. -4) rename() that is _not_ cross-directory.  Locking rules: caller locks -the parent and finds source and target.  In case of exchange (with -RENAME_EXCHANGE in flags argument) lock both.  In any case, -if the target already exists, lock it.  If the source is a non-directory, -lock it.  If we need to lock both, lock them in inode pointer order. -Then call the method.  All locks are exclusive. +4) rename() that is _not_ cross-directory.  Locking rules: caller locks the +parent and finds source and target.  We lock both (provided they exist).  If we +need to lock two inodes of different type (dir vs non-dir), we lock directory +first.  If we need to lock two inodes of the same type, lock them in inode +pointer order.  Then call the method.  All locks are exclusive.  NB: we might get away with locking the source (and target in exchange  case) shared. @@ -44,15 +43,17 @@ All locks are exclusive.  rules:  	* lock the filesystem -	* lock parents in "ancestors first" order. +	* lock parents in "ancestors first" order. If one is not ancestor of +	  the other, lock them in inode pointer order.  	* find source and target.  	* if old parent is equal to or is a descendent of target  	  fail with -ENOTEMPTY  	* if new parent is equal to or is a descendent of source  	  fail with -ELOOP -	* If it's an exchange, lock both the source and the target. -	* If the target exists, lock it.  If the source is a non-directory, -	  lock it.  If we need to lock both, do so in inode pointer order. +	* Lock both the source and the target provided they exist. If we +	  need to lock two inodes of different type (dir vs non-dir), we lock +	  the directory first. If we need to lock two inodes of the same type, +	  lock them in inode pointer order.  	* call the method.  All ->i_rwsem are taken exclusive.  Again, we might get away with locking @@ -66,8 +67,9 @@ If no directory is its own ancestor, the scheme above is deadlock-free.  Proof: -	First of all, at any moment we have a partial ordering of the -	objects - A < B iff A is an ancestor of B. +	First of all, at any moment we have a linear ordering of the +	objects - A < B iff (A is an ancestor of B) or (B is not an ancestor +        of A and ptr(A) < ptr(B)).  	That ordering can change.  However, the following is true: | 
