} wc[WC_NUM];
struct list_head leafs, account_leafs;
+ struct list_head dirty_inodes;
int youth_next;
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.
*/
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]);
int lafs_dirty_blk(struct lafs_dblk *db)
{
- int was_empty;
-
if (db->b.flags & B_Dirty)
return 0;
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;
}
{
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) &&
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);
+ }
}
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. */