aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/target/target_core_file.c32
1 files changed, 5 insertions, 27 deletions
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
index 9f99d0404908..f84cbff83bcd 100644
--- a/drivers/target/target_core_file.c
+++ b/drivers/target/target_core_file.c
@@ -109,46 +109,29 @@ static struct se_device *fd_create_virtdevice(
109 struct se_subsystem_dev *se_dev, 109 struct se_subsystem_dev *se_dev,
110 void *p) 110 void *p)
111{ 111{
112 char *dev_p = NULL;
113 struct se_device *dev; 112 struct se_device *dev;
114 struct se_dev_limits dev_limits; 113 struct se_dev_limits dev_limits;
115 struct queue_limits *limits; 114 struct queue_limits *limits;
116 struct fd_dev *fd_dev = p; 115 struct fd_dev *fd_dev = p;
117 struct fd_host *fd_host = hba->hba_ptr; 116 struct fd_host *fd_host = hba->hba_ptr;
118 mm_segment_t old_fs;
119 struct file *file; 117 struct file *file;
120 struct inode *inode = NULL; 118 struct inode *inode = NULL;
121 int dev_flags = 0, flags, ret = -EINVAL; 119 int dev_flags = 0, flags, ret = -EINVAL;
122 120
123 memset(&dev_limits, 0, sizeof(struct se_dev_limits)); 121 memset(&dev_limits, 0, sizeof(struct se_dev_limits));
124 122
125 old_fs = get_fs();
126 set_fs(get_ds());
127 dev_p = getname(fd_dev->fd_dev_name);
128 set_fs(old_fs);
129
130 if (IS_ERR(dev_p)) {
131 pr_err("getname(%s) failed: %lu\n",
132 fd_dev->fd_dev_name, IS_ERR(dev_p));
133 ret = PTR_ERR(dev_p);
134 goto fail;
135 }
136 /* 123 /*
137 * Use O_DSYNC by default instead of O_SYNC to forgo syncing 124 * Use O_DSYNC by default instead of O_SYNC to forgo syncing
138 * of pure timestamp updates. 125 * of pure timestamp updates.
139 */ 126 */
140 flags = O_RDWR | O_CREAT | O_LARGEFILE | O_DSYNC; 127 flags = O_RDWR | O_CREAT | O_LARGEFILE | O_DSYNC;
141 128
142 file = filp_open(dev_p, flags, 0600); 129 file = filp_open(fd_dev->fd_dev_name, flags, 0600);
143 if (IS_ERR(file)) { 130 if (IS_ERR(file)) {
144 pr_err("filp_open(%s) failed\n", dev_p); 131 pr_err("filp_open(%s) failed\n", fd_dev->fd_dev_name);
145 ret = PTR_ERR(file); 132 ret = PTR_ERR(file);
146 goto fail; 133 goto fail;
147 } 134 }
148 if (!file || !file->f_dentry) {
149 pr_err("filp_open(%s) failed\n", dev_p);
150 goto fail;
151 }
152 fd_dev->fd_file = file; 135 fd_dev->fd_file = file;
153 /* 136 /*
154 * If using a block backend with this struct file, we extract 137 * If using a block backend with this struct file, we extract
@@ -212,14 +195,12 @@ static struct se_device *fd_create_virtdevice(
212 " %llu total bytes\n", fd_host->fd_host_id, fd_dev->fd_dev_id, 195 " %llu total bytes\n", fd_host->fd_host_id, fd_dev->fd_dev_id,
213 fd_dev->fd_dev_name, fd_dev->fd_dev_size); 196 fd_dev->fd_dev_name, fd_dev->fd_dev_size);
214 197
215 putname(dev_p);
216 return dev; 198 return dev;
217fail: 199fail:
218 if (fd_dev->fd_file) { 200 if (fd_dev->fd_file) {
219 filp_close(fd_dev->fd_file, NULL); 201 filp_close(fd_dev->fd_file, NULL);
220 fd_dev->fd_file = NULL; 202 fd_dev->fd_file = NULL;
221 } 203 }
222 putname(dev_p);
223 return ERR_PTR(ret); 204 return ERR_PTR(ret);
224} 205}
225 206
@@ -448,14 +429,11 @@ static ssize_t fd_set_configfs_dev_params(
448 token = match_token(ptr, tokens, args); 429 token = match_token(ptr, tokens, args);
449 switch (token) { 430 switch (token) {
450 case Opt_fd_dev_name: 431 case Opt_fd_dev_name:
451 arg_p = match_strdup(&args[0]); 432 if (match_strlcpy(fd_dev->fd_dev_name, &args[0],
452 if (!arg_p) { 433 FD_MAX_DEV_NAME) == 0) {
453 ret = -ENOMEM; 434 ret = -EINVAL;
454 break; 435 break;
455 } 436 }
456 snprintf(fd_dev->fd_dev_name, FD_MAX_DEV_NAME,
457 "%s", arg_p);
458 kfree(arg_p);
459 pr_debug("FILEIO: Referencing Path: %s\n", 437 pr_debug("FILEIO: Referencing Path: %s\n",
460 fd_dev->fd_dev_name); 438 fd_dev->fd_dev_name);
461 fd_dev->fbd_flags |= FBDF_HAS_PATH; 439 fd_dev->fbd_flags |= FBDF_HAS_PATH;