Signed-off-by: Christoph Hellwig <[email protected]>
---
sheep/gateway.c | 26 +++++++++++++++++---------
sheep/ops.c | 3 +++
sheep/sheep_priv.h | 5 +++++
3 files changed, 25 insertions(+), 9 deletions(-)
Index: sheepdog/sheep/gateway.c
===================================================================
--- sheepdog.orig/sheep/gateway.c 2012-07-04 15:16:07.343715309 +0200
+++ sheepdog/sheep/gateway.c 2012-07-04 15:23:55.840379176 +0200
@@ -20,7 +20,7 @@
*
* Return success if any read succeed.
*/
-static int forward_read_obj_req(struct request *req)
+int gateway_read_obj(struct request *req)
{
int i, ret = SD_RES_SUCCESS;
unsigned wlen, rlen;
@@ -215,7 +215,7 @@ write_info_advance(struct write_info *wi
wi->nr_sent++;
}
-static int forward_write_obj_req(struct request *req)
+static int do_gateway_write_obj(struct request *req, bool create)
{
int i, err_ret = SD_RES_SUCCESS, ret, local = -1;
unsigned wlen;
@@ -234,7 +234,7 @@ static int forward_write_obj_req(struct
write_info_init(&wi);
memcpy(&fwd_hdr, &req->rq, sizeof(fwd_hdr));
- if (req->rq.opcode == SD_OP_CREATE_AND_WRITE_OBJ)
+ if (create)
fwd_hdr.opcode = SD_OP_CREATE_AND_WRITE_PEER;
else
fwd_hdr.opcode = SD_OP_WRITE_PEER;
@@ -272,7 +272,7 @@ static int forward_write_obj_req(struct
if (local != -1 && err_ret == SD_RES_SUCCESS) {
v = obj_vnodes[local];
- if (req->rq.opcode == SD_OP_CREATE_AND_WRITE_OBJ)
+ if (create)
ret = peer_create_and_write_obj(req);
else
ret = peer_write_obj(req);
@@ -293,18 +293,26 @@ static int forward_write_obj_req(struct
return err_ret;
}
+int gateway_write_obj(struct request *req)
+{
+ return do_gateway_write_obj(req, false);
+}
+
+int gateway_create_and_write_obj(struct request *req)
+{
+ return do_gateway_write_obj(req, true);
+}
+
void do_gateway_request(struct work *work)
{
struct request *req = container_of(work, struct request, work);
- int ret;
+ int ret = SD_RES_SUCCESS;
dprintf("%x, %" PRIx64" , %u\n",
req->rq.opcode, req->rq.obj.oid, req->rq.epoch);
- if (req->rq.flags & SD_FLAG_CMD_WRITE)
- ret = forward_write_obj_req(req);
- else
- ret = forward_read_obj_req(req);
+ if (has_process_work(req->op))
+ ret = do_process_work(req);
if (ret != SD_RES_SUCCESS)
dprintf("failed: %x, %" PRIx64" , %u, %"PRIx32"\n",
Index: sheepdog/sheep/ops.c
===================================================================
--- sheepdog.orig/sheep/ops.c 2012-07-04 15:16:07.323715309 +0200
+++ sheepdog/sheep/ops.c 2012-07-04 15:22:37.847046309 +0200
@@ -921,14 +921,17 @@ static struct sd_op_template sd_ops[] =
/* gateway I/O operations */
[SD_OP_CREATE_AND_WRITE_OBJ] = {
.type = SD_OP_TYPE_GATEWAY,
+ .process_work = gateway_create_and_write_obj,
},
[SD_OP_READ_OBJ] = {
.type = SD_OP_TYPE_GATEWAY,
+ .process_work = gateway_read_obj,
},
[SD_OP_WRITE_OBJ] = {
.type = SD_OP_TYPE_GATEWAY,
+ .process_work = gateway_write_obj,
},
/* peer I/O operations */
Index: sheepdog/sheep/sheep_priv.h
===================================================================
--- sheepdog.orig/sheep/sheep_priv.h 2012-07-04 15:16:07.327048643 +0200
+++ sheepdog/sheep/sheep_priv.h 2012-07-04 15:22:37.847046309 +0200
@@ -367,6 +367,11 @@ static inline int sys_can_halt(void)
return sys_stat_ok() && !sys_flag_nohalt();
}
+/* gateway operations */
+int gateway_read_obj(struct request *req);
+int gateway_write_obj(struct request *req);
+int gateway_create_and_write_obj(struct request *req);
+
/* backend store */
int peer_read_obj(struct request *req);
int peer_write_obj(struct request *req);
--
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog