#ifdef AFS_PTHREAD_ENV
/* set our 'thread-id' so that the host hold table works */
- tid = rx_NewThreadId();
- pthread_setspecific(rx_thread_id_key, (void *)(intptr_t)tid);
+ tid = rx_SetThreadNum();
Log("Set thread id %d for FSYNC_sync\n", tid);
+ afs_pthread_setname_self("FSYNC_sync");
#endif /* AFS_PTHREAD_ENV */
VOL_LOCK;
CallHandler(FSYNC_readfds, nfds, POLLIN|POLLPRI);
#else
int maxfd;
+#ifdef AFS_PTHREAD_ENV
struct timeval s_timeout;
+#endif
GetHandler(&FSYNC_readfds, &maxfd);
- s_timeout.tv_sec = SYNC_SELECT_TIMEOUT;
- s_timeout.tv_usec = 0;
/* Note: check for >= 1 below is essential since IOMGR_select
* doesn't have exactly same semantics as select.
*/
#ifdef AFS_PTHREAD_ENV
+ s_timeout.tv_sec = SYNC_SELECT_TIMEOUT;
+ s_timeout.tv_usec = 0;
if (select(maxfd + 1, &FSYNC_readfds, NULL, NULL, &s_timeout) >= 1)
#else /* AFS_PTHREAD_ENV */
if (IOMGR_Select(maxfd + 1, &FSYNC_readfds, NULL, NULL, NULL) >= 1)
Volume * vp;
Error error;
+ /* Verify the partition name is null terminated. */
if (SYNC_verifyProtocolString(vcom->vop->partName, sizeof(vcom->vop->partName))) {
res->hdr.reason = SYNC_REASON_MALFORMED_PACKET;
code = SYNC_FAILED;
/* so, we need to attach the volume */
#ifdef AFS_DEMAND_ATTACH_FS
+ /* Verify the partition name is not empty. */
+ if (*vcom->vop->partName == 0) {
+ res->hdr.reason = FSYNC_BAD_PART;
+ code = SYNC_FAILED;
+ goto done;
+ }
+
/* check DAFS permissions */
vp = VLookupVolume_r(&error, vcom->vop->volume, NULL);
if (vp &&
}
#ifdef AFS_DEMAND_ATTACH_FS
- /* first, check to see whether we have such a volume defined */
- vp = VPreAttachVolumeById_r(&error,
- vcom->vop->partName,
- vcom->vop->volume);
+
+ if (vp &&
+ FSYNC_partMatch(vcom, vp, 0) &&
+ vp->pending_vol_op &&
+ vp->pending_vol_op->vol_op_state == FSSYNC_VolOpRunningOnline &&
+ V_attachState(vp) == VOL_STATE_ATTACHED) {
+
+ /* noop; the volume stayed online for the volume operation and we were
+ * simply told that the vol op is done. The vp we already have is fine,
+ * so avoid confusing volume routines with trying to preattach an
+ * attached volume. */
+
+ } else {
+ /* first, check to see whether we have such a volume defined */
+ vp = VPreAttachVolumeById_r(&error,
+ vcom->vop->partName,
+ vcom->vop->volume);
+ }
+
if (vp) {
VCreateReservation_r(vp);
VWaitExclusiveState_r(vp);
V_VOLUPD);
if (vp)
VPutVolume_r(vp);
+#endif /* !AFS_DEMAND_ATTACH_FS */
if (error) {
code = SYNC_DENIED;
res->hdr.reason = error;
}
-#endif /* !AFS_DEMAND_ATTACH_FS */
done:
return code;
if (vp) {
if (FSYNC_partMatch(vcom, vp, 0)) {
- /* null out salvsync control state, as it's no longer relevant */
- memset(&vp->salvage, 0, sizeof(vp->salvage));
-
VCreateReservation_r(vp);
VWaitExclusiveState_r(vp);
VDeregisterVolOp_r(vp);
if (vcom->hdr->reason == FSYNC_SALVAGE) {
FSYNC_backgroundSalvage(vp);
} else {
+ /* null out salvsync control state, as it's no longer relevant */
+ memset(&vp->salvage, 0, sizeof(vp->salvage));
VChangeState_r(vp, VOL_STATE_ERROR);
}
struct offlineInfo *p;
int i;
Error error;
+#ifndef AFS_DEMAND_ATTACH_FS
char tvolName[VMAXPATHLEN];
+#endif
VOL_LOCK;
p = OfflineVolumes[FindHandler(fd)];
for (i = 0; i < MAXOFFLINEVOLUMES; i++) {
if (p[i].volumeID) {
-
Volume *vp;
+#ifdef AFS_DEMAND_ATTACH_FS
+ vp = VPreAttachVolumeById_r(&error, p[i].partName, p[i].volumeID);
+ if (vp) {
+ VCreateReservation_r(vp);
+ VWaitExclusiveState_r(vp);
+ VDeregisterVolOp_r(vp);
+ VCancelReservation_r(vp);
+ }
+#else
tvolName[0] = OS_DIRSEPC;
sprintf(&tvolName[1], VFORMAT, afs_printable_uint32_lu(p[i].volumeID));
vp = VAttachVolumeByName_r(&error, p[i].partName, tvolName,
V_VOLUPD);
if (vp)
VPutVolume_r(vp);
+#endif /* !AFS_DEMAND_ATTACH_FS */
p[i].volumeID = 0;
}
}
VOL_UNLOCK;
RemoveHandler(fd);
-#ifdef AFS_NT40_ENV
- closesocket(fd);
-#else
- close(fd);
-#endif
+ rk_closesocket(fd);
AcceptOn();
}