]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: stateless snap_caps on non-head inodes
authorSage Weil <sage@newdream.net>
Mon, 11 Aug 2008 23:50:04 +0000 (16:50 -0700)
committerSage Weil <sage@newdream.net>
Mon, 11 Aug 2008 23:50:04 +0000 (16:50 -0700)
src/kernel/file.c
src/kernel/inode.c
src/kernel/mds_client.c
src/kernel/super.c
src/kernel/super.h

index 3141c66bad02d4b04dafc0988f8445ccda392ee2..0b634c5a0bb8530af3956d6ed3eb588182abe4f1 100644 (file)
@@ -60,7 +60,7 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode)
 
        cf = kzalloc(sizeof(*cf), GFP_NOFS);
        if (cf == NULL) {
-               ceph_put_fmode(ceph_inode(inode), fmode);  /* clean up */
+               ceph_put_fmode(ceph_inode(inode), fmode); /* clean up */
                return -ENOMEM;
        }
        cf->mode = fmode;
index daebc0cd8cf871c1f6ac2a9b88aef2ee882d149c..bed57567fd6e080204f8f2ecd4b1b3a5309c8f60 100644 (file)
@@ -59,6 +59,7 @@ struct inode *ceph_get_snapdir(struct inode *parent)
        inode->i_gid = parent->i_gid;
        inode->i_op = &ceph_dir_iops;
        inode->i_fop = &ceph_dir_fops;
+       ceph_inode(inode)->i_snap_caps = CEPH_CAP_PIN; /* so we can open */
        return inode;
 }
 
@@ -1217,7 +1218,7 @@ int ceph_add_cap(struct inode *inode,
 
 int __ceph_caps_issued(struct ceph_inode_info *ci, int *implemented)
 {
-       int have = 0;
+       int have = ci->i_snap_caps;
        struct ceph_inode_cap *cap;
        struct list_head *p;
        u32 gen;
@@ -1425,7 +1426,7 @@ void ceph_put_fmode(struct ceph_inode_info *ci, int fmode)
                last++;
        spin_unlock(&ci->vfs_inode.i_lock);
 
-       if (last)
+       if (last && ci->i_vino.snap == CEPH_NOSNAP)
                ceph_check_caps(ci, 0);
 }
 
index f7cc3539227c89c60577251feaf49b1f7f59a23d..11a44bc60ebd9b8657759959a49b284919f8ad21 100644 (file)
@@ -1183,14 +1183,23 @@ void ceph_mdsc_handle_reply(struct ceph_mds_client *mdsc, struct ceph_msg *msg)
                        cap = le32_to_cpu(rinfo->head->file_caps);
                        capseq = le32_to_cpu(rinfo->head->file_caps_seq);
                        mseq = le32_to_cpu(rinfo->head->file_caps_mseq);
-                       err = ceph_add_cap(req->r_last_inode,
-                                          req->r_session,
-                                          req->r_fmode,
-                                          cap, capseq, mseq,
-                                          rinfo->snapblob,
-                                          rinfo->snapblob_len);
-                       if (err)
-                               goto done;
+                       if (ceph_vino(req->r_last_inode).snap == CEPH_NOSNAP) {
+                               err = ceph_add_cap(req->r_last_inode,
+                                                  req->r_session,
+                                                  req->r_fmode,
+                                                  cap, capseq, mseq,
+                                                  rinfo->snapblob,
+                                                  rinfo->snapblob_len);
+                               if (err)
+                                       goto done;
+                       } else {
+                               struct ceph_inode_info *ci =
+                                       ceph_inode(req->r_last_inode);
+                               spin_lock(&req->r_last_inode->i_lock);
+                               ci->i_snap_caps |= cap;
+                               __ceph_get_fmode(ci, req->r_fmode);
+                               spin_unlock(&req->r_last_inode->i_lock);
+                       }
                }
 
                /* readdir result? */
index baec0b7666aeb39dfcece9f47e50a6b735d13940..b71ddf1d93ccbf516cf9d53767e6235cae7d5f90 100644 (file)
@@ -176,6 +176,11 @@ static struct inode *ceph_alloc_inode(struct super_block *sb)
        ci->i_wanted_max_size = 0;
        ci->i_requested_max_size = 0;
 
+       ci->i_cap_exporting_mds = 0;
+       ci->i_cap_exporting_mseq = 0;
+       ci->i_cap_exporting_issued = 0;
+       ci->i_snap_caps = 0;
+
        ci->i_rd_ref = ci->i_rdcache_ref = 0;
        ci->i_wr_ref = 0;
        atomic_set(&ci->i_wrbuffer_ref, 0);
index 1bd0ce4b6ec24288b5bea01152493ce9f85d0820..e06694f936f6a1104fd560f2a9b2df73d5e5d6ba 100644 (file)
@@ -242,6 +242,7 @@ struct ceph_inode_info {
        int i_cap_exporting_mds;
        unsigned i_cap_exporting_mseq;
        unsigned i_cap_exporting_issued;
+       unsigned i_snap_caps;
 
        int i_nr_by_mode[CEPH_FILE_MODE_NUM];
        loff_t i_max_size;      /* size authorized by mds */