| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $ */ | | 1 | /* $NetBSD: puffs_vnops.c,v 1.129.4.7 2010/01/16 17:52:13 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,27 +20,27 @@ | | | @@ -20,27 +20,27 @@ |
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.6 2009/12/18 05:58:26 snj Exp $"); | | 33 | __KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.7 2010/01/16 17:52:13 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 | | | 42 | |
43 | #include <uvm/uvm.h> | | 43 | #include <uvm/uvm.h> |
44 | | | 44 | |
45 | #include <fs/puffs/puffs_msgif.h> | | 45 | #include <fs/puffs/puffs_msgif.h> |
46 | #include <fs/puffs/puffs_sys.h> | | 46 | #include <fs/puffs/puffs_sys.h> |
| @@ -827,29 +827,30 @@ int | | | @@ -827,29 +827,30 @@ int |
827 | puffs_vnop_getattr(void *v) | | 827 | puffs_vnop_getattr(void *v) |
828 | { | | 828 | { |
829 | struct vop_getattr_args /* { | | 829 | struct vop_getattr_args /* { |
830 | const struct vnodeop_desc *a_desc; | | 830 | const struct vnodeop_desc *a_desc; |
831 | struct vnode *a_vp; | | 831 | struct vnode *a_vp; |
832 | struct vattr *a_vap; | | 832 | struct vattr *a_vap; |
833 | kauth_cred_t a_cred; | | 833 | kauth_cred_t a_cred; |
834 | } */ *ap = v; | | 834 | } */ *ap = v; |
835 | PUFFS_MSG_VARS(vn, getattr); | | 835 | PUFFS_MSG_VARS(vn, getattr); |
836 | struct vnode *vp = ap->a_vp; | | 836 | struct vnode *vp = ap->a_vp; |
837 | struct mount *mp = vp->v_mount; | | 837 | struct mount *mp = vp->v_mount; |
838 | struct puffs_mount *pmp = MPTOPUFFSMP(mp); | | 838 | struct puffs_mount *pmp = MPTOPUFFSMP(mp); |
839 | struct vattr *vap, *rvap; | | 839 | struct vattr *vap, *rvap; |
840 | struct puffs_node *pn; | | 840 | struct puffs_node *pn = VPTOPP(vp); |
841 | int error = 0; | | 841 | int error = 0; |
842 | | | 842 | |
| | | 843 | REFPN(pn); |
843 | vap = ap->a_vap; | | 844 | vap = ap->a_vap; |
844 | | | 845 | |
845 | PUFFS_MSG_ALLOC(vn, getattr); | | 846 | PUFFS_MSG_ALLOC(vn, getattr); |
846 | vattr_null(&getattr_msg->pvnr_va); | | 847 | vattr_null(&getattr_msg->pvnr_va); |
847 | puffs_credcvt(&getattr_msg->pvnr_cred, ap->a_cred); | | 848 | puffs_credcvt(&getattr_msg->pvnr_cred, ap->a_cred); |
848 | puffs_msg_setinfo(park_getattr, PUFFSOP_VN, | | 849 | puffs_msg_setinfo(park_getattr, PUFFSOP_VN, |
849 | PUFFS_VN_GETATTR, VPTOPNC(vp)); | | 850 | PUFFS_VN_GETATTR, VPTOPNC(vp)); |
850 | | | 851 | |
851 | PUFFS_MSG_ENQUEUEWAIT2(pmp, park_getattr, vp->v_data, NULL, error); | | 852 | PUFFS_MSG_ENQUEUEWAIT2(pmp, park_getattr, vp->v_data, NULL, error); |
852 | error = checkerr(pmp, error, __func__); | | 853 | error = checkerr(pmp, error, __func__); |
853 | if (error) | | 854 | if (error) |
854 | goto out; | | 855 | goto out; |
855 | | | 856 | |
| @@ -860,44 +861,44 @@ puffs_vnop_getattr(void *v) | | | @@ -860,44 +861,44 @@ puffs_vnop_getattr(void *v) |
860 | */ | | 861 | */ |
861 | if (vp->v_type == VBLK || vp->v_type == VCHR) | | 862 | if (vp->v_type == VBLK || vp->v_type == VCHR) |
862 | rvap->va_size = vp->v_size; | | 863 | rvap->va_size = vp->v_size; |
863 | | | 864 | |
864 | /* Ditto for blocksize (ufs comment: this doesn't belong here) */ | | 865 | /* Ditto for blocksize (ufs comment: this doesn't belong here) */ |
865 | if (vp->v_type == VBLK) | | 866 | if (vp->v_type == VBLK) |
866 | rvap->va_blocksize = BLKDEV_IOSIZE; | | 867 | rvap->va_blocksize = BLKDEV_IOSIZE; |
867 | else if (vp->v_type == VCHR) | | 868 | else if (vp->v_type == VCHR) |
868 | rvap->va_blocksize = MAXBSIZE; | | 869 | rvap->va_blocksize = MAXBSIZE; |
869 | | | 870 | |
870 | (void) memcpy(vap, rvap, sizeof(struct vattr)); | | 871 | (void) memcpy(vap, rvap, sizeof(struct vattr)); |
871 | vap->va_fsid = mp->mnt_stat.f_fsidx.__fsid_val[0]; | | 872 | vap->va_fsid = mp->mnt_stat.f_fsidx.__fsid_val[0]; |
872 | | | 873 | |
873 | pn = VPTOPP(vp); | | | |
874 | if (pn->pn_stat & PNODE_METACACHE_ATIME) | | 874 | if (pn->pn_stat & PNODE_METACACHE_ATIME) |
875 | vap->va_atime = pn->pn_mc_atime; | | 875 | vap->va_atime = pn->pn_mc_atime; |
876 | if (pn->pn_stat & PNODE_METACACHE_CTIME) | | 876 | if (pn->pn_stat & PNODE_METACACHE_CTIME) |
877 | vap->va_ctime = pn->pn_mc_ctime; | | 877 | vap->va_ctime = pn->pn_mc_ctime; |
878 | if (pn->pn_stat & PNODE_METACACHE_MTIME) | | 878 | if (pn->pn_stat & PNODE_METACACHE_MTIME) |
879 | vap->va_mtime = pn->pn_mc_mtime; | | 879 | vap->va_mtime = pn->pn_mc_mtime; |
880 | if (pn->pn_stat & PNODE_METACACHE_SIZE) { | | 880 | if (pn->pn_stat & PNODE_METACACHE_SIZE) { |
881 | vap->va_size = pn->pn_mc_size; | | 881 | vap->va_size = pn->pn_mc_size; |
882 | } else { | | 882 | } else { |
883 | if (rvap->va_size != VNOVAL | | 883 | if (rvap->va_size != VNOVAL |
884 | && vp->v_type != VBLK && vp->v_type != VCHR) { | | 884 | && vp->v_type != VBLK && vp->v_type != VCHR) { |
885 | uvm_vnp_setsize(vp, rvap->va_size); | | 885 | uvm_vnp_setsize(vp, rvap->va_size); |
886 | pn->pn_serversize = rvap->va_size; | | 886 | pn->pn_serversize = rvap->va_size; |
887 | } | | 887 | } |
888 | } | | 888 | } |
889 | | | 889 | |
890 | out: | | 890 | out: |
| | | 891 | puffs_releasenode(pn); |
891 | PUFFS_MSG_RELEASE(getattr); | | 892 | PUFFS_MSG_RELEASE(getattr); |
892 | return error; | | 893 | return error; |
893 | } | | 894 | } |
894 | | | 895 | |
895 | #define SETATTR_CHSIZE 0x01 | | 896 | #define SETATTR_CHSIZE 0x01 |
896 | #define SETATTR_ASYNC 0x02 | | 897 | #define SETATTR_ASYNC 0x02 |
897 | static int | | 898 | static int |
898 | dosetattr(struct vnode *vp, struct vattr *vap, kauth_cred_t cred, int flags) | | 899 | dosetattr(struct vnode *vp, struct vattr *vap, kauth_cred_t cred, int flags) |
899 | { | | 900 | { |
900 | PUFFS_MSG_VARS(vn, setattr); | | 901 | PUFFS_MSG_VARS(vn, setattr); |
901 | struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); | | 902 | struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); |
902 | struct puffs_node *pn = vp->v_data; | | 903 | struct puffs_node *pn = vp->v_data; |
903 | int error = 0; | | 904 | int error = 0; |