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