Skip to content

Commit

Permalink
ceph: propagate layout error on osd request creation
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sage Weil authored and Alex Elder committed Oct 1, 2012
1 parent d63b77f commit 6816282
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 12 deletions.
8 changes: 4 additions & 4 deletions fs/ceph/addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -832,8 +832,8 @@ static int ceph_writepages_start(struct address_space *mapping,
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;
}
Expand Down
4 changes: 2 additions & 2 deletions fs/ceph/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -536,8 +536,8 @@ static ssize_t ceph_sync_write(struct file *file, const char __user *data,
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);
Expand Down
15 changes: 9 additions & 6 deletions net/ceph/osd_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 6816282

Please sign in to comment.