CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: riz Date: Wed Jan 25 20:51:15 UTC 2012 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_node.c Log Message: Pull up following revision(s) (requested by manu in ticket #1714): sys/fs/puffs/puffs_node.c: revision 1.23 Fix a race condition where the filesystem lookups a vnode that is being recycled, producing ENOENT while the file does exist. Approved by yamt To generate a diff of this commit: cvs rdiff -u -r1.13.10.3 -r1.13.10.4 src/sys/fs/puffs/puffs_node.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_node.c diff -u src/sys/fs/puffs/puffs_node.c:1.13.10.3 src/sys/fs/puffs/puffs_node.c:1.13.10.4 --- src/sys/fs/puffs/puffs_node.c:1.13.10.3 Wed Nov 2 20:11:12 2011 +++ src/sys/fs/puffs/puffs_node.c Wed Jan 25 20:51:15 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_node.c,v 1.13.10.3 2011/11/02 20:11:12 riz Exp $ */ +/* $NetBSD: puffs_node.c,v 1.13.10.4 2012/01/25 20:51:15 riz Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.3 2011/11/02 20:11:12 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.4 2012/01/25 20:51:15 riz Exp $"); #include #include @@ -321,8 +321,14 @@ puffs_makeroot(struct puffs_mount *pmp) if (vp) { mutex_enter(&vp->v_interlock); mutex_exit(&pmp->pmp_lock); - if (vget(vp, LK_INTERLOCK) == 0) + switch (vget(vp, LK_INTERLOCK)) { + case ENOENT: + goto retry; + case 0: return 0; + default: + break; + } } else mutex_exit(&pmp->pmp_lock); @@ -387,6 +393,7 @@ puffs_cookie2vnode(struct puffs_mount *p return 0; } + retry: mutex_enter(&pmp->pmp_lock); pnode = puffs_cookie2pnode(pmp, ck); if (pnode == NULL) { @@ -406,8 +413,14 @@ puffs_cookie2vnode(struct puffs_mount *p vgetflags = LK_INTERLOCK; if (lock) vgetflags |= LK_EXCLUSIVE | LK_RETRY; - if ((rv = vget(vp, vgetflags))) + switch (rv = vget(vp, vgetflags)) { + case ENOENT: + goto retry; + case 0: + break; + default: return rv; + } *vpp = vp; return 0;
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: riz Date: Wed Nov 2 20:11:12 UTC 2011 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_msgif.c puffs_node.c puffs_vfsops.c puffs_vnops.c Log Message: Pull up following revision(s) (requested by manu in ticket #1679): sys/fs/puffs/puffs_vnops.c: revision 1.157 sys/fs/puffs/puffs_vnops.c: revision 1.158 sys/fs/puffs/puffs_vnops.c: revision 1.159 sys/fs/puffs/puffs_vfsops.c: revision 1.97 sys/fs/puffs/puffs_vfsops.c: revision 1.99 sys/fs/puffs/puffs_vnops.c: revision 1.160 sys/fs/puffs/puffs_vfsops.c: revision 1.100 sys/miscfs/syncfs/sync_subr.c: revision 1.47 sys/fs/puffs/puffs_node.c: revision 1.21 sys/fs/puffs/puffs_node.c: revision 1.22 sys/fs/puffs/puffs_msgif.c: revision 1.88 sys/fs/puffs/puffs_msgif.c: revision 1.89 sys/fs/puffs/puffs_vnops.c: revision 1.156 Make sure ioflush does not sleep in PUFFS code path, waiting for a mutex, a memory allocation, or a response from the filesystem. This avoids deadlocks in the following situations: 1) when memory is low: ioflush waits the fileystem, the fielsystem waits for memory 2) when the filesystem does not respond (e.g.: network outage ona distributed filesystem) Fix the build that was broken by struct lwp *updateproc reference in RUMP-visible code. Instead of checking that updateproc (aka ioflush, aka syncer) will not sleep in PUFFS code, I check for any kernel thread: after all none of them are designed to hang awaiting for a remote filesystem operation to complete. Roll back the change that forced kernel threads to not sleep in PUFFS. The change does not make consensus, since only pagedaemon should need it. Other threads will tolerate sleeping, and problems here are only symptoms that something is going wrong in memory management. The cause, not the symptoms, need to be fixed. Make sure pagedaemon does not sleep for memory in puffs_vnop_sleep. Add KASSERT on any sleeping memory allocation to check it cannot happen again. Remove #ifdef DIAGNOSTIC guards around KASSERT, as the macro contains them To generate a diff of this commit: cvs rdiff -u -r1.72.4.4 -r1.72.4.5 src/sys/fs/puffs/puffs_msgif.c cvs rdiff -u -r1.13.10.2 -r1.13.10.3 src/sys/fs/puffs/puffs_node.c cvs rdiff -u -r1.81.8.2 -r1.81.8.3 src/sys/fs/puffs/puffs_vfsops.c cvs rdiff -u -r1.129.4.10 -r1.129.4.11 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_msgif.c diff -u src/sys/fs/puffs/puffs_msgif.c:1.72.4.4 src/sys/fs/puffs/puffs_msgif.c:1.72.4.5 --- src/sys/fs/puffs/puffs_msgif.c:1.72.4.4 Fri Jul 15 23:41:13 2011 +++ src/sys/fs/puffs/puffs_msgif.c Wed Nov 2 20:11:12 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_msgif.c,v 1.72.4.4 2011/07/15 23:41:13 riz Exp $ */ +/* $NetBSD: puffs_msgif.c,v 1.72.4.5 2011/11/02 20:11:12 riz Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.4 2011/07/15 23:41:13 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.5 2011/11/02 20:11:12 riz Exp $"); #include #include @@ -45,6 +45,8 @@ __KERNEL_RCSID(0, "$NetBSD: puffs_msgif. #include #include +#include + #include #include @@ -132,6 +134,7 @@ puffs_msgpark_alloc(int waitok) { struct puffs_msgpark *park; + KASSERT(curlwp != uvm.pagedaemon_lwp || !waitok); park = pool_cache_get(parkpc, waitok ? PR_WAITOK : PR_NOWAIT); if (park == NULL) return park; @@ -228,6 +231,7 @@ puffs_msgmem_alloc(size_t len, struct pu struct puffs_msgpark *park; void *m; + KASSERT(curlwp != uvm.pagedaemon_lwp || !cansleep); m = kmem_zalloc(len, cansleep ? KM_SLEEP : KM_NOSLEEP); if (m == NULL) { KASSERT(cansleep == 0); @@ -935,6 +939,7 @@ puffsop_flush(struct puffs_mount *pmp, s struct componentname *pf_cn; char *name; /* get comfortab^Wcomponentname */ + KASSERT(curlwp != uvm.pagedaemon_lwp); pf_cn = kmem_alloc(componentname); memset(pf_cn, 0, sizeof(struct componentname)); break; @@ -1011,6 +1016,7 @@ puffs_msgif_dispatch(void *this, struct } pf = (struct puffs_flush *)preq; + KASSERT(curlwp != uvm.pagedaemon_lwp); psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP); memcpy(&psopr->psopr_pf, pf, sizeof(*pf)); psopr->psopr_sopreq = PUFFS_SOPREQ_FLUSH; Index: src/sys/fs/puffs/puffs_node.c diff -u src/sys/fs/puffs/puffs_node.c:1.13.10.2 src/sys/fs/puffs/puffs_node.c:1.13.10.3 --- src/sys/fs/puffs/puffs_node.c:1.13.10.2 Sat Sep 17 18:53:30 2011 +++ src/sys/fs/puffs/puffs_node.c Wed Nov 2 20:11:12 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_node.c,v 1.13.10.2 2011/09/17 18:53:30 bouyer Exp $ */ +/* $NetBSD: puffs_node.c,v 1.13.10.3 2011/11/02 20:11:12 riz Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: bouyer Date: Sat Sep 17 18:53:30 UTC 2011 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_node.c puffs_sys.h puffs_vnops.c Log Message: Pull up following revision(s) (requested by manu in ticket #1666): sys/fs/puffs/puffs_sys.h: revision 1.78 via patch sys/fs/puffs/puffs_node.c: revision 1.20 via patch sys/fs/puffs/puffs_vnops.c: revision 1.155 via patch Add a mutex for operations that touch size (setattr, getattr, write, fsync). This is required to avoid data corruption bugs, where a getattr slices itself within a setattr operation, and sets the size to the stall value it got from the filesystem. That value is smaller than the one set by setattr, and the call to uvm_vnp_setsize() trigged a spurious truncate. The result is a chunk of zeroed data in the file. Such a situation can easily happen when the ioflush thread issue a VOP_FSYNC/puffs_vnop_sync/flushvncache/dosetattrn while andother process do a sys_stat/VOP_GETATTR/puffs_vnop_getattr. This mutex on size operation can be removed the day we decide VOP_GETATTR has to operated on a locked vnode, since the other operations that touch size already require that. To generate a diff of this commit: cvs rdiff -u -r1.13.10.1 -r1.13.10.2 src/sys/fs/puffs/puffs_node.c cvs rdiff -u -r1.70.20.2 -r1.70.20.3 src/sys/fs/puffs/puffs_sys.h cvs rdiff -u -r1.129.4.9 -r1.129.4.10 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_node.c diff -u src/sys/fs/puffs/puffs_node.c:1.13.10.1 src/sys/fs/puffs/puffs_node.c:1.13.10.2 --- src/sys/fs/puffs/puffs_node.c:1.13.10.1 Sat Oct 3 23:11:27 2009 +++ src/sys/fs/puffs/puffs_node.c Sat Sep 17 18:53:30 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_node.c,v 1.13.10.1 2009/10/03 23:11:27 snj Exp $ */ +/* $NetBSD: puffs_node.c,v 1.13.10.2 2011/09/17 18:53:30 bouyer Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.1 2009/10/03 23:11:27 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.2 2011/09/17 18:53:30 bouyer Exp $"); #include #include @@ -155,6 +155,7 @@ } KASSERT(pnc != NULL); } + mutex_init(&pnode->pn_sizemtx, MUTEX_DEFAULT, IPL_NONE); mutex_exit(&pmp->pmp_lock); vp->v_data = pnode; @@ -463,6 +464,7 @@ if (--pn->pn_refcount == 0) { mutex_exit(&pn->pn_mtx); mutex_destroy(&pn->pn_mtx); + mutex_destroy(&pn->pn_sizemtx); seldestroy(&pn->pn_sel); pool_put(&puffs_pnpool, pn); } else { Index: src/sys/fs/puffs/puffs_sys.h diff -u src/sys/fs/puffs/puffs_sys.h:1.70.20.2 src/sys/fs/puffs/puffs_sys.h:1.70.20.3 --- src/sys/fs/puffs/puffs_sys.h:1.70.20.2 Sat Jun 18 16:19:39 2011 +++ src/sys/fs/puffs/puffs_sys.h Sat Sep 17 18:53:29 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_sys.h,v 1.70.20.2 2011/06/18 16:19:39 bouyer Exp $ */ +/* $NetBSD: puffs_sys.h,v 1.70.20.3 2011/09/17 18:53:29 bouyer Exp $ */ /* * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. @@ -205,6 +205,8 @@ voff_t pn_serversize; struct lockf * pn_lockf; + kmutex_t pn_sizemtx; /* size modification mutex */ + LIST_ENTRY(puffs_node) pn_hashent; }; Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.9 src/sys/fs/puffs/puffs_vnops.c:1.129.4.10 --- src/sys/fs/puffs/puffs_vnops.c:1.129.4.9 Sun Jul 17 15:36:03 2011 +++ src/sys/fs/puffs/puffs_vnops.c Sat Sep 17 18:53:30 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.129.4.9 2011/07/17 15:36:03 riz Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.129.4.10 2011/09/17 18:53:30 bouyer Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.9 2011/07/17 15:36:03 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.10 2011/09/17 18:53:30 bouyer Exp $"); #include #include @@ -856,6 +856,18 @@ struct puffs_node *pn = VPTOPP(vp); int error = 0; + /* + * A lock is required so that we do not race with + * setattr, write and fsync when changing vp->v_size. + * This is critical, since setting a stall smaler value + * triggers a file truncate in uvm_vnp_setsize(), which + * most of the time means data corruption (a chunk of + * data is replaced by zeroes). This can be removed if + * we decide one day that VOP_GETATTR must operate on + * a locked vnode. + */ + mutex_enter(&pn->pn_sizemtx); + REFPN(pn); vap = ap->a_vap; @@ -906,6 +918,9 @@ out: puffs_releasenode(pn); PUFFS_MSG_RELEASE(getattr); + + mutex_exit(&pn->pn_sizemtx); + return error; } @@ -919,6 +934,8 @@ struct puffs_node *pn = vp->v_data; int error = 0; + KASSERT(!(flags & SETATTR_CHSIZE) || mutex_owned(&pn->pn_sizemtx)); + if ((vp->v_mount->mnt_flag & MNT_RDONLY) &&
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: bouyer Date: Sat Jun 18 16:19:39 UTC 2011 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_sys.h Log Message: Pull up following revision(s) (requested by manu in ticket #1623): lib/libpuffs/puffs.c: revision 1.116 sys/fs/puffs/puffs_vnops.c: revision 1.151 Call advlock method if supplied To generate a diff of this commit: cvs rdiff -u -r1.70.20.1 -r1.70.20.2 src/sys/fs/puffs/puffs_sys.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_sys.h diff -u src/sys/fs/puffs/puffs_sys.h:1.70.20.1 src/sys/fs/puffs/puffs_sys.h:1.70.20.2 --- src/sys/fs/puffs/puffs_sys.h:1.70.20.1 Sat Jan 9 01:22:57 2010 +++ src/sys/fs/puffs/puffs_sys.h Sat Jun 18 16:19:39 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_sys.h,v 1.70.20.1 2010/01/09 01:22:57 snj Exp $ */ +/* $NetBSD: puffs_sys.h,v 1.70.20.2 2011/06/18 16:19:39 bouyer Exp $ */ /* * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. @@ -203,6 +203,7 @@ u_quad_t pn_mc_size; voff_t pn_serversize; + struct lockf * pn_lockf; LIST_ENTRY(puffs_node) pn_hashent; };
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: bouyer Date: Thu May 19 21:00:16 UTC 2011 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_msgif.c Log Message: Pull up following revision(s) (requested by manu in ticket #1604): sys/fs/puffs/puffs_msgif.c: revision 1.84 via patch Apply patch from PR kern/44093 by yamt: Interrupt server wait only on certain signals (same set at nfs -i) instead of all signals. According to the PR this helps with "git clone" run on a puffs file system. To generate a diff of this commit: cvs rdiff -u -r1.72.4.1 -r1.72.4.2 src/sys/fs/puffs/puffs_msgif.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_msgif.c diff -u src/sys/fs/puffs/puffs_msgif.c:1.72.4.1 src/sys/fs/puffs/puffs_msgif.c:1.72.4.2 --- src/sys/fs/puffs/puffs_msgif.c:1.72.4.1 Sat Jan 9 01:22:57 2010 +++ src/sys/fs/puffs/puffs_msgif.c Thu May 19 21:00:16 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_msgif.c,v 1.72.4.1 2010/01/09 01:22:57 snj Exp $ */ +/* $NetBSD: puffs_msgif.c,v 1.72.4.2 2011/05/19 21:00:16 bouyer Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.1 2010/01/09 01:22:57 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.2 2011/05/19 21:00:16 bouyer Exp $"); #include #include @@ -352,17 +352,30 @@ if (__predict_false((park->park_flags & PARKFLAG_WANTREPLY) && (park->park_flags & PARKFLAG_CALL) == 0 && (l->l_flag & LW_PENDSIG) != 0 && sigispending(l, 0))) { - park->park_flags |= PARKFLAG_HASERROR; - preq->preq_rv = EINTR; - if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN - && (preq->preq_optype == PUFFS_VN_INACTIVE - || preq->preq_optype == PUFFS_VN_RECLAIM)) { - park->park_preq->preq_opclass |= PUFFSOPFLAG_FAF; - park->park_flags &= ~PARKFLAG_WANTREPLY; - DPRINTF(("puffs_msg_enqueue: converted to FAF %p\n", - park)); - } else { - return; + sigset_t ss; + + /* + * see the comment about signals in puffs_msg_wait. + */ + sigpending1(l, &ss); + if (sigismember(&ss, SIGINT) || + sigismember(&ss, SIGTERM) || + sigismember(&ss, SIGKILL) || + sigismember(&ss, SIGHUP) || + sigismember(&ss, SIGQUIT)) { + park->park_flags |= PARKFLAG_HASERROR; + preq->preq_rv = EINTR; + if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN + && (preq->preq_optype == PUFFS_VN_INACTIVE + || preq->preq_optype == PUFFS_VN_RECLAIM)) { + park->park_preq->preq_opclass |= + PUFFSOPFLAG_FAF; + park->park_flags &= ~PARKFLAG_WANTREPLY; + DPRINTF(("puffs_msg_enqueue: " + "converted to FAF %p\n", park)); + } else { + return; + } } } @@ -431,11 +444,31 @@ int puffs_msg_wait(struct puffs_mount *pmp, struct puffs_msgpark *park) { - struct puffs_req *preq = park->park_preq; /* XXX: hmmm */ + lwp_t *l = curlwp; + proc_t *p = l->l_proc; +struct puffs_req *preq = park->park_preq; /* XXX: hmmm */ + sigset_t ss; + sigset_t oss; struct mount *mp = PMPTOMP(pmp); int error = 0; int rv; + /* + * block unimportant signals. + * + * The set of "important" signals here was chosen to be same as + * nfs interruptible mount. + */ + sigfillset(&ss); + sigdelset(&ss, SIGINT); + sigdelset(&ss, SIGTERM); + sigdelset(&ss, SIGKILL); + sigdelset(&ss, SIGHUP); + sigdelset(&ss, SIGQUIT); + mutex_enter(p->p_lock); + sigprocmask1(l, SIG_BLOCK, &ss, &oss); + mutex_exit(p->p_lock); + mutex_enter(&pmp->pmp_lock); puffs_mp_reference(pmp); mutex_exit(&pmp->pmp_lock); @@ -523,6 +556,10 @@ puffs_mp_release(pmp); mutex_exit(&pmp->pmp_lock); + mutex_enter(p->p_lock); + sigprocmask1(l, SIG_SETMASK, &oss, NULL); + mutex_exit(p->p_lock); + return rv; }
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: bouyer Date: Sat Jan 16 17:52:13 UTC 2010 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_vnops.c Log Message: 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). To generate a diff of this commit: cvs rdiff -u -r1.129.4.6 -r1.129.4.7 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.6 src/sys/fs/puffs/puffs_vnops.c:1.129.4.7 --- src/sys/fs/puffs/puffs_vnops.c:1.129.4.6 Fri Dec 18 05:58:26 2009 +++ src/sys/fs/puffs/puffs_vnops.c Sat Jan 16 17:52:13 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.129.4.7 2010/01/16 17:52:13 bouyer Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.7 2010/01/16 17:52:13 bouyer Exp $"); #include #include @@ -837,9 +837,10 @@ struct mount *mp = vp->v_mount; struct puffs_mount *pmp = MPTOPUFFSMP(mp); struct vattr *vap, *rvap; - struct puffs_node *pn; + struct puffs_node *pn = VPTOPP(vp); int error = 0; + REFPN(pn); vap = ap->a_vap; PUFFS_MSG_ALLOC(vn, getattr); @@ -870,7 +871,6 @@ (void) memcpy(vap, rvap, sizeof(struct vattr)); vap->va_fsid = mp->mnt_stat.f_fsidx.__fsid_val[0]; - pn = VPTOPP(vp); if (pn->pn_stat & PNODE_METACACHE_ATIME) vap->va_atime = pn->pn_mc_atime; if (pn->pn_stat & PNODE_METACACHE_CTIME) @@ -888,6 +888,7 @@ } out: + puffs_releasenode(pn); PUFFS_MSG_RELEASE(getattr); return error; }
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: snj Date: Sat Jan 9 01:22:58 UTC 2010 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_msgif.c puffs_sys.h puffs_vfsops.c Log Message: Pull up following revision(s) (requested by pooka in ticket #1212): sys/fs/puffs/puffs_msgif.c: revision 1.76 via patch sys/fs/puffs/puffs_sys.h: revision 1.73 via patch sys/fs/puffs/puffs_vfsops.c: revision 1.84 via patch Process flush requests from the file server in a separate thread context. This fixes a long-standing but seldomly seen deadlock, where the kernel was holding pages busy (due to e.g. readahead request) while waiting for the server to respond, and the server made a callback into the kernel asking to invalidate those pages. ... or, well, theoretically fixes, since I didn't have any reliable way of repeating the deadlock and I think I saw it only twice. To generate a diff of this commit: cvs rdiff -u -r1.72 -r1.72.4.1 src/sys/fs/puffs/puffs_msgif.c cvs rdiff -u -r1.70 -r1.70.20.1 src/sys/fs/puffs/puffs_sys.h cvs rdiff -u -r1.81 -r1.81.8.1 src/sys/fs/puffs/puffs_vfsops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_msgif.c diff -u src/sys/fs/puffs/puffs_msgif.c:1.72 src/sys/fs/puffs/puffs_msgif.c:1.72.4.1 --- src/sys/fs/puffs/puffs_msgif.c:1.72 Thu Sep 25 14:17:29 2008 +++ src/sys/fs/puffs/puffs_msgif.c Sat Jan 9 01:22:57 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_msgif.c,v 1.72 2008/09/25 14:17:29 ad Exp $ */ +/* $NetBSD: puffs_msgif.c,v 1.72.4.1 2010/01/09 01:22:57 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72 2008/09/25 14:17:29 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.1 2010/01/09 01:22:57 snj Exp $"); #include #include @@ -864,8 +864,8 @@ int rv, flags = 0; if (pf->pf_req.preq_pth.pth_framelen != sizeof(struct puffs_flush)) { - rv = EINVAL; - goto out; + puffs_msg_sendresp(pmp, &pf->pf_req, EINVAL); /* E2SMALL */ + return; } /* XXX: slurry */ @@ -949,8 +949,8 @@ { struct puffs_mount *pmp = this; struct puffs_req *preq = (struct puffs_req *)pth; + struct puffs_sopreq *psopr; - /* XXX: need to send error to userspace */ if (pth->pth_framelen < sizeof(struct puffs_req)) { puffs_msg_sendresp(pmp, preq, EINVAL); /* E2SMALL */ return 0; @@ -962,10 +962,28 @@ DPRINTF(("dispatch: vn/vfs message 0x%x\n", preq->preq_optype)); puffsop_msg(pmp, preq); break; - case PUFFSOP_FLUSH: - DPRINTF(("dispatch: flush 0x%x\n", preq->preq_optype)); - puffsop_flush(pmp, (struct puffs_flush *)preq); - break; + case PUFFSOP_FLUSH: /* process in sop thread */ + { + struct puffs_flush *pf; + + DPRINTF(("dispatch: flush 0x%x\n", preq->preq_optype)); + + if (preq->preq_pth.pth_framelen != sizeof(struct puffs_flush)) { + puffs_msg_sendresp(pmp, preq, EINVAL); /* E2SMALL */ + break; + } + pf = (struct puffs_flush *)preq; + + psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP); + memcpy(&psopr->psopr_pf, pf, sizeof(*pf)); + psopr->psopr_sopreq = PUFFS_SOPREQ_FLUSH; + + mutex_enter(&pmp->pmp_sopmtx); + TAILQ_INSERT_TAIL(&pmp->pmp_sopreqs, psopr, psopr_entries); + cv_signal(&pmp->pmp_sopcv); + mutex_exit(&pmp->pmp_sopmtx); + break; + } case PUFFSOP_SUSPEND: DPRINTF(("dispatch: suspend\n")); puffsop_suspend(pmp); @@ -978,6 +996,60 @@ return 0; } + +/* + * Work loop for thread processing all ops from server which + * cannot safely be handled in caller context. This includes + * everything which might need a lock currently "held" by the file + * server, i.e. a long-term kernel lock which will be released only + * once the file server acknowledges a request + */ +void +puffs_sop_thread(void *arg) +{ + struct puffs_mount *pmp = arg; + struct puffs_sopreq *psopr; + struct puffs_req *preq; + bool keeprunning = true; + + mutex_enter(&pmp->pmp_sopmtx); + while (keeprunning) { + while ((psopr = TAILQ_FIRST(&pmp->pmp_sopreqs)) == NULL) + cv_wait(&pmp->pmp_sopcv, &pmp->pmp_sopmtx); + TAILQ_REMOVE(&pmp->pmp_sopreqs, psopr, psopr_entries); + mutex_exit(&pmp->pmp_sopmtx); + + preq = &psopr->psopr_preq; + switch (psopr->psopr_sopreq) { + case PUFFS_SOPREQ_EXIT: + keeprunning = false; + break; + case PUFFS_SOPREQ_FLUSH: + puffsop_flush(pmp, (struct puffs_flush *)preq); + break; + } + + kmem_free(psopr, sizeof(*psopr)); + mutex_enter(&pmp->pmp_sopmtx); + } + + /* + * Purge remaining ops. could send error, but that is highly + * unlikely to reach the caller. + */ + while ((psopr = TAILQ_FIRST(&pmp->pmp_sopreqs)) != NULL) { + TAILQ_REMOVE(&pmp->pmp_sopreqs, psopr, psopr_entries); + mutex_exit(&pmp->pmp_sopmtx); + kmem_free(psopr, sizeof(*psopr)); + mutex_enter(&pmp->pmp_sopmtx); + } + + pmp->pmp_sopthrcount--; + cv_signal(&pmp->pmp_sopcv); + mutex_exit(&pmp->pmp
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: snj Date: Fri Dec 18 05:58:26 UTC 2009 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_vnops.c Log Message: Pull up following revision(s) (requested by pooka in ticket #1184): sys/fs/puffs/puffs_vnops.c: revision 1.141 via patch Push all information cached in the vnode to the file server before issuing INACTIVE. PR kern/42194. Also, send setattr in fsync asynchronously if FSYNC_WAIT is not set. To generate a diff of this commit: cvs rdiff -u -r1.129.4.5 -r1.129.4.6 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.5 src/sys/fs/puffs/puffs_vnops.c:1.129.4.6 --- src/sys/fs/puffs/puffs_vnops.c:1.129.4.5 Sat Nov 28 16:00:16 2009 +++ src/sys/fs/puffs/puffs_vnops.c Fri Dec 18 05:58:26 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.129.4.5 2009/11/28 16:00:16 bouyer Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.5 2009/11/28 16:00:16 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $"); #include #include @@ -402,6 +402,8 @@ struct componentname *); static void callinactive(struct puffs_mount *, puffs_cookie_t, int); static void callreclaim(struct puffs_mount *, puffs_cookie_t); +static int flushvncache(struct vnode *, off_t, off_t, bool); + #define PUFFS_ABORT_LOOKUP 1 #define PUFFS_ABORT_CREATE 2 @@ -890,13 +892,15 @@ return error; } +#define SETATTR_CHSIZE 0x01 +#define SETATTR_ASYNC 0x02 static int -dosetattr(struct vnode *vp, struct vattr *vap, kauth_cred_t cred, int chsize) +dosetattr(struct vnode *vp, struct vattr *vap, kauth_cred_t cred, int flags) { PUFFS_MSG_VARS(vn, setattr); struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); struct puffs_node *pn = vp->v_data; - int error; + int error = 0; if ((vp->v_mount->mnt_flag & MNT_RDONLY) && (vap->va_uid != (uid_t)VNOVAL || vap->va_gid != (gid_t)VNOVAL @@ -935,16 +939,24 @@ puffs_credcvt(&setattr_msg->pvnr_cred, cred); puffs_msg_setinfo(park_setattr, PUFFSOP_VN, PUFFS_VN_SETATTR, VPTOPNC(vp)); + if (flags & SETATTR_ASYNC) + puffs_msg_setfaf(park_setattr); - PUFFS_MSG_ENQUEUEWAIT2(pmp, park_setattr, vp->v_data, NULL, error); + puffs_msg_enqueue(pmp, park_setattr); + if ((flags & SETATTR_ASYNC) == 0) + error = puffs_msg_wait2(pmp, park_setattr, vp->v_data, NULL); PUFFS_MSG_RELEASE(setattr); - error = checkerr(pmp, error, __func__); - if (error) - return error; + if ((flags & SETATTR_ASYNC) == 0) { + error = checkerr(pmp, error, __func__); + if (error) + return error; + } else { + error = 0; + } if (vap->va_size != VNOVAL) { pn->pn_serversize = vap->va_size; - if (chsize) + if (flags & SETATTR_CHSIZE) uvm_vnp_setsize(vp, vap->va_size); } @@ -961,7 +973,7 @@ kauth_cred_t a_cred; } */ *ap = v; - return dosetattr(ap->a_vp, ap->a_vap, ap->a_cred, 1); + return dosetattr(ap->a_vp, ap->a_vap, ap->a_cred, SETATTR_CHSIZE); } static __inline int @@ -1013,6 +1025,7 @@ pnode = vp->v_data; if (doinact(pmp, pnode->pn_stat & PNODE_DOINACT)) { + flushvncache(vp, 0, 0, false); PUFFS_MSG_ALLOC(vn, inactive); puffs_msg_setinfo(park_inactive, PUFFSOP_VN, PUFFS_VN_INACTIVE, VPTOPNC(vp)); @@ -1273,30 +1286,18 @@ } } -int -puffs_vnop_fsync(void *v) +static int +flushvncache(struct vnode *vp, off_t offlo, off_t offhi, bool wait) { - struct vop_fsync_args /* { - const struct vnodeop_desc *a_desc; - struct vnode *a_vp; - kauth_cred_t a_cred; - int a_flags; - off_t a_offlo; - off_t a_offhi; - } */ *ap = v; - PUFFS_MSG_VARS(vn, fsync); - struct vnode *vp = ap->a_vp; - struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); - struct puffs_node *pn; + struct puffs_node *pn = VPTOPP(vp); struct vattr va; - int pflags, error, dofaf; - - pn = VPTOPP(vp); + int pflags, error; /* flush out information from our metacache, see vop_setattr */ if (pn->pn_stat & PNODE_METACACHE_MASK) { vattr_null(&va); - error = VOP_SETATTR(vp, &va, FSCRED); + error = dosetattr(vp, &va, FSCRED, + SETATTR_CHSIZE | (wait ? 0 : SETATTR_ASYNC)); if (error) return error; } @@ -1305,11 +1306,30 @@ * flush pages to avoid being overly dirty */ pflags = PGO_CLEANIT; - if (ap->a_flags & FSYNC_WAIT) + if (wait) pflags |= PGO_SYNCIO; mutex_enter(&vp->v_interlock); - error = VOP_PUTPAGES(vp, trunc_page(ap->a_offlo), - round_page(ap->a_offhi), pflags); + return VOP_PUTPAGES(vp, trunc_page(offlo), round_page(offhi), pflags); +} + +int +puffs_vnop_fsync(void *v) +{ + struct vop_fsync_args /* { + const struct vnodeop_desc *a_desc; + struct vnode *a_vp; + kau
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: sborrill Date: Mon Dec 14 19:36:57 UTC 2009 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_msgif.h Log Message: Revert previous version bump which should not have been in the supplied patch. This maintains compatibility between 5.0 and 5.1 (at the cost of needing userland libraries recompiled if one's been tracking netbsd-5). To generate a diff of this commit: cvs rdiff -u -r1.65.20.1 -r1.65.20.2 src/sys/fs/puffs/puffs_msgif.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_msgif.h diff -u src/sys/fs/puffs/puffs_msgif.h:1.65.20.1 src/sys/fs/puffs/puffs_msgif.h:1.65.20.2 --- src/sys/fs/puffs/puffs_msgif.h:1.65.20.1 Sun Oct 18 12:46:07 2009 +++ src/sys/fs/puffs/puffs_msgif.h Mon Dec 14 19:36:57 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_msgif.h,v 1.65.20.1 2009/10/18 12:46:07 sborrill Exp $ */ +/* $NetBSD: puffs_msgif.h,v 1.65.20.2 2009/12/14 19:36:57 sborrill Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -102,7 +102,7 @@ #define PUFFS_ERR_MAX PUFFS_ERR_VPTOFH #define PUFFSDEVELVERS 0x8000 -#define PUFFSVERSION 28 +#define PUFFSVERSION 26 #define PUFFSNAMESIZE 32 #define PUFFS_TYPEPREFIX "puffs|"
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: bouyer Date: Sat Nov 28 16:00:17 UTC 2009 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_vnops.c Log Message: Pull up following revision(s) (requested by pooka in ticket #1154): sys/fs/puffs/puffs_vnops.c: revision 1.140 Send VOP_ABORTOP() in case attempting cross-dev rename, part of PR kern/42210. Also, fix a memory management error in said case. To generate a diff of this commit: cvs rdiff -u -r1.129.4.4 -r1.129.4.5 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.4 src/sys/fs/puffs/puffs_vnops.c:1.129.4.5 --- src/sys/fs/puffs/puffs_vnops.c:1.129.4.4 Sat Nov 28 15:56:08 2009 +++ src/sys/fs/puffs/puffs_vnops.c Sat Nov 28 16:00:16 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.129.4.4 2009/11/28 15:56:08 bouyer Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.129.4.5 2009/11/28 16:00:16 bouyer Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.4 2009/11/28 15:56:08 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.5 2009/11/28 16:00:16 bouyer Exp $"); #include #include @@ -1711,19 +1711,23 @@ struct componentname *a_tcnp; } */ *ap = v; PUFFS_MSG_VARS(vn, rename); - struct vnode *fdvp = ap->a_fdvp; + struct vnode *fdvp = ap->a_fdvp, *fvp = ap->a_fvp; + struct vnode *tdvp = ap->a_tdvp, *tvp = ap->a_tvp; struct puffs_node *fpn = ap->a_fvp->v_data; struct puffs_mount *pmp = MPTOPUFFSMP(fdvp->v_mount); int error; + bool doabort = true; - if (ap->a_fvp->v_mount != ap->a_tdvp->v_mount) + if ((fvp->v_mount != tdvp->v_mount) || + (tvp && (fvp->v_mount != tvp->v_mount))) { ERROUT(EXDEV); + } PUFFS_MSG_ALLOC(vn, rename); - rename_msg->pvnr_cookie_src = VPTOPNC(ap->a_fvp); - rename_msg->pvnr_cookie_targdir = VPTOPNC(ap->a_tdvp); - if (ap->a_tvp) - rename_msg->pvnr_cookie_targ = VPTOPNC(ap->a_tvp); + rename_msg->pvnr_cookie_src = VPTOPNC(fvp); + rename_msg->pvnr_cookie_targdir = VPTOPNC(tdvp); + if (tvp) + rename_msg->pvnr_cookie_targ = VPTOPNC(tvp); else rename_msg->pvnr_cookie_targ = NULL; puffs_makecn(&rename_msg->pvnr_cn_src, &rename_msg->pvnr_cn_src_cred, @@ -1734,6 +1738,8 @@ PUFFS_VN_RENAME, VPTOPNC(fdvp)); PUFFS_MSG_ENQUEUEWAIT2(pmp, park_rename, fdvp->v_data, NULL, error); + doabort = false; + PUFFS_MSG_RELEASE(rename); error = checkerr(pmp, error, __func__); /* @@ -1744,16 +1750,19 @@ puffs_updatenode(fpn, PUFFS_UPDATECTIME, 0); out: - PUFFS_MSG_RELEASE(rename); - if (ap->a_tvp != NULL) - vput(ap->a_tvp); - if (ap->a_tdvp == ap->a_tvp) - vrele(ap->a_tdvp); + if (doabort) + VOP_ABORTOP(tdvp, ap->a_tcnp); + if (tvp != NULL) + vput(tvp); + if (tdvp == tvp) + vrele(tdvp); else - vput(ap->a_tdvp); + vput(tdvp); - vrele(ap->a_fdvp); - vrele(ap->a_fvp); + if (doabort) + VOP_ABORTOP(fdvp, ap->a_fcnp); + vrele(fdvp); + vrele(fvp); return error; }
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: bouyer Date: Sat Nov 28 15:56:08 UTC 2009 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_vnops.c Log Message: Pull up following revision(s) (requested by pooka in ticket #1153): sys/fs/puffs/puffs_vnops.c: revision 1.139 Send VOP_ABORTOP() as a FAF -- we don't care about the return value. To generate a diff of this commit: cvs rdiff -u -r1.129.4.3 -r1.129.4.4 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.3 src/sys/fs/puffs/puffs_vnops.c:1.129.4.4 --- src/sys/fs/puffs/puffs_vnops.c:1.129.4.3 Sun Oct 18 12:46:07 2009 +++ src/sys/fs/puffs/puffs_vnops.c Sat Nov 28 15:56:08 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.129.4.3 2009/10/18 12:46:07 sborrill Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.129.4.4 2009/11/28 15:56:08 bouyer Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.3 2009/10/18 12:46:07 sborrill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.4 2009/11/28 15:56:08 bouyer Exp $"); #include #include @@ -2126,16 +2126,16 @@ struct vnode *dvp = ap->a_dvp; struct puffs_mount *pmp = MPTOPUFFSMP(dvp->v_mount); struct componentname *cnp = ap->a_cnp; - int error; if (EXISTSOP(pmp, ABORTOP)) { PUFFS_MSG_ALLOC(vn, abortop); puffs_makecn(&abortop_msg->pvnr_cn, &abortop_msg->pvnr_cn_cred, cnp, PUFFS_USE_FULLPNBUF(pmp)); + puffs_msg_setfaf(park_abortop); puffs_msg_setinfo(park_abortop, PUFFSOP_VN, PUFFS_VN_ABORTOP, VPTOPNC(dvp)); - PUFFS_MSG_ENQUEUEWAIT(pmp, park_abortop, error); + puffs_msg_enqueue(pmp, park_abortop); PUFFS_MSG_RELEASE(abortop); }
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: snj Date: Sat Oct 3 23:11:27 UTC 2009 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_node.c puffs_vnops.c Log Message: Pull up following revision(s) (requested by pooka in ticket #1042): sys/fs/puffs/puffs_node.c: revision 1.14 sys/fs/puffs/puffs_vnops.c: revision 1.134 * fix a race i introduced almost two years ago in rev 1.116: operations creating a node cannot be considered outgoing operations, since after return from userspace they modify file system state by creating a new node. if we do not protect the file system by holding the directory lock, a lookup operation might race us into the kernel and create the node earlier. * remove pnode from hashlish before sending the reclaim faf off to userspace. also, hold pmp_lock while frobbing the list. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.13.10.1 src/sys/fs/puffs/puffs_node.c cvs rdiff -u -r1.129.4.1 -r1.129.4.2 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_node.c diff -u src/sys/fs/puffs/puffs_node.c:1.13 src/sys/fs/puffs/puffs_node.c:1.13.10.1 --- src/sys/fs/puffs/puffs_node.c:1.13 Tue May 6 12:33:16 2008 +++ src/sys/fs/puffs/puffs_node.c Sat Oct 3 23:11:27 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_node.c,v 1.13 2008/05/06 12:33:16 ad Exp $ */ +/* $NetBSD: puffs_node.c,v 1.13.10.1 2009/10/03 23:11:27 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13 2008/05/06 12:33:16 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.1 2009/10/03 23:11:27 snj Exp $"); #include #include @@ -223,7 +223,7 @@ if (pnc->pnc_cookie == ck) { mutex_exit(&pmp->pmp_lock); puffs_senderr(pmp, PUFFS_ERR_MAKENODE, EEXIST, - "cookie exists", ck); + "newcookie exists", ck); return EPROTO; } } @@ -260,7 +260,6 @@ panic("puffs_putvnode: %p not a puffs vnode", vp); #endif - LIST_REMOVE(pnode, pn_hashent); genfs_node_destroy(vp); puffs_releasenode(pnode); vp->v_data = NULL; @@ -336,6 +335,9 @@ */ mutex_enter(&pmp->pmp_lock); if (pmp->pmp_root) { + struct puffs_node *pnode = vp->v_data; + + LIST_REMOVE(pnode, pn_hashent); mutex_exit(&pmp->pmp_lock); puffs_putvnode(vp); goto retry; Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.1 src/sys/fs/puffs/puffs_vnops.c:1.129.4.2 --- src/sys/fs/puffs/puffs_vnops.c:1.129.4.1 Sat Sep 26 18:53:48 2009 +++ src/sys/fs/puffs/puffs_vnops.c Sat Oct 3 23:11:27 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.129.4.1 2009/09/26 18:53:48 snj Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.129.4.2 2009/10/03 23:11:27 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.1 2009/09/26 18:53:48 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.2 2009/10/03 23:11:27 snj Exp $"); #include #include @@ -644,16 +644,7 @@ create_msg->pvnr_va = *ap->a_vap; puffs_msg_setinfo(park_create, PUFFSOP_VN, PUFFS_VN_CREATE, VPTOPNC(dvp)); - - /* - * Do the dance: - * + insert into queue ("interlock") - * + unlock vnode - * + wait for response - */ - puffs_msg_enqueue(pmp, park_create); - REFPN_AND_UNLOCKVP(dvp, dpn); - error = puffs_msg_wait2(pmp, park_create, dpn, NULL); + PUFFS_MSG_ENQUEUEWAIT2(pmp, park_create, dvp->v_data, NULL, error); error = checkerr(pmp, error, __func__); if (error) @@ -666,10 +657,10 @@ create_msg->pvnr_newnode, cnp); out: + vput(dvp); if (error || (cnp->cn_flags & SAVESTART) == 0) PNBUF_PUT(cnp->cn_pnbuf); - RELEPN_AND_VP(dvp, dpn); DPRINTF(("puffs_create: return %d\n", error)); PUFFS_MSG_RELEASE(create); return error; @@ -700,9 +691,7 @@ puffs_msg_setinfo(park_mknod, PUFFSOP_VN, PUFFS_VN_MKNOD, VPTOPNC(dvp)); - puffs_msg_enqueue(pmp, park_mknod); - REFPN_AND_UNLOCKVP(dvp, dpn); - error = puffs_msg_wait2(pmp, park_mknod, dpn, NULL); + PUFFS_MSG_ENQUEUEWAIT2(pmp, park_mknod, dvp->v_data, NULL, error); error = checkerr(pmp, error, __func__); if (error) @@ -716,10 +705,10 @@ mknod_msg->pvnr_newnode, cnp); out: + vput(dvp); PUFFS_MSG_RELEASE(mknod); if (error || (cnp->cn_flags & SAVESTART) == 0) PNBUF_PUT(cnp->cn_pnbuf); - RELEPN_AND_VP(dvp, dpn); return error; } @@ -1073,6 +1062,8 @@ } */ *ap = v; struct vnode *vp = ap->a_vp; struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount); + struct puffs_node *pnode = vp->v_data; + bool notifyserver = true; /* * first things first: check if someone is trying to reclaim the @@ -1085,14 +1076,23 @@ KASSERT(pmp->pmp_root != NULL); pmp->pmp_root = NULL; mutex_exit(&pmp->pmp_lock); - goto
CVS commit: [netbsd-5] src/sys/fs/puffs
Module Name:src Committed By: snj Date: Sat Sep 26 18:53:48 UTC 2009 Modified Files: src/sys/fs/puffs [netbsd-5]: puffs_vnops.c Log Message: Pull up following revision(s) (requested by pooka in ticket #1014): sys/fs/puffs/puffs_vnops.c: revision 1.133 Set SAVENAME for rmdir and remove. Addresses an easy part of PR kern/38188 To generate a diff of this commit: cvs rdiff -u -r1.129 -r1.129.4.1 src/sys/fs/puffs/puffs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/fs/puffs/puffs_vnops.c diff -u src/sys/fs/puffs/puffs_vnops.c:1.129 src/sys/fs/puffs/puffs_vnops.c:1.129.4.1 --- src/sys/fs/puffs/puffs_vnops.c:1.129 Wed Sep 10 19:25:33 2008 +++ src/sys/fs/puffs/puffs_vnops.c Sat Sep 26 18:53:48 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: puffs_vnops.c,v 1.129 2008/09/10 19:25:33 christos Exp $ */ +/* $NetBSD: puffs_vnops.c,v 1.129.4.1 2009/09/26 18:53:48 snj Exp $ */ /* * Copyright (c) 2005, 2006, 2007 Antti Kantee. All Rights Reserved. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129 2008/09/10 19:25:33 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.1 2009/09/26 18:53:48 snj Exp $"); #include #include @@ -580,6 +580,13 @@ cnp->cn_consume = MIN(lookup_msg->pvnr_cn.pkcn_consume, strlen(cnp->cn_nameptr) - cnp->cn_namelen); + /* + * We need the name in remove and rmdir (well, rename too, but + * SAVESTART takes care of that) + */ + if (cnp->cn_nameiop == DELETE) + cnp->cn_flags |= SAVENAME; + out: if (cnp->cn_flags & ISDOTDOT) vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY); @@ -1438,6 +1445,8 @@ RELEPN_AND_VP(vp, pn); error = checkerr(pmp, error, __func__); + if (error || (cnp->cn_flags & SAVESTART) == 0) + PNBUF_PUT(cnp->cn_pnbuf); return error; } @@ -1543,6 +1552,9 @@ RELEPN_AND_VP(dvp, dpn); RELEPN_AND_VP(vp, pn); + if (error || (cnp->cn_flags & SAVESTART) == 0) + PNBUF_PUT(cnp->cn_pnbuf); + return error; }