summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/fs/fs.c25
-rw-r--r--kernel/include/comus/fs.h4
2 files changed, 15 insertions, 14 deletions
diff --git a/kernel/fs/fs.c b/kernel/fs/fs.c
index 98b04df..b46450d 100644
--- a/kernel/fs/fs.c
+++ b/kernel/fs/fs.c
@@ -1,6 +1,7 @@
#include <lib.h>
#include <comus/fs.h>
#include <comus/mboot.h>
+#include <comus/error.h>
struct disk fs_disks[N_DISKS];
struct file_system fs_loaded_file_systems[N_DISKS];
@@ -97,7 +98,7 @@ static int disk_read_rd(struct disk *disk, size_t offset, size_t len,
{
if (offset + len >= disk->rd.len) {
WARN("attempted to read past length of ramdisk");
- return 1;
+ return -E_BAD_PARAM;
}
memcpy(buffer, disk->rd.start + offset, len);
@@ -112,11 +113,11 @@ static int disk_read_ata(struct disk *disk, size_t offset, size_t len,
uint32_t err = offset % ATA_SECT_SIZE;
uint32_t numsects = (len + err + ATA_SECT_SIZE - 1) / ATA_SECT_SIZE;
- int ret = 0;
+ int ret;
if (atabuf == NULL || atabuf_len < numsects * ATA_SECT_SIZE) {
if ((atabuf = krealloc(atabuf, numsects * ATA_SECT_SIZE)) == NULL)
- return 1;
+ return -E_NO_MEMORY;
atabuf_len = numsects * ATA_SECT_SIZE;
}
@@ -128,7 +129,7 @@ static int disk_read_ata(struct disk *disk, size_t offset, size_t len,
// copy over to buffer
memcpy(buffer, (char *)atabuf + err, len);
- return 0;
+ return len;
}
int disk_read(struct disk *disk, size_t offset, size_t len, void *buffer)
@@ -145,7 +146,7 @@ int disk_read(struct disk *disk, size_t offset, size_t len, void *buffer)
default:
ERROR("attempted to read from disk with invalid type: %d\n",
disk->type);
- ret = 1;
+ ret = -E_BAD_PARAM;
}
return ret;
@@ -156,7 +157,7 @@ static int disk_write_rd(struct disk *disk, size_t offset, size_t len,
{
if (offset + len >= disk->rd.len) {
WARN("attempted to write past length of ramdisk");
- return 1;
+ return -E_BAD_PARAM;
}
memcpy(disk->rd.start + offset, buffer, len);
@@ -171,18 +172,18 @@ static int disk_write_ata(struct disk *disk, size_t offset, size_t len,
uint32_t numsects = (len + ATA_SECT_SIZE - 1) / ATA_SECT_SIZE;
uint32_t err = offset % ATA_SECT_SIZE;
- int ret = 0;
+ int ret;
if (atabuf == NULL || atabuf_len < numsects * ATA_SECT_SIZE) {
if ((atabuf = krealloc(atabuf, numsects * ATA_SECT_SIZE)) == NULL)
- return 1;
+ return -E_NO_MEMORY;
atabuf_len = numsects * ATA_SECT_SIZE;
}
// read sectors what will be overwritten
if ((ret = ide_device_read_sectors(disk->ide, numsects,
offset / ATA_SECT_SIZE, atabuf)))
- return 1;
+ return ret;
// copy custom data over
memcpy((char *)atabuf + err, buffer, len);
@@ -190,9 +191,9 @@ static int disk_write_ata(struct disk *disk, size_t offset, size_t len,
// write back sectors
if ((ret = ide_device_write_sectors(disk->ide, numsects,
offset / ATA_SECT_SIZE, atabuf)))
- return 1;
+ return ret;
- return ret;
+ return len;
}
int disk_write(struct disk *disk, size_t offset, size_t len, void *buffer)
@@ -208,7 +209,7 @@ int disk_write(struct disk *disk, size_t offset, size_t len, void *buffer)
break;
default:
ERROR("attempted to write to disk with invalid type: %d\n", disk->type);
- ret = 1;
+ ret = -E_BAD_PARAM;
}
return ret;
diff --git a/kernel/include/comus/fs.h b/kernel/include/comus/fs.h
index dab84a5..872c298 100644
--- a/kernel/include/comus/fs.h
+++ b/kernel/include/comus/fs.h
@@ -45,7 +45,7 @@ struct disk {
* @param offset - the offset into the disk to read
* @param len - the length of the data to read into `buffer`
* @param buffer - the buffer to save data into
- * @returns 0 on success, error code in failure
+ * @returns number of bytes read on success, negative fs error code in failure
*/
int disk_read(struct disk *disk, size_t offset, size_t len, void *buffer);
@@ -56,7 +56,7 @@ int disk_read(struct disk *disk, size_t offset, size_t len, void *buffer);
* @param offset - the offset into the disk to write
* @param len - the length of the data to write into `buffer`
* @param buffer - the buffer to read from
- * @returns 0 on success, error code in failure
+ * @returns number of bytes written on success, negative fs error code in failure
*/
int disk_write(struct disk *disk, size_t offset, size_t len, void *buffer);