diff options
author | kib <kib@FreeBSD.org> | 2012-07-02 21:01:03 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2012-07-02 21:01:03 +0000 |
commit | 53224f018aac13056c11af9d1233317b1754149c (patch) | |
tree | 26c1ae1ac3dde3bf8b9b01fad04caad427a4ef48 /sys/sys/file.h | |
parent | 293bf50336e246390039b341f229e30d00d97d27 (diff) | |
download | FreeBSD-src-53224f018aac13056c11af9d1233317b1754149c.zip FreeBSD-src-53224f018aac13056c11af9d1233317b1754149c.tar.gz |
Extend the KPI to lock and unlock f_offset member of struct file. It
now fully encapsulates all accesses to f_offset, and extends f_offset
locking to other consumers that need it, in particular, to lseek() and
variants of getdirentries().
Ensure that on 32bit architectures f_offset, which is 64bit quantity,
always read and written under the mtxpool protection. This fixes
apparently easy to trigger race when parallel lseek()s or lseek() and
read/write could destroy file offset.
The already broken ABI emulations, including iBCS and SysV, are not
converted (yet).
Tested by: pho
No objections from: jhb
MFC after: 3 weeks
Diffstat (limited to 'sys/sys/file.h')
-rw-r--r-- | sys/sys/file.h | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/sys/sys/file.h b/sys/sys/file.h index b89e584..c4c6dbf 100644 --- a/sys/sys/file.h +++ b/sys/sys/file.h @@ -72,10 +72,25 @@ struct socket; struct file; struct ucred; +#define FOF_OFFSET 0x01 /* Use the offset in uio argument */ +#define FOF_NOLOCK 0x02 /* Do not take FOFFSET_LOCK */ +#define FOF_NEXTOFF 0x04 /* Also update f_nextoff */ +#define FOF_NOUPDATE 0x10 /* Do not update f_offset */ +off_t foffset_lock(struct file *fp, int flags); +void foffset_lock_uio(struct file *fp, struct uio *uio, int flags); +void foffset_unlock(struct file *fp, off_t val, int flags); +void foffset_unlock_uio(struct file *fp, struct uio *uio, int flags); + +static inline off_t +foffset_get(struct file *fp) +{ + + return (foffset_lock(fp, FOF_NOLOCK)); +} + typedef int fo_rdwr_t(struct file *fp, struct uio *uio, struct ucred *active_cred, int flags, struct thread *td); -#define FOF_OFFSET 1 /* Use the offset in uio argument */ typedef int fo_truncate_t(struct file *fp, off_t length, struct ucred *active_cred, struct thread *td); typedef int fo_ioctl_t(struct file *fp, u_long com, void *data, |