You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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
...
This commit is contained in:
+8
-8
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user