A cache hit is not necessarily a writable hit. With S / 0, C0 can read X but cannot modify it while C1 also reads it. Here the question is which part of the miss service is absent: no data refill is needed.
Trace: Epochs and Serialization. Same roles: from the MSI checkpoint C0 S / 0, C1 S / 0, H S{C0,C1}, memory = 0, C0 sends GetM and keeps its read-only value while waiting in SM^D (loads hit, stores stall). H sends Inv to C1, C1 answers Inv-Ack to H, and H grants M with permission-only Data. Four serial legs, because acks go to H, and memory is not involved.
The step that matters here is the last one. The grant carries no line: it gives C0 write permission and dirty responsibility for bytes C0 already holds, even before a local store changes any bits.
The permission-only response is safe because C0's S copy stayed valid throughout this transaction. If C0 lost its copy while waiting, this no-refill path could not complete as drawn: the request would need data. That race is handled later in the course. Never assume the requester still holds data merely because its request was an upgrade.
Fewer bytes is not fewer messages: removing the refill does not remove the invalidation round trip. Neither a fixed delay nor a shared value of 0 can replace the Inv-Ack.
No. A grant carries permission, not the missing bytes. The controller must notice that case and fetch the data or retry. This example excludes that race.