diff options
| author | Sage Weil <sage@inktank.com> | 2013-02-05 16:40:09 -0500 |
|---|---|---|
| committer | Yan, Zheng <zheng.z.yan@intel.com> | 2014-04-02 22:33:53 -0400 |
| commit | 844d87c3329980e2b1849cf53205d7fa965d8995 (patch) | |
| tree | 46e524da39d068d18d03502323871099144dec4c | |
| parent | 752c8bdcfe88f27a17c5c9264df928fd145a4b30 (diff) | |
ceph: do not assume r_old_dentry[_dir] always set together
Do not assume that r_old_dentry implies that r_old_dentry_dir is also
true. Separate out the ref cleanup and make the debugs dump behave when
it is NULL.
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Yan, Zheng <zheng.z.yan@intel.com>
| -rw-r--r-- | fs/ceph/debugfs.c | 3 | ||||
| -rw-r--r-- | fs/ceph/mds_client.c | 7 |
2 files changed, 6 insertions, 4 deletions
diff --git a/fs/ceph/debugfs.c b/fs/ceph/debugfs.c index 6d59006bfa27..8c6f313db3ea 100644 --- a/fs/ceph/debugfs.c +++ b/fs/ceph/debugfs.c | |||
| @@ -102,7 +102,8 @@ static int mdsc_show(struct seq_file *s, void *p) | |||
| 102 | path = NULL; | 102 | path = NULL; |
| 103 | spin_lock(&req->r_old_dentry->d_lock); | 103 | spin_lock(&req->r_old_dentry->d_lock); |
| 104 | seq_printf(s, " #%llx/%.*s (%s)", | 104 | seq_printf(s, " #%llx/%.*s (%s)", |
| 105 | ceph_ino(req->r_old_dentry_dir), | 105 | req->r_old_dentry_dir ? |
| 106 | ceph_ino(req->r_old_dentry_dir) : 0, | ||
| 106 | req->r_old_dentry->d_name.len, | 107 | req->r_old_dentry->d_name.len, |
| 107 | req->r_old_dentry->d_name.name, | 108 | req->r_old_dentry->d_name.name, |
| 108 | path ? path : ""); | 109 | path ? path : ""); |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index f4f050a69a48..f260bd8d61cd 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -528,7 +528,9 @@ void ceph_mdsc_release_request(struct kref *kref) | |||
| 528 | iput(req->r_target_inode); | 528 | iput(req->r_target_inode); |
| 529 | if (req->r_dentry) | 529 | if (req->r_dentry) |
| 530 | dput(req->r_dentry); | 530 | dput(req->r_dentry); |
| 531 | if (req->r_old_dentry) { | 531 | if (req->r_old_dentry) |
| 532 | dput(req->r_old_dentry); | ||
| 533 | if (req->r_old_dentry_dir) { | ||
| 532 | /* | 534 | /* |
| 533 | * track (and drop pins for) r_old_dentry_dir | 535 | * track (and drop pins for) r_old_dentry_dir |
| 534 | * separately, since r_old_dentry's d_parent may have | 536 | * separately, since r_old_dentry's d_parent may have |
| @@ -537,7 +539,6 @@ void ceph_mdsc_release_request(struct kref *kref) | |||
| 537 | */ | 539 | */ |
| 538 | ceph_put_cap_refs(ceph_inode(req->r_old_dentry_dir), | 540 | ceph_put_cap_refs(ceph_inode(req->r_old_dentry_dir), |
| 539 | CEPH_CAP_PIN); | 541 | CEPH_CAP_PIN); |
| 540 | dput(req->r_old_dentry); | ||
| 541 | iput(req->r_old_dentry_dir); | 542 | iput(req->r_old_dentry_dir); |
| 542 | } | 543 | } |
| 543 | kfree(req->r_path1); | 544 | kfree(req->r_path1); |
| @@ -2053,7 +2054,7 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc, | |||
| 2053 | ceph_get_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); | 2054 | ceph_get_cap_refs(ceph_inode(req->r_inode), CEPH_CAP_PIN); |
| 2054 | if (req->r_locked_dir) | 2055 | if (req->r_locked_dir) |
| 2055 | ceph_get_cap_refs(ceph_inode(req->r_locked_dir), CEPH_CAP_PIN); | 2056 | ceph_get_cap_refs(ceph_inode(req->r_locked_dir), CEPH_CAP_PIN); |
| 2056 | if (req->r_old_dentry) | 2057 | if (req->r_old_dentry_dir) |
| 2057 | ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), | 2058 | ceph_get_cap_refs(ceph_inode(req->r_old_dentry_dir), |
| 2058 | CEPH_CAP_PIN); | 2059 | CEPH_CAP_PIN); |
| 2059 | 2060 | ||
