Re: [PATCH 06/16] fs: fix kernel_write prototype
On Wed, Aug 30, 2017 at 04:39:00PM +0100, Al Viro wrote: > On Wed, Aug 30, 2017 at 04:59:57PM +0200, Christoph Hellwig wrote: > > > for (prot = 0; prot < prot_length;) { > > sector_t len = min_t(sector_t, bufsize, prot_length - prot); > > - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot); > > + ssize_t ret = kernel_write(prot_fd, buf, len, ); > > > > if (ret != len) { > > pr_err("vfs_write to prot file failed: %zd\n", ret); > > return ret < 0 ? ret : -ENODEV; > > } > > - prot += ret; > > } > > And that loop will terminate because of...? IOW, the same bug class as in > the kernel_read() patch. Also fixed.
Re: [PATCH 06/16] fs: fix kernel_write prototype
On Wed, Aug 30, 2017 at 04:39:00PM +0100, Al Viro wrote: > On Wed, Aug 30, 2017 at 04:59:57PM +0200, Christoph Hellwig wrote: > > > for (prot = 0; prot < prot_length;) { > > sector_t len = min_t(sector_t, bufsize, prot_length - prot); > > - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot); > > + ssize_t ret = kernel_write(prot_fd, buf, len, ); > > > > if (ret != len) { > > pr_err("vfs_write to prot file failed: %zd\n", ret); > > return ret < 0 ? ret : -ENODEV; > > } > > - prot += ret; > > } > > And that loop will terminate because of...? IOW, the same bug class as in > the kernel_read() patch. Also fixed.
Re: [PATCH 06/16] fs: fix kernel_write prototype
On Wed, Aug 30, 2017 at 04:59:57PM +0200, Christoph Hellwig wrote: > for (prot = 0; prot < prot_length;) { > sector_t len = min_t(sector_t, bufsize, prot_length - prot); > - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot); > + ssize_t ret = kernel_write(prot_fd, buf, len, ); > > if (ret != len) { > pr_err("vfs_write to prot file failed: %zd\n", ret); > return ret < 0 ? ret : -ENODEV; > } > - prot += ret; > } And that loop will terminate because of...? IOW, the same bug class as in the kernel_read() patch.
Re: [PATCH 06/16] fs: fix kernel_write prototype
On Wed, Aug 30, 2017 at 04:59:57PM +0200, Christoph Hellwig wrote: > for (prot = 0; prot < prot_length;) { > sector_t len = min_t(sector_t, bufsize, prot_length - prot); > - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot); > + ssize_t ret = kernel_write(prot_fd, buf, len, ); > > if (ret != len) { > pr_err("vfs_write to prot file failed: %zd\n", ret); > return ret < 0 ? ret : -ENODEV; > } > - prot += ret; > } And that loop will terminate because of...? IOW, the same bug class as in the kernel_read() patch.
[PATCH 06/16] fs: fix kernel_write prototype
Make the position an in/out argument like all the other read/write helpers. Signed-off-by: Christoph Hellwig--- drivers/mtd/nand/nandsim.c| 2 +- drivers/target/target_core_alua.c | 3 ++- drivers/target/target_core_file.c | 3 +-- drivers/target/target_core_pr.c | 3 ++- fs/ecryptfs/read_write.c | 2 +- fs/read_write.c | 4 ++-- include/linux/fs.h| 2 +- kernel/sysctl_binary.c| 9 ++--- security/keys/big_key.c | 3 ++- 9 files changed, 18 insertions(+), 13 deletions(-) diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c index a8089656879a..3300a77667fb 100644 --- a/drivers/mtd/nand/nandsim.c +++ b/drivers/mtd/nand/nandsim.c @@ -1395,7 +1395,7 @@ static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size if (err) return err; noreclaim_flag = memalloc_noreclaim_save(); - tx = kernel_write(file, buf, count, pos); + tx = kernel_write(file, buf, count, ); memalloc_noreclaim_restore(noreclaim_flag); put_pages(ns); return tx; diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c index a91b7c25ffd4..928127642574 100644 --- a/drivers/target/target_core_alua.c +++ b/drivers/target/target_core_alua.c @@ -896,13 +896,14 @@ static int core_alua_write_tpg_metadata( u32 md_buf_len) { struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600); + loff_t pos = 0; int ret; if (IS_ERR(file)) { pr_err("filp_open(%s) for ALUA metadata failed\n", path); return -ENODEV; } - ret = kernel_write(file, md_buf, md_buf_len, 0); + ret = kernel_write(file, md_buf, md_buf_len, ); if (ret < 0) pr_err("Error writing ALUA metadata file: %s\n", path); fput(file); diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 24cf11d9e50a..21e65d69ab2e 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -443,13 +443,12 @@ fd_do_prot_fill(struct se_device *se_dev, sector_t lba, sector_t nolb, for (prot = 0; prot < prot_length;) { sector_t len = min_t(sector_t, bufsize, prot_length - prot); - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot); + ssize_t ret = kernel_write(prot_fd, buf, len, ); if (ret != len) { pr_err("vfs_write to prot file failed: %zd\n", ret); return ret < 0 ? ret : -ENODEV; } - prot += ret; } return 0; diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index 6d5def64db61..dd2cd8048582 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c @@ -1974,6 +1974,7 @@ static int __core_scsi3_write_aptpl_to_file( char path[512]; u32 pr_aptpl_buf_len; int ret; + loff_t pos = 0; memset(path, 0, 512); @@ -1993,7 +1994,7 @@ static int __core_scsi3_write_aptpl_to_file( pr_aptpl_buf_len = (strlen(buf) + 1); /* Add extra for NULL */ - ret = kernel_write(file, buf, pr_aptpl_buf_len, 0); + ret = kernel_write(file, buf, pr_aptpl_buf_len, ); if (ret < 0) pr_debug("Error writing APTPL metadata file: %s\n", path); diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index d8af0e99bfaf..c596e7c03424 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c @@ -47,7 +47,7 @@ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; if (!lower_file) return -EIO; - rc = kernel_write(lower_file, data, size, offset); + rc = kernel_write(lower_file, data, size, ); mark_inode_dirty_sync(ecryptfs_inode); return rc; } diff --git a/fs/read_write.c b/fs/read_write.c index 1966fd6e03ce..82f0111b98cf 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -513,7 +513,7 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t EXPORT_SYMBOL(__kernel_write); ssize_t kernel_write(struct file *file, const char *buf, size_t count, - loff_t pos) + loff_t *pos) { mm_segment_t old_fs; ssize_t res; @@ -521,7 +521,7 @@ ssize_t kernel_write(struct file *file, const char *buf, size_t count, old_fs = get_fs(); set_fs(get_ds()); /* The cast to a user pointer is valid due to the set_fs() */ - res = vfs_write(file, (__force const char __user *)buf, count, ); + res = vfs_write(file, (__force const char __user *)buf, count, pos); set_fs(old_fs); return res; diff --git a/include/linux/fs.h b/include/linux/fs.h index
[PATCH 06/16] fs: fix kernel_write prototype
Make the position an in/out argument like all the other read/write helpers. Signed-off-by: Christoph Hellwig --- drivers/mtd/nand/nandsim.c| 2 +- drivers/target/target_core_alua.c | 3 ++- drivers/target/target_core_file.c | 3 +-- drivers/target/target_core_pr.c | 3 ++- fs/ecryptfs/read_write.c | 2 +- fs/read_write.c | 4 ++-- include/linux/fs.h| 2 +- kernel/sysctl_binary.c| 9 ++--- security/keys/big_key.c | 3 ++- 9 files changed, 18 insertions(+), 13 deletions(-) diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c index a8089656879a..3300a77667fb 100644 --- a/drivers/mtd/nand/nandsim.c +++ b/drivers/mtd/nand/nandsim.c @@ -1395,7 +1395,7 @@ static ssize_t write_file(struct nandsim *ns, struct file *file, void *buf, size if (err) return err; noreclaim_flag = memalloc_noreclaim_save(); - tx = kernel_write(file, buf, count, pos); + tx = kernel_write(file, buf, count, ); memalloc_noreclaim_restore(noreclaim_flag); put_pages(ns); return tx; diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c index a91b7c25ffd4..928127642574 100644 --- a/drivers/target/target_core_alua.c +++ b/drivers/target/target_core_alua.c @@ -896,13 +896,14 @@ static int core_alua_write_tpg_metadata( u32 md_buf_len) { struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600); + loff_t pos = 0; int ret; if (IS_ERR(file)) { pr_err("filp_open(%s) for ALUA metadata failed\n", path); return -ENODEV; } - ret = kernel_write(file, md_buf, md_buf_len, 0); + ret = kernel_write(file, md_buf, md_buf_len, ); if (ret < 0) pr_err("Error writing ALUA metadata file: %s\n", path); fput(file); diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 24cf11d9e50a..21e65d69ab2e 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -443,13 +443,12 @@ fd_do_prot_fill(struct se_device *se_dev, sector_t lba, sector_t nolb, for (prot = 0; prot < prot_length;) { sector_t len = min_t(sector_t, bufsize, prot_length - prot); - ssize_t ret = kernel_write(prot_fd, buf, len, pos + prot); + ssize_t ret = kernel_write(prot_fd, buf, len, ); if (ret != len) { pr_err("vfs_write to prot file failed: %zd\n", ret); return ret < 0 ? ret : -ENODEV; } - prot += ret; } return 0; diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index 6d5def64db61..dd2cd8048582 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c @@ -1974,6 +1974,7 @@ static int __core_scsi3_write_aptpl_to_file( char path[512]; u32 pr_aptpl_buf_len; int ret; + loff_t pos = 0; memset(path, 0, 512); @@ -1993,7 +1994,7 @@ static int __core_scsi3_write_aptpl_to_file( pr_aptpl_buf_len = (strlen(buf) + 1); /* Add extra for NULL */ - ret = kernel_write(file, buf, pr_aptpl_buf_len, 0); + ret = kernel_write(file, buf, pr_aptpl_buf_len, ); if (ret < 0) pr_debug("Error writing APTPL metadata file: %s\n", path); diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index d8af0e99bfaf..c596e7c03424 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c @@ -47,7 +47,7 @@ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; if (!lower_file) return -EIO; - rc = kernel_write(lower_file, data, size, offset); + rc = kernel_write(lower_file, data, size, ); mark_inode_dirty_sync(ecryptfs_inode); return rc; } diff --git a/fs/read_write.c b/fs/read_write.c index 1966fd6e03ce..82f0111b98cf 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -513,7 +513,7 @@ ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t EXPORT_SYMBOL(__kernel_write); ssize_t kernel_write(struct file *file, const char *buf, size_t count, - loff_t pos) + loff_t *pos) { mm_segment_t old_fs; ssize_t res; @@ -521,7 +521,7 @@ ssize_t kernel_write(struct file *file, const char *buf, size_t count, old_fs = get_fs(); set_fs(get_ds()); /* The cast to a user pointer is valid due to the set_fs() */ - res = vfs_write(file, (__force const char __user *)buf, count, ); + res = vfs_write(file, (__force const char __user *)buf, count, pos); set_fs(old_fs); return res; diff --git a/include/linux/fs.h b/include/linux/fs.h index