diff options
author | pjd <pjd@FreeBSD.org> | 2007-04-05 21:10:53 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2007-04-05 21:10:53 +0000 |
commit | 4718e01f98485788a9f7b2defc77a984780db526 (patch) | |
tree | c358a7e9b774044c343bcf2b36dc569901065d03 /sys | |
parent | 7e73da14eb8410d6878c1e60cdb665d8a8c74c47 (diff) | |
download | FreeBSD-src-4718e01f98485788a9f7b2defc77a984780db526.zip FreeBSD-src-4718e01f98485788a9f7b2defc77a984780db526.tar.gz |
Implement SEEK_DATA and SEEK_HOLE extensions to lseek(2) as found in
OpenSolaris. For more information please refer to:
http://blogs.sun.com/bonwick/entry/seek_hole_and_seek_data
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/vfs_syscalls.c | 7 | ||||
-rw-r--r-- | sys/sys/filio.h | 3 | ||||
-rw-r--r-- | sys/sys/unistd.h | 5 |
3 files changed, 15 insertions, 0 deletions
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index c7b278e..72a3f4e 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$"); #include <sys/kernel.h> #include <sys/fcntl.h> #include <sys/file.h> +#include <sys/filio.h> #include <sys/limits.h> #include <sys/linker.h> #include <sys/stat.h> @@ -1740,6 +1741,12 @@ lseek(td, uap) break; case L_SET: break; + case SEEK_DATA: + error = fo_ioctl(fp, FIOSEEKDATA, &offset, cred, td); + break; + case SEEK_HOLE: + error = fo_ioctl(fp, FIOSEEKHOLE, &offset, cred, td); + break; default: error = EINVAL; } diff --git a/sys/sys/filio.h b/sys/sys/filio.h index 8f2731a..5f13288 100644 --- a/sys/sys/filio.h +++ b/sys/sys/filio.h @@ -55,5 +55,8 @@ struct fiodgname_arg { void *buf; }; #define FIODGNAME _IOW('f', 120, struct fiodgname_arg) /* get dev. name */ +/* Handle lseek SEEK_DATA and SEEK_HOLE for holey file knowledge. */ +#define FIOSEEKDATA _IOWR('f', 97, off_t) /* SEEK_DATA */ +#define FIOSEEKHOLE _IOWR('f', 98, off_t) /* SEEK_HOLE */ #endif /* !_SYS_FILIO_H_ */ diff --git a/sys/sys/unistd.h b/sys/sys/unistd.h index 1fcd384..9f3eac9 100644 --- a/sys/sys/unistd.h +++ b/sys/sys/unistd.h @@ -107,6 +107,8 @@ #define SEEK_SET 0 /* set file offset to offset */ #define SEEK_CUR 1 /* set file offset to current plus offset */ #define SEEK_END 2 /* set file offset to EOF plus offset */ +#define SEEK_DATA 3 /* set file offset to next data past offset */ +#define SEEK_HOLE 4 /* set file offset to next hole past offset */ #endif #ifndef _POSIX_SOURCE @@ -151,6 +153,9 @@ #define _PC_MAC_PRESENT 63 #endif +/* From OpenSolaris, used by SEEK_DATA/SEEK_HOLE. */ +#define _PC_MIN_HOLE_SIZE 21 + #if __BSD_VISIBLE /* * rfork() options. |