I'm going to protect `f_count' with a global lock soon. That implies
that multiple FREF(9)s will be inlined. So here's a diff moving the
vfs_stall hack to a proper function. This will help when looking for
history and it reduces my upcoming locking diff.
Better name? Ok?
Index: kern/vfs_subr.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_subr.c,v
retrieving revision 1.269
diff -u -p -r1.269 vfs_subr.c
--- kern/vfs_subr.c 2 May 2018 02:24:56 -0000 1.269
+++ kern/vfs_subr.c 7 May 2018 16:07:11 -0000
@@ -1627,6 +1627,13 @@ vfs_stall(struct proc *p, int stall)
return (allerror);
}
+void
+vfs_stall_barrier(void)
+{
+ rw_enter_read(&vfs_stall_lock);
+ rw_exit_read(&vfs_stall_lock);
+}
+
/*
* Unmount all file systems.
* We traverse the list in reverse order under the assumption that doing so
Index: sys/file.h
===================================================================
RCS file: /cvs/src/sys/sys/file.h,v
retrieving revision 1.41
diff -u -p -r1.41 file.h
--- sys/file.h 25 Apr 2018 10:29:16 -0000 1.41
+++ sys/file.h 7 May 2018 16:08:31 -0000
@@ -37,6 +37,7 @@
#else /* _KERNEL */
#include <sys/queue.h>
+#include <sys/mount.h> /* vfs_stall_barrier() */
struct proc;
struct uio;
@@ -91,9 +92,7 @@ struct file {
#define FREF(fp) \
do { \
- extern struct rwlock vfs_stall_lock; \
- rw_enter_read(&vfs_stall_lock); \
- rw_exit_read(&vfs_stall_lock); \
+ vfs_stall_barrier(); \
(fp)->f_count++; \
} while (0)
#define FRELE(fp,p) (--(fp)->f_count == 0 ? fdrop(fp, p) : 0)
Index: sys/mount.h
===================================================================
RCS file: /cvs/src/sys/sys/mount.h,v
retrieving revision 1.135
diff -u -p -r1.135 mount.h
--- sys/mount.h 10 Feb 2018 05:24:23 -0000 1.135
+++ sys/mount.h 7 May 2018 16:07:11 -0000
@@ -575,6 +575,7 @@ int vfs_rootmountalloc(char *, char *, s
void vfs_unbusy(struct mount *);
extern TAILQ_HEAD(mntlist, mount) mountlist;
int vfs_stall(struct proc *, int);
+void vfs_stall_barrier(void);
struct mount *getvfs(fsid_t *); /* return vfs given fsid */
/* process mount export info */