mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-11-07 04:36:52 -10:00
vfs: Assert that VOP_READDIR sets *eofflag properly
Suggested by: kib Reviewed by: olce, kib MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D51300
This commit is contained in:
1 parent
619308b6fe
commit
77b273d8f5
3 files changed
+29
-12
No files matched your search
@@ -6533,17 +6533,6 @@ vop_read_pgcache_post(void *ap, int rc)
|
||||
VFS_KNOTE_UNLOCKED(a->a_vp, NOTE_READ);
|
||||
}
|
||||
|
||||
void
|
||||
vop_readdir_post(void *ap, int rc)
|
||||
{
|
||||
struct vop_readdir_args *a = ap;
|
||||
|
||||
if (!rc) {
|
||||
VFS_KNOTE_LOCKED(a->a_vp, NOTE_READ);
|
||||
INOTIFY(a->a_vp, IN_ACCESS);
|
||||
}
|
||||
}
|
||||
|
||||
static struct knlist fs_knlist;
|
||||
|
||||
static void
|
||||
|
||||
@@ -380,6 +380,7 @@ vop_symlink {
|
||||
|
||||
|
||||
%% readdir vp L L L
|
||||
%! readdir pre vop_readdir_pre
|
||||
%! readdir post vop_readdir_post
|
||||
|
||||
vop_readdir {
|
||||
|
||||
+28
-1
@@ -939,7 +939,6 @@ void vop_mknod_post(void *a, int rc);
|
||||
void vop_open_post(void *a, int rc);
|
||||
void vop_read_post(void *a, int rc);
|
||||
void vop_read_pgcache_post(void *ap, int rc);
|
||||
void vop_readdir_post(void *a, int rc);
|
||||
void vop_reclaim_post(void *a, int rc);
|
||||
void vop_remove_pre(void *a);
|
||||
void vop_remove_post(void *a, int rc);
|
||||
@@ -1015,6 +1014,34 @@ void vop_rename_fail(struct vop_rename_args *ap);
|
||||
_error; \
|
||||
})
|
||||
|
||||
#ifdef INVARIANTS
|
||||
#define vop_readdir_pre_assert(ap) \
|
||||
ssize_t nresid, oresid; \
|
||||
\
|
||||
oresid = (ap)->a_uio->uio_resid;
|
||||
|
||||
#define vop_readdir_post_assert(ap, ret) \
|
||||
nresid = (ap)->a_uio->uio_resid; \
|
||||
if ((ret) == 0 && (ap)->a_eofflag != NULL) { \
|
||||
VNASSERT(nresid != oresid || *(ap)->a_eofflag == 1, \
|
||||
(ap)->a_vp, ("VOP_READDIR: eofflag not set")); \
|
||||
}
|
||||
#else
|
||||
#define vop_readdir_pre_assert(ap)
|
||||
#define vop_readdir_post_assert(ap, ret)
|
||||
#endif
|
||||
|
||||
#define vop_readdir_pre(ap) do { \
|
||||
vop_readdir_pre_assert(ap)
|
||||
|
||||
#define vop_readdir_post(ap, ret) \
|
||||
vop_readdir_post_assert(ap, ret); \
|
||||
if ((ret) == 0) { \
|
||||
VFS_KNOTE_LOCKED((ap)->a_vp, NOTE_READ); \
|
||||
INOTIFY((ap)->a_vp, IN_ACCESS); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define VOP_WRITE_PRE(ap) \
|
||||
struct vattr va; \
|
||||
int error; \
|
||||
|
||||
Reference in new issue
Block a user