]> git.neil.brown.name Git - LaFS.git/commitdiff
Fix error-return value from seg_addr
authorNeilBrown <neilb@suse.de>
Sat, 5 Mar 2011 00:25:20 +0000 (11:25 +1100)
committerNeilBrown <neilb@suse.de>
Sat, 5 Mar 2011 00:25:20 +0000 (11:25 +1100)
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 <neilb@suse.de>
cluster.c

index a76b0f5b9037007dc7f07149fbaedfe22fdde702..6752673f7f995a2be230a703e1a58d0eb4f843e3 100644 (file)
--- 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) {