Split do_io_request into a local store and a gateway version to make the code more obvious. Signed-off-by: Christoph Hellwig <hch at lst.de> Index: sheepdog/sheep/sdnet.c =================================================================== --- sheepdog.orig/sheep/sdnet.c 2012-05-18 09:47:08.311994966 +0200 +++ sheepdog/sheep/sdnet.c 2012-05-22 17:34:23.360873284 +0200 @@ -308,8 +308,13 @@ static void queue_request(struct request req->vnodes = get_vnode_info(); if (is_io_op(req->op)) { - req->work.fn = do_io_request; - req->work.done = io_op_done; + if (req->rq.flags & SD_FLAG_CMD_IO_LOCAL) { + req->work.fn = do_io_request; + req->work.done = io_op_done; + } else { + req->work.fn = do_gateway_request; + req->work.done = io_op_done; + } setup_access_to_local_objects(req); if (check_request(req) < 0) return; Index: sheepdog/sheep/sheep_priv.h =================================================================== --- sheepdog.orig/sheep/sheep_priv.h 2012-05-22 17:23:55.076857197 +0200 +++ sheepdog/sheep/sheep_priv.h 2012-05-22 17:34:36.692873626 +0200 @@ -269,6 +269,7 @@ int leave_cluster(void); void process_request_event_queues(void); void do_io_request(struct work *work); +void do_gateway_request(struct work *work); int forward_write_obj_req(struct request *req); int read_epoch(uint32_t *epoch, uint64_t *ctime, Index: sheepdog/sheep/store.c =================================================================== --- sheepdog.orig/sheep/store.c 2012-05-22 17:23:55.080857198 +0200 +++ sheepdog/sheep/store.c 2012-05-22 17:36:49.916877038 +0200 @@ -410,7 +410,7 @@ void do_io_request(struct work *work) { struct request *req = container_of(work, struct request, work); uint32_t epoch; - int ret = SD_RES_SUCCESS; + int ret; if (req->rq.flags & SD_FLAG_CMD_RECOVERY) epoch = req->rq.obj.tgt_epoch; @@ -420,27 +420,41 @@ void do_io_request(struct work *work) dprintf("%x, %" PRIx64" , %u\n", req->rq.opcode, req->rq.obj.oid, epoch); - if (req->rq.flags & SD_FLAG_CMD_IO_LOCAL) { - ret = do_local_io(req, epoch); + ret = do_local_io(req, epoch); + + if (ret != SD_RES_SUCCESS) + dprintf("failed: %x, %" PRIx64" , %u, %"PRIx32"\n", + req->rq.opcode, req->rq.obj.oid, epoch, ret); + req->rp.result = ret; +} + +void do_gateway_request(struct work *work) +{ + struct request *req = container_of(work, struct request, work); + int ret = SD_RES_SUCCESS; + + dprintf("%x, %" PRIx64" , %u\n", + req->rq.opcode, req->rq.obj.oid, req->rq.epoch); + + if (!sys->enable_write_cache || bypass_object_cache(req)) { + /* fix object consistency when we read the object for the first time */ + if (req->check_consistency) { + ret = fix_object_consistency(req); + if (ret != SD_RES_SUCCESS) + goto out; + } + if (req->rq.flags & SD_FLAG_CMD_WRITE) + ret = forward_write_obj_req(req); + else + ret = forward_read_obj_req(req); } else { - if (!sys->enable_write_cache || bypass_object_cache(req)) { - /* fix object consistency when we read the object for the first time */ - if (req->check_consistency) { - ret = fix_object_consistency(req); - if (ret != SD_RES_SUCCESS) - goto out; - } - if (req->rq.flags & SD_FLAG_CMD_WRITE) - ret = forward_write_obj_req(req); - else - ret = forward_read_obj_req(req); - } else - ret = handle_gateway_request(req); + ret = handle_gateway_request(req); } + out: if (ret != SD_RES_SUCCESS) dprintf("failed: %x, %" PRIx64" , %u, %"PRIx32"\n", - req->rq.opcode, req->rq.obj.oid, epoch, ret); + req->rq.opcode, req->rq.obj.oid, req->rq.epoch, ret); req->rp.result = ret; } |