| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_STORAGE_F2FS_NODE_PAGE_H_ |
| #define SRC_STORAGE_F2FS_NODE_PAGE_H_ |
| |
| #include <fbl/recycler.h> |
| |
| #include "src/storage/f2fs/file_cache.h" |
| #include "src/storage/f2fs/layout.h" |
| |
| namespace f2fs { |
| |
| class NodePage : public Page, public fbl::Recyclable<NodePage> { |
| public: |
| NodePage() = delete; |
| NodePage(FileCache *file_cache, pgoff_t index) : Page(file_cache, index) {} |
| NodePage(const NodePage &) = delete; |
| NodePage &operator=(const NodePage &) = delete; |
| NodePage(const NodePage &&) = delete; |
| NodePage &operator=(const NodePage &&) = delete; |
| void fbl_recycle() { RecyclePage(); } |
| |
| void FillNodeFooter(nid_t nid, nid_t ino, size_t ofs); |
| void CopyNodeFooterFrom(NodePage &src); |
| void FillNodeFooterBlkaddr(block_t blkaddr, uint64_t ver); |
| nid_t InoOfNode() const; |
| nid_t NidOfNode() const; |
| uint32_t OfsOfNode() const; |
| uint64_t CpverOfNode() const; |
| block_t NextBlkaddrOfNode() const; |
| bool IsDnode() const; |
| bool IsColdNode() const; |
| bool IsFsyncDnode() const; |
| bool IsDentDnode() const; |
| void SetColdNode(const bool is_dir); |
| void SetFsyncMark(const bool mark); |
| void SetDentryMark(const bool mark); |
| void SetDataBlkaddr(size_t ofs_in_node, block_t new_addr); |
| |
| bool IsInode() const; |
| block_t GetBlockAddr(const size_t offset) const; |
| void SetBlockAddr(const size_t offset, const block_t addr) const; |
| |
| // It returns the starting file offset that |node_page| indicates. |
| // The file offset can be calcuated by using the node offset that |node_page| has. |
| // See NodePage::IsDnode(). |
| size_t StartBidxOfNode(size_t num_addrs) const; |
| |
| void SetNid(size_t off, nid_t nid); |
| nid_t GetNid(size_t off) const; |
| |
| private: |
| Node &node() const { return *GetAddress<Node>(); } |
| block_t *addrs_array() const; |
| |
| static constexpr uint32_t kOfsInode = 0; |
| static constexpr uint32_t kOfsDirectNode1 = 1; |
| static constexpr uint32_t kOfsDirectNode2 = 2; |
| static constexpr uint32_t kOfsIndirectNode1 = 3; |
| static constexpr uint32_t kOfsIndirectNode2 = 4 + kNidsPerBlock; |
| static constexpr uint32_t kOfsDoubleIndirectNode = 5 + 2 * kNidsPerBlock; |
| }; |
| } // namespace f2fs |
| #endif // SRC_STORAGE_F2FS_NODE_PAGE_H_ |