]> git.neil.brown.name Git - lafs-utils.git/commitdiff
Use separate list for inodes with dirty blocks.
authorNeilBrown <neilb@suse.de>
Sun, 27 Mar 2011 20:10:00 +0000 (07:10 +1100)
committerNeilBrown <neilb@suse.de>
Sun, 27 Mar 2011 20:10:00 +0000 (07:10 +1100)
I was using the dirty/leafs list for tracking inodes with dirty
blocks, but that conflicts with the leafs/leafs lists some times,
so create a new dirty_inodes list.

Signed-off-by: NeilBrown <neilb@suse.de>
include/lafs/struct.h
lib/lafs_alloc.c
lib/lafs_dirty_blk.c
lib/lafs_flush_inode.c
lib/lafs_import_inode_buf.c

index 97e8fddd3327267a1f388b54c80f2db473f32895..1e372d1b279c573b7d74424e962a20513b6a724f 100644 (file)
@@ -58,6 +58,7 @@ struct lafs {
        } wc[WC_NUM];
 
        struct list_head leafs, account_leafs;
+       struct list_head dirty_inodes;
 
        int     youth_next;
 
@@ -89,6 +90,7 @@ struct lafs_ino {
        struct lafs_iblk *iblock;
        int             inum;
        struct lafs_ino *filesys;
+       struct list_head dirty_inodes;
        struct list_head dirty; /* blocks that might be dirty, or might belong
                                 * to inodes with dirty blocks.
                                 */
index 148a58d6af82d2f471788ee7e93c7ca2dd316088..3d364e231e6dbc90282e22ade897067392fd39dd 100644 (file)
@@ -28,6 +28,7 @@ struct lafs *lafs_alloc(void)
        INIT_LIST_HEAD(&fs->wc[1].blocks);
        INIT_LIST_HEAD(&fs->leafs);
        INIT_LIST_HEAD(&fs->account_leafs);
+       INIT_LIST_HEAD(&fs->dirty_inodes);
 
        for (i=0; i < (1<<HASH_BITS); i++)
                INIT_LIST_HEAD(&fs->htable[i]);
index f4bb874872e89452ce1a592cb08da6dd9827cebb..db091e74e05ece2c7a51a599ab6728a6ac1344b0 100644 (file)
@@ -10,8 +10,6 @@
 
 int lafs_dirty_blk(struct lafs_dblk *db)
 {
-       int was_empty;
-
        if (db->b.flags & B_Dirty)
                return 0;
 
@@ -23,10 +21,9 @@ int lafs_dirty_blk(struct lafs_dblk *db)
                return 0;
 
        trace(1, "dirty %p\n", db);
-       do {
-               was_empty = list_empty(&db->b.ino->dirty);
-               list_move_tail(&db->b.leafs, &db->b.ino->dirty);
-               db = db->b.ino->dblock;
-       } while (db && was_empty && db != db->b.ino->dblock);
+       if (list_empty(&db->b.ino->dirty))
+               list_move_tail(&db->b.ino->dirty_inodes,
+                              &db->b.ino->fs->dirty_inodes);
+       list_move_tail(&db->b.leafs, &db->b.ino->dirty);
        return 0;
 }
index b84a42b26fec2c8503b09aa7cc1a8d6b8ec29490..527a4d59ef76f9183d6847db9fe57b0a192967ad 100644 (file)
@@ -8,14 +8,9 @@ void lafs_flush_inode(struct lafs_ino *inode)
 {
        struct lafs_blk *blk;
        struct list_head *tmp;
-       struct lafs_ino *ino;
+
        list_for_each_entry_safe(blk, tmp, &inode->dirty, leafs) {
-               if (!(blk->flags & B_Index) &&
-                   blk->ino->type == TypeInodeFile &&
-                   (ino = dblk(blk)->my_inode) != NULL &&
-                   !list_empty(&ino->dirty))
-                       lafs_flush_inode(ino);
-               else if (!(blk->flags & B_Dirty))
+               if (!(blk->flags & B_Dirty))
                        list_del_init(&blk->leafs);
 
                if ((blk->flags & B_Dirty) &&
@@ -26,9 +21,13 @@ void lafs_flush_inode(struct lafs_ino *inode)
 
 void lafs_flush(struct lafs *lafs)
 {
-       struct lafs_ino *fsys = lafs->ss.root;
+       struct lafs_ino *ino;
+       struct list_head *tmp;
 
-       if (fsys)
-               lafs_flush_inode(fsys);
+       list_for_each_entry_safe(ino, tmp, &lafs->dirty_inodes, dirty_inodes) {
+               lafs_flush_inode(ino);
+               if (list_empty(&ino->dirty))
+                       list_del_init(&ino->dirty_inodes);
+       }
 }
        
index 87f0583f32bdb68b7caf37a0658b33dfb0651cf3..28674caf96ddd503994b0666ffd37e2e7ab9a12b 100644 (file)
@@ -27,6 +27,7 @@ struct lafs_ino *lafs_import_inode_buf(struct lafs *fs,
        ino->inum = inum;
        ino->filesys = parent;
        INIT_LIST_HEAD(&ino->dirty);
+       INIT_LIST_HEAD(&ino->dirty_inodes);
 
        if (inode_load(ino, (struct la_inode *)buf))
                /* FIXME callers of this should reparent it to themselves. */