kclient: drop leases before modify ops that would require revocation

This commit is contained in:
Sage Weil 2008-03-28 10:48:54 -07:00
parent d8708bbca4
commit 2fda8baf80
2 changed files with 6 additions and 3 deletions

View File

@ -368,6 +368,7 @@ static int ceph_dir_mknod(struct inode *dir, struct dentry *dentry,
d_drop(dentry);
return PTR_ERR(req);
}
ceph_mdsc_lease_release(mdsc, dir, 0, CEPH_LOCK_ICONTENT);
rhead = req->r_request->front.iov_base;
rhead->args.mknod.mode = cpu_to_le32(mode);
rhead->args.mknod.rdev = cpu_to_le32(rdev);
@ -400,6 +401,7 @@ static int ceph_dir_symlink(struct inode *dir, struct dentry *dentry,
d_drop(dentry);
return PTR_ERR(req);
}
ceph_mdsc_lease_release(mdsc, dir, 0, CEPH_LOCK_ICONTENT);
err = ceph_mdsc_do_request(mdsc, req);
ceph_mdsc_put_request(req);
if (err < 0)
@ -429,6 +431,7 @@ static int ceph_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
d_drop(dentry);
return PTR_ERR(req);
}
ceph_mdsc_lease_release(mdsc, dir, 0, CEPH_LOCK_ICONTENT);
rhead = req->r_request->front.iov_base;
rhead->args.mkdir.mode = cpu_to_le32(mode);
err = ceph_mdsc_do_request(mdsc, req);
@ -469,11 +472,9 @@ static int ceph_dir_link(struct dentry *old_dentry, struct inode *dir,
d_drop(dentry);
return PTR_ERR(req);
}
ceph_mdsc_lease_release(mdsc, dir, 0, CEPH_LOCK_ICONTENT);
err = ceph_mdsc_do_request(mdsc, req);
ceph_mdsc_put_request(req);
if (!err) {
igrab(old_dentry->d_inode);
inc_nlink(old_dentry->d_inode);

View File

@ -136,6 +136,8 @@ int ceph_lookup_open(struct inode *dir, struct dentry *dentry,
req = prepare_open_request(dir->i_sb, dentry, flags, mode);
if (IS_ERR(req))
return PTR_ERR(req);
if (flags & O_CREAT)
ceph_mdsc_lease_release(mdsc, dir, 0, CEPH_LOCK_ICONTENT);
dget(dentry); /* to match put_request below */
req->r_last_dentry = dentry; /* use this dentry in fill_trace */
err = ceph_mdsc_do_request(mdsc, req);