blob: 027990f4d6126ed158016166ed1b57557b8d35be [file] [log] [blame]
/*
* 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__ */