diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bpkfs.c | 3 | ||||
-rw-r--r-- | fs/devfs-core.c | 30 | ||||
-rw-r--r-- | fs/fs.c | 3 | ||||
-rw-r--r-- | fs/tftp.c | 10 |
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; @@ -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); @@ -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; |