tfix buildindex minibuf sizing bug - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 1d53bf4a03cc30b2204ff0286dd71ee97d467458
 (DIR) parent 6a5a2a9562519f4cfc75910af42cfc97ec583033
 (HTM) Author: rsc <devnull@localhost>
       Date:   Thu,  3 May 2007 03:13:47 +0000
       
       fix buildindex minibuf sizing bug
       
       Diffstat:
         M src/cmd/venti/srv/buildindex.c      |      22 +++++++++++++---------
       
       1 file changed, 13 insertions(+), 9 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/venti/srv/buildindex.c b/src/cmd/venti/srv/buildindex.c
       t@@ -68,7 +68,7 @@ threadmain(int argc, char *argv[])
                        usage();
                        break;
                }ARGEND
       -        
       +
                if(argc != 1)
                        usage();
        
       t@@ -324,7 +324,7 @@ bflush(Buf *buf)
                u32int bufsize;
                
                if(buf->woffset >= buf->eoffset)
       -                sysfatal("buf index chunk overflow - need bufger index");
       +                sysfatal("buf index chunk overflow - need bigger index");
                bufsize = buf->ep - buf->bp;
                if(writepart(buf->part, buf->woffset, buf->bp, bufsize) < 0){
                        fprint(2, "write %s: %r\n", buf->part->name);
       t@@ -781,7 +781,7 @@ isectproc(void *v)
                xminiclump = isectmem/2/IEntrySize;
                
                /* total number of minibufs we need */
       -        prod = xclump / xminiclump;
       +        prod = (xclump+xminiclump-1) / xminiclump;
                
                /* if possible, skip second pass */
                if(!dumb && prod*MinBufSize < isectmem){
       t@@ -801,7 +801,6 @@ isectproc(void *v)
                        bufsize *= 2;
                data = emalloc(nbuf*bufsize);
                epbuf = bufsize/IEntrySize;
       -
                fprint(2, "%T %s: %,ud buckets, %,ud groups, %,ud minigroups, %,ud buffer\n",
                        is->part->name, nbucket, nbuf, nminibuf, bufsize);
                /*
       t@@ -859,9 +858,15 @@ isectproc(void *v)
                /*
                 * Rearrange entries into minibuffers and then
                 * split each minibuffer into buckets.
       +         * The minibuffer must be sized so that it is 
       +         * a multiple of blocksize -- ipoolloadblock assumes
       +         * that each minibuf starts aligned on a blocksize
       +         * boundary.
                 */
                mbuf = MKN(Minibuf, nminibuf);
                mbufbuckets = (bufbuckets+nminibuf-1)/nminibuf;
       +        while(mbufbuckets*blocksize % bufsize)
       +                mbufbuckets++;
                for(i=0; i<nbuf; i++){
                        /*
                         * Set up descriptors.
       t@@ -873,11 +878,10 @@ isectproc(void *v)
                        for(j=0; j<nminibuf; j++){
                                mb = &mbuf[j];
                                mb->boffset = offset;
       -                        if(j < nminibuf-1){
       -                                offset += mbufbuckets*blocksize;
       -                                mb->eoffset = offset;
       -                        }else
       -                                mb->eoffset = buf[i].eoffset;
       +                        offset += mbufbuckets*blocksize;
       +                        if(offset > buf[i].eoffset)
       +                                offset = buf[i].eoffset;
       +                        mb->eoffset = offset;
                                mb->roffset = mb->boffset;
                                mb->woffset = mb->boffset;
                                mb->nentry = epbuf * (mb->eoffset - mb->boffset)/bufsize;