Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Feb 2016 15:25:56 +0200
From:      Konstantin Belousov <kostikbel@gmail.com>
To:        Maxim Sobolev <sobomax@FreeBSD.org>
Cc:        freebsd-fs@freebsd.org, Kirk McKusick <mckusick@mckusick.com>
Subject:   Re: Inconsistency between lseek(SEEK_HOLE) and lseek(SEEK_DATA)
Message-ID:  <20160202132556.GV91220@kib.kiev.ua>
In-Reply-To: <CAH7qZfuzzba8bstboT1R7oE6Qv-9BHgLj=qRd7KN8KvUBzexxw@mail.gmail.com>
References:  <CAH7qZfuZNZ%2BJDPC4D1sjXj2tFxZKBiYVyTp-Y3UUUoq9er%2BWYQ@mail.gmail.com> <20160201165648.GM91220@kib.kiev.ua> <CAH7qZfvcpBo%2BvDho4GeNYWh6N83sebUi-DSG9--T%2BnxQiLhJ1A@mail.gmail.com> <20160201182257.GN91220@kib.kiev.ua> <CAH7qZftsv_0ersqexJ0fTnSQexe4WvpMLnF6X9bj_wX6q9Ewfw@mail.gmail.com> <20160201194014.GQ91220@kib.kiev.ua> <CAH7qZfufYKYD%2BmY8d2wcx3k1kG9CTRXBqXabtJ2p-RKU7uCPfw@mail.gmail.com> <CAH7qZfuzzba8bstboT1R7oE6Qv-9BHgLj=qRd7KN8KvUBzexxw@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Feb 01, 2016 at 09:17:00PM -0800, Maxim Sobolev wrote:
> WRT the:
> 
> > There is no 'hole-only' files on UFS, the last byte in the UFS file must
> > be populated, either by allocated fragment if the last byte is in the
> > direct blocks range, or by the full block if in the indirect range.
> 
> Ideed, the UFS resists putting a hole at the end of the file, yet, it's
> possible to arrange hole-only situation by first truncating an empty file
> to some size that is greater than the target hole size, so that you get
> hole of the desired size following by the bit of data, and then truncating
> the resulting file back to the offset where the data starts:
> 
> -----
>     fd = open(fname, O_WRONLY | O_CREAT | O_TRUNC, DEFFILEMODE);
>     if (fd == -1) {
>         exit (1);
>     }
>     if (ftruncate(fd, 1024 * 128) < 0) {
>         exit (1);
>     }
>     data = lseek(fd, 0, SEEK_DATA);
>     if (data >= 0 && ftruncate(fd, data) < 0) {
>         exit (1);
>     }
> -----
> [sobomax@rtpdev ~/projects/freebsd11/usr.bin/lsholes]$ ./lsholes
> /tmp/temp.MgoPPo
> Type Start   End  Size
> HOLE     0 98303 98304
> 
> Total HOLE: 98304 (100.00%)
> Total DATA: 0 (0.00%)
> [sobomax@rtpdev ~/projects/freebsd11/usr.bin/lsholes]$ ls -l
> /tmp/temp.MgoPPo
> -rw-r--r--  1 sobomax  wheel  98304 Feb  1 21:06 /tmp/temp.MgoPPo
Is this on UFS ?

Please provide me with the program to re-create it, if on UFS.
At least fsck is not ready for files with holes at tail, and several
kernel code fragments expect last byte to be allocated.  I once had
a patch to allow hole at tail for UFS, but I did not moved it to the
committable state.

> -----
> 
> I don't know if operating on that file would result in some data
> corruption, but I also seem have no issues creating hole-only files on ZFS
> using my fallocate(2) syscall.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20160202132556.GV91220>