/* * Copyright (c) 2023 Antmicro * * SPDX-License-Identifier: Apache-2.0 */ #ifndef __EXT2_DISKOPS_H__ #define __EXT2_DISKOPS_H__ #include #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__ */