Revision ae8c75f4 xseg/peers/user/mt-vlmcd.c
b/xseg/peers/user/mt-vlmcd.c | ||
---|---|---|
255 | 255 |
return 0; |
256 | 256 |
} |
257 | 257 |
|
258 |
static int should_freeze_volume(struct xseg_request *req) |
|
259 |
{ |
|
260 |
if (req->op == X_CLOSE || req->op == X_SNAPSHOT || |
|
261 |
(req->op == X_WRITE && !req->size && (req->flags & XF_FLUSH))) |
|
262 |
return 1; |
|
263 |
return 0; |
|
264 |
} |
|
265 |
|
|
258 | 266 |
static int do_accepted_pr(struct peerd *peer, struct peer_req *pr) |
259 | 267 |
{ |
260 | 268 |
struct vlmcd *vlmc = __get_vlmcd(peer); |
... | ... | |
283 | 291 |
return -1; |
284 | 292 |
} |
285 | 293 |
|
286 |
if (pr->req->op == X_CLOSE || pr->req->op == X_SNAPSHOT){
|
|
294 |
if (should_freeze_volume(pr->req)){
|
|
287 | 295 |
XSEGLOG2(&lc, I, "Freezing volume %s", vi->name); |
288 | 296 |
vi->flags |= VF_VOLUME_FREEZED; |
289 | 297 |
if (vi->active_reqs){ |
... | ... | |
299 | 307 |
//assert vi->pending_pr == pr |
300 | 308 |
vi->pending_pr = NULL; |
301 | 309 |
} |
310 |
|
|
302 | 311 |
} |
303 | 312 |
|
304 | 313 |
vi->active_reqs++; |
... | ... | |
309 | 318 |
(pr->req->flags & (XF_FLUSH|XF_FUA))){ |
310 | 319 |
//hanlde flush requests here, so we don't mess with mapper |
311 | 320 |
//because of the -1 offset |
321 |
vi->flags &= ~VF_VOLUME_FREEZED; |
|
312 | 322 |
XSEGLOG2(&lc, I, "Completing flush request"); |
313 | 323 |
pr->req->serviced = pr->req->size; |
314 | 324 |
conclude_pr(peer, pr); |
Also available in: Unified diff