Sat Jan 16 17:52:13 2010 UTC ()
Pull up following revision(s) (requested by pooka in ticket #1244):
	sys/fs/puffs/puffs_vnops.c: revision 1.142
Since VOP_GETATTR() does not require a locked vnode, resolve and
reference the puffs_node before sending the request to the file
server.  This diminishes the window where the inode can be reclaimed
and be invalidated before it is accessed (but does not completely
eliminate the race, as that is a caller problem which we cannot
fix here).


(bouyer)
diff -r1.129.4.6 -r1.129.4.7 src/sys/fs/puffs/puffs_vnops.c

cvs diff -r1.129.4.6 -r1.129.4.7 src/sys/fs/puffs/puffs_vnops.c (expand / switch to unified diff)

--- src/sys/fs/puffs/puffs_vnops.c 2009/12/18 05:58:26 1.129.4.6
+++ src/sys/fs/puffs/puffs_vnops.c 2010/01/16 17:52:13 1.129.4.7
@@ -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
827puffs_vnop_getattr(void *v) 827puffs_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
897static int 898static int
898dosetattr(struct vnode *vp, struct vattr *vap, kauth_cred_t cred, int flags) 899dosetattr(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;