/* nothing much to do if we're leaving the volume offline */
#ifdef AFS_DEMAND_ATTACH_FS
if (vp) {
+ VCreateReservation_r(vp);
+ VWaitExclusiveState_r(vp);
+ }
+ if (vp && V_attachState(vp) != VOL_STATE_DELETED) {
if (FSYNC_partMatch(vcom, vp, 1)) {
if ((V_attachState(vp) == VOL_STATE_UNATTACHED) ||
(V_attachState(vp) == VOL_STATE_PREATTACHED)) {
code = SYNC_FAILED;
res->hdr.reason = FSYNC_UNKNOWN_VOLID;
}
+
+ if (vp) {
+ VCancelReservation_r(vp);
+ vp = NULL;
+ }
#endif
goto done;
}
vcom->vop->partName,
vcom->vop->volume);
if (vp) {
+ VCreateReservation_r(vp);
+ VWaitExclusiveState_r(vp);
VDeregisterVolOp_r(vp);
+ VCancelReservation_r(vp);
+ vp = NULL;
}
#else /* !AFS_DEMAND_ATTACH_FS */
- tvolName[0] = '/';
+ tvolName[0] = OS_DIRSEPC;
snprintf(&tvolName[1], sizeof(tvolName)-1, VFORMAT, afs_printable_uint32_lu(vcom->vop->volume));
tvolName[sizeof(tvolName)-1] = '\0';
}
#ifdef AFS_DEMAND_ATTACH_FS
+ VCreateReservation_r(vp);
VOfflineForVolOp_r(&error, vp, "A volume utility is running.");
if (error==0) {
osi_Assert(vp->nUsers==0);
vp->pending_vol_op->vol_op_state = FSSYNC_VolOpRunningOffline;
}
else {
+ VWaitExclusiveState_r(vp);
VDeregisterVolOp_r(vp);
code = SYNC_DENIED;
}
+ VCancelReservation_r(vp);
#else
VOffline_r(vp, "A volume utility is running.");
#endif
if (vp) {
if (FSYNC_partMatch(vcom, vp, 1)) {
#ifdef AFS_DEMAND_ATTACH_FS
+ VCreateReservation_r(vp);
+ VWaitExclusiveState_r(vp);
+
if ((V_attachState(vp) == VOL_STATE_UNATTACHED) ||
- (V_attachState(vp) == VOL_STATE_PREATTACHED)) {
+ (V_attachState(vp) == VOL_STATE_PREATTACHED) ||
+ VIsErrorState(V_attachState(vp))) {
/* Change state to DELETED, not UNATTACHED, so clients get
* a VNOVOL error when they try to access from now on. */
VChangeState_r(vp, VOL_STATE_DELETED);
VDeregisterVolOp_r(vp);
+ /* Volume is gone; clear out old salvage stats */
+ memset(&vp->salvage, 0, sizeof(vp->salvage));
+
/* Someday we should free the vp, too, after about 2 hours,
* possibly by putting the vp back on the VLRU. */
code = SYNC_OK;
+ } else if (V_attachState(vp) == VOL_STATE_DELETED) {
+ VDeregisterVolOp_r(vp);
+ res->hdr.reason = FSYNC_UNKNOWN_VOLID;
+
} else {
code = SYNC_DENIED;
res->hdr.reason = FSYNC_BAD_STATE;
}
+
+ VCancelReservation_r(vp);
+ vp = NULL;
#else /* AFS_DEMAND_ATTACH_FS */
if (!vp->specialStatus) {
vp->specialStatus = VNOVOL;
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) {
VChangeState_r(vp, VOL_STATE_ERROR);
}
+ VCancelReservation_r(vp);
+ vp = NULL;
+
code = SYNC_OK;
} else {
res->hdr.reason = FSYNC_WRONG_PART;
Volume *vp;
- tvolName[0] = '/';
+ 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);