]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: lease renewal fixes, cleanups
authorSage Weil <sage@newdream.net>
Fri, 13 Mar 2009 23:47:30 +0000 (16:47 -0700)
committerSage Weil <sage@newdream.net>
Fri, 13 Mar 2009 23:47:30 +0000 (16:47 -0700)
src/kernel/dir.c
src/kernel/mds_client.c
src/kernel/mds_client.h

index 98bbe0a6675ce28dac95e262076c77890e3e9867..309ce847e6eef88ac999c0ec5aa42713a8631132 100644 (file)
@@ -644,6 +644,7 @@ static int dentry_lease_is_valid(struct dentry *dentry)
        unsigned long ttl;
        struct inode *dir;
        int mds;
+       u32 seq;
 
        spin_lock(&dentry->d_lock);
        di = ceph_dentry(dentry);
@@ -663,9 +664,11 @@ static int dentry_lease_is_valid(struct dentry *dentry)
                                should_renew = 1;
                                dir = dentry->d_parent->d_inode;
                                mds = s->s_mds;
+                               seq = di->lease_seq;
                                di->lease_renew_after = 0;
                        } else {
-                               dout(0, "should_renew = 0, %ld < %ld\n", jiffies, di->lease_renew_after);
+                               dout(0, "should_renew = 0, %ld < %ld\n",
+                                    jiffies, di->lease_renew_after);
                        }
                } else {
                        ceph_put_mds_session(di->lease_session);
@@ -676,8 +679,10 @@ static int dentry_lease_is_valid(struct dentry *dentry)
        spin_unlock(&dentry->d_lock);
 
        if (should_renew) {
-               dout(0, "dentry_lease should_renew! - dentry %p = %d\n", dentry, valid);
-               ceph_mdsc_lease_send_msg(&ceph_client(dentry->d_sb)->mdsc, mds, dir, dentry, CEPH_MDS_LEASE_RENEW, CEPH_LOCK_DN);
+               dout(0, "dentry_lease should_renew! - dentry %p = %d\n",
+                    dentry, valid);
+               ceph_mdsc_lease_send_msg(&ceph_client(dentry->d_sb)->mdsc,
+                        mds, dir, dentry, CEPH_MDS_LEASE_RENEW, seq);
        }
        dout(20, "dentry_lease_is_valid - dentry %p = %d\n", dentry, valid);
        return valid;
index 63dbd8269bdba3b0f3bac9d941714bce92699faa..265afb1ead10e610eaebcaddd7d846d3d2dfcbf8 100644 (file)
@@ -2002,35 +2002,32 @@ bad:
        dout(0, "corrupt lease message\n");
 }
 
-void ceph_mdsc_lease_send_msg(struct ceph_mds_client *mdsc, int mds, struct inode *inode,
-                       struct dentry *dentry, char action, int mask)
+void ceph_mdsc_lease_send_msg(struct ceph_mds_client *mdsc, int mds,
+                             struct inode *inode,
+                             struct dentry *dentry, char action,
+                             u32 seq)
 {
        struct ceph_msg *msg;
        struct ceph_mds_lease *lease;
        int len = sizeof(*lease) + sizeof(u32);
        int dnamelen = 0;
-       struct ceph_dentry_info *di;
-
-       dout(0, "lease_release_send_msg inode %p dentry %p %d mask %d to mds%d\n",
-            inode, dentry, dnamelen, mask, mds);
 
-       BUG_ON(!dentry);
+       dout(0, "lease_send_msg inode %p dentry %p %s to mds%d\n",
+            inode, dentry, ceph_lease_op_name(action), mds);
 
        dnamelen = dentry->d_name.len;
        len += dnamelen;
 
-       di = ceph_dentry(dentry);
-       BUG_ON(!di);
-
        msg = ceph_msg_new(CEPH_MSG_CLIENT_LEASE, len, 0, 0, NULL);
        if (IS_ERR(msg))
                return;
        lease = msg->front.iov_base;
-       lease->action = CEPH_MDS_LEASE_RELEASE;
-       lease->mask = cpu_to_le16(mask);
+       lease->action = action;
+       lease->mask = cpu_to_le16(CEPH_LOCK_DN);
        lease->ino = cpu_to_le64(ceph_vino(inode).ino);
        lease->first = lease->last = cpu_to_le64(ceph_vino(inode).snap);
-       lease->seq = di->lease_seq;
+       lease->seq = cpu_to_le32(seq);
+       lease->renew_start = cpu_to_le64(jiffies);
        *(__le32 *)((void *)lease + sizeof(*lease)) = cpu_to_le32(dnamelen);
        if (dentry) {
                memcpy((void *)lease + sizeof(*lease) + 4, dentry->d_name.name,
@@ -2048,6 +2045,7 @@ void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode,
 {
        struct ceph_dentry_info *di;
        int mds = -1;
+       u32 seq;
 
        BUG_ON(inode == NULL);
        BUG_ON(dentry == NULL);
@@ -2062,10 +2060,12 @@ void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode,
            time_before(jiffies, dentry->d_time)) {
                /* we do have a lease on this dentry; note mds */
                mds = di->lease_session->s_mds;
+               seq = di->lease_seq;
        } else {
                dout(10, "lease_release inode %p dentry %p -- "
                     "no lease on %d\n",
                     inode, dentry, mask);
+               spin_unlock(&dentry->d_lock);
                return;
        }
        __drop_dentry_lease(dentry);
@@ -2075,8 +2075,8 @@ void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode,
 
        dout(10, "lease_release inode %p dentry %p mask %d to mds%d\n",
             inode, dentry, mask, mds);
-
-       ceph_mdsc_lease_send_msg(mdsc, mds, inode, dentry, CEPH_MDS_LEASE_RELEASE, mask);
+       ceph_mdsc_lease_send_msg(mdsc, mds, inode, dentry,
+                                CEPH_MDS_LEASE_RELEASE, seq);
 }
 
 
index d22292a5d2fafaa19960ff45161a0feab0d1c9fe..65aed593dc39440a86c59ba40bfe70572dcc70ac 100644 (file)
@@ -311,7 +311,9 @@ extern struct ceph_mds_request *ceph_mdsc_get_listener_req(struct inode *inode,
                                                    u64 tid);
 extern char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base, int mds);
 
-extern void ceph_mdsc_lease_send_msg(struct ceph_mds_client *mdsc, int mds, struct inode *inode,
-                       struct dentry *dentry, char action, int mask);
+extern void ceph_mdsc_lease_send_msg(struct ceph_mds_client *mdsc, int mds,
+                                    struct inode *inode,
+                                    struct dentry *dentry, char action,
+                                    u32 seq);
 
 #endif