/* * Copyright (c) Facebook, Inc. and its affiliates. * * This software may be used and distributed according to the terms of the * GNU General Public License version 2. */ #pragma once #include "eden/fs/fuse/FuseDispatcher.h" namespace facebook::eden { class EdenMount; class InodeMap; /** * Implement the FuseDispatcher interface. * * For unsupported operations, the corresponding methods are explicitly not * overridden and will directly fail in FuseDispatcher. */ class FuseDispatcherImpl : public FuseDispatcher { public: explicit FuseDispatcherImpl(EdenMount* mount); ImmediateFuture statfs(InodeNumber ino) override; ImmediateFuture getattr(InodeNumber ino, ObjectFetchContext& context) override; ImmediateFuture setattr( InodeNumber ino, const fuse_setattr_in& attr, ObjectFetchContext& context) override; ImmediateFuture opendir(InodeNumber ino, int flags) override; ImmediateFuture releasedir(InodeNumber ino, uint64_t fh) override; ImmediateFuture lookup( uint64_t requestID, InodeNumber parent, PathComponentPiece name, ObjectFetchContext& context) override; void forget(InodeNumber ino, unsigned long nlookup) override; ImmediateFuture open(InodeNumber ino, int flags) override; ImmediateFuture readlink( InodeNumber ino, bool kernelCachesReadlink, ObjectFetchContext& context) override; ImmediateFuture mknod( InodeNumber parent, PathComponentPiece name, mode_t mode, dev_t rdev, ObjectFetchContext& context) override; ImmediateFuture mkdir( InodeNumber parent, PathComponentPiece name, mode_t mode, ObjectFetchContext& context) override; ImmediateFuture unlink( InodeNumber parent, PathComponentPiece name, ObjectFetchContext& context) override; ImmediateFuture rmdir( InodeNumber parent, PathComponentPiece name, ObjectFetchContext& context) override; ImmediateFuture symlink( InodeNumber parent, PathComponentPiece name, folly::StringPiece link, ObjectFetchContext& context) override; ImmediateFuture rename( InodeNumber parent, PathComponentPiece name, InodeNumber newparent, PathComponentPiece newname, ObjectFetchContext& context) override; ImmediateFuture link( InodeNumber ino, InodeNumber newparent, PathComponentPiece newname) override; ImmediateFuture create( InodeNumber parent, PathComponentPiece name, mode_t mode, int flags, ObjectFetchContext& context) override; ImmediateFuture read( InodeNumber ino, size_t size, off_t off, ObjectFetchContext& context) override; ImmediateFuture write( InodeNumber ino, folly::StringPiece data, off_t off, ObjectFetchContext& context) override; ImmediateFuture flush(InodeNumber ino, uint64_t lock_owner) override; ImmediateFuture fallocate( InodeNumber ino, uint64_t offset, uint64_t length, ObjectFetchContext& context) override; ImmediateFuture fsync(InodeNumber ino, bool datasync) override; ImmediateFuture fsyncdir(InodeNumber ino, bool datasync) override; ImmediateFuture readdir( InodeNumber ino, FuseDirList&& dirList, off_t offset, uint64_t fh, ObjectFetchContext& context) override; ImmediateFuture getxattr( InodeNumber ino, folly::StringPiece name, ObjectFetchContext& context) override; ImmediateFuture> listxattr(InodeNumber ino) override; private: // The EdenMount associated with this dispatcher. EdenMount* const mount_; // The EdenMount's InodeMap. // We store this pointer purely for convenience. We need it on pretty much // every FUSE request, and having it locally avoids having to dereference // mount_ first. InodeMap* const inodeMap_; }; } // namespace facebook::eden