On Apr 18, 2011, at 11:22 AM, jeff.liu wrote:

> Hello List,
> 
> I am trying to fetch the data/hole info of a sparse file through the 
> lseek(SEEK_HOLE/SEEK_DATA)
> stuff, the result of fpathconf(..., _PC_MIN_HOLE_SIZE) is ok, so I think this 
> interface is supported
> on my testing ZFS, but SEEK_HOLE always return the sparse file total size 
> instead of the desired
> first hole start offset.
> 
> The whole process was shown as following, Could anyone give any hints?
> 
> Create a sparse file("sparse2") as below, SEEK_HOLE should returns *ZERO* and 
> SEEK_DATA should
> returns 40960 IMHO:
> bash-3.00@ python -c "f=open('sparse2', 'w'); f.seek(40960); f.write('BYE'); 
> f.close()"

With default settings you'll get single-block file without any holes from ZFS 
perspective.

Try somewhat bigger sparse file like this:

dd if=/dev/urandom of=test.file count=1 bs=128k oseek=1024


> 
> A tiny program to examine the hole start offset of file "sparse2".
> #include <stdio.h>
> #include <string.h>
> #include <fcntl.h>
> #include <sys/stat.h>
> #include <sys/types.h>
> #include <unistd.h>
> #include <errno.h>
> 
> int
> main(int argc, char *argv[])
> {
>       int ret = 0, fd;
>       off_t data_pos, hole_pos;
>       const char *filename = NULL;
> 
>       if (argc != 2) {
>               fprintf(stderr, "Usage: %s file\n", argv[0]);
>               return 1;
>       }
> 
>       filename = strdup(argv[1]);
>       if (!filename) {
>               perror("strdup");
>               return -1;
>       }
> 
>       fd = open(filename, O_RDONLY);
>       if (fd < 0) {
>               perror("open");
>               ret = -1;
>               goto out;
>       }
> 
>       if (fpathconf(fd, _PC_MIN_HOLE_SIZE) < 0) {
>               fprintf(stderr, "The underlying filesystem does not support 
> SEEK_HOLE.\n");
>               goto out;
>       }
> 
>       hole_pos = lseek(fd, (off_t)0, SEEK_HOLE);
>       if (hole_pos < 0) {
>               if (errno == EINVAL || errno == ENOTSUP) {
>                       fprintf(stderr, "SEEK_HOLE does not support on OS or 
> filesystem.\n");
>                       goto out;
>               }
> 
>               perror("lseek");
>               ret = -1;
>               goto out;
>       }
> 
>       if (hole_pos == 0)
>               fprintf(stderr, "Oh, no!! hole start at offset 0?\n");
> 
>       if (hole_pos > 0)
>               fprintf(stderr, "detected a real hole at: %d.\n", hole_pos);
> 
> out:
>       free(filename);
>       lseek(fd, (off_t)0, SEEK_SET);
>                       
>       return 0;       
> }
> 
> My test env:
> ============
> bash-3.00# uname -a
> SunOS unknown 5.10 Generic_142910-17 i86pc i386 i86pc
> 
> man zfs(1):
> SunOS 5.10          Last change: 11 Jun 2010
> 
> bash-3.00# zfs list
> NAME                        USED  AVAIL  REFER  MOUNTPOINT
> ...
> ...
> rpool/export/home           120K   139G   120K  /export/home
> ...
> 
> "sparse2" located at "/export/home":
> bash-3.00# zdb -dddddd rpool/export/home
> Object  lvl   iblk   dblk  dsize  lsize   %full  type
> 104    1    16K  40.5K  40.5K  40.5K  100.00  ZFS plain file
> 264   bonus  ZFS znode
> dnode flags: USED_BYTES USERUSED_ACCOUNTED
> dnode maxblkid: 0
> path    /sparse2
> uid     0
> gid     0
> atime   Mon Apr 18 14:50:46 2011
> mtime   Mon Apr 18 14:50:46 2011
> ctime   Mon Apr 18 14:50:46 2011
> crtime  Mon Apr 18 14:50:46 2011
> gen     497
> mode    100600
> size    40963
> parent  3
> links   1
> xattr   0
> rdev    0x0000000000000000
> Indirect blocks:
> 0 L0 0:1960ce000:a200 a200L/a200P F=1 B=497/497
> 
> segment [0000000000000000, 000000000000a200) size 40.5K
> 
> bash-3.00# zdb -R rpool/export/home 0:1960ce000:a200
> .....
> 009ff0:  0000000000000000  0000000000000000  ................
> 00a000:  0000000000455942  0000000000000000  BYE.............
> 00a010:  0000000000000000  0000000000000000  ................
> ....
> ...
> 
> Any comments are appreciated!
> 
> Thanks,
> -Jeff
> _______________________________________________
> zfs-discuss mailing list
> zfs-discuss@opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/zfs-discuss

_______________________________________________
zfs-discuss mailing list
zfs-discuss@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/zfs-discuss

Reply via email to