diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-26 20:58:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-26 20:58:44 -0400 |
commit | 426e1f5cec4821945642230218876b0e89aafab1 (patch) | |
tree | 2728ace018d0698886989da586210ef1543a7098 /fs/smbfs/proc.c | |
parent | 9e5fca251f44832cb996961048ea977f80faf6ea (diff) | |
parent | 63997e98a3be68d7cec806d22bf9b02b2e1daabb (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (52 commits)
split invalidate_inodes()
fs: skip I_FREEING inodes in writeback_sb_inodes
fs: fold invalidate_list into invalidate_inodes
fs: do not drop inode_lock in dispose_list
fs: inode split IO and LRU lists
fs: switch bdev inode bdi's correctly
fs: fix buffer invalidation in invalidate_list
fsnotify: use dget_parent
smbfs: use dget_parent
exportfs: use dget_parent
fs: use RCU read side protection in d_validate
fs: clean up dentry lru modification
fs: split __shrink_dcache_sb
fs: improve DCACHE_REFERENCED usage
fs: use percpu counter for nr_dentry and nr_dentry_unused
fs: simplify __d_free
fs: take dcache_lock inside __d_path
fs: do not assign default i_ino in new_inode
fs: introduce a per-cpu last_ino allocator
new helper: ihold()
...
Diffstat (limited to 'fs/smbfs/proc.c')
-rw-r--r-- | fs/smbfs/proc.c | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/fs/smbfs/proc.c b/fs/smbfs/proc.c index 71c29b6670b4..3dcf638d4d3a 100644 --- a/fs/smbfs/proc.c +++ b/fs/smbfs/proc.c | |||
@@ -332,16 +332,15 @@ static int smb_build_path(struct smb_sb_info *server, unsigned char *buf, | |||
332 | * and store it in reversed order [see reverse_string()] | 332 | * and store it in reversed order [see reverse_string()] |
333 | */ | 333 | */ |
334 | dget(entry); | 334 | dget(entry); |
335 | spin_lock(&entry->d_lock); | ||
336 | while (!IS_ROOT(entry)) { | 335 | while (!IS_ROOT(entry)) { |
337 | struct dentry *parent; | 336 | struct dentry *parent; |
338 | 337 | ||
339 | if (maxlen < (3<<unicode)) { | 338 | if (maxlen < (3<<unicode)) { |
340 | spin_unlock(&entry->d_lock); | ||
341 | dput(entry); | 339 | dput(entry); |
342 | return -ENAMETOOLONG; | 340 | return -ENAMETOOLONG; |
343 | } | 341 | } |
344 | 342 | ||
343 | spin_lock(&entry->d_lock); | ||
345 | len = server->ops->convert(path, maxlen-2, | 344 | len = server->ops->convert(path, maxlen-2, |
346 | entry->d_name.name, entry->d_name.len, | 345 | entry->d_name.name, entry->d_name.len, |
347 | server->local_nls, server->remote_nls); | 346 | server->local_nls, server->remote_nls); |
@@ -359,15 +358,12 @@ static int smb_build_path(struct smb_sb_info *server, unsigned char *buf, | |||
359 | } | 358 | } |
360 | *path++ = '\\'; | 359 | *path++ = '\\'; |
361 | maxlen -= len+1; | 360 | maxlen -= len+1; |
362 | |||
363 | parent = entry->d_parent; | ||
364 | dget(parent); | ||
365 | spin_unlock(&entry->d_lock); | 361 | spin_unlock(&entry->d_lock); |
362 | |||
363 | parent = dget_parent(entry); | ||
366 | dput(entry); | 364 | dput(entry); |
367 | entry = parent; | 365 | entry = parent; |
368 | spin_lock(&entry->d_lock); | ||
369 | } | 366 | } |
370 | spin_unlock(&entry->d_lock); | ||
371 | dput(entry); | 367 | dput(entry); |
372 | reverse_string(buf, path-buf); | 368 | reverse_string(buf, path-buf); |
373 | 369 | ||