(vcp->ddirty_flags == VDisconShadowed)) {
ObtainWriteLock(&afs_DDirtyVCListLock, 710);
- AFS_DISCON_ADD_DIRTY(vcp);
+ AFS_DISCON_ADD_DIRTY(vcp, 1);
ReleaseWriteLock(&afs_DDirtyVCListLock);
}
if (!tvc->ddirty_flags ||
(tvc->ddirty_flags == VDisconShadowed)) {
/* Put it in the list only if it's fresh. */
- ObtainWriteLock(&afs_DDirtyVCListLock, 729);
- AFS_DISCON_ADD_DIRTY(tvc);
+ ObtainWriteLock(&afs_DDirtyVCListLock, 729);
+ AFS_DISCON_ADD_DIRTY(tvc, 0);
ReleaseWriteLock(&afs_DDirtyVCListLock);
}
/* Put it in the list only if it's fresh. */
ObtainWriteLock(&afs_DDirtyVCListLock, 730);
- AFS_DISCON_ADD_DIRTY(tvc);
+ AFS_DISCON_ADD_DIRTY(tvc, 1);
ReleaseWriteLock(&afs_DDirtyVCListLock);
}
if (!tvc->ddirty_flags) {
/* Put it in the list only if it's fresh or has only been shadowed. */
ObtainWriteLock(&afs_DDirtyVCListLock, 728);
- AFS_DISCON_ADD_DIRTY(tvc);
+ AFS_DISCON_ADD_DIRTY(tvc, 1);
ReleaseWriteLock(&afs_DDirtyVCListLock);
}
ObtainWriteLock(&tvc->lock, 155);
tvc->states &= ~CUnique; /* For the dfs xlator */
ReleaseWriteLock(&tvc->lock);
- /* If disconnected, keep this vcache around for resync. */
- if (!AFS_IS_DISCON_RW)
- afs_PutVCache(tvc);
+ afs_PutVCache(tvc);
}
ReleaseWriteLock(&adp->lock);
/* don't worry about link count since dirs can not be hardlinked */
#ifdef AFS_BOZONLOCK_ENV
afs_BozonUnlock(&tvc->pvnLock, tvc);
#endif
- /* Don't decrease refcount for this vcache if disconnected, we will
- * need it during replay.
- */
- if (!AFS_IS_DISCON_RW)
- afs_PutVCache(tvc);
+ afs_PutVCache(tvc);
}
return (0);
}
(tvc->ddirty_flags == VDisconShadowed)) {
/* Add to list only if fresh. */
ObtainWriteLock(&afs_DDirtyVCListLock, 725);
- AFS_DISCON_ADD_DIRTY(tvc);
+ AFS_DISCON_ADD_DIRTY(tvc, 1);
ReleaseWriteLock(&afs_DDirtyVCListLock);
}
(tvc->ddirty_flags == VDisconShadowed)) {
/* Add in dirty list.*/
ObtainWriteLock(&afs_DDirtyVCListLock, 751);
- AFS_DISCON_ADD_DIRTY(tvc);
- ReleaseWriteLock(&afs_DDirtyVCListLock);
+ AFS_DISCON_ADD_DIRTY(tvc, 1);
+ ReleaseWriteLock(&afs_DDirtyVCListLock);
}
ObtainWriteLock(&tvc->lock, 750);
if (!avc->ddirty_flags ||
(avc->ddirty_flags == VDisconShadowed)) {
+
/* Add to disconnected dirty list. */
- AFS_DISCON_ADD_DIRTY(avc);
- }
+ AFS_DISCON_ADD_DIRTY(avc, 1);
+ }
/* Set disconnected write flag. */
avc->ddirty_flags |= VDisconWriteClose;
(avc->ddirty_flags == VDisconShadowed)) {
/* Add to disconnected dirty list. */
- AFS_DISCON_ADD_DIRTY(avc);
+ AFS_DISCON_ADD_DIRTY(avc, 1);
}
UpgradeSToWLock(&avc->lock, 711);
if (!ret_code) {
if (!avc->ddirty_flags) {
ObtainWriteLock(&afs_DDirtyVCListLock, 763);
- AFS_DISCON_ADD_DIRTY(avc);
+ AFS_DISCON_ADD_DIRTY(avc, 1);
ReleaseWriteLock(&afs_DDirtyVCListLock);
}
avc->shVnode = shadow_fid.Fid.Vnode;
/* We can discard the shadow dir now. */
afs_DeleteShadowDir(tmp);
- if (tmp->ddirty_flags & VDisconRemove)
- /* Drop the refcount on the deleted vnodes,
- * because we don't need them anymore.
- */
- afs_PutVCache(tmp);
+ /* Drop the refcount on this vnode because it's not in the
+ * list anymore.
+ */
+ afs_PutVCache(tmp);
/* Only if sync was successfull,
* clear flags and dirty references.
if (!avc->ddirty_flags ||
(avc->ddirty_flags == VDisconShadowed)) {
/* Not in dirty list. */
- AFS_DISCON_ADD_DIRTY(avc);
+ AFS_DISCON_ADD_DIRTY(avc, 1);
}
avc->ddirty_flags |= flags;
#define AFS_DISCON_LOCK()
#define AFS_DISCON_UNLOCK()
-#define AFS_DISCON_ADD_DIRTY(avc)
+#define AFS_DISCON_ADD_DIRTY(avc, lock)
#else
#define AFS_DISCON_LOCK() ObtainReadLock(&afs_discon_lock)
#define AFS_DISCON_UNLOCK() ReleaseReadLock(&afs_discon_lock)
-#define AFS_DISCON_ADD_DIRTY(avc) \
+/* Call with avc and afs_DDirtyVCListLock w locks held. */
+#define AFS_DISCON_ADD_DIRTY(avc, lock) \
do { \
+ int retry = 0; \
if (!afs_DDirtyVCListStart) { \
afs_DDirtyVCListStart = afs_DDirtyVCList = avc; \
} else { \
afs_DDirtyVCList->ddirty_next = avc; \
afs_DDirtyVCList = avc; \
} \
+ if (lock) \
+ ObtainWriteLock(&afs_xvcache, 763); \
+ osi_vnhold(avc, 0); \
+ if (lock) \
+ ReleaseWriteLock(&afs_xvcache); \
} while(0);
#endif /* AFS_DISCON_ENV */
/* This is the max lock number in use. Please update it if you add any new
* lock numbers.
*/
-#define MAX_LOCK_NUMBER 760
+#define MAX_LOCK_NUMBER 780
#endif
struct afs_bozoLock {