aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/filesystems
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/filesystems')
-rw-r--r--Documentation/filesystems/Locking16
1 files changed, 11 insertions, 5 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
index c2963a74fbc3..2db7c9e492e9 100644
--- a/Documentation/filesystems/Locking
+++ b/Documentation/filesystems/Locking
@@ -349,6 +349,7 @@ fl_release_private: maybe no
349----------------------- lock_manager_operations --------------------------- 349----------------------- lock_manager_operations ---------------------------
350prototypes: 350prototypes:
351 int (*lm_compare_owner)(struct file_lock *, struct file_lock *); 351 int (*lm_compare_owner)(struct file_lock *, struct file_lock *);
352 unsigned long (*lm_owner_key)(struct file_lock *);
352 void (*lm_notify)(struct file_lock *); /* unblock callback */ 353 void (*lm_notify)(struct file_lock *); /* unblock callback */
353 int (*lm_grant)(struct file_lock *, struct file_lock *, int); 354 int (*lm_grant)(struct file_lock *, struct file_lock *, int);
354 void (*lm_break)(struct file_lock *); /* break_lease callback */ 355 void (*lm_break)(struct file_lock *); /* break_lease callback */
@@ -358,16 +359,21 @@ locking rules:
358 359
359 inode->i_lock file_lock_lock may block 360 inode->i_lock file_lock_lock may block
360lm_compare_owner: yes[1] maybe no 361lm_compare_owner: yes[1] maybe no
362lm_owner_key yes[1] yes no
361lm_notify: yes yes no 363lm_notify: yes yes no
362lm_grant: no no no 364lm_grant: no no no
363lm_break: yes no no 365lm_break: yes no no
364lm_change yes no no 366lm_change yes no no
365 367
366[1]: ->lm_compare_owner is generally called with *an* inode->i_lock held. It 368[1]: ->lm_compare_owner and ->lm_owner_key are generally called with
367may not be the i_lock of the inode for either file_lock being compared! This is 369*an* inode->i_lock held. It may not be the i_lock of the inode
368the case with deadlock detection, since the code has to chase down the owners 370associated with either file_lock argument! This is the case with deadlock
369of locks that may be entirely unrelated to the one on which the lock is being 371detection, since the code has to chase down the owners of locks that may
370acquired. When doing a search for deadlocks, the file_lock_lock is also held. 372be entirely unrelated to the one on which the lock is being acquired.
373For deadlock detection however, the file_lock_lock is also held. The
374fact that these locks are held ensures that the file_locks do not
375disappear out from under you while doing the comparison or generating an
376owner key.
371 377
372--------------------------- buffer_head ----------------------------------- 378--------------------------- buffer_head -----------------------------------
373prototypes: 379prototypes: