If AFSInsertHashEntry() fails, the object information structure
that was being inserted is not in the btree. Therefore, ensure
that the object does not have the AFS_OBJECT_INSERTED_HASH_TREE
or AFS_VOLUME_INSERTED_HASH_TREE flag set (as appropriate).
This permits the unreferenced object to be garbage collected.
Change-Id: I023f765571a7ba014556d9505ab2d46ec930f1a2
Reviewed-on: http://gerrit.openafs.org/6458
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>
"AFSInsertHashEntry Attempt to re-insert a CRC %I64X\n",
FileIDEntry->HashIndex);
- ASSERT( FALSE);
-
ntStatus = STATUS_UNSUCCESSFUL;
break;
{
pDeviceExt->Specific.RDR.VolumeTree.TreeHead = &pVolumeCB->TreeEntry;
+
+ SetFlag( pVolumeCB->Flags, AFS_VOLUME_INSERTED_HASH_TREE);
}
else
{
- AFSInsertHashEntry( pDeviceExt->Specific.RDR.VolumeTree.TreeHead,
- &pVolumeCB->TreeEntry);
- }
+ if ( NT_SUCCESS( AFSInsertHashEntry( pDeviceExt->Specific.RDR.VolumeTree.TreeHead,
+ &pVolumeCB->TreeEntry)))
+ {
- SetFlag( pVolumeCB->Flags, AFS_VOLUME_INSERTED_HASH_TREE);
+ SetFlag( pVolumeCB->Flags, AFS_VOLUME_INSERTED_HASH_TREE);
+ }
+ }
if( pDeviceExt->Specific.RDR.VolumeListHead == NULL)
{
else
{
- AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
- &pSrcObject->TreeEntry);
+ if ( !NT_SUCCESS( AFSInsertHashEntry( pSrcObject->VolumeCB->ObjectInfoTree.TreeHead,
+ &pSrcObject->TreeEntry)))
+ {
+
+ //
+ // Lost a race, an ObjectInfo object already exists for this FID.
+ // Let this copy be garbage collected.
+ //
+
+ ClearFlag( pSrcObject->Flags, AFS_OBJECT_INSERTED_HASH_TREE);
+ }
}
AFSReleaseResource( pSrcObject->VolumeCB->ObjectInfoTree.TreeLock);