Creating sparse file on XFS and EXT3 has different results
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.
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@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@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
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@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@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@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
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@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@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@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@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
participants (2)
-
Ashish Sangwan -
mani