Skip to content

Commit

Permalink
ceph: fix uninline data function
Browse files Browse the repository at this point in the history
For CEPH_OSD_CMPXATTR_MODE_U64, OSD expects the u64 to be encoded
as string in object's xattr.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
  • Loading branch information
Yan, Zheng authored and Ilya Dryomov committed Apr 22, 2015
1 parent 0ea611a commit ec137c1
Showing 1 changed file with 21 additions and 13 deletions.
34 changes: 21 additions & 13 deletions fs/ceph/addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1539,19 +1539,27 @@ int ceph_uninline_data(struct file *filp, struct page *locked_page)

osd_req_op_extent_osd_data_pages(req, 1, &page, len, 0, false, false);

err = osd_req_op_xattr_init(req, 0, CEPH_OSD_OP_CMPXATTR,
"inline_version", &inline_version,
sizeof(inline_version),
CEPH_OSD_CMPXATTR_OP_GT,
CEPH_OSD_CMPXATTR_MODE_U64);
if (err)
goto out_put;

err = osd_req_op_xattr_init(req, 2, CEPH_OSD_OP_SETXATTR,
"inline_version", &inline_version,
sizeof(inline_version), 0, 0);
if (err)
goto out_put;
{
__le64 xattr_buf = cpu_to_le64(inline_version);
err = osd_req_op_xattr_init(req, 0, CEPH_OSD_OP_CMPXATTR,
"inline_version", &xattr_buf,
sizeof(xattr_buf),
CEPH_OSD_CMPXATTR_OP_GT,
CEPH_OSD_CMPXATTR_MODE_U64);
if (err)
goto out_put;
}

{
char xattr_buf[32];
int xattr_len = snprintf(xattr_buf, sizeof(xattr_buf),
"%llu", inline_version);
err = osd_req_op_xattr_init(req, 2, CEPH_OSD_OP_SETXATTR,
"inline_version",
xattr_buf, xattr_len, 0, 0);
if (err)
goto out_put;
}

ceph_osdc_build_request(req, 0, NULL, CEPH_NOSNAP, &inode->i_mtime);
err = ceph_osdc_start_request(&fsc->client->osdc, req, false);
Expand Down

0 comments on commit ec137c1

Please sign in to comment.