diff --git a/fs/dcache.c b/fs/dcache.c index f34344ceece70..02db80f2817fc 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -2537,11 +2537,16 @@ EXPORT_SYMBOL(d_rehash); static inline unsigned start_dir_add(struct inode *dir) { - - preempt_disable_rt(); + /* + * The caller has a spinlock_t (dentry::d_lock) acquired which disables + * preemption on !PREEMPT_RT. On PREEMPT_RT the lock does not disable + * preemption and it has be done explicitly. + */ + if (IS_ENABLED(CONFIG_PREEMPT_RT)) + preempt_disable(); for (;;) { - unsigned n = dir->__i_dir_seq; - if (!(n & 1) && cmpxchg(&dir->__i_dir_seq, n, n + 1) == n) + unsigned n = dir->i_dir_seq; + if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) return n; cpu_relax(); } @@ -2549,8 +2554,9 @@ static inline unsigned start_dir_add(struct inode *dir) static inline void end_dir_add(struct inode *dir, unsigned n) { - smp_store_release(&dir->__i_dir_seq, n + 2); - preempt_enable_rt(); + smp_store_release(&dir->i_dir_seq, n + 2); + if (IS_ENABLED(CONFIG_PREEMPT_RT)) + preempt_enable(); } static void d_wait_lookup(struct dentry *dentry) @@ -2586,7 +2592,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, retry: rcu_read_lock(); - seq = smp_load_acquire(&parent->d_inode->__i_dir_seq); + seq = smp_load_acquire(&parent->d_inode->i_dir_seq); r_seq = read_seqbegin(&rename_lock); dentry = __d_lookup_rcu(parent, name, &d_seq); if (unlikely(dentry)) { @@ -2614,7 +2620,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, } hlist_bl_lock(b); - if (unlikely(READ_ONCE(parent->d_inode->__i_dir_seq) != seq)) { + if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) { hlist_bl_unlock(b); rcu_read_unlock(); goto retry; diff --git a/fs/fscache/object.c b/fs/fscache/object.c index 78f332f2e98c8..7a972d144b546 100644 --- a/fs/fscache/object.c +++ b/fs/fscache/object.c @@ -814,8 +814,6 @@ void fscache_enqueue_object(struct fscache_object *object) wake_up(&fscache_object_cong_wait); } else fscache_put_object(object, fscache_obj_put_queue); - - put_cpu_var(fscache_object_cong_wait); } } diff --git a/fs/inode.c b/fs/inode.c index 0c46c1a98c2ac..ed0cab8a32db1 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -157,7 +157,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) inode->i_pipe = NULL; inode->i_cdev = NULL; inode->i_link = NULL; - inode->__i_dir_seq = 0; + inode->i_dir_seq = 0; inode->i_rdev = 0; inode->dirtied_when = 0; diff --git a/include/linux/fs.h b/include/linux/fs.h index 5ff6117d59f54..e7a633353fd20 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -711,7 +711,7 @@ struct inode { struct pipe_inode_info *i_pipe; struct cdev *i_cdev; char *i_link; - unsigned __i_dir_seq; + unsigned i_dir_seq; }; __u32 i_generation; diff --git a/include/linux/preempt.h b/include/linux/preempt.h index dc8158a459859..3da73c9682119 100644 --- a/include/linux/preempt.h +++ b/include/linux/preempt.h @@ -331,14 +331,6 @@ do { \ set_preempt_need_resched(); \ } while (0) -#ifdef CONFIG_PREEMPT_RT -# define preempt_disable_rt() preempt_disable() -# define preempt_enable_rt() preempt_enable() -#else -# define preempt_disable_rt() barrier() -# define preempt_enable_rt() barrier() -#endif - #ifdef CONFIG_PREEMPT_NOTIFIERS struct preempt_notifier; diff --git a/localversion-rt b/localversion-rt index 1199ebade17b4..1e584b47c987e 100644 --- a/localversion-rt +++ b/localversion-rt @@ -1 +1 @@ --rt16 +-rt17