diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-08-01 05:07:04 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-08-01 08:53:16 -0400 |
commit | dbc6e0222d79e78925fe20733844a796a4b72cf9 (patch) | |
tree | 49eabccaa420103bd5ecddc2b77bc916440db812 | |
parent | 06fd516c1a504828780fcd81dfe21f94dec4c868 (diff) |
delousing target_core_file a bit
* set_fs(KERNEL_DS) + getname() is probably the weirdest implementation
of strdup() I've seen. Especially since they don't to copy it at all...
* filp_open() never returns NULL; it's ERR_PTR(-E...) on failure.
* file->f_dentry is never going to be NULL, TYVM.
* match_strdup() + snprintf() + kfree() is a bloody weird way to spell
match_strlcpy().
Pox on cargo-cult programmers...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | drivers/target/target_core_file.c | 32 |
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; |
217 | fail: | 199 | fail: |
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; |