ceph: propagate layout error on osd request creation
authorSage Weil <sage@inktank.com>
Tue, 25 Sep 2012 04:01:02 +0000 (21:01 -0700)
committerAlex Elder <elder@inktank.com>
Mon, 1 Oct 2012 22:20:00 +0000 (17:20 -0500)
If we are creating an osd request and get an invalid layout, return
an EINVAL to the caller.  We switch up the return to have an error
code instead of NULL implying -ENOMEM.

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>
fs/ceph/addr.c
fs/ceph/file.c
net/ceph/osd_client.c

index 452e71a1b75388b2dc06d3ad1665f36a1ed1176f..4469b63c9b7b5a60a2cf6cbf43e01804dc451b14 100644 (file)
@@ -308,8 +308,8 @@ static int start_read(struct inode *inode, struct list_head *page_list, int max)
                                    NULL, 0,
                                    ci->i_truncate_seq, ci->i_truncate_size,
                                    NULL, false, 1, 0);
-       if (!req)
-               return -ENOMEM;
+       if (IS_ERR(req))
+               return PTR_ERR(req);
 
        /* build page vector */
        nr_pages = len >> PAGE_CACHE_SHIFT;
@@ -832,8 +832,8 @@ get_more_pages:
                                            ci->i_truncate_size,
                                            &inode->i_mtime, true, 1, 0);
 
-                               if (!req) {
-                                       rc = -ENOMEM;
+                               if (IS_ERR(req)) {
+                                       rc = PTR_ERR(req);
                                        unlock_page(page);
                                        break;
                                }
index ecebbc09bfc77f8040e3ef1d572bfe10396b6498..5840d2aaed15f76788e41fcee9d71bf81e2c0322 100644 (file)
@@ -536,8 +536,8 @@ more:
                                    do_sync,
                                    ci->i_truncate_seq, ci->i_truncate_size,
                                    &mtime, false, 2, page_align);
-       if (!req)
-               return -ENOMEM;
+       if (IS_ERR(req))
+               return PTR_ERR(req);
 
        if (file->f_flags & O_DIRECT) {
                pages = ceph_get_direct_page_vector(data, num_pages, false);
index f7b56e23988c62e9ea776d9dd31b1a53c8b450e3..ccbdfbba9e532b120317ffe2e4879168ce7e03cd 100644 (file)
@@ -464,6 +464,7 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
 {
        struct ceph_osd_req_op ops[3];
        struct ceph_osd_request *req;
+       int r;
 
        ops[0].op = opcode;
        ops[0].extent.truncate_seq = truncate_seq;
@@ -482,10 +483,12 @@ struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
                                         use_mempool,
                                         GFP_NOFS, NULL, NULL);
        if (!req)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
 
        /* calculate max write size */
-       calc_layout(osdc, vino, layout, off, plen, req, ops);
+       r = calc_layout(osdc, vino, layout, off, plen, req, ops);
+       if (r < 0)
+               return ERR_PTR(r);
        req->r_file_layout = *layout;  /* keep a copy */
 
        /* in case it differs from natural (file) alignment that
@@ -1928,8 +1931,8 @@ int ceph_osdc_readpages(struct ceph_osd_client *osdc,
                                    CEPH_OSD_OP_READ, CEPH_OSD_FLAG_READ,
                                    NULL, 0, truncate_seq, truncate_size, NULL,
                                    false, 1, page_align);
-       if (!req)
-               return -ENOMEM;
+       if (IS_ERR(req))
+               return PTR_ERR(req);
 
        /* it may be a short read due to an object boundary */
        req->r_pages = pages;
@@ -1971,8 +1974,8 @@ int ceph_osdc_writepages(struct ceph_osd_client *osdc, struct ceph_vino vino,
                                    snapc, do_sync,
                                    truncate_seq, truncate_size, mtime,
                                    nofail, 1, page_align);
-       if (!req)
-               return -ENOMEM;
+       if (IS_ERR(req))
+               return PTR_ERR(req);
 
        /* it may be a short write due to an object boundary */
        req->r_pages = pages;