mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 09:41:03 -04:00
vfs: Add event notification points
The INOTIFY macro and its variants check if the vnode is being watched, and if so, calls into a slow path which adds an event to one or more inotify descriptors. Most of these events correspond to EVFILT_VNODE events as well, and are added to VOP *_post hooks. Reviewed by: kib MFC after: 3 months Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D50315
This commit is contained in:
parent
cf65b5e43d
commit
bc4430dc20
5 changed files with 94 additions and 15 deletions
|
|
@ -27,12 +27,12 @@
|
|||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include "opt_kern_tls.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/capsicum.h>
|
||||
#include <sys/inotify.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/ktls.h>
|
||||
|
|
@ -1246,6 +1246,8 @@ out:
|
|||
*/
|
||||
if (error == 0) {
|
||||
td->td_retval[0] = 0;
|
||||
if (sbytes > 0 && vp != NULL)
|
||||
INOTIFY(vp, IN_ACCESS);
|
||||
}
|
||||
if (sent != NULL) {
|
||||
(*sent) = sbytes;
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@
|
|||
#include <sys/extattr.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/inotify.h>
|
||||
#include <sys/jail.h>
|
||||
#include <sys/kdb.h>
|
||||
#include <sys/kernel.h>
|
||||
|
|
@ -6057,6 +6058,28 @@ vop_need_inactive_debugpost(void *ap, int rc)
|
|||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
vop_allocate_post(void *ap, int rc)
|
||||
{
|
||||
struct vop_allocate_args *a;
|
||||
|
||||
a = ap;
|
||||
if (rc == 0)
|
||||
INOTIFY(a->a_vp, IN_MODIFY);
|
||||
}
|
||||
|
||||
void
|
||||
vop_copy_file_range_post(void *ap, int rc)
|
||||
{
|
||||
struct vop_copy_file_range_args *a;
|
||||
|
||||
a = ap;
|
||||
if (rc == 0) {
|
||||
INOTIFY(a->a_invp, IN_ACCESS);
|
||||
INOTIFY(a->a_outvp, IN_MODIFY);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
vop_create_pre(void *ap)
|
||||
{
|
||||
|
|
@ -6077,8 +6100,20 @@ vop_create_post(void *ap, int rc)
|
|||
a = ap;
|
||||
dvp = a->a_dvp;
|
||||
vn_seqc_write_end(dvp);
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(dvp, NOTE_WRITE);
|
||||
INOTIFY_NAME(*a->a_vpp, dvp, a->a_cnp, IN_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
vop_deallocate_post(void *ap, int rc)
|
||||
{
|
||||
struct vop_deallocate_args *a;
|
||||
|
||||
a = ap;
|
||||
if (rc == 0)
|
||||
INOTIFY(a->a_vp, IN_MODIFY);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6123,8 +6158,10 @@ vop_deleteextattr_post(void *ap, int rc)
|
|||
a = ap;
|
||||
vp = a->a_vp;
|
||||
vn_seqc_write_end(vp);
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(a->a_vp, NOTE_ATTRIB);
|
||||
INOTIFY(vp, IN_ATTRIB);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6154,6 +6191,8 @@ vop_link_post(void *ap, int rc)
|
|||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(vp, NOTE_LINK);
|
||||
VFS_KNOTE_LOCKED(tdvp, NOTE_WRITE);
|
||||
INOTIFY_NAME(vp, tdvp, a->a_cnp, _IN_ATTRIB_LINKCOUNT);
|
||||
INOTIFY_NAME(vp, tdvp, a->a_cnp, IN_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6177,8 +6216,10 @@ vop_mkdir_post(void *ap, int rc)
|
|||
a = ap;
|
||||
dvp = a->a_dvp;
|
||||
vn_seqc_write_end(dvp);
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(dvp, NOTE_WRITE | NOTE_LINK);
|
||||
INOTIFY_NAME(*a->a_vpp, dvp, a->a_cnp, IN_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DEBUG_VFS_LOCKS
|
||||
|
|
@ -6213,8 +6254,10 @@ vop_mknod_post(void *ap, int rc)
|
|||
a = ap;
|
||||
dvp = a->a_dvp;
|
||||
vn_seqc_write_end(dvp);
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(dvp, NOTE_WRITE);
|
||||
INOTIFY_NAME(*a->a_vpp, dvp, a->a_cnp, IN_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6226,8 +6269,10 @@ vop_reclaim_post(void *ap, int rc)
|
|||
a = ap;
|
||||
vp = a->a_vp;
|
||||
ASSERT_VOP_IN_SEQC(vp);
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(vp, NOTE_REVOKE);
|
||||
INOTIFY_REVOKE(vp);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6258,6 +6303,8 @@ vop_remove_post(void *ap, int rc)
|
|||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(dvp, NOTE_WRITE);
|
||||
VFS_KNOTE_LOCKED(vp, NOTE_DELETE);
|
||||
INOTIFY_NAME(vp, dvp, a->a_cnp, _IN_ATTRIB_LINKCOUNT);
|
||||
INOTIFY_NAME(vp, dvp, a->a_cnp, IN_DELETE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6289,6 +6336,8 @@ vop_rename_post(void *ap, int rc)
|
|||
VFS_KNOTE_UNLOCKED(a->a_fvp, NOTE_RENAME);
|
||||
if (a->a_tvp)
|
||||
VFS_KNOTE_UNLOCKED(a->a_tvp, NOTE_DELETE);
|
||||
INOTIFY_MOVE(a->a_fvp, a->a_fdvp, a->a_fcnp, a->a_tvp,
|
||||
a->a_tdvp, a->a_tcnp);
|
||||
}
|
||||
if (a->a_tdvp != a->a_fdvp)
|
||||
vdrop(a->a_fdvp);
|
||||
|
|
@ -6328,6 +6377,7 @@ vop_rmdir_post(void *ap, int rc)
|
|||
vp->v_vflag |= VV_UNLINKED;
|
||||
VFS_KNOTE_LOCKED(dvp, NOTE_WRITE | NOTE_LINK);
|
||||
VFS_KNOTE_LOCKED(vp, NOTE_DELETE);
|
||||
INOTIFY_NAME(vp, dvp, a->a_cnp, IN_DELETE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6351,8 +6401,10 @@ vop_setattr_post(void *ap, int rc)
|
|||
a = ap;
|
||||
vp = a->a_vp;
|
||||
vn_seqc_write_end(vp);
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(vp, NOTE_ATTRIB);
|
||||
INOTIFY(vp, IN_ATTRIB);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6397,8 +6449,10 @@ vop_setextattr_post(void *ap, int rc)
|
|||
a = ap;
|
||||
vp = a->a_vp;
|
||||
vn_seqc_write_end(vp);
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(vp, NOTE_ATTRIB);
|
||||
INOTIFY(vp, IN_ATTRIB);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6421,8 +6475,10 @@ vop_symlink_post(void *ap, int rc)
|
|||
a = ap;
|
||||
dvp = a->a_dvp;
|
||||
vn_seqc_write_end(dvp);
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(dvp, NOTE_WRITE);
|
||||
INOTIFY_NAME(*a->a_vpp, dvp, a->a_cnp, IN_CREATE);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6430,8 +6486,10 @@ vop_open_post(void *ap, int rc)
|
|||
{
|
||||
struct vop_open_args *a = ap;
|
||||
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(a->a_vp, NOTE_OPEN);
|
||||
INOTIFY(a->a_vp, IN_OPEN);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6443,6 +6501,8 @@ vop_close_post(void *ap, int rc)
|
|||
!VN_IS_DOOMED(a->a_vp))) {
|
||||
VFS_KNOTE_LOCKED(a->a_vp, (a->a_fflag & FWRITE) != 0 ?
|
||||
NOTE_CLOSE_WRITE : NOTE_CLOSE);
|
||||
INOTIFY(a->a_vp, (a->a_fflag & FWRITE) != 0 ?
|
||||
IN_CLOSE_WRITE : IN_CLOSE_NOWRITE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -6451,8 +6511,10 @@ vop_read_post(void *ap, int rc)
|
|||
{
|
||||
struct vop_read_args *a = ap;
|
||||
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(a->a_vp, NOTE_READ);
|
||||
INOTIFY(a->a_vp, IN_ACCESS);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -6469,8 +6531,10 @@ vop_readdir_post(void *ap, int rc)
|
|||
{
|
||||
struct vop_readdir_args *a = ap;
|
||||
|
||||
if (!rc)
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(a->a_vp, NOTE_READ);
|
||||
INOTIFY(a->a_vp, IN_ACCESS);
|
||||
}
|
||||
}
|
||||
|
||||
static struct knlist fs_knlist;
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
#include <sys/fcntl.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/filio.h>
|
||||
#include <sys/inotify.h>
|
||||
#include <sys/ktr.h>
|
||||
#include <sys/ktrace.h>
|
||||
#include <sys/limits.h>
|
||||
|
|
@ -485,6 +486,7 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred,
|
|||
if (vp->v_type != VFIFO && vp->v_type != VSOCK &&
|
||||
VOP_ACCESS(vp, VREAD, cred, td) == 0)
|
||||
fp->f_flag |= FKQALLOWED;
|
||||
INOTIFY(vp, IN_OPEN);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1747,6 +1749,8 @@ vn_truncate_locked(struct vnode *vp, off_t length, bool sync,
|
|||
vattr.va_vaflags |= VA_SYNC;
|
||||
error = VOP_SETATTR(vp, &vattr, cred);
|
||||
VOP_ADD_WRITECOUNT_CHECKED(vp, -1);
|
||||
if (error == 0)
|
||||
INOTIFY(vp, IN_MODIFY);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -702,6 +702,7 @@ vop_vptocnp {
|
|||
|
||||
|
||||
%% allocate vp E E E
|
||||
%! allocate post vop_allocate_post
|
||||
|
||||
vop_allocate {
|
||||
IN struct vnode *vp;
|
||||
|
|
@ -786,6 +787,7 @@ vop_fdatasync {
|
|||
|
||||
%% copy_file_range invp U U U
|
||||
%% copy_file_range outvp U U U
|
||||
%! copy_file_range post vop_copy_file_range_post
|
||||
|
||||
vop_copy_file_range {
|
||||
IN struct vnode *invp;
|
||||
|
|
@ -810,6 +812,7 @@ vop_vput_pair {
|
|||
|
||||
|
||||
%% deallocate vp L L L
|
||||
%! deallocate post vop_deallocate_post
|
||||
|
||||
vop_deallocate {
|
||||
IN struct vnode *vp;
|
||||
|
|
|
|||
|
|
@ -918,9 +918,12 @@ int dead_read(struct vop_read_args *ap);
|
|||
int dead_write(struct vop_write_args *ap);
|
||||
|
||||
/* These are called from within the actual VOPS. */
|
||||
void vop_allocate_post(void *a, int rc);
|
||||
void vop_copy_file_range_post(void *ap, int rc);
|
||||
void vop_close_post(void *a, int rc);
|
||||
void vop_create_pre(void *a);
|
||||
void vop_create_post(void *a, int rc);
|
||||
void vop_deallocate_post(void *a, int rc);
|
||||
void vop_whiteout_pre(void *a);
|
||||
void vop_whiteout_post(void *a, int rc);
|
||||
void vop_deleteextattr_pre(void *a);
|
||||
|
|
@ -1028,9 +1031,12 @@ void vop_rename_fail(struct vop_rename_args *ap);
|
|||
|
||||
#define VOP_WRITE_POST(ap, ret) \
|
||||
noffset = (ap)->a_uio->uio_offset; \
|
||||
if (noffset > ooffset && !VN_KNLIST_EMPTY((ap)->a_vp)) { \
|
||||
VFS_KNOTE_LOCKED((ap)->a_vp, NOTE_WRITE \
|
||||
| (noffset > osize ? NOTE_EXTEND : 0)); \
|
||||
if (noffset > ooffset) { \
|
||||
if (VN_KNLIST_EMPTY((ap)->a_vp)) { \
|
||||
VFS_KNOTE_LOCKED((ap)->a_vp, NOTE_WRITE | \
|
||||
(noffset > osize ? NOTE_EXTEND : 0)); \
|
||||
} \
|
||||
INOTIFY((ap)->a_vp, IN_MODIFY); \
|
||||
}
|
||||
|
||||
#define VOP_LOCK(vp, flags) VOP_LOCK1(vp, flags, __FILE__, __LINE__)
|
||||
|
|
|
|||
Loading…
Reference in a new issue