diff options
author | Alex Elder <elder@inktank.com> | 2013-02-11 13:33:24 -0500 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-05-02 00:18:44 -0400 |
commit | 926f9b3f085cec8be0cbf4dcc66c28b5ac49cc14 (patch) | |
tree | 4b086e2c9f7eef62680e02aa570a8b5b779318ee /drivers/block/rbd.c | |
parent | 1217857fbf0fe6245aa0ce775480a759a0bbadeb (diff) |
rbd: define an rbd object request flags field
We're going to need some more Boolean values for object requests,
so create a flags bit field and use it to record whether the request
is done.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Diffstat (limited to 'drivers/block/rbd.c')
-rw-r--r-- | drivers/block/rbd.c | 58 |
1 files changed, 29 insertions, 29 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 2d2711537537..f7046e976bb0 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -170,10 +170,15 @@ enum obj_request_type { | |||
170 | OBJ_REQUEST_NODATA, OBJ_REQUEST_BIO, OBJ_REQUEST_PAGES | 170 | OBJ_REQUEST_NODATA, OBJ_REQUEST_BIO, OBJ_REQUEST_PAGES |
171 | }; | 171 | }; |
172 | 172 | ||
173 | enum obj_req_flags { | ||
174 | OBJ_REQ_DONE, /* completion flag: not done = 0, done = 1 */ | ||
175 | }; | ||
176 | |||
173 | struct rbd_obj_request { | 177 | struct rbd_obj_request { |
174 | const char *object_name; | 178 | const char *object_name; |
175 | u64 offset; /* object start byte */ | 179 | u64 offset; /* object start byte */ |
176 | u64 length; /* bytes from offset */ | 180 | u64 length; /* bytes from offset */ |
181 | unsigned long flags; | ||
177 | 182 | ||
178 | struct rbd_img_request *img_request; | 183 | struct rbd_img_request *img_request; |
179 | u64 img_offset; /* image relative offset */ | 184 | u64 img_offset; /* image relative offset */ |
@@ -194,7 +199,6 @@ struct rbd_obj_request { | |||
194 | u64 xferred; /* bytes transferred */ | 199 | u64 xferred; /* bytes transferred */ |
195 | u64 version; | 200 | u64 version; |
196 | int result; | 201 | int result; |
197 | atomic_t done; | ||
198 | 202 | ||
199 | rbd_obj_callback_t callback; | 203 | rbd_obj_callback_t callback; |
200 | struct completion completion; | 204 | struct completion completion; |
@@ -1072,6 +1076,29 @@ out_err: | |||
1072 | return NULL; | 1076 | return NULL; |
1073 | } | 1077 | } |
1074 | 1078 | ||
1079 | /* | ||
1080 | * The default/initial value for all object request flags is 0. For | ||
1081 | * each flag, once its value is set to 1 it is never reset to 0 | ||
1082 | * again. | ||
1083 | */ | ||
1084 | static void obj_request_done_set(struct rbd_obj_request *obj_request) | ||
1085 | { | ||
1086 | if (test_and_set_bit(OBJ_REQ_DONE, &obj_request->flags)) { | ||
1087 | struct rbd_img_request *img_request = obj_request->img_request; | ||
1088 | struct rbd_device *rbd_dev; | ||
1089 | |||
1090 | rbd_dev = img_request ? img_request->rbd_dev : NULL; | ||
1091 | rbd_warn(rbd_dev, "obj_request %p already marked done\n", | ||
1092 | obj_request); | ||
1093 | } | ||
1094 | } | ||
1095 | |||
1096 | static bool obj_request_done_test(struct rbd_obj_request *obj_request) | ||
1097 | { | ||
1098 | smp_mb(); | ||
1099 | return test_bit(OBJ_REQ_DONE, &obj_request->flags) != 0; | ||
1100 | } | ||
1101 | |||
1075 | static void rbd_obj_request_get(struct rbd_obj_request *obj_request) | 1102 | static void rbd_obj_request_get(struct rbd_obj_request *obj_request) |
1076 | { | 1103 | { |
1077 | dout("%s: obj %p (was %d)\n", __func__, obj_request, | 1104 | dout("%s: obj %p (was %d)\n", __func__, obj_request, |
@@ -1192,33 +1219,6 @@ static int rbd_obj_request_wait(struct rbd_obj_request *obj_request) | |||
1192 | return wait_for_completion_interruptible(&obj_request->completion); | 1219 | return wait_for_completion_interruptible(&obj_request->completion); |
1193 | } | 1220 | } |
1194 | 1221 | ||
1195 | static void obj_request_done_init(struct rbd_obj_request *obj_request) | ||
1196 | { | ||
1197 | atomic_set(&obj_request->done, 0); | ||
1198 | smp_wmb(); | ||
1199 | } | ||
1200 | |||
1201 | static void obj_request_done_set(struct rbd_obj_request *obj_request) | ||
1202 | { | ||
1203 | int done; | ||
1204 | |||
1205 | done = atomic_inc_return(&obj_request->done); | ||
1206 | if (done > 1) { | ||
1207 | struct rbd_img_request *img_request = obj_request->img_request; | ||
1208 | struct rbd_device *rbd_dev; | ||
1209 | |||
1210 | rbd_dev = img_request ? img_request->rbd_dev : NULL; | ||
1211 | rbd_warn(rbd_dev, "obj_request %p was already done\n", | ||
1212 | obj_request); | ||
1213 | } | ||
1214 | } | ||
1215 | |||
1216 | static bool obj_request_done_test(struct rbd_obj_request *obj_request) | ||
1217 | { | ||
1218 | smp_mb(); | ||
1219 | return atomic_read(&obj_request->done) != 0; | ||
1220 | } | ||
1221 | |||
1222 | /* | 1222 | /* |
1223 | * The default/initial value for all image request flags is 0. Each | 1223 | * The default/initial value for all image request flags is 0. Each |
1224 | * is conditionally set to 1 at image request initialization time | 1224 | * is conditionally set to 1 at image request initialization time |
@@ -1475,10 +1475,10 @@ static struct rbd_obj_request *rbd_obj_request_create(const char *object_name, | |||
1475 | obj_request->object_name = memcpy(name, object_name, size); | 1475 | obj_request->object_name = memcpy(name, object_name, size); |
1476 | obj_request->offset = offset; | 1476 | obj_request->offset = offset; |
1477 | obj_request->length = length; | 1477 | obj_request->length = length; |
1478 | obj_request->flags = 0; | ||
1478 | obj_request->which = BAD_WHICH; | 1479 | obj_request->which = BAD_WHICH; |
1479 | obj_request->type = type; | 1480 | obj_request->type = type; |
1480 | INIT_LIST_HEAD(&obj_request->links); | 1481 | INIT_LIST_HEAD(&obj_request->links); |
1481 | obj_request_done_init(obj_request); | ||
1482 | init_completion(&obj_request->completion); | 1482 | init_completion(&obj_request->completion); |
1483 | kref_init(&obj_request->kref); | 1483 | kref_init(&obj_request->kref); |
1484 | 1484 | ||