#define ifnet_metric(x) (x?(x)->if_data.ifi_metric:0)
#endif
+#ifndef AFS_DARWIN80_ENV
+#define ifaddr_address_family(x) (x)->ifa_addr->sa_family
+#define ifaddr_address(x, y, z) memcpy(y, (x)->ifa_addr, z)
+#define ifaddr_netmask(x, y, z) memcpy(y, (x)->ifa_netmask, z)
+#define ifaddr_dstaddress(x, y, z) memcpy(y, (x)->ifa_dstaddr, z)
+#define ifaddr_ifnet(x) (x?(x)->ifa_ifp:0)
+#define ifnet_flags(x) (x?(x)->if_flags:0)
+#define ifnet_metric(x) (x?(x)->if_data.ifi_metric:0)
+
+#define vnode_clearfsnode(x) ((x)->v_data = 0)
+#define vnode_fsnode(x) (x)->v_data
+#define vnode_lock(x) vn_lock(x, LK_EXCLUSIVE | LK_RETRY, current_proc());
+#endif
+
#ifdef AFS_DARWIN80_ENV
#define vrele vnode_rele
#define vput vnode_put
ourselves during vop_inactive, except we also need to not reinst
the ubc... so we just call VREF there now anyway. */
+ if (VREFCOUNT_GT(tvc, 0))
#ifdef AFS_DARWIN80_ENV
- if (vnode_isinuse(vp))
vnode_ref(vp);
- else
- vnode_get(vp);
#else
- if (VREFCOUNT(tvc) > 0)
VREF(((struct vnode *)(vp)));
+#endif
else
+#ifdef AFS_DARWIN80_ENV
+ vnode_get(vp);
+#else
afs_vget(afs_globalVFS, 0, (vp));
#endif
{
struct vm_object *obj;
struct vnode *vp;
- if (VREFCOUNT(avc) > 1)
+ if (VREFCOUNT_GT(avc, 1))
return EBUSY;
if (avc->opens)
*avcp = tvc;
code = (tvc ? 0 : ENOENT);
hit = 1;
-#ifdef AFS_DARWIN80_ENV
- if (tvc && !vnode_isinuse(AFSTOV(tvc))) {
+ if (tvc && !VREFCOUNT_GT(tvc, 0)) {
osi_Panic("TT1");
}
-#else
- if (tvc && !VREFCOUNT(tvc)) {
- osi_Panic("TT1");
- }
-#endif
if (code) {
/*printf("LOOKUP GETVCDOTDOT -> %d\n", code); */
}
code = 0;
*avcp = tvc = adp;
hit = 1;
-#ifdef AFS_DARWIN80_ENV
- if (adp && !vnode_isinuse(AFSTOV(adp))) {
- osi_Panic("TT2");
- }
-#else
- if (adp && !VREFCOUNT(adp)) {
+ if (adp && !VREFCOUNT_GT(adp, 0)) {
osi_Panic("TT2");
}
-#endif
goto done;
}
}
}
*avcp = tvc;
-#ifdef AFS_DARWIN80_ENV
- if (tvc && !vnode_isinuse(AFSTOV(tvc))) {
- osi_Panic("TT3");
- }
-#else
- if (tvc && !VREFCOUNT(tvc)) {
+ if (tvc && !VREFCOUNT_GT(tvc, 0)) {
osi_Panic("TT3");
}
-#endif
code = 0;
} else {
/* if we get here, we found something in a directory that couldn't
if (tvc)
#ifndef AFS_DARWIN80_ENV
Ttvcr = VREFCOUNT(tvc);
+#endif
#ifdef AFS_AIX_ENV
if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0
&& !(tvc->states & CUnlinked))
#else
- if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0
- && !(tvc->states & CUnlinked))
-#endif
-#else
- if (tvc && (vnode_isinuse(AFSTOV(tvc))) && tvc->opens > 0
+ if (tvc && (VREFCOUNT_GT(tvc), 1) && tvc->opens > 0
&& !(tvc->states & CUnlinked))
#endif
{
#define vrefCount v.v_count
#endif /* AFS_XBSD_ENV */
-#if defined(AFS_LINUX24_ENV)
+/* VREFCOUNT_GT works on vnodes, not vcaches. maybe this is bad? */
+#if defined(AFS_DARWIN80_ENV)
+#define VREFCOUNT_GT(v, y) vnode_isinuse(AFSTOV(v), y)
+#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV)
+#define VREFCOUNT_GT(v, y) (AFSTOV(v)->v_usecount>y?1:0)
+#elif defined(AFS_LINUX24_ENV)
#define VREFCOUNT(v) atomic_read(&((vnode_t *) v)->v_count)
+#define VREFCOUNT_GT(v, y) ((atomic_read(&((vnode_t *) v)->v_count)>y)?1:0)
#define VREFCOUNT_SET(v, c) atomic_set(&((vnode_t *) v)->v_count, c)
#define VREFCOUNT_DEC(v) atomic_dec(&((vnode_t *) v)->v_count)
#define VREFCOUNT_INC(v) atomic_inc(&((vnode_t *) v)->v_count)
#else
#define VREFCOUNT(v) ((v)->vrefCount)
+#define VREFCOUNT_GT(v,y) ((v).v_count>y?1:0)
#define VREFCOUNT_SET(v, c) (v)->vrefCount = c;
#define VREFCOUNT_DEC(v) (v)->vrefCount--;
#define VREFCOUNT_INC(v) (v)->vrefCount++;
extern afs_uint32 afs_stampValue; /* stamp for pair's usage */
#define MakeStamp() (++afs_stampValue)
-#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV)
-#ifdef AFS_DARWIN80_ENV
+#if defined(AFS_DARWIN_ENV)
#define VTOAFS(v) ((struct vcache *)vnode_fsnode((v)))
-#else
+#define AFSTOV(vc) ((vc)->v)
+#elif defined(AFS_XBSD_ENV)
#define VTOAFS(v) ((struct vcache *)(v)->v_data)
-#endif
#define AFSTOV(vc) ((vc)->v)
#else
#define VTOAFS(V) ((struct vcache *)(V))
/* OK, there are no internal vrefCounts, so there shouldn't
* be any more refs here. */
if (avc->v) {
+#ifdef AFS_DARWIN_ENV
+ vnode_clearfsnode(AFSTOV(avc));
+#else
avc->v->v_data = NULL; /* remove from vnode */
- avc->v = NULL; /* also drop the ptr to vnode */
+#endif
+ AFSTOV(avc) = NULL; /* also drop the ptr to vnode */
}
#endif
afs_FreeAllAxs(&(avc->Access));
/* This should put it back on the vnode free list since usecount is 1 */
afs_vcount--;
vSetType(avc, VREG);
-#ifdef AFS_DARWIN80_ENV
- if (vnode_isinuse(AFSTOV(avc), 0)) {
-#else
- if (VREFCOUNT(avc) > 0) {
-#endif
+ if (VREFCOUNT_GT(avc,0)) {
VN_UNLOCK(AFSTOV(avc));
AFS_RELE(AFSTOV(avc));
} else {
refpanic("Exceeded pool of AFS vnodes(VLRU cycle?)");
else if (QNext(uq) != tq)
refpanic("VLRU inconsistent");
-#ifdef AFS_DARWIN80_ENV
- else if (!vnode_isinuse(AFSTOV(tvc), 0))
-#else
- else if (VREFCOUNT(tvc) < 1)
-#endif
- refpanic("refcnt 0 on VLRU");
-
-#ifdef AFS_DARWIN80_ENV
- if (vnode_isinuse(AFSTOV(tvc), 0) &&
-#else
- if (VREFCOUNT(tvc) == 1 &&
-#endif
+ else if (!VREFCOUNT_GT(tvc,0))
+ refpanic("refcnt 0 on VLRU");
+
+ if (VREFCOUNT_GT(tvc,0) && !VREFCOUNT_GT(tvc,1) &&
tvc->opens == 0
&& (tvc->states & CUnlinkedDel) == 0) {
code = afs_FlushVCache(tvc, &fv_slept);
}
#endif
-#ifdef AFS_DARWIN80_ENV
- if (!vnode_isinuse(AFSTOV(tvc), 0
-#else
- if (((VREFCOUNT(tvc) == 0)
-#if defined(AFS_DARWIN_ENV) && !defined(UKERNEL)
- || ((VREFCOUNT(tvc) == 1) &&
- (UBCINFOEXISTS(AFSTOV(tvc))))
+
+ if (!VREFCOUNT_GT(tvc,0)
+#if defined(AFS_DARWIN_ENV) && !defined(UKERNEL) && !defined(AFS_DARWIN80_ENV)
+ || ((VREFCOUNT(tvc) == 1) &&
+ (UBCINFOEXISTS(AFSTOV(tvc))))
#endif
-#endif
- ) && tvc->opens == 0 && (tvc->states & CUnlinkedDel) == 0) {
+ && tvc->opens == 0 && (tvc->states & CUnlinkedDel) == 0) {
#if defined (AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
/*
* vgone() reclaims the vnode, which calls afs_FlushVCache(),
/*
* That's because if we come in via the CUnlinkedDel bit state path we'll be have 0 refcnt
*/
- osi_Assert(VREFCOUNT(tvc) > 0);
+ osi_Assert(VREFCOUNT_GT(tvc,0));
AFS_RWLOCK((vnode_t *) tvc, VRWLOCK_WRITE);
#endif
ObtainWriteLock(&tvc->lock, 52);
#if defined(AFS_DARWIN_ENV)
iheldthelock = VOP_ISLOCKED(vp);
if (!iheldthelock)
- vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, current_proc());
+ vnode_lock(vp);
/* this is messy. we can call fsync which will try to reobtain this */
if (VTOAFS(vp) == tvc)
ReleaseWriteLock(&tvc->lock);
if (VTOAFS(vp) == tvc)
ObtainWriteLock(&tvc->lock, 954);
if (!iheldthelock)
+#ifdef AFS_DARWIN80_ENV
+ vnode_unlock(vp);
+#else
VOP_UNLOCK(vp, LK_EXCLUSIVE, current_proc());
+#endif
#elif defined(AFS_FBSD60_ENV)
iheldthelock = VOP_ISLOCKED(vp, curthread);
if (!iheldthelock)
vms_delete(tvc->segid);
AFS_GLOCK();
tvc->segid = tvc->vmh = NULL;
- if (VREFCOUNT(tvc))
+ if (VREFCOUNT_GT(tvc,0))
osi_Panic("flushVcache: vm race");
}
if (tvc->credp) {