otherwise we could deadlock.
Signed-off-by: NeilBrown <neilb@suse.de>
* a block. */
}
-void
-lafs_erase_dblock(struct datablock *b)
+static void
+erase_dblock_locked(struct datablock *b)
{
struct fs *fs = fs_from_inode(b->b.inode);
dprintk("Eraseblock for %s\n", strblk(&b->b));
- lafs_iolock_written(&b->b);
if (b->b.physaddr == 0 &&
b->b.fileaddr == 0 &&
LAFSI(b->b.inode)->depth == 0) {
lafs_writeback_done(&b->b);
}
+void
+lafs_erase_dblock(struct datablock *b)
+{
+ lafs_iolock_written(&b->b);
+ erase_dblock_locked(b);
+}
+
+int
+lafs_erase_dblock_async(struct datablock *b)
+{
+ int rv;
+ rv = lafs_iolock_written_async(&b->b);
+ if (rv)
+ erase_dblock_locked(b);
+ return rv;
+}
+
void
lafs_dirty_iblock(struct indexblock *b)
{
LAFSI(ino)->ablocks +
LAFSI(ino)->ciblocks +
LAFSI(ino)->piblocks);
- lafs_erase_dblock(b);
- lafs_orphan_release(fs, b, NULL);
+ if (lafs_erase_dblock_async(b))
+ lafs_orphan_release(fs, b, NULL);
} else if (ino->i_nlink || LAFSI(ino)->type == 0)
lafs_orphan_release(fs, b, NULL);
else
int lafs_reserve_block(struct block *b, int alloc_type);
void lafs_dirty_dblock(struct datablock *b);
void lafs_erase_dblock(struct datablock *b);
+int lafs_erase_dblock_async(struct datablock *b);
void lafs_dirty_iblock(struct indexblock *b);
void block_drop_addr(struct fs *fs, struct inode *ino, u32 addr);
void lafs_flush(struct datablock *b);