mirror of
https://github.com/facebook/sapling.git
synced 2024-10-05 06:18:07 +03:00
remove the fusell namespace
Summary: Move everything in the `facebook::eden::fusell` namespace to `facebook::eden` Reviewed By: chadaustin Differential Revision: D7314458 fbshipit-source-id: db56d3e5fb898235e1376ac76077cf780d9b4698
This commit is contained in:
parent
da3c070d70
commit
bfcf4c574a
@ -7,11 +7,10 @@
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
#include "BufVec.h"
|
||||
#include "eden/fs/fuse/BufVec.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
BufVec::Buf::Buf(std::unique_ptr<folly::IOBuf> buf) : buf(std::move(buf)) {}
|
||||
|
||||
@ -51,6 +50,6 @@ std::string BufVec::copyData() const {
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -13,7 +13,6 @@
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
/**
|
||||
* Represents data that may come from a buffer or a file descriptor.
|
||||
@ -63,6 +62,6 @@ class BufVec {
|
||||
*/
|
||||
std::string copyData() const;
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -8,12 +8,12 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
#include "DirList.h"
|
||||
#include "FileHandleBase.h"
|
||||
#include "eden/fs/fuse/FileHandleBase.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
class DirList;
|
||||
|
||||
class DirHandle : public FileHandleBase {
|
||||
public:
|
||||
@ -35,6 +35,6 @@ class DirHandle : public FileHandleBase {
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> fsyncdir(bool datasync) = 0;
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -7,7 +7,7 @@
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
#include "DirList.h"
|
||||
#include "eden/fs/fuse/DirList.h"
|
||||
|
||||
#include "eden/fs/fuse/FuseTypes.h"
|
||||
|
||||
@ -15,7 +15,6 @@ using folly::StringPiece;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
DirList::DirList(size_t maxSize)
|
||||
: buf_(new char[maxSize]), end_(buf_.get() + maxSize), cur_(buf_.get()) {}
|
||||
@ -51,6 +50,6 @@ bool DirList::add(StringPiece name, const struct stat& st, off_t off) {
|
||||
StringPiece DirList::getBuf() const {
|
||||
return StringPiece(buf_.get(), cur_ - buf_.get());
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -10,11 +10,11 @@
|
||||
#pragma once
|
||||
#include <folly/Range.h>
|
||||
#include <sys/stat.h>
|
||||
#include <memory>
|
||||
#include "eden/fs/utils/DirType.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
/**
|
||||
* Helper for populating directory listings.
|
||||
@ -46,6 +46,6 @@ class DirList {
|
||||
|
||||
folly::StringPiece getBuf() const;
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -25,7 +25,6 @@ using namespace std::chrono;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
Dispatcher::Attr::Attr(const struct stat& st, uint64_t timeout)
|
||||
: st(st), timeout_seconds(timeout) {}
|
||||
@ -81,35 +80,34 @@ void Dispatcher::initConnection(const fuse_init_out& out) {
|
||||
void Dispatcher::destroy() {}
|
||||
|
||||
folly::Future<fuse_entry_out> Dispatcher::lookup(
|
||||
fusell::InodeNumber /*parent*/,
|
||||
InodeNumber /*parent*/,
|
||||
PathComponentPiece /*name*/) {
|
||||
throwSystemErrorExplicit(ENOENT);
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> Dispatcher::forget(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
InodeNumber /*ino*/,
|
||||
unsigned long /*nlookup*/) {
|
||||
return Unit{};
|
||||
}
|
||||
|
||||
folly::Future<Dispatcher::Attr> Dispatcher::getattr(
|
||||
fusell::InodeNumber /*ino*/) {
|
||||
folly::Future<Dispatcher::Attr> Dispatcher::getattr(InodeNumber /*ino*/) {
|
||||
throwSystemErrorExplicit(ENOENT);
|
||||
}
|
||||
|
||||
folly::Future<Dispatcher::Attr> Dispatcher::setattr(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
InodeNumber /*ino*/,
|
||||
const fuse_setattr_in& /*attr*/
|
||||
) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<std::string> Dispatcher::readlink(fusell::InodeNumber /*ino*/) {
|
||||
folly::Future<std::string> Dispatcher::readlink(InodeNumber /*ino*/) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out> Dispatcher::mknod(
|
||||
fusell::InodeNumber /*parent*/,
|
||||
InodeNumber /*parent*/,
|
||||
PathComponentPiece /*name*/,
|
||||
mode_t /*mode*/,
|
||||
dev_t /*rdev*/) {
|
||||
@ -117,56 +115,49 @@ folly::Future<fuse_entry_out> Dispatcher::mknod(
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out>
|
||||
Dispatcher::mkdir(fusell::InodeNumber, PathComponentPiece, mode_t) {
|
||||
Dispatcher::mkdir(InodeNumber, PathComponentPiece, mode_t) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> Dispatcher::unlink(
|
||||
fusell::InodeNumber,
|
||||
PathComponentPiece) {
|
||||
folly::Future<folly::Unit> Dispatcher::unlink(InodeNumber, PathComponentPiece) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> Dispatcher::rmdir(
|
||||
fusell::InodeNumber,
|
||||
PathComponentPiece) {
|
||||
folly::Future<folly::Unit> Dispatcher::rmdir(InodeNumber, PathComponentPiece) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out> Dispatcher::symlink(
|
||||
fusell::InodeNumber,
|
||||
PathComponentPiece,
|
||||
folly::StringPiece) {
|
||||
folly::Future<fuse_entry_out>
|
||||
Dispatcher::symlink(InodeNumber, PathComponentPiece, folly::StringPiece) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> Dispatcher::rename(
|
||||
fusell::InodeNumber,
|
||||
InodeNumber,
|
||||
PathComponentPiece,
|
||||
fusell::InodeNumber,
|
||||
InodeNumber,
|
||||
PathComponentPiece) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out>
|
||||
Dispatcher::link(fusell::InodeNumber, fusell::InodeNumber, PathComponentPiece) {
|
||||
Dispatcher::link(InodeNumber, InodeNumber, PathComponentPiece) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<std::shared_ptr<FileHandle>> Dispatcher::open(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
InodeNumber /*ino*/,
|
||||
int /*flags*/) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<std::shared_ptr<DirHandle>> Dispatcher::opendir(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
InodeNumber /*ino*/,
|
||||
int /*flags*/) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<struct fuse_kstatfs> Dispatcher::statfs(
|
||||
fusell::InodeNumber /*ino*/) {
|
||||
folly::Future<struct fuse_kstatfs> Dispatcher::statfs(InodeNumber /*ino*/) {
|
||||
struct fuse_kstatfs info = {};
|
||||
|
||||
// Suggest a large blocksize to software that looks at that kind of thing
|
||||
@ -189,7 +180,7 @@ folly::Future<struct fuse_kstatfs> Dispatcher::statfs(
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> Dispatcher::setxattr(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
InodeNumber /*ino*/,
|
||||
folly::StringPiece /*name*/,
|
||||
folly::StringPiece /*value*/,
|
||||
int /*flags*/) {
|
||||
@ -205,24 +196,24 @@ const int Dispatcher::kENOATTR =
|
||||
;
|
||||
|
||||
folly::Future<std::string> Dispatcher::getxattr(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
InodeNumber /*ino*/,
|
||||
folly::StringPiece /*name*/) {
|
||||
throwSystemErrorExplicit(kENOATTR);
|
||||
}
|
||||
|
||||
folly::Future<std::vector<std::string>> Dispatcher::listxattr(
|
||||
fusell::InodeNumber /*ino*/) {
|
||||
InodeNumber /*ino*/) {
|
||||
return std::vector<std::string>();
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> Dispatcher::removexattr(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
InodeNumber /*ino*/,
|
||||
folly::StringPiece /*name*/) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> Dispatcher::access(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
InodeNumber /*ino*/,
|
||||
int /*mask*/) {
|
||||
// Note that if you mount with the "default_permissions" kernel mount option,
|
||||
// the kernel will perform all permissions checks for you, and will never
|
||||
@ -234,14 +225,12 @@ folly::Future<folly::Unit> Dispatcher::access(
|
||||
}
|
||||
|
||||
folly::Future<Dispatcher::Create>
|
||||
Dispatcher::create(fusell::InodeNumber, PathComponentPiece, mode_t, int) {
|
||||
Dispatcher::create(InodeNumber, PathComponentPiece, mode_t, int) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
folly::Future<uint64_t> Dispatcher::bmap(
|
||||
fusell::InodeNumber /*ino*/,
|
||||
size_t /*blocksize*/,
|
||||
uint64_t /*idx*/) {
|
||||
folly::Future<uint64_t>
|
||||
Dispatcher::bmap(InodeNumber /*ino*/, size_t /*blocksize*/, uint64_t /*idx*/) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
|
||||
@ -252,6 +241,6 @@ const fuse_init_out& Dispatcher::getConnInfo() const {
|
||||
ThreadLocalEdenStats* Dispatcher::getStats() const {
|
||||
return stats_;
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -25,7 +25,6 @@ class Future;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
#define FUSELL_NOT_IMPL() \
|
||||
do { \
|
||||
@ -80,7 +79,7 @@ class Dispatcher {
|
||||
* Lookup a directory entry by name and get its attributes
|
||||
*/
|
||||
virtual folly::Future<fuse_entry_out> lookup(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name);
|
||||
|
||||
/**
|
||||
@ -103,7 +102,7 @@ class Dispatcher {
|
||||
* @param nlookup the number of lookups to forget
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> forget(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
unsigned long nlookup);
|
||||
|
||||
/**
|
||||
@ -129,7 +128,7 @@ class Dispatcher {
|
||||
*
|
||||
* @param ino the inode number
|
||||
*/
|
||||
virtual folly::Future<Attr> getattr(fusell::InodeNumber ino);
|
||||
virtual folly::Future<Attr> getattr(InodeNumber ino);
|
||||
|
||||
/**
|
||||
* Set file attributes
|
||||
@ -146,7 +145,7 @@ class Dispatcher {
|
||||
* file information filled in for ftruncate
|
||||
*/
|
||||
virtual folly::Future<Attr> setattr(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
const fuse_setattr_in& attr);
|
||||
|
||||
/**
|
||||
@ -154,7 +153,7 @@ class Dispatcher {
|
||||
*
|
||||
* @param ino the inode number
|
||||
*/
|
||||
virtual folly::Future<std::string> readlink(fusell::InodeNumber ino);
|
||||
virtual folly::Future<std::string> readlink(InodeNumber ino);
|
||||
|
||||
/**
|
||||
* Create file node
|
||||
@ -167,11 +166,8 @@ class Dispatcher {
|
||||
* @param mode file type and mode with which to create the new file
|
||||
* @param rdev the device number (only valid if created file is a device)
|
||||
*/
|
||||
virtual folly::Future<fuse_entry_out> mknod(
|
||||
fusell::InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
dev_t rdev);
|
||||
virtual folly::Future<fuse_entry_out>
|
||||
mknod(InodeNumber parent, PathComponentPiece name, mode_t mode, dev_t rdev);
|
||||
|
||||
/**
|
||||
* Create a directory
|
||||
@ -181,7 +177,7 @@ class Dispatcher {
|
||||
* @param mode with which to create the new file
|
||||
*/
|
||||
virtual folly::Future<fuse_entry_out>
|
||||
mkdir(fusell::InodeNumber parent, PathComponentPiece name, mode_t mode);
|
||||
mkdir(InodeNumber parent, PathComponentPiece name, mode_t mode);
|
||||
|
||||
/**
|
||||
* Remove a file
|
||||
@ -190,7 +186,7 @@ class Dispatcher {
|
||||
* @param name to remove
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> unlink(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name);
|
||||
|
||||
/**
|
||||
@ -200,7 +196,7 @@ class Dispatcher {
|
||||
* @param name to remove
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> rmdir(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name);
|
||||
|
||||
/**
|
||||
@ -210,10 +206,8 @@ class Dispatcher {
|
||||
* @param name to create
|
||||
* @param link the contents of the symbolic link
|
||||
*/
|
||||
virtual folly::Future<fuse_entry_out> symlink(
|
||||
fusell::InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
folly::StringPiece link);
|
||||
virtual folly::Future<fuse_entry_out>
|
||||
symlink(InodeNumber parent, PathComponentPiece name, folly::StringPiece link);
|
||||
|
||||
/**
|
||||
* Rename a file
|
||||
@ -224,9 +218,9 @@ class Dispatcher {
|
||||
* @param newname new name
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> rename(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber newparent,
|
||||
InodeNumber newparent,
|
||||
PathComponentPiece newname);
|
||||
|
||||
/**
|
||||
@ -236,10 +230,8 @@ class Dispatcher {
|
||||
* @param newparent inode number of the new parent directory
|
||||
* @param newname new name to create
|
||||
*/
|
||||
virtual folly::Future<fuse_entry_out> link(
|
||||
fusell::InodeNumber ino,
|
||||
fusell::InodeNumber newparent,
|
||||
PathComponentPiece newname);
|
||||
virtual folly::Future<fuse_entry_out>
|
||||
link(InodeNumber ino, InodeNumber newparent, PathComponentPiece newname);
|
||||
|
||||
/**
|
||||
* Open a file
|
||||
@ -248,7 +240,7 @@ class Dispatcher {
|
||||
* O_TRUNC) are available in the flags parameter.
|
||||
*/
|
||||
virtual folly::Future<std::shared_ptr<FileHandle>> open(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
int flags);
|
||||
|
||||
/**
|
||||
@ -257,7 +249,7 @@ class Dispatcher {
|
||||
* open(2) flags are available in the flags parameter.
|
||||
*/
|
||||
virtual folly::Future<std::shared_ptr<DirHandle>> opendir(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
int flags);
|
||||
|
||||
/**
|
||||
@ -265,13 +257,13 @@ class Dispatcher {
|
||||
*
|
||||
* @param ino the inode number, zero means "undefined"
|
||||
*/
|
||||
virtual folly::Future<struct fuse_kstatfs> statfs(fusell::InodeNumber ino);
|
||||
virtual folly::Future<struct fuse_kstatfs> statfs(InodeNumber ino);
|
||||
|
||||
/**
|
||||
* Set an extended attribute
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> setxattr(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
folly::StringPiece name,
|
||||
folly::StringPiece value,
|
||||
int flags);
|
||||
@ -279,15 +271,14 @@ class Dispatcher {
|
||||
* Get an extended attribute
|
||||
*/
|
||||
virtual folly::Future<std::string> getxattr(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
folly::StringPiece name);
|
||||
static const int kENOATTR;
|
||||
|
||||
/**
|
||||
* List extended attribute names
|
||||
*/
|
||||
virtual folly::Future<std::vector<std::string>> listxattr(
|
||||
fusell::InodeNumber ino);
|
||||
virtual folly::Future<std::vector<std::string>> listxattr(InodeNumber ino);
|
||||
|
||||
/**
|
||||
* Remove an extended attribute
|
||||
@ -296,7 +287,7 @@ class Dispatcher {
|
||||
* @param name of the extended attribute
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> removexattr(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
folly::StringPiece name);
|
||||
|
||||
/**
|
||||
@ -313,7 +304,7 @@ class Dispatcher {
|
||||
* @param ino the inode number
|
||||
* @param mask requested access mode
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> access(fusell::InodeNumber ino, int mask);
|
||||
virtual folly::Future<folly::Unit> access(InodeNumber ino, int mask);
|
||||
|
||||
struct Create {
|
||||
fuse_entry_out entry;
|
||||
@ -339,11 +330,8 @@ class Dispatcher {
|
||||
* @param name to create
|
||||
* @param mode file type and mode with which to create the new file
|
||||
*/
|
||||
virtual folly::Future<Create> create(
|
||||
fusell::InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
int flags);
|
||||
virtual folly::Future<Create>
|
||||
create(InodeNumber parent, PathComponentPiece name, mode_t mode, int flags);
|
||||
|
||||
/**
|
||||
* Map block index within file to block index within device
|
||||
@ -358,9 +346,8 @@ class Dispatcher {
|
||||
* @param idx block index within file
|
||||
*/
|
||||
virtual folly::Future<uint64_t>
|
||||
bmap(fusell::InodeNumber ino, size_t blocksize, uint64_t idx);
|
||||
bmap(InodeNumber ino, size_t blocksize, uint64_t idx);
|
||||
};
|
||||
|
||||
} // namespace fusell
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -7,7 +7,7 @@
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
#include "EdenStats.h"
|
||||
#include "eden/fs/fuse/EdenStats.h"
|
||||
|
||||
#include <folly/container/Array.h>
|
||||
#include <chrono>
|
||||
@ -29,7 +29,6 @@ constexpr auto kDurations = folly::make_array(
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
EdenStats::EdenStats() {}
|
||||
|
||||
@ -70,6 +69,6 @@ void EdenStats::recordLatency(
|
||||
(this->*item)->addValue(now, elapsed.count());
|
||||
#endif
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -32,7 +32,6 @@ class ThreadLocal;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
/**
|
||||
* A tag class for using with folly::ThreadLocal when storing EdenStats.
|
||||
@ -128,6 +127,6 @@ class EdenStats
|
||||
folly::TimeseriesHistogram<int64_t> createHistogram(const std::string& name);
|
||||
#endif
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -7,13 +7,12 @@
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
#include "FileHandle.h"
|
||||
#include "eden/fs/fuse/FileHandle.h"
|
||||
|
||||
using namespace folly;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
bool FileHandle::usesDirectIO() const {
|
||||
return false;
|
||||
@ -25,6 +24,5 @@ bool FileHandle::isSeekable() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace fusell
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -8,11 +8,10 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
#include "FileHandleBase.h"
|
||||
#include "eden/fs/fuse/FileHandleBase.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
class FileHandle : public FileHandleBase {
|
||||
public:
|
||||
@ -90,6 +89,6 @@ class FileHandle : public FileHandleBase {
|
||||
*/
|
||||
virtual folly::Future<folly::Unit> fsync(bool datasync) = 0;
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -7,13 +7,12 @@
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
#include "FileHandleBase.h"
|
||||
#include "eden/fs/fuse/FileHandleBase.h"
|
||||
|
||||
using namespace folly;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
FileHandleBase::~FileHandleBase() {}
|
||||
|
||||
@ -29,6 +28,6 @@ folly::Future<unsigned> FileHandleBase::poll(
|
||||
std::unique_ptr<PollHandle> /*ph*/) {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -9,13 +9,12 @@
|
||||
*/
|
||||
#pragma once
|
||||
#include <folly/futures/Future.h>
|
||||
#include "BufVec.h"
|
||||
#include "Dispatcher.h"
|
||||
#include "PollHandle.h"
|
||||
#include "eden/fs/fuse/BufVec.h"
|
||||
#include "eden/fs/fuse/Dispatcher.h"
|
||||
#include "eden/fs/fuse/PollHandle.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
class Dispatcher;
|
||||
|
||||
@ -27,7 +26,7 @@ class FileHandleBase {
|
||||
* Return the inode number.
|
||||
* This is used in lieu of getattr() by the code that serializes
|
||||
* the FileHandleMap. */
|
||||
virtual fusell::InodeNumber getInodeNumber() = 0;
|
||||
virtual InodeNumber getInodeNumber() = 0;
|
||||
|
||||
/**
|
||||
* Get file attributes
|
||||
@ -87,6 +86,6 @@ class FileHandleBase {
|
||||
*/
|
||||
virtual folly::Future<unsigned> poll(std::unique_ptr<PollHandle> ph);
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -23,7 +23,6 @@ using apache::thrift::CompactSerializer;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
std::shared_ptr<FileHandleBase> FileHandleMap::getGenericFileHandle(
|
||||
uint64_t fh) {
|
||||
@ -144,6 +143,5 @@ SerializedFileHandleMap FileHandleMap::serializeMap() {
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace fusell
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -14,13 +14,11 @@
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
class SerializedFileHandleMap;
|
||||
|
||||
namespace fusell {
|
||||
|
||||
class FileHandle;
|
||||
class DirHandle;
|
||||
class FileHandle;
|
||||
class FileHandleBase;
|
||||
class SerializedFileHandleMap;
|
||||
|
||||
/** Keeps track of file handle numbers and their associate FileHandleBase
|
||||
*
|
||||
@ -83,6 +81,6 @@ class FileHandleMap {
|
||||
std::unordered_map<uint64_t, std::shared_ptr<FileHandleBase>>>
|
||||
handles_;
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <folly/system/ThreadName.h>
|
||||
#include <signal.h>
|
||||
#include "eden/fs/fuse/DirHandle.h"
|
||||
#include "eden/fs/fuse/DirList.h"
|
||||
#include "eden/fs/fuse/Dispatcher.h"
|
||||
#include "eden/fs/fuse/FileHandle.h"
|
||||
#include "eden/fs/fuse/RequestData.h"
|
||||
@ -24,7 +25,6 @@ using std::string;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
namespace {
|
||||
|
||||
@ -431,10 +431,7 @@ void FuseChannel::destroy() {
|
||||
}
|
||||
}
|
||||
|
||||
void FuseChannel::invalidateInode(
|
||||
fusell::InodeNumber ino,
|
||||
off_t off,
|
||||
off_t len) {
|
||||
void FuseChannel::invalidateInode(InodeNumber ino, off_t off, off_t len) {
|
||||
fuse_notify_inval_inode_out notify;
|
||||
notify.ino = ino.get();
|
||||
notify.off = off;
|
||||
@ -469,9 +466,7 @@ void FuseChannel::invalidateInode(
|
||||
}
|
||||
}
|
||||
|
||||
void FuseChannel::invalidateEntry(
|
||||
fusell::InodeNumber parent,
|
||||
PathComponentPiece name) {
|
||||
void FuseChannel::invalidateEntry(InodeNumber parent, PathComponentPiece name) {
|
||||
auto namePiece = name.stringPiece();
|
||||
|
||||
fuse_notify_inval_entry_out notify = {};
|
||||
@ -1028,7 +1023,7 @@ folly::Future<folly::Unit> FuseChannel::fuseLookup(
|
||||
const fuse_in_header* header,
|
||||
const uint8_t* arg) {
|
||||
PathComponentPiece name{reinterpret_cast<const char*>(arg)};
|
||||
const auto parent = fusell::InodeNumber{header->nodeid};
|
||||
const auto parent = InodeNumber{header->nodeid};
|
||||
|
||||
XLOG(DBG7) << "FUSE_LOOKUP";
|
||||
|
||||
@ -1042,8 +1037,7 @@ folly::Future<folly::Unit> FuseChannel::fuseForget(
|
||||
const uint8_t* arg) {
|
||||
auto forget = reinterpret_cast<const fuse_forget_in*>(arg);
|
||||
XLOG(DBG7) << "FUSE_FORGET";
|
||||
return dispatcher_
|
||||
->forget(fusell::InodeNumber{header->nodeid}, forget->nlookup)
|
||||
return dispatcher_->forget(InodeNumber{header->nodeid}, forget->nlookup)
|
||||
.then([]() { RequestData::get().replyNone(); });
|
||||
}
|
||||
|
||||
@ -1065,7 +1059,7 @@ folly::Future<folly::Unit> FuseChannel::fuseGetAttr(
|
||||
// otherwise, fall through to regular inode based lookup
|
||||
}
|
||||
|
||||
return dispatcher_->getattr(fusell::InodeNumber{header->nodeid})
|
||||
return dispatcher_->getattr(InodeNumber{header->nodeid})
|
||||
.then([](Dispatcher::Attr attr) {
|
||||
RequestData::get().sendReply(attr.asFuseAttr());
|
||||
});
|
||||
@ -1083,7 +1077,7 @@ folly::Future<folly::Unit> FuseChannel::fuseSetAttr(
|
||||
RequestData::get().sendReply(attr.asFuseAttr());
|
||||
});
|
||||
} else {
|
||||
return dispatcher_->setattr(fusell::InodeNumber{header->nodeid}, *setattr)
|
||||
return dispatcher_->setattr(InodeNumber{header->nodeid}, *setattr)
|
||||
.then([](Dispatcher::Attr attr) {
|
||||
RequestData::get().sendReply(attr.asFuseAttr());
|
||||
});
|
||||
@ -1094,7 +1088,7 @@ folly::Future<folly::Unit> FuseChannel::fuseReadLink(
|
||||
const fuse_in_header* header,
|
||||
const uint8_t* arg) {
|
||||
XLOG(DBG7) << "FUSE_READLINK";
|
||||
return dispatcher_->readlink(fusell::InodeNumber{header->nodeid})
|
||||
return dispatcher_->readlink(InodeNumber{header->nodeid})
|
||||
.then([](std::string&& str) {
|
||||
RequestData::get().sendReply(folly::StringPiece(str));
|
||||
});
|
||||
@ -1108,7 +1102,7 @@ folly::Future<folly::Unit> FuseChannel::fuseSymlink(
|
||||
const PathComponentPiece name{nameStr};
|
||||
const StringPiece link{nameStr + name.stringPiece().size() + 1};
|
||||
|
||||
return dispatcher_->symlink(fusell::InodeNumber{header->nodeid}, name, link)
|
||||
return dispatcher_->symlink(InodeNumber{header->nodeid}, name, link)
|
||||
.then([](fuse_entry_out param) { RequestData::get().sendReply(param); });
|
||||
}
|
||||
|
||||
@ -1136,7 +1130,7 @@ folly::Future<folly::Unit> FuseChannel::fuseMknod(
|
||||
XLOG(DBG7) << "FUSE_MKNOD " << name;
|
||||
|
||||
return dispatcher_
|
||||
->mknod(fusell::InodeNumber{header->nodeid}, name, nod->mode, nod->rdev)
|
||||
->mknod(InodeNumber{header->nodeid}, name, nod->mode, nod->rdev)
|
||||
.then([](fuse_entry_out entry) { RequestData::get().sendReply(entry); });
|
||||
}
|
||||
|
||||
@ -1156,8 +1150,7 @@ folly::Future<folly::Unit> FuseChannel::fuseMkdir(
|
||||
XLOG(DBG7) << "mode = " << dir->mode << "; umask = " << dir->umask;
|
||||
|
||||
return dispatcher_
|
||||
->mkdir(
|
||||
fusell::InodeNumber{header->nodeid}, name, dir->mode & ~dir->umask)
|
||||
->mkdir(InodeNumber{header->nodeid}, name, dir->mode & ~dir->umask)
|
||||
.then([](fuse_entry_out entry) { RequestData::get().sendReply(entry); });
|
||||
}
|
||||
|
||||
@ -1169,8 +1162,9 @@ folly::Future<folly::Unit> FuseChannel::fuseUnlink(
|
||||
|
||||
XLOG(DBG7) << "FUSE_UNLINK " << name;
|
||||
|
||||
return dispatcher_->unlink(fusell::InodeNumber{header->nodeid}, name)
|
||||
.then([]() { RequestData::get().replyError(0); });
|
||||
return dispatcher_->unlink(InodeNumber{header->nodeid}, name).then([]() {
|
||||
RequestData::get().replyError(0);
|
||||
});
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> FuseChannel::fuseRmdir(
|
||||
@ -1181,8 +1175,9 @@ folly::Future<folly::Unit> FuseChannel::fuseRmdir(
|
||||
|
||||
XLOG(DBG7) << "FUSE_RMDIR " << name;
|
||||
|
||||
return dispatcher_->rmdir(fusell::InodeNumber{header->nodeid}, name)
|
||||
.then([]() { RequestData::get().replyError(0); });
|
||||
return dispatcher_->rmdir(InodeNumber{header->nodeid}, name).then([]() {
|
||||
RequestData::get().replyError(0);
|
||||
});
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> FuseChannel::fuseRename(
|
||||
@ -1197,9 +1192,9 @@ folly::Future<folly::Unit> FuseChannel::fuseRename(
|
||||
XLOG(DBG7) << "FUSE_RENAME " << oldName << " -> " << newName;
|
||||
return dispatcher_
|
||||
->rename(
|
||||
fusell::InodeNumber{header->nodeid},
|
||||
InodeNumber{header->nodeid},
|
||||
oldName,
|
||||
fusell::InodeNumber{rename->newdir},
|
||||
InodeNumber{rename->newdir},
|
||||
newName)
|
||||
.then([]() { RequestData::get().replyError(0); });
|
||||
}
|
||||
@ -1214,10 +1209,7 @@ folly::Future<folly::Unit> FuseChannel::fuseLink(
|
||||
XLOG(DBG7) << "FUSE_LINK " << newName;
|
||||
|
||||
return dispatcher_
|
||||
->link(
|
||||
fusell::InodeNumber{link->oldnodeid},
|
||||
fusell::InodeNumber{header->nodeid},
|
||||
newName)
|
||||
->link(InodeNumber{link->oldnodeid}, InodeNumber{header->nodeid}, newName)
|
||||
.then([](fuse_entry_out param) { RequestData::get().sendReply(param); });
|
||||
}
|
||||
|
||||
@ -1226,7 +1218,7 @@ folly::Future<folly::Unit> FuseChannel::fuseOpen(
|
||||
const uint8_t* arg) {
|
||||
const auto open = reinterpret_cast<const fuse_open_in*>(arg);
|
||||
XLOG(DBG7) << "FUSE_OPEN";
|
||||
return dispatcher_->open(fusell::InodeNumber{header->nodeid}, open->flags)
|
||||
return dispatcher_->open(InodeNumber{header->nodeid}, open->flags)
|
||||
.then([this](std::shared_ptr<FileHandle> fh) {
|
||||
if (!fh) {
|
||||
throw std::runtime_error("Dispatcher::open failed to set fh");
|
||||
@ -1256,7 +1248,7 @@ folly::Future<folly::Unit> FuseChannel::fuseStatFs(
|
||||
const fuse_in_header* header,
|
||||
const uint8_t* arg) {
|
||||
XLOG(DBG7) << "FUSE_STATFS";
|
||||
return dispatcher_->statfs(fusell::InodeNumber{header->nodeid})
|
||||
return dispatcher_->statfs(InodeNumber{header->nodeid})
|
||||
.then([](struct fuse_kstatfs&& info) {
|
||||
fuse_statfs_out out = {};
|
||||
out.st = info;
|
||||
@ -1300,8 +1292,7 @@ folly::Future<folly::Unit> FuseChannel::fuseSetXAttr(
|
||||
XLOG(DBG7) << "FUSE_SETXATTR";
|
||||
|
||||
return dispatcher_
|
||||
->setxattr(
|
||||
fusell::InodeNumber{header->nodeid}, attrName, value, setxattr->flags)
|
||||
->setxattr(InodeNumber{header->nodeid}, attrName, value, setxattr->flags)
|
||||
.then([]() { RequestData::get().replyError(0); });
|
||||
}
|
||||
|
||||
@ -1312,7 +1303,7 @@ folly::Future<folly::Unit> FuseChannel::fuseGetXAttr(
|
||||
const auto nameStr = reinterpret_cast<const char*>(getxattr + 1);
|
||||
const StringPiece attrName{nameStr};
|
||||
XLOG(DBG7) << "FUSE_GETXATTR";
|
||||
return dispatcher_->getxattr(fusell::InodeNumber{header->nodeid}, attrName)
|
||||
return dispatcher_->getxattr(InodeNumber{header->nodeid}, attrName)
|
||||
.then([size = getxattr->size](std::string attr) {
|
||||
auto& request = RequestData::get();
|
||||
if (size == 0) {
|
||||
@ -1332,7 +1323,7 @@ folly::Future<folly::Unit> FuseChannel::fuseListXAttr(
|
||||
const uint8_t* arg) {
|
||||
const auto listattr = reinterpret_cast<const fuse_getxattr_in*>(arg);
|
||||
XLOG(DBG7) << "FUSE_LISTXATTR";
|
||||
return dispatcher_->listxattr(fusell::InodeNumber{header->nodeid})
|
||||
return dispatcher_->listxattr(InodeNumber{header->nodeid})
|
||||
.then([size = listattr->size](std::vector<std::string> attrs) {
|
||||
auto& request = RequestData::get();
|
||||
|
||||
@ -1368,7 +1359,7 @@ folly::Future<folly::Unit> FuseChannel::fuseRemoveXAttr(
|
||||
const auto nameStr = reinterpret_cast<const char*>(arg);
|
||||
const StringPiece attrName{nameStr};
|
||||
XLOG(DBG7) << "FUSE_REMOVEXATTR";
|
||||
return dispatcher_->removexattr(fusell::InodeNumber{header->nodeid}, attrName)
|
||||
return dispatcher_->removexattr(InodeNumber{header->nodeid}, attrName)
|
||||
.then([]() { RequestData::get().replyError(0); });
|
||||
}
|
||||
|
||||
@ -1389,7 +1380,7 @@ folly::Future<folly::Unit> FuseChannel::fuseOpenDir(
|
||||
const uint8_t* arg) {
|
||||
const auto open = reinterpret_cast<const fuse_open_in*>(arg);
|
||||
XLOG(DBG7) << "FUSE_OPENDIR";
|
||||
return dispatcher_->opendir(fusell::InodeNumber{header->nodeid}, open->flags)
|
||||
return dispatcher_->opendir(InodeNumber{header->nodeid}, open->flags)
|
||||
.then([this](std::shared_ptr<DirHandle> dh) {
|
||||
if (!dh) {
|
||||
throw std::runtime_error("Dispatcher::opendir failed to set dh");
|
||||
@ -1449,7 +1440,7 @@ folly::Future<folly::Unit> FuseChannel::fuseAccess(
|
||||
const uint8_t* arg) {
|
||||
const auto access = reinterpret_cast<const fuse_access_in*>(arg);
|
||||
XLOG(DBG7) << "FUSE_ACCESS";
|
||||
return dispatcher_->access(fusell::InodeNumber{header->nodeid}, access->mask)
|
||||
return dispatcher_->access(InodeNumber{header->nodeid}, access->mask)
|
||||
.then([]() { RequestData::get().replyError(0); });
|
||||
}
|
||||
|
||||
@ -1460,11 +1451,7 @@ folly::Future<folly::Unit> FuseChannel::fuseCreate(
|
||||
const PathComponentPiece name{reinterpret_cast<const char*>(create + 1)};
|
||||
XLOG(DBG7) << "FUSE_CREATE " << name;
|
||||
return dispatcher_
|
||||
->create(
|
||||
fusell::InodeNumber{header->nodeid},
|
||||
name,
|
||||
create->mode,
|
||||
create->flags)
|
||||
->create(InodeNumber{header->nodeid}, name, create->mode, create->flags)
|
||||
.then([this](Dispatcher::Create info) {
|
||||
fuse_open_out out = {};
|
||||
if (info.fh->usesDirectIO()) {
|
||||
@ -1504,7 +1491,7 @@ folly::Future<folly::Unit> FuseChannel::fuseBmap(
|
||||
const auto bmap = reinterpret_cast<const fuse_bmap_in*>(arg);
|
||||
XLOG(DBG7) << "FUSE_BMAP";
|
||||
return dispatcher_
|
||||
->bmap(fusell::InodeNumber{header->nodeid}, bmap->blocksize, bmap->block)
|
||||
->bmap(InodeNumber{header->nodeid}, bmap->blocksize, bmap->block)
|
||||
.then([](uint64_t resultIdx) {
|
||||
fuse_bmap_out out;
|
||||
out.block = resultIdx;
|
||||
@ -1521,12 +1508,11 @@ folly::Future<folly::Unit> FuseChannel::fuseBatchForget(
|
||||
XLOG(DBG7) << "FUSE_BATCH_FORGET";
|
||||
|
||||
while (item != end) {
|
||||
dispatcher_->forget(fusell::InodeNumber{item->nodeid}, item->nlookup);
|
||||
dispatcher_->forget(InodeNumber{item->nodeid}, item->nlookup);
|
||||
++item;
|
||||
}
|
||||
return Unit{};
|
||||
}
|
||||
|
||||
} // namespace fusell
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -29,7 +29,6 @@ class RequestContext;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
class Dispatcher;
|
||||
|
||||
@ -173,7 +172,7 @@ class FuseChannel {
|
||||
* or negative to invalidate attributes only
|
||||
* @param len the amount of cache to invalidate or 0 for all
|
||||
*/
|
||||
void invalidateInode(fusell::InodeNumber ino, off_t off, off_t len);
|
||||
void invalidateInode(InodeNumber ino, off_t off, off_t len);
|
||||
|
||||
/**
|
||||
* Notify to invalidate parent attributes and the dentry matching
|
||||
@ -182,7 +181,7 @@ class FuseChannel {
|
||||
* @param parent inode number
|
||||
* @param name file name
|
||||
*/
|
||||
void invalidateEntry(fusell::InodeNumber parent, PathComponentPiece name);
|
||||
void invalidateEntry(InodeNumber parent, PathComponentPiece name);
|
||||
|
||||
/**
|
||||
* Sends a reply to a kernel request that consists only of the error
|
||||
@ -499,6 +498,6 @@ class FuseChannelDeleter {
|
||||
channel->destroy();
|
||||
}
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -14,7 +14,6 @@
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, InodeNumber ino) {
|
||||
return os << ino.getRawValue();
|
||||
@ -28,6 +27,5 @@ void toAppend(InodeNumber ino, folly::fbstring* result) {
|
||||
folly::toAppend(ino.getRawValue(), result);
|
||||
}
|
||||
|
||||
} // namespace fusell
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -20,7 +20,6 @@
|
||||
#endif
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
/**
|
||||
* Represents ino_t behind a slightly safer API. In general, it is a bug if
|
||||
@ -127,22 +126,20 @@ struct FuseChannelData {
|
||||
fuse_init_out connInfo;
|
||||
};
|
||||
|
||||
} // namespace fusell
|
||||
|
||||
constexpr fusell::InodeNumber operator""_ino(unsigned long long ino) {
|
||||
return fusell::InodeNumber{ino};
|
||||
constexpr InodeNumber operator""_ino(unsigned long long ino) {
|
||||
return InodeNumber{ino};
|
||||
}
|
||||
|
||||
/// The inode number of the mount's root directory.
|
||||
constexpr fusell::InodeNumber kRootNodeId = 1_ino;
|
||||
constexpr InodeNumber kRootNodeId = 1_ino;
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
||||
namespace std {
|
||||
template <>
|
||||
struct hash<facebook::eden::fusell::InodeNumber> {
|
||||
size_t operator()(facebook::eden::fusell::InodeNumber n) const {
|
||||
struct hash<facebook::eden::InodeNumber> {
|
||||
size_t operator()(facebook::eden::InodeNumber n) const {
|
||||
// TODO: It may be worth using a different hash function. The default
|
||||
// std::hash for integers is the identity function. But since we allocate
|
||||
// inode numbers monotonically, this should be okay.
|
||||
@ -153,9 +150,9 @@ struct hash<facebook::eden::fusell::InodeNumber> {
|
||||
|
||||
namespace folly {
|
||||
template <>
|
||||
class FormatValue<facebook::eden::fusell::InodeNumber> {
|
||||
class FormatValue<facebook::eden::InodeNumber> {
|
||||
public:
|
||||
explicit FormatValue(facebook::eden::fusell::InodeNumber ino) : ino_(ino) {}
|
||||
explicit FormatValue(facebook::eden::InodeNumber ino) : ino_(ino) {}
|
||||
|
||||
template <class FormatCallback>
|
||||
void format(FormatArg& arg, FormatCallback& cb) const {
|
||||
@ -163,6 +160,6 @@ class FormatValue<facebook::eden::fusell::InodeNumber> {
|
||||
}
|
||||
|
||||
private:
|
||||
const facebook::eden::fusell::InodeNumber ino_;
|
||||
const facebook::eden::InodeNumber ino_;
|
||||
};
|
||||
} // namespace folly
|
||||
|
@ -7,11 +7,10 @@
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*
|
||||
*/
|
||||
#include "PollHandle.h"
|
||||
#include "eden/fs/fuse/PollHandle.h"
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
void PollHandle::Deleter::operator()(fuse_pollhandle* /*h*/) {
|
||||
#if FUSE_MAJOR_VERSION >= 8
|
||||
@ -26,6 +25,6 @@ void PollHandle::notify() {
|
||||
fuse_lowlevel_notify_poll(h_.get());
|
||||
#endif
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -13,7 +13,6 @@
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
// Some compatibility cruft for working with OSX Fuse
|
||||
#if FUSE_MINOR_VERSION < 8
|
||||
@ -37,6 +36,6 @@ class PollHandle {
|
||||
// Requests that the kernel poll the associated file
|
||||
void notify();
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -18,9 +18,8 @@ using namespace std::chrono;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
const std::string RequestData::kKey("fusell");
|
||||
const std::string RequestData::kKey("fuse");
|
||||
|
||||
RequestData::RequestData(
|
||||
FuseChannel* channel,
|
||||
@ -130,6 +129,6 @@ void RequestData::genericErrorHandler(const std::exception& err) {
|
||||
XLOG(DBG5) << folly::exceptionStr(err);
|
||||
RequestData::get().replyError(EIO);
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -18,7 +18,6 @@
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
class Dispatcher;
|
||||
|
||||
@ -129,6 +128,6 @@ class RequestData : public folly::RequestData {
|
||||
folly::Future<folly::Unit> interrupter_;
|
||||
std::atomic<bool> interrupted_{false};
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -23,7 +23,6 @@
|
||||
#include "eden/fs/utils/PathFuncs.h"
|
||||
|
||||
using namespace facebook::eden;
|
||||
using namespace facebook::eden::fusell;
|
||||
using folly::exceptionStr;
|
||||
using folly::makeFuture;
|
||||
using std::string;
|
||||
@ -43,7 +42,7 @@ class TestDispatcher : public Dispatcher {
|
||||
TestDispatcher(ThreadLocalEdenStats* stats, const UserInfo& identity)
|
||||
: Dispatcher(stats), identity_(identity) {}
|
||||
|
||||
folly::Future<Attr> getattr(fusell::InodeNumber ino) override {
|
||||
folly::Future<Attr> getattr(InodeNumber ino) override {
|
||||
if (ino == kRootNodeId) {
|
||||
struct stat st = {};
|
||||
st.st_ino = ino.get();
|
||||
|
@ -30,9 +30,6 @@ using std::string;
|
||||
using std::unique_ptr;
|
||||
using std::vector;
|
||||
|
||||
using facebook::eden::fusell::PrivHelperConn;
|
||||
using facebook::eden::fusell::PrivHelperServer;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
|
||||
|
@ -96,9 +96,7 @@ class PrivHelper {
|
||||
virtual int stop() = 0;
|
||||
};
|
||||
|
||||
namespace fusell {
|
||||
class PrivHelperServer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fork a separate privileged helper process, for performing mounts.
|
||||
@ -115,7 +113,7 @@ std::unique_ptr<PrivHelper> startPrivHelper(const UserInfo& userInfo);
|
||||
* This is really only intended for use in unit tests.
|
||||
*/
|
||||
std::unique_ptr<PrivHelper> startPrivHelper(
|
||||
fusell::PrivHelperServer* server,
|
||||
PrivHelperServer* server,
|
||||
const UserInfo& userInfo);
|
||||
|
||||
} // namespace eden
|
||||
|
@ -41,7 +41,6 @@ DEFINE_int32(
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
namespace {
|
||||
|
||||
@ -475,6 +474,6 @@ void PrivHelperConn::rethrowErrorResponse(const Message* msg) {
|
||||
|
||||
PrivHelperError::PrivHelperError(StringPiece remoteExType, StringPiece msg)
|
||||
: message_(folly::to<string>(remoteExType, ": ", msg)) {}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -20,7 +20,6 @@ class File;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
/*
|
||||
* A helper class for sending and receiving messages on the privhelper socket.
|
||||
@ -200,6 +199,6 @@ class PrivHelperError : public std::exception {
|
||||
private:
|
||||
std::string message_;
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -39,7 +39,6 @@ using std::string;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
PrivHelperServer::PrivHelperServer() {}
|
||||
|
||||
@ -432,6 +431,6 @@ void PrivHelperServer::run() {
|
||||
// Unmount all active mount points
|
||||
cleanupMountPoints();
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -14,7 +14,7 @@
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include "PrivHelperConn.h"
|
||||
#include "eden/fs/fuse/privhelper/PrivHelperConn.h"
|
||||
|
||||
namespace folly {
|
||||
class File;
|
||||
@ -22,7 +22,6 @@ class File;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
/*
|
||||
* PrivHelperServer runs the main loop for the privhelper server process.
|
||||
@ -70,6 +69,6 @@ class PrivHelperServer {
|
||||
std::set<std::string> mountPoints_;
|
||||
std::unordered_multimap<std::string, std::string> bindMountPoints_;
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include <vector>
|
||||
|
||||
using namespace folly::string_piece_literals;
|
||||
using namespace facebook::eden::fusell;
|
||||
using namespace facebook::eden;
|
||||
using facebook::eden::UserInfo;
|
||||
using folly::ByteRange;
|
||||
using folly::checkUnixError;
|
||||
|
@ -20,7 +20,6 @@ using std::string;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
PrivHelperTestServer::PrivHelperTestServer() {}
|
||||
|
||||
@ -100,6 +99,6 @@ bool PrivHelperTestServer::checkIfMarkerFileHasContents(
|
||||
throw;
|
||||
}
|
||||
}
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -15,7 +15,6 @@
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
|
||||
/*
|
||||
* A subclass of PrivHelperServer that doesn't actually perform
|
||||
@ -53,6 +52,6 @@ class PrivHelperTestServer : public PrivHelperServer {
|
||||
const std::string pathToMarkerFile,
|
||||
const std::string contents) const;
|
||||
};
|
||||
} // namespace fusell
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -14,7 +14,7 @@
|
||||
TEST(BufVecTest, BufVec) {
|
||||
auto root = folly::IOBuf::wrapBuffer("hello", 5);
|
||||
root->appendChain(folly::IOBuf::wrapBuffer("world", 5));
|
||||
const auto bufVec = facebook::eden::fusell::BufVec{std::move(root)};
|
||||
const auto bufVec = facebook::eden::BufVec{std::move(root)};
|
||||
EXPECT_EQ(10u, bufVec.size());
|
||||
EXPECT_EQ(10u, bufVec.copyData().size());
|
||||
EXPECT_EQ("helloworld", bufVec.copyData());
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include "eden/fs/fuse/gen-cpp2/handlemap_types.h"
|
||||
|
||||
using namespace facebook::eden;
|
||||
using namespace facebook::eden::fusell;
|
||||
using folly::Future;
|
||||
using folly::test::TemporaryFile;
|
||||
|
||||
@ -23,9 +22,9 @@ namespace {
|
||||
|
||||
class FakeDirHandle : public DirHandle {
|
||||
public:
|
||||
explicit FakeDirHandle(fusell::InodeNumber inode) : inode_(inode) {}
|
||||
explicit FakeDirHandle(InodeNumber inode) : inode_(inode) {}
|
||||
|
||||
fusell::InodeNumber getInodeNumber() override {
|
||||
InodeNumber getInodeNumber() override {
|
||||
return inode_;
|
||||
}
|
||||
folly::Future<Dispatcher::Attr> getattr() override {
|
||||
@ -44,14 +43,14 @@ class FakeDirHandle : public DirHandle {
|
||||
}
|
||||
|
||||
private:
|
||||
fusell::InodeNumber inode_;
|
||||
InodeNumber inode_;
|
||||
};
|
||||
|
||||
class FakeFileHandle : public FileHandle {
|
||||
public:
|
||||
explicit FakeFileHandle(fusell::InodeNumber inode) : inode_(inode) {}
|
||||
explicit FakeFileHandle(InodeNumber inode) : inode_(inode) {}
|
||||
|
||||
fusell::InodeNumber getInodeNumber() override {
|
||||
InodeNumber getInodeNumber() override {
|
||||
return inode_;
|
||||
}
|
||||
folly::Future<Dispatcher::Attr> getattr() override {
|
||||
@ -79,7 +78,7 @@ class FakeFileHandle : public FileHandle {
|
||||
}
|
||||
|
||||
private:
|
||||
fusell::InodeNumber inode_;
|
||||
InodeNumber inode_;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
|
@ -21,7 +21,6 @@
|
||||
#include "eden/fs/testharness/TestDispatcher.h"
|
||||
|
||||
using namespace facebook::eden;
|
||||
using namespace facebook::eden::fusell;
|
||||
using namespace std::literals::chrono_literals;
|
||||
using folly::ByteRange;
|
||||
using folly::Future;
|
||||
|
@ -49,8 +49,8 @@ namespace {
|
||||
|
||||
/** Compute a fuse_entry_out */
|
||||
fuse_entry_out computeEntryParam(
|
||||
fusell::InodeNumber number,
|
||||
const fusell::Dispatcher::Attr& attr) {
|
||||
InodeNumber number,
|
||||
const Dispatcher::Attr& attr) {
|
||||
fuse_entry_out entry;
|
||||
entry.nodeid = number.get();
|
||||
entry.generation = 1;
|
||||
@ -64,15 +64,14 @@ fuse_entry_out computeEntryParam(
|
||||
}
|
||||
} // namespace
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> EdenDispatcher::getattr(
|
||||
fusell::InodeNumber ino) {
|
||||
folly::Future<Dispatcher::Attr> EdenDispatcher::getattr(InodeNumber ino) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "getattr({})", ino);
|
||||
return inodeMap_->lookupInode(ino).then(
|
||||
[](const InodePtr& inode) { return inode->getattr(); });
|
||||
}
|
||||
|
||||
folly::Future<std::shared_ptr<fusell::DirHandle>> EdenDispatcher::opendir(
|
||||
fusell::InodeNumber ino,
|
||||
folly::Future<std::shared_ptr<DirHandle>> EdenDispatcher::opendir(
|
||||
InodeNumber ino,
|
||||
int flags) {
|
||||
FB_LOGF(
|
||||
mount_->getStraceLogger(), DBG7, "opendir({}, flags={:x})", ino, flags);
|
||||
@ -81,7 +80,7 @@ folly::Future<std::shared_ptr<fusell::DirHandle>> EdenDispatcher::opendir(
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out> EdenDispatcher::lookup(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece namepiece) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "lookup({}, {})", parent, namepiece);
|
||||
return inodeMap_->lookupTreeInode(parent)
|
||||
@ -89,7 +88,7 @@ folly::Future<fuse_entry_out> EdenDispatcher::lookup(
|
||||
return tree->getOrLoadChild(name);
|
||||
})
|
||||
.then([](const InodePtr& inode) {
|
||||
return inode->getattr().then([inode](fusell::Dispatcher::Attr attr) {
|
||||
return inode->getattr().then([inode](Dispatcher::Attr attr) {
|
||||
inode->incFuseRefcount();
|
||||
// Preserve inode's life for the duration of the prefetch.
|
||||
inode->prefetch().ensure([inode] {});
|
||||
@ -113,8 +112,8 @@ folly::Future<fuse_entry_out> EdenDispatcher::lookup(
|
||||
});
|
||||
}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> EdenDispatcher::setattr(
|
||||
fusell::InodeNumber ino,
|
||||
folly::Future<Dispatcher::Attr> EdenDispatcher::setattr(
|
||||
InodeNumber ino,
|
||||
const fuse_setattr_in& attr) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "setattr({})", ino);
|
||||
return inodeMap_->lookupInode(ino).then(
|
||||
@ -122,23 +121,23 @@ folly::Future<fusell::Dispatcher::Attr> EdenDispatcher::setattr(
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> EdenDispatcher::forget(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
unsigned long nlookup) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "forget({}, {})", ino, nlookup);
|
||||
inodeMap_->decFuseRefcount(ino, nlookup);
|
||||
return Unit{};
|
||||
}
|
||||
|
||||
folly::Future<std::shared_ptr<fusell::FileHandle>> EdenDispatcher::open(
|
||||
fusell::InodeNumber ino,
|
||||
folly::Future<std::shared_ptr<FileHandle>> EdenDispatcher::open(
|
||||
InodeNumber ino,
|
||||
int flags) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "open({}, flags={:x})", ino, flags);
|
||||
return inodeMap_->lookupFileInode(ino).then(
|
||||
[flags](const FileInodePtr& inode) { return inode->open(flags); });
|
||||
}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Create> EdenDispatcher::create(
|
||||
fusell::InodeNumber parent,
|
||||
folly::Future<Dispatcher::Create> EdenDispatcher::create(
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
int flags) {
|
||||
@ -156,7 +155,7 @@ folly::Future<fusell::Dispatcher::Create> EdenDispatcher::create(
|
||||
return parentInode->create(childName, mode, flags);
|
||||
})
|
||||
.then([=](TreeInode::CreateResult created) {
|
||||
fusell::Dispatcher::Create result;
|
||||
Dispatcher::Create result;
|
||||
created.inode->incFuseRefcount();
|
||||
result.entry =
|
||||
computeEntryParam(created.inode->getNodeId(), created.attr);
|
||||
@ -165,14 +164,14 @@ folly::Future<fusell::Dispatcher::Create> EdenDispatcher::create(
|
||||
});
|
||||
}
|
||||
|
||||
folly::Future<std::string> EdenDispatcher::readlink(fusell::InodeNumber ino) {
|
||||
folly::Future<std::string> EdenDispatcher::readlink(InodeNumber ino) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "readlink({})", ino);
|
||||
return inodeMap_->lookupFileInode(ino).then(
|
||||
[](const FileInodePtr& inode) { return inode->readlink(); });
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out> EdenDispatcher::mknod(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
dev_t rdev) {
|
||||
@ -187,7 +186,7 @@ folly::Future<fuse_entry_out> EdenDispatcher::mknod(
|
||||
return inodeMap_->lookupTreeInode(parent).then(
|
||||
[childName = PathComponent{name}, mode, rdev](const TreeInodePtr& inode) {
|
||||
auto child = inode->mknod(childName, mode, rdev);
|
||||
return child->getattr().then([child](fusell::Dispatcher::Attr attr) {
|
||||
return child->getattr().then([child](Dispatcher::Attr attr) {
|
||||
child->incFuseRefcount();
|
||||
return computeEntryParam(child->getNodeId(), attr);
|
||||
});
|
||||
@ -195,7 +194,7 @@ folly::Future<fuse_entry_out> EdenDispatcher::mknod(
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out> EdenDispatcher::mkdir(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
mode_t mode) {
|
||||
FB_LOGF(
|
||||
@ -208,7 +207,7 @@ folly::Future<fuse_entry_out> EdenDispatcher::mkdir(
|
||||
return inodeMap_->lookupTreeInode(parent).then(
|
||||
[childName = PathComponent{name}, mode](const TreeInodePtr& inode) {
|
||||
auto child = inode->mkdir(childName, mode);
|
||||
return child->getattr().then([child](fusell::Dispatcher::Attr attr) {
|
||||
return child->getattr().then([child](Dispatcher::Attr attr) {
|
||||
child->incFuseRefcount();
|
||||
return computeEntryParam(child->getNodeId(), attr);
|
||||
});
|
||||
@ -216,7 +215,7 @@ folly::Future<fuse_entry_out> EdenDispatcher::mkdir(
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> EdenDispatcher::unlink(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "unlink({}, {})", parent, name);
|
||||
return inodeMap_->lookupTreeInode(parent).then(
|
||||
@ -226,7 +225,7 @@ folly::Future<folly::Unit> EdenDispatcher::unlink(
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> EdenDispatcher::rmdir(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "rmdir({}, {})", parent, name);
|
||||
return inodeMap_->lookupTreeInode(parent).then(
|
||||
@ -236,7 +235,7 @@ folly::Future<folly::Unit> EdenDispatcher::rmdir(
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out> EdenDispatcher::symlink(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
StringPiece link) {
|
||||
FB_LOGF(
|
||||
@ -253,9 +252,9 @@ folly::Future<fuse_entry_out> EdenDispatcher::symlink(
|
||||
}
|
||||
|
||||
folly::Future<folly::Unit> EdenDispatcher::rename(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece namePiece,
|
||||
fusell::InodeNumber newParent,
|
||||
InodeNumber newParent,
|
||||
PathComponentPiece newNamePiece) {
|
||||
FB_LOGF(
|
||||
mount_->getStraceLogger(),
|
||||
@ -281,8 +280,8 @@ folly::Future<folly::Unit> EdenDispatcher::rename(
|
||||
}
|
||||
|
||||
folly::Future<fuse_entry_out> EdenDispatcher::link(
|
||||
fusell::InodeNumber ino,
|
||||
fusell::InodeNumber newParent,
|
||||
InodeNumber ino,
|
||||
InodeNumber newParent,
|
||||
PathComponentPiece newName) {
|
||||
FB_LOGF(
|
||||
mount_->getStraceLogger(),
|
||||
@ -299,9 +298,7 @@ folly::Future<fuse_entry_out> EdenDispatcher::link(
|
||||
EPERM, "hard links are not supported in eden mount points");
|
||||
}
|
||||
|
||||
Future<string> EdenDispatcher::getxattr(
|
||||
fusell::InodeNumber ino,
|
||||
StringPiece name) {
|
||||
Future<string> EdenDispatcher::getxattr(InodeNumber ino, StringPiece name) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "getxattr({}, {})", ino, name);
|
||||
return inodeMap_->lookupInode(ino).then(
|
||||
[attrName = name.str()](const InodePtr& inode) {
|
||||
@ -309,7 +306,7 @@ Future<string> EdenDispatcher::getxattr(
|
||||
});
|
||||
}
|
||||
|
||||
Future<vector<string>> EdenDispatcher::listxattr(fusell::InodeNumber ino) {
|
||||
Future<vector<string>> EdenDispatcher::listxattr(InodeNumber ino) {
|
||||
FB_LOGF(mount_->getStraceLogger(), DBG7, "listxattr({})", ino);
|
||||
return inodeMap_->lookupInode(ino).then(
|
||||
[](const InodePtr& inode) { return inode->listxattr(); });
|
||||
|
@ -23,7 +23,7 @@ class TreeInode;
|
||||
/**
|
||||
* A FUSE request dispatcher for eden mount points.
|
||||
*/
|
||||
class EdenDispatcher : public fusell::Dispatcher {
|
||||
class EdenDispatcher : public Dispatcher {
|
||||
public:
|
||||
/*
|
||||
* Create an EdenDispatcher.
|
||||
@ -31,64 +31,54 @@ class EdenDispatcher : public fusell::Dispatcher {
|
||||
*/
|
||||
explicit EdenDispatcher(EdenMount* mount);
|
||||
|
||||
folly::Future<Attr> getattr(fusell::InodeNumber ino) override;
|
||||
folly::Future<Attr> setattr(
|
||||
fusell::InodeNumber ino,
|
||||
const fuse_setattr_in& attr) override;
|
||||
folly::Future<std::shared_ptr<fusell::DirHandle>> opendir(
|
||||
fusell::InodeNumber ino,
|
||||
int flags) override;
|
||||
folly::Future<Attr> getattr(InodeNumber ino) override;
|
||||
folly::Future<Attr> setattr(InodeNumber ino, const fuse_setattr_in& attr)
|
||||
override;
|
||||
folly::Future<std::shared_ptr<DirHandle>> opendir(InodeNumber ino, int flags)
|
||||
override;
|
||||
folly::Future<fuse_entry_out> lookup(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name) override;
|
||||
|
||||
folly::Future<folly::Unit> forget(
|
||||
fusell::InodeNumber ino,
|
||||
unsigned long nlookup) override;
|
||||
folly::Future<std::shared_ptr<fusell::FileHandle>> open(
|
||||
fusell::InodeNumber ino,
|
||||
int flags) override;
|
||||
folly::Future<std::string> readlink(fusell::InodeNumber ino) override;
|
||||
folly::Future<folly::Unit> forget(InodeNumber ino, unsigned long nlookup)
|
||||
override;
|
||||
folly::Future<std::shared_ptr<FileHandle>> open(InodeNumber ino, int flags)
|
||||
override;
|
||||
folly::Future<std::string> readlink(InodeNumber ino) override;
|
||||
folly::Future<fuse_entry_out> mknod(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
dev_t rdev) override;
|
||||
folly::Future<fuse_entry_out> mkdir(
|
||||
fusell::InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
mode_t mode) override;
|
||||
folly::Future<folly::Unit> unlink(
|
||||
fusell::InodeNumber parent,
|
||||
PathComponentPiece name) override;
|
||||
folly::Future<folly::Unit> rmdir(
|
||||
fusell::InodeNumber parent,
|
||||
PathComponentPiece name) override;
|
||||
folly::Future<fuse_entry_out>
|
||||
mkdir(InodeNumber parent, PathComponentPiece name, mode_t mode) override;
|
||||
folly::Future<folly::Unit> unlink(InodeNumber parent, PathComponentPiece name)
|
||||
override;
|
||||
folly::Future<folly::Unit> rmdir(InodeNumber parent, PathComponentPiece name)
|
||||
override;
|
||||
folly::Future<fuse_entry_out> symlink(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
folly::StringPiece link) override;
|
||||
folly::Future<folly::Unit> rename(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber newparent,
|
||||
InodeNumber newparent,
|
||||
PathComponentPiece newname) override;
|
||||
|
||||
folly::Future<fuse_entry_out> link(
|
||||
fusell::InodeNumber ino,
|
||||
fusell::InodeNumber newparent,
|
||||
InodeNumber ino,
|
||||
InodeNumber newparent,
|
||||
PathComponentPiece newname) override;
|
||||
|
||||
folly::Future<Dispatcher::Create> create(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
int flags) override;
|
||||
folly::Future<std::string> getxattr(
|
||||
fusell::InodeNumber ino,
|
||||
folly::StringPiece name) override;
|
||||
folly::Future<std::vector<std::string>> listxattr(
|
||||
fusell::InodeNumber ino) override;
|
||||
folly::Future<std::string> getxattr(InodeNumber ino, folly::StringPiece name)
|
||||
override;
|
||||
folly::Future<std::vector<std::string>> listxattr(InodeNumber ino) override;
|
||||
|
||||
private:
|
||||
// The EdenMount that owns this EdenDispatcher.
|
||||
|
@ -22,7 +22,7 @@ EdenFileHandle::~EdenFileHandle() {
|
||||
inode_->fileHandleDidClose();
|
||||
}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> EdenFileHandle::getattr() {
|
||||
folly::Future<Dispatcher::Attr> EdenFileHandle::getattr() {
|
||||
FB_LOGF(
|
||||
inode_->getMount()->getStraceLogger(),
|
||||
DBG7,
|
||||
@ -31,11 +31,11 @@ folly::Future<fusell::Dispatcher::Attr> EdenFileHandle::getattr() {
|
||||
return inode_->getattr();
|
||||
}
|
||||
|
||||
fusell::InodeNumber EdenFileHandle::getInodeNumber() {
|
||||
InodeNumber EdenFileHandle::getInodeNumber() {
|
||||
return inode_->getNodeId();
|
||||
}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> EdenFileHandle::setattr(
|
||||
folly::Future<Dispatcher::Attr> EdenFileHandle::setattr(
|
||||
const fuse_setattr_in& attr) {
|
||||
FB_LOGF(
|
||||
inode_->getMount()->getStraceLogger(),
|
||||
@ -53,7 +53,7 @@ bool EdenFileHandle::isSeekable() const {
|
||||
return true;
|
||||
}
|
||||
|
||||
folly::Future<fusell::BufVec> EdenFileHandle::read(size_t size, off_t off) {
|
||||
folly::Future<BufVec> EdenFileHandle::read(size_t size, off_t off) {
|
||||
FB_LOGF(
|
||||
inode_->getMount()->getStraceLogger(),
|
||||
DBG7,
|
||||
@ -64,7 +64,7 @@ folly::Future<fusell::BufVec> EdenFileHandle::read(size_t size, off_t off) {
|
||||
return inode_->read(size, off);
|
||||
}
|
||||
|
||||
folly::Future<size_t> EdenFileHandle::write(fusell::BufVec&& buf, off_t off) {
|
||||
folly::Future<size_t> EdenFileHandle::write(BufVec&& buf, off_t off) {
|
||||
FB_LOGF(
|
||||
inode_->getMount()->getStraceLogger(),
|
||||
DBG7,
|
||||
|
@ -18,7 +18,7 @@ class Blob;
|
||||
class FileInode;
|
||||
class LocalStore;
|
||||
|
||||
class EdenFileHandle : public fusell::FileHandle {
|
||||
class EdenFileHandle : public FileHandle {
|
||||
public:
|
||||
/**
|
||||
* The caller is responsible for incrementing any reference counts in the
|
||||
@ -38,15 +38,14 @@ class EdenFileHandle : public fusell::FileHandle {
|
||||
// Calls fileHandleDidClose on the associated inode.
|
||||
~EdenFileHandle() override;
|
||||
|
||||
fusell::InodeNumber getInodeNumber() override;
|
||||
folly::Future<fusell::Dispatcher::Attr> getattr() override;
|
||||
folly::Future<fusell::Dispatcher::Attr> setattr(
|
||||
const fuse_setattr_in& attr) override;
|
||||
InodeNumber getInodeNumber() override;
|
||||
folly::Future<Dispatcher::Attr> getattr() override;
|
||||
folly::Future<Dispatcher::Attr> setattr(const fuse_setattr_in& attr) override;
|
||||
bool preserveCache() const override;
|
||||
bool isSeekable() const override;
|
||||
folly::Future<fusell::BufVec> read(size_t size, off_t off) override;
|
||||
folly::Future<BufVec> read(size_t size, off_t off) override;
|
||||
|
||||
folly::Future<size_t> write(fusell::BufVec&& buf, off_t off) override;
|
||||
folly::Future<size_t> write(BufVec&& buf, off_t off) override;
|
||||
folly::Future<size_t> write(folly::StringPiece data, off_t off) override;
|
||||
folly::Future<folly::Unit> flush(uint64_t lock_owner) override;
|
||||
folly::Future<folly::Unit> fsync(bool datasync) override;
|
||||
@ -60,5 +59,6 @@ class EdenFileHandle : public fusell::FileHandle {
|
||||
|
||||
FileInodePtr inode_;
|
||||
};
|
||||
|
||||
} // namespace eden
|
||||
} // namespace facebook
|
||||
|
@ -44,8 +44,6 @@
|
||||
#include "eden/fs/utils/Clock.h"
|
||||
#include "eden/fs/utils/UnboundedQueueThreadPool.h"
|
||||
|
||||
using facebook::eden::fusell::FuseChannel;
|
||||
using facebook::eden::fusell::FuseChannelData;
|
||||
using folly::Future;
|
||||
using folly::makeFuture;
|
||||
using folly::setThreadName;
|
||||
@ -370,7 +368,7 @@ const AbsolutePath& EdenMount::getPath() const {
|
||||
return path_;
|
||||
}
|
||||
|
||||
fusell::ThreadLocalEdenStats* EdenMount::getStats() const {
|
||||
ThreadLocalEdenStats* EdenMount::getStats() const {
|
||||
return &serverState_->getStats();
|
||||
}
|
||||
|
||||
@ -388,7 +386,7 @@ folly::Future<std::shared_ptr<const Tree>> EdenMount::getRootTreeFuture()
|
||||
return objectStore_->getTreeForCommit(commitHash);
|
||||
}
|
||||
|
||||
fusell::InodeNumber EdenMount::getDotEdenInodeNumber() const {
|
||||
InodeNumber EdenMount::getDotEdenInodeNumber() const {
|
||||
return dotEdenInodeNumber_;
|
||||
}
|
||||
|
||||
|
@ -40,10 +40,6 @@ class Future;
|
||||
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
namespace fusell {
|
||||
class FuseChannel;
|
||||
class MountPoint;
|
||||
} // namespace fusell
|
||||
|
||||
class BindMount;
|
||||
class CheckoutConflict;
|
||||
@ -51,9 +47,11 @@ class ClientConfig;
|
||||
class Clock;
|
||||
class DiffContext;
|
||||
class EdenDispatcher;
|
||||
class FuseChannel;
|
||||
class InodeDiffCallback;
|
||||
class InodeMap;
|
||||
class Journal;
|
||||
class MountPoint;
|
||||
class ObjectStore;
|
||||
class Overlay;
|
||||
class ServerState;
|
||||
@ -81,8 +79,7 @@ enum class CounterName {
|
||||
* EdenMount contains all of the data about a specific eden mount point.
|
||||
*
|
||||
* This contains:
|
||||
* - The fusell::MountPoint object which manages our FUSE interactions with the
|
||||
* kernel.
|
||||
* - The MountPoint object which manages our FUSE interactions with the kernel.
|
||||
* - The ObjectStore object used for retreiving/storing object data.
|
||||
* - The Overlay object used for storing local changes (that have not been
|
||||
* committed/snapshotted yet).
|
||||
@ -154,7 +151,7 @@ class EdenMount {
|
||||
* synchronization here with the mount start operation. This method provides
|
||||
* no internal synchronization of its own.)
|
||||
*/
|
||||
fusell::FuseChannel* getFuseChannel() const;
|
||||
FuseChannel* getFuseChannel() const;
|
||||
|
||||
/**
|
||||
* Return the path to the mount point.
|
||||
@ -230,7 +227,7 @@ class EdenMount {
|
||||
TreeInodePtr getRootInode() const;
|
||||
|
||||
/** Get the inode number for the .eden dir */
|
||||
fusell::InodeNumber getDotEdenInodeNumber() const;
|
||||
InodeNumber getDotEdenInodeNumber() const;
|
||||
|
||||
/** Convenience method for getting the Tree for the root of the mount. */
|
||||
std::shared_ptr<const Tree> getRootTree() const;
|
||||
@ -375,7 +372,7 @@ class EdenMount {
|
||||
* Today this is the global stats instance, but in the future it will be
|
||||
* a mount point specific instance.
|
||||
*/
|
||||
fusell::ThreadLocalEdenStats* getStats() const;
|
||||
ThreadLocalEdenStats* getStats() const;
|
||||
|
||||
folly::Logger& getStraceLogger() {
|
||||
return straceLogger_;
|
||||
@ -418,7 +415,7 @@ class EdenMount {
|
||||
* This spins up worker threads to service the existing FUSE channel and
|
||||
* returns immediately, or throws an exception on error.
|
||||
*/
|
||||
void takeoverFuse(fusell::FuseChannelData takeoverData);
|
||||
void takeoverFuse(FuseChannelData takeoverData);
|
||||
|
||||
/**
|
||||
* Obtains a future that will complete once the fuse channel has wound down.
|
||||
@ -554,7 +551,7 @@ class EdenMount {
|
||||
* Once the FuseChannel has been initialized, set up callbacks to clean up
|
||||
* correctly when the channel shuts down.
|
||||
*/
|
||||
void fuseInitSuccessful(fusell::FuseChannel::StopFuture&& fuseCompleteFuture);
|
||||
void fuseInitSuccessful(FuseChannel::StopFuture&& fuseCompleteFuture);
|
||||
|
||||
/**
|
||||
* Private destructor.
|
||||
@ -580,7 +577,7 @@ class EdenMount {
|
||||
std::unique_ptr<EdenDispatcher> dispatcher_;
|
||||
std::unique_ptr<ObjectStore> objectStore_;
|
||||
std::shared_ptr<Overlay> overlay_;
|
||||
fusell::InodeNumber dotEdenInodeNumber_{};
|
||||
InodeNumber dotEdenInodeNumber_{};
|
||||
|
||||
/**
|
||||
* A mutex around all name-changing operations in this mount point.
|
||||
@ -673,7 +670,7 @@ class EdenMount {
|
||||
/**
|
||||
* The associated fuse channel to the kernel.
|
||||
*/
|
||||
std::unique_ptr<fusell::FuseChannel, fusell::FuseChannelDeleter> channel_;
|
||||
std::unique_ptr<FuseChannel, FuseChannelDeleter> channel_;
|
||||
|
||||
/**
|
||||
* The clock. This is also available as serverState_->getClock().
|
||||
|
@ -147,7 +147,7 @@ folly::File FileInode::getFile(FileInode::State& state) const {
|
||||
FileInode::State::~State() = default;
|
||||
|
||||
std::tuple<FileInodePtr, FileInode::FileHandlePtr> FileInode::create(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parentInode,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
@ -169,7 +169,7 @@ std::tuple<FileInodePtr, FileInode::FileHandlePtr> FileInode::create(
|
||||
|
||||
// The FileInode is in NOT_LOADED or MATERIALIZED_IN_OVERLAY state.
|
||||
FileInode::FileInode(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parentInode,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
@ -184,7 +184,7 @@ FileInode::FileInode(
|
||||
|
||||
// The FileInode is in MATERIALIZED_IN_OVERLAY state.
|
||||
FileInode::FileInode(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parentInode,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
@ -193,16 +193,16 @@ FileInode::FileInode(
|
||||
: InodeBase(ino, mode_to_dtype(mode), std::move(parentInode), name),
|
||||
state_(folly::in_place, this, mode, ctime) {}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> FileInode::getattr() {
|
||||
folly::Future<Dispatcher::Attr> FileInode::getattr() {
|
||||
// Future optimization opportunity: right now, if we have not already
|
||||
// materialized the data from the entry, we have to materialize it
|
||||
// from the store. If we augmented our metadata we could avoid this,
|
||||
// and this would speed up operations like `ls`.
|
||||
return stat().then(
|
||||
[](const struct stat& st) { return fusell::Dispatcher::Attr{st}; });
|
||||
[](const struct stat& st) { return Dispatcher::Attr{st}; });
|
||||
}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> FileInode::setInodeAttr(
|
||||
folly::Future<Dispatcher::Attr> FileInode::setInodeAttr(
|
||||
const fuse_setattr_in& attr) {
|
||||
// Minor optimization: if we know that the file is being completely truncated
|
||||
// as part of this operation, there's no need to fetch the underlying data,
|
||||
@ -214,7 +214,7 @@ folly::Future<fusell::Dispatcher::Attr> FileInode::setInodeAttr(
|
||||
return future.then([self = inodePtrFromThis(), attr]() {
|
||||
self->materializeInParent();
|
||||
|
||||
auto result = fusell::Dispatcher::Attr{self->getMount()->initStatData()};
|
||||
auto result = Dispatcher::Attr{self->getMount()->initStatData()};
|
||||
|
||||
auto state = self->state_.wlock();
|
||||
CHECK_EQ(State::MATERIALIZED_IN_OVERLAY, state->tag)
|
||||
@ -354,7 +354,7 @@ folly::Optional<Hash> FileInode::getBlobHash() const {
|
||||
return state_.rlock()->hash;
|
||||
}
|
||||
|
||||
folly::Future<std::shared_ptr<fusell::FileHandle>> FileInode::open(int flags) {
|
||||
folly::Future<std::shared_ptr<FileHandle>> FileInode::open(int flags) {
|
||||
if (dtype_t::Symlink == getType()) {
|
||||
// Linux reports ELOOP if you try to open a symlink with O_NOFOLLOW set.
|
||||
// Since it isn't clear whether FUSE will allow this to happen, this
|
||||
@ -562,7 +562,7 @@ folly::Future<std::string> FileInode::readAll() {
|
||||
});
|
||||
}
|
||||
|
||||
fusell::BufVec FileInode::read(size_t size, off_t off) {
|
||||
BufVec FileInode::read(size_t size, off_t off) {
|
||||
// It's potentially possible here to optimize a fast path here only requiring
|
||||
// a read lock. However, since a write lock is required to update atime and
|
||||
// cache the file handle in the case of a materialized file, do the simple
|
||||
@ -582,7 +582,7 @@ fusell::BufVec FileInode::read(size_t size, off_t off) {
|
||||
|
||||
checkUnixError(res);
|
||||
buf->append(res);
|
||||
return fusell::BufVec{std::move(buf)};
|
||||
return BufVec{std::move(buf)};
|
||||
} else {
|
||||
// read() is either called by the FileHandle or FileInode. They must
|
||||
// guarantee openCount > 0.
|
||||
@ -592,7 +592,7 @@ fusell::BufVec FileInode::read(size_t size, off_t off) {
|
||||
|
||||
if (!cursor.canAdvance(off)) {
|
||||
// Seek beyond EOF. Return an empty result.
|
||||
return fusell::BufVec{folly::IOBuf::wrapBuffer("", 0)};
|
||||
return BufVec{folly::IOBuf::wrapBuffer("", 0)};
|
||||
}
|
||||
|
||||
cursor.skip(off);
|
||||
@ -600,11 +600,11 @@ fusell::BufVec FileInode::read(size_t size, off_t off) {
|
||||
std::unique_ptr<folly::IOBuf> result;
|
||||
cursor.cloneAtMost(result, size);
|
||||
|
||||
return fusell::BufVec{std::move(result)};
|
||||
return BufVec{std::move(result)};
|
||||
}
|
||||
}
|
||||
|
||||
folly::Future<size_t> FileInode::write(fusell::BufVec&& buf, off_t off) {
|
||||
folly::Future<size_t> FileInode::write(BufVec&& buf, off_t off) {
|
||||
auto state = state_.wlock();
|
||||
|
||||
if (State::MATERIALIZED_IN_OVERLAY != state->tag) {
|
||||
|
@ -23,11 +23,8 @@ class File;
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
|
||||
namespace fusell {
|
||||
class BufVec;
|
||||
}
|
||||
|
||||
class Blob;
|
||||
class BufVec;
|
||||
class EdenFileHandle;
|
||||
class Hash;
|
||||
class ObjectStore;
|
||||
@ -44,7 +41,7 @@ class FileInode : public InodeBase {
|
||||
* returns a new EdenFileHandle to it.
|
||||
*/
|
||||
static std::tuple<FileInodePtr, FileHandlePtr> create(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parentInode,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
@ -57,7 +54,7 @@ class FileInode : public InodeBase {
|
||||
* NOT_LOADED state.
|
||||
*/
|
||||
FileInode(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parentInode,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
@ -69,19 +66,19 @@ class FileInode : public InodeBase {
|
||||
* Overlay::openFile.
|
||||
*/
|
||||
FileInode(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parentInode,
|
||||
PathComponentPiece name,
|
||||
mode_t mode,
|
||||
folly::File&& file,
|
||||
timespec ctime);
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> getattr() override;
|
||||
folly::Future<Dispatcher::Attr> getattr() override;
|
||||
|
||||
/// Throws InodeError EINVAL if inode is not a symbolic node.
|
||||
folly::Future<std::string> readlink();
|
||||
|
||||
folly::Future<std::shared_ptr<fusell::FileHandle>> open(int flags);
|
||||
folly::Future<std::shared_ptr<FileHandle>> open(int flags);
|
||||
|
||||
folly::Future<std::vector<std::string>> listxattr() override;
|
||||
folly::Future<std::string> getxattr(folly::StringPiece name) override;
|
||||
@ -359,9 +356,9 @@ class FileInode : public InodeBase {
|
||||
* Precondition: openCount > 0. This is held because read is only called by
|
||||
* FileInode or FileHandle.
|
||||
*/
|
||||
fusell::BufVec read(size_t size, off_t off);
|
||||
BufVec read(size_t size, off_t off);
|
||||
|
||||
folly::Future<size_t> write(fusell::BufVec&& buf, off_t off);
|
||||
folly::Future<size_t> write(BufVec&& buf, off_t off);
|
||||
|
||||
folly::Future<struct stat> stat();
|
||||
void flush(uint64_t lock_owner);
|
||||
@ -376,7 +373,7 @@ class FileInode : public InodeBase {
|
||||
* Helper function used in setattr to perform FileInode specific operations
|
||||
* during setattr.
|
||||
*/
|
||||
folly::Future<fusell::Dispatcher::Attr> setInodeAttr(
|
||||
folly::Future<Dispatcher::Attr> setInodeAttr(
|
||||
const fuse_setattr_in& attr) override;
|
||||
|
||||
folly::Synchronized<State> state_;
|
||||
|
@ -42,7 +42,7 @@ InodeBase::InodeBase(EdenMount* mount)
|
||||
}
|
||||
|
||||
InodeBase::InodeBase(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
dtype_t type,
|
||||
TreeInodePtr parent,
|
||||
PathComponentPiece name)
|
||||
@ -58,7 +58,7 @@ InodeBase::InodeBase(
|
||||
}
|
||||
|
||||
// See Dispatcher::getattr
|
||||
folly::Future<fusell::Dispatcher::Attr> InodeBase::getattr() {
|
||||
folly::Future<Dispatcher::Attr> InodeBase::getattr() {
|
||||
FUSELL_NOT_IMPL();
|
||||
}
|
||||
folly::Future<folly::Unit> InodeBase::setxattr(
|
||||
@ -316,7 +316,7 @@ ParentInodeInfo InodeBase::getParentInfo() const {
|
||||
}
|
||||
|
||||
// See Dispatcher::setattr
|
||||
folly::Future<fusell::Dispatcher::Attr> InodeBase::setattr(
|
||||
folly::Future<Dispatcher::Attr> InodeBase::setattr(
|
||||
const fuse_setattr_in& attr) {
|
||||
// Check if gid and uid are same or not.
|
||||
if (attr.valid & (FATTR_UID | FATTR_GID)) {
|
||||
|
@ -41,14 +41,14 @@ class InodeBase {
|
||||
* Constructor for all non-root inodes.
|
||||
*/
|
||||
InodeBase(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
dtype_t type,
|
||||
TreeInodePtr parent,
|
||||
PathComponentPiece name);
|
||||
|
||||
virtual ~InodeBase();
|
||||
|
||||
fusell::InodeNumber getNodeId() const {
|
||||
InodeNumber getNodeId() const {
|
||||
return ino_;
|
||||
}
|
||||
|
||||
@ -102,11 +102,10 @@ class InodeBase {
|
||||
}
|
||||
|
||||
// See Dispatcher::getattr
|
||||
virtual folly::Future<fusell::Dispatcher::Attr> getattr();
|
||||
virtual folly::Future<Dispatcher::Attr> getattr();
|
||||
|
||||
// See Dispatcher::setattr
|
||||
virtual folly::Future<fusell::Dispatcher::Attr> setattr(
|
||||
const fuse_setattr_in& attr);
|
||||
virtual folly::Future<Dispatcher::Attr> setattr(const fuse_setattr_in& attr);
|
||||
|
||||
virtual folly::Future<folly::Unit>
|
||||
setxattr(folly::StringPiece name, folly::StringPiece value, int flags);
|
||||
@ -402,10 +401,10 @@ class InodeBase {
|
||||
* present and fills timestamps and other FileInode related fields or
|
||||
* TreeInode related fields.
|
||||
*/
|
||||
virtual folly::Future<fusell::Dispatcher::Attr> setInodeAttr(
|
||||
virtual folly::Future<Dispatcher::Attr> setInodeAttr(
|
||||
const fuse_setattr_in& attr) = 0;
|
||||
|
||||
fusell::InodeNumber const ino_;
|
||||
InodeNumber const ino_;
|
||||
|
||||
dtype_t const type_;
|
||||
|
||||
@ -423,8 +422,8 @@ class InodeBase {
|
||||
* API has performed on this inode. We must remember this inode number
|
||||
* for as long as the FUSE API has references to it. (However, we may unload
|
||||
* the Inode object itself, destroying ourself and letting the InodeMap
|
||||
* simply remember the association of the fusell::InodeNumber with our
|
||||
* location in the file system.)
|
||||
* simply remember the association of the InodeNumber with our location in
|
||||
* the file system.)
|
||||
*/
|
||||
std::atomic<uint32_t> numFuseReferences_{0};
|
||||
|
||||
|
@ -49,7 +49,7 @@ InodeMap::~InodeMap() {
|
||||
// destroy the EdenMount.
|
||||
}
|
||||
|
||||
void InodeMap::setMaximumExistingInodeNumber(fusell::InodeNumber max) {
|
||||
void InodeMap::setMaximumExistingInodeNumber(InodeNumber max) {
|
||||
DCHECK_GE(max, kRootNodeId);
|
||||
auto previous = nextInodeNumber_.exchange(max.get() + 1);
|
||||
DCHECK_EQ(0, previous) << "setMaximumExistingInodeNumber called twice";
|
||||
@ -82,8 +82,8 @@ void InodeMap::initializeFromTakeover(
|
||||
nextInodeNumber_.store(takeover.nextInodeNumber);
|
||||
for (const auto& entry : takeover.unloadedInodes) {
|
||||
auto unloadedEntry = UnloadedInode(
|
||||
fusell::InodeNumber::fromThrift(entry.inodeNumber),
|
||||
fusell::InodeNumber::fromThrift(entry.parentInode),
|
||||
InodeNumber::fromThrift(entry.inodeNumber),
|
||||
InodeNumber::fromThrift(entry.parentInode),
|
||||
PathComponentPiece{entry.name});
|
||||
unloadedEntry.numFuseReferences = entry.numFuseReferences;
|
||||
if (entry.numFuseReferences < 0) {
|
||||
@ -101,8 +101,7 @@ void InodeMap::initializeFromTakeover(
|
||||
unloadedEntry.mode = entry.mode;
|
||||
|
||||
auto result = data->unloadedInodes_.emplace(
|
||||
fusell::InodeNumber::fromThrift(entry.inodeNumber),
|
||||
std::move(unloadedEntry));
|
||||
InodeNumber::fromThrift(entry.inodeNumber), std::move(unloadedEntry));
|
||||
if (!result.second) {
|
||||
auto message = folly::to<std::string>(
|
||||
"failed to emplace inode number ",
|
||||
@ -114,7 +113,7 @@ void InodeMap::initializeFromTakeover(
|
||||
}
|
||||
}
|
||||
|
||||
Future<InodePtr> InodeMap::lookupInode(fusell::InodeNumber number) {
|
||||
Future<InodePtr> InodeMap::lookupInode(InodeNumber number) {
|
||||
// Lock the data.
|
||||
// We hold it while doing most of our work below, but explicitly unlock it
|
||||
// before triggering inode loading or before fulfilling any Promises.
|
||||
@ -136,9 +135,9 @@ Future<InodePtr> InodeMap::lookupInode(fusell::InodeNumber number) {
|
||||
// Look up the data in the unloadedInodes_ map.
|
||||
auto unloadedIter = data->unloadedInodes_.find(number);
|
||||
if (UNLIKELY(unloadedIter == data->unloadedInodes_.end())) {
|
||||
// This generally shouldn't happen. If a fusell::InodeNumber has been
|
||||
// allocated we should always know about it. It's a bug if our caller calls
|
||||
// us with an invalid fusell::InodeNumber number.
|
||||
// This generally shouldn't happen. If a InodeNumber has been allocated we
|
||||
// should always know about it. It's a bug if our caller calls us with an
|
||||
// invalid InodeNumber number.
|
||||
auto bug = EDEN_BUG() << "InodeMap called with unknown inode number "
|
||||
<< number;
|
||||
return folly::makeFuture<InodePtr>(bug.toException());
|
||||
@ -239,7 +238,7 @@ void InodeMap::setupParentLookupPromise(
|
||||
Promise<InodePtr>& promise,
|
||||
PathComponentPiece childName,
|
||||
bool isUnlinked,
|
||||
fusell::InodeNumber childInodeNumber,
|
||||
InodeNumber childInodeNumber,
|
||||
folly::Optional<Hash> hash,
|
||||
mode_t mode) {
|
||||
promise.getFuture()
|
||||
@ -261,7 +260,7 @@ void InodeMap::startChildLookup(
|
||||
const InodePtr& parent,
|
||||
PathComponentPiece childName,
|
||||
bool isUnlinked,
|
||||
fusell::InodeNumber childInodeNumber,
|
||||
InodeNumber childInodeNumber,
|
||||
folly::Optional<Hash> hash,
|
||||
mode_t mode) {
|
||||
auto treeInode = parent.asTreePtrOrNull();
|
||||
@ -322,7 +321,7 @@ InodeMap::PromiseVector InodeMap::inodeLoadComplete(InodeBase* inode) {
|
||||
}
|
||||
|
||||
void InodeMap::inodeLoadFailed(
|
||||
fusell::InodeNumber number,
|
||||
InodeNumber number,
|
||||
const folly::exception_wrapper& ex) {
|
||||
XLOG(ERR) << "failed to load inode " << number << ": "
|
||||
<< folly::exceptionStr(ex);
|
||||
@ -332,8 +331,7 @@ void InodeMap::inodeLoadFailed(
|
||||
}
|
||||
}
|
||||
|
||||
InodeMap::PromiseVector InodeMap::extractPendingPromises(
|
||||
fusell::InodeNumber number) {
|
||||
InodeMap::PromiseVector InodeMap::extractPendingPromises(InodeNumber number) {
|
||||
PromiseVector promises;
|
||||
{
|
||||
auto data = data_.wlock();
|
||||
@ -346,17 +344,17 @@ InodeMap::PromiseVector InodeMap::extractPendingPromises(
|
||||
return promises;
|
||||
}
|
||||
|
||||
Future<TreeInodePtr> InodeMap::lookupTreeInode(fusell::InodeNumber number) {
|
||||
Future<TreeInodePtr> InodeMap::lookupTreeInode(InodeNumber number) {
|
||||
return lookupInode(number).then(
|
||||
[](const InodePtr& inode) { return inode.asTreePtr(); });
|
||||
}
|
||||
|
||||
Future<FileInodePtr> InodeMap::lookupFileInode(fusell::InodeNumber number) {
|
||||
Future<FileInodePtr> InodeMap::lookupFileInode(InodeNumber number) {
|
||||
return lookupInode(number).then(
|
||||
[](const InodePtr& inode) { return inode.asFilePtr(); });
|
||||
}
|
||||
|
||||
InodePtr InodeMap::lookupLoadedInode(fusell::InodeNumber number) {
|
||||
InodePtr InodeMap::lookupLoadedInode(InodeNumber number) {
|
||||
auto data = data_.rlock();
|
||||
auto it = data->loadedInodes_.find(number);
|
||||
if (it == data->loadedInodes_.end()) {
|
||||
@ -365,7 +363,7 @@ InodePtr InodeMap::lookupLoadedInode(fusell::InodeNumber number) {
|
||||
return it->second.getPtr();
|
||||
}
|
||||
|
||||
TreeInodePtr InodeMap::lookupLoadedTree(fusell::InodeNumber number) {
|
||||
TreeInodePtr InodeMap::lookupLoadedTree(InodeNumber number) {
|
||||
auto inode = lookupLoadedInode(number);
|
||||
if (!inode) {
|
||||
return nullptr;
|
||||
@ -373,7 +371,7 @@ TreeInodePtr InodeMap::lookupLoadedTree(fusell::InodeNumber number) {
|
||||
return inode.asTreePtr();
|
||||
}
|
||||
|
||||
FileInodePtr InodeMap::lookupLoadedFile(fusell::InodeNumber number) {
|
||||
FileInodePtr InodeMap::lookupLoadedFile(InodeNumber number) {
|
||||
auto inode = lookupLoadedInode(number);
|
||||
if (!inode) {
|
||||
return nullptr;
|
||||
@ -381,13 +379,13 @@ FileInodePtr InodeMap::lookupLoadedFile(fusell::InodeNumber number) {
|
||||
return inode.asFilePtr();
|
||||
}
|
||||
|
||||
UnloadedInodeData InodeMap::lookupUnloadedInode(fusell::InodeNumber number) {
|
||||
UnloadedInodeData InodeMap::lookupUnloadedInode(InodeNumber number) {
|
||||
auto data = data_.rlock();
|
||||
auto it = data->unloadedInodes_.find(number);
|
||||
if (it == data->unloadedInodes_.end()) {
|
||||
// This generally shouldn't happen. If a fusell::InodeNumber has been
|
||||
// allocated we should always know about it. It's a bug if our caller calls
|
||||
// us with an invalid fusell::InodeNumber number.
|
||||
// This generally shouldn't happen. If a InodeNumber has been allocated we
|
||||
// should always know about it. It's a bug if our caller calls us with an
|
||||
// invalid InodeNumber number.
|
||||
XLOG(ERR) << "InodeMap called with unknown inode number " << number;
|
||||
throwSystemErrorExplicit(EINVAL, "unknown inode number ", number);
|
||||
}
|
||||
@ -396,13 +394,13 @@ UnloadedInodeData InodeMap::lookupUnloadedInode(fusell::InodeNumber number) {
|
||||
}
|
||||
|
||||
folly::Optional<RelativePath> InodeMap::getPathForInode(
|
||||
fusell::InodeNumber inodeNumber) {
|
||||
InodeNumber inodeNumber) {
|
||||
auto data = data_.rlock();
|
||||
return getPathForInodeHelper(inodeNumber, data);
|
||||
}
|
||||
|
||||
folly::Optional<RelativePath> InodeMap::getPathForInodeHelper(
|
||||
fusell::InodeNumber inodeNumber,
|
||||
InodeNumber inodeNumber,
|
||||
const folly::Synchronized<Members>::ConstLockedPtr& data) {
|
||||
auto loadedIt = data->loadedInodes_.find(inodeNumber);
|
||||
if (loadedIt != data->loadedInodes_.cend()) {
|
||||
@ -433,7 +431,7 @@ folly::Optional<RelativePath> InodeMap::getPathForInodeHelper(
|
||||
}
|
||||
}
|
||||
|
||||
void InodeMap::decFuseRefcount(fusell::InodeNumber number, uint32_t count) {
|
||||
void InodeMap::decFuseRefcount(InodeNumber number, uint32_t count) {
|
||||
auto data = data_.wlock();
|
||||
|
||||
// First check in the loaded inode map
|
||||
@ -731,7 +729,7 @@ void InodeMap::unloadInode(
|
||||
bool InodeMap::shouldLoadChild(
|
||||
const TreeInode* parent,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber childInode,
|
||||
InodeNumber childInode,
|
||||
folly::Promise<InodePtr> promise) {
|
||||
auto data = data_.wlock();
|
||||
// This is a sanity check - no big deal if we race with allocateInodeNumber.
|
||||
@ -739,7 +737,7 @@ bool InodeMap::shouldLoadChild(
|
||||
auto iter = data->unloadedInodes_.find(childInode);
|
||||
UnloadedInode* unloadedData{nullptr};
|
||||
if (iter == data->unloadedInodes_.end()) {
|
||||
fusell::InodeNumber parentNumber = parent->getNodeId();
|
||||
InodeNumber parentNumber = parent->getNodeId();
|
||||
auto newUnloadedData = UnloadedInode(childInode, parentNumber, name);
|
||||
auto ret =
|
||||
data->unloadedInodes_.emplace(childInode, std::move(newUnloadedData));
|
||||
@ -761,24 +759,23 @@ bool InodeMap::shouldLoadChild(
|
||||
return isFirstPromise;
|
||||
}
|
||||
|
||||
fusell::InodeNumber InodeMap::allocateInodeNumber() {
|
||||
// fusell::InodeNumber should generally be 64-bits wide, in which case it
|
||||
// isn't even worth bothering to handle the case where nextInodeNumber_ wraps.
|
||||
// We don't need to bother checking for conflicts with existing inode numbers
|
||||
// since this can only happen if we wrap around.
|
||||
// We don't currently support platforms with 32-bit inode numbers.
|
||||
InodeNumber InodeMap::allocateInodeNumber() {
|
||||
// InodeNumber should generally be 64-bits wide, in which case it isn't even
|
||||
// worth bothering to handle the case where nextInodeNumber_ wraps. We don't
|
||||
// need to bother checking for conflicts with existing inode numbers since
|
||||
// this can only happen if we wrap around. We don't currently support
|
||||
// platforms with 32-bit inode numbers.
|
||||
static_assert(
|
||||
sizeof(nextInodeNumber_) == sizeof(fusell::InodeNumber),
|
||||
"expected nextInodeNumber_ and fusell::InodeNumber to have the same size");
|
||||
sizeof(nextInodeNumber_) == sizeof(InodeNumber),
|
||||
"expected nextInodeNumber_ and InodeNumber to have the same size");
|
||||
static_assert(
|
||||
sizeof(fusell::InodeNumber) >= 8,
|
||||
"expected fusell::InodeNumber to be at least 64 bits");
|
||||
sizeof(InodeNumber) >= 8, "expected InodeNumber to be at least 64 bits");
|
||||
|
||||
// This could be a relaxed atomic operation. It doesn't matter on x86 but
|
||||
// might on ARM.
|
||||
auto previous = nextInodeNumber_++;
|
||||
DCHECK_NE(0, previous) << "allocateInodeNumber called before initialize";
|
||||
return fusell::InodeNumber{previous};
|
||||
return InodeNumber{previous};
|
||||
}
|
||||
|
||||
void InodeMap::inodeCreated(const InodePtr& inode) {
|
||||
|
@ -35,28 +35,25 @@ class TreeInode;
|
||||
class ParentInodeInfo;
|
||||
|
||||
struct UnloadedInodeData {
|
||||
UnloadedInodeData(fusell::InodeNumber p, PathComponentPiece n)
|
||||
: parent(p), name(n) {}
|
||||
UnloadedInodeData(InodeNumber p, PathComponentPiece n) : parent(p), name(n) {}
|
||||
|
||||
fusell::InodeNumber const parent;
|
||||
InodeNumber const parent;
|
||||
PathComponent const name;
|
||||
};
|
||||
|
||||
class InodeMapLock;
|
||||
|
||||
/**
|
||||
* InodeMap allows looking up Inode objects based on a inode number
|
||||
* (fusell::InodeNumber).
|
||||
* InodeMap allows looking up Inode objects based on a inode number.
|
||||
*
|
||||
* All operations on this class are thread-safe.
|
||||
*
|
||||
* Note that fusell::InodeNumber values and Inode objects have separate
|
||||
* lifetimes:
|
||||
* - fusell::InodeNumber numbers are allocated when we need to return a
|
||||
* fusell::InodeNumber value to the FUSE APIs. These are generally allocated by
|
||||
* lookup() calls. FUSE will call forget() to let us know when we can forget
|
||||
* about a fusell::InodeNumber value. (We may not necessarily forget about the
|
||||
* fusell::InodeNumber value immediately, though.)
|
||||
* Note that InodeNumber values and Inode objects have separate lifetimes:
|
||||
* - Inode numbers are allocated when we need to return a InodeNumber value to
|
||||
* the FUSE APIs. These are generally allocated by lookup() calls. FUSE will
|
||||
* call forget() to let us know when we can forget about a InodeNumber value.
|
||||
* (We may not necessarily forget about the InodeNumber value immediately,
|
||||
* though.)
|
||||
*
|
||||
* - InodeBase objects are needed when we have to actually operate on a file or
|
||||
* directory. Any operation more than looking up a file name (or some of its
|
||||
@ -71,26 +68,26 @@ class InodeMapLock;
|
||||
* the entire repository we don't want to keep Inode objects loaded for all
|
||||
* files forever.)
|
||||
*
|
||||
* We can unload an InodeBase object even when the fusell::InodeNumber value is
|
||||
* still valid. Therefore this class contains two separate maps:
|
||||
* - (fusell::InodeNumber --> InodeBase)
|
||||
* We can unload an InodeBase object even when the InodeNumber value is still
|
||||
* valid. Therefore this class contains two separate maps:
|
||||
* - (InodeNumber --> InodeBase)
|
||||
* This map stores all currently loaded Inodes.
|
||||
* - (fusell::InodeNumber --> (parent fusell::InodeNumber, name))
|
||||
* - (InodeNumber --> (parent InodeNumber, name))
|
||||
* This map contains information about Inodes that are not currently loaded.
|
||||
* This map contains enough information to identify the file or directory in
|
||||
* question if we do need to load the inode. The parent directory's
|
||||
* fusell::InodeNumber may not be loaded either; we have to load it first in
|
||||
* order to load the inode in question.
|
||||
* InodeNumber may not be loaded either; we have to load it first in order to
|
||||
* load the inode in question.
|
||||
*
|
||||
* Additional Notes about fusell::InodeNumber allocation:
|
||||
* - fusell::InodeNumber numbers are primarily allocated via the
|
||||
* Additional Notes about InodeNumber allocation:
|
||||
* - InodeNumber numbers are primarily allocated via the
|
||||
* EdenDispatcher::lookup() call.
|
||||
*
|
||||
* Rather than only allocate a fusell::InodeNumber in this case, we go ahead
|
||||
* and load the actual TreeInode/FileInode, since FUSE is very likely to make
|
||||
* another call for this inode next. Therefore, in this case the newly
|
||||
* allocated inode number is inserted directly into loadedInodes_, without ever
|
||||
* being in unloadedInodes_.
|
||||
* Rather than only allocate a InodeNumber in this case, we go ahead and load
|
||||
* the actual TreeInode/FileInode, since FUSE is very likely to make another
|
||||
* call for this inode next. Therefore, in this case the newly allocated
|
||||
* inode number is inserted directly into loadedInodes_, without ever being
|
||||
* in unloadedInodes_.
|
||||
*
|
||||
* The unloadedInodes_ map is primarily for inodes that were loaded and have
|
||||
* since been unloaded due to inactivity.
|
||||
@ -98,8 +95,8 @@ class InodeMapLock;
|
||||
* - Inode objects can either be allocated via EdenDispatcher::lookup(), or via
|
||||
* an operation on a TreeInode looking up a child entry.
|
||||
*
|
||||
* We currently always allocate a fusell::InodeNumber value for any new Inode
|
||||
* object even if it is not needed yet by the FUSE APIs.
|
||||
* We currently always allocate a InodeNumber value for any new Inode object
|
||||
* even if it is not needed yet by the FUSE APIs.
|
||||
*/
|
||||
class InodeMap {
|
||||
public:
|
||||
@ -121,7 +118,7 @@ class InodeMap {
|
||||
* mounted before, this should be the maximum value across all the
|
||||
* outstanding inodes.
|
||||
*/
|
||||
void setMaximumExistingInodeNumber(fusell::InodeNumber max);
|
||||
void setMaximumExistingInodeNumber(InodeNumber max);
|
||||
|
||||
/**
|
||||
* Initialize the InodeMap
|
||||
@ -175,7 +172,7 @@ class InodeMap {
|
||||
* invoked immediately in the calling thread (if the Inode is already
|
||||
* available), or it may be invoked later in a different thread.
|
||||
*/
|
||||
folly::Future<InodePtr> lookupInode(fusell::InodeNumber number);
|
||||
folly::Future<InodePtr> lookupInode(InodeNumber number);
|
||||
|
||||
/**
|
||||
* Lookup a TreeInode object by inode number.
|
||||
@ -184,7 +181,7 @@ class InodeMap {
|
||||
* The returned Future throws ENOTDIR if this inode number does not refer to
|
||||
* a directory.
|
||||
*/
|
||||
folly::Future<TreeInodePtr> lookupTreeInode(fusell::InodeNumber number);
|
||||
folly::Future<TreeInodePtr> lookupTreeInode(InodeNumber number);
|
||||
|
||||
/**
|
||||
* Lookup a FileInode object by inode number.
|
||||
@ -193,7 +190,7 @@ class InodeMap {
|
||||
* The returned Future throws EISDIR if this inode number refers to a
|
||||
* directory.
|
||||
*/
|
||||
folly::Future<FileInodePtr> lookupFileInode(fusell::InodeNumber number);
|
||||
folly::Future<FileInodePtr> lookupFileInode(InodeNumber number);
|
||||
|
||||
/**
|
||||
* Lookup an Inode object by inode number, if it alread exists.
|
||||
@ -202,7 +199,7 @@ class InodeMap {
|
||||
* but nullptr if one is not loaded. lookupUnloadedInode() can then be
|
||||
* called to find data for the unloaded inode.
|
||||
*/
|
||||
InodePtr lookupLoadedInode(fusell::InodeNumber number);
|
||||
InodePtr lookupLoadedInode(InodeNumber number);
|
||||
|
||||
/**
|
||||
* Lookup a loaded TreeInode object by inode number, if it alread exists.
|
||||
@ -210,7 +207,7 @@ class InodeMap {
|
||||
* Returns nullptr if this inode object is not currently loaded.
|
||||
* Throws ENOTDIR if this inode is loaded but does not refer to a directory.
|
||||
*/
|
||||
TreeInodePtr lookupLoadedTree(fusell::InodeNumber number);
|
||||
TreeInodePtr lookupLoadedTree(InodeNumber number);
|
||||
|
||||
/**
|
||||
* Lookup a loaded FileInode object by inode number, if it alread exists.
|
||||
@ -218,7 +215,7 @@ class InodeMap {
|
||||
* Returns nullptr if this inode object is not currently loaded.
|
||||
* Throws EISDIR if this inode is loaded but refers to a directory.
|
||||
*/
|
||||
FileInodePtr lookupLoadedFile(fusell::InodeNumber number);
|
||||
FileInodePtr lookupLoadedFile(InodeNumber number);
|
||||
|
||||
/**
|
||||
* Lookup data about an unloaded Inode object.
|
||||
@ -227,7 +224,7 @@ class InodeMap {
|
||||
* inode is not currently loaded. Unloaded inode data will only be found if
|
||||
* the object is not currently loaded.
|
||||
*/
|
||||
UnloadedInodeData lookupUnloadedInode(fusell::InodeNumber number);
|
||||
UnloadedInodeData lookupUnloadedInode(InodeNumber number);
|
||||
|
||||
/**
|
||||
* Recursively determines the path for a loaded or unloaded inode. If the
|
||||
@ -239,8 +236,7 @@ class InodeMap {
|
||||
* If there is an unlinked inode in the path, this function returns
|
||||
* folly::none. If the inode is invalid, it throws EINVAL.
|
||||
*/
|
||||
folly::Optional<RelativePath> getPathForInode(
|
||||
fusell::InodeNumber inodeNumber);
|
||||
folly::Optional<RelativePath> getPathForInode(InodeNumber inodeNumber);
|
||||
|
||||
/**
|
||||
* Decrement the number of outstanding FUSE references to an inode number.
|
||||
@ -252,7 +248,7 @@ class InodeMap {
|
||||
* object. Therefore decrements are performed on the InodeMap so that we can
|
||||
* avoid loading an Inode object just to decrement its reference count.
|
||||
*/
|
||||
void decFuseRefcount(fusell::InodeNumber number, uint32_t count = 1);
|
||||
void decFuseRefcount(InodeNumber number, uint32_t count = 1);
|
||||
|
||||
/**
|
||||
* Shutdown the InodeMap.
|
||||
@ -345,7 +341,7 @@ class InodeMap {
|
||||
bool shouldLoadChild(
|
||||
const TreeInode* parent,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber childInode,
|
||||
InodeNumber childInode,
|
||||
folly::Promise<InodePtr> promise);
|
||||
|
||||
/**
|
||||
@ -369,7 +365,7 @@ class InodeMap {
|
||||
* This should be called when an attempt to load a child inode fails.
|
||||
*/
|
||||
void inodeLoadFailed(
|
||||
fusell::InodeNumber number,
|
||||
InodeNumber number,
|
||||
const folly::exception_wrapper& exception);
|
||||
|
||||
/**
|
||||
@ -389,7 +385,7 @@ class InodeMap {
|
||||
* TODO: It would be easy to extend this function to allocate a range of
|
||||
* inode values in one atomic operation.
|
||||
*/
|
||||
fusell::InodeNumber allocateInodeNumber();
|
||||
InodeNumber allocateInodeNumber();
|
||||
|
||||
void inodeCreated(const InodePtr& inode);
|
||||
|
||||
@ -422,13 +418,13 @@ class InodeMap {
|
||||
*/
|
||||
struct UnloadedInode {
|
||||
UnloadedInode(
|
||||
fusell::InodeNumber num,
|
||||
fusell::InodeNumber parentNum,
|
||||
InodeNumber num,
|
||||
InodeNumber parentNum,
|
||||
PathComponentPiece entryName)
|
||||
: number(num), parent(parentNum), name(entryName) {}
|
||||
|
||||
fusell::InodeNumber const number;
|
||||
fusell::InodeNumber const parent;
|
||||
InodeNumber const number;
|
||||
InodeNumber const parent;
|
||||
PathComponent const name;
|
||||
|
||||
/**
|
||||
@ -514,12 +510,12 @@ class InodeMap {
|
||||
* looked up the InodeMap will wrap the Inode in an InodePtr so that the
|
||||
* caller acquires a reference.
|
||||
*/
|
||||
std::unordered_map<fusell::InodeNumber, LoadedInode> loadedInodes_;
|
||||
std::unordered_map<InodeNumber, LoadedInode> loadedInodes_;
|
||||
|
||||
/**
|
||||
* The map of currently unloaded inodes
|
||||
*/
|
||||
std::unordered_map<fusell::InodeNumber, UnloadedInode> unloadedInodes_;
|
||||
std::unordered_map<InodeNumber, UnloadedInode> unloadedInodes_;
|
||||
|
||||
/**
|
||||
* A promise to fulfill once shutdown() completes.
|
||||
@ -544,14 +540,14 @@ class InodeMap {
|
||||
folly::Promise<InodePtr>& promise,
|
||||
PathComponentPiece childName,
|
||||
bool isUnlinked,
|
||||
fusell::InodeNumber childInodeNumber,
|
||||
InodeNumber childInodeNumber,
|
||||
folly::Optional<Hash> hash,
|
||||
mode_t mode);
|
||||
void startChildLookup(
|
||||
const InodePtr& parent,
|
||||
PathComponentPiece childName,
|
||||
bool isUnlinked,
|
||||
fusell::InodeNumber childInodeNumber,
|
||||
InodeNumber childInodeNumber,
|
||||
folly::Optional<Hash> hash,
|
||||
mode_t mode);
|
||||
|
||||
@ -562,10 +558,10 @@ class InodeMap {
|
||||
* This method acquires the data_ lock internally.
|
||||
* It should never be called while already holding the lock.
|
||||
*/
|
||||
PromiseVector extractPendingPromises(fusell::InodeNumber number);
|
||||
PromiseVector extractPendingPromises(InodeNumber number);
|
||||
|
||||
folly::Optional<RelativePath> getPathForInodeHelper(
|
||||
fusell::InodeNumber inodeNumber,
|
||||
InodeNumber inodeNumber,
|
||||
const folly::Synchronized<Members>::ConstLockedPtr& data);
|
||||
|
||||
/**
|
||||
|
@ -205,7 +205,7 @@ void Overlay::initNewOverlay() {
|
||||
}
|
||||
|
||||
Optional<TreeInode::Dir> Overlay::loadOverlayDir(
|
||||
fusell::InodeNumber inodeNumber,
|
||||
InodeNumber inodeNumber,
|
||||
InodeMap* /*inodeMap*/) const {
|
||||
TreeInode::Dir result;
|
||||
auto dirData = deserializeOverlayDir(inodeNumber, result.timeStamps);
|
||||
@ -225,16 +225,15 @@ Optional<TreeInode::Dir> Overlay::loadOverlayDir(
|
||||
result.entries.emplace(
|
||||
PathComponentPiece{name},
|
||||
value.mode,
|
||||
fusell::InodeNumber::fromThrift(value.inodeNumber));
|
||||
InodeNumber::fromThrift(value.inodeNumber));
|
||||
}
|
||||
}
|
||||
|
||||
return folly::Optional<TreeInode::Dir>(std::move(result));
|
||||
}
|
||||
|
||||
void Overlay::saveOverlayDir(
|
||||
fusell::InodeNumber inodeNumber,
|
||||
const TreeInode::Dir& dir) const {
|
||||
void Overlay::saveOverlayDir(InodeNumber inodeNumber, const TreeInode::Dir& dir)
|
||||
const {
|
||||
// TODO: T20282158 clean up access of child inode information.
|
||||
//
|
||||
// Translate the data to the thrift equivalents
|
||||
@ -278,14 +277,14 @@ void Overlay::saveOverlayDir(
|
||||
getFilePath(inodeNumber).stringPiece(), iov.data(), iov.size());
|
||||
}
|
||||
|
||||
void Overlay::removeOverlayData(fusell::InodeNumber inodeNumber) const {
|
||||
void Overlay::removeOverlayData(InodeNumber inodeNumber) const {
|
||||
auto path = getFilePath(inodeNumber);
|
||||
if (::unlink(path.value().c_str()) != 0 && errno != ENOENT) {
|
||||
folly::throwSystemError("error unlinking overlay file: ", path);
|
||||
}
|
||||
}
|
||||
|
||||
fusell::InodeNumber Overlay::getMaxRecordedInode() {
|
||||
InodeNumber Overlay::getMaxRecordedInode() {
|
||||
// TODO: We should probably store the max inode number in the header file
|
||||
// during graceful unmount. When opening an overlay we can then simply read
|
||||
// back the max inode number from this file if the overlay was shut down
|
||||
@ -304,7 +303,7 @@ fusell::InodeNumber Overlay::getMaxRecordedInode() {
|
||||
// simpler scan of opening every single file. For now we have to walk the
|
||||
// directory tree from the root downwards.
|
||||
auto maxInode = kRootNodeId;
|
||||
std::vector<fusell::InodeNumber> toProcess;
|
||||
std::vector<InodeNumber> toProcess;
|
||||
toProcess.push_back(maxInode);
|
||||
while (!toProcess.empty()) {
|
||||
auto dirInodeNumber = toProcess.back();
|
||||
@ -320,8 +319,7 @@ fusell::InodeNumber Overlay::getMaxRecordedInode() {
|
||||
if (entry.second.inodeNumber == 0) {
|
||||
continue;
|
||||
}
|
||||
auto entryInode =
|
||||
fusell::InodeNumber::fromThrift(entry.second.inodeNumber);
|
||||
auto entryInode = InodeNumber::fromThrift(entry.second.inodeNumber);
|
||||
maxInode = std::max(maxInode, entryInode);
|
||||
if (mode_to_dtype(entry.second.mode) == dtype_t::Dir) {
|
||||
toProcess.push_back(entryInode);
|
||||
@ -343,8 +341,7 @@ fusell::InodeNumber Overlay::getMaxRecordedInode() {
|
||||
auto entryInodeNumber =
|
||||
folly::tryTo<uint64_t>(entry.path().filename().string());
|
||||
if (entryInodeNumber.hasValue()) {
|
||||
maxInode =
|
||||
std::max(maxInode, fusell::InodeNumber{entryInodeNumber.value()});
|
||||
maxInode = std::max(maxInode, InodeNumber{entryInodeNumber.value()});
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -356,7 +353,7 @@ const AbsolutePath& Overlay::getLocalDir() const {
|
||||
return localDir_;
|
||||
}
|
||||
|
||||
AbsolutePath Overlay::getFilePath(fusell::InodeNumber inodeNumber) const {
|
||||
AbsolutePath Overlay::getFilePath(InodeNumber inodeNumber) const {
|
||||
std::array<char, 2> subdir;
|
||||
formatSubdirPath(
|
||||
MutableStringPiece{subdir.data(), subdir.size()}, inodeNumber.get());
|
||||
@ -367,7 +364,7 @@ AbsolutePath Overlay::getFilePath(fusell::InodeNumber inodeNumber) const {
|
||||
}
|
||||
|
||||
Optional<overlay::OverlayDir> Overlay::deserializeOverlayDir(
|
||||
fusell::InodeNumber inodeNumber,
|
||||
InodeNumber inodeNumber,
|
||||
InodeTimestamps& timeStamps) const {
|
||||
auto path = getFilePath(inodeNumber);
|
||||
|
||||
@ -467,7 +464,7 @@ void Overlay::addHeaderToOverlayFile(int fd, timespec ctime) {
|
||||
|
||||
// Helper function to create an overlay file
|
||||
folly::File Overlay::createOverlayFile(
|
||||
fusell::InodeNumber childNumber,
|
||||
InodeNumber childNumber,
|
||||
timespec ctime) {
|
||||
auto filePath = getFilePath(childNumber);
|
||||
folly::File file(filePath.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600);
|
||||
|
@ -50,19 +50,17 @@ class Overlay {
|
||||
/** Returns the path to the root of the Overlay storage area */
|
||||
const AbsolutePath& getLocalDir() const;
|
||||
|
||||
void saveOverlayDir(
|
||||
fusell::InodeNumber inodeNumber,
|
||||
const TreeInode::Dir& dir) const;
|
||||
void saveOverlayDir(InodeNumber inodeNumber, const TreeInode::Dir& dir) const;
|
||||
folly::Optional<TreeInode::Dir> loadOverlayDir(
|
||||
fusell::InodeNumber inodeNumber,
|
||||
InodeNumber inodeNumber,
|
||||
InodeMap* inodeMap) const;
|
||||
|
||||
void removeOverlayData(fusell::InodeNumber inodeNumber) const;
|
||||
void removeOverlayData(InodeNumber inodeNumber) const;
|
||||
|
||||
/**
|
||||
* Get the path to the overlay file for the given inode
|
||||
*/
|
||||
AbsolutePath getFilePath(fusell::InodeNumber inodeNumber) const;
|
||||
AbsolutePath getFilePath(InodeNumber inodeNumber) const;
|
||||
/**
|
||||
* Creates header for the files stored in Overlay
|
||||
*/
|
||||
@ -84,9 +82,7 @@ class Overlay {
|
||||
/**
|
||||
* Helper function that creates a new overlay file and adds header to it
|
||||
*/
|
||||
folly::File createOverlayFile(
|
||||
fusell::InodeNumber childNumber,
|
||||
timespec ctime);
|
||||
folly::File createOverlayFile(InodeNumber childNumber, timespec ctime);
|
||||
|
||||
/**
|
||||
* Updates the timestamps of an overlay file appropriately
|
||||
@ -103,7 +99,7 @@ class Overlay {
|
||||
* handed out from this point forwards are always greater than any inodes
|
||||
* already tracked in the overlay.
|
||||
*/
|
||||
fusell::InodeNumber getMaxRecordedInode();
|
||||
InodeNumber getMaxRecordedInode();
|
||||
|
||||
/**
|
||||
* Constants for an header in overlay file.
|
||||
@ -119,7 +115,7 @@ class Overlay {
|
||||
void readExistingOverlay(int infoFD);
|
||||
void initNewOverlay();
|
||||
folly::Optional<overlay::OverlayDir> deserializeOverlayDir(
|
||||
fusell::InodeNumber inodeNumber,
|
||||
InodeNumber inodeNumber,
|
||||
InodeTimestamps& timeStamps) const;
|
||||
/**
|
||||
* Helper function to add header to the overlay file
|
||||
|
@ -59,7 +59,7 @@ class ServerState {
|
||||
* Get the ThreadLocalEdenStats object that tracks process-wide (rather than
|
||||
* per-mount) statistics.
|
||||
*/
|
||||
fusell::ThreadLocalEdenStats& getStats() {
|
||||
ThreadLocalEdenStats& getStats() {
|
||||
return edenStats_;
|
||||
}
|
||||
|
||||
@ -97,7 +97,7 @@ class ServerState {
|
||||
private:
|
||||
AbsolutePath socketPath_;
|
||||
UserInfo userInfo_;
|
||||
fusell::ThreadLocalEdenStats edenStats_;
|
||||
ThreadLocalEdenStats edenStats_;
|
||||
std::shared_ptr<PrivHelper> privHelper_;
|
||||
std::shared_ptr<UnboundedQueueThreadPool> threadPool_;
|
||||
std::shared_ptr<Clock> clock_;
|
||||
|
@ -91,7 +91,7 @@ class TreeInode::IncompleteInodeLoad {
|
||||
TreeInode* inode,
|
||||
Future<unique_ptr<InodeBase>>&& future,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number)
|
||||
InodeNumber number)
|
||||
: treeInode_{inode},
|
||||
number_{number},
|
||||
name_{name},
|
||||
@ -132,13 +132,13 @@ class TreeInode::IncompleteInodeLoad {
|
||||
// to null in any IncompleteInodeLoad objects that are moved-away from.
|
||||
// We don't actually own the TreeInode and we don't destroy it.
|
||||
std::unique_ptr<TreeInode, NoopDeleter> treeInode_;
|
||||
fusell::InodeNumber number_;
|
||||
InodeNumber number_;
|
||||
PathComponent name_;
|
||||
Future<unique_ptr<InodeBase>> future_;
|
||||
};
|
||||
|
||||
TreeInode::TreeInode(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parent,
|
||||
PathComponentPiece name,
|
||||
std::shared_ptr<const Tree>&& tree)
|
||||
@ -152,7 +152,7 @@ TreeInode::TreeInode(
|
||||
parent->getInodeMap())) {}
|
||||
|
||||
TreeInode::TreeInode(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parent,
|
||||
PathComponentPiece name,
|
||||
Dir&& dir)
|
||||
@ -173,12 +173,12 @@ TreeInode::TreeInode(EdenMount* mount, Dir&& dir)
|
||||
|
||||
TreeInode::~TreeInode() {}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> TreeInode::getattr() {
|
||||
folly::Future<Dispatcher::Attr> TreeInode::getattr() {
|
||||
return getAttrLocked(&*contents_.rlock());
|
||||
}
|
||||
|
||||
fusell::Dispatcher::Attr TreeInode::getAttrLocked(const Dir* contents) {
|
||||
fusell::Dispatcher::Attr attr(getMount()->initStatData());
|
||||
Dispatcher::Attr TreeInode::getAttrLocked(const Dir* contents) {
|
||||
Dispatcher::Attr attr(getMount()->initStatData());
|
||||
|
||||
attr.st.st_mode = S_IFDIR | 0755;
|
||||
attr.st.st_ino = getNodeId().get();
|
||||
@ -209,7 +209,7 @@ Future<InodePtr> TreeInode::getOrLoadChild(PathComponentPiece name) {
|
||||
folly::Optional<Future<InodePtr>> returnFuture;
|
||||
InodePtr childInodePtr;
|
||||
InodeMap::PromiseVector promises;
|
||||
fusell::InodeNumber childNumber;
|
||||
InodeNumber childNumber;
|
||||
{
|
||||
auto contents = contents_.wlock();
|
||||
auto iter = contents->entries.find(name);
|
||||
@ -337,7 +337,7 @@ Future<InodePtr> TreeInode::getChildRecursive(RelativePathPiece path) {
|
||||
return future.ensure([p = std::move(processor)]() mutable { p.reset(); });
|
||||
}
|
||||
|
||||
fusell::InodeNumber TreeInode::getChildInodeNumber(PathComponentPiece name) {
|
||||
InodeNumber TreeInode::getChildInodeNumber(PathComponentPiece name) {
|
||||
auto contents = contents_.wlock();
|
||||
auto iter = contents->entries.find(name);
|
||||
if (iter == contents->entries.end()) {
|
||||
@ -360,7 +360,7 @@ fusell::InodeNumber TreeInode::getChildInodeNumber(PathComponentPiece name) {
|
||||
|
||||
void TreeInode::loadUnlinkedChildInode(
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number,
|
||||
InodeNumber number,
|
||||
folly::Optional<Hash> hash,
|
||||
mode_t mode) {
|
||||
try {
|
||||
@ -417,9 +417,7 @@ void TreeInode::loadUnlinkedChildInode(
|
||||
}
|
||||
}
|
||||
|
||||
void TreeInode::loadChildInode(
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number) {
|
||||
void TreeInode::loadChildInode(PathComponentPiece name, InodeNumber number) {
|
||||
folly::Optional<folly::Future<unique_ptr<InodeBase>>> future;
|
||||
{
|
||||
auto contents = contents_.rlock();
|
||||
@ -458,7 +456,7 @@ void TreeInode::loadChildInode(
|
||||
void TreeInode::registerInodeLoadComplete(
|
||||
folly::Future<unique_ptr<InodeBase>>& future,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number) {
|
||||
InodeNumber number) {
|
||||
// This method should never be called with the contents_ lock held. If the
|
||||
// future is already ready we will try to acquire the contents_ lock now.
|
||||
future
|
||||
@ -515,7 +513,7 @@ void TreeInode::inodeLoadComplete(
|
||||
Future<unique_ptr<InodeBase>> TreeInode::startLoadingInodeNoThrow(
|
||||
const Entry& entry,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number) noexcept {
|
||||
InodeNumber number) noexcept {
|
||||
// The callers of startLoadingInodeNoThrow() need to make sure that they
|
||||
// always call InodeMap::inodeLoadComplete() or InodeMap::inodeLoadFailed()
|
||||
// afterwards.
|
||||
@ -537,7 +535,7 @@ Future<unique_ptr<InodeBase>> TreeInode::startLoadingInodeNoThrow(
|
||||
Future<unique_ptr<InodeBase>> TreeInode::startLoadingInode(
|
||||
const Entry& entry,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number) {
|
||||
InodeNumber number) {
|
||||
XLOG(DBG5) << "starting to load inode " << number << ": " << getLogPath()
|
||||
<< " / \"" << name << "\"";
|
||||
DCHECK(entry.getInode() == nullptr);
|
||||
@ -581,7 +579,7 @@ Future<unique_ptr<InodeBase>> TreeInode::startLoadingInode(
|
||||
number, inodePtrFromThis(), name, std::move(overlayDir.value()));
|
||||
}
|
||||
|
||||
std::shared_ptr<fusell::DirHandle> TreeInode::opendir() {
|
||||
std::shared_ptr<DirHandle> TreeInode::opendir() {
|
||||
return std::make_shared<TreeInodeDirHandle>(inodePtrFromThis());
|
||||
}
|
||||
|
||||
@ -648,7 +646,7 @@ void TreeInode::materialize(const RenameLock* renameLock) {
|
||||
void TreeInode::childMaterialized(
|
||||
const RenameLock& renameLock,
|
||||
PathComponentPiece childName,
|
||||
fusell::InodeNumber childNodeId) {
|
||||
InodeNumber childNodeId) {
|
||||
{
|
||||
auto contents = contents_.wlock();
|
||||
auto iter = contents->entries.find(childName);
|
||||
@ -824,7 +822,7 @@ TreeInode::create(PathComponentPiece name, mode_t mode, int /*flags*/) {
|
||||
// Now that we have the file handle, let's look up the attributes.
|
||||
auto getattrResult = handle->getattr();
|
||||
return getattrResult.then(
|
||||
[=, handle = std::move(handle)](fusell::Dispatcher::Attr attr) mutable {
|
||||
[=, handle = std::move(handle)](Dispatcher::Attr attr) mutable {
|
||||
CreateResult result(getMount());
|
||||
|
||||
// Return all of the results back to the kernel.
|
||||
@ -1136,7 +1134,7 @@ folly::Future<folly::Unit> TreeInode::removeImpl(
|
||||
// Set the flushKernelCache parameter to true unless this was triggered by a
|
||||
// FUSE request, in which case the kernel will automatically update its
|
||||
// cache correctly.
|
||||
bool flushKernelCache = !fusell::RequestData::isFuseRequest();
|
||||
bool flushKernelCache = !RequestData::isFuseRequest();
|
||||
int errnoValue =
|
||||
tryRemoveChild(renameLock, name, nullChildPtr, flushKernelCache);
|
||||
if (errnoValue == 0) {
|
||||
@ -2617,7 +2615,7 @@ void TreeInode::invalidateFuseCache(PathComponentPiece name) {
|
||||
}
|
||||
|
||||
void TreeInode::invalidateFuseCacheIfRequired(PathComponentPiece name) {
|
||||
if (fusell::RequestData::isFuseRequest()) {
|
||||
if (RequestData::isFuseRequest()) {
|
||||
// no need to flush the cache if we are inside a FUSE request handler
|
||||
return;
|
||||
}
|
||||
@ -2801,7 +2799,7 @@ folly::Future<InodePtr> TreeInode::loadChildLocked(
|
||||
std::vector<IncompleteInodeLoad>* pendingLoads) {
|
||||
DCHECK(!entry.getInode());
|
||||
|
||||
fusell::InodeNumber childNumber;
|
||||
InodeNumber childNumber;
|
||||
folly::Promise<InodePtr> promise;
|
||||
auto future = promise.getFuture();
|
||||
if (entry.hasInodeNumber()) {
|
||||
@ -3127,10 +3125,10 @@ void TreeInode::updateOverlayHeader() const {
|
||||
Overlay::updateTimestampToHeader(file.fd(), contents->timeStamps);
|
||||
}
|
||||
}
|
||||
folly::Future<fusell::Dispatcher::Attr> TreeInode::setInodeAttr(
|
||||
folly::Future<Dispatcher::Attr> TreeInode::setInodeAttr(
|
||||
const fuse_setattr_in& attr) {
|
||||
materialize();
|
||||
fusell::Dispatcher::Attr result(getMount()->initStatData());
|
||||
Dispatcher::Attr result(getMount()->initStatData());
|
||||
|
||||
// We do not have size field for directories and currently TreeInode does not
|
||||
// have any field like FileInode::state_::mode to set the mode. May be in the
|
||||
|
@ -76,18 +76,18 @@ class TreeInode : public InodeBase {
|
||||
/**
|
||||
* Create a hash for a non-materialized entry.
|
||||
*/
|
||||
Entry(mode_t m, Hash hash) : Entry(m, fusell::InodeNumber{}, hash) {}
|
||||
Entry(mode_t m, Hash hash) : Entry(m, InodeNumber{}, hash) {}
|
||||
|
||||
/**
|
||||
* Create a hash for a non-materialized entry.
|
||||
*/
|
||||
Entry(mode_t m, fusell::InodeNumber number, Hash hash)
|
||||
Entry(mode_t m, InodeNumber number, Hash hash)
|
||||
: mode_(m), hash_{hash}, isLoading_(false), inodeNumber_(number) {}
|
||||
|
||||
/**
|
||||
* Create a hash for a materialized entry.
|
||||
*/
|
||||
Entry(mode_t m, fusell::InodeNumber number)
|
||||
Entry(mode_t m, InodeNumber number)
|
||||
: mode_(m), isLoading_(false), inodeNumber_{number} {
|
||||
DCHECK(number.hasValue());
|
||||
}
|
||||
@ -119,18 +119,18 @@ class TreeInode : public InodeBase {
|
||||
bool hasInodeNumber() const {
|
||||
return inodeNumber_.hasValue();
|
||||
}
|
||||
fusell::InodeNumber getInodeNumber() const {
|
||||
InodeNumber getInodeNumber() const {
|
||||
DCHECK(inodeNumber_.hasValue());
|
||||
return inodeNumber_;
|
||||
}
|
||||
void setInodeNumber(fusell::InodeNumber number) {
|
||||
void setInodeNumber(InodeNumber number) {
|
||||
DCHECK(number.hasValue());
|
||||
DCHECK(!inodeNumber_.hasValue());
|
||||
DCHECK(!inode_);
|
||||
inodeNumber_ = number;
|
||||
}
|
||||
|
||||
void setMaterialized(fusell::InodeNumber inode) {
|
||||
void setMaterialized(InodeNumber inode) {
|
||||
DCHECK(inodeNumber_.empty() || inode == inodeNumber_);
|
||||
inodeNumber_ = inode;
|
||||
hash_.clear();
|
||||
@ -251,7 +251,7 @@ class TreeInode : public InodeBase {
|
||||
* non-zero if hash_ is not set. (It may also be non-zero even when hash_
|
||||
* is set.)
|
||||
*/
|
||||
fusell::InodeNumber inodeNumber_{};
|
||||
InodeNumber inodeNumber_{};
|
||||
|
||||
/**
|
||||
* A pointer to the child inode, if it is loaded, or null if it is not
|
||||
@ -300,7 +300,7 @@ class TreeInode : public InodeBase {
|
||||
/** Holds the results of a create operation. */
|
||||
struct CreateResult {
|
||||
/// file attributes and cache ttls.
|
||||
fusell::Dispatcher::Attr attr;
|
||||
Dispatcher::Attr attr;
|
||||
/// The newly created inode instance.
|
||||
InodePtr inode;
|
||||
/// The newly opened file handle.
|
||||
@ -310,14 +310,14 @@ class TreeInode : public InodeBase {
|
||||
};
|
||||
|
||||
TreeInode(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parent,
|
||||
PathComponentPiece name,
|
||||
std::shared_ptr<const Tree>&& tree);
|
||||
|
||||
/// Construct an inode that only has backing in the Overlay area
|
||||
TreeInode(
|
||||
fusell::InodeNumber ino,
|
||||
InodeNumber ino,
|
||||
TreeInodePtr parent,
|
||||
PathComponentPiece name,
|
||||
Dir&& dir);
|
||||
@ -328,10 +328,10 @@ class TreeInode : public InodeBase {
|
||||
|
||||
~TreeInode() override;
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> getattr() override;
|
||||
folly::Future<Dispatcher::Attr> getattr() override;
|
||||
folly::Future<folly::Unit> prefetch() override;
|
||||
void updateOverlayHeader() const override;
|
||||
fusell::Dispatcher::Attr getAttrLocked(const Dir* contents);
|
||||
Dispatcher::Attr getAttrLocked(const Dir* contents);
|
||||
|
||||
/** Implements the InodeBase method used by the Dispatcher
|
||||
* to create the Inode instance for a given name */
|
||||
@ -353,9 +353,9 @@ class TreeInode : public InodeBase {
|
||||
*/
|
||||
folly::Future<InodePtr> getChildRecursive(RelativePathPiece name);
|
||||
|
||||
fusell::InodeNumber getChildInodeNumber(PathComponentPiece name);
|
||||
InodeNumber getChildInodeNumber(PathComponentPiece name);
|
||||
|
||||
std::shared_ptr<fusell::DirHandle> opendir();
|
||||
std::shared_ptr<DirHandle> opendir();
|
||||
folly::Future<folly::Unit> rename(
|
||||
PathComponentPiece name,
|
||||
TreeInodePtr newParent,
|
||||
@ -483,7 +483,7 @@ class TreeInode : public InodeBase {
|
||||
void childMaterialized(
|
||||
const RenameLock& renameLock,
|
||||
PathComponentPiece childName,
|
||||
fusell::InodeNumber childNodeId);
|
||||
InodeNumber childNodeId);
|
||||
|
||||
/**
|
||||
* Update this directory when a child entry is dematerialized.
|
||||
@ -511,7 +511,7 @@ class TreeInode : public InodeBase {
|
||||
* The TreeInode will call InodeMap::inodeLoadComplete() or
|
||||
* InodeMap::inodeLoadFailed() when the load finishes.
|
||||
*/
|
||||
void loadChildInode(PathComponentPiece name, fusell::InodeNumber number);
|
||||
void loadChildInode(PathComponentPiece name, InodeNumber number);
|
||||
|
||||
/**
|
||||
* Internal API only for use by InodeMap.
|
||||
@ -524,7 +524,7 @@ class TreeInode : public InodeBase {
|
||||
*/
|
||||
void loadUnlinkedChildInode(
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number,
|
||||
InodeNumber number,
|
||||
folly::Optional<Hash> hash,
|
||||
mode_t mode);
|
||||
|
||||
@ -620,7 +620,7 @@ class TreeInode : public InodeBase {
|
||||
void registerInodeLoadComplete(
|
||||
folly::Future<std::unique_ptr<InodeBase>>& future,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number);
|
||||
InodeNumber number);
|
||||
void inodeLoadComplete(
|
||||
PathComponentPiece childName,
|
||||
std::unique_ptr<InodeBase> childInode);
|
||||
@ -628,12 +628,12 @@ class TreeInode : public InodeBase {
|
||||
folly::Future<std::unique_ptr<InodeBase>> startLoadingInodeNoThrow(
|
||||
const Entry& entry,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number) noexcept;
|
||||
InodeNumber number) noexcept;
|
||||
|
||||
folly::Future<std::unique_ptr<InodeBase>> startLoadingInode(
|
||||
const Entry& entry,
|
||||
PathComponentPiece name,
|
||||
fusell::InodeNumber number);
|
||||
InodeNumber number);
|
||||
|
||||
/**
|
||||
* Materialize this directory in the overlay.
|
||||
@ -837,7 +837,7 @@ class TreeInode : public InodeBase {
|
||||
* Helper function called inside InodeBase::setattr to perform TreeInode
|
||||
* specific operation during setattr.
|
||||
*/
|
||||
folly::Future<fusell::Dispatcher::Attr> setInodeAttr(
|
||||
folly::Future<Dispatcher::Attr> setInodeAttr(
|
||||
const fuse_setattr_in& attr) override;
|
||||
|
||||
folly::Synchronized<Dir> contents_;
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "TreeInodeDirHandle.h"
|
||||
|
||||
#include "Overlay.h"
|
||||
#include "eden/fs/fuse/DirList.h"
|
||||
#include "eden/fs/inodes/TreeInode.h"
|
||||
#include "eden/fs/model/Tree.h"
|
||||
#include "eden/fs/utils/DirType.h"
|
||||
@ -19,9 +20,7 @@ namespace eden {
|
||||
|
||||
TreeInodeDirHandle::TreeInodeDirHandle(TreeInodePtr inode) : inode_(inode) {}
|
||||
|
||||
folly::Future<fusell::DirList> TreeInodeDirHandle::readdir(
|
||||
fusell::DirList&& list,
|
||||
off_t off) {
|
||||
folly::Future<DirList> TreeInodeDirHandle::readdir(DirList&& list, off_t off) {
|
||||
// We will be called mulitple times for a given directory read. The first
|
||||
// time through, the off parameter will be 0 to indicate that it is reading
|
||||
// from the start. On subsequent calls it will hold the off value from the
|
||||
@ -53,12 +52,12 @@ folly::Future<fusell::DirList> TreeInodeDirHandle::readdir(
|
||||
folly::StringPiece name;
|
||||
dtype_t type;
|
||||
/// If 0, look up/assign it based on name
|
||||
fusell::InodeNumber ino;
|
||||
InodeNumber ino;
|
||||
|
||||
Entry(
|
||||
folly::StringPiece name,
|
||||
dtype_t type,
|
||||
fusell::InodeNumber ino = fusell::InodeNumber{})
|
||||
InodeNumber ino = InodeNumber{})
|
||||
: name(name), type(type), ino(ino) {}
|
||||
};
|
||||
folly::fbvector<Entry> entries;
|
||||
@ -120,7 +119,7 @@ folly::Future<fusell::DirList> TreeInodeDirHandle::readdir(
|
||||
return std::move(list);
|
||||
}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> TreeInodeDirHandle::setattr(
|
||||
folly::Future<Dispatcher::Attr> TreeInodeDirHandle::setattr(
|
||||
const fuse_setattr_in& attr) {
|
||||
return inode_->setattr(attr);
|
||||
}
|
||||
@ -130,11 +129,11 @@ folly::Future<folly::Unit> TreeInodeDirHandle::fsyncdir(bool /*datasync*/) {
|
||||
return folly::Unit{};
|
||||
}
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> TreeInodeDirHandle::getattr() {
|
||||
folly::Future<Dispatcher::Attr> TreeInodeDirHandle::getattr() {
|
||||
return inode_->getattr();
|
||||
}
|
||||
|
||||
fusell::InodeNumber TreeInodeDirHandle::getInodeNumber() {
|
||||
InodeNumber TreeInodeDirHandle::getInodeNumber() {
|
||||
return inode_->getNodeId();
|
||||
}
|
||||
} // namespace eden
|
||||
|
@ -14,18 +14,16 @@
|
||||
namespace facebook {
|
||||
namespace eden {
|
||||
|
||||
class TreeInodeDirHandle : public fusell::DirHandle {
|
||||
class TreeInodeDirHandle : public DirHandle {
|
||||
public:
|
||||
explicit TreeInodeDirHandle(TreeInodePtr inode);
|
||||
|
||||
folly::Future<fusell::DirList> readdir(fusell::DirList&& list, off_t off)
|
||||
override;
|
||||
folly::Future<DirList> readdir(DirList&& list, off_t off) override;
|
||||
|
||||
folly::Future<fusell::Dispatcher::Attr> setattr(
|
||||
const fuse_setattr_in& attr) override;
|
||||
folly::Future<Dispatcher::Attr> setattr(const fuse_setattr_in& attr) override;
|
||||
folly::Future<folly::Unit> fsyncdir(bool datasync) override;
|
||||
folly::Future<fusell::Dispatcher::Attr> getattr() override;
|
||||
fusell::InodeNumber getInodeNumber() override;
|
||||
folly::Future<Dispatcher::Attr> getattr() override;
|
||||
InodeNumber getInodeNumber() override;
|
||||
|
||||
private:
|
||||
TreeInodePtr inode_;
|
||||
|
@ -78,7 +78,7 @@ bool operator==(const timespec& ts, std::chrono::system_clock::time_point tp) {
|
||||
|
||||
namespace {
|
||||
|
||||
fusell::Dispatcher::Attr getFileAttr(const FileInodePtr& inode) {
|
||||
Dispatcher::Attr getFileAttr(const FileInodePtr& inode) {
|
||||
auto attrFuture = inode->getattr();
|
||||
// We unfortunately can't use an ASSERT_* check here, since it tries
|
||||
// to return from the function normally, rather than throwing.
|
||||
@ -91,7 +91,7 @@ fusell::Dispatcher::Attr getFileAttr(const FileInodePtr& inode) {
|
||||
return attrFuture.get();
|
||||
}
|
||||
|
||||
fusell::Dispatcher::Attr setFileAttr(
|
||||
Dispatcher::Attr setFileAttr(
|
||||
const FileInodePtr& inode,
|
||||
const fuse_setattr_in& desired) {
|
||||
auto attrFuture = inode->setattr(desired);
|
||||
@ -105,9 +105,7 @@ fusell::Dispatcher::Attr setFileAttr(
|
||||
/**
|
||||
* Helper function used by BASIC_ATTR_CHECKS()
|
||||
*/
|
||||
void basicAttrChecks(
|
||||
const FileInodePtr& inode,
|
||||
const fusell::Dispatcher::Attr& attr) {
|
||||
void basicAttrChecks(const FileInodePtr& inode, const Dispatcher::Attr& attr) {
|
||||
EXPECT_EQ(inode->getNodeId().getRawValue(), attr.st.st_ino);
|
||||
EXPECT_EQ(1, attr.st.st_nlink);
|
||||
EXPECT_EQ(inode->getMount()->getUid(), attr.st.st_uid);
|
||||
@ -135,7 +133,7 @@ void basicAttrChecks(
|
||||
/**
|
||||
* Helper function used by BASIC_ATTR_CHECKS()
|
||||
*/
|
||||
fusell::Dispatcher::Attr basicAttrChecks(const FileInodePtr& inode) {
|
||||
Dispatcher::Attr basicAttrChecks(const FileInodePtr& inode) {
|
||||
auto attr = getFileAttr(inode);
|
||||
basicAttrChecks(inode, attr);
|
||||
return attr;
|
||||
|
@ -85,7 +85,7 @@ DEFINE_int64(
|
||||
"Minimum age of the inodes to be unloaded");
|
||||
|
||||
using apache::thrift::ThriftServer;
|
||||
using facebook::eden::fusell::FuseChannelData;
|
||||
using facebook::eden::FuseChannelData;
|
||||
using folly::File;
|
||||
using folly::Future;
|
||||
using folly::makeFuture;
|
||||
@ -558,13 +558,11 @@ folly::Future<folly::Unit> EdenServer::performTakeoverFuseStart(
|
||||
// SerializedFileHandleMap so that we can restore
|
||||
// the correct flags here.
|
||||
dispatcher
|
||||
->opendir(
|
||||
fusell::InodeNumber::fromThrift(handleEntry.inodeNumber), 0)
|
||||
->opendir(InodeNumber::fromThrift(handleEntry.inodeNumber), 0)
|
||||
.then([dispatcher, number = handleEntry.handleId](
|
||||
std::shared_ptr<fusell::DirHandle> handle) {
|
||||
std::shared_ptr<DirHandle> handle) {
|
||||
dispatcher->getFileHandles().recordHandle(
|
||||
std::static_pointer_cast<fusell::FileHandleBase>(handle),
|
||||
number);
|
||||
std::static_pointer_cast<FileHandleBase>(handle), number);
|
||||
}));
|
||||
} else {
|
||||
futures.emplace_back(
|
||||
@ -572,14 +570,11 @@ folly::Future<folly::Unit> EdenServer::performTakeoverFuseStart(
|
||||
// SerializedFileHandleMap so that we can restore
|
||||
// the correct flags here.
|
||||
dispatcher
|
||||
->open(
|
||||
fusell::InodeNumber::fromThrift(handleEntry.inodeNumber),
|
||||
O_RDWR)
|
||||
->open(InodeNumber::fromThrift(handleEntry.inodeNumber), O_RDWR)
|
||||
.then([dispatcher, number = handleEntry.handleId](
|
||||
std::shared_ptr<fusell::FileHandle> handle) {
|
||||
std::shared_ptr<FileHandle> handle) {
|
||||
dispatcher->getFileHandles().recordHandle(
|
||||
std::static_pointer_cast<fusell::FileHandleBase>(handle),
|
||||
number);
|
||||
std::static_pointer_cast<FileHandleBase>(handle), number);
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
@ -194,7 +194,7 @@ class EdenServer : private TakeoverHandler {
|
||||
ServerState* getServerState() {
|
||||
return &serverState_;
|
||||
}
|
||||
fusell::ThreadLocalEdenStats* getStats() {
|
||||
ThreadLocalEdenStats* getStats() {
|
||||
return &serverState_.getStats();
|
||||
}
|
||||
|
||||
|
@ -620,7 +620,7 @@ void EdenServiceHandler::debugGetInodePath(
|
||||
std::unique_ptr<std::string> mountPoint,
|
||||
int64_t inodeNumber) {
|
||||
auto helper = INSTRUMENT_THRIFT_CALL(folly::LogLevel::DBG3);
|
||||
auto inodeNum = static_cast<fusell::InodeNumber>(inodeNumber);
|
||||
auto inodeNum = static_cast<InodeNumber>(inodeNumber);
|
||||
auto inodeMap = server_->getMount(*mountPoint)->getInodeMap();
|
||||
|
||||
folly::Optional<RelativePath> relativePath =
|
||||
|
@ -36,7 +36,6 @@ DEFINE_string(
|
||||
// eden, and WARNING for all other categories.
|
||||
DEFINE_string(logging, ".=WARNING,eden=DBG2", "Logging configuration");
|
||||
|
||||
using namespace facebook::eden::fusell;
|
||||
using namespace facebook::eden;
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
|
@ -21,9 +21,9 @@ namespace facebook {
|
||||
namespace eden {
|
||||
|
||||
Future<fuse_entry_out> TestDispatcher::lookup(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name) {
|
||||
auto requestID = fusell::RequestData::get().getReq().unique;
|
||||
auto requestID = RequestData::get().getReq().unique;
|
||||
XLOG(DBG5) << "received lookup " << requestID << ": parent=" << parent
|
||||
<< ", name=" << name;
|
||||
auto result = Future<fuse_entry_out>::makeEmpty();
|
||||
|
@ -28,16 +28,16 @@ namespace eden {
|
||||
* It allows the test code to generate responses to specific requests on
|
||||
* demand.
|
||||
*/
|
||||
class TestDispatcher : public fusell::Dispatcher {
|
||||
class TestDispatcher : public Dispatcher {
|
||||
public:
|
||||
/**
|
||||
* Data for a pending FUSE_LOOKUP request.
|
||||
*/
|
||||
struct PendingLookup {
|
||||
PendingLookup(fusell::InodeNumber parent, PathComponentPiece name)
|
||||
PendingLookup(InodeNumber parent, PathComponentPiece name)
|
||||
: parent(parent), name(name.copy()) {}
|
||||
|
||||
fusell::InodeNumber parent;
|
||||
InodeNumber parent;
|
||||
PathComponent name;
|
||||
folly::Promise<fuse_entry_out> promise;
|
||||
};
|
||||
@ -45,7 +45,7 @@ class TestDispatcher : public fusell::Dispatcher {
|
||||
using Dispatcher::Dispatcher;
|
||||
|
||||
folly::Future<fuse_entry_out> lookup(
|
||||
fusell::InodeNumber parent,
|
||||
InodeNumber parent,
|
||||
PathComponentPiece name) override;
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user