FSYNC_com_VolDone(FSSYNC_VolOp_command * vcom, SYNC_response * res)
{
afs_int32 code = SYNC_FAILED;
-#ifdef AFS_DEMAND_ATTACH_FS
Error error;
Volume * vp;
-#endif
if (SYNC_verifyProtocolString(vcom->vop->partName, sizeof(vcom->vop->partName))) {
res->hdr.reason = SYNC_REASON_MALFORMED_PACKET;
if (vcom->v)
vcom->v->volumeID = 0;
-#ifdef AFS_DEMAND_ATTACH_FS
vp = VLookupVolume_r(&error, vcom->vop->volume, NULL);
if (vp) {
if (FSYNC_partMatch(vcom, vp, 1)) {
+#ifdef AFS_DEMAND_ATTACH_FS
if ((V_attachState(vp) == VOL_STATE_UNATTACHED) ||
(V_attachState(vp) == VOL_STATE_PREATTACHED)) {
- VChangeState_r(vp, VOL_STATE_UNATTACHED);
+
+ /* 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);
+
+ /* Someday we should free the vp, too, after about 2 hours,
+ * possibly by putting the vp back on the VLRU. */
+
code = SYNC_OK;
} else {
code = SYNC_DENIED;
res->hdr.reason = FSYNC_BAD_STATE;
}
+#else /* AFS_DEMAND_ATTACH_FS */
+ if (!vp->specialStatus) {
+ vp->specialStatus = VNOVOL;
+ }
+ code = SYNC_OK;
+#endif /* !AFS_DEMAND_ATTACH_FS */
} else {
code = SYNC_OK; /* XXX is this really a good idea? */
res->hdr.reason = FSYNC_WRONG_PART;
} else {
res->hdr.reason = FSYNC_UNKNOWN_VOLID;
}
-#endif
done:
return code;
case 0:
if ((V_attachState(vp) != VOL_STATE_UNATTACHED) &&
(V_attachState(vp) != VOL_STATE_ERROR) &&
+ (V_attachState(vp) != VOL_STATE_DELETED) &&
(V_attachState(vp) != VOL_STATE_PREATTACHED)) {
break;
}
case VOL_STATE_ERROR:
VChangeState_r(vp, VOL_STATE_UNATTACHED);
case VOL_STATE_UNATTACHED:
+ case VOL_STATE_DELETED:
break;
case VOL_STATE_GOING_OFFLINE:
case VOL_STATE_SHUTTING_DOWN:
/* check to see if pre-attach already happened */
if (vp &&
- (V_attachState(vp) != VOL_STATE_UNATTACHED) &&
+ (V_attachState(vp) != VOL_STATE_UNATTACHED) &&
+ (V_attachState(vp) != VOL_STATE_DELETED) &&
(V_attachState(vp) != VOL_STATE_PREATTACHED) &&
!VIsErrorState(V_attachState(vp))) {
/*
* - GOING_OFFLINE
* - SALVAGING
* - ERROR
+ * - DELETED
*/
if (vp->specialStatus == VBUSY)
/* pre-attach volume if it hasn't been done yet */
if (!vp ||
(V_attachState(vp) == VOL_STATE_UNATTACHED) ||
+ (V_attachState(vp) == VOL_STATE_DELETED) ||
(V_attachState(vp) == VOL_STATE_ERROR)) {
svp = vp;
vp = VPreAttachVolumeByVp_r(ec, partp, vp, volumeId);
/* pre-attach volume if it hasn't been done yet */
if (!vp ||
(V_attachState(vp) == VOL_STATE_UNATTACHED) ||
+ (V_attachState(vp) == VOL_STATE_DELETED) ||
(V_attachState(vp) == VOL_STATE_ERROR)) {
nvp = VPreAttachVolumeByVp_r(ec, partp, vp, volumeId);
if (*ec) {
}
/*
- * short circuit with VOFFLINE in the following circumstances:
- *
- * - VOL_STATE_UNATTACHED
+ * short circuit with VOFFLINE for VOL_STATE_UNATTACHED and
+ * VNOVOL for VOL_STATE_DELETED
*/
- if (V_attachState(vp) == VOL_STATE_UNATTACHED) {
+ if ((V_attachState(vp) == VOL_STATE_UNATTACHED) ||
+ (V_attachState(vp) == VOL_STATE_DELETED)) {
if (vp->specialStatus) {
*ec = vp->specialStatus;
+ } else if (V_attachState(vp) == VOL_STATE_DELETED) {
+ *ec = VNOVOL;
} else {
*ec = VOFFLINE;
}
assert((V_attachState(vp) != VOL_STATE_ATTACHED) &&
(V_attachState(vp) != VOL_STATE_FREED) &&
(V_attachState(vp) != VOL_STATE_PREATTACHED) &&
- (V_attachState(vp) != VOL_STATE_UNATTACHED));
+ (V_attachState(vp) != VOL_STATE_UNATTACHED) &&
+ (V_attachState(vp) != VOL_STATE_DELETED));
/* valid states:
*
case VOL_STATE_GOING_OFFLINE:
case VOL_STATE_SHUTTING_DOWN:
case VOL_STATE_SALVAGING:
+ case VOL_STATE_DELETED:
volume_LRU.q[vp->vlru.idx].len--;
/* create and cancel a reservation to
VOL_STATE_VNODE_CLOSE = 17, /**< volume is busy closing vnodes */
VOL_STATE_VNODE_RELEASE = 18, /**< volume is busy releasing vnodes */
VOL_STATE_VLRU_ADD = 19, /**< volume is busy being added to a VLRU queue */
+ VOL_STATE_DELETED = 20, /**< volume has been deleted by the volserver */
/* please add new states directly above this line */
- VOL_STATE_FREED = 20, /**< debugging aid */
- VOL_STATE_COUNT = 21, /**< total number of valid states */
+ VOL_STATE_FREED = 21, /**< debugging aid */
+ VOL_STATE_COUNT = 22, /**< total number of valid states */
} VolState;
/**