Ext
 All Files Functions
superblock.c
1 
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <errno.h>
7 #include <string.h>
8 #include "superblock.h"
9 #include "defines.h"
10 #include "../../utils/utils.h"
11 
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));
17 }
18 
19 void init_superblock_fs_info(struct superblock* superblock) {
20  superblock->fs_info = (struct fs_info*) calloc(1, sizeof(struct fs_info));
21 }
22 
23 size_t sizeof_superblock(const struct superblock* superblock) {
24  return sizeof(struct fs_info)
25  + sizeof(bool) * superblock->fs_info->inodes_count
26  + sizeof(bool) * superblock->fs_info->blocks_count;
27 }
28 
29 void init_super_block(struct superblock* superblock) {
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);
39 }
40 
41 void destroy_super_block(struct superblock* superblock) {
42  free(superblock->fs_info);
43  free(superblock->reserved_blocks_mask);
44  free(superblock->reserved_inodes_mask);
45 }
46 
47 ssize_t read_super_block(const int fd, struct superblock* superblock) {
48  init_superblock_fs_info(superblock);
49  lseek(fd, 0, SEEK_SET);
50  ssize_t total_read =
51  read_while(fd, (char*) superblock->fs_info, sizeof(struct fs_info));
52 
53  if (total_read == -1) {
54  fprintf(stderr, "%s", strerror(errno));
55  free(superblock->fs_info);
56  return -1;
57  }
58 
59  init_superblock_arrays(superblock);
60  ssize_t readed = read_while(fd,
61  (char*) superblock->reserved_inodes_mask,
62  superblock->fs_info->inodes_count);
63  if (readed == -1) {
64  fprintf(stderr, "%s", strerror(errno));
65  destroy_super_block(superblock);
66  return -1;
67  }
68 
69  total_read += readed;
70 
71  readed = read_while(fd,
72  (char*) superblock->reserved_blocks_mask,
73  superblock->fs_info->blocks_count);
74  if (readed == -1) {
75  fprintf(stderr, "%s", strerror(errno));
76  destroy_super_block(superblock);
77  return -1;
78  }
79 
80  total_read += readed;
81 
82  return total_read;
83 }
84 
85 ssize_t write_super_block(const int fd, struct superblock* superblock) {
86  lseek(fd, 0, SEEK_SET);
87  ssize_t total_written = write_while(fd,
88  (const char*) superblock->fs_info,
89  sizeof(struct fs_info));
90 
91  if (total_written == -1) {
92  fprintf(stderr, "%s", strerror(errno));
93  return -1;
94  }
95 
96  ssize_t written = write_while(fd,
97  (const char*) superblock->reserved_inodes_mask,
98  superblock->fs_info->inodes_count);
99  if (written == -1) {
100  fprintf(stderr, "%s\n", strerror(errno));
101  return -1;
102  }
103  total_written += written;
104 
105  written = write_while(fd,
106  (const char*) superblock->reserved_blocks_mask,
107  superblock->fs_info->blocks_count);
108  if (written == -1) {
109  fprintf(stderr, "%s\n", strerror(errno));
110  return -1;
111  }
112  total_written += written;
113 
114  return total_written;
115 }
116 
117 uint16_t reserve_inode(const struct superblock* superblock) {
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;
121  return id;
122  }
123  }
124 
125  return superblock->fs_info->inodes_count;
126 }
127 
128 uint16_t free_inode(const struct superblock* superblock,
129  const uint16_t inode_id) {
130  if (superblock->reserved_inodes_mask[inode_id]) {
131  superblock->reserved_inodes_mask[inode_id] = false;
132  return inode_id;
133  }
134 
135  return superblock->fs_info->inodes_count;
136 }
137 
138 uint16_t reserve_block(const struct superblock* superblock) {
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;
142  return id;
143  }
144  }
145 
146  return superblock->fs_info->blocks_count;
147 }
148 
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;
152  return block_id;
153  }
154 
155  return superblock->fs_info->blocks_count;
156 }
uint16_t free_block(const struct superblock *superblock, uint16_t block_id)
Release block.
Definition: superblock.c:149
ssize_t write_super_block(int fd, struct superblock *superblock)
Write sb to memory.
Definition: superblock.c:85
Contains superblock struct and its methods.
void destroy_super_block(struct superblock *superblock)
Destructor of superblock.
Definition: superblock.c:41
int read_while(int fd, char *buffer, size_t to_read)
Properly reading from memory.
Definition: utils.c:23
ssize_t read_super_block(int fd, struct superblock *superblock)
Read sb from memory.
Definition: superblock.c:47
Contains constants of FS.
int write_while(int fd, const char *buffer, size_t to_write)
Properly writing to memory.
Definition: utils.c:38
uint16_t free_inode(const struct superblock *superblock, uint16_t inode_id)
Release inode.
Definition: superblock.c:128
uint16_t reserve_inode(const struct superblock *superblock)
Reserve free inode.
Definition: superblock.c:117
uint16_t reserve_block(const struct superblock *superblock)
Reserve block.
Definition: superblock.c:138
void init_super_block(struct superblock *superblock)
Constructor of superblock.
Definition: superblock.c:29
size_t sizeof_superblock(const struct superblock *superblock)
Definition: superblock.c:23