| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: puffs_vnops.c,v 1.129.4.7 2010/01/16 17:52:13 bouyer Exp $ */ | | 1 | /* $NetBSD: puffs_vnops.c,v 1.129.4.8 2011/06/18 16:17:38 bouyer Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. | | 4 | * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. |
5 | * | | 5 | * |
6 | * Development of this software was supported by the | | 6 | * Development of this software was supported by the |
7 | * Google Summer of Code program and the Ulla Tuominen Foundation. | | 7 | * Google Summer of Code program and the Ulla Tuominen Foundation. |
8 | * The Google SoC project was mentored by Bill Studenmund. | | 8 | * The Google SoC project was mentored by Bill Studenmund. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -20,35 +20,36 @@ | | | @@ -20,35 +20,36 @@ |
20 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | | 20 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
21 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | | 21 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
22 | * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | | 22 | * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | | 23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | | 24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
25 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | | 25 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
29 | * SUCH DAMAGE. | | 29 | * SUCH DAMAGE. |
30 | */ | | 30 | */ |
31 | | | 31 | |
32 | #include <sys/cdefs.h> | | 32 | #include <sys/cdefs.h> |
33 | __KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.7 2010/01/16 17:52:13 bouyer Exp $"); | | 33 | __KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.8 2011/06/18 16:17:38 bouyer Exp $"); |
34 | | | 34 | |
35 | #include <sys/param.h> | | 35 | #include <sys/param.h> |
36 | #include <sys/fstrans.h> | | 36 | #include <sys/fstrans.h> |
37 | #include <sys/malloc.h> | | 37 | #include <sys/malloc.h> |
38 | #include <sys/mount.h> | | 38 | #include <sys/mount.h> |
39 | #include <sys/namei.h> | | 39 | #include <sys/namei.h> |
40 | #include <sys/vnode.h> | | 40 | #include <sys/vnode.h> |
41 | #include <sys/proc.h> | | 41 | #include <sys/proc.h> |
| | | 42 | #include <sys/lockf.h> |
42 | | | 43 | |
43 | #include <uvm/uvm.h> | | 44 | #include <uvm/uvm.h> |
44 | | | 45 | |
45 | #include <fs/puffs/puffs_msgif.h> | | 46 | #include <fs/puffs/puffs_msgif.h> |
46 | #include <fs/puffs/puffs_sys.h> | | 47 | #include <fs/puffs/puffs_sys.h> |
47 | | | 48 | |
48 | #include <miscfs/fifofs/fifo.h> | | 49 | #include <miscfs/fifofs/fifo.h> |
49 | #include <miscfs/genfs/genfs.h> | | 50 | #include <miscfs/genfs/genfs.h> |
50 | #include <miscfs/specfs/specdev.h> | | 51 | #include <miscfs/specfs/specdev.h> |
51 | | | 52 | |
52 | int puffs_vnop_lookup(void *); | | 53 | int puffs_vnop_lookup(void *); |
53 | int puffs_vnop_create(void *); | | 54 | int puffs_vnop_create(void *); |
54 | int puffs_vnop_access(void *); | | 55 | int puffs_vnop_access(void *); |
| @@ -2114,44 +2115,45 @@ puffs_vnop_pathconf(void *v) | | | @@ -2114,44 +2115,45 @@ puffs_vnop_pathconf(void *v) |
2114 | int | | 2115 | int |
2115 | puffs_vnop_advlock(void *v) | | 2116 | puffs_vnop_advlock(void *v) |
2116 | { | | 2117 | { |
2117 | struct vop_advlock_args /* { | | 2118 | struct vop_advlock_args /* { |
2118 | const struct vnodeop_desc *a_desc; | | 2119 | const struct vnodeop_desc *a_desc; |
2119 | struct vnode *a_vp; | | 2120 | struct vnode *a_vp; |
2120 | void *a_id; | | 2121 | void *a_id; |
2121 | int a_op; | | 2122 | int a_op; |
2122 | struct flock *a_fl; | | 2123 | struct flock *a_fl; |
2123 | int a_flags; | | 2124 | int a_flags; |
2124 | } */ *ap = v; | | 2125 | } */ *ap = v; |
2125 | PUFFS_MSG_VARS(vn, advlock); | | 2126 | PUFFS_MSG_VARS(vn, advlock); |
2126 | struct vnode *vp = ap->a_vp; | | 2127 | struct vnode *vp = ap->a_vp; |
| | | 2128 | struct puffs_node *pn = VPTOPP(vp); |
2127 | struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); | | 2129 | struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); |
2128 | int error; | | 2130 | int error; |
2129 | | | 2131 | |
| | | 2132 | if (!EXISTSOP(pmp, ADVLOCK)) |
| | | 2133 | return lf_advlock(ap, &pn->pn_lockf, vp->v_size); |
| | | 2134 | |
2130 | PUFFS_MSG_ALLOC(vn, advlock); | | 2135 | PUFFS_MSG_ALLOC(vn, advlock); |
2131 | error = copyin(ap->a_fl, &advlock_msg->pvnr_fl, sizeof(struct flock)); | | 2136 | (void)memcpy(&advlock_msg->pvnr_fl, ap->a_fl, |
2132 | if (error) | | 2137 | sizeof(advlock_msg->pvnr_fl)); |
2133 | goto out; | | | |
2134 | advlock_msg->pvnr_id = ap->a_id; | | 2138 | advlock_msg->pvnr_id = ap->a_id; |
2135 | advlock_msg->pvnr_op = ap->a_op; | | 2139 | advlock_msg->pvnr_op = ap->a_op; |
2136 | advlock_msg->pvnr_flags = ap->a_flags; | | 2140 | advlock_msg->pvnr_flags = ap->a_flags; |
2137 | puffs_msg_setinfo(park_advlock, PUFFSOP_VN, | | 2141 | puffs_msg_setinfo(park_advlock, PUFFSOP_VN, |
2138 | PUFFS_VN_ADVLOCK, VPTOPNC(vp)); | | 2142 | PUFFS_VN_ADVLOCK, VPTOPNC(vp)); |
2139 | | | | |
2140 | PUFFS_MSG_ENQUEUEWAIT2(pmp, park_advlock, vp->v_data, NULL, error); | | 2143 | PUFFS_MSG_ENQUEUEWAIT2(pmp, park_advlock, vp->v_data, NULL, error); |
2141 | error = checkerr(pmp, error, __func__); | | 2144 | error = checkerr(pmp, error, __func__); |
2142 | | | | |
2143 | out: | | | |
2144 | PUFFS_MSG_RELEASE(advlock); | | 2145 | PUFFS_MSG_RELEASE(advlock); |
| | | 2146 | |
2145 | return error; | | 2147 | return error; |
2146 | } | | 2148 | } |
2147 | | | 2149 | |
2148 | int | | 2150 | int |
2149 | puffs_vnop_abortop(void *v) | | 2151 | puffs_vnop_abortop(void *v) |
2150 | { | | 2152 | { |
2151 | struct vop_abortop_args /* { | | 2153 | struct vop_abortop_args /* { |
2152 | struct vnode *a_dvp; | | 2154 | struct vnode *a_dvp; |
2153 | struct componentname *a_cnp; | | 2155 | struct componentname *a_cnp; |
2154 | }; */ *ap = v; | | 2156 | }; */ *ap = v; |
2155 | PUFFS_MSG_VARS(vn, abortop); | | 2157 | PUFFS_MSG_VARS(vn, abortop); |
2156 | struct vnode *dvp = ap->a_dvp; | | 2158 | struct vnode *dvp = ap->a_dvp; |
2157 | struct puffs_mount *pmp = MPTOPUFFSMP(dvp->v_mount); | | 2159 | struct puffs_mount *pmp = MPTOPUFFSMP(dvp->v_mount); |