int rv = 0;
spin_lock(&fs->alloc_lock);
while (fs->clean_reserved < max * fs->max_segment &&
- fs->free_blocks > (fs->clean_reserved
- + fs->allocated_blocks
- + watermark)) {
+ fs->free_blocks > 0 &&
+ (u64)fs->free_blocks > (fs->clean_reserved
+ + fs->allocated_blocks
+ + watermark)) {
fs->clean_reserved += fs->max_segment;
fs->free_blocks -= fs->max_segment;
rv++;
* completed. FIXME once it has completed we need to
* check and invalidate the FS if there was a problem.
*/
- if (fs->free_blocks < fs->allocated_blocks
- + credits + watermark)
+ if (fs->free_blocks < 0 ||
+ (u64)fs->free_blocks < (fs->allocated_blocks
+ + credits + watermark))
credits = 0; /* Sorry, no room */
}
if (fs->rolled && watermark == 0) {
/* When including the clean_reserved space, there should
* be room for these controlled allocations
*/
+ BUG_ON(fs->free_blocks < 0);
if (fs->free_blocks + fs->clean_reserved <
fs->allocated_blocks + credits)
BUG();
i++;
}
printk("--------\n");
- printk("free_blocks=%llu allocated=%llu max_seg=%llu clean_reserved=%llu\n",
+ printk("free_blocks=%lld allocated=%llu max_seg=%llu clean_reserved=%llu\n",
dfs->free_blocks, dfs->allocated_blocks, dfs->max_segment,
dfs->clean_reserved);
}
/* counters for (pre)allocating space. */
spinlock_t alloc_lock;
- u64 free_blocks; /* initialised from free segment info */
+ s64 free_blocks; /* initialised from free segment info */
u64 allocated_blocks; /* Blocks that have been (pre)allocated */
u64 clean_reserved; /* Blocks reserved for cleaner segments */
u64 max_segment; /* largest segment size */