aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/rbd.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 3cc003b26610..bd6078bf99d3 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -1226,13 +1226,22 @@ static void obj_request_done_init(struct rbd_obj_request *obj_request)
1226 1226
1227static void obj_request_done_set(struct rbd_obj_request *obj_request) 1227static void obj_request_done_set(struct rbd_obj_request *obj_request)
1228{ 1228{
1229 atomic_set(&obj_request->done, 1); 1229 int done;
1230 smp_wmb(); 1230
1231 done = atomic_inc_return(&obj_request->done);
1232 if (done > 1) {
1233 struct rbd_img_request *img_request = obj_request->img_request;
1234 struct rbd_device *rbd_dev;
1235
1236 rbd_dev = img_request ? img_request->rbd_dev : NULL;
1237 rbd_warn(rbd_dev, "obj_request %p was already done\n",
1238 obj_request);
1239 }
1231} 1240}
1232 1241
1233static bool obj_request_done_test(struct rbd_obj_request *obj_request) 1242static bool obj_request_done_test(struct rbd_obj_request *obj_request)
1234{ 1243{
1235 smp_rmb(); 1244 smp_mb();
1236 return atomic_read(&obj_request->done) != 0; 1245 return atomic_read(&obj_request->done) != 0;
1237} 1246}
1238 1247