fs: fat: write returns error code instead of -1
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Tue, 11 Sep 2018 06:59:03 +0000 (15:59 +0900)
committerAlexander Graf <agraf@suse.de>
Sun, 23 Sep 2018 19:55:29 +0000 (21:55 +0200)
It would be good that FAT write function return error code instead of
just returning -1 as fat_read_file() does.
This patch attempts to address this issue although it is 'best effort
(or estimate)' for now.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
fs/fat/fat_write.c

index 6c715a70f4470f0412175909277de347c5cfc147..1e4f5af9106dd82ddee2785ccabead0ad24a3727 100644 (file)
@@ -956,7 +956,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
 
        if (read_bootsectandvi(&bs, &volinfo, &mydata->fatsize)) {
                debug("error: reading boot sector\n");
-               return -1;
+               return -EIO;
        }
 
        total_sector = bs.total_sect;
@@ -997,7 +997,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
        mydata->fatbuf = memalign(ARCH_DMA_MINALIGN, FATBUFSIZE);
        if (mydata->fatbuf == NULL) {
                debug("Error: allocating memory\n");
-               return -1;
+               return -ENOMEM;
        }
 
        if (disk_read(cursect,
@@ -1005,6 +1005,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
                (mydata->clust_size) :
                PREFETCH_BLOCKS, do_fat_read_at_block) < 0) {
                debug("Error: reading rootdir block\n");
+               ret = -EIO;
                goto exit;
        }
        dentptr = (dir_entry *) do_fat_read_at_block;
@@ -1029,6 +1030,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
                                                        size);
                                if (ret) {
                                        printf("Error: %llu overflow\n", size);
+                                       ret = -ENOSPC;
                                        goto exit;
                                }
                        }
@@ -1036,6 +1038,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
                        ret = clear_fatent(mydata, start_cluster);
                        if (ret) {
                                printf("Error: clearing FAT entries\n");
+                               ret = -EIO;
                                goto exit;
                        }
 
@@ -1045,12 +1048,14 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
                        ret = start_cluster = find_empty_cluster(mydata);
                        if (ret < 0) {
                                printf("Error: finding empty cluster\n");
+                               ret = -ENOSPC;
                                goto exit;
                        }
 
                        ret = check_overflow(mydata, start_cluster, size);
                        if (ret) {
                                printf("Error: %llu overflow\n", size);
+                               ret = -ENOSPC;
                                goto exit;
                        }
 
@@ -1065,12 +1070,14 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
                        ret = start_cluster = find_empty_cluster(mydata);
                        if (ret < 0) {
                                printf("Error: finding empty cluster\n");
+                               ret = -ENOSPC;
                                goto exit;
                        }
 
                        ret = check_overflow(mydata, start_cluster, size);
                        if (ret) {
                                printf("Error: %llu overflow\n", size);
+                               ret = -ENOSPC;
                                goto exit;
                        }
                } else {
@@ -1087,6 +1094,7 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
        ret = set_contents(mydata, retdent, buffer, size, actwrite);
        if (ret < 0) {
                printf("Error: writing contents\n");
+               ret = -EIO;
                goto exit;
        }
        debug("attempt to write 0x%llx bytes\n", *actwrite);
@@ -1095,14 +1103,17 @@ static int do_fat_write(const char *filename, void *buffer, loff_t size,
        ret = flush_dirty_fat_buffer(mydata);
        if (ret) {
                printf("Error: flush fat buffer\n");
+               ret = -EIO;
                goto exit;
        }
 
        /* Write directory table to device */
        ret = set_cluster(mydata, dir_curclust, get_dentfromdir_block,
                        mydata->clust_size * mydata->sect_size);
-       if (ret)
+       if (ret) {
                printf("Error: writing directory entry\n");
+               ret = -EIO;
+       }
 
 exit:
        free(mydata->fatbuf);
@@ -1114,7 +1125,7 @@ int file_fat_write(const char *filename, void *buffer, loff_t offset,
 {
        if (offset != 0) {
                printf("Error: non zero offset is currently not supported.\n");
-               return -1;
+               return -EINVAL;
        }
 
        printf("writing %s\n", filename);