summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-10-18 15:28:01 +0000
committerkib <kib@FreeBSD.org>2014-10-18 15:28:01 +0000
commit08803fec5e8ea299d92a78946ba8412d60b4c177 (patch)
tree15d4bbae2c8694a5af539705ee16fd522f38e7b0
parent09684679cf2bfe78a9ac72157e04f5fb379e6bc7 (diff)
downloadFreeBSD-src-08803fec5e8ea299d92a78946ba8412d60b4c177.zip
FreeBSD-src-08803fec5e8ea299d92a78946ba8412d60b4c177.tar.gz
MFC r272534:
Add IO_RANGELOCKED flag for vn_rdwr(9), which specifies that vnode is not locked, but range is.
-rw-r--r--sys/kern/vfs_vnops.c17
-rw-r--r--sys/sys/vnode.h1
2 files changed, 11 insertions, 7 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 776954d..8085128 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -502,13 +502,16 @@ vn_rdwr(enum uio_rw rw, struct vnode *vp, void *base, int len, off_t offset,
error = 0;
if ((ioflg & IO_NODELOCKED) == 0) {
- if (rw == UIO_READ) {
- rl_cookie = vn_rangelock_rlock(vp, offset,
- offset + len);
- } else {
- rl_cookie = vn_rangelock_wlock(vp, offset,
- offset + len);
- }
+ if ((ioflg & IO_RANGELOCKED) == 0) {
+ if (rw == UIO_READ) {
+ rl_cookie = vn_rangelock_rlock(vp, offset,
+ offset + len);
+ } else {
+ rl_cookie = vn_rangelock_wlock(vp, offset,
+ offset + len);
+ }
+ } else
+ rl_cookie = NULL;
mp = NULL;
if (rw == UIO_WRITE) {
if (vp->v_type != VCHR &&
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index acddfc0..d0e193c 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -305,6 +305,7 @@ struct vattr {
#define IO_NORMAL 0x0800 /* operate on regular data */
#define IO_NOMACCHECK 0x1000 /* MAC checks unnecessary */
#define IO_BUFLOCKED 0x2000 /* ffs flag; indir buf is locked */
+#define IO_RANGELOCKED 0x4000 /* range locked */
#define IO_SEQMAX 0x7F /* seq heuristic max value */
#define IO_SEQSHIFT 16 /* seq heuristic in upper 16 bits */
OpenPOWER on IntegriCloud