target/pscsi: Reject cross page boundary case in pscsi_map_sg
[cascardo/linux.git] / drivers / target / target_core_alua.c
index 7d4ec02..ff1c5ee 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/spinlock.h>
 #include <linux/configfs.h>
 #include <linux/export.h>
+#include <linux/file.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
 #include <asm/unaligned.h>
@@ -715,36 +716,18 @@ static int core_alua_write_tpg_metadata(
        unsigned char *md_buf,
        u32 md_buf_len)
 {
-       mm_segment_t old_fs;
-       struct file *file;
-       struct iovec iov[1];
-       int flags = O_RDWR | O_CREAT | O_TRUNC, ret;
-
-       memset(iov, 0, sizeof(struct iovec));
+       struct file *file = filp_open(path, O_RDWR | O_CREAT | O_TRUNC, 0600);
+       int ret;
 
-       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);
+       if (IS_ERR(file)) {
+               pr_err("filp_open(%s) for ALUA metadata failed\n", path);
                return -ENODEV;
        }
-
-       iov[0].iov_base = &md_buf[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) {
+       ret = kernel_write(file, md_buf, md_buf_len, 0);
+       if (ret < 0)
                pr_err("Error writing ALUA metadata file: %s\n", path);
-               filp_close(file, NULL);
-               return -EIO;
-       }
-       filp_close(file, NULL);
-
-       return 0;
+       fput(file);
+       return ret ? -EIO : 0;
 }
 
 /*