LICENSE MIT
Modify the cm_ResetACLCache interface to accept an optional cm_cell_t *.
At the moment every time a token is set or cleared all of the acl info
for all cm_scache_t objects regardless of cell is reset. This is both
a performance hit and unnecessary. If we know the cell, only reset
the acl info for cm_scache_t objects in that cell.
If cell is not specified, reset for all cells.
LICENSE MIT
use cm_HaveCallback() to check for a call back instead of explicit
checks on cbExpires and cbServerp. cm_HaveCallback takes into account
Freelance mode and offline status.
LICENSE MIT
Change cm_BPlusDirEnumerate interface to include a 'FetchStatus'
parameter. When set to 0, we do not fetch status for fids for
which we do not already have status info. This avoids unnecessary
recycling of cm_scache_t objects.
LICENSE BSD
instead of potentially blocking waiting for a call lock, assume if the call is
locked, the conn is still busy. also, don't even try to get the conn data lock
if we don't need to
LICENSE MIT
Unlike the unix cache manager, on Windows the server uuid was not
recorded as part of the cm_server object. This commit adds the uuid
and a flag to indicate if it is set or not.
A check is made in cm_UpdateVolumeLocation it confirm that the uuid
known to the CM is the same as the one being reported by the vl server.
If they differ, this is logged but no action is taken.
The contents of the cm_allServers list is now dumped in response to
"fs memdump" or a crash. This includes the uuid, addr, type, flags,
downtime, caps, etc.
The server uuid is not useful at the moment because there is nothing
that the CM can use it for. However, it might be useful for debugging
and it will be needed for extended callback support.
LICENSE MIT
create a new cpp symbol CM_SCACHE_VERSION_BAD to represent data version
values in cm_scache objects that are known to be invalid.
then consistently apply this value throughout the code. Previously
some invalid values were set to 0 and others to -1 (0xFFFFFFFF:FFFFFFFF).
Also fix at least one location where CM_BUF_VERSION_BAD was not used.
LICENSE MIT
Change how BPlusDir enumerations behave with regards to bulk stat
operations. If the number of entries in the enumeration is larger
than the number of cm_scache objects, then using the previous model
of cm_BPlusDirEnumBulkStat being called for the entire enumeration
list results in the early objects being recycled and the status
info discarded before the caller of cm_BPlusDirNextEnumEntry()
receives the name.
The revised model triggers bulk stat operations from within
NextEnumEntry() as objects requiring status fetching are about
to be returned to the caller. This reduces the thrashing of the
stat cache.
We should consider adding a flag field to cm_BPlusDirEnumerate()
or cm_BPlusDirNextEnumEntry() to permit enumeration without
status fetching.
LICENSE MIT
Fix another set of edge cases where adding a mountpoint or symlink
to the Freelance volume would result in the wrong fid being returned
to the request that made the addition.
When the Freelance directory is updated, invalidate the cm_scache_t object.
that is associated with it.
Actually use the data version when checking callback status.
The return value from Add Mount/Symlink is not negative on failure.
Its an actual error code. Treat it that way.
LICENSE MIT
Fix smb_FindFIDByScache() to avoid obtaining the smb_fid_t.mx and
smb_rctLock out of order. Doing so requires obtaining references
on each smb_fid_t belonging to the smb_vc_t in order to prevent them
from being removed from the list while the list is being walked.
Reorder tests for CM_SCACHEFLAG_DELETED and smb_fid_t.scp to make
them more efficient and consistent.
When processing Tran2SetPathInfo do not fail because an smb_fid_t
cannot be found for the path object. The PathInfo function is
being used because we do not have a file descriptor. Most importantly
do not fail by returning success.
LICENSE MIT
Problems with the cm_Rename() functions:
* when a rename occurs across directories, the file server allocates
a new vnode which in turn alters the FID. Since the new FID and
potentially version number is unknown to the client, it is not
possible to update the target directory with the new name and
FID thereby avoiding reading the directory from the file server.
* when the old vnode is removed, the callback is broken but the
client did not discard the cm_scache_t object
In order to optimize the client cache AFS requires a RXAFS_RenameEx
rpc that is equivalent to the current RPC but returns the new FID
and status. This would permit the cache manager to relabel the
data buffers and cm_scache_t that are known to contain valid data.
LICENSE MIT
When processing SMB_SESSION_SETUP_ANDX in smb_ReceiveV3SessionSetupX
it is possible that the smb client might indicate that it requires an
Mpx Count greater than we are configured to support. If so, log it
to the Windows Event Log as a warning.
It is also possible that the client might specify that its maximum
receive buffer is smaller than the SMB_PACKETSIZE. If so, log it
to the Windows Event Log as a warning.
Finally, if the client specifies a virtual circuit number of zero,
the client thinks this is its first time communicating with us.
In which case we should invalidate all prior virtual circuits.
We also log this request to the Windows Event Log as informational.
LICENSE MIT
FIXES 124293
As evident in a crash dump, there is a race surrounding access to the
scp field of the smb_fid_t object. Not all access was protected by
the smb_fid_t mx and the cm_scache_t object was not always being
reference counted within the accessing function.
This patch ensures that all initial references to the scp object
are performed under the smb_fid_t mx mutex and that the cm_scache_t
is prevented from being recycled by obtaining a local reference.
Finally, CM_ERROR_BADFD is returned as an error if a request begins
after the smb_fid_t scp field has already been cleared by a smb_CloseFID()
call as part of a concurrent request.
LICENSE MIT
FIXES 124276
A readonly volume with multiple instances was being marked alldown
when one of the instances resulted in VNOVOL because the vldb and
the indicated file server were out of sync. The cache manager would
then attempt to re-obtain the volume location info from the vldb
for the entire timeout period.
This patch:
adds trace logging to cm_Analyze indicating which server references
are being deleted and which remain in response to a VNOVOL/VMOVED error.
adds trace logging to cm_UpdateVolumeStatusInt showing how the
new volume status value is determined.
corrects cm_Analyze() so that it doesn't corrupt the server reference
list during cm_FreeServerList() calls; doesn't orphan the server reference
list by setting *serverpp to NULL; and only re-obtains the volume info
list once per request.
LICENSE BSD
In rxi_WritevProc the queueScan that sets RX_PKTFLAG_TQ on the packet
really needs to cast the queue objects to rx_packet instead of rx_call.
Trashing random fields is not a good idea.