Creating sparse file on XFS and EXT3 has different results

Ashish Sangwan ashishsangwan2 at gmail.com
Mon Aug 8 10:41:05 EDT 2011


Dear Mani,

-> It depends upon the actual disk block size not the file system block size
..

I think that it always depends on the file-system block size.
A disk block size will always less than or equal to File system block size.
For example, say a FS X has block size 2K and disk block size =512.
So, when you create a 1 byte file, file_size = 1byte and disk blocks =4.
Now, if another FS Y has block size 4K and you create a 1 byte file then :-
file_size = 1 byte and disk blocks= 8.

On Mon, Aug 8, 2011 at 12:46 PM, mani <manishrma at gmail.com> wrote:

> The ls uses st_size while du uses st_blocks.
> So
> st_size "file size in bytes"
> st_blocks "number of 512 byte blocks allocated".
> It depends upon the actual disk block size not the file system block size
> ..
> try using the ls -ls it will give you both the o/p's .
>
> Are you using the same hard disk with same disk block size ?
>
>
> On Sat, Aug 6, 2011 at 9:51 PM, mani <manishrma at gmail.com> wrote:
>
>> Dear Ashish,
>>
>> The ls uses st_size while du uses st_blocks.
>> try using the ls -ls it will give you both the o/p's .
>>
>> Thanks
>> Manish
>>
>> On Fri, Aug 5, 2011 at 7:45 AM, Ashish Sangwan <ashishsangwan2 at gmail.com>wrote:
>>
>>> I write 1 program to create sparse file which contains alternate empty
>>> blocks and data blocks. For example block1=empty, block2=data, block3=empty
>>> .....
>>>
>>> #define BLOCK_SIZE 4096
>>> void *buf;
>>> int main(int argc, char **argv)
>>> {
>>> buf=malloc(512);
>>> memset(buf,"a",512);
>>> int fd=0;
>>> int i;
>>> int sector_per_block=BLOCK_SIZE/512;
>>> int block_count=4;
>>> if(argc !=2 ){
>>>         printf("Wrong usage\n USAGE: program absolute_path_to_write\n");
>>>         _exit(-1);
>>> }
>>> fd=open(argv[1],O_RDWR | O_CREAT,0666);
>>> if(fd <= 0){
>>>         printf("file open failed\n");
>>>         _exit(0);
>>> }
>>> while(block_count > 0){
>>>         lseek(fd,BLOCK_SIZE,SEEK_CUR);
>>>         block_count--;
>>>         for(i=0;i<sector_per_block;i++)
>>>         write(fd,buf,512);
>>>         block_count--;
>>> }
>>> close(fd);
>>> return 0;
>>> }
>>>
>>> Suppose, I create a new_sparse_file using this above code.
>>>
>>> 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.
>>>
>>> On xfs, block size of 4kb, ls -lh shows 16KB but du -h shows 12kb.
>>> Why are there different kinds of behavior?
>>>
>>> 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.
>>>
>>> _______________________________________________
>>> Kernelnewbies mailing list
>>> Kernelnewbies at kernelnewbies.org
>>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20110808/4c0bf0c9/attachment.html 


More information about the Kernelnewbies mailing list