else
sLockType = LOCKING_ANDX_SHARED_LOCK;
+ /* single byte lock at offset 0x0000 0001 0000 0000 */
LOffset.HighPart = 1;
LOffset.LowPart = 0;
LLength.HighPart = 0;
sLockType = 0;
else
sLockType = LOCKING_ANDX_SHARED_LOCK;
+
+ /* single byte lock at offset 0x0000 0001 0000 0000 */
LOffset.HighPart = 1;
LOffset.LowPart = 0;
LLength.HighPart = 0;
#define IS_LOCK_EFFECTIVE(lockp) (IS_LOCK_ACTIVE(lockp) || IS_LOCK_LOST(lockp))
-#define IS_LOCK_CLIENTONLY(lockp) (((lockp)->flags & CM_FILELOCK_FLAG_CLIENTONLY) == CM_FILELOCK_FLAG_CLIENTONLY)
+#define IS_LOCK_CLIENTONLY(lockp) ((((lockp)->scp->flags & CM_SCACHEFLAG_RO) == CM_SCACHEFLAG_RO) || (((lockp)->flags & CM_FILELOCK_FLAG_CLIENTONLY) == CM_FILELOCK_FLAG_CLIENTONLY))
#define INTERSECT_RANGE(r1,r2) (((r2).offset+(r2).length) > (r1).offset && ((r1).offset +(r1).length) > (r2).offset)
lock_ReleaseRead(&cm_scacheLock);
+ osi_Log4(afsd_logp, "cm_LockCheckRead scp 0x%x offset %d length %d code 0x%x",
+ scp, (unsigned long)LOffset.QuadPart, (unsigned long)LLength.QuadPart, code);
+
return code;
#else
lock_ReleaseRead(&cm_scacheLock);
+ osi_Log4(afsd_logp, "cm_LockCheckWrite scp 0x%x offset %d length %d code 0x%x",
+ scp, (unsigned long)LOffset.QuadPart, (unsigned long)LLength.QuadPart, code);
+
return code;
#else
}
}
}
- } else if (scp->flags & CM_SCACHEFLAG_RO) {
+ } else if (code == 0 && (scp->flags & CM_SCACHEFLAG_RO)) {
osi_Log0(afsd_logp, " Skipping server lock for RO scp");
}
((wait_unlock)?
CM_FILELOCK_FLAG_WAITUNLOCK :
CM_FILELOCK_FLAG_WAITLOCK));
- if (scp->flags & CM_SCACHEFLAG_RO)
- fileLock->flags |= CM_FILELOCK_FLAG_CLIENTONLY;
fileLock->lastUpdate = (code == 0) ? time(NULL) : 0;
scp->exclusiveLocks++;
}
- osi_Log1(afsd_logp, "cm_Lock Lock added 0x%x", (long) fileLock);
+ osi_Log2(afsd_logp, "cm_Lock Lock added 0x%x flags 0x%x", (long) fileLock, fileLock->flags);
osi_Log4(afsd_logp, " scp[0x%x] exclusives[%d] shared[%d] serverLock[%d]",
scp, scp->exclusiveLocks, scp->sharedLocks, (int)(signed char) scp->serverLock);
}
done:
- osi_Log1(afsd_logp, "cm_Unlock code 0x%x", code);
- osi_Log3(afsd_logp, " Leaving scp with exclusives[%d], shared[%d], serverLock[%d]",
- scp->exclusiveLocks, scp->sharedLocks, (int)(signed char) scp->serverLock);
+ osi_Log4(afsd_logp, "cm_Unlock code 0x%x leaving scp with exclusives[%d], shared[%d], serverLock[%d]",
+ code, scp->exclusiveLocks, scp->sharedLocks, (int)(signed char) scp->serverLock);
return code;
}
cm_file_lock_t *fileLock;
osi_queue_t *q;
- /* cm_scacheLock needed because we are modifying
- fileLock->flags */
+ osi_Log1(afsd_logp, "cm_LockMarkSCacheLost scp 0x%x", scp);
+
+#ifdef DEBUG
+ /* With the current code, we can't lose a lock on a RO scp */
+ osi_assert(!(scp->flags & CM_SCACHEFLAG_RO));
+#endif
+
+ /* cm_scacheLock needed because we are modifying fileLock->flags */
lock_ObtainWrite(&cm_scacheLock);
for(q = scp->fileLocksH; q; q = osi_QNext(q)) {
scp = fileLock->scp;
osi_assert(scp != NULL);
+
cm_HoldSCacheNoLock(scp);
#ifdef DEBUG
}
if (scp->serverLock == oldFileLock->lockType ||
- (oldFileLock->lockType == LockRead &&
- scp->serverLock == LockWrite)) {
+ (oldFileLock->lockType == LockRead && scp->serverLock == LockWrite) ||
+ (scp->flags & CM_SCACHEFLAG_RO)) {
oldFileLock->flags &= ~CM_FILELOCK_FLAG_WAITLOCK;