ceph: do not retain caps that are being revoked
authorSage Weil <sage@newdream.net>
Tue, 9 Feb 2010 21:41:47 +0000 (13:41 -0800)
committerSage Weil <sage@newdream.net>
Thu, 11 Feb 2010 19:48:52 +0000 (11:48 -0800)
Never retain caps in __send_cap() that are being revoked.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/caps.c

index 822f7d3..7f4841c 100644 (file)
@@ -1042,10 +1042,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
        struct ceph_inode_info *ci = cap->ci;
        struct inode *inode = &ci->vfs_inode;
        u64 cap_id = cap->cap_id;
-       int held = cap->issued | cap->implemented;
-       int revoking = cap->implemented & ~cap->issued;
-       int dropping = cap->issued & ~retain;
-       int keep;
+       int held, revoking, dropping, keep;
        u64 seq, issue_seq, mseq, time_warp_seq, follows;
        u64 size, max_size;
        struct timespec mtime, atime;
@@ -1060,6 +1057,11 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
        int i;
        int ret;
 
+       held = cap->issued | cap->implemented;
+       revoking = cap->implemented & ~cap->issued;
+       retain &= ~revoking;
+       dropping = cap->issued & ~retain;
+
        dout("__send_cap %p cap %p session %p %s -> %s (revoking %s)\n",
             inode, cap, cap->session,
             ceph_cap_string(held), ceph_cap_string(held & retain),