#define FSYNC O_SYNC
#define VTOI(V) ((struct inode*)V)
+#ifdef AFS_LINUX24_ENV
+#define VN_HOLD(V) atomic_inc(&((vnode_t*)V)->i_count)
+#else
#define VN_HOLD(V) ((vnode_t*)V)->i_count++;
+#endif
#define VN_RELE(V) osi_iput((struct inode *)V);
#define VFS_STATFS(V, S) ((V)->s_op->statfs)((V), (S), sizeof(*(S)))
{
struct inode *ip = (struct inode*)avc;
- if (avc->vrefCount != 0)
+ if (VREFCOUNT(avc) != 0)
return EBUSY;
if (avc->opens != 0)
*avcp = tvc;
code = (tvc ? 0 : ENOENT);
hit = 1;
- if (tvc && !tvc->vrefCount) {
+ if (tvc && !VREFCOUNT(tvc)) {
osi_Panic("TT1");
}
if (code) {
code = 0;
*avcp = tvc = adp;
hit = 1;
- if (adp && !adp->vrefCount) {
+ if (adp && !VREFCOUNT(adp)) {
osi_Panic("TT2");
}
goto done;
}
}
*avcp = tvc;
- if (tvc && !tvc->vrefCount) {
+ if (tvc && !VREFCOUNT(tvc)) {
osi_Panic("TT3");
}
code = 0;
osi_dnlc_remove ( adp, aname, tvc);
if (tvc) afs_symhint_inval(tvc);
- Tadp1 = adp; Tadpr = adp->vrefCount; Ttvc = tvc; Tnam = aname; Tnam1 = 0;
- if (tvc) Ttvcr = tvc->vrefCount;
+ Tadp1 = adp; Tadpr = VREFCOUNT(adp); Ttvc = tvc; Tnam = aname; Tnam1 = 0;
+ if (tvc) Ttvcr = VREFCOUNT(tvc);
#ifdef AFS_AIX_ENV
- if (tvc && (tvc->vrefCount > 2) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
+ if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
#else
- if (tvc && (tvc->vrefCount > 1) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
+ if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
#endif
char *unlname = newname();
ReleaseWriteLock(&avc->lock);
}
#ifdef AFS_OSF_ENV
- if ((avc->vrefCount <= 2) && (avc->states & CUnlinked)) {
+ if ((VREFCOUNT(avc) <= 2) && (avc->states & CUnlinked)) {
afs_remunlink(avc, 1); /* ignore any return code */
}
#endif
#define vrefCount v.v_usecount
#endif /* AFS_FBSD_ENV */
+#ifdef AFS_LINUX24_ENV
+#define VREFCOUNT(v) atomic_read(&((vnode_t *) v)->v_count)
+#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_SET(v, c) (v)->vrefCount = c;
+#define VREFCOUNT_DEC(v) (v)->vrefCount--;
+#define VREFCOUNT_INC(v) (v)->vrefCount++;
+#endif
+
#define AFS_MAXDV 0x7fffffff /* largest dataversion number */
#define AFS_NOTRUNC 0x7fffffff /* largest dataversion number */
a_result->DataVersion = hgetlo(tvc->m.DataVersion);
a_result->callback = afs_data_pointer_to_int32(tvc->callback); /* XXXX Now a pointer; change it XXXX */
a_result->cbExpires = tvc->cbExpires;
- a_result->refCount = tvc->vrefCount;
+ a_result->refCount = VREFCOUNT(tvc);
a_result->opens = tvc->opens;
a_result->writers = tvc->execsOrWriters;
a_result->mvstat = tvc->mvstat;
for(i = 0; i < VCSIZE; i++) {
for(tvc = afs_vhashT[i]; tvc; tvc=tvc->hnext) {
if (tvc->fid.Fid.Volume == volume && tvc->fid.Cell == cell) {
-#if defined(AFS_SGI_ENV) || defined(AFS_ALPHA_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_HPUX_ENV)
+#if defined(AFS_SGI_ENV) || defined(AFS_ALPHA_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
VN_HOLD((struct vnode *)tvc);
#else
#if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
osi_vnhold(tvc, 0);
#else
- tvc->vrefCount++;
+ VREFCOUNT_INC(tvc);
#endif
#endif
ReleaseReadLock(&afs_xvcache);
for(i=0;i<VCSIZE;i++) {
for(tvc = afs_vhashT[i]; tvc; tvc=tvc->hnext) {
#ifdef AFS_OSF_ENV
- if (tvc->vrefCount > 1)
+ if (VREFCOUNT(tvc) > 1)
#else /* AFS_OSF_ENV */
- if (tvc->vrefCount)
+ if (VREFCOUNT(tvc))
#endif
afs_warn("Stat cache entry at %x is held\n", tvc);
if (CheckLock(&tvc->lock))
/* This should put it back on the vnode free list since usecount is 1 */
afs_vcount--;
vSetType(avc, VREG);
- if (avc->vrefCount > 0) {
+ if (VREFCOUNT(avc) > 0) {
VN_UNLOCK((struct vnode *)avc);
AFS_RELE((struct vnode *)avc);
} else {
if (tvc == afs_globalVp)
continue;
- if ( tvc->vrefCount && tvc->opens == 0 ) {
+ if ( VREFCOUNT(tvc) && tvc->opens == 0 ) {
struct inode *ip = (struct inode*)tvc;
if (list_empty(&ip->i_dentry)) {
vn --;
refpanic ("Exceeded pool of AFS vnodes(VLRU cycle?)");
else if (QNext(uq) != tq)
refpanic ("VLRU inconsistent");
- else if (tvc->vrefCount < 1)
+ else if (VREFCOUNT(tvc) < 1)
refpanic ("refcnt 0 on VLRU");
- if ( tvc->vrefCount == 1 && tvc->opens == 0
+ if ( VREFCOUNT(tvc) == 1 && tvc->opens == 0
&& (tvc->states & CUnlinkedDel) == 0) {
code = afs_FlushVCache(tvc, &fv_slept);
if (code == 0) {
#ifdef AFS_DARWIN_ENV
if (tvc->opens == 0 && ((tvc->states & CUnlinkedDel) == 0) &&
- tvc->vrefCount == 1 && UBCINFOEXISTS(&tvc->v)) {
+ VREFCOUNT(tvc) == 1 && UBCINFOEXISTS(&tvc->v)) {
osi_VM_TryReclaim(tvc, &fv_slept);
if (fv_slept) {
uq = VLRU.prev;
}
}
#endif
- if (tvc->vrefCount == 0 && tvc->opens == 0
+ if (VREFCOUNT(tvc) == 0 && tvc->opens == 0
&& (tvc->states & CUnlinkedDel) == 0) {
code = afs_FlushVCache(tvc, &fv_slept);
if (code == 0) {
/* Hold it for the LRU (should make count 2) */
VN_HOLD((struct vnode *)tvc);
#else /* AFS_OSF_ENV */
- tvc->vrefCount = 1; /* us */
+ VREFCOUNT_SET(tvc, 1); /* us */
#endif /* AFS_OSF_ENV */
#ifdef AFS_AIX32_ENV
LOCK_INIT(&tvc->pvmlock, "vcache pvmlock");
/*
* That's because if we come in via the CUnlinkedDel bit state path we'll be have 0 refcnt
*/
- osi_Assert(tvc->vrefCount > 0);
+ osi_Assert(VREFCOUNT(tvc) > 0);
AFS_RWLOCK((vnode_t *)tvc, VRWLOCK_WRITE);
#endif
ObtainWriteLock(&tvc->lock,52);
AFS_FAST_RELE(tvc);
if (didCore) {
#ifdef AFS_GFS_ENV
- tvc->vrefCount--;
+ VREFCOUNT_DEC(tvc);
#else
AFS_RELE((struct vnode *)tvc);
#endif
}
}
#ifdef AFS_DARWIN_ENV
- if (tvc->vrefCount == 1 && UBCINFOEXISTS(&tvc->v)) {
+ if (VREFCOUNT(tvc) == 1 && UBCINFOEXISTS(&tvc->v)) {
if (tvc->opens) panic("flushactive open, hasubc, but refcnt 1");
osi_VM_TryReclaim(tvc,0);
}
vms_delete(tvc->segid);
AFS_GLOCK();
tvc->segid = tvc->vmh = NULL;
- if (tvc->vrefCount) osi_Panic("flushVcache: vm race");
+ if (VREFCOUNT(tvc)) osi_Panic("flushVcache: vm race");
}
if (tvc->credp) {
crfree(tvc->credp);