aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2010-10-10 05:36:29 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2010-10-25 21:26:14 -0400
commitbe9eee2e8b87e335531a3ae13abb8d26e834c438 (patch)
treec9590e1b5b246cdbd1e8cd5bc2d314a86b11f814 /fs
parent0461ee2616252f1f6cec628990fa913a4282dcf7 (diff)
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/smbfs/dir.c16
-rw-r--r--fs/smbfs/proc.c10
2 files changed, 8 insertions, 18 deletions
diff --git a/fs/smbfs/dir.c b/fs/smbfs/dir.c
index 00a70cab1f36..f678d421e541 100644
--- a/fs/smbfs/dir.c
+++ b/fs/smbfs/dir.c
@@ -406,21 +406,15 @@ void
406smb_renew_times(struct dentry * dentry) 406smb_renew_times(struct dentry * dentry)
407{ 407{
408 dget(dentry); 408 dget(dentry);
409 spin_lock(&dentry->d_lock); 409 dentry->d_time = jiffies;
410 for (;;) {
411 struct dentry *parent;
412 410
413 dentry->d_time = jiffies; 411 while (!IS_ROOT(dentry)) {
414 if (IS_ROOT(dentry)) 412 struct dentry *parent = dget_parent(dentry);
415 break;
416 parent = dentry->d_parent;
417 dget(parent);
418 spin_unlock(&dentry->d_lock);
419 dput(dentry); 413 dput(dentry);
420 dentry = parent; 414 dentry = parent;
421 spin_lock(&dentry->d_lock); 415
416 dentry->d_time = jiffies;
422 } 417 }
423 spin_unlock(&dentry->d_lock);
424 dput(dentry); 418 dput(dentry);
425} 419}
426 420
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