mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
Readd zfs_holey() from OpenSolaris
This patch restores the zfs_holey() function from OpenSolaris.
This was removed by commit 3558fd7
because it wasn't clear we
had a use for it in ZoL. However, this functionality is a
prerequisite for adding SEEK_DATA/SEEK_HOLE support to the ZPL.
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Richard Yao <ryao@gentoo.org>
Issue #1384
This commit is contained in:
parent
0a6bef26ec
commit
cf91b2b6b2
@ -240,6 +240,51 @@ zfs_close(struct inode *ip, int flag, cred_t *cr)
|
||||
}
|
||||
EXPORT_SYMBOL(zfs_close);
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Lseek support for finding holes (cmd == _FIO_SEEK_HOLE) and
|
||||
* data (cmd == _FIO_SEEK_DATA). "off" is an in/out parameter.
|
||||
*/
|
||||
static int
|
||||
zfs_holey(vnode_t *vp, int cmd, offset_t *off)
|
||||
{
|
||||
znode_t *zp = VTOZ(vp);
|
||||
uint64_t noff = (uint64_t)*off; /* new offset */
|
||||
uint64_t file_sz;
|
||||
int error;
|
||||
boolean_t hole;
|
||||
|
||||
file_sz = zp->z_size;
|
||||
if (noff >= file_sz) {
|
||||
return (SET_ERROR(ENXIO));
|
||||
}
|
||||
|
||||
if (cmd == _FIO_SEEK_HOLE)
|
||||
hole = B_TRUE;
|
||||
else
|
||||
hole = B_FALSE;
|
||||
|
||||
error = dmu_offset_next(zp->z_zfsvfs->z_os, zp->z_id, hole, &noff);
|
||||
|
||||
/* end of file? */
|
||||
if ((error == ESRCH) || (noff > file_sz)) {
|
||||
/*
|
||||
* Handle the virtual hole at the end of file.
|
||||
*/
|
||||
if (hole) {
|
||||
*off = file_sz;
|
||||
return (0);
|
||||
}
|
||||
return (SET_ERROR(ENXIO));
|
||||
}
|
||||
|
||||
if (noff < *off)
|
||||
return (error);
|
||||
*off = noff;
|
||||
return (error);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(_KERNEL)
|
||||
/*
|
||||
* When a file is memory mapped, we must keep the IO data synchronized
|
||||
|
Loading…
Reference in New Issue
Block a user