{
/* find either-of <object_name>, <object_name/>, only one of
* which should exist; atomicity? */
+ using std::get;
+
LookupFHResult fhr{nullptr, 0};
+ RGWFileHandle::directory* d = parent->get_directory();
+ if (! d->name_cache.empty()) {
+ RGWFileHandle::dirent_string name{path};
+ const auto& diter = d->name_cache.find(name);
+ if (diter != d->name_cache.end()) {
+ fhr = lookup_fh(parent, path,
+ RGWFileHandle::FLAG_CREATE|
+ ((diter->second == RGW_FS_TYPE_DIRECTORY) ?
+ RGWFileHandle::FLAG_DIRECTORY :
+ RGWFileHandle::FLAG_NONE));
+ if (get<0>(fhr))
+ return fhr;
+ }
+ }
std::string object_name{path};
-
for (auto ix : { 0, 1 }) {
switch (ix) {
case 0:
private:
RGWFileHandle(RGWLibFS* _fs, uint32_t fs_inst)
- : fs(_fs), bucket(nullptr), parent(nullptr), depth(0),
- flags(FLAG_ROOT)
+ : fs(_fs), bucket(nullptr), parent(nullptr), variant_type{directory()},
+ depth(0), flags(FLAG_ROOT)
{
/* root */
fh.fh_type = RGW_FS_TYPE_DIRECTORY;
if (parent->is_root()) {
fh.fh_type = RGW_FS_TYPE_DIRECTORY;
+ variant_type = directory();
flags |= FLAG_BUCKET;
} else {
bucket = (parent->flags & FLAG_BUCKET) ? parent
: parent->bucket;
- fh.fh_type = (flags & FLAG_DIRECTORY) ? RGW_FS_TYPE_DIRECTORY
- : RGW_FS_TYPE_FILE;
+ if (flags & FLAG_DIRECTORY) {
+ fh.fh_type = RGW_FS_TYPE_DIRECTORY;
+ variant_type = directory();
+ } else {
+ fh.fh_type = RGW_FS_TYPE_FILE;
+ variant_type = file();
+ }
}
depth = parent->depth + 1;
return fhk;
}
+ directory* get_directory() {
+ return get<directory>(&variant_type);
+ }
+
size_t get_size() const { return state.size; }
uint16_t get_depth() const { return depth; }