| /* |
| * Copyright (c) 2023 Antmicro <www.antmicro.com> |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef __EXT2_DISKOPS_H__ |
| #define __EXT2_DISKOPS_H__ |
| |
| #include <stdint.h> |
| |
| #include "ext2_struct.h" |
| |
| /** @brief Fetch superblock into buffer in fs structure. |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_fetch_superblock(struct ext2_data *fs); |
| |
| /** |
| * @brief Fetch inode into given buffer. |
| * |
| * @param fs File system data |
| * @param ino Inode number |
| * @param inode Buffer for fetched inode |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_fetch_inode(struct ext2_data *fs, uint32_t ino, struct ext2_inode *inode); |
| |
| /** |
| * @brief Fetch block into buffer in the inode structure. |
| * |
| * @param inode Inode structure |
| * @param block Number of inode block to fetch (0 - first block in that inode) |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_fetch_inode_block(struct ext2_inode *inode, uint32_t block); |
| |
| /** |
| * @brief Fetch block group into buffer in fs structure. |
| * |
| * If the group was already fetched then this function has no effect. |
| * |
| * @param fs File system data |
| * @param group Block group number |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_fetch_block_group(struct ext2_data *fs, uint32_t group); |
| |
| /* |
| * @brief Fetch one block of inode table into internal buffer |
| * |
| * If the block of inode table was already fetched then this function does nothing and returns |
| * with success. |
| * |
| * @param bg Block group structure |
| * @param block Number of inode table block to fetch (relative to start of the inode table) |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_fetch_bg_itable(struct ext2_bgroup *bg, uint32_t block); |
| |
| /** |
| * @brief Fetch inode bitmap into internal buffer |
| * |
| * If the bitmap was already fetched then this function has no effect. |
| * |
| * @param bg Block group structure |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_fetch_bg_ibitmap(struct ext2_bgroup *bg); |
| |
| /** |
| * @brief Fetch block bitmap into internal buffer |
| * |
| * If the bitmap was already fetched then this function has no effect. |
| * |
| * @param bg Block group structure |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_fetch_bg_bbitmap(struct ext2_bgroup *bg); |
| |
| /** |
| * @brief Clear the entry in the inode table of given inode |
| * |
| * This function triggers fetching of block group and inode table (where the |
| * inode is described). |
| * |
| * @param fs File system data |
| * @param inode Inode number of inode to clear |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_clear_inode(struct ext2_data *fs, uint32_t ino); |
| |
| /** |
| * @brief Commit changes made to inode structure |
| * |
| * The changes are committed only to the cached block. They are truly written to |
| * storage when sync is performed. |
| * |
| * @param inode Inode structure |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_commit_inode(struct ext2_inode *inode); |
| |
| /** |
| * @brief Commit changes made to inode block |
| * |
| * The changes are committed only to the cached block. They are truly written to |
| * storage when sync is performed. |
| * |
| * @param inode Inode structure |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_commit_inode_block(struct ext2_inode *inode); |
| |
| /** |
| * @brief Commit changes made to superblock structure. |
| * |
| * The changes made to program structure are copied to disk representation and written to the |
| * backing storage. |
| * |
| * @param fs File system data struct |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_commit_superblock(struct ext2_data *fs); |
| |
| /** |
| * @brief Commit changes made to block group structure. |
| * |
| * The changes made to program structure are copied to disk representation and written to the |
| * backing storage. |
| * |
| * @param fs File system data struct |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_commit_bg(struct ext2_data *fs); |
| |
| /* Operations that reserve or free the block or inode in the file system. They |
| * mark an inode or block as used in the bitmap and change free inode/block |
| * count in superblock and block group. |
| */ |
| |
| /** |
| * @brief Reserve a block for future use. |
| * |
| * Search for a free block. If block is found, proper fields in superblock and |
| * block group are updated and block is marked as used in block bitmap. |
| * |
| * @param fs File system data |
| * |
| * @retval >0 number of allocated block |
| * @retval <0 error |
| */ |
| int64_t ext2_alloc_block(struct ext2_data *fs); |
| |
| /** |
| * @brief Reserve an inode for future use. |
| * |
| * Search for free inode. If inode is found, proper fields in superblock and |
| * block group are updated and inode is marked as used in inode bitmap. |
| * |
| * @param fs File system data |
| * |
| * @retval >0 number of allocated inode |
| * @retval <0 error |
| */ |
| int32_t ext2_alloc_inode(struct ext2_data *fs); |
| |
| /** |
| * @brief Free the block |
| * |
| * @param fs File system data |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_free_block(struct ext2_data *fs, uint32_t block); |
| |
| /** |
| * @brief Free the inode |
| * |
| * @param fs File system data |
| * @param inode Inode number |
| * @param directory True if freed inode was a directory |
| * |
| * @retval 0 on success |
| * @retval <0 error |
| */ |
| int ext2_free_inode(struct ext2_data *fs, uint32_t ino, bool directory); |
| |
| /** |
| * @brief Allocate directory entry filled with data from disk directory entry. |
| * |
| * NOTE: This function never fails. |
| * |
| * Returns structure allocated on direntry_heap. |
| */ |
| struct ext2_direntry *ext2_fetch_direntry(struct ext2_disk_direntry *disk_de); |
| |
| /** |
| * @brief Write the data from program directory entry to disk structure. |
| */ |
| void ext2_write_direntry(struct ext2_disk_direntry *disk_de, struct ext2_direntry *de); |
| |
| uint32_t ext2_get_disk_direntry_inode(struct ext2_disk_direntry *de); |
| uint32_t ext2_get_disk_direntry_reclen(struct ext2_disk_direntry *de); |
| uint8_t ext2_get_disk_direntry_namelen(struct ext2_disk_direntry *de); |
| uint8_t ext2_get_disk_direntry_type(struct ext2_disk_direntry *de); |
| |
| void ext2_set_disk_direntry_inode(struct ext2_disk_direntry *de, uint32_t inode); |
| void ext2_set_disk_direntry_reclen(struct ext2_disk_direntry *de, uint16_t reclen); |
| void ext2_set_disk_direntry_namelen(struct ext2_disk_direntry *de, uint8_t namelen); |
| void ext2_set_disk_direntry_type(struct ext2_disk_direntry *de, uint8_t type); |
| void ext2_set_disk_direntry_name(struct ext2_disk_direntry *de, const char *name, size_t len); |
| |
| #endif /* __EXT2_DISKOPS_H__ */ |