summaryrefslogtreecommitdiffstats
path: root/fs/fs.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fs.c')
-rw-r--r--fs/fs.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/fs.c b/fs/fs.c
index 148e3a35cb..7c1f18ebae 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -499,9 +499,15 @@ ssize_t write(int fd, const void *buf, size_t count)
fsdrv = (struct fs_driver_d *)dev->driver->type_data;
if (f->pos + count > f->size) {
errno = fsdrv->truncate(dev, f, f->pos + count);
- if (errno)
- return errno;
- f->size = f->pos + count;
+ if (errno) {
+ if (errno != -ENOSPC)
+ return errno;
+ count = f->size - f->pos;
+ if (!count)
+ return errno;
+ } else {
+ f->size = f->pos + count;
+ }
}
errno = fsdrv->write(dev, f, buf, count);