1extern void abort (void); 2 3typedef struct foo_t 4{ 5 unsigned int blksz; 6 unsigned int bf_cnt; 7} foo_t; 8 9#define _RNDUP(x, unit) ((((x) + (unit) - 1) / (unit)) * (unit)) 10#define _RNDDOWN(x, unit) ((x) - ((x)%(unit))) 11 12long long 13foo (foo_t *const pxp, long long offset, unsigned int extent) 14{ 15 long long blkoffset = _RNDDOWN(offset, (long long )pxp->blksz); 16 unsigned int diff = (unsigned int)(offset - blkoffset); 17 unsigned int blkextent = _RNDUP(diff + extent, pxp->blksz); 18 19 if (pxp->blksz < blkextent) 20 return -1LL; 21 22 if (pxp->bf_cnt > pxp->blksz) 23 pxp->bf_cnt = pxp->blksz; 24 25 return blkoffset; 26} 27 28int 29main () 30{ 31 foo_t x; 32 long long xx; 33 34 x.blksz = 8192; 35 x.bf_cnt = 0; 36 xx = foo (&x, 0, 4096); 37 if (xx != 0LL) 38 abort (); 39 return 0; 40} 41