libceph: drop msg argument from ceph_osdc_callback_t
authorIlya Dryomov <idryomov@gmail.com>
Thu, 28 Apr 2016 14:07:24 +0000 (16:07 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 25 May 2016 22:36:27 +0000 (00:36 +0200)
finish_read(), its only user, uses it to get to hdr.data_len, which is
what ->r_result is set to on success.  This gains us the ability to
safely call callbacks from contexts other than reply, e.g. map check.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
drivers/block/rbd.c
fs/ceph/addr.c
fs/ceph/file.c
include/linux/ceph/osd_client.h
net/ceph/osd_client.c

index 0e598916e04820780b1f8b576d4c5846d71e7575..82b03aa509e66e950e530a681fac8270d67af66b 100644 (file)
@@ -1828,13 +1828,12 @@ static void rbd_osd_call_callback(struct rbd_obj_request *obj_request)
                obj_request_done_set(obj_request);
 }
 
-static void rbd_osd_req_callback(struct ceph_osd_request *osd_req,
-                               struct ceph_msg *msg)
+static void rbd_osd_req_callback(struct ceph_osd_request *osd_req)
 {
        struct rbd_obj_request *obj_request = osd_req->r_priv;
        u16 opcode;
 
-       dout("%s: osd_req %p msg %p\n", __func__, osd_req, msg);
+       dout("%s: osd_req %p\n", __func__, osd_req);
        rbd_assert(osd_req == obj_request->osd_req);
        if (obj_request_img_data_test(obj_request)) {
                rbd_assert(obj_request->img_request);
index 59b3c3fbd3bd793d7a90fe7fdc47cc137499f11c..a11756a39471003406e08a204df40d0533c7a297 100644 (file)
@@ -257,12 +257,12 @@ static int ceph_readpage(struct file *filp, struct page *page)
 /*
  * Finish an async read(ahead) op.
  */
-static void finish_read(struct ceph_osd_request *req, struct ceph_msg *msg)
+static void finish_read(struct ceph_osd_request *req)
 {
        struct inode *inode = req->r_inode;
        struct ceph_osd_data *osd_data;
-       int rc = req->r_result;
-       int bytes = le32_to_cpu(msg->hdr.data_len);
+       int rc = req->r_result <= 0 ? req->r_result : 0;
+       int bytes = req->r_result >= 0 ? req->r_result : 0;
        int num_pages;
        int i;
 
@@ -598,8 +598,7 @@ static void ceph_release_pages(struct page **pages, int num)
  * If we get an error, set the mapping error bit, but not the individual
  * page error bits.
  */
-static void writepages_finish(struct ceph_osd_request *req,
-                             struct ceph_msg *msg)
+static void writepages_finish(struct ceph_osd_request *req)
 {
        struct inode *inode = req->r_inode;
        struct ceph_inode_info *ci = ceph_inode(inode);
index 52e4b72dd5debefeea2ecaacc128eb9f73581ceb..e75fd0b028e99561b73e8b0ac370dc52df1e1af4 100644 (file)
@@ -616,8 +616,7 @@ static void ceph_aio_complete(struct inode *inode,
        kfree(aio_req);
 }
 
-static void ceph_aio_complete_req(struct ceph_osd_request *req,
-                                 struct ceph_msg *msg)
+static void ceph_aio_complete_req(struct ceph_osd_request *req)
 {
        int rc = req->r_result;
        struct inode *inode = req->r_inode;
@@ -740,7 +739,7 @@ static void ceph_aio_retry_work(struct work_struct *work)
 out:
        if (ret < 0) {
                req->r_result = ret;
-               ceph_aio_complete_req(req, NULL);
+               ceph_aio_complete_req(req);
        }
 
        ceph_put_snap_context(snapc);
@@ -961,7 +960,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
                                                              req, false);
                        if (ret < 0) {
                                req->r_result = ret;
-                               ceph_aio_complete_req(req, NULL);
+                               ceph_aio_complete_req(req);
                        }
                }
                return -EIOCBQUEUED;
index 67a37d98e0ca7f00b4595a1120aeca52852f01b5..3bebd60e7f9fcecb6328b3c4cf89c2ece6555b38 100644 (file)
@@ -20,8 +20,7 @@ struct ceph_osd_client;
 /*
  * completion callback for async writepages
  */
-typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *,
-                                    struct ceph_msg *);
+typedef void (*ceph_osdc_callback_t)(struct ceph_osd_request *);
 typedef void (*ceph_osdc_unsafe_callback_t)(struct ceph_osd_request *, bool);
 
 #define CEPH_HOMELESS_OSD      -1
index 8a008f083283d61f8f6b219fc98bb84695104ffb..2a30c0bb30459a755d2b8a987ac74ab4f114235f 100644 (file)
@@ -2048,7 +2048,7 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg)
                    result >= 0 && !(flags & CEPH_OSD_FLAG_ONDISK))
                        req->r_unsafe_callback(req, true);
                if (req->r_callback)
-                       req->r_callback(req, msg);
+                       req->r_callback(req);
                else
                        complete_all(&req->r_completion);
        }
@@ -2072,7 +2072,7 @@ bad_put:
        req->r_result = -EIO;
        __unregister_request(osdc, req);
        if (req->r_callback)
-               req->r_callback(req, msg);
+               req->r_callback(req);
        else
                complete_all(&req->r_completion);
        complete_request(req);