2016-05-12 23:43:17 +03:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2016, Facebook, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the BSD-style license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "eden/fs/model/Tree.h"
|
|
|
|
#include "eden/fuse/Inodes.h"
|
|
|
|
|
|
|
|
namespace facebook {
|
|
|
|
namespace eden {
|
|
|
|
|
2016-05-20 20:33:42 +03:00
|
|
|
class EdenMount;
|
|
|
|
class Hash;
|
2016-05-12 23:43:17 +03:00
|
|
|
class LocalStore;
|
|
|
|
class Overlay;
|
|
|
|
|
|
|
|
// Represents a Tree instance in a form that FUSE can consume
|
|
|
|
class TreeInode : public fusell::DirInode {
|
|
|
|
public:
|
|
|
|
TreeInode(
|
2016-05-20 20:33:42 +03:00
|
|
|
EdenMount* mount,
|
2016-05-12 23:43:17 +03:00
|
|
|
std::unique_ptr<Tree>&& tree,
|
|
|
|
fuse_ino_t parent,
|
2016-05-20 20:33:42 +03:00
|
|
|
fuse_ino_t ino);
|
2016-05-12 23:43:17 +03:00
|
|
|
|
|
|
|
/// Construct an inode that only has backing in the Overlay area
|
2016-05-20 20:33:42 +03:00
|
|
|
TreeInode(EdenMount* mount, fuse_ino_t parent, fuse_ino_t ino);
|
2016-05-12 23:43:17 +03:00
|
|
|
|
|
|
|
~TreeInode();
|
|
|
|
|
|
|
|
folly::Future<fusell::Dispatcher::Attr> getattr() override;
|
|
|
|
folly::Future<std::shared_ptr<fusell::InodeBase>> getChildByName(
|
|
|
|
PathComponentPiece namepiece) override;
|
2016-05-18 04:16:07 +03:00
|
|
|
folly::Future<std::unique_ptr<fusell::DirHandle>> opendir(
|
2016-05-12 23:43:17 +03:00
|
|
|
const struct fuse_file_info& fi) override;
|
|
|
|
|
|
|
|
const Tree* getTree() const;
|
|
|
|
fuse_ino_t getParent() const;
|
|
|
|
fuse_ino_t getInode() const;
|
2016-05-20 20:33:42 +03:00
|
|
|
EdenMount* getMount() const;
|
|
|
|
const std::shared_ptr<LocalStore>& getStore() const;
|
|
|
|
const std::shared_ptr<Overlay>& getOverlay() const;
|
2016-05-12 23:43:17 +03:00
|
|
|
folly::Future<fusell::DirInode::CreateResult>
|
|
|
|
create(PathComponentPiece name, mode_t mode, int flags) override;
|
|
|
|
|
2016-05-18 22:23:09 +03:00
|
|
|
folly::Future<fuse_entry_param> mkdir(PathComponentPiece name, mode_t mode)
|
|
|
|
override;
|
|
|
|
|
2016-05-12 23:43:17 +03:00
|
|
|
/** Called in a thrift context to switch the active snapshot.
|
|
|
|
* Since this is called in a thrift context, RequestData::get() won't
|
|
|
|
* return the usual results and the appropriate information must
|
|
|
|
* be passed down from the thrift server itself.
|
|
|
|
*/
|
2016-05-20 20:33:42 +03:00
|
|
|
void performCheckout(const Hash& hash);
|
2016-05-12 23:43:17 +03:00
|
|
|
|
|
|
|
private:
|
2016-05-20 20:33:42 +03:00
|
|
|
// The EdenMount object that this inode belongs to.
|
|
|
|
// We store this as a raw pointer since the TreeInode is part of the mount
|
|
|
|
// point. The EdenMount should always exist longer than any inodes it
|
|
|
|
// contains. (Storing a shared_ptr to the EdenMount would introduce circular
|
|
|
|
// references which are undesirable.)
|
|
|
|
EdenMount* const mount_{nullptr};
|
|
|
|
|
2016-05-12 23:43:17 +03:00
|
|
|
std::unique_ptr<Tree> tree_;
|
|
|
|
fuse_ino_t parent_;
|
|
|
|
fuse_ino_t ino_;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|