Fix a bug that prevented deleting symlinks. See https://github.com/cryfs/cryfs/issues/2
This commit is contained in:
parent
c9f0fa781d
commit
8092bfef8e
@ -130,6 +130,25 @@ unique_ref<Symlink> FilesystemImpl::LoadSymlink(const bf::path &path) {
|
||||
return std::move(*lnk);
|
||||
}
|
||||
|
||||
unique_ref<Node> FilesystemImpl::LoadFileOrSymlink(const bf::path &path) {
|
||||
PROFILE(_loadFileOrSymlinkNanosec);
|
||||
auto node = _device->Load(path);
|
||||
if (node == none) {
|
||||
throw fuse::FuseErrnoException(EIO);
|
||||
}
|
||||
auto file = dynamic_pointer_move<File>(*node);
|
||||
if (file != none) {
|
||||
return std::move(*file);
|
||||
}
|
||||
|
||||
auto symlink = dynamic_pointer_move<Symlink>(*node);
|
||||
if (symlink != none) {
|
||||
return std::move(*symlink);
|
||||
}
|
||||
|
||||
throw fuse::FuseErrnoException(EISDIR);
|
||||
}
|
||||
|
||||
int FilesystemImpl::openFile(const bf::path &path, int flags) {
|
||||
auto file = LoadFile(path);
|
||||
return openFile(*file, flags);
|
||||
@ -249,9 +268,9 @@ void FilesystemImpl::rmdir(const bf::path &path) {
|
||||
|
||||
void FilesystemImpl::unlink(const bf::path &path) {
|
||||
PROFILE(_unlinkNanosec);
|
||||
auto file = LoadFile(path);
|
||||
auto node = LoadFileOrSymlink(path);
|
||||
PROFILE(_unlinkNanosec_withoutLoading);
|
||||
file->remove();
|
||||
node->remove();
|
||||
}
|
||||
|
||||
void FilesystemImpl::rename(const bf::path &from, const bf::path &to) {
|
||||
|
@ -51,12 +51,14 @@ private:
|
||||
cpputils::unique_ref<File> LoadFile(const boost::filesystem::path &path);
|
||||
cpputils::unique_ref<Dir> LoadDir(const boost::filesystem::path &path);
|
||||
cpputils::unique_ref<Symlink> LoadSymlink(const boost::filesystem::path &path);
|
||||
cpputils::unique_ref<Node> LoadFileOrSymlink(const boost::filesystem::path &path);
|
||||
int openFile(const File &file, int flags);
|
||||
|
||||
#ifdef FSPP_PROFILE
|
||||
std::atomic<uint64_t> _loadFileNanosec;
|
||||
std::atomic<uint64_t> _loadDirNanosec;
|
||||
std::atomic<uint64_t> _loadSymlinkNanosec;
|
||||
std::atomic<uint64_t> _loadFileOrSymlinkNanosec;
|
||||
std::atomic<uint64_t> _openFileNanosec;
|
||||
std::atomic<uint64_t> _flushNanosec;
|
||||
std::atomic<uint64_t> _closeFileNanosec;
|
||||
|
Loading…
Reference in New Issue
Block a user