Don't make it look like rcu_read_lock is held over the entire loop instead just take the rcu_read_lock over the part of the loop that matters. This makes the intent of the code a little clearer. Signed-off-by: "Eric W. Biederman" <ebiederm@xxxxxxxxxxxx> --- fs/proc/inode.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 74ce4a8d05eb..38a7baa41aba 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -110,11 +110,13 @@ void proc_prune_siblings_dcache(struct hlist_head *inodes, spinlock_t *lock) struct hlist_node *node; struct super_block *sb; - rcu_read_lock(); for (;;) { + rcu_read_lock(); node = hlist_first_rcu(inodes); - if (!node) + if (!node) { + rcu_read_unlock(); break; + } ei = hlist_entry(node, struct proc_inode, sibling_inodes); spin_lock(lock); hlist_del_init_rcu(&ei->sibling_inodes); @@ -122,23 +124,21 @@ void proc_prune_siblings_dcache(struct hlist_head *inodes, spinlock_t *lock) inode = &ei->vfs_inode; sb = inode->i_sb; - if (!atomic_inc_not_zero(&sb->s_active)) + if (!atomic_inc_not_zero(&sb->s_active)) { + rcu_read_unlock(); continue; + } inode = igrab(inode); rcu_read_unlock(); if (unlikely(!inode)) { deactivate_super(sb); - rcu_read_lock(); continue; } d_prune_aliases(inode); iput(inode); deactivate_super(sb); - - rcu_read_lock(); } - rcu_read_unlock(); } static int proc_show_options(struct seq_file *seq, struct dentry *root) -- 2.20.1