return 0;
}
if (test_and_clear_bit(B_Dirty, &b->flags)) {
+ int credits = 1;
/* Check size again, just in case it changed */
size = i_size_read(b->inode);
if (size + lai->metadata_size > sb->s_blocksize) {
lafs_space_return(fs, 1);
return 0;
}
- if (test_and_set_bit(B_Credit, &lai->iblock->b.flags))
- lafs_space_return(fs, 1);
+ if (!test_and_set_bit(B_Credit, &lai->dblock->b.flags))
+ credits--;
+ if (test_and_clear_bit(B_UnincCredit, &b->flags))
+ credits++;
+ if (!test_and_set_bit(B_ICredit, &lai->dblock->b.flags))
+ credits--;
+ lafs_space_return(fs, credits);
lafs_dirty_dblock(lai->dblock);
} else if (test_and_clear_bit(B_Realloc, &b->flags)) {
int credits = 1;
else
clear_bit(B_WritePhase1, &b->flags);
- if (!test_and_clear_bit(B_UnincCredit, &b->flags))
- BUG();
- lafs_space_return(fs, 1);
+ if (test_and_clear_bit(B_UnincCredit, &b->flags))
+ lafs_space_return(fs, 1);
/* It is an awkward time to call lafs_inode_fillblock,
* so do this one little change manually
if (test_and_clear_bit(B_UnincCredit, &b->flags))
credits++;
- /* hold two credits to be added to data block */
+ /* hold credits to be added to data block */
b2 = &lai->dblock->b;
/* We always erase the InoIdx block before the