* this segment
*/
struct fs_dev *dv = &fs->devs[seg->dev];
-
int rows = dv->rows_per_table - seg->st_row;
+
+ BUG_ON(seg->dev < 0);
rows += dv->rows_per_table * (dv->tables_per_seg - seg->st_table - 1);
return rows * dv->width;
}
*/
struct fs_dev *dv = &fs->devs[seg->dev];
u32 rv;
+ BUG_ON(seg->dev < 0);
size = (size + dv->width - 1) / dv->width;
rv = size * dv->width;
size += seg->st_row;
*/
if (wc->seg.dev >= 0) {
p = segtovirt(fs, wc->seg.dev, wc->seg.num);
- lafs_seg_deref(fs, p, 0);
+ /* If this is the first segment, p would be 0,
+ * so add one to ensure we drop the reference.
+ */
+ lafs_seg_deref(fs, p + 1, 0);
+ wc->seg.dev = -1;
}
+ wc->remaining = 0;
if (cnum &&
fs->clean_reserved < fs->max_segment)
lafs_free_get(fs, &dev, &seg, 0);
wc->seg.dev = dev;
wc->seg.num = seg;
- seg_setpos(fs, &wc->seg, (p = segtovirt(fs, dev, seg)));
+ seg_setpos(fs, &wc->seg, segtovirt(fs, dev, seg));
wc->remaining = seg_remainder(fs, &wc->seg);
return 0;
INIT_LIST_HEAD(&fs->wc[i].pending_blocks[j]);
}
init_waitqueue_head(&fs->wc[i].pending_wait);
+ fs->wc[i].seg.dev = -1;
}
fs->max_newblocks = 1000; /* FIXME this should be configurable, and