summaryrefslogtreecommitdiff
path: root/kernels/aufs2-libre/aufs2-module-2.6.36.patch
blob: 3b43f7aeddc4e48ff85297417a6d52027cf552d5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
diff --git a/ubuntu/aufs/branch.c b/ubuntu/aufs/branch.c
index cd4463c..ff6b158 100644
--- a/fs/aufs/branch.c
+++ b/fs/aufs/branch.c
@@ -22,6 +22,8 @@
 
 #include <linux/file.h>
 #include <linux/statfs.h>
+#include <linux/lglock.h>
+#include <linux/percpu.h>
 #include "aufs.h"
 
 /*
@@ -851,7 +853,8 @@ static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex)
 		goto out;
 
 	/* no need file_list_lock() since sbinfo is locked? defered? */
-	list_for_each_entry(file, &sb->s_files, f_u.fu_list) {
+        lg_global_lock(files_lglock);
+	do_file_list_for_each_entry(sb, file) {
 		if (special_file(file->f_dentry->d_inode->i_mode))
 			continue;
 
@@ -861,6 +864,7 @@ static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex)
 			err = -EBUSY;
 			FiMustNoWaiters(file);
 			fi_read_unlock(file);
+			lg_global_unlock(files_lglock);
 			goto out_free;
 		}
 
@@ -889,10 +893,13 @@ static int au_br_mod_files_ro(struct super_block *sb, aufs_bindex_t bindex)
 			if (p) {
 				a = p;
 				a[n++] = hf;
-			} else
+			} else {
+				lg_global_unlock(files_lglock);
 				goto out_free;
+			}
 		}
-	}
+	} while_file_list_for_each_entry;
+	lg_global_unlock(files_lglock);
 
 	err = 0;
 	if (n)