mfs: mark blocks clean when invalidated

. it could happen that newly filled blocks were still marked
	  dirty
	. causing unnecessary i/o and the new warning of the superblock
	  being written
This commit is contained in:
Ben Gras 2012-01-13 16:05:32 +01:00
parent a6d0ee24c3
commit dd59d50944
2 changed files with 12 additions and 8 deletions

View file

@ -145,11 +145,12 @@ PUBLIC struct buf *get_block(
*/
yieldid = make64(bp->b_dev, bp->b_blocknr);
assert(bp->b_bytes == fs_block_size);
bp->b_dev = NO_DEV;
BP_CLEARDEV(bp);
}
/* Fill in block's parameters and add it to the hash chain where it goes. */
bp->b_dev = dev; /* fill in device number */
if(dev == NO_DEV) BP_CLEARDEV(bp);
else BP_SETDEV(bp, dev);
bp->b_blocknr = block; /* fill in block number */
bp->b_count++; /* record that block is being used */
b = BUFHASH(bp->b_blocknr);
@ -183,7 +184,7 @@ PUBLIC struct buf *get_block(
if(only_search == PREFETCH) {
/* PREFETCH: don't do i/o. */
bp->b_dev = NO_DEV;
BP_CLEARDEV(bp);
} else if (only_search == NORMAL) {
read_block(bp);
} else if(only_search == NO_READ) {
@ -350,7 +351,7 @@ register struct buf *bp; /* buffer pointer */
}
if (op_failed) {
bp->b_dev = NO_DEV; /* invalidate block */
BP_CLEARDEV(bp); /* invalidate block */
/* Report read errors to interested parties. */
rdwt_err = r;
@ -370,7 +371,7 @@ PUBLIC void invalidate(
register struct buf *bp;
for (bp = &buf[0]; bp < &buf[nr_bufs]; bp++)
if (bp->b_dev == device) bp->b_dev = NO_DEV;
if (bp->b_dev == device) BP_CLEARDEV(bp);
vm_forgetblocks();
}
@ -501,13 +502,13 @@ PUBLIC void rw_scattered(
if (r < (ssize_t) fs_block_size) {
/* Transfer failed. */
if (i == 0) {
bp->b_dev = NO_DEV; /* Invalidate block */
BP_CLEARDEV(bp); /* Invalidate block */
vm_forgetblocks();
}
break;
}
if (rw_flag == READING) {
bp->b_dev = dev; /* validate block */
BP_SETDEV(bp, dev); /* validate block */
put_block(bp, PARTIAL_DATA_BLOCK);
} else {
MARKCLEAN(bp);
@ -662,7 +663,7 @@ PUBLIC void buf_pool(int new_nr_bufs)
for (bp = &buf[0]; bp < &buf[nr_bufs]; bp++) {
bp->b_blocknr = NO_BLOCK;
bp->b_dev = NO_DEV;
BP_CLEARDEV(bp);
bp->b_next = bp + 1;
bp->b_prev = bp - 1;
bp->bp = NULL;

View file

@ -8,4 +8,7 @@
#define ISDIRTY(b) ((b)->b_dirt == BP_DIRTY)
#define ISCLEAN(b) ((b)->b_dirt == BP_CLEAN)
#define BP_SETDEV(b, dev) do { assert((dev) != NO_DEV); (b)->b_dev = (dev); } while(0)
#define BP_CLEARDEV(b) do { (b)->b_dev = NO_DEV; MARKCLEAN(b); } while(0)
#endif