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:
@@ -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
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user