struct vnode: assign v_rl.resv1 as v_type and v_rl.resv2 as v_state

Use the avaliable space to introduce vnode-locked flag v_v2flag.

Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D56912
This commit is contained in:
Konstantin Belousov
2026-04-26 05:31:50 +03:00
parent 3d505310b1
commit da6aa0648c
2 changed files with 12 additions and 2 deletions
+4
View File
@@ -46,6 +46,10 @@ struct rl_q_entry;
* all existing lock owners are compatible with the request. Two lock * all existing lock owners are compatible with the request. Two lock
* owners are compatible if their ranges do not overlap, or both * owners are compatible if their ranges do not overlap, or both
* owners are for read. * owners are for read.
*
* The resvX fields are there due to padding and explicitly enumerated
* so they can be used by consumers. For instance, struct vnode uses
* resv1 as v_type and resv2 as v_state.
*/ */
struct rangelock { struct rangelock {
uintptr_t head; uintptr_t head;
+8 -2
View File
@@ -133,8 +133,7 @@ struct vnode {
* Fields which define the identity of the vnode. These fields are * Fields which define the identity of the vnode. These fields are
* owned by the filesystem (XXX: and vgone() ?) * owned by the filesystem (XXX: and vgone() ?)
*/ */
__enum_uint8(vtype) v_type; /* u vnode type */ short v_v2flag; /* v frequently read flag */
__enum_uint8(vstate) v_state; /* u vnode state */
short v_irflag; /* i frequently read flags */ short v_irflag; /* i frequently read flags */
seqc_t v_seqc; /* i modification count */ seqc_t v_seqc; /* i modification count */
uint32_t v_nchash; /* u namecache hash */ uint32_t v_nchash; /* u namecache hash */
@@ -203,6 +202,12 @@ struct vnode {
(negative) text users */ (negative) text users */
int v_seqc_users; /* i modifications pending */ int v_seqc_users; /* i modifications pending */
}; };
/*
__enum_uint8(vtype) v_type;
__enum_uint8(vstate) v_state;
*/
#define v_type v_rl.resv1 /* u vnode type */
#define v_state v_rl.resv2 /* u vnode state */
#define VN_ISDEV(vp) VTYPE_ISDEV((vp)->v_type) #define VN_ISDEV(vp) VTYPE_ISDEV((vp)->v_type)
@@ -237,6 +242,7 @@ _Static_assert(sizeof(struct vnode) <= 448, "vnode size crosses 448 bytes");
* VI flags are protected by interlock and live in v_iflag * VI flags are protected by interlock and live in v_iflag
* VIRF flags are protected by interlock and live in v_irflag * VIRF flags are protected by interlock and live in v_irflag
* VV flags are protected by the vnode lock and live in v_vflag * VV flags are protected by the vnode lock and live in v_vflag
* V2 flags are protected by the vnode lock and live in v_v2flag
* *
* VIRF_DOOMED is doubly protected by the interlock and vnode lock. Both * VIRF_DOOMED is doubly protected by the interlock and vnode lock. Both
* are required for writing but the status may be checked with either. * are required for writing but the status may be checked with either.