if (code && code != CM_ERROR_BADFD)
goto skip;
- /* if the scp's FID is bad its because we received VNOVNODE
- * when attempting to FetchStatus before the write. This
- * page therefore contains data that can no longer be stored.
- */
- lock_ObtainMutex(&bp->mx);
- bp->flags &= ~CM_BUF_DIRTY;
- bp->flags |= CM_BUF_ERROR;
- bp->error = code;
- bp->dirty_offset = 0;
- bp->dirty_length = 0;
- bp->dataVersion = -1; /* known bad */
- bp->dirtyCounter++;
- lock_ReleaseMutex(&bp->mx);
+ if (code == CM_ERROR_BADFD) {
+ /* if the scp's FID is bad its because we received VNOVNODE
+ * when attempting to FetchStatus before the write. This
+ * page therefore contains data that can no longer be stored.
+ */
+ lock_ObtainMutex(&bp->mx);
+ bp->flags &= ~CM_BUF_DIRTY;
+ bp->flags |= CM_BUF_ERROR;
+ bp->error = CM_ERROR_BADFD;
+ bp->dirty_offset = 0;
+ bp->dirty_length = 0;
+ bp->dataVersion = -1; /* known bad */
+ bp->dirtyCounter++;
+ lock_ReleaseMutex(&bp->mx);
+ }
/* actually, we only know that buffer is clean if ref
* count is 1, since we don't have buffer itself locked.
lock_ReleaseWrite(&buf_globalLock);
}
- if (code != CM_ERROR_BADFD)
+ if (code == 0)
(*cm_buf_opsp->Unstabilizep)(scp, userp);
}