When a local directory update occurs to the directory pages stored
in the dcache, there is no guarrantee that the same modifications
will be made to the cached pages as are being made by the file server.
In the situation that one or more of the cached pages are recycled,
it is not permissible to obtain the missing pages from the file server
without first invalidating the rest of the cached pages. This is
necessary to prevent mixing of incompatible data representations.
Define a new flag CM_SCACHEFLAG_LOCAL which is used to indicate that
dcache entries were locally modified even though they are not dirty.
As the previous code could have corrupted the contents of the dcache,
bump CM_CONFIG_DATA_VERSION in order to force the rebuilding of the
cache.
Add error CM_ERROR_NOTINCACHE to indicate that a requested directory
page is not present in the cache and will not be created on the fly.
Prefetch all dcache entries for directories and ensure that a consistent
set is being used.
The cm_serverRef_t list reference counts were undercounting and
prematurely freeing the server lists for volumes that experienced
VNOVOL and VMOVED errors. cm_Analyze() must release the server
list before forcibly updating the volume location info. Otherwise,
the list that gets freed is the old one concatenated with the new
one.
A small patch to permit the directory package to allocate additional
directory pages when adding new entries that do not fit in the pages
that were obtained from the file server.
Modify MSG_SERVER_REPORTS_VNOVOL to mention that the volume may
have been moved or deleted.
In cm_Analyze(), do not call cm_ForceUpdateVolume() or force a retry
when processing CM_ERROR_NOSUCHVOLUME. This CM error value is the
result of a VNOVOL already being processed which would have forced
the update.
When a VMOVED or VNOVOL error is received, remove the volume id from
the server's volume list.
If cm_ForceUpdateVolume() returns a failure, do not retry if a
VMOVED or VNOVOL error was received.
Make sure that if a cm_serverRef_t object is marked srv_deleted
that its references not be used.
Now that cm_ForceUpdateVolume() is being called only when processing
VMOVED and VNOVOL errors, permit it to call cm_UpdateVolumeLocation()
immediately.
Refactor cm_CheckOfflineVolume() to reduce code duplication.
fs flushall, fs flushvolume, and fs flush should tear down directory
B+ trees so that when the data buffers are re-read from the file server
with the same data version, the B+ trees will be rebuilt.
force a volume location update upon receipt of a VNOVOL error
in case the volume was moved. VMOVED is only returned by the file
server if the volume is in the process of being moved. Once it has
been deleted the file server returns VNOVOL.
because rx_Finalize doesn't clean up, we end up reiniting mutexes. use
pthread_once when not in the kernel.
(kernel does not now call rx_Finalize, ever)
add a free list to the cm_cell_t structure. if during cm_GetCellGen()
the cm_SearchCellXXX() calls fail, store the allocated cm_cell_t object
on a free list so that it can be reused for the next request.
Add TransarcAFSDaemon/Parameters key "LockOrderValidation" DWORD
to control lock order validation functionality. Defaults to off
for release builds and on for checked builds.
Protect against a heap overwrite that could occur is the number of file
servers or vldb servers grows while the maximum number of connections
is computed and when the connection list is populated.
plus and equal are not valid characters in short names.
we replace them with left and right brace in order to
minimize the instability in the file names.
1. In multi-threaded applications deadlocking is always a problem.
Deadlock avoidance requires a strict adherence to a documented
hierarchy. The lock hierarchy for OAFW is described in a file
called locks.txt. There are two problems. First, some of the
locks are not included in locks.txt. Second, it is nearly
impossible given the depth of function calls for any programmer
to identify all of the locks that are held at any given time
a function is called. This patch implements a new locking order
verification mechanism. Each lock is assigned a lock level at
initialization. Each thread maintains a queue of held locks.
Each time a lock is acquired the queue is checked to ensure that
no locks with a higher level than the requested lock has already
been acquired. If a violation occurs, the service panics.
2. When the service panics ensure that a minidump will always be generated.
3. Remove unused lock cm_bufGetMutex.
4. The lock order verifier identified approximately a dozen
lock order violations that are corrected.
5. A race condition within the function path cm_GetSCache() ->
cm_GetNewSCache() -> cm_RecycleSCache() permitted a cm_scache_t
object to be issued simultaneously to two threads. This would
eventually result in a panic due to the resulting under count.
6. Fix interpretation of the empty string as the ioctl path to
mean the current directory. "fs lsm", "symlink list", etc.
now return a "not a ..." error instead of "does not exist".
7. Add SMB_STRF_SRCNULTERM flag to smb_ParseStringXXX functions
to indicate that the input string is a nul terminated string.
Assign it when input strings are nul terminated.
8. The CIFS protocol specification for handling NT_TRANSACT_CREATE
does not match the observed behavior. The 'nameLength' is specified
in bytes not in characters. Fix the implementation to match.
9. The cm_HaveAccessRights() attempt at deadlock avoidance by calling
lock_TryRead() on the parent directory cm_scache_t rw-lock does not
avoid the deadlock. Avoid the deadlock by enforcing the lock order
of lowest vnode first. Then remove the infinite loop avoidance in
cm_SyncOp() that was returning an unwarranted access denied error.
Another casaulty of the Unicode transition, the return value of the
ListLink operation was not being convered from wchar to char before
it was copied into the output buffer.
When afsd_service.exe is not running as a service do not call the
Service Manager functions. Doing so causes invalid access exceptions
to be thrown in the kernel and can corrupt the heap.
Use GetDriveType() to check if the current path is a local disk.
If it is, fail the pioctl attempt immediately. This should avoid
the reported 30 second delay in the AFS Shell Extension.
Prevent rxi_MorePacketsNoLock() from dereferencing a NULL pointer if
the requested allocation size cannot be satsified. In that case back
off the number of packets until osi_Alloc() succeeds or panic if no
packets can be allocated at all.
In AllocPacketBufs() do not transfer more than rx_TSFPQGlobSize packets.
Modify RX_TS_FPQ_GTOL2() macro to protect against transfering more packets
that are actually free.
Modify RX_TS_FPQ_COMPUTE_LIMITS() to enforce a rx_TSFPQGlobSize maximum
value of 64 packets to prevent ever increasing allocation sizes within
AllocPacketBufs()
make the nls module compatible with windows 2000.
cannot use LOCALE_INVARIANT instead must lie and
say everyone is US English. windows 2000 does not
have normalization functions and now doesn't have
case insensitive string comparison functions either
for languages other than English.
====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================
LICENSE MIT
not all applications that link to cm_nls perform initialization.
Call initialization if it has not already been done explicitly.
Derrick helped identify a few locations where rw or mx locks where
not properly being tracked. As a result there were some locations
in which an assertion could be thrown due to releasing the wrong
type of lock.
Also added lock_AssertXXX calls to some locations to ensure that
the correct lock type is being held when the calls are made. volume
location updates, cm_SyncOp, cm_SyncOpDone.
Return CM_ERROR_READONLY if the caller wants PRSFS_DELETE and the
volume is readonly.
In cm_CheckNTDelete() do not call cm_SyncOpDone if cm_SyncOp failed
Do not force the use of fake directory data if the user does not
have PRSFS_READ on the directory. Let the bulkstatus call take
place now that it is actually being used efficiently.
In ApplyV3SearchDirPatches, use cm_SyncOp(CM_SCACHESYNC_GETSTATUS)
to obtain the status info for Freelance entries instead of the
bulkstatus call.
Fix the truncation of 8.3 names in directory search responses.