From: Ben Gras Date: Fri, 13 Jan 2012 15:05:32 +0000 (+0100) Subject: mfs: mark blocks clean when invalidated X-Git-Tag: v3.2.0~114 X-Git-Url: http://zhaoyanbai.com/repos/?a=commitdiff_plain;h=dd59d50944d116b0a5eaaf8941f08e1e469be1b0;p=minix.git 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 --- diff --git a/servers/mfs/cache.c b/servers/mfs/cache.c index 89b81b321..d64dcc228 100644 --- a/servers/mfs/cache.c +++ b/servers/mfs/cache.c @@ -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; diff --git a/servers/mfs/clean.h b/servers/mfs/clean.h index 626c7acec..d6d112985 100644 --- a/servers/mfs/clean.h +++ b/servers/mfs/clean.h @@ -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