diff options
| -rw-r--r-- | drivers/target/target_core_file.c | 117 | ||||
| -rw-r--r-- | drivers/target/target_core_file.h | 4 | ||||
| -rw-r--r-- | drivers/target/target_core_iblock.c | 142 | ||||
| -rw-r--r-- | drivers/target/target_core_iblock.h | 1 | ||||
| -rw-r--r-- | drivers/target/target_core_pscsi.c | 172 | ||||
| -rw-r--r-- | drivers/target/target_core_pscsi.h | 1 | ||||
| -rw-r--r-- | drivers/target/target_core_rd.c | 40 | ||||
| -rw-r--r-- | drivers/target/target_core_tmr.c | 8 | ||||
| -rw-r--r-- | drivers/target/target_core_transport.c | 127 | ||||
| -rw-r--r-- | include/target/target_core_backend.h | 11 | ||||
| -rw-r--r-- | include/target/target_core_base.h | 11 |
11 files changed, 211 insertions, 423 deletions
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index a984964ab70a..bbcedcfc068a 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c | |||
| @@ -244,53 +244,33 @@ static void fd_free_device(void *p) | |||
| 244 | kfree(fd_dev); | 244 | kfree(fd_dev); |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | static inline struct fd_request *FILE_REQ(struct se_task *task) | 247 | static int fd_do_readv(struct se_cmd *cmd, struct scatterlist *sgl, |
| 248 | u32 sgl_nents) | ||
| 248 | { | 249 | { |
| 249 | return container_of(task, struct fd_request, fd_task); | 250 | struct se_device *se_dev = cmd->se_dev; |
| 250 | } | ||
| 251 | |||
| 252 | |||
| 253 | static struct se_task * | ||
| 254 | fd_alloc_task(unsigned char *cdb) | ||
| 255 | { | ||
| 256 | struct fd_request *fd_req; | ||
| 257 | |||
| 258 | fd_req = kzalloc(sizeof(struct fd_request), GFP_KERNEL); | ||
| 259 | if (!fd_req) { | ||
| 260 | pr_err("Unable to allocate struct fd_request\n"); | ||
| 261 | return NULL; | ||
| 262 | } | ||
| 263 | |||
| 264 | return &fd_req->fd_task; | ||
| 265 | } | ||
| 266 | |||
| 267 | static int fd_do_readv(struct se_task *task) | ||
| 268 | { | ||
| 269 | struct fd_request *req = FILE_REQ(task); | ||
| 270 | struct se_device *se_dev = req->fd_task.task_se_cmd->se_dev; | ||
| 271 | struct fd_dev *dev = se_dev->dev_ptr; | 251 | struct fd_dev *dev = se_dev->dev_ptr; |
| 272 | struct file *fd = dev->fd_file; | 252 | struct file *fd = dev->fd_file; |
| 273 | struct scatterlist *sg = task->task_sg; | 253 | struct scatterlist *sg; |
| 274 | struct iovec *iov; | 254 | struct iovec *iov; |
| 275 | mm_segment_t old_fs; | 255 | mm_segment_t old_fs; |
| 276 | loff_t pos = (task->task_se_cmd->t_task_lba * | 256 | loff_t pos = (cmd->t_task_lba * |
| 277 | se_dev->se_sub_dev->se_dev_attrib.block_size); | 257 | se_dev->se_sub_dev->se_dev_attrib.block_size); |
| 278 | int ret = 0, i; | 258 | int ret = 0, i; |
| 279 | 259 | ||
| 280 | iov = kzalloc(sizeof(struct iovec) * task->task_sg_nents, GFP_KERNEL); | 260 | iov = kzalloc(sizeof(struct iovec) * sgl_nents, GFP_KERNEL); |
| 281 | if (!iov) { | 261 | if (!iov) { |
| 282 | pr_err("Unable to allocate fd_do_readv iov[]\n"); | 262 | pr_err("Unable to allocate fd_do_readv iov[]\n"); |
| 283 | return -ENOMEM; | 263 | return -ENOMEM; |
| 284 | } | 264 | } |
| 285 | 265 | ||
| 286 | for_each_sg(task->task_sg, sg, task->task_sg_nents, i) { | 266 | for_each_sg(sgl, sg, sgl_nents, i) { |
| 287 | iov[i].iov_len = sg->length; | 267 | iov[i].iov_len = sg->length; |
| 288 | iov[i].iov_base = sg_virt(sg); | 268 | iov[i].iov_base = sg_virt(sg); |
| 289 | } | 269 | } |
| 290 | 270 | ||
| 291 | old_fs = get_fs(); | 271 | old_fs = get_fs(); |
| 292 | set_fs(get_ds()); | 272 | set_fs(get_ds()); |
| 293 | ret = vfs_readv(fd, &iov[0], task->task_sg_nents, &pos); | 273 | ret = vfs_readv(fd, &iov[0], sgl_nents, &pos); |
| 294 | set_fs(old_fs); | 274 | set_fs(old_fs); |
| 295 | 275 | ||
| 296 | kfree(iov); | 276 | kfree(iov); |
| @@ -300,10 +280,10 @@ static int fd_do_readv(struct se_task *task) | |||
| 300 | * block_device. | 280 | * block_device. |
| 301 | */ | 281 | */ |
| 302 | if (S_ISBLK(fd->f_dentry->d_inode->i_mode)) { | 282 | if (S_ISBLK(fd->f_dentry->d_inode->i_mode)) { |
| 303 | if (ret < 0 || ret != task->task_se_cmd->data_length) { | 283 | if (ret < 0 || ret != cmd->data_length) { |
| 304 | pr_err("vfs_readv() returned %d," | 284 | pr_err("vfs_readv() returned %d," |
| 305 | " expecting %d for S_ISBLK\n", ret, | 285 | " expecting %d for S_ISBLK\n", ret, |
| 306 | (int)task->task_se_cmd->data_length); | 286 | (int)cmd->data_length); |
| 307 | return (ret < 0 ? ret : -EINVAL); | 287 | return (ret < 0 ? ret : -EINVAL); |
| 308 | } | 288 | } |
| 309 | } else { | 289 | } else { |
| @@ -317,38 +297,38 @@ static int fd_do_readv(struct se_task *task) | |||
| 317 | return 1; | 297 | return 1; |
| 318 | } | 298 | } |
| 319 | 299 | ||
| 320 | static int fd_do_writev(struct se_task *task) | 300 | static int fd_do_writev(struct se_cmd *cmd, struct scatterlist *sgl, |
| 301 | u32 sgl_nents) | ||
| 321 | { | 302 | { |
| 322 | struct fd_request *req = FILE_REQ(task); | 303 | struct se_device *se_dev = cmd->se_dev; |
| 323 | struct se_device *se_dev = req->fd_task.task_se_cmd->se_dev; | ||
| 324 | struct fd_dev *dev = se_dev->dev_ptr; | 304 | struct fd_dev *dev = se_dev->dev_ptr; |
| 325 | struct file *fd = dev->fd_file; | 305 | struct file *fd = dev->fd_file; |
| 326 | struct scatterlist *sg = task->task_sg; | 306 | struct scatterlist *sg; |
| 327 | struct iovec *iov; | 307 | struct iovec *iov; |
| 328 | mm_segment_t old_fs; | 308 | mm_segment_t old_fs; |
| 329 | loff_t pos = (task->task_se_cmd->t_task_lba * | 309 | loff_t pos = (cmd->t_task_lba * |
| 330 | se_dev->se_sub_dev->se_dev_attrib.block_size); | 310 | se_dev->se_sub_dev->se_dev_attrib.block_size); |
| 331 | int ret, i = 0; | 311 | int ret, i = 0; |
| 332 | 312 | ||
| 333 | iov = kzalloc(sizeof(struct iovec) * task->task_sg_nents, GFP_KERNEL); | 313 | iov = kzalloc(sizeof(struct iovec) * sgl_nents, GFP_KERNEL); |
| 334 | if (!iov) { | 314 | if (!iov) { |
| 335 | pr_err("Unable to allocate fd_do_writev iov[]\n"); | 315 | pr_err("Unable to allocate fd_do_writev iov[]\n"); |
| 336 | return -ENOMEM; | 316 | return -ENOMEM; |
| 337 | } | 317 | } |
| 338 | 318 | ||
| 339 | for_each_sg(task->task_sg, sg, task->task_sg_nents, i) { | 319 | for_each_sg(sgl, sg, sgl_nents, i) { |
| 340 | iov[i].iov_len = sg->length; | 320 | iov[i].iov_len = sg->length; |
| 341 | iov[i].iov_base = sg_virt(sg); | 321 | iov[i].iov_base = sg_virt(sg); |
| 342 | } | 322 | } |
| 343 | 323 | ||
| 344 | old_fs = get_fs(); | 324 | old_fs = get_fs(); |
| 345 | set_fs(get_ds()); | 325 | set_fs(get_ds()); |
| 346 | ret = vfs_writev(fd, &iov[0], task->task_sg_nents, &pos); | 326 | ret = vfs_writev(fd, &iov[0], sgl_nents, &pos); |
| 347 | set_fs(old_fs); | 327 | set_fs(old_fs); |
| 348 | 328 | ||
| 349 | kfree(iov); | 329 | kfree(iov); |
| 350 | 330 | ||
| 351 | if (ret < 0 || ret != task->task_se_cmd->data_length) { | 331 | if (ret < 0 || ret != cmd->data_length) { |
| 352 | pr_err("vfs_writev() returned %d\n", ret); | 332 | pr_err("vfs_writev() returned %d\n", ret); |
| 353 | return (ret < 0 ? ret : -EINVAL); | 333 | return (ret < 0 ? ret : -EINVAL); |
| 354 | } | 334 | } |
| @@ -369,7 +349,7 @@ static void fd_emulate_sync_cache(struct se_cmd *cmd) | |||
| 369 | * for this SYNCHRONIZE_CACHE op | 349 | * for this SYNCHRONIZE_CACHE op |
| 370 | */ | 350 | */ |
| 371 | if (immed) | 351 | if (immed) |
| 372 | transport_complete_sync_cache(cmd, 1); | 352 | target_complete_cmd(cmd, SAM_STAT_GOOD); |
| 373 | 353 | ||
| 374 | /* | 354 | /* |
| 375 | * Determine if we will be flushing the entire device. | 355 | * Determine if we will be flushing the entire device. |
| @@ -389,35 +369,37 @@ static void fd_emulate_sync_cache(struct se_cmd *cmd) | |||
| 389 | if (ret != 0) | 369 | if (ret != 0) |
| 390 | pr_err("FILEIO: vfs_fsync_range() failed: %d\n", ret); | 370 | pr_err("FILEIO: vfs_fsync_range() failed: %d\n", ret); |
| 391 | 371 | ||
| 392 | if (!immed) | 372 | if (immed) |
| 393 | transport_complete_sync_cache(cmd, ret == 0); | 373 | return; |
| 374 | |||
| 375 | if (ret) { | ||
| 376 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
| 377 | target_complete_cmd(cmd, SAM_STAT_CHECK_CONDITION); | ||
| 378 | } else { | ||
| 379 | target_complete_cmd(cmd, SAM_STAT_GOOD); | ||
