mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 08:47:12 +03:00
9f07485239
Summary: The serialized data for each file handle needs to be enough to re-construct the handle when we load it into a new process later on. We need the inode number, the file handle number that we communicated to the kernel and a flag to let us know whether it is a file or a dir. Note that the file handle allocation strategy already accomodates the idea of migrating to a new process; we don't need to serialize anything like a next file handle id number. This doesn't implement instantiating the handles from the loaded state, it is just the plumbing for saving and loading that state information. Reviewed By: bolinfest Differential Revision: D5733079 fbshipit-source-id: 8fb8afb8ae9694d013ce7a4a82c31bc876ed33c9
117 lines
2.9 KiB
C++
117 lines
2.9 KiB
C++
/*
|
|
* Copyright (c) 2016-present, 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.
|
|
*
|
|
*/
|
|
#include "eden/fs/inodes/FileHandle.h"
|
|
|
|
#include <folly/experimental/logging/xlog.h>
|
|
#include "eden/fs/inodes/EdenMount.h"
|
|
#include "eden/fs/inodes/FileInode.h"
|
|
#include "eden/fs/inodes/TreeInode.h"
|
|
#include "eden/fs/store/LocalStore.h"
|
|
|
|
namespace facebook {
|
|
namespace eden {
|
|
|
|
FileHandle::FileHandle(FileInodePtr inode) : inode_(std::move(inode)) {}
|
|
|
|
folly::Future<fusell::Dispatcher::Attr> FileHandle::getattr() {
|
|
FB_LOGF(
|
|
inode_->getMount()->getStraceLogger(),
|
|
DBG7,
|
|
"getattr({})",
|
|
inode_->getNodeId());
|
|
return inode_->getattr();
|
|
}
|
|
|
|
fuse_ino_t FileHandle::getInodeNumber() {
|
|
return inode_->getNodeId();
|
|
}
|
|
|
|
folly::Future<fusell::Dispatcher::Attr> FileHandle::setattr(
|
|
const struct stat& attr,
|
|
int to_set) {
|
|
FB_LOGF(
|
|
inode_->getMount()->getStraceLogger(),
|
|
DBG7,
|
|
"setattr({})",
|
|
inode_->getNodeId());
|
|
return inode_->setattr(attr, to_set);
|
|
}
|
|
|
|
bool FileHandle::preserveCache() const {
|
|
return true;
|
|
}
|
|
|
|
bool FileHandle::isSeekable() const {
|
|
return true;
|
|
}
|
|
|
|
folly::Future<fusell::BufVec> FileHandle::read(size_t size, off_t off) {
|
|
FB_LOGF(
|
|
inode_->getMount()->getStraceLogger(),
|
|
DBG7,
|
|
"read({})",
|
|
inode_->getNodeId());
|
|
return inode_->read(size, off);
|
|
}
|
|
|
|
folly::Future<size_t> FileHandle::write(fusell::BufVec&& buf, off_t off) {
|
|
SCOPE_SUCCESS {
|
|
auto myname = inode_->getPath();
|
|
if (myname.hasValue()) {
|
|
inode_->getMount()->getJournal().wlock()->addDelta(
|
|
std::make_unique<JournalDelta>(JournalDelta{myname.value()}));
|
|
}
|
|
};
|
|
FB_LOGF(
|
|
inode_->getMount()->getStraceLogger(),
|
|
DBG7,
|
|
"write({})",
|
|
inode_->getNodeId());
|
|
return inode_->write(std::move(buf), off);
|
|
}
|
|
|
|
folly::Future<size_t> FileHandle::write(folly::StringPiece str, off_t off) {
|
|
SCOPE_SUCCESS {
|
|
auto myname = inode_->getPath();
|
|
if (myname.hasValue()) {
|
|
inode_->getMount()->getJournal().wlock()->addDelta(
|
|
std::make_unique<JournalDelta>(JournalDelta{myname.value()}));
|
|
}
|
|
};
|
|
FB_LOGF(
|
|
inode_->getMount()->getStraceLogger(),
|
|
DBG7,
|
|
"write({})",
|
|
inode_->getNodeId());
|
|
return inode_->write(str, off);
|
|
}
|
|
|
|
folly::Future<folly::Unit> FileHandle::flush(uint64_t lock_owner) {
|
|
FB_LOGF(
|
|
inode_->getMount()->getStraceLogger(),
|
|
DBG7,
|
|
"flush({})",
|
|
inode_->getNodeId());
|
|
inode_->flush(lock_owner);
|
|
return folly::Unit{};
|
|
}
|
|
|
|
folly::Future<folly::Unit> FileHandle::fsync(bool datasync) {
|
|
FB_LOGF(
|
|
inode_->getMount()->getStraceLogger(),
|
|
DBG7,
|
|
"fsync({})",
|
|
inode_->getNodeId());
|
|
inode_->fsync(datasync);
|
|
return folly::Unit{};
|
|
}
|
|
}
|
|
}
|