[Devel] [PATCH RHEL7 COMMIT] fs/fuse kio_pcs: handle old map in pcs_cs_submit()
Konstantin Khorenko
khorenko at virtuozzo.com
Wed Jun 27 18:49:19 MSK 2018
The commit is pushed to "branch-rh7-3.10.0-862.3.2.vz7.61.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-862.3.2.vz7.61.5
------>
commit 24003095f3d9a60bd0c5e3155217b18ac2084bc0
Author: Pavel Butsykin <pbutsykin at virtuozzo.com>
Date: Wed Jun 27 18:49:19 2018 +0300
fs/fuse kio_pcs: handle old map in pcs_cs_submit()
The map may be dead or updated at the time of sending cs request. We can
immediately complete such request with PCS_ERR_CSD_STALE_MAP, there is no need
to send this request and wait for a response with an error.
https://pmc.acronis.com/browse/VSTOR-11315
Signed-off-by: Pavel Butsykin <pbutsykin at virtuozzo.com>
Reviewed-by: Kirill Tkhai <ktkhai at virtuozzo.com>
Acked-by: Alexey Kuznetsov <kuznet at virtuozzo.com>
---
fs/fuse/kio/pcs/pcs_cs.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/fs/fuse/kio/pcs/pcs_cs.c b/fs/fuse/kio/pcs/pcs_cs.c
index 71b7d686dfdc..6efa54f0056f 100644
--- a/fs/fuse/kio/pcs/pcs_cs.c
+++ b/fs/fuse/kio/pcs/pcs_cs.c
@@ -491,6 +491,7 @@ void pcs_cs_submit(struct pcs_cs *cs, struct pcs_int_request *ireq)
struct pcs_msg *msg = &ireq->iochunk.msg;
struct pcs_cs_iohdr *ioh;
struct pcs_cs_list *csl = ireq->iochunk.csl;
+ struct pcs_map_entry *map = ireq->iochunk.map; /* ireq keeps reference to map */
msg->private = cs;
@@ -535,12 +536,14 @@ void pcs_cs_submit(struct pcs_cs *cs, struct pcs_int_request *ireq)
msg->done = cs_sent;
msg->get_iter = cs_get_data;
- /* TODO
- * Theoretically at this moment this map may already becomes dead
- * what should I do then?
- * This may happens only in case of aio/dio vs truncate race
- */
- BUG_ON(ireq->iochunk.map->state & PCS_MAP_DEAD);
+ if ((map->state & PCS_MAP_DEAD) || (map->cs_list != csl)) {
+ ireq->error.value = PCS_ERR_CSD_STALE_MAP;
+ ireq->error.remote = 1;
+ ireq->error.offender = csl->cs[0].info.id;
+ ireq_complete(ireq);
+ return;
+ }
+
ioh->map_version = csl->version;
if (pcs_req_direction(ireq->iochunk.cmd))
msg->timeout = csl->write_timeout;
More information about the Devel
mailing list