diff options
author | Sage Weil <sage@newdream.net> | 2011-07-26 14:31:14 -0400 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2011-07-26 14:31:14 -0400 |
commit | 41b02e1f9bb87b07d792b64aaeb7af3d00d69cd2 (patch) | |
tree | 87c9524ff96cbff2ff29d659cbefd516b553ca1f /fs/ceph/dir.c | |
parent | 4f1772645296a230e04f5c53e79cfb6f841ce634 (diff) |
ceph: explicitly reference rename old_dentry parent dir in request
We carry a pin on the parent directory for the rename source and dest
dentries. For the source it's r_locked_dir; we need to explicitly
reference the old_dentry parent as well, since the dentry's d_parent may
change between when the request was created and pinned and when it is
freed.
Reviewed-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/dir.c')
-rw-r--r-- | fs/ceph/dir.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 33a19df72288..7263f825d426 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
@@ -811,6 +811,7 @@ static int ceph_link(struct dentry *old_dentry, struct inode *dir, | |||
811 | req->r_dentry = dget(dentry); | 811 | req->r_dentry = dget(dentry); |
812 | req->r_num_caps = 2; | 812 | req->r_num_caps = 2; |
813 | req->r_old_dentry = dget(old_dentry); /* or inode? hrm. */ | 813 | req->r_old_dentry = dget(old_dentry); /* or inode? hrm. */ |
814 | req->r_old_dentry_dir = ceph_get_dentry_parent_inode(old_dentry); | ||
814 | req->r_locked_dir = dir; | 815 | req->r_locked_dir = dir; |
815 | req->r_dentry_drop = CEPH_CAP_FILE_SHARED; | 816 | req->r_dentry_drop = CEPH_CAP_FILE_SHARED; |
816 | req->r_dentry_unless = CEPH_CAP_FILE_EXCL; | 817 | req->r_dentry_unless = CEPH_CAP_FILE_EXCL; |
@@ -909,6 +910,7 @@ static int ceph_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
909 | req->r_dentry = dget(new_dentry); | 910 | req->r_dentry = dget(new_dentry); |
910 | req->r_num_caps = 2; | 911 | req->r_num_caps = 2; |
911 | req->r_old_dentry = dget(old_dentry); | 912 | req->r_old_dentry = dget(old_dentry); |
913 | req->r_old_dentry_dir = ceph_get_dentry_parent_inode(old_dentry); | ||
912 | req->r_locked_dir = new_dir; | 914 | req->r_locked_dir = new_dir; |
913 | req->r_old_dentry_drop = CEPH_CAP_FILE_SHARED; | 915 | req->r_old_dentry_drop = CEPH_CAP_FILE_SHARED; |
914 | req->r_old_dentry_unless = CEPH_CAP_FILE_EXCL; | 916 | req->r_old_dentry_unless = CEPH_CAP_FILE_EXCL; |