int ceph_get_path_pool(struct ceph_mount_info *cmount, const char *path);
/**
- * Get the name of the pool a file is stored in,
+ * Get the name of the pool a opened file is stored in,
*
* Write the name of the file's pool to the buffer. If buflen is 0, return
* a suggested length for the buffer.
*/
int ceph_get_file_pool_name(struct ceph_mount_info *cmount, int fh, char *buf, size_t buflen);
+/**
+ * Get the name of the pool a file is stored in
+ *
+ * Write the name of the file's pool to the buffer. If buflen is 0, return
+ * a suggested length for the buffer.
+ *
+ * @param cmount the ceph mount handle to use.
+ * @param path the path of the file/directory
+ * @param buf buffer to store the name in
+ * @param buflen size of the buffer
+ * @returns length in bytes of the pool name, or -ERANGE if the buffer is not large enough.
+ */
+int ceph_get_path_pool_name(struct ceph_mount_info *cmount, const char *path, char *buf, size_t buflen);
+
/**
* Get the file layout from an open file descriptor.
*
return name.length();
}
+extern "C" int ceph_get_path_pool_name(struct ceph_mount_info *cmount, const char *path, char *buf, size_t len)
+{
+ struct ceph_file_layout l;
+ int r;
+
+ if (!cmount->is_mounted())
+ return -ENOTCONN;
+ r = cmount->get_client()->describe_layout(path, &l);
+ if (r < 0)
+ return r;
+ string name = cmount->get_client()->get_pool_name(l.fl_pg_pool);
+ if (len == 0)
+ return name.length();
+ if (name.length() > len)
+ return -ERANGE;
+ strncpy(buf, name.c_str(), len);
+ return name.length();
+}
+
extern "C" int ceph_get_file_layout(struct ceph_mount_info *cmount, int fh, int *stripe_unit, int *stripe_count, int *object_size, int *pg_pool)
{
struct ceph_file_layout l;