diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-01-16 21:21:04 +0000 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-01-16 21:21:04 +0000 |
commit | f652f6c5b7cfdf139f4155d78f397e99ae1c4acc (patch) | |
tree | 71c6344688bf56ea6aaf18c586ab69ff4f077ade /fs/autofs4/waitq.c | |
parent | 140e3008e7fe1526cbb12f8f07dbc273ac713b75 (diff) | |
parent | c66ac9db8d4ad9994a02b3e933ea2ccc643e1fe5 (diff) | |
download | kernel_goldelico_gta04-f652f6c5b7cfdf139f4155d78f397e99ae1c4acc.zip kernel_goldelico_gta04-f652f6c5b7cfdf139f4155d78f397e99ae1c4acc.tar.gz kernel_goldelico_gta04-f652f6c5b7cfdf139f4155d78f397e99ae1c4acc.tar.bz2 |
Merge branch 'master' of /pub/scm/linux/kernel/git/jejb/scsi-post-merge-2.6 into for-linus
Diffstat (limited to 'fs/autofs4/waitq.c')
-rw-r--r-- | fs/autofs4/waitq.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index 2341375..c5f8459 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c @@ -186,16 +186,26 @@ static int autofs4_getpath(struct autofs_sb_info *sbi, { struct dentry *root = sbi->sb->s_root; struct dentry *tmp; - char *buf = *name; + char *buf; char *p; - int len = 0; + int len; + unsigned seq; - spin_lock(&dcache_lock); +rename_retry: + buf = *name; + len = 0; + + seq = read_seqbegin(&rename_lock); + rcu_read_lock(); + spin_lock(&autofs4_lock); for (tmp = dentry ; tmp != root ; tmp = tmp->d_parent) len += tmp->d_name.len + 1; if (!len || --len > NAME_MAX) { - spin_unlock(&dcache_lock); + spin_unlock(&autofs4_lock); + rcu_read_unlock(); + if (read_seqretry(&rename_lock, seq)) + goto rename_retry; return 0; } @@ -208,7 +218,10 @@ static int autofs4_getpath(struct autofs_sb_info *sbi, p -= tmp->d_name.len; strncpy(p, tmp->d_name.name, tmp->d_name.len); } - spin_unlock(&dcache_lock); + spin_unlock(&autofs4_lock); + rcu_read_unlock(); + if (read_seqretry(&rename_lock, seq)) + goto rename_retry; return len; } |