summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/bpkfs.c3
-rw-r--r--fs/devfs-core.c30
-rw-r--r--fs/fs.c3
-rw-r--r--fs/tftp.c10
4 files changed, 26 insertions, 20 deletions
diff --git a/fs/bpkfs.c b/fs/bpkfs.c
index b3b45be76d..8352307e59 100644
--- a/fs/bpkfs.c
+++ b/fs/bpkfs.c
@@ -12,7 +12,6 @@
#include <fs.h>
#include <errno.h>
#include <fcntl.h>
-#include <fs.h>
#include <malloc.h>
#include <init.h>
#include <linux/stat.h>
@@ -438,7 +437,7 @@ static int bpkfs_probe(struct device_d *dev)
dev_dbg(dev, "%d: type = 0x%x => %s\n", i, d->type, d->name);
dev_dbg(dev, "%d: size = %llu\n", i, d->size);
- dev_dbg(dev, "%d: offset = %d\n", i, d->offset);
+ dev_dbg(dev, "%d: offset = %zu\n", i, d->offset);
dev_dbg(dev, "%d: hw_id = 0x%x => %s\n", i, h->hw_id, h->name);
diff --git a/fs/devfs-core.c b/fs/devfs-core.c
index 44f0169e63..bd6d482867 100644
--- a/fs/devfs-core.c
+++ b/fs/devfs-core.c
@@ -276,6 +276,15 @@ struct cdev *devfs_add_partition(const char *devname, loff_t offset, loff_t size
if (offset + size > cdev->size)
return ERR_PTR(-EINVAL);
+ if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD) && cdev->mtd) {
+ struct mtd_info *mtd;
+
+ mtd = mtd_add_partition(cdev->mtd, offset, size, flags, name);
+ if (IS_ERR(mtd))
+ return (void *)mtd;
+ return 0;
+ }
+
new = xzalloc(sizeof (*new));
new->name = strdup(name);
if (!strncmp(devname, name, strlen(devname)))
@@ -287,17 +296,6 @@ struct cdev *devfs_add_partition(const char *devname, loff_t offset, loff_t size
new->dev = cdev->dev;
new->flags = flags | DEVFS_IS_PARTITION;
-#ifdef CONFIG_PARTITION_NEED_MTD
- if (cdev->mtd) {
- new->mtd = mtd_add_partition(cdev->mtd, offset, size, flags, name);
- if (IS_ERR(new->mtd)) {
- int ret = PTR_ERR(new->mtd);
- free(new);
- return ERR_PTR(ret);
- }
- }
-#endif
-
devfs_create(new);
return new;
@@ -312,16 +310,16 @@ int devfs_del_partition(const char *name)
if (!cdev)
return -ENOENT;
+ if (IS_ENABLED(CONFIG_PARTITION_NEED_MTD) && cdev->mtd) {
+ ret = mtd_del_partition(cdev->mtd);
+ return ret;
+ }
+
if (!(cdev->flags & DEVFS_IS_PARTITION))
return -EINVAL;
if (cdev->flags & DEVFS_PARTITION_FIXED)
return -EPERM;
-#ifdef CONFIG_PARTITION_NEED_MTD
- if (cdev->mtd)
- mtd_del_partition(cdev->mtd);
-#endif
-
ret = devfs_remove(cdev);
if (ret)
return ret;
diff --git a/fs/fs.c b/fs/fs.c
index bb849cb3b9..b0ac918acc 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -60,7 +60,8 @@ again:
if (fd < 0)
goto err_out;
- if (read(fd, buf, s.st_size) < s.st_size)
+ ret = read_full(fd, buf, s.st_size);
+ if (ret < 0)
goto err_out1;
close(fd);
diff --git a/fs/tftp.c b/fs/tftp.c
index b641faf15a..9cad18fe8d 100644
--- a/fs/tftp.c
+++ b/fs/tftp.c
@@ -110,7 +110,7 @@ static int tftp_rmdir(struct device_d *dev, const char *pathname)
static int tftp_truncate(struct device_d *dev, FILE *f, ulong size)
{
- return -ENOSYS;
+ return 0;
}
static int tftp_send(struct file_priv *priv)
@@ -393,6 +393,14 @@ static struct file_priv *tftp_do_open(struct device_d *dev,
case O_WRONLY:
priv->push = 1;
priv->state = STATE_WRQ;
+ if (!(accmode & O_TRUNC)) {
+ /*
+ * TFTP always truncates the existing file, so this
+ * flag is mandatory when opening a file for writing.
+ */
+ ret = -ENOSYS;
+ goto out;
+ }
break;
case O_RDWR:
ret = -ENOSYS;