vp = VLookupVolume_r(&error, vcom->vop->volume, NULL);
+ if (vp) {
+ VCreateReservation_r(vp);
+ VWaitExclusiveState_r(vp);
+ }
+
if (vp && vp->pending_vol_op) {
- osi_Assert(sizeof(FSSYNC_VolOp_info) <= res->payload.len);
- memcpy(res->payload.buf, vp->pending_vol_op, sizeof(FSSYNC_VolOp_info));
- res->hdr.response_len += sizeof(FSSYNC_VolOp_info);
+ if (!FSYNC_partMatch(vcom, vp, 1)) {
+ res->hdr.reason = FSYNC_WRONG_PART;
+ code = SYNC_FAILED;
+ } else {
+ osi_Assert(sizeof(FSSYNC_VolOp_info) <= res->payload.len);
+ memcpy(res->payload.buf, vp->pending_vol_op, sizeof(FSSYNC_VolOp_info));
+ res->hdr.response_len += sizeof(FSSYNC_VolOp_info);
+ }
} else {
if (!vp || V_attachState(vp) == VOL_STATE_DELETED) {
res->hdr.reason = FSYNC_UNKNOWN_VOLID;
}
code = SYNC_FAILED;
}
+
+ if (vp) {
+ VCancelReservation_r(vp);
+ }
return code;
}