target: writev() on single-element vector is pointless

... in other news:
	filp_open() can't return a struct file with NULL dentry
	filp_open() can't return a struct file negative dentry
	filp_close() of something that never had been in any descriptor
tables is pointless - fput() is all you need

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2013-02-23 15:22:43 -05:00
parent 7bb307e894
commit 0e9b10a90f
2 changed files with 17 additions and 45 deletions

View File

@ -27,6 +27,7 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/configfs.h> #include <linux/configfs.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/file.h>
#include <scsi/scsi.h> #include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
@ -715,36 +716,18 @@ static int core_alua_write_tpg_metadata(
unsigned char *md_buf, unsigned char *md_buf,
u32 md_buf_len) u32 md_buf_len)
{ {
mm_segment_t old_fs; struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600);
struct file *file; int ret;
struct iovec iov[1];
int flags = O_RDWR | O_CREAT | O_TRUNC, ret;
memset(iov, 0, sizeof(struct iovec)); if (IS_ERR(file)) {
pr_err("filp_open(%s) for ALUA metadata failed\n", path);
file = filp_open(path, flags, 0600);
if (IS_ERR(file) || !file || !file->f_dentry) {
pr_err("filp_open(%s) for ALUA metadata failed\n",
path);
return -ENODEV; return -ENODEV;
} }
ret = kernel_write(file, md_buf, md_buf_len, 0);
iov[0].iov_base = &md_buf[0]; if (ret < 0)
iov[0].iov_len = md_buf_len;
old_fs = get_fs();
set_fs(get_ds());
ret = vfs_writev(file, &iov[0], 1, &file->f_pos);
set_fs(old_fs);
if (ret < 0) {
pr_err("Error writing ALUA metadata file: %s\n", path); pr_err("Error writing ALUA metadata file: %s\n", path);
filp_close(file, NULL); fput(file);
return -EIO; return ret ? -EIO : 0;
}
filp_close(file, NULL);
return 0;
} }
/* /*

View File

@ -27,6 +27,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/file.h>
#include <scsi/scsi.h> #include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h> #include <scsi/scsi_cmnd.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
@ -1957,13 +1958,10 @@ static int __core_scsi3_write_aptpl_to_file(
{ {
struct t10_wwn *wwn = &dev->t10_wwn; struct t10_wwn *wwn = &dev->t10_wwn;
struct file *file; struct file *file;
struct iovec iov[1];
mm_segment_t old_fs;
int flags = O_RDWR | O_CREAT | O_TRUNC; int flags = O_RDWR | O_CREAT | O_TRUNC;
char path[512]; char path[512];
int ret; int ret;
memset(iov, 0, sizeof(struct iovec));
memset(path, 0, 512); memset(path, 0, 512);
if (strlen(&wwn->unit_serial[0]) >= 512) { if (strlen(&wwn->unit_serial[0]) >= 512) {
@ -1974,31 +1972,22 @@ static int __core_scsi3_write_aptpl_to_file(
snprintf(path, 512, "/var/target/pr/aptpl_%s", &wwn->unit_serial[0]); snprintf(path, 512, "/var/target/pr/aptpl_%s", &wwn->unit_serial[0]);
file = filp_open(path, flags, 0600); file = filp_open(path, flags, 0600);
if (IS_ERR(file) || !file || !file->f_dentry) { if (IS_ERR(file)) {
pr_err("filp_open(%s) for APTPL metadata" pr_err("filp_open(%s) for APTPL metadata"
" failed\n", path); " failed\n", path);
return IS_ERR(file) ? PTR_ERR(file) : -ENOENT; return PTR_ERR(file);
} }
iov[0].iov_base = &buf[0];
if (!pr_aptpl_buf_len) if (!pr_aptpl_buf_len)
iov[0].iov_len = (strlen(&buf[0]) + 1); /* Add extra for NULL */ pr_aptpl_buf_len = (strlen(&buf[0]) + 1); /* Add extra for NULL */
else
iov[0].iov_len = pr_aptpl_buf_len;
old_fs = get_fs(); ret = kernel_write(file, buf, pr_aptpl_buf_len, 0);
set_fs(get_ds());
ret = vfs_writev(file, &iov[0], 1, &file->f_pos);
set_fs(old_fs);
if (ret < 0) { if (ret < 0)
pr_debug("Error writing APTPL metadata file: %s\n", path); pr_debug("Error writing APTPL metadata file: %s\n", path);
filp_close(file, NULL); fput(file);
return -EIO;
}
filp_close(file, NULL);
return 0; return ret ? -EIO : 0;
} }
static int static int