Merge pull request #16275 from linuxbox2/wip-rgw-readdir-cookie

rgw_file: permit dirent offset computation

Reviewed-by: Casey Bodley <cbodley@redhat.com>
This commit is contained in:
Yuri Weinstein 2017-07-19 08:43:16 -07:00 committed by GitHub
commit 35bc5f4165
3 changed files with 33 additions and 1 deletions

View File

@ -27,7 +27,7 @@ extern "C" {
#define LIBRGW_FILE_VER_MAJOR 1
#define LIBRGW_FILE_VER_MINOR 1
#define LIBRGW_FILE_VER_EXTRA 3
#define LIBRGW_FILE_VER_EXTRA 4
#define LIBRGW_FILE_VERSION(maj, min, extra) ((maj << 16) + (min << 8) + extra)
#define LIBRGW_FILE_VERSION_CODE LIBRGW_FILE_VERSION(LIBRGW_FILE_VER_MAJOR, LIBRGW_FILE_VER_MINOR, LIBRGW_FILE_VER_EXTRA)
@ -217,6 +217,14 @@ int rgw_readdir(struct rgw_fs *rgw_fs,
rgw_readdir_cb rcb, void *cb_arg, bool *eof,
uint32_t flags);
/* project offset of dirent name */
#define RGW_DIRENT_OFFSET_FLAG_NONE 0x0000
int rgw_dirent_offset(struct rgw_fs *rgw_fs,
struct rgw_file_handle *parent_fh,
const char *name, int64_t *offset,
uint32_t flags);
/*
get unix attributes for object
*/

View File

@ -1846,6 +1846,22 @@ int rgw_readdir(struct rgw_fs *rgw_fs,
return rc;
}
/* project offset of dirent name */
int rgw_dirent_offset(struct rgw_fs *rgw_fs,
struct rgw_file_handle *parent_fh,
const char *name, int64_t *offset,
uint32_t flags)
{
RGWFileHandle* parent = get_rgwfh(parent_fh);
if ((! parent)) {
/* bad parent */
return -EINVAL;
}
std::string sname{name};
int rc = parent->offset_of(sname, offset, flags);
return rc;
}
/*
read data from file
*/

View File

@ -505,6 +505,14 @@ namespace rgw {
return nullptr;
}
int offset_of(const std::string& name, int64_t *offset, uint32_t flags) {
if (unlikely(! is_dir())) {
return -EINVAL;
}
*offset = XXH64(name.c_str(), name.length(), fh_key::seed);
return 0;
}
bool is_open() const { return flags & FLAG_OPEN; }
bool is_root() const { return flags & FLAG_ROOT; }
bool is_bucket() const { return flags & FLAG_BUCKET; }