-int expwrite(fsoffset_t a, char *buf, int len)
-{ u32 mapcnt,mapl,maph ; int wrlen,rdlen ;
- fsoffset_t pagestart ; int offset ;
-
- if (flags & F_COPYONWRITE) {
- DEBUG3("Asked to write %d bytes at %Lu.\n", len, (unsigned long long)a);
-
- mapl=a/DIFFPAGESIZE ; maph=(a+len-1)/DIFFPAGESIZE ;
-
- for (mapcnt=mapl;mapcnt<=maph;mapcnt++) {
- pagestart=mapcnt*DIFFPAGESIZE ;
- offset=a-pagestart ;
- wrlen=(len<DIFFPAGESIZE-offset) ? len : DIFFPAGESIZE-offset ;
-
- if (difmap[mapcnt]!=(u32)(-1)) { /* the block is already there */
- DEBUG3("Page %Lu is at %lu\n", (unsigned long long)mapcnt,
- (unsigned long)difmap[mapcnt]) ;
- myseek(difffile,difmap[mapcnt]*DIFFPAGESIZE+offset) ;
- if (write(difffile, buf, wrlen) != wrlen) return -1 ;
- } else { /* the block is not there */
- myseek(difffile,difffilelen*DIFFPAGESIZE) ;
- difmap[mapcnt]=difffilelen++ ;
- DEBUG3("Page %Lu is not here, we put it at %lu\n",
- (unsigned long long)mapcnt,
- (unsigned long)difmap[mapcnt]);
- rdlen=DIFFPAGESIZE ;
- if (rdlen+pagestart%hunksize>hunksize)
- rdlen=hunksize-(pagestart%hunksize) ;
- if (rawexpread(pagestart,pagebuf,rdlen)) return -1 ;
- memcpy(pagebuf+offset,buf,wrlen) ;
- if (write(difffile,pagebuf,DIFFPAGESIZE)!=DIFFPAGESIZE) return -1 ;
- }
- len-=wrlen ; a+=wrlen ; buf+=wrlen ;
- }
- } else return(rawexpwrite(a,buf,len));
- return 0 ;
+int expwrite(off_t a, char *buf, int len)
+{
+ u32 mapcnt,mapl,maph ; int wrlen,rdlen ;
+ off_t pagestart ; int offset ;
+
+ if (!(flags & F_COPYONWRITE))
+ return(rawexpwrite(a,buf,len));
+ DEBUG3("Asked to write %d bytes at %Lu.\n", len, (unsigned long long)a);
+
+ mapl=a/DIFFPAGESIZE ; maph=(a+len-1)/DIFFPAGESIZE ;
+
+ for (mapcnt=mapl;mapcnt<=maph;mapcnt++) {
+ pagestart=mapcnt*DIFFPAGESIZE ;
+ offset=a-pagestart ;
+ wrlen=(len<DIFFPAGESIZE-offset) ? len : DIFFPAGESIZE-offset ;
+
+ if (difmap[mapcnt]!=(u32)(-1)) { /* the block is already there */
+ DEBUG3("Page %Lu is at %lu\n", (unsigned long long)mapcnt,
+ (unsigned long)difmap[mapcnt]) ;
+ myseek(difffile,difmap[mapcnt]*DIFFPAGESIZE+offset) ;
+ if (write(difffile, buf, wrlen) != wrlen) return -1 ;
+ } else { /* the block is not there */
+ myseek(difffile,difffilelen*DIFFPAGESIZE) ;
+ difmap[mapcnt]=difffilelen++ ;
+ DEBUG3("Page %Lu is not here, we put it at %lu\n",
+ (unsigned long long)mapcnt,
+ (unsigned long)difmap[mapcnt]);
+ rdlen=DIFFPAGESIZE ;
+ if (rdlen+pagestart%hunksize>hunksize)
+ rdlen=hunksize-(pagestart%hunksize) ;
+ if (rawexpread(pagestart,pagebuf,rdlen)) return -1 ;
+ memcpy(pagebuf+offset,buf,wrlen) ;
+ if (write(difffile,pagebuf,DIFFPAGESIZE)!=DIFFPAGESIZE) return -1 ;
+ }
+ len-=wrlen ; a+=wrlen ; buf+=wrlen ;
+ }
+ return 0;