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));
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;
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;
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);
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 # */