From: NeilBrown Date: Sat, 5 Mar 2011 00:25:20 +0000 (+1100) Subject: Fix error-return value from seg_addr X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=1845b13a644db8b3bce767a94a07a2d541206532;p=LaFS.git Fix error-return value from seg_addr Returning '0' as an error indicator from seg_addr is bad because 0 can be a valid address - the first block in the first segment (used as a cluster header). So return "-1" instead (as an unsigned of course). Signed-off-by: NeilBrown --- diff --git a/cluster.c b/cluster.c index a76b0f5..6752673 100644 --- a/cluster.c +++ b/cluster.c @@ -339,14 +339,14 @@ static u64 seg_addr(struct fs *fs, struct segpos *seg) if (seg->dev < 0) /* Setting 'next' address for last cluster in * a cleaner segment */ - return 0; + return (u64)-1; if (seg->table > seg->nxt_table || (seg->table == seg->nxt_table && seg->row >= seg->nxt_row)) /* We have gone beyond the end of the cluster, * must be bad data during roll-forward */ - return 0; + return (u64)-1; addr = seg->col * dv->stride; addr += seg->row; addr += seg->table * dv->rows_per_table; @@ -373,9 +373,9 @@ u64 lafs_seg_next(struct fs *fs, struct segpos *seg) struct fs_dev *dv = &fs->devs[seg->dev]; u64 addr = seg_addr(fs, seg); - if (!addr) + if (!(addr+1)) /* Beyond end of cluster */ - return 0; + return addr; /* now step forward in column or table or seg */ seg->row++; @@ -1202,7 +1202,7 @@ static void cluster_flush(struct fs *fs, int cnum) current_block++; cluster_incdesc(wc, desc_start, b, fs->blocksize_bits); addr = lafs_seg_next(fs, &wc->seg); - BUG_ON(!addr); + BUG_ON(!addr || !(addr+1)); if (cnum && test_bit(B_Dirty, &b->flags)) /* We are cleaning but this block is now dirty. * Don't waste the UnincCredit on recording the @@ -1220,7 +1220,7 @@ static void cluster_flush(struct fs *fs, int cnum) segend = wc->seg; /* We may write zeros from here */ seg_step(fs, &wc->seg); wc->remaining = seg_remainder(fs, &wc->seg); - /* Need to make sure out ->next_addr gets set properly + /* Need to make sure our ->next_addr gets set properly * for non-cleaning segments */ if (wc->remaining < 2) {