summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2012-02-27 18:08:46 +0100
committerClark Williams <williams@redhat.com>2012-03-06 10:17:29 -0600
commite84d65e9a9f65dac1d6ec54b1851074be47285a8 (patch)
tree3ac5bce6555450d209405643752cc1dca73e4d40 /include/linux
parent32fb9a147bacac55a6f9969b9d0e114e9186e25d (diff)
fs: dentry use seqlock
Replace the open coded seqlock with a real seqlock, so RT can handle it. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: stable-rt@vger.kernel.org
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/dcache.h15
-rw-r--r--include/linux/fs.h4
-rw-r--r--include/linux/fsnotify_backend.h6
3 files changed, 12 insertions, 13 deletions
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index 4eb8c80c04c6..b0802ba6e101 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -116,7 +116,7 @@ full_name_hash(const unsigned char *name, unsigned int len)
struct dentry {
/* RCU lookup touched fields */
unsigned int d_flags; /* protected by d_lock */
- seqcount_t d_seq; /* per dentry seqlock */
+ seqlock_t d_lock; /* per dentry seqlock */
struct hlist_bl_node d_hash; /* lookup hash list */
struct dentry *d_parent; /* parent directory */
struct qstr d_name;
@@ -126,7 +126,6 @@ struct dentry {
/* Ref lookup also touches following */
unsigned int d_count; /* protected by d_lock */
- spinlock_t d_lock; /* per dentry lock */
const struct dentry_operations *d_op;
struct super_block *d_sb; /* The root of the dentry tree */
unsigned long d_time; /* used by d_revalidate */
@@ -323,8 +322,8 @@ static inline int __d_rcu_to_refcount(struct dentry *dentry, unsigned seq)
{
int ret = 0;
- assert_spin_locked(&dentry->d_lock);
- if (!read_seqcount_retry(&dentry->d_seq, seq)) {
+ assert_seq_spin_locked(&dentry->d_lock);
+ if (!read_seqretry(&dentry->d_lock, seq)) {
ret = 1;
dentry->d_count++;
}
@@ -367,9 +366,9 @@ static inline struct dentry *dget_dlock(struct dentry *dentry)
static inline struct dentry *dget(struct dentry *dentry)
{
if (dentry) {
- spin_lock(&dentry->d_lock);
+ seq_spin_lock(&dentry->d_lock);
dget_dlock(dentry);
- spin_unlock(&dentry->d_lock);
+ seq_spin_unlock(&dentry->d_lock);
}
return dentry;
}
@@ -400,9 +399,9 @@ static inline int cant_mount(struct dentry *dentry)
static inline void dont_mount(struct dentry *dentry)
{
- spin_lock(&dentry->d_lock);
+ seq_spin_lock(&dentry->d_lock);
dentry->d_flags |= DCACHE_CANT_MOUNT;
- spin_unlock(&dentry->d_lock);
+ seq_spin_unlock(&dentry->d_lock);
}
extern void dput(struct dentry *);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 10b228818b10..99fb59ceba3b 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2603,9 +2603,9 @@ static inline ino_t parent_ino(struct dentry *dentry)
* Don't strictly need d_lock here? If the parent ino could change
* then surely we'd have a deeper race in the caller?
*/
- spin_lock(&dentry->d_lock);
+ seq_spin_lock(&dentry->d_lock);
res = dentry->d_parent->d_inode->i_ino;
- spin_unlock(&dentry->d_lock);
+ seq_spin_unlock(&dentry->d_lock);
return res;
}
diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h
index 91d0e0a34ef3..67cff5bfb0d8 100644
--- a/include/linux/fsnotify_backend.h
+++ b/include/linux/fsnotify_backend.h
@@ -329,7 +329,7 @@ static inline void __fsnotify_update_dcache_flags(struct dentry *dentry)
{
struct dentry *parent;
- assert_spin_locked(&dentry->d_lock);
+ assert_seq_spin_locked(&dentry->d_lock);
/*
* Serialisation of setting PARENT_WATCHED on the dentries is provided
@@ -353,9 +353,9 @@ static inline void __fsnotify_d_instantiate(struct dentry *dentry, struct inode
if (!inode)
return;
- spin_lock(&dentry->d_lock);
+ seq_spin_lock(&dentry->d_lock);
__fsnotify_update_dcache_flags(dentry);
- spin_unlock(&dentry->d_lock);
+ seq_spin_unlock(&dentry->d_lock);
}
/* called from fsnotify listeners, such as fanotify or dnotify */