|
@@ -90,8 +90,8 @@ static struct kmem_cache *dentry_cache __read_mostly;
|
|
|
|
|
|
/**
|
|
|
* read_seqbegin_or_lock - begin a sequence number check or locking block
|
|
|
- * lock: sequence lock
|
|
|
- * seq : sequence number to be checked
|
|
|
+ * @lock: sequence lock
|
|
|
+ * @seq : sequence number to be checked
|
|
|
*
|
|
|
* First try it once optimistically without taking the lock. If that fails,
|
|
|
* take the lock. The sequence number is also used as a marker for deciding
|
|
@@ -103,7 +103,7 @@ static inline void read_seqbegin_or_lock(seqlock_t *lock, int *seq)
|
|
|
if (!(*seq & 1)) /* Even */
|
|
|
*seq = read_seqbegin(lock);
|
|
|
else /* Odd */
|
|
|
- write_seqlock(lock);
|
|
|
+ read_seqlock_excl(lock);
|
|
|
}
|
|
|
|
|
|
static inline int need_seqretry(seqlock_t *lock, int seq)
|
|
@@ -114,7 +114,7 @@ static inline int need_seqretry(seqlock_t *lock, int seq)
|
|
|
static inline void done_seqretry(seqlock_t *lock, int seq)
|
|
|
{
|
|
|
if (seq & 1)
|
|
|
- write_sequnlock(lock);
|
|
|
+ read_sequnlock_excl(lock);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2673,9 +2673,9 @@ static int prepend(char **buffer, int *buflen, const char *str, int namelen)
|
|
|
|
|
|
/**
|
|
|
* prepend_name - prepend a pathname in front of current buffer pointer
|
|
|
- * buffer: buffer pointer
|
|
|
- * buflen: allocated length of the buffer
|
|
|
- * name: name string and length qstr structure
|
|
|
+ * @buffer: buffer pointer
|
|
|
+ * @buflen: allocated length of the buffer
|
|
|
+ * @name: name string and length qstr structure
|
|
|
*
|
|
|
* With RCU path tracing, it may race with d_move(). Use ACCESS_ONCE() to
|
|
|
* make sure that either the old or the new name pointer and length are
|
|
@@ -2713,14 +2713,15 @@ static int prepend_name(char **buffer, int *buflen, struct qstr *name)
|
|
|
* @buffer: pointer to the end of the buffer
|
|
|
* @buflen: pointer to buffer length
|
|
|
*
|
|
|
- * The function tries to write out the pathname without taking any lock other
|
|
|
- * than the RCU read lock to make sure that dentries won't go away. It only
|
|
|
- * checks the sequence number of the global rename_lock as any change in the
|
|
|
- * dentry's d_seq will be preceded by changes in the rename_lock sequence
|
|
|
- * number. If the sequence number had been change, it will restart the whole
|
|
|
- * pathname back-tracing sequence again. It performs a total of 3 trials of
|
|
|
- * lockless back-tracing sequences before falling back to take the
|
|
|
- * rename_lock.
|
|
|
+ * The function will first try to write out the pathname without taking any
|
|
|
+ * lock other than the RCU read lock to make sure that dentries won't go away.
|
|
|
+ * It only checks the sequence number of the global rename_lock as any change
|
|
|
+ * in the dentry's d_seq will be preceded by changes in the rename_lock
|
|
|
+ * sequence number. If the sequence number had been changed, it will restart
|
|
|
+ * the whole pathname back-tracing sequence again by taking the rename_lock.
|
|
|
+ * In this case, there is no need to take the RCU read lock as the recursive
|
|
|
+ * parent pointer references will keep the dentry chain alive as long as no
|
|
|
+ * rename operation is performed.
|
|
|
*/
|
|
|
static int prepend_path(const struct path *path,
|
|
|
const struct path *root,
|