From: relan Date: Tue, 27 Dec 2016 14:22:12 +0000 (+0300) Subject: Propagate ENOSPC on write. X-Git-Tag: android-x86-9.0-r1~68 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=ca112f07b115a419250b6526e71345dcd29e4d67;p=android-x86%2Fexternal-exfat.git Propagate ENOSPC on write. Return -errno from exfat_generic_pread()/exfat_generic_pwrite() functions to distinguish between I/O error and out-of-space error. --- diff --git a/fuse/main.c b/fuse/main.c index 29545c9..9772fa9 100644 --- a/fuse/main.c +++ b/fuse/main.c @@ -218,25 +218,15 @@ static int fuse_exfat_fsync(const char* path, int datasync, static int fuse_exfat_read(const char* path, char* buffer, size_t size, off_t offset, struct fuse_file_info* fi) { - ssize_t ret; - exfat_debug("[%s] %s (%zu bytes)", __func__, path, size); - ret = exfat_generic_pread(&ef, get_node(fi), buffer, size, offset); - if (ret < 0) - return -EIO; - return ret; + return exfat_generic_pread(&ef, get_node(fi), buffer, size, offset); } static int fuse_exfat_write(const char* path, const char* buffer, size_t size, off_t offset, struct fuse_file_info* fi) { - ssize_t ret; - exfat_debug("[%s] %s (%zu bytes)", __func__, path, size); - ret = exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset); - if (ret < 0) - return -EIO; - return ret; + return exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset); } static int fuse_exfat_unlink(const char* path) diff --git a/libexfat/io.c b/libexfat/io.c index 60f28e2..d0594be 100644 --- a/libexfat/io.c +++ b/libexfat/io.c @@ -292,7 +292,7 @@ ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, if (CLUSTER_INVALID(cluster)) { exfat_error("invalid cluster 0x%x while reading", cluster); - return -1; + return -EIO; } loffset = offset % CLUSTER_SIZE(*ef->sb); @@ -302,14 +302,14 @@ ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, if (CLUSTER_INVALID(cluster)) { exfat_error("invalid cluster 0x%x while reading", cluster); - return -1; + return -EIO; } lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder); if (exfat_pread(ef->dev, bufp, lsize, exfat_c2o(ef, cluster) + loffset) < 0) { exfat_error("failed to read cluster %#x", cluster); - return -1; + return -EIO; } bufp += lsize; loffset = 0; @@ -324,16 +324,23 @@ ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, const void* buffer, size_t size, off_t offset) { + int rc; cluster_t cluster; const char* bufp = buffer; off_t lsize, loffset, remainder; if (offset > node->size) - if (exfat_truncate(ef, node, offset, true) != 0) - return -1; + { + rc = exfat_truncate(ef, node, offset, true); + if (rc != 0) + return rc; + } if (offset + size > node->size) - if (exfat_truncate(ef, node, offset + size, false) != 0) - return -1; + { + rc = exfat_truncate(ef, node, offset + size, false); + if (rc != 0) + return rc; + } if (size == 0) return 0; @@ -341,7 +348,7 @@ ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, if (CLUSTER_INVALID(cluster)) { exfat_error("invalid cluster 0x%x while writing", cluster); - return -1; + return -EIO; } loffset = offset % CLUSTER_SIZE(*ef->sb); @@ -351,14 +358,14 @@ ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, if (CLUSTER_INVALID(cluster)) { exfat_error("invalid cluster 0x%x while writing", cluster); - return -1; + return -EIO; } lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder); if (exfat_pwrite(ef->dev, bufp, lsize, exfat_c2o(ef, cluster) + loffset) < 0) { exfat_error("failed to write cluster %#x", cluster); - return -1; + return -EIO; } bufp += lsize; loffset = 0;