A file's size is stored in both the inode and struct filep, so we sync both values at a number of places. Instead of duplicating this information, just use the inode's size, but give it a macro for easier use. While at it, we also remove redundant assignments to the size field: The VFS core already does this at truncate time, so repeating it in the file systems is unnecessary. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- fs/bpkfs.c | 2 +- fs/devfs.c | 2 +- fs/efi.c | 2 +- fs/efivarfs.c | 4 +--- fs/fat/fat.c | 2 +- fs/fs.c | 46 +++++++++++++++++++----------------------- fs/nfs.c | 1 - fs/omap4_usbbootfs.c | 2 +- fs/pstore/fs.c | 2 +- fs/ratpfs.c | 2 +- fs/smhfs.c | 6 +++--- fs/squashfs/squashfs.c | 1 - fs/ubifs/ubifs.c | 1 - fs/uimagefs.c | 2 +- include/fs.h | 2 +- 15 files changed, 34 insertions(+), 43 deletions(-) diff --git a/fs/bpkfs.c b/fs/bpkfs.c index 8b32e26b9cd1..18ac70143e99 100644 --- a/fs/bpkfs.c +++ b/fs/bpkfs.c @@ -161,7 +161,7 @@ static int bpkfs_open(struct device *dev, FILE *f, const char *filename) lseek(d->fd, d->offset, SEEK_SET); } - f->size = d->size; + f->f_size = d->size; f->private_data = d; ret = 0; diff --git a/fs/devfs.c b/fs/devfs.c index d82e7dff7b94..51bf0f65490a 100644 --- a/fs/devfs.c +++ b/fs/devfs.c @@ -106,7 +106,7 @@ static int devfs_open(struct device *_dev, FILE *f, const char *filename) struct devfs_inode *node = container_of(inode, struct devfs_inode, inode); struct cdev *cdev = node->cdev; - f->size = cdev->flags & DEVFS_IS_CHARACTER_DEV ? + f->f_size = cdev->flags & DEVFS_IS_CHARACTER_DEV ? FILE_SIZE_STREAM : cdev->size; f->private_data = cdev; diff --git a/fs/efi.c b/fs/efi.c index d4fb9105277b..cbf53e3fe917 100644 --- a/fs/efi.c +++ b/fs/efi.c @@ -178,7 +178,7 @@ static int efifs_open(struct device *dev, FILE *f, const char *filename) goto out; } - f->size = info->FileSize; + f->f_size = info->FileSize; free(info); f->private_data = ufile; diff --git a/fs/efivarfs.c b/fs/efivarfs.c index 2e12b410f740..092437b54136 100644 --- a/fs/efivarfs.c +++ b/fs/efivarfs.c @@ -158,7 +158,7 @@ static int efivarfs_open(struct device *dev, FILE *f, const char *filename) goto out; } - f->size = efile->size; + f->f_size = efile->size; f->private_data = efile; return 0; @@ -226,8 +226,6 @@ static int efivarfs_truncate(struct device *dev, FILE *f, loff_t size) if (EFI_ERROR(efiret)) return -efi_errno(efiret); - f->size = efile->size; - return 0; } diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 7bf91be04281..af5a3e03f794 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -205,7 +205,7 @@ static int fat_open(struct device *dev, FILE *file, const char *filename) } file->private_data = f_file; - file->size = f_file->fsize; + file->f_size = f_file->fsize; return 0; } diff --git a/fs/fs.c b/fs/fs.c index d2287a82b579..dbac07d5996c 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -379,15 +379,14 @@ int ftruncate(int fd, loff_t length) if (IS_ERR(f)) return -errno; - if (f->size == FILE_SIZE_STREAM) + if (f->f_size == FILE_SIZE_STREAM) return 0; ret = fsdev_truncate(&f->fsdev->dev, f, length); if (ret) return errno_set(ret); - f->size = length; - f->f_inode->i_size = f->size; + f->f_size = length; return 0; } @@ -426,8 +425,8 @@ static ssize_t __read(FILE *f, void *buf, size_t count) if (fsdrv != ramfs_driver) assert_command_context(); - if (f->size != FILE_SIZE_STREAM && f->f_pos + count > f->size) - count = f->size - f->f_pos; + if (f->f_size != FILE_SIZE_STREAM && f->f_pos + count > f->f_size) + count = f->f_size - f->f_pos; if (!count) return 0; @@ -486,19 +485,18 @@ static ssize_t __write(FILE *f, const void *buf, size_t count) if (fsdrv != ramfs_driver) assert_command_context(); - if (f->size != FILE_SIZE_STREAM && f->f_pos + count > f->size) { + if (f->f_size != FILE_SIZE_STREAM && f->f_pos + count > f->f_size) { ret = fsdev_truncate(&f->fsdev->dev, f, f->f_pos + count); if (ret) { if (ret == -EPERM) ret = -ENOSPC; if (ret != -ENOSPC) goto out; - count = f->size - f->f_pos; + count = f->f_size - f->f_pos; if (!count) goto out; } else { - f->size = f->f_pos + count; - f->f_inode->i_size = f->size; + f->f_size = f->f_pos + count; } } ret = fsdrv->write(&f->fsdev->dev, f, buf, count); @@ -583,7 +581,7 @@ loff_t lseek(int fd, loff_t offset, int whence) pos = f->f_pos; break; case SEEK_END: - pos = f->size; + pos = f->f_size; break; default: goto out; @@ -591,7 +589,7 @@ loff_t lseek(int fd, loff_t offset, int whence) pos += offset; - if (f->size != FILE_SIZE_STREAM && (pos < 0 || pos > f->size)) + if (f->f_size != FILE_SIZE_STREAM && (pos < 0 || pos > f->f_size)) goto out; if (fsdrv->lseek) { @@ -619,10 +617,10 @@ int erase(int fd, loff_t count, loff_t offset, enum erase_type type) if (IS_ERR(f)) return -errno; - if (offset >= f->size) + if (offset >= f->f_size) return 0; - if (count == ERASE_SIZE_ALL || count > f->size - offset) - count = f->size - offset; + if (count == ERASE_SIZE_ALL || count > f->f_size - offset) + count = f->f_size - offset; if (count < 0) return -EINVAL; @@ -648,10 +646,10 @@ int protect(int fd, size_t count, loff_t offset, int prot) if (IS_ERR(f)) return -errno; - if (offset >= f->size) + if (offset >= f->f_size) return 0; - if (count > f->size - offset) - count = f->size - offset; + if (count > f->f_size - offset) + count = f->f_size - offset; fsdrv = f->fsdev->driver; @@ -675,10 +673,10 @@ int discard_range(int fd, loff_t count, loff_t offset) if (IS_ERR(f)) return -errno; - if (offset >= f->size) + if (offset >= f->f_size) return 0; - if (count > f->size - offset) - count = f->size - offset; + if (count > f->f_size - offset) + count = f->f_size - offset; fsdrv = f->fsdev->driver; @@ -2575,7 +2573,7 @@ int openat(int dirfd, const char *pathname, int flags) f->f_inode = new_inode(&fsdev->sb); f->f_inode->i_mode = S_IFREG; f->f_flags = flags; - f->size = 0; + f->f_size = 0; return file_to_fd(f); } @@ -2659,7 +2657,6 @@ int openat(int dirfd, const char *pathname, int flags) f->f_dentry = dentry; f->f_inode = iget(inode); f->f_flags = flags; - f->size = inode->i_size; fsdrv = fsdev->driver; @@ -2677,14 +2674,13 @@ int openat(int dirfd, const char *pathname, int flags) if (flags & O_TRUNC) { error = fsdev_truncate(&fsdev->dev, f, 0); - f->size = 0; - inode->i_size = 0; + f->f_size = 0; if (error) goto out; } if (flags & O_APPEND) - f->f_pos = f->size; + f->f_pos = f->f_size; return file_to_fd(f); diff --git a/fs/nfs.c b/fs/nfs.c index 40cbf7c773f3..c7bf37ea9e13 100644 --- a/fs/nfs.c +++ b/fs/nfs.c @@ -1167,7 +1167,6 @@ static int nfs_open(struct device *dev, FILE *file, const char *filename) priv->fh = ninode->fh; priv->npriv = npriv; file->private_data = priv; - file->size = inode->i_size; priv->fifo = kfifo_alloc(1024); if (!priv->fifo) { diff --git a/fs/omap4_usbbootfs.c b/fs/omap4_usbbootfs.c index 85019cde91ff..7a22acc9f01f 100644 --- a/fs/omap4_usbbootfs.c +++ b/fs/omap4_usbbootfs.c @@ -71,7 +71,7 @@ static int omap4_usbbootfs_open(struct device *dev, FILE *file, return PTR_ERR(priv); file->private_data = priv; - file->size = priv->size; + file->f_size = priv->size; return 0; } diff --git a/fs/pstore/fs.c b/fs/pstore/fs.c index 54d18c0d5b88..e9b4d00cde06 100644 --- a/fs/pstore/fs.c +++ b/fs/pstore/fs.c @@ -150,7 +150,7 @@ static int pstore_open(struct device *dev, FILE *file, const char *filename) if (!d) return -ENOENT; - file->size = d->size; + file->f_size = d->size; file->private_data = d; d->pos = 0; diff --git a/fs/ratpfs.c b/fs/ratpfs.c index 30469d304eee..9760a5a40c5d 100644 --- a/fs/ratpfs.c +++ b/fs/ratpfs.c @@ -151,7 +151,7 @@ static int ratpfs_open(struct device __always_unused *dev, goto err; } file->private_data = rfile; - file->size = get_unaligned_be32(&pkt_rx->data[5]); + file->f_size = get_unaligned_be32(&pkt_rx->data[5]); goto out; diff --git a/fs/smhfs.c b/fs/smhfs.c index 1edeba3e591c..037e51c2cf9c 100644 --- a/fs/smhfs.c +++ b/fs/smhfs.c @@ -70,9 +70,9 @@ static int smhfs_open(struct device __always_unused *dev, return fd; file->private_data = (void *)(uintptr_t)fd; - file->size = semihosting_flen(fd); - if (file->size < 0) - return file->size; + file->f_size = semihosting_flen(fd); + if (file->f_size < 0) + return file->f_size; return 0; } diff --git a/fs/squashfs/squashfs.c b/fs/squashfs/squashfs.c index 5ba435d86cef..5a33478da0a3 100644 --- a/fs/squashfs/squashfs.c +++ b/fs/squashfs/squashfs.c @@ -150,7 +150,6 @@ static int squashfs_open(struct device *dev, FILE *file, const char *filename) page->data_block = 0; page->idx = 0; page->real_page.inode = inode; - file->size = inode->i_size; file->private_data = page; return 0; diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c index 2ca510ab86fd..a88cb21e0559 100644 --- a/fs/ubifs/ubifs.c +++ b/fs/ubifs/ubifs.c @@ -352,7 +352,6 @@ static int ubifs_open(struct device *dev, FILE *file, const char *filename) uf->dn = xzalloc(UBIFS_MAX_DATA_NODE_SZ); uf->block = -1; - file->size = inode->i_size; file->private_data = uf; return 0; diff --git a/fs/uimagefs.c b/fs/uimagefs.c index 29a1e204de8e..83e6921fe9ec 100644 --- a/fs/uimagefs.c +++ b/fs/uimagefs.c @@ -88,7 +88,7 @@ static int uimagefs_open(struct device *dev, FILE *file, const char *filename) lseek(d->fd, d->offset, SEEK_SET); } - file->size = d->size; + file->f_size = d->size; file->private_data = d; return 0; diff --git a/include/fs.h b/include/fs.h index c10debd6a5df..404d0e58da97 100644 --- a/include/fs.h +++ b/include/fs.h @@ -24,11 +24,11 @@ typedef struct filep { char *path; loff_t f_pos; /* current position in stream */ #define FILE_SIZE_STREAM ((loff_t) -1) - loff_t size; /* The size of this inode */ ulong f_flags; /* the O_* flags from open */ void *private_data; /* private to the filesystem driver */ +#define f_size f_inode->i_size struct inode *f_inode; struct path f_path; } FILE; -- 2.39.5