From ee04c5657c3bb161850cf1f1d14a2fec87436a28 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 21 Sep 2009 16:40:00 -0700 Subject: [PATCH] kclient: include object name in DATALOC ioctl result --- src/client/test_ioctls.c | 7 ++++--- src/kernel/ioctl.c | 11 ++++++++--- src/kernel/ioctl.h | 4 +++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/client/test_ioctls.c b/src/client/test_ioctls.c index 93b9bcc4d4ec0..fdbbc6c30f9b6 100644 --- a/src/client/test_ioctls.c +++ b/src/client/test_ioctls.c @@ -55,9 +55,10 @@ int main(int argc, char **argv) return 1; } - printf("dataloc: file_offset %lld\n", dl.file_offset); - printf(" object_offset %lld\n object_size %lld object_no %lld\n", - dl.object_offset, dl.object_size, dl.object_no); + printf("dataloc:\n"); + printf(" file_offset %lld (of object start)\n", dl.file_offset); + printf(" object '%s'\n object_offset %lld\n object_size %lld object_no %lld\n", + dl.object_name, dl.object_offset, dl.object_size, dl.object_no); printf(" block_offset %lld\n block_size %lld\n", dl.block_offset, dl.block_size); printf(" osd%lld %u.%u.%u.%u:%u\n", dl.osd, IPQUADPORT(dl.osd_addr)); diff --git a/src/kernel/ioctl.c b/src/kernel/ioctl.c index f6278933b7b98..9cf05fd9a58b4 100644 --- a/src/kernel/ioctl.c +++ b/src/kernel/ioctl.c @@ -86,6 +86,10 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg) return err; } +/* + * Return object name, size/offset information, and location (OSD + * number, network address) for a given file offset. + */ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg) { struct ceph_ioctl_dataloc dl; @@ -94,7 +98,6 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg) struct ceph_osd_client *osdc = &ceph_client(inode->i_sb)->osdc; u64 len = 1, olen; u64 tmp; - char oid[80]; struct ceph_object_layout ol; union ceph_pg pgid; @@ -113,8 +116,10 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg) tmp = dl.object_offset; dl.block_offset = do_div(tmp, dl.block_size); - sprintf(oid, "%llx.%08llx", ceph_ino(inode), dl.object_no); - ceph_calc_object_layout(&ol, oid, &ci->i_layout, osdc->osdmap); + snprintf(dl.object_name, sizeof(dl.object_name), "%llx.%08llx", + ceph_ino(inode), dl.object_no); + ceph_calc_object_layout(&ol, dl.object_name, &ci->i_layout, + osdc->osdmap); pgid.pg64 = le64_to_cpu(ol.ol_pgid); dl.osd = ceph_calc_pg_primary(osdc->osdmap, pgid); diff --git a/src/kernel/ioctl.h b/src/kernel/ioctl.h index d954c6ae76b84..86866707f611f 100644 --- a/src/kernel/ioctl.h +++ b/src/kernel/ioctl.h @@ -18,13 +18,15 @@ struct ceph_ioctl_layout { struct ceph_ioctl_layout) /* - * Extract identity, address of the OSD storing a given file offset. + * Extract identity, address of the OSD and object storing a given + * file offset. */ struct ceph_ioctl_dataloc { __u64 file_offset; /* in+out: file offset */ __u64 object_offset; /* out: offset in object */ __u64 object_no; /* out: object # */ __u64 object_size; /* out: object size */ + char object_name[64]; /* out: object name */ __u64 block_offset; /* out: offset in block */ __u64 block_size; /* out: block length */ __s64 osd; /* out: osd # */ -- 2.39.5