]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: grab inode before queue_cap_snap; cleanup
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 3 Apr 2009 22:03:37 +0000 (15:03 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 3 Apr 2009 22:03:37 +0000 (15:03 -0700)
src/kernel/inode.c
src/kernel/snap.c

index 6f23f361655eab41af4b25f62b8fa68466e37e48..4d4e54be92d92f5c0c2214df27eae8f6d65b459c 100644 (file)
@@ -301,8 +301,6 @@ struct inode *ceph_alloc_inode(struct super_block *sb)
        ci->i_snap_realm = NULL;
        INIT_LIST_HEAD(&ci->i_snap_realm_item);
        INIT_LIST_HEAD(&ci->i_snap_flush_item);
-#warning remove me
-       ci->i_snap_realm_counter = 0;
 
        INIT_WORK(&ci->i_wb_work, ceph_inode_writeback);
        INIT_WORK(&ci->i_pg_inv_work, ceph_inode_invalidate_pages);
index c184f49d88d24baf79b4fc04971faf4909363f4d..d2847d5c88266aea619d2bc1b0bcaecd0d4a4aa8 100644 (file)
@@ -566,13 +566,18 @@ more:
                 */
                if (!deletion) {
                        struct list_head *pi;
+                       struct inode *inode;
                        spin_lock(&realm->inodes_with_caps_lock);
                        list_for_each(pi, &realm->inodes_with_caps) {
                                struct ceph_inode_info *ci =
                                        list_entry(pi, struct ceph_inode_info,
                                                   i_snap_realm_item);
+                               inode = igrab(&ci->vfs_inode);
                                spin_unlock(&realm->inodes_with_caps_lock);
-                               ceph_queue_cap_snap(ci, realm->cached_context);
+                               if (inode) {
+                                       ceph_queue_cap_snap(ci, realm->cached_context);
+                                       iput(inode);
+                               }
                                spin_lock(&realm->inodes_with_caps_lock);
                        }
                        spin_unlock(&realm->inodes_with_caps_lock);