]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: make ->write_inode() flush dirty caps
authorSage Weil <sage@newdream.net>
Tue, 31 Mar 2009 19:41:59 +0000 (12:41 -0700)
committerSage Weil <sage@newdream.net>
Tue, 31 Mar 2009 19:41:59 +0000 (12:41 -0700)
src/kernel/caps.c
src/kernel/super.c
src/kernel/super.h

index 3d659f6964de73f1a2b59b2187d0b34535543b56..584b0a1181ba61787ab5ad08419248740dc54b8c 100644 (file)
@@ -1005,6 +1005,49 @@ ack:
                up_read(&mdsc->snap_rwsem);
 }
 
+/*
+ * Flush any dirty caps back to the mds
+ */
+int ceph_write_inode(struct inode *inode, int unused)
+{
+       struct ceph_mds_client *mdsc = &ceph_client(inode->i_sb)->mdsc;
+       struct ceph_inode_info *ci = ceph_inode(inode);
+       struct rb_node *p;
+       struct ceph_cap *cap;
+       int dirty;
+       int mds = -1;
+
+       dout(10, "write_inode %p\n", inode);
+more:
+       spin_lock(&inode->i_lock);
+       dirty = __ceph_caps_dirty(ci);
+       if (dirty) {
+               int used = __ceph_caps_used(ci);
+               int want = __ceph_caps_mds_wanted(ci);
+
+               for (p = rb_first(&ci->i_caps); p; p = rb_next(p)) {
+                       cap = rb_entry(p, struct ceph_cap, ci_node);
+                       if (mds >= cap->mds)
+                               continue;
+                       mds = cap->mds;
+
+                       cap->flushing |= dirty & cap->implemented;
+                       if (cap->flushing) {
+                               ci->i_dirty_caps &= ~cap->flushing;
+                               dout(10, " flushing %s, dirty_caps now %s\n",
+                                    ceph_cap_string(cap->flushing),
+                                    ceph_cap_string(ci->i_dirty_caps));
+                       }
+                       __send_cap(mdsc, cap, CEPH_CAP_OP_UPDATE, used, want,
+                                  cap->issued | cap->implemented);
+                       goto more;
+               }
+       }
+       spin_unlock(&inode->i_lock);
+       return 0;
+}
+
+
 /*
  * Take references to capabilities we hold, so that we don't release
  * them to the MDS prematurely.
index 8202edf8df9fedd43d94b0db09f440b5c7d890d8..2eae58e55ff863d86ccec27e0eb9b3b57e70b373 100644 (file)
@@ -43,13 +43,6 @@ void ceph_peer_reset(void *p, struct ceph_entity_addr *peer_addr,
 /*
  * super ops
  */
-static int ceph_write_inode(struct inode *inode, int unused)
-{
-       struct ceph_inode_info *ci = ceph_inode(inode);
-
-       return 0;
-}
-
 static void ceph_put_super(struct super_block *s)
 {
        struct ceph_client *cl = ceph_client(s);
index fb8d7611cbcaccf786c200d7de81b64457d1ac6c..e0085de79266b2a787e78266de4e29527dada1b1 100644 (file)
@@ -745,6 +745,7 @@ extern int ceph_add_cap(struct inode *inode,
                        struct ceph_cap *new_cap);
 extern void ceph_remove_cap(struct ceph_cap *cap);
 extern void ceph_queue_caps_release(struct inode *inode);
+extern int ceph_write_inode(struct inode *inode, int unused);
 extern int ceph_get_cap_mds(struct inode *inode);
 extern void ceph_get_cap_refs(struct ceph_inode_info *ci, int caps);
 extern void ceph_put_cap_refs(struct ceph_inode_info *ci, int had);