Module Name: src
Committed By: pooka
Date: Wed Feb 17 14:32:08 UTC 2010
Modified Files:
src/sys/fs/puffs: puffs_vfsops.c
Log Message:
* add a rant about why MPSAFE isn't enabled even though puffs code is
* predict_false that we are mounting when calling statvfs
* KNF
To generate a diff of this commit:
cvs rdiff -u -r1.86 -r1.87 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_vfsops.c
diff -u src/sys/fs/puffs/puffs_vfsops.c:1.86 src/sys/fs/puffs/puffs_vfsops.c:1.87
--- src/sys/fs/puffs/puffs_vfsops.c:1.86 Thu Jan 14 19:50:07 2010
+++ src/sys/fs/puffs/puffs_vfsops.c Wed Feb 17 14:32:08 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: puffs_vfsops.c,v 1.86 2010/01/14 19:50:07 pooka Exp $ */
+/* $NetBSD: puffs_vfsops.c,v 1.87 2010/02/17 14:32:08 pooka Exp $ */
/*
* Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.86 2010/01/14 19:50:07 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.87 2010/02/17 14:32:08 pooka Exp $");
#include <sys/param.h>
#include <sys/mount.h>
@@ -222,13 +222,39 @@
mp->mnt_flag &= ~MNT_LOCAL; /* we don't really know, so ... */
mp->mnt_data = pmp;
+#if 0
+ /*
+ * XXX: puffs code is MPSAFE. However, VFS really isn't.
+ * Currently, there is nothing which protects an inode from
+ * reclaim while there are threads inside the file system.
+ * This means that in the event of a server crash, an MPSAFE
+ * mount is likely to end up accessing invalid memory. For the
+ * non-mpsafe case, the kernel lock, general structure of
+ * puffs and pmp_refcount protect the threads during escape.
+ *
+ * Fixing this will require:
+ * a) fixing vfs
+ * OR
+ * b) adding a small sleep to puffs_msgif_close() between
+ * userdead() and dounmount().
+ * (well, this isn't really a fix, but would solve
+ * 99.999% of the race conditions).
+ *
+ * Also, in the event of "b", unmount -f should be used,
+ * like with any other file system, sparingly and only when
+ * it is "known" to be safe.
+ */
+ mp->mnt_iflags |= IMNT_MPSAFE;
+#endif
+
pmp->pmp_status = PUFFSTAT_MOUNTING;
pmp->pmp_mp = mp;
pmp->pmp_msg_maxsize = args->pa_maxmsglen;
pmp->pmp_args = *args;
pmp->pmp_npnodehash = args->pa_nhashbuckets;
- pmp->pmp_pnodehash = kmem_alloc(BUCKETALLOC(pmp->pmp_npnodehash), KM_SLEEP);
+ pmp->pmp_pnodehash = kmem_alloc(BUCKETALLOC(pmp->pmp_npnodehash),
+ KM_SLEEP);
for (i = 0; i < pmp->pmp_npnodehash; i++)
LIST_INIT(&pmp->pmp_pnodehash[i]);
LIST_INIT(&pmp->pmp_newcookie);
@@ -435,7 +461,7 @@
* requesting statvfs from userspace would mean a deadlock.
* Compensate.
*/
- if (pmp->pmp_status == PUFFSTAT_MOUNTING)
+ if (__predict_false(pmp->pmp_status == PUFFSTAT_MOUNTING))
return EINPROGRESS;
PUFFS_MSG_ALLOC(vfs, statvfs);