10 #include "../../utils/utils.h"
12 void init_superblock_arrays(
struct superblock* superblock) {
13 superblock->reserved_blocks_mask =
14 (
bool*) calloc(superblock->fs_info->blocks_count,
sizeof(
bool));
15 superblock->reserved_inodes_mask =
16 (
bool*) calloc(superblock->fs_info->inodes_count,
sizeof(
bool));
19 void init_superblock_fs_info(
struct superblock* superblock) {
20 superblock->fs_info = (
struct fs_info*) calloc(1,
sizeof(
struct fs_info));
24 return sizeof(
struct fs_info)
25 + sizeof(bool) * superblock->fs_info->inodes_count
26 +
sizeof(bool) * superblock->fs_info->blocks_count;
30 init_superblock_fs_info(superblock);
31 superblock->fs_info->blocks_count_in_inode = BLOCKS_COUNT_IN_INODE;
32 superblock->fs_info->blocks_count = BLOCKS_COUNT;
33 superblock->fs_info->inodes_count = INODES_COUNT;
34 superblock->fs_info->block_size = BLOCK_SIZE;
35 superblock->fs_info->max_path_len = MAX_PATH_LEN;
36 superblock->fs_info->descriptors_count = DESCRIPTORS_COUNT;
37 superblock->fs_info->magic = MAGIC;
38 init_superblock_arrays(superblock);
42 free(superblock->fs_info);
43 free(superblock->reserved_blocks_mask);
44 free(superblock->reserved_inodes_mask);
48 init_superblock_fs_info(superblock);
49 lseek(fd, 0, SEEK_SET);
51 read_while(fd, (
char*) superblock->fs_info,
sizeof(
struct fs_info));
53 if (total_read == -1) {
54 fprintf(stderr,
"%s", strerror(errno));
55 free(superblock->fs_info);
59 init_superblock_arrays(superblock);
61 (
char*) superblock->reserved_inodes_mask,
62 superblock->fs_info->inodes_count);
64 fprintf(stderr,
"%s", strerror(errno));
72 (
char*) superblock->reserved_blocks_mask,
73 superblock->fs_info->blocks_count);
75 fprintf(stderr,
"%s", strerror(errno));
86 lseek(fd, 0, SEEK_SET);
88 (
const char*) superblock->fs_info,
89 sizeof(
struct fs_info));
91 if (total_written == -1) {
92 fprintf(stderr,
"%s", strerror(errno));
97 (
const char*) superblock->reserved_inodes_mask,
98 superblock->fs_info->inodes_count);
100 fprintf(stderr,
"%s\n", strerror(errno));
103 total_written += written;
106 (
const char*) superblock->reserved_blocks_mask,
107 superblock->fs_info->blocks_count);
109 fprintf(stderr,
"%s\n", strerror(errno));
112 total_written += written;
114 return total_written;
118 for (uint16_t
id = 0;
id < superblock->fs_info->inodes_count; ++id) {
119 if (!superblock->reserved_inodes_mask[
id]) {
120 superblock->reserved_inodes_mask[id] =
true;
125 return superblock->fs_info->inodes_count;
129 const uint16_t inode_id) {
130 if (superblock->reserved_inodes_mask[inode_id]) {
131 superblock->reserved_inodes_mask[inode_id] =
false;
135 return superblock->fs_info->inodes_count;
139 for (uint16_t
id = 0;
id < superblock->fs_info->blocks_count; ++id) {
140 if (!superblock->reserved_blocks_mask[
id]) {
141 superblock->reserved_blocks_mask[id] =
true;
146 return superblock->fs_info->blocks_count;
149 uint16_t
free_block(
const struct superblock* superblock, uint16_t block_id) {
150 if (superblock->reserved_blocks_mask[block_id]) {
151 superblock->reserved_blocks_mask[block_id] =
false;
155 return superblock->fs_info->blocks_count;
uint16_t free_block(const struct superblock *superblock, uint16_t block_id)
Release block.
ssize_t write_super_block(int fd, struct superblock *superblock)
Write sb to memory.
Contains superblock struct and its methods.
void destroy_super_block(struct superblock *superblock)
Destructor of superblock.
int read_while(int fd, char *buffer, size_t to_read)
Properly reading from memory.
ssize_t read_super_block(int fd, struct superblock *superblock)
Read sb from memory.
Contains constants of FS.
int write_while(int fd, const char *buffer, size_t to_write)
Properly writing to memory.
uint16_t free_inode(const struct superblock *superblock, uint16_t inode_id)
Release inode.
uint16_t reserve_inode(const struct superblock *superblock)
Reserve free inode.
uint16_t reserve_block(const struct superblock *superblock)
Reserve block.
void init_super_block(struct superblock *superblock)
Constructor of superblock.
size_t sizeof_superblock(const struct superblock *superblock)