|
@@ -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);
|
|
|
|