* the block stepped over. FIXME this comment is wrong.
*/
struct fs_dev *dv = &fs->devs[seg->dev];
+ u64 addr;
- u64 addr = seg->col * dv->stride;
+ if (seg->dev < 0)
+ /* Setting 'next' address for last cluster in
+ * a cleaner segment */
+ return 0;
+ addr = seg->col * dv->stride;
addr += seg->row;
addr += seg->table * (dv->stride); /* FIXME */
addr += seg->num * dv->segment_stride;
wc->seg.dev = -1;
}
- if (cnum &&
- fs->clean_reserved < fs->max_segment)
+ if (cnum < 0 ||
+ (cnum && fs->clean_reserved < fs->max_segment))
return -ENOSPC;
/* This gets a reference on the 'segsum' */
lafs_free_get(fs, &dev, &seg, 0);
avail = 1;
else
avail = 0;
- if (wc->remaining < 1)
+ if (wc->seg.dev < 0 || wc->remaining < 1)
used = -1;
else
used = cluster_insert(&wc->slhead, &wc->clhead, b, avail);
/* Need to make sure out ->next_addr gets set properly
* for non-cleaning segments
*/
- if (wc->remaining < 2 && cnum == 0)
- new_segment(fs, cnum);
+ if (wc->remaining < 2) {
+ if (cnum == 0)
+ new_segment(fs, cnum);
+ else
+ new_segment(fs, -1);
+ }
/* Fill in the cluster header */
strncpy(wc->chead->idtag, "LaFSHead", 8);