aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/fs/marfs/sectorlevel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/fs/marfs/sectorlevel.c')
-rw-r--r--src/kernel/fs/marfs/sectorlevel.c143
1 files changed, 73 insertions, 70 deletions
diff --git a/src/kernel/fs/marfs/sectorlevel.c b/src/kernel/fs/marfs/sectorlevel.c
index 96a24ba..e84e1f2 100644
--- a/src/kernel/fs/marfs/sectorlevel.c
+++ b/src/kernel/fs/marfs/sectorlevel.c
@@ -5,114 +5,117 @@
uint8_t marfs_init(struct ata_interface *_interface)
{
- interface = _interface;
- uint16_t identify_data[256 * 2];
- uint8_t ret = ata_identify(interface, identify_data);
- max_lba = (identify_data[61] << 16) + identify_data[60];
- return ret;
+ interface = _interface;
+ uint16_t identify_data[256 * 2];
+ uint8_t ret = ata_identify(interface, identify_data);
+ max_lba = (identify_data[61] << 16) + identify_data[60];
+ return ret;
}
uint32_t marfs_get_max_lba(void)
{
- return max_lba;
+ return max_lba;
}
uint8_t marfs_write_mbr(uint8_t *mbr)
{
- return ata_write28(interface, 0, mbr);
+ return ata_write28(interface, 0, mbr);
}
struct marfs_superblock *marfs_read_superblock()
{
- struct marfs_superblock *p = (struct marfs_superblock *) ata_read28(interface, 1);
- sb_cache = *p;
- return p;
+ struct marfs_superblock *p = (struct marfs_superblock *)ata_read28(interface, 1);
+ sb_cache = *p;
+ return p;
}
uint8_t marfs_write_superblock(struct marfs_superblock *sb)
{
- sb_cache = *sb;
- return ata_write28(interface, 1, (uint8_t *) sb);
+ sb_cache = *sb;
+ return ata_write28(interface, 1, (uint8_t *)sb);
}
uint32_t marfs_get_free_lba_block(void)
{
- uint32_t offset = 2 + sb_cache.s_first_chunk;
- uint8_t *p = 0;
- for (uint32_t i = 0; i < sb_cache.n_chunks; i++) {
- p = ata_read28(interface, offset);
- if (!(*p & 0x80)) break;
- kfree(p);
- offset += 512;
- }
-
- offset++;
- for (uint16_t i = 1; i < 512; i++) {
- if (!p[i]) break;
- offset++;
- }
- kfree(p);
-
- ata_clear28(interface, offset);
-
- return offset;
+ uint32_t offset = 2 + sb_cache.s_first_chunk;
+ uint8_t *p = 0;
+ for (uint32_t i = 0; i < sb_cache.n_chunks; i++) {
+ p = ata_read28(interface, offset);
+ if (!(*p & 0x80))
+ break;
+ kfree(p);
+ offset += 512;
+ }
+
+ offset++;
+ for (uint16_t i = 1; i < 512; i++) {
+ if (!p[i])
+ break;
+ offset++;
+ }
+ kfree(p);
+
+ ata_clear28(interface, offset);
+
+ return offset;
}
static uint8_t marfs_mark_block(uint32_t lba_sector, uint8_t mode)
{
- lba_sector -= 2;
- lba_sector -= sb_cache.s_first_chunk;
- uint16_t block_in_chunk = (uint16_t) (lba_sector % 512);
- lba_sector /= 512;
- lba_sector = 2 + sb_cache.s_first_chunk + (512 * lba_sector);
-
- uint8_t *p = ata_read28(interface, lba_sector);
- p[block_in_chunk] = mode;
-
- if (mode == 0) {
- p[0] = 0;
- } else {
- uint8_t full_chunk = 1;
- for (uint16_t i = 1; i < 512; i++) {
- if (!p[i]) {
- full_chunk = 0;
- break;
- }
- }
- p[0] = full_chunk;
- }
-
- uint8_t ret = ata_write28(interface, lba_sector, p);
- kfree(p);
- return ret;
+ lba_sector -= 2;
+ lba_sector -= sb_cache.s_first_chunk;
+ uint16_t block_in_chunk = (uint16_t)(lba_sector % 512);
+ lba_sector /= 512;
+ lba_sector = 2 + sb_cache.s_first_chunk + (512 * lba_sector);
+
+ uint8_t *p = ata_read28(interface, lba_sector);
+ p[block_in_chunk] = mode;
+
+ if (mode == 0) {
+ p[0] = 0;
+ } else {
+ uint8_t full_chunk = 1;
+ for (uint16_t i = 1; i < 512; i++) {
+ if (!p[i]) {
+ full_chunk = 0;
+ break;
+ }
+ }
+ p[0] = full_chunk;
+ }
+
+ uint8_t ret = ata_write28(interface, lba_sector, p);
+ kfree(p);
+ return ret;
}
uint8_t marfs_mark_block_as_free(uint32_t lba_sector)
{
- return marfs_mark_block(lba_sector, 0);
+ return marfs_mark_block(lba_sector, 0);
}
uint8_t marfs_mark_block_as_used(uint32_t lba_sector)
{
- return marfs_mark_block(lba_sector, 1);
+ return marfs_mark_block(lba_sector, 1);
}
uint32_t marfs_get_free_lba_inode(void)
{
- uint32_t offset;
- for (offset = 2; offset < 2 + sb_cache.n_inodes; offset++) {
- struct marfs_inode *inode = (struct marfs_inode *) ata_read28(interface, offset);
- uint8_t used = inode->is_used;
- kfree(inode);
- if (!used) break;
- }
- return offset;
+ uint32_t offset;
+ for (offset = 2; offset < 2 + sb_cache.n_inodes; offset++) {
+ struct marfs_inode *inode = (struct marfs_inode *)ata_read28(interface, offset);
+ uint8_t used = inode->is_used;
+ kfree(inode);
+ if (!used)
+ break;
+ }
+ return offset;
}
void marfs_mark_inode_as_free(uint32_t lba_sector)
{
- struct marfs_inode *inode = (struct marfs_inode *) ata_read28(interface, lba_sector);
- inode->is_used = 0;
- ata_write28(interface, lba_sector, (uint8_t *) inode);
- kfree(inode);
+ struct marfs_inode *inode = (struct marfs_inode *)ata_read28(interface, lba_sector);
+ inode->is_used = 0;
+ ata_write28(interface, lba_sector, (uint8_t *)inode);
+ kfree(inode);
} \ No newline at end of file