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 | ||
