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)