summaryrefslogtreecommitdiffstats
path: root/drivers/block/rbd.c
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2013-02-11 13:33:24 -0500
committerSage Weil <sage@inktank.com>2013-05-02 00:18:44 -0400
commit926f9b3f085cec8be0cbf4dcc66c28b5ac49cc14 (patch)
tree4b086e2c9f7eef62680e02aa570a8b5b779318ee /drivers/block/rbd.c
parent1217857fbf0fe6245aa0ce775480a759a0bbadeb (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.c58
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
173enum obj_req_flags {
174 OBJ_REQ_DONE, /* completion flag: not done = 0, done = 1 */
175};
176
173struct rbd_obj_request { 177struct 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 */
1084static 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
1096static 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
1075static void rbd_obj_request_get(struct rbd_obj_request *obj_request) 1102static 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
1195static void obj_request_done_init(struct rbd_obj_request *obj_request)
1196{
1197 atomic_set(&obj_request->done, 0);
1198 smp_wmb();
1199}
1200
1201static 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
1216static 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