<p>I write 1 program to create sparse file which contains alternate empty blocks and data blocks. For example block1=empty, block2=data, block3=empty .....</p><pre><code>#define BLOCK_SIZE 4096
void *buf;
int main(int argc, char **argv)
{
buf=malloc(512);
memset(buf,&quot;a&quot;,512);
int fd=0;
int i;
int sector_per_block=BLOCK_SIZE/512;
int block_count=4;
if(argc !=2 ){
        printf(&quot;Wrong usage\n USAGE: program absolute_path_to_write\n&quot;);
        _exit(-1);
}
fd=open(argv[1],O_RDWR | O_CREAT,0666);
if(fd &lt;= 0){
        printf(&quot;file open failed\n&quot;);
        _exit(0);
}
while(block_count &gt; 0){
        lseek(fd,BLOCK_SIZE,SEEK_CUR);
        block_count--;
        for(i=0;i&lt;sector_per_block;i++)
        write(fd,buf,512);
        block_count--;
}
close(fd);
return 0;
}
</code></pre>
<p>Suppose, I create a new_sparse_file using this above code.</p>
<p>When I run this program, on ext3 FS with block size 4KB, ls -lh shows size of new_sparse_file as 16KB, while du -h shows 8 kb, which, I think is correct.</p>
<p>On xfs, block size of 4kb, ls -lh shows 16KB but du -h shows 12kb.</p>
<div>Why are there different kinds of behavior?</div>
<div> </div>
<div>If I increase the block_count to be written so that a 200MB file is created, on XFS du -h shows 187MB and on EXT3 it shows 101MB.</div>