diff options
Diffstat (limited to 'drivers')
-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 3cc003b2661..bd6078bf99d 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) static void obj_request_done_set(struct rbd_obj_request *obj_request) { - atomic_set(&obj_request->done, 1); - smp_wmb(); + int done; + + done = atomic_inc_return(&obj_request->done); + if (done > 1) { + struct rbd_img_request *img_request = obj_request->img_request; + struct rbd_device *rbd_dev; + + rbd_dev = img_request ? img_request->rbd_dev : NULL; + rbd_warn(rbd_dev, "obj_request %p was already done\n", + obj_request); + } } static bool obj_request_done_test(struct rbd_obj_request *obj_request) { - smp_rmb(); + smp_mb(); return atomic_read(&obj_request->done) != 0; } |