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: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
0461ee2616
Коммит
be9eee2e8b
|
@ -406,21 +406,15 @@ void
|
|||
smb_renew_times(struct dentry * dentry)
|
||||
{
|
||||
dget(dentry);
|
||||
spin_lock(&dentry->d_lock);
|
||||
for (;;) {
|
||||
struct dentry *parent;
|
||||
dentry->d_time = jiffies;
|
||||
|
||||
dentry->d_time = jiffies;
|
||||
if (IS_ROOT(dentry))
|
||||
break;
|
||||
parent = dentry->d_parent;
|
||||
dget(parent);
|
||||
spin_unlock(&dentry->d_lock);
|
||||
while (!IS_ROOT(dentry)) {
|
||||
struct dentry *parent = dget_parent(dentry);
|
||||
dput(dentry);
|
||||
dentry = parent;
|
||||
spin_lock(&dentry->d_lock);
|
||||
|
||||
dentry->d_time = jiffies;
|
||||
}
|
||||
spin_unlock(&dentry->d_lock);
|
||||
dput(dentry);
|
||||
}
|
||||
|
||||
|
|
|
@ -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()]
|
||||
*/
|
||||
dget(entry);
|
||||
spin_lock(&entry->d_lock);
|
||||
while (!IS_ROOT(entry)) {
|
||||
struct dentry *parent;
|
||||
|
||||
if (maxlen < (3<<unicode)) {
|
||||
spin_unlock(&entry->d_lock);
|
||||
dput(entry);
|
||||
return -ENAMETOOLONG;
|
||||
}
|
||||
|
||||
spin_lock(&entry->d_lock);
|
||||
len = server->ops->convert(path, maxlen-2,
|
||||
entry->d_name.name, entry->d_name.len,
|
||||
server->local_nls, server->remote_nls);
|
||||
|
@ -359,15 +358,12 @@ static int smb_build_path(struct smb_sb_info *server, unsigned char *buf,
|
|||
}
|
||||
*path++ = '\\';
|
||||
maxlen -= len+1;
|
||||
|
||||
parent = entry->d_parent;
|
||||
dget(parent);
|
||||
spin_unlock(&entry->d_lock);
|
||||
|
||||
parent = dget_parent(entry);
|
||||
dput(entry);
|
||||
entry = parent;
|
||||
spin_lock(&entry->d_lock);
|
||||
}
|
||||
spin_unlock(&entry->d_lock);
|
||||
dput(entry);
|
||||
reverse_string(buf, path-buf);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче