From 2fda8baf808b5f7b8adf559484d17fe96d650b51 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 28 Mar 2008 10:48:54 -0700 Subject: [PATCH] kclient: drop leases before modify ops that would require revocation --- src/kernel/dir.c | 7 ++++--- src/kernel/file.c | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 8f4d18ba20c..ebcc99077d5 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -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); diff --git a/src/kernel/file.c b/src/kernel/file.c index b880d935eac..16d421f57ea 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -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);