Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F171556835
D21371.id61357.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D21371.id61357.diff
View Options
Index: sys/fs/nullfs/null_vnops.c
===================================================================
--- sys/fs/nullfs/null_vnops.c
+++ sys/fs/nullfs/null_vnops.c
@@ -907,6 +907,7 @@
.vop_getattr = null_getattr,
.vop_getwritemount = null_getwritemount,
.vop_inactive = null_inactive,
+ .vop_need_inactive = vop_stdneed_inactive,
.vop_islocked = vop_stdislocked,
.vop_lock1 = null_lock,
.vop_lookup = null_lookup,
Index: sys/fs/tmpfs/tmpfs_vnops.c
===================================================================
--- sys/fs/tmpfs/tmpfs_vnops.c
+++ sys/fs/tmpfs/tmpfs_vnops.c
@@ -1283,6 +1283,27 @@
return (0);
}
+static int
+tmpfs_need_inactive(struct vop_need_inactive_args *ap)
+{
+ struct vnode *vp;
+ struct tmpfs_node *node;
+ struct vm_object *obj;
+
+ vp = ap->a_vp;
+ node = VP_TO_TMPFS_NODE(vp);
+ if (node->tn_links == 0)
+ goto need;
+ if (vp->v_type == VREG) {
+ obj = vp->v_object;
+ if ((obj->flags & OBJ_TMPFS_DIRTY) != 0)
+ goto need;
+ }
+ return (0);
+need:
+ return (1);
+}
+
int
tmpfs_reclaim(struct vop_reclaim_args *v)
{
@@ -1584,6 +1605,7 @@
.vop_readdir = tmpfs_readdir,
.vop_readlink = tmpfs_readlink,
.vop_inactive = tmpfs_inactive,
+ .vop_need_inactive = tmpfs_need_inactive,
.vop_reclaim = tmpfs_reclaim,
.vop_print = tmpfs_print,
.vop_pathconf = tmpfs_pathconf,
Index: sys/fs/unionfs/union_vnops.c
===================================================================
--- sys/fs/unionfs/union_vnops.c
+++ sys/fs/unionfs/union_vnops.c
@@ -2556,6 +2556,7 @@
.vop_getextattr = unionfs_getextattr,
.vop_getwritemount = unionfs_getwritemount,
.vop_inactive = unionfs_inactive,
+ .vop_need_inactive = vop_stdneed_inactive,
.vop_islocked = unionfs_islocked,
.vop_ioctl = unionfs_ioctl,
.vop_link = unionfs_link,
Index: sys/kern/vfs_default.c
===================================================================
--- sys/kern/vfs_default.c
+++ sys/kern/vfs_default.c
@@ -120,6 +120,7 @@
.vop_getpages_async = vop_stdgetpages_async,
.vop_getwritemount = vop_stdgetwritemount,
.vop_inactive = VOP_NULL,
+ .vop_need_inactive = vop_stdneed_inactive,
.vop_ioctl = vop_stdioctl,
.vop_kqfilter = vop_stdkqfilter,
.vop_islocked = vop_stdislocked,
@@ -1157,6 +1158,13 @@
return (error);
}
+int
+vop_stdneed_inactive(struct vop_need_inactive_args *ap)
+{
+
+ return (1);
+}
+
static int
vop_stdioctl(struct vop_ioctl_args *ap)
{
Index: sys/kern/vfs_subr.c
===================================================================
--- sys/kern/vfs_subr.c
+++ sys/kern/vfs_subr.c
@@ -2888,6 +2888,13 @@
CTR2(KTR_VFS, "%s: return vnode %p to the freelist", __func__, vp);
+ if (VOP_NEED_INACTIVE(vp) == 0) {
+ if (func == VPUTX_VPUT)
+ VOP_UNLOCK(vp, 0);
+ vdropl(vp);
+ return;
+ }
+
/*
* We must call VOP_INACTIVE with the node locked. Mark
* as VI_DOINGINACT to avoid recursion.
@@ -4351,6 +4358,7 @@
.vop_close = sync_close, /* close */
.vop_fsync = sync_fsync, /* fsync */
.vop_inactive = sync_inactive, /* inactive */
+ .vop_need_inactive = vop_stdneed_inactive, /* need_inactive */
.vop_reclaim = sync_reclaim, /* reclaim */
.vop_lock1 = vop_stdlock, /* lock */
.vop_unlock = vop_stdunlock, /* unlock */
@@ -4512,6 +4520,20 @@
return (0);
}
+int
+vn_need_pageq_flush(struct vnode *vp)
+{
+ struct vm_object *obj;
+ int need;
+
+ MPASS(mtx_owned(VI_MTX(vp)));
+ need = 0;
+ if ((obj = vp->v_object) != NULL && (vp->v_vflag & VV_NOSYNC) == 0 &&
+ (obj->flags & OBJ_MIGHTBEDIRTY) != 0)
+ need = 1;
+ return (need);
+}
+
/*
* Check if vnode represents a disk device
*/
@@ -4892,6 +4914,22 @@
if (a->a_flags & LK_INTERLOCK)
ASSERT_VI_UNLOCKED(a->a_vp, "VOP_UNLOCK");
}
+
+void
+vop_need_inactive_pre(void *ap)
+{
+ struct vop_need_inactive_args *a = ap;
+
+ ASSERT_VI_LOCKED(a->a_vp, "VOP_NEED_INACTIVE");
+}
+
+void
+vop_need_inactive_post(void *ap, int rc)
+{
+ struct vop_need_inactive_args *a = ap;
+
+ ASSERT_VI_LOCKED(a->a_vp, "VOP_NEED_INACTIVE");
+}
#endif
void
Index: sys/kern/vnode_if.src
===================================================================
--- sys/kern/vnode_if.src
+++ sys/kern/vnode_if.src
@@ -358,6 +358,12 @@
IN struct thread *td;
};
+%! need_inactive pre vop_need_inactive_pre
+%! need_inactive post vop_need_inactive_post
+
+vop_need_inactive {
+ IN struct vnode *vp;
+};
%% reclaim vp E E E
%! reclaim post vop_reclaim_post
Index: sys/sys/vnode.h
===================================================================
--- sys/sys/vnode.h
+++ sys/sys/vnode.h
@@ -682,6 +682,7 @@
struct vnode *outvp, off_t *outoffp, size_t *lenp,
unsigned int flags, struct ucred *incred, struct ucred *outcred,
struct thread *fsize_td);
+int vn_need_pageq_flush(struct vnode *vp);
int vn_isdisk(struct vnode *vp, int *errp);
int _vn_lock(struct vnode *vp, int flags, char *file, int line);
#define vn_lock(vp, flags) _vn_lock(vp, flags, __FILE__, __LINE__)
@@ -753,6 +754,7 @@
int vop_stdgetwritemount(struct vop_getwritemount_args *);
int vop_stdgetpages(struct vop_getpages_args *);
int vop_stdinactive(struct vop_inactive_args *);
+int vop_stdneed_inactive(struct vop_need_inactive_args *);
int vop_stdislocked(struct vop_islocked_args *);
int vop_stdkqfilter(struct vop_kqfilter_args *);
int vop_stdlock(struct vop_lock1_args *);
@@ -813,12 +815,16 @@
void vop_lock_post(void *a, int rc);
void vop_unlock_pre(void *a);
void vop_unlock_post(void *a, int rc);
+void vop_need_inactive_pre(void *a);
+void vop_need_inactive_post(void *a, int rc);
#else
#define vop_strategy_pre(x) do { } while (0)
#define vop_lock_pre(x) do { } while (0)
#define vop_lock_post(x, y) do { } while (0)
#define vop_unlock_pre(x) do { } while (0)
#define vop_unlock_post(x, y) do { } while (0)
+#define vop_need_inactive_pre(x) do { } while (0)
+#define vop_need_inactive_post(x, y) do { } while (0)
#endif
void vop_rename_fail(struct vop_rename_args *ap);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Sep 12, 6:08 PM (9 h, 13 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
38728803
Default Alt Text
D21371.id61357.diff (5 KB)
Attached To
Mode
D21371: vfs: add VOP_NEED_INACTIVE
Attached
Detach File
Event Timeline
Log In to Comment