Commit be9eee2e authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro

smbfs: use dget_parent

Use dget_parent instead of opencoding it.  This simplifies the code, but
more importanly prepares for the more complicated locking for a parent
dget in the dcache scale patch series.

Note that the d_time assignment in smb_renew_times moves out of d_lock,
but it's a single atomic 32-bit value, and that's what other sites
setting it do already.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 0461ee26
...@@ -406,21 +406,15 @@ void ...@@ -406,21 +406,15 @@ void
smb_renew_times(struct dentry * dentry) smb_renew_times(struct dentry * dentry)
{ {
dget(dentry); dget(dentry);
spin_lock(&dentry->d_lock); dentry->d_time = jiffies;
for (;;) {
struct dentry *parent;
dentry->d_time = jiffies; while (!IS_ROOT(dentry)) {
if (IS_ROOT(dentry)) struct dentry *parent = dget_parent(dentry);
break;
parent = dentry->d_parent;
dget(parent);
spin_unlock(&dentry->d_lock);
dput(dentry); dput(dentry);
dentry = parent; dentry = parent;
spin_lock(&dentry->d_lock);
dentry->d_time = jiffies;
} }
spin_unlock(&dentry->d_lock);
dput(dentry); dput(dentry);
} }
......
...@@ -332,16 +332,15 @@ static int smb_build_path(struct smb_sb_info *server, unsigned char *buf, ...@@ -332,16 +332,15 @@ static int smb_build_path(struct smb_sb_info *server, unsigned char *buf,
* and store it in reversed order [see reverse_string()] * and store it in reversed order [see reverse_string()]
*/ */
dget(entry); dget(entry);
spin_lock(&entry->d_lock);
while (!IS_ROOT(entry)) { while (!IS_ROOT(entry)) {
struct dentry *parent; struct dentry *parent;
if (maxlen < (3<<unicode)) { if (maxlen < (3<<unicode)) {
spin_unlock(&entry->d_lock);
dput(entry); dput(entry);
return -ENAMETOOLONG; return -ENAMETOOLONG;
} }
spin_lock(&entry->d_lock);
len = server->ops->convert(path, maxlen-2, len = server->ops->convert(path, maxlen-2,
entry->d_name.name, entry->d_name.len, entry->d_name.name, entry->d_name.len,
server->local_nls, server->remote_nls); server->local_nls, server->remote_nls);
...@@ -359,15 +358,12 @@ static int smb_build_path(struct smb_sb_info *server, unsigned char *buf, ...@@ -359,15 +358,12 @@ static int smb_build_path(struct smb_sb_info *server, unsigned char *buf,
} }
*path++ = '\\'; *path++ = '\\';
maxlen -= len+1; maxlen -= len+1;
parent = entry->d_parent;
dget(parent);
spin_unlock(&entry->d_lock); spin_unlock(&entry->d_lock);
parent = dget_parent(entry);
dput(entry); dput(entry);
entry = parent; entry = parent;
spin_lock(&entry->d_lock);
} }
spin_unlock(&entry->d_lock);
dput(entry); dput(entry);
reverse_string(buf, path-buf); reverse_string(buf, path-buf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment