]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: switch from inode leases to new caps
authorYehuda Sadeh <yehuda@hq.newdream.net>
Sun, 4 Jan 2009 18:50:56 +0000 (10:50 -0800)
committerSage Weil <sage@newdream.net>
Sun, 4 Jan 2009 18:50:56 +0000 (10:50 -0800)
----------------------------

src/include/ceph_fs.h
src/kernel/caps.c
src/kernel/dir.c
src/kernel/file.c
src/kernel/inode.c
src/kernel/ioctl.c
src/kernel/mds_client.c
src/kernel/snap.c
src/kernel/super.h

index e9a12a8d8f542c4405d225499d63d18cbe1eb835..4ca9a92d3534eec537c98b8789d18d8f2ec8d513 100644 (file)
@@ -910,6 +910,7 @@ static inline int ceph_flags_to_mode(int flags)
 #define CEPH_CAP_LINK_EXCL     (CEPH_CAP_GEXCL     << CEPH_CAP_SLINK)
 #define CEPH_CAP_XATTR_RDCACHE (CEPH_CAP_GRDCACHE  << CEPH_CAP_SXATTR)
 #define CEPH_CAP_XATTR_EXCL    (CEPH_CAP_GEXCL     << CEPH_CAP_SXATTR)
+#define CEPH_CAP_FILE(x)    (x << CEPH_CAP_SFILE)
 #define CEPH_CAP_FILE_RDCACHE  (CEPH_CAP_GRDCACHE  << CEPH_CAP_SFILE)
 #define CEPH_CAP_FILE_EXCL     (CEPH_CAP_GEXCL     << CEPH_CAP_SFILE)
 #define CEPH_CAP_FILE_RD       (CEPH_CAP_GRD       << CEPH_CAP_SFILE)
index 9bbb38b10b8f0436b039ec79bb62a62d6f6d0d6c..cfe6d2e31001e7a033fa81b2e673f9e835e9b897 100644 (file)
@@ -53,7 +53,9 @@ static int __ceph_get_cap_mds(struct ceph_inode_info *ci, u32 *mseq)
                mds = cap->mds;
                if (mseq)
                        *mseq = cap->mseq;
-               if (cap->issued & (CEPH_CAP_WR|CEPH_CAP_WRBUFFER|CEPH_CAP_EXCL))
+               if (cap->issued & (CEPH_CAP_FILE_WR |
+                                  CEPH_CAP_FILE_WRBUFFER |
+                                  CEPH_CAP_FILE_EXCL))
                        break;
        }
        return mds;
@@ -406,7 +408,7 @@ static void __send_cap(struct ceph_mds_client *mdsc,
        follows = ci->i_snap_realm->cached_context->seq;
        spin_unlock(&inode->i_lock);
 
-       if (dropping & CEPH_CAP_RDCACHE) {
+       if (dropping & CEPH_CAP_FILE_RDCACHE) {
                /* invalidate what we can */
                dout(20, "invalidating pages on %p\n", inode);
                invalidate_mapping_pages(&inode->i_data, 0, -1);
@@ -639,7 +641,7 @@ retry_locked:
                        goto ack;
 
                /* approaching file_max? */
-               if ((cap->issued & CEPH_CAP_WR) &&
+               if ((cap->issued & CEPH_CAP_FILE_WR) &&
                    (inode->i_size << 1) >= ci->i_max_size &&
                    (ci->i_reported_size << 1) < ci->i_max_size) {
                        dout(10, "i_size approaching max_size\n");
@@ -719,13 +721,13 @@ ack:
  */
 static void __take_cap_refs(struct ceph_inode_info *ci, int got)
 {
-       if (got & CEPH_CAP_RD)
+       if (got & CEPH_CAP_FILE_RD)
                ci->i_rd_ref++;
-       if (got & CEPH_CAP_RDCACHE)
+       if (got & CEPH_CAP_FILE_RDCACHE)
                ci->i_rdcache_ref++;
-       if (got & CEPH_CAP_WR)
+       if (got & CEPH_CAP_FILE_WR)
                ci->i_wr_ref++;
-       if (got & CEPH_CAP_WRBUFFER) {
+       if (got & CEPH_CAP_FILE_WRBUFFER) {
                ci->i_wrbuffer_ref++;
                dout(30, "__take_cap_refs %p wrbuffer %d -> %d (?)\n",
                     &ci->vfs_inode, ci->i_wrbuffer_ref-1, ci->i_wrbuffer_ref);
@@ -748,7 +750,7 @@ int ceph_get_cap_refs(struct ceph_inode_info *ci, int need, int want, int *got,
 
        dout(30, "get_cap_refs %p need %d want %d\n", inode, need, want);
        spin_lock(&inode->i_lock);
-       if (need & CEPH_CAP_WR) {
+       if (need & CEPH_CAP_FILE_WR) {
                if (endoff >= 0 && endoff > (loff_t)ci->i_max_size) {
                        dout(20, "get_cap_refs %p endoff %llu > maxsize %llu\n",
                             inode, endoff, ci->i_max_size);
@@ -811,19 +813,19 @@ void ceph_put_cap_refs(struct ceph_inode_info *ci, int had)
        struct ceph_cap_snap *capsnap;
 
        spin_lock(&inode->i_lock);
-       if (had & CEPH_CAP_RD)
+       if (had & CEPH_CAP_FILE_RD)
                if (--ci->i_rd_ref == 0)
                        last++;
-       if (had & CEPH_CAP_RDCACHE)
+       if (had & CEPH_CAP_FILE_RDCACHE)
                if (--ci->i_rdcache_ref == 0)
                        last++;
-       if (had & CEPH_CAP_WRBUFFER) {
+       if (had & CEPH_CAP_FILE_WRBUFFER) {
                if (--ci->i_wrbuffer_ref == 0)
                        last++;
                dout(30, "put_cap_refs %p wrbuffer %d -> %d (?)\n",
                     inode, ci->i_wrbuffer_ref+1, ci->i_wrbuffer_ref);
        }
-       if (had & CEPH_CAP_WR)
+       if (had & CEPH_CAP_FILE_WR)
                if (--ci->i_wr_ref == 0) {
                        last++;
                        if (!list_empty(&ci->i_cap_snaps)) {
@@ -971,9 +973,9 @@ start:
        /*
         * Each time we receive RDCACHE anew, we increment i_rdcache_gen.
         */
-       if ((newcaps & CEPH_CAP_RDCACHE) &&            /* we just got RDCACHE */
-           (cap->issued & CEPH_CAP_RDCACHE) == 0 &&    /* and didn't have it */
-           (__ceph_caps_issued(ci, NULL) & CEPH_CAP_RDCACHE) == 0)
+       if ((newcaps & CEPH_CAP_FILE_RDCACHE) &&            /* we just got RDCACHE */
+           (cap->issued & CEPH_CAP_FILE_RDCACHE) == 0 &&    /* and didn't have it */
+           (__ceph_caps_issued(ci, NULL) & CEPH_CAP_FILE_RDCACHE) == 0)
                ci->i_rdcache_gen++;
 
        /*
@@ -981,7 +983,7 @@ start:
         * try to invalidate (once).  (If there are dirty buffers, we
         * will invalidate _after_ writeback.)
         */
-       if (((cap->issued & ~newcaps) & CEPH_CAP_RDCACHE) &&
+       if (((cap->issued & ~newcaps) & CEPH_CAP_FILE_RDCACHE) &&
            !ci->i_wrbuffer_ref && !tried_invalidate) {
                dout(10, "RDCACHE invalidation\n");
                spin_unlock(&inode->i_lock);
@@ -1045,9 +1047,9 @@ start:
        /* revocation? */
        if (cap->issued & ~newcaps) {
                dout(10, "revocation: %d -> %d\n", cap->issued, newcaps);
-               if ((used & ~newcaps) & CEPH_CAP_WRBUFFER) {
+               if ((used & ~newcaps) & CEPH_CAP_FILE_WRBUFFER) {
                        writeback = 1; /* will delay ack */
-               } else if (((used & ~newcaps) & CEPH_CAP_RDCACHE) == 0 ||
+               } else if (((used & ~newcaps) & CEPH_CAP_FILE_RDCACHE) == 0 ||
                           revoked_rdcache) {
                        /*
                         * we're not using revoked caps.. ack now.
index b9f25bf1764978cb2460e00eb5baa056d428dfb4..78fe4b40eac02796e65b9d5772a4bc7fe4f4b43c 100644 (file)
@@ -401,7 +401,7 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry,
                return ceph_lookup_open(dir, dentry, nd, mode, 1);
        }
 
-       return ceph_do_lookup(dir->i_sb, dentry, CEPH_STAT_MASK_INODE_ALL,
+       return ceph_do_lookup(dir->i_sb, dentry, CEPH_STAT_CAP_INODE_ALL,
                              0, 1);
 }
 
@@ -445,7 +445,7 @@ static int ceph_mknod(struct inode *dir, struct dentry *dentry,
                 * and the VFS needs a valid dentry.
                 */
                struct dentry *d;
-               d = ceph_do_lookup(dir->i_sb, dentry, CEPH_STAT_MASK_INODE_ALL,
+               d = ceph_do_lookup(dir->i_sb, dentry, CEPH_STAT_CAP_INODE_ALL,
                                   0, 0);
                if (d) {
                        /* ick.  this is untested, and inherently racey... i
@@ -768,8 +768,8 @@ static int ceph_dentry_revalidate(struct dentry *dentry, struct nameidata *nd)
 
        if (ceph_ino(dir) != 1 &&  /* ICONTENT is meaningless on root inode */
            ceph_inode(dir)->i_version == dentry->d_time &&
-           ceph_inode_lease_valid(dir, CEPH_LOCK_IFILE)) {
-               dout(20, "dentry_revalidate %p %lu ICONTENT on dir %p %llu\n",
+           ceph_inode_holds_cap(dir, CEPH_CAP_FILE_RDCACHE)) {
+               dout(20, "dentry_revalidate %p %lu file RDCACHE dir %p %llu\n",
                     dentry, dentry->d_time, dir, ceph_inode(dir)->i_version);
                return 1;
        }
index ba30c71c4c2d4bd36c7af26c801c45ce3d9f84f8..ad8816da2cfecd6ff012fb7998c4e92566755aaf 100644 (file)
@@ -297,15 +297,16 @@ static ssize_t ceph_aio_read(struct kiocb *iocb, const struct iovec *iov,
        dout(10, "aio_read %llx.%llx %llu~%u trying to get caps on %p\n",
             ceph_vinop(inode), pos, (unsigned)len, inode);
        ret = wait_event_interruptible(ci->i_cap_wq,
-                                      ceph_get_cap_refs(ci, CEPH_CAP_RD,
-                                                        CEPH_CAP_RDCACHE,
+                                      ceph_get_cap_refs(ci,
+                                                        CEPH_CAP_FILE_RD,
+                                                        CEPH_CAP_FILE_RDCACHE,
                                                         &got, -1));
        if (ret < 0)
                goto out;
        dout(10, "aio_read %llx.%llx %llu~%u got cap refs %d\n",
             ceph_vinop(inode), pos, (unsigned)len, got);
 
-       if ((got & CEPH_CAP_RDCACHE) == 0 ||
+       if ((got & CEPH_CAP_FILE_RDCACHE) == 0 ||
            (inode->i_sb->s_flags & MS_SYNCHRONOUS))
                /* hmm, this isn't really async... */
                ret = ceph_sync_read(filp, iov->iov_base, len, ppos);
@@ -377,8 +378,9 @@ retry_snap:
        dout(10, "aio_write %p %llu~%u getting caps. i_size %llu\n",
             inode, pos, (unsigned)iov->iov_len, inode->i_size);
        ret = wait_event_interruptible(ci->i_cap_wq,
-                                      ceph_get_cap_refs(ci, CEPH_CAP_WR,
-                                                        CEPH_CAP_WRBUFFER,
+                                      ceph_get_cap_refs(ci,
+                                                        CEPH_CAP_FILE_WR,
+                                                        CEPH_CAP_FILE_WRBUFFER,
                                                         &got, endoff));
        if (ret < 0)
                goto out;
@@ -386,7 +388,7 @@ retry_snap:
        dout(10, "aio_write %p %llu~%u  got cap refs on %d\n",
             inode, pos, (unsigned)iov->iov_len, got);
 
-       if ((got & CEPH_CAP_WRBUFFER) == 0) {
+       if ((got & CEPH_CAP_FILE_WRBUFFER) == 0) {
                ret = ceph_sync_write(file, iov->iov_base, iov->iov_len,
                        &iocb->ki_pos);
        } else {
index faf01bfa3a10220be05b4d6a32ec5ce26090c4a1..cd5e42fb6a64a84671daeaa68566919277152f78 100644 (file)
@@ -251,11 +251,6 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
        ci->i_time_warp_seq = 0;
        ci->i_symlink = NULL;
 
-       ci->i_lease_session = NULL;
-       ci->i_lease_mask = 0;
-       ci->i_lease_ttl = 0;
-       INIT_LIST_HEAD(&ci->i_lease_item);
-
        ci->i_fragtree = RB_ROOT;
        mutex_init(&ci->i_fragtree_mutex);
 
@@ -343,7 +338,7 @@ void ceph_fill_file_bits(struct inode *inode, int issued,
                ci->i_truncate_seq = truncate_seq;
        }
 
-       if (issued & CEPH_CAP_EXCL) {
+       if (issued & CEPH_CAP_FILE_EXCL) {
                /*
                 * if we hold EXCL cap, we have the most up to date
                 * values for everything except possibly ctime.
@@ -353,7 +348,7 @@ void ceph_fill_file_bits(struct inode *inode, int issued,
                if (time_warp_seq > ci->i_time_warp_seq)
                        derr(0, "WARNING: %p mds time_warp_seq %llu > %llu\n",
                             inode, time_warp_seq, ci->i_time_warp_seq);
-       } else if (issued & (CEPH_CAP_WR|CEPH_CAP_WRBUFFER)) {
+       } else if (issued & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_WRBUFFER)) {
                if (time_warp_seq > ci->i_time_warp_seq) {
                        /* the MDS did a utimes() */
                        inode->i_ctime = *ctime;
@@ -541,91 +536,19 @@ out:
        return err;
 }
 
-
-
-/*
- * caller must hold session s_mutex.
- */
-static int update_inode_lease(struct inode *inode,
-                             struct ceph_mds_reply_lease *lease,
-                             struct ceph_mds_session *session,
-                             unsigned long from_time)
-{
-       struct ceph_inode_info *ci = ceph_inode(inode);
-       int is_new = 0;
-       int mask = le16_to_cpu(lease->mask);
-       long unsigned duration = le32_to_cpu(lease->duration_ms);
-       long unsigned ttl = from_time + (duration * HZ) / 1000;
-
-       dout(10, "update_inode_lease %p mask %d duration %lu ms ttl %lu\n",
-            inode, mask, duration, ttl);
-
-       if (mask == 0)
-               return 0;
-
-       spin_lock(&inode->i_lock);
-       /*
-        * be careful: we can't remove a lease from a different session
-        * without holding the other session's s_mutex.  and we only
-        * remember one lease per object.  so if one already exists,
-        * don't touch it.
-        */
-       if ((ci->i_lease_ttl == 0 || !time_before(ttl, ci->i_lease_ttl) ||
-            ci->i_lease_gen != session->s_cap_gen) &&
-           (!ci->i_lease_session || ci->i_lease_session == session)) {
-               ci->i_lease_ttl = ttl;
-               ci->i_lease_gen = session->s_cap_gen;
-               ci->i_lease_mask = mask;
-               if (!ci->i_lease_session) {
-                       ci->i_lease_session = session;
-                       is_new = 1;
-               }
-               list_move_tail(&ci->i_lease_item, &session->s_inode_leases);
-       } else {
-               mask = 0;
-       }
-       spin_unlock(&inode->i_lock);
-       if (is_new)
-               igrab(inode);
-       return mask;
-}
-
 /*
- * check if inode lease is valid for a given mask
+ * check if inode holds specific cap
  */
-int ceph_inode_lease_valid(struct inode *inode, int mask)
+int ceph_inode_holds_cap(struct inode *inode, int mask)
 {
        struct ceph_inode_info *ci = ceph_inode(inode);
-       int havemask;
-       int valid = 0;
-       int ret = 0;
-
-       spin_lock(&inode->i_lock);
-       havemask = ci->i_lease_mask;
-
-       /* EXCL cap counts for an ICONTENT lease... check caps? */
-       if ((mask & CEPH_LOCK_IFILE) &&
-           __ceph_caps_issued(ci, NULL) & CEPH_CAP_EXCL) {
-               dout(20, "lease_valid inode %p EXCL cap -> ICONTENT\n", inode);
-               havemask |= CEPH_LOCK_IFILE;
-       }
-
-       if (ci->i_lease_session) {
-               struct ceph_mds_session *s = ci->i_lease_session;
-               spin_lock(&s->s_cap_lock);
-               if (s->s_cap_gen == ci->i_lease_gen &&
-                   time_before(jiffies, s->s_cap_ttl) &&
-                   time_before(jiffies, ci->i_lease_ttl))
-                       valid = 1;
-               spin_unlock(&s->s_cap_lock);
-       }
-       spin_unlock(&inode->i_lock);
+       int issued = ceph_caps_issued(ci);
+       int ret;
 
-       if (valid && (havemask & mask) == mask)
+       if ((issued & mask) == mask)
                ret = 1;
-
-       dout(10, "lease_valid inode %p have %d want %d valid %d = %d\n", inode,
-            havemask, mask, valid, ret);
+       dout(10, "ceph_inode_holds_cap inode %p have %d want %d = %d\n", inode,
+            issued, mask, ret);
        return ret;
 }
 
@@ -790,7 +713,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                    struct ceph_mds_session *session)
 {
        struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info;
-       int err = 0, mask;
+       int err = 0;
        struct qstr dname;
        struct dentry *dn = sb->s_root;
        struct dentry *parent = NULL;
@@ -799,7 +722,6 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
        struct ceph_mds_reply_inode *ininfo;
        int d = 0;
        struct ceph_vino vino;
-       int have_icontent;
        bool have_lease;
 
        if (rinfo->trace_numi == 0) {
@@ -848,14 +770,10 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                                      rinfo->trace_dir[0] : NULL);
                if (err < 0)
                        return err;
-               if (rinfo->trace_numd == 0)
-                       update_inode_lease(in, rinfo->trace_ilease[0],
-                                          session, req->r_request_started);
                if (unlikely(sb->s_root == NULL))
                        sb->s_root = dn;
        }
 
-       have_icontent = 0;
        have_lease = 0;
        dget(dn);
        for (d = 0; d < rinfo->trace_numd; d++) {
@@ -865,10 +783,10 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                dn = NULL;
 
                dout(10, "fill_trace %d/%d parent %p inode %p: '%.*s'"
-                    " ic %d dmask %d\n",
+                    " dmask %d\n",
                     (d+1), rinfo->trace_numd, parent, parent->d_inode,
                     (int)dname.len, dname.name,
-                    have_icontent, rinfo->trace_dlease[d]->mask);
+                    rinfo->trace_dlease[d]->mask);
 
                /* try to take dir i_mutex */
                if (req->r_locked_dir != parent->d_inode &&
@@ -878,14 +796,8 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
                        goto no_dir_mutex;
                }
 
-               /* update inode lease */
-               mask = update_inode_lease(in, rinfo->trace_ilease[d],
-                                         session, req->r_request_started);
-               have_icontent = mask & CEPH_LOCK_IFILE;
-
                /* do we have a dn lease? */
-               have_lease = have_icontent ||
-                       (le16_to_cpu(rinfo->trace_dlease[d]->mask) &
+               have_lease = (le16_to_cpu(rinfo->trace_dlease[d]->mask) &
                         CEPH_LOCK_DN);
                if (!have_lease)
                        dout(10, "fill_trace  no icontent|dentry lease\n");
@@ -1123,11 +1035,6 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req,
        if (parent)
                dput(parent);
 
-       if (in)
-               update_inode_lease(dn->d_inode,
-                                  rinfo->trace_ilease[d],
-                                  session, req->r_request_started);
-
        dout(10, "fill_trace done err=%d, last dn %p in %p\n", err, dn, in);
        if (req->r_last_dentry)
                dput(req->r_last_dentry);
@@ -1222,8 +1129,6 @@ retry_lookup:
                }
                update_dentry_lease(dn, rinfo->dir_dlease[i],
                                    req->r_session, req->r_request_started);
-               update_inode_lease(in, rinfo->dir_ilease[i],
-                                  req->r_session, req->r_request_started);
                dput(dn);
        }
 
@@ -1418,7 +1323,7 @@ static struct ceph_mds_request *prepare_setattr(struct ceph_mds_client *mdsc,
        int issued = ceph_caps_issued(ceph_inode(dentry->d_inode));
 
        if ((ia_valid & ATTR_FILE) ||
-           (issued & (CEPH_CAP_WR|CEPH_CAP_WRBUFFER))) {
+           (issued & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_WRBUFFER))) {
                dout(5, "prepare_setattr dentry %p (inode %llx.%llx)\n", dentry,
                     ceph_vinop(dentry->d_inode));
                req = ceph_mdsc_create_request(mdsc, op,
@@ -1501,7 +1406,7 @@ static int ceph_setattr_time(struct dentry *dentry, struct iattr *attr)
        int err;
 
        /* if i hold CAP_EXCL, i can change [am]time any way i like */
-       if (ceph_caps_issued(ci) & CEPH_CAP_EXCL) {
+       if (ceph_caps_issued(ci) & CEPH_CAP_FILE_EXCL) {
                dout(10, "utime holding EXCL, doing locally\n");
                ci->i_time_warp_seq++;
                if (ia_valid & ATTR_ATIME)
@@ -1513,7 +1418,7 @@ static int ceph_setattr_time(struct dentry *dentry, struct iattr *attr)
        }
 
        /* if i hold CAP_WR, i can _increase_ [am]time safely */
-       if ((ceph_caps_issued(ci) & CEPH_CAP_WR) &&
+       if ((ceph_caps_issued(ci) & CEPH_CAP_FILE_WR) &&
            ((ia_valid & ATTR_MTIME) == 0 ||
             timespec_compare(&inode->i_mtime, &attr->ia_mtime) < 0) &&
            ((ia_valid & ATTR_ATIME) == 0 ||
@@ -1526,9 +1431,8 @@ static int ceph_setattr_time(struct dentry *dentry, struct iattr *attr)
                inode->i_ctime = CURRENT_TIME;
                return 0;
        }
-
        /* if i have valid values, this may be a no-op */
-       if (ceph_inode_lease_valid(inode, CEPH_LOCK_IFILE) &&
+       if (ceph_inode_holds_cap(inode, CEPH_CAP_FILE_RDCACHE) &&
            !(((ia_valid & ATTR_ATIME) &&
               !timespec_equal(&inode->i_atime, &attr->ia_atime)) ||
              ((ia_valid & ATTR_MTIME) &&
@@ -1550,7 +1454,7 @@ static int ceph_setattr_time(struct dentry *dentry, struct iattr *attr)
        if (ia_valid & ATTR_MTIME)
                reqh->args.utime.mask |= cpu_to_le32(CEPH_UTIME_MTIME);
 
-       ceph_mdsc_lease_release(mdsc, inode, NULL, CEPH_LOCK_IFILE);
+       ceph_mdsc_lease_release(mdsc, inode, NULL, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        dout(10, "utime result %d\n", err);
@@ -1570,7 +1474,7 @@ static int ceph_setattr_size(struct dentry *dentry, struct iattr *attr)
 
        dout(10, "truncate: ia_size %d i_size %d\n",
             (int)attr->ia_size, (int)inode->i_size);
-       if (ceph_caps_issued(ci) & CEPH_CAP_EXCL &&
+       if (ceph_caps_issued(ci) & CEPH_CAP_FILE_EXCL &&
            attr->ia_size > inode->i_size) {
                dout(10, "holding EXCL, doing truncate (fwd) locally\n");
                err = vmtruncate(inode, attr->ia_size);
@@ -1583,7 +1487,7 @@ static int ceph_setattr_size(struct dentry *dentry, struct iattr *attr)
                spin_unlock(&inode->i_lock);
                return 0;
        }
-       if (ceph_inode_lease_valid(inode, CEPH_LOCK_IFILE) &&
+       if (ceph_inode_holds_cap(inode, CEPH_CAP_FILE_RDCACHE) &&
            attr->ia_size == inode->i_size) {
                dout(10, "lease indicates truncate is a no-op\n");
                return 0;
@@ -1593,7 +1497,7 @@ static int ceph_setattr_size(struct dentry *dentry, struct iattr *attr)
                return PTR_ERR(req);
        reqh = req->r_request->front.iov_base;
        reqh->args.truncate.length = cpu_to_le64(attr->ia_size);
-       ceph_mdsc_lease_release(mdsc, inode, NULL, CEPH_LOCK_IFILE);
+       ceph_mdsc_lease_release(mdsc, inode, NULL, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        dout(10, "truncate result %d\n", err);
@@ -1673,7 +1577,7 @@ int ceph_do_getattr(struct dentry *dentry, int mask)
 
        dout(30, "getattr dentry %p inode %p mask %d\n", dentry,
             dentry->d_inode, mask);
-       if (ceph_inode_lease_valid(dentry->d_inode, mask))
+       if (ceph_inode_holds_cap(dentry->d_inode, mask))
                return 0;
 
        /*
@@ -1712,7 +1616,7 @@ int ceph_getattr(struct vfsmount *mnt, struct dentry *dentry,
 {
        int err;
 
-       err = ceph_do_getattr(dentry, CEPH_STAT_MASK_INODE_ALL);
+       err = ceph_do_getattr(dentry, CEPH_STAT_CAP_INODE_ALL);
        dout(30, "getattr returned %d\n", err);
        if (!err) {
                generic_fillattr(dentry->d_inode, stat);
@@ -1827,7 +1731,7 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value,
                return (vir_xattr->getxattr_cb)(ci, value, size);
 
        /* get xattrs from mds (if we don't already have them) */
-       err = ceph_do_getattr(dentry, CEPH_STAT_MASK_XATTR);
+       err = ceph_do_getattr(dentry, CEPH_STAT_CAP_XATTR);
        if (err)
                return err;
 
@@ -1883,7 +1787,7 @@ ssize_t ceph_listxattr(struct dentry *dentry, char *names, size_t size)
        u32 len;
        int i;
 
-       err = ceph_do_getattr(dentry, CEPH_STAT_MASK_XATTR);
+       err = ceph_do_getattr(dentry, CEPH_STAT_CAP_XATTR);
        if (err)
                return err;
 
index d21042b9c9fbd029e32f71376785ad712b763710..33a942f7e277029d8ecab22f86acc1df52d6ddcd 100644 (file)
@@ -16,7 +16,7 @@ static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
        struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode);
        int err;
 
-       err = ceph_do_getattr(file->f_dentry, CEPH_STAT_MASK_LAYOUT);
+       err = ceph_do_getattr(file->f_dentry, CEPH_STAT_CAP_LAYOUT);
        if (!err) {
                if (copy_to_user(arg, &ci->i_layout, sizeof(ci->i_layout)))
                        return -EFAULT;
index 3a101a8d744fff4dd031e3a810c544689b473904..5750ae61906af452aafb372e1b1afb5f647649aa 100644 (file)
@@ -735,30 +735,6 @@ static void revoke_dentry_lease(struct dentry *dentry)
                dput(dentry);
 }
 
-/*
- * caller must hold session s_mutex
- */
-static void revoke_inode_lease(struct ceph_inode_info *ci, int mask)
-{
-       struct inode *inode = &ci->vfs_inode;
-       int drop = 0;
-
-       spin_lock(&inode->i_lock);
-       dout(10, "revoke_inode_lease on inode %p, mask %d -> %d\n",
-            inode, ci->i_lease_mask, ci->i_lease_mask & ~mask);
-       if (ci->i_lease_mask & mask) {
-               ci->i_lease_mask &= ~mask;
-               if (ci->i_lease_mask == 0) {
-                       list_del_init(&ci->i_lease_item);
-                       ci->i_lease_session = NULL;
-                       drop = 1;
-               }
-       }
-       spin_unlock(&inode->i_lock);
-       if (drop)
-               iput(inode);
-}
-
 /*
  * remove old/expired leases for this session.  unpin parent
  * inode/dentries, so that [di]cache can prune them.
@@ -767,32 +743,11 @@ static void revoke_inode_lease(struct ceph_inode_info *ci, int mask)
  */
 static void trim_session_leases(struct ceph_mds_session *session)
 {
-       struct ceph_inode_info *ci;
        struct ceph_dentry_info *di;
        struct dentry *dentry;
-       struct inode *inode;
 
        dout(20, "trim_session_leases on session %p\n", session);
 
-       /* inodes */
-       while (!list_empty(&session->s_inode_leases)) {
-               ci = list_first_entry(&session->s_inode_leases,
-                                     struct ceph_inode_info, i_lease_item);
-               inode = &ci->vfs_inode;
-               spin_lock(&inode->i_lock);
-               if (time_before(jiffies, ci->i_lease_ttl)) {
-                       spin_unlock(&inode->i_lock);
-                       break;
-               }
-               dout(20, "trim_session_leases inode %p mask %d\n",
-                    inode, ci->i_lease_mask);
-               ci->i_lease_session = NULL;
-               ci->i_lease_mask = 0;
-               list_del_init(&ci->i_lease_item);
-               spin_unlock(&inode->i_lock);
-               iput(inode);
-       }
-
        /* dentries */
        while (!list_empty(&session->s_dentry_leases)) {
                di = list_first_entry(&session->s_dentry_leases,
@@ -817,19 +772,10 @@ static void trim_session_leases(struct ceph_mds_session *session)
  */
 static void remove_session_leases(struct ceph_mds_session *session)
 {
-       struct ceph_inode_info *ci;
        struct ceph_dentry_info *di;
 
        dout(10, "remove_session_leases on %p\n", session);
 
-       /* inodes */
-       while (!list_empty(&session->s_inode_leases)) {
-               ci = list_entry(session->s_inode_leases.next,
-                               struct ceph_inode_info, i_lease_item);
-               dout(10, "removing lease from inode %p\n", &ci->vfs_inode);
-               revoke_inode_lease(ci, ci->i_lease_mask);
-       }
-
        /* dentries */
        while (!list_empty(&session->s_dentry_leases)) {
                di = list_entry(session->s_dentry_leases.next,
@@ -1858,7 +1804,6 @@ void ceph_mdsc_handle_lease(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
 
        /* inode */
        ci = ceph_inode(inode);
-       revoke_inode_lease(ci, mask);
 
        /* dentry */
        if (mask & CEPH_LOCK_DN) {
@@ -1901,7 +1846,6 @@ void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode,
 {
        struct ceph_msg *msg;
        struct ceph_mds_lease *lease;
-       struct ceph_inode_info *ci;
        struct ceph_dentry_info *di;
        int origmask = mask;
        int mds = -1;
@@ -1937,25 +1881,10 @@ void ceph_mdsc_lease_release(struct ceph_mds_client *mdsc, struct inode *inode,
                mask &= ~CEPH_LOCK_DN;  /* no lease; clear DN bit */
        }
 
-       /* inode lease? */
-       ci = ceph_inode(inode);
-       spin_lock(&inode->i_lock);
-       if (ci->i_lease_session &&
-           ci->i_lease_session->s_mds >= 0 &&
-           ci->i_lease_gen == ci->i_lease_session->s_cap_gen &&
-           time_before(jiffies, ci->i_lease_ttl)) {
-               mds = ci->i_lease_session->s_mds;
-               mask &= CEPH_LOCK_DN | ci->i_lease_mask;  /* lease is valid */
-               ci->i_lease_mask &= ~mask;
-       } else {
-               mask &= CEPH_LOCK_DN;  /* no lease; clear all but DN bits */
-       }
-       spin_unlock(&inode->i_lock);
-
        if (mask == 0) {
-               dout(10, "lease_release inode %p (%d) dentry %p -- "
+               dout(10, "lease_release inode %p dentry %p -- "
                     "no lease on %d\n",
-                    inode, ci->i_lease_mask, dentry, origmask);
+                    inode, dentry, origmask);
                return;  /* nothing to drop */
        }
        BUG_ON(mds < 0);
index c335f465b7167244dfec4b91d51872ed67da2a27..7fd7ffbfb950f18a4352e4eb9f3c39e7f0b9c928 100644 (file)
@@ -322,7 +322,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci,
                dout(10, "queue_cap_snap %p snapc %p seq %llu used %d"
                     " already pending\n", inode, snapc, snapc->seq, used);
                kfree(capsnap);
-       } else if (ci->i_wrbuffer_ref_head || (used & CEPH_CAP_WR)) {
+       } else if (ci->i_wrbuffer_ref_head || (used & CEPH_CAP_FILE_WR)) {
                igrab(inode);
                capsnap->follows = snapc->seq - 1;
                capsnap->context = ceph_get_snap_context(snapc);
@@ -336,7 +336,7 @@ void ceph_queue_cap_snap(struct ceph_inode_info *ci,
                ci->i_head_snapc = NULL;
                list_add_tail(&capsnap->ci_item, &ci->i_cap_snaps);
 
-               if (used & CEPH_CAP_WR) {
+               if (used & CEPH_CAP_FILE_WR) {
                        dout(10, "queue_cap_snap %p cap_snap %p snapc %p"
                             " seq %llu used WR, now pending\n", inode,
                             capsnap, snapc, snapc->seq);
index 78b7ce00ebc13d435076e446d7e76ee68c2d4d58..b014913dcadcbeeb61c5344d0606f726fb7b1d63 100644 (file)
@@ -205,14 +205,6 @@ struct ceph_inode_info {
        int i_xattr_len;
        char *i_xattr_data;
 
-       /* inode lease.  protected _both_ by i_lock and i_lease_session's
-        * s_mutex. */
-       int i_lease_mask;
-       struct ceph_mds_session *i_lease_session;
-       long unsigned i_lease_ttl;     /* jiffies */
-       u32 i_lease_gen;
-       struct list_head i_lease_item; /* mds session list */
-
        /* capabilities.  protected _both_ by i_lock and cap->session's
         * s_mutex. */
        struct rb_root i_caps;           /* cap list */
@@ -377,14 +369,14 @@ static inline int __ceph_caps_used(struct ceph_inode_info *ci)
 {
        int used = 0;
        if (ci->i_rd_ref)
-               used |= CEPH_CAP_RD;
+               used |= CEPH_CAP_GRD;
        if (ci->i_rdcache_ref || ci->i_rdcache_gen)
-               used |= CEPH_CAP_RDCACHE;
+               used |= CEPH_CAP_GRDCACHE;
        if (ci->i_wr_ref)
-               used |= CEPH_CAP_WR;
+               used |= CEPH_CAP_GWR;
        if (ci->i_wrbuffer_ref)
-               used |= CEPH_CAP_WRBUFFER;
-       return used;
+               used |= CEPH_CAP_GWRBUFFER;
+       return CEPH_CAP_FILE(used);
 }
 
 /*
@@ -406,8 +398,8 @@ static inline int __ceph_caps_file_wanted(struct ceph_inode_info *ci)
 static inline int __ceph_caps_wanted(struct ceph_inode_info *ci)
 {
        int w = __ceph_caps_file_wanted(ci) | __ceph_caps_used(ci);
-       if (w & CEPH_CAP_WRBUFFER)
-               w |= CEPH_CAP_EXCL;  /* we want EXCL if we have dirty data */
+       if (w & CEPH_CAP_FILE_WRBUFFER)
+               w |= (CEPH_CAP_FILE_EXCL);  /* we want EXCL if we have dirty data */
        return w;
 }
 
@@ -616,7 +608,7 @@ extern int ceph_fill_trace(struct super_block *sb,
                           struct ceph_mds_session *session);
 extern int ceph_readdir_prepopulate(struct ceph_mds_request *req);
 
-extern int ceph_inode_lease_valid(struct inode *inode, int mask);
+extern int ceph_inode_holds_cap(struct inode *inode, int mask);
 extern int ceph_dentry_lease_valid(struct dentry *dentry);
 
 extern void ceph_inode_set_size(struct inode *inode, loff_t size);