diff options
author | Christoph Hellwig <hch@infradead.org> | 2010-10-10 05:36:29 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-10-25 21:26:14 -0400 |
commit | be9eee2e8b87e335531a3ae13abb8d26e834c438 (patch) | |
tree | c9590e1b5b246cdbd1e8cd5bc2d314a86b11f814 /fs | |
parent | 0461ee2616252f1f6cec628990fa913a4282dcf7 (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.c | 16 | ||||
-rw-r--r-- | fs/smbfs/proc.c | 10 |
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 | |||
406 | smb_renew_times(struct dentry * dentry) | 406 | smb_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 | ||