diff options
Diffstat (limited to 'drivers/infiniband/hw/hfi1/fault.c')
-rw-r--r-- | drivers/infiniband/hw/hfi1/fault.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/hfi1/fault.c b/drivers/infiniband/hw/hfi1/fault.c index 93613e5def9b..986c12153e62 100644 --- a/drivers/infiniband/hw/hfi1/fault.c +++ b/drivers/infiniband/hw/hfi1/fault.c | |||
@@ -141,12 +141,14 @@ static ssize_t fault_opcodes_write(struct file *file, const char __user *buf, | |||
141 | if (!data) | 141 | if (!data) |
142 | return -ENOMEM; | 142 | return -ENOMEM; |
143 | copy = min(len, datalen - 1); | 143 | copy = min(len, datalen - 1); |
144 | if (copy_from_user(data, buf, copy)) | 144 | if (copy_from_user(data, buf, copy)) { |
145 | return -EFAULT; | 145 | ret = -EFAULT; |
146 | goto free_data; | ||
147 | } | ||
146 | 148 | ||
147 | ret = debugfs_file_get(file->f_path.dentry); | 149 | ret = debugfs_file_get(file->f_path.dentry); |
148 | if (unlikely(ret)) | 150 | if (unlikely(ret)) |
149 | return ret; | 151 | goto free_data; |
150 | ptr = data; | 152 | ptr = data; |
151 | token = ptr; | 153 | token = ptr; |
152 | for (ptr = data; *ptr; ptr = end + 1, token = ptr) { | 154 | for (ptr = data; *ptr; ptr = end + 1, token = ptr) { |
@@ -195,6 +197,7 @@ static ssize_t fault_opcodes_write(struct file *file, const char __user *buf, | |||
195 | ret = len; | 197 | ret = len; |
196 | 198 | ||
197 | debugfs_file_put(file->f_path.dentry); | 199 | debugfs_file_put(file->f_path.dentry); |
200 | free_data: | ||
198 | kfree(data); | 201 | kfree(data); |
199 | return ret; | 202 | return ret; |
200 | } | 203 | } |
@@ -214,7 +217,7 @@ static ssize_t fault_opcodes_read(struct file *file, char __user *buf, | |||
214 | return -ENOMEM; | 217 | return -ENOMEM; |
215 | ret = debugfs_file_get(file->f_path.dentry); | 218 | ret = debugfs_file_get(file->f_path.dentry); |
216 | if (unlikely(ret)) | 219 | if (unlikely(ret)) |
217 | return ret; | 220 | goto free_data; |
218 | bit = find_first_bit(fault->opcodes, bitsize); | 221 | bit = find_first_bit(fault->opcodes, bitsize); |
219 | while (bit < bitsize) { | 222 | while (bit < bitsize) { |
220 | zero = find_next_zero_bit(fault->opcodes, bitsize, bit); | 223 | zero = find_next_zero_bit(fault->opcodes, bitsize, bit); |
@@ -232,6 +235,7 @@ static ssize_t fault_opcodes_read(struct file *file, char __user *buf, | |||
232 | data[size - 1] = '\n'; | 235 | data[size - 1] = '\n'; |
233 | data[size] = '\0'; | 236 | data[size] = '\0'; |
234 | ret = simple_read_from_buffer(buf, len, pos, data, size); | 237 | ret = simple_read_from_buffer(buf, len, pos, data, size); |
238 | free_data: | ||
235 | kfree(data); | 239 | kfree(data); |
236 | return ret; | 240 | return ret; |
237 | } | 241 | } |