Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs updates from Al Viro: "In this one: - d_move fixes (Eric Biederman) - UFS fixes (me; locking is mostly sane now, a bunch of bugs in error handling ought to be fixed) - switch of sb_writers to percpu rwsem (Oleg Nesterov) - superblock scalability (Josef Bacik and Dave Chinner) - swapon(2) race fix (Hugh Dickins)" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (65 commits) vfs: Test for and handle paths that are unreachable from their mnt_root dcache: Reduce the scope of i_lock in d_splice_alias dcache: Handle escaped paths in prepend_path mm: fix potential data race in SyS_swapon inode: don't softlockup when evicting inodes inode: rename i_wb_list to i_io_list sync: serialise per-superblock sync operations inode: convert inode_sb_list_lock to per-sb inode: add hlist_fake to avoid the inode hash lock in evict writeback: plug writeback at a high level change sb_writers to use percpu_rw_semaphore shift percpu_counter_destroy() into destroy_super_work() percpu-rwsem: kill CONFIG_PERCPU_RWSEM percpu-rwsem: introduce percpu_rwsem_release() and percpu_rwsem_acquire() percpu-rwsem: introduce percpu_down_read_trylock() document rwsem_release() in sb_wait_write() fix the broken lockdep logic in __sb_start_write() introduce __sb_writers_{acquired,release}() helpers ufs_inode_get{frag,block}(): get rid of 'phys' argument ufs_getfrag_block(): tidy up a bit ...
此提交包含在:
@@ -928,7 +928,7 @@ static void add_dquot_ref(struct super_block *sb, int type)
|
||||
int reserved = 0;
|
||||
#endif
|
||||
|
||||
spin_lock(&inode_sb_list_lock);
|
||||
spin_lock(&sb->s_inode_list_lock);
|
||||
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
|
||||
spin_lock(&inode->i_lock);
|
||||
if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) ||
|
||||
@@ -939,7 +939,7 @@ static void add_dquot_ref(struct super_block *sb, int type)
|
||||
}
|
||||
__iget(inode);
|
||||
spin_unlock(&inode->i_lock);
|
||||
spin_unlock(&inode_sb_list_lock);
|
||||
spin_unlock(&sb->s_inode_list_lock);
|
||||
|
||||
#ifdef CONFIG_QUOTA_DEBUG
|
||||
if (unlikely(inode_get_rsv_space(inode) > 0))
|
||||
@@ -951,15 +951,15 @@ static void add_dquot_ref(struct super_block *sb, int type)
|
||||
/*
|
||||
* We hold a reference to 'inode' so it couldn't have been
|
||||
* removed from s_inodes list while we dropped the
|
||||
* inode_sb_list_lock We cannot iput the inode now as we can be
|
||||
* s_inode_list_lock. We cannot iput the inode now as we can be
|
||||
* holding the last reference and we cannot iput it under
|
||||
* inode_sb_list_lock. So we keep the reference and iput it
|
||||
* s_inode_list_lock. So we keep the reference and iput it
|
||||
* later.
|
||||
*/
|
||||
old_inode = inode;
|
||||
spin_lock(&inode_sb_list_lock);
|
||||
spin_lock(&sb->s_inode_list_lock);
|
||||
}
|
||||
spin_unlock(&inode_sb_list_lock);
|
||||
spin_unlock(&sb->s_inode_list_lock);
|
||||
iput(old_inode);
|
||||
|
||||
#ifdef CONFIG_QUOTA_DEBUG
|
||||
@@ -1028,7 +1028,7 @@ static void remove_dquot_ref(struct super_block *sb, int type,
|
||||
struct inode *inode;
|
||||
int reserved = 0;
|
||||
|
||||
spin_lock(&inode_sb_list_lock);
|
||||
spin_lock(&sb->s_inode_list_lock);
|
||||
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
|
||||
/*
|
||||
* We have to scan also I_NEW inodes because they can already
|
||||
@@ -1044,7 +1044,7 @@ static void remove_dquot_ref(struct super_block *sb, int type,
|
||||
}
|
||||
spin_unlock(&dq_data_lock);
|
||||
}
|
||||
spin_unlock(&inode_sb_list_lock);
|
||||
spin_unlock(&sb->s_inode_list_lock);
|
||||
#ifdef CONFIG_QUOTA_DEBUG
|
||||
if (reserved) {
|
||||
printk(KERN_WARNING "VFS (%s): Writes happened after quota"
|
||||
|
新增問題並參考
封鎖使用者