diff options
-rw-r--r-- | drivers/block/rbd.c | 15 |
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 | ||
1227 | static void obj_request_done_set(struct rbd_obj_request *obj_request) | 1227 | static 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 | ||
1233 | static bool obj_request_done_test(struct rbd_obj_request *obj_request) | 1242 | static 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 | ||