]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
f2fs, lockdep: annotate mutex_lock_all()
authorPeter Zijlstra <peterz@infradead.org>
Thu, 16 May 2013 18:03:12 +0000 (20:03 +0200)
committerJaegeuk Kim <jaegeuk.kim@samsung.com>
Tue, 28 May 2013 06:03:02 +0000 (15:03 +0900)
Majianpeng reported a lockdep splat for f2fs. It turns out mutex_lock_all()
acquires an array of locks (in global/local lock style).

Any such operation is always serialized using cp_mutex, therefore there is no
fs_lock[] lock-order issue; tell lockdep about this using the
mutex_lock_nest_lock() primitive.

Reported-by: majianpeng <majianpeng@gmail.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
fs/f2fs/f2fs.h

index 9360a03fcc966bb556ef1fa4cc51eb74506e2c2f..9182b2710db7fe464a4b2707b7feb89b5c0d0629 100644 (file)
@@ -495,9 +495,17 @@ static inline void clear_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f)
 
 static inline void mutex_lock_all(struct f2fs_sb_info *sbi)
 {
-       int i = 0;
-       for (; i < NR_GLOBAL_LOCKS; i++)
-               mutex_lock(&sbi->fs_lock[i]);
+       int i;
+
+       for (i = 0; i < NR_GLOBAL_LOCKS; i++) {
+               /*
+                * This is the only time we take multiple fs_lock[]
+                * instances; the order is immaterial since we
+                * always hold cp_mutex, which serializes multiple
+                * such operations.
+                */
+               mutex_lock_nest_lock(&sbi->fs_lock[i], &sbi->cp_mutex);
+       }
 }
 
 static inline void mutex_unlock_all(struct f2fs_sb_info *sbi)