Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_subr.c
Show First 20 Lines • Show All 991 Lines • ▼ Show 20 Lines | |||||
destroy_vpollinfo(vp->v_pollinfo); | destroy_vpollinfo(vp->v_pollinfo); | ||||
vp->v_pollinfo = NULL; | vp->v_pollinfo = NULL; | ||||
} | } | ||||
vp->v_mountedhere = NULL; | vp->v_mountedhere = NULL; | ||||
vp->v_unpcb = NULL; | vp->v_unpcb = NULL; | ||||
vp->v_rdev = NULL; | vp->v_rdev = NULL; | ||||
vp->v_fifoinfo = NULL; | vp->v_fifoinfo = NULL; | ||||
vp->v_lasta = vp->v_clen = vp->v_cstart = vp->v_lastw = 0; | vp->v_lasta = vp->v_clen = vp->v_cstart = vp->v_lastw = 0; | ||||
vp->v_irflag = 0; | vn_irflag_read(vp) = 0; | ||||
mjg: This is an artifact from coccinelle. Will patch later. | |||||
vp->v_iflag = 0; | vp->v_iflag = 0; | ||||
vp->v_vflag = 0; | vp->v_vflag = 0; | ||||
bo->bo_flag = 0; | bo->bo_flag = 0; | ||||
vn_free(vp); | vn_free(vp); | ||||
} | } | ||||
/* | /* | ||||
* Delete from old mount point vnode list, if on one. | * Delete from old mount point vnode list, if on one. | ||||
▲ Show 20 Lines • Show All 1,982 Lines • ▼ Show 20 Lines | |||||
VNASSERT(vp->v_holdcnt, vp, | VNASSERT(vp->v_holdcnt, vp, | ||||
("vgonel: vp %p has no reference.", vp)); | ("vgonel: vp %p has no reference.", vp)); | ||||
CTR2(KTR_VFS, "%s: vp %p", __func__, vp); | CTR2(KTR_VFS, "%s: vp %p", __func__, vp); | ||||
td = curthread; | td = curthread; | ||||
/* | /* | ||||
* Don't vgonel if we're already doomed. | * Don't vgonel if we're already doomed. | ||||
*/ | */ | ||||
if (vp->v_irflag & VIRF_DOOMED) | if (VN_IS_DOOMED(vp)) | ||||
return; | return; | ||||
/* | /* | ||||
* Paired with freevnode. | * Paired with freevnode. | ||||
*/ | */ | ||||
vn_seqc_write_begin_locked(vp); | vn_seqc_write_begin_locked(vp); | ||||
vunlazy_gone(vp); | vunlazy_gone(vp); | ||||
vp->v_irflag |= VIRF_DOOMED; | vn_irflag_set(vp, VIRF_DOOMED); | ||||
/* | /* | ||||
* Check to see if the vnode is in use. If so, we have to | * Check to see if the vnode is in use. If so, we have to | ||||
* call VOP_CLOSE() and VOP_INACTIVE(). | * call VOP_CLOSE() and VOP_INACTIVE(). | ||||
* | * | ||||
* It could be that VOP_INACTIVE() requested reclamation, in | * It could be that VOP_INACTIVE() requested reclamation, in | ||||
* which case we should avoid recursion, so check | * which case we should avoid recursion, so check | ||||
* VI_DOINGINACT. This is not precise but good enough. | * VI_DOINGINACT. This is not precise but good enough. | ||||
▲ Show 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | |||||
void | void | ||||
vn_printf(struct vnode *vp, const char *fmt, ...) | vn_printf(struct vnode *vp, const char *fmt, ...) | ||||
{ | { | ||||
va_list ap; | va_list ap; | ||||
char buf[256], buf2[16]; | char buf[256], buf2[16]; | ||||
u_long flags; | u_long flags; | ||||
u_int holdcnt; | u_int holdcnt; | ||||
char irflag; | |||||
va_start(ap, fmt); | va_start(ap, fmt); | ||||
vprintf(fmt, ap); | vprintf(fmt, ap); | ||||
va_end(ap); | va_end(ap); | ||||
printf("%p: ", (void *)vp); | printf("%p: ", (void *)vp); | ||||
printf("type %s\n", typename[vp->v_type]); | printf("type %s\n", typename[vp->v_type]); | ||||
holdcnt = atomic_load_int(&vp->v_holdcnt); | holdcnt = atomic_load_int(&vp->v_holdcnt); | ||||
printf(" usecount %d, writecount %d, refcount %d seqc users %d", | printf(" usecount %d, writecount %d, refcount %d seqc users %d", | ||||
Show All 19 Lines | |||||
buf[0] = '\0'; | buf[0] = '\0'; | ||||
buf[1] = '\0'; | buf[1] = '\0'; | ||||
if (holdcnt & VHOLD_NO_SMR) | if (holdcnt & VHOLD_NO_SMR) | ||||
strlcat(buf, "|VHOLD_NO_SMR", sizeof(buf)); | strlcat(buf, "|VHOLD_NO_SMR", sizeof(buf)); | ||||
printf(" hold count flags (%s)\n", buf + 1); | printf(" hold count flags (%s)\n", buf + 1); | ||||
buf[0] = '\0'; | buf[0] = '\0'; | ||||
buf[1] = '\0'; | buf[1] = '\0'; | ||||
if (vp->v_irflag & VIRF_DOOMED) | irflag = vn_irflag_read(vp); | ||||
if (irflag & VIRF_DOOMED) | |||||
strlcat(buf, "|VIRF_DOOMED", sizeof(buf)); | strlcat(buf, "|VIRF_DOOMED", sizeof(buf)); | ||||
if (vp->v_irflag & VIRF_PGREAD) | if (irflag & VIRF_PGREAD) | ||||
strlcat(buf, "|VIRF_PGREAD", sizeof(buf)); | strlcat(buf, "|VIRF_PGREAD", sizeof(buf)); | ||||
flags = vp->v_irflag & ~(VIRF_DOOMED | VIRF_PGREAD); | flags = irflag & ~(VIRF_DOOMED | VIRF_PGREAD); | ||||
if (flags != 0) { | if (flags != 0) { | ||||
snprintf(buf2, sizeof(buf2), "|VIRF(0x%lx)", flags); | snprintf(buf2, sizeof(buf2), "|VIRF(0x%lx)", flags); | ||||
strlcat(buf, buf2, sizeof(buf)); | strlcat(buf, buf2, sizeof(buf)); | ||||
} | } | ||||
if (vp->v_vflag & VV_ROOT) | if (vp->v_vflag & VV_ROOT) | ||||
strlcat(buf, "|VV_ROOT", sizeof(buf)); | strlcat(buf, "|VV_ROOT", sizeof(buf)); | ||||
if (vp->v_vflag & VV_ISTTY) | if (vp->v_vflag & VV_ISTTY) | ||||
strlcat(buf, "|VV_ISTTY", sizeof(buf)); | strlcat(buf, "|VV_ISTTY", sizeof(buf)); | ||||
▲ Show 20 Lines • Show All 1,982 Lines • ▼ Show 20 Lines | |||||
void | void | ||||
vn_seqc_write_end(struct vnode *vp) | vn_seqc_write_end(struct vnode *vp) | ||||
{ | { | ||||
VI_LOCK(vp); | VI_LOCK(vp); | ||||
vn_seqc_write_end_locked(vp); | vn_seqc_write_end_locked(vp); | ||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
} | } | ||||
void | |||||
vn_irflag_set(struct vnode *vp, char toset) | |||||
{ | |||||
char flags; | |||||
ASSERT_VI_LOCKED(vp, __func__); | |||||
flags = vn_irflag_read(vp); | |||||
VNPASS((flags & toset) == 0, vp); | |||||
atomic_store_char(&vp->v_irflag, flags | toset); | |||||
} | |||||
void | |||||
vn_irflag_set_cond(struct vnode *vp, char toset) | |||||
{ | |||||
char flags; | |||||
ASSERT_VI_LOCKED(vp, __func__); | |||||
flags = vn_irflag_read(vp); | |||||
atomic_store_char(&vp->v_irflag, flags | toset); | |||||
} | |||||
void | |||||
vn_irflag_unset(struct vnode *vp, char tounset) | |||||
{ | |||||
char flags; | |||||
ASSERT_VI_LOCKED(vp, __func__); | |||||
flags = vn_irflag_read(vp); | |||||
VNPASS((flags & tounset) == tounset, vp); | |||||
atomic_store_char(&vp->v_irflag, flags & ~tounset); | |||||
} | |||||
Context not available. |
This is an artifact from coccinelle. Will patch later.