diff options
| -rw-r--r-- | drivers/target/sbp/sbp_target.c | 8 | ||||
| -rw-r--r-- | drivers/target/target_core_file.c | 70 | ||||
| -rw-r--r-- | drivers/target/target_core_file.h | 1 |
3 files changed, 21 insertions, 58 deletions
diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c index 37c609898f84..7e6136e2ce81 100644 --- a/drivers/target/sbp/sbp_target.c +++ b/drivers/target/sbp/sbp_target.c | |||
| @@ -587,14 +587,14 @@ static void sbp_management_request_logout( | |||
| 587 | { | 587 | { |
| 588 | struct sbp_tport *tport = agent->tport; | 588 | struct sbp_tport *tport = agent->tport; |
| 589 | struct sbp_tpg *tpg = tport->tpg; | 589 | struct sbp_tpg *tpg = tport->tpg; |
| 590 | int login_id; | 590 | int id; |
| 591 | struct sbp_login_descriptor *login; | 591 | struct sbp_login_descriptor *login; |
| 592 | 592 | ||
| 593 | login_id = LOGOUT_ORB_LOGIN_ID(be32_to_cpu(req->orb.misc)); | 593 | id = LOGOUT_ORB_LOGIN_ID(be32_to_cpu(req->orb.misc)); |
| 594 | 594 | ||
| 595 | login = sbp_login_find_by_id(tpg, login_id); | 595 | login = sbp_login_find_by_id(tpg, id); |
| 596 | if (!login) { | 596 | if (!login) { |
| 597 | pr_warn("cannot find login: %d\n", login_id); | 597 | pr_warn("cannot find login: %d\n", id); |
| 598 | 598 | ||
| 599 | req->status.status = cpu_to_be32( | 599 | req->status.status = cpu_to_be32( |
| 600 | STATUS_BLOCK_RESP(STATUS_RESP_REQUEST_COMPLETE) | | 600 | STATUS_BLOCK_RESP(STATUS_RESP_REQUEST_COMPLETE) | |
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 686dba189f8e..9f99d0404908 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c | |||
| @@ -133,16 +133,11 @@ static struct se_device *fd_create_virtdevice( | |||
| 133 | ret = PTR_ERR(dev_p); | 133 | ret = PTR_ERR(dev_p); |
| 134 | goto fail; | 134 | goto fail; |
| 135 | } | 135 | } |
| 136 | |||
| 137 | /* O_DIRECT too? */ | ||
| 138 | flags = O_RDWR | O_CREAT | O_LARGEFILE; | ||
| 139 | |||
| 140 | /* | 136 | /* |
| 141 | * If fd_buffered_io=1 has not been set explicitly (the default), | 137 | * Use O_DSYNC by default instead of O_SYNC to forgo syncing |
| 142 | * use O_SYNC to force FILEIO writes to disk. | 138 | * of pure timestamp updates. |
| 143 | */ | 139 | */ |
| 144 | if (!(fd_dev->fbd_flags & FDBD_USE_BUFFERED_IO)) | 140 | flags = O_RDWR | O_CREAT | O_LARGEFILE | O_DSYNC; |
| 145 | flags |= O_SYNC; | ||
| 146 | 141 | ||
| 147 | file = filp_open(dev_p, flags, 0600); | 142 | file = filp_open(dev_p, flags, 0600); |
| 148 | if (IS_ERR(file)) { | 143 | if (IS_ERR(file)) { |
| @@ -380,23 +375,6 @@ static void fd_emulate_sync_cache(struct se_cmd *cmd) | |||
| 380 | } | 375 | } |
| 381 | } | 376 | } |
| 382 | 377 | ||
| 383 | static void fd_emulate_write_fua(struct se_cmd *cmd) | ||
| 384 | { | ||
| 385 | struct se_device *dev = cmd->se_dev; | ||
| 386 | struct fd_dev *fd_dev = dev->dev_ptr; | ||
| 387 | loff_t start = cmd->t_task_lba * | ||
| 388 | dev->se_sub_dev->se_dev_attrib.block_size; | ||
| 389 | loff_t end = start + cmd->data_length; | ||
| 390 | int ret; | ||
| 391 | |||
| 392 | pr_debug("FILEIO: FUA WRITE LBA: %llu, bytes: %u\n", | ||
| 393 | cmd->t_task_lba, cmd->data_length); | ||
| 394 | |||
| 395 | ret = vfs_fsync_range(fd_dev->fd_file, start, end, 1); | ||
| 396 | if (ret != 0) | ||
| 397 | pr_err("FILEIO: vfs_fsync_range() failed: %d\n", ret); | ||
| 398 | } | ||
| 399 | |||
| 400 | static int fd_execute_cmd(struct se_cmd *cmd, struct scatterlist *sgl, | 378 | static int fd_execute_cmd(struct se_cmd *cmd, struct scatterlist *sgl, |
| 401 | u32 sgl_nents, enum dma_data_direction data_direction) | 379 | u32 sgl_nents, enum dma_data_direction data_direction) |
| 402 | { | 380 | { |
| @@ -411,19 +389,21 @@ static int fd_execute_cmd(struct se_cmd *cmd, struct scatterlist *sgl, | |||
| 411 | ret = fd_do_readv(cmd, sgl, sgl_nents); | 389 | ret = fd_do_readv(cmd, sgl, sgl_nents); |
| 412 | } else { | 390 | } else { |
| 413 | ret = fd_do_writev(cmd, sgl, sgl_nents); | 391 | ret = fd_do_writev(cmd, sgl, sgl_nents); |
| 414 | 392 | /* | |
| 393 | * Perform implict vfs_fsync_range() for fd_do_writev() ops | ||
| 394 | * for SCSI WRITEs with Forced Unit Access (FUA) set. | ||
| 395 | * Allow this to happen independent of WCE=0 setting. | ||
| 396 | */ | ||
| 415 | if (ret > 0 && | 397 | if (ret > 0 && |
| 416 | dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0 && | ||
| 417 | dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0 && | 398 | dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0 && |
| 418 | (cmd->se_cmd_flags & SCF_FUA)) { | 399 | (cmd->se_cmd_flags & SCF_FUA)) { |
| 419 | /* | 400 | struct fd_dev *fd_dev = dev->dev_ptr; |
| 420 | * We might need to be a bit smarter here | 401 | loff_t start = cmd->t_task_lba * |
| 421 | * and return some sense data to let the initiator | 402 | dev->se_sub_dev->se_dev_attrib.block_size; |
| 422 | * know the FUA WRITE cache sync failed..? | 403 | loff_t end = start + cmd->data_length; |
| 423 | */ | ||
| 424 | fd_emulate_write_fua(cmd); | ||
| 425 | } | ||
| 426 | 404 | ||
| 405 | vfs_fsync_range(fd_dev->fd_file, start, end, 1); | ||
| 406 | } | ||
| 427 | } | 407 | } |
| 428 | 408 | ||
| 429 | if (ret < 0) { | 409 | if (ret < 0) { |
| @@ -442,7 +422,6 @@ enum { | |||
| 442 | static match_table_t tokens = { | 422 | static match_table_t tokens = { |
| 443 | {Opt_fd_dev_name, "fd_dev_name=%s"}, | 423 | {Opt_fd_dev_name, "fd_dev_name=%s"}, |
| 444 | {Opt_fd_dev_size, "fd_dev_size=%s"}, | 424 | {Opt_fd_dev_size, "fd_dev_size=%s"}, |
| 445 | {Opt_fd_buffered_io, "fd_buffered_io=%d"}, | ||
| 446 | {Opt_err, NULL} | 425 | {Opt_err, NULL} |
| 447 | }; | 426 | }; |
| 448 | 427 | ||
| @@ -454,7 +433,7 @@ static ssize_t fd_set_configfs_dev_params( | |||
| 454 | struct fd_dev *fd_dev = se_dev->se_dev_su_ptr; | 433 | struct fd_dev *fd_dev = se_dev->se_dev_su_ptr; |
| 455 | char *orig, *ptr, *arg_p, *opts; | 434 | char *orig, *ptr, *arg_p, *opts; |
| 456 | substring_t args[MAX_OPT_ARGS]; | 435 | substring_t args[MAX_OPT_ARGS]; |
| 457 | int ret = 0, arg, token; | 436 | int ret = 0, token; |
| 458 | 437 | ||
| 459 | opts = kstrdup(page, GFP_KERNEL); | 438 | opts = kstrdup(page, GFP_KERNEL); |
| 460 | if (!opts) | 439 | if (!opts) |
| @@ -498,19 +477,6 @@ static ssize_t fd_set_configfs_dev_params( | |||
| 498 | " bytes\n", fd_dev->fd_dev_size); | 477 | " bytes\n", fd_dev->fd_dev_size); |
| 499 | fd_dev->fbd_flags |= FBDF_HAS_SIZE; | 478 | fd_dev->fbd_flags |= FBDF_HAS_SIZE; |
| 500 | break; | 479 | break; |
| 501 | case Opt_fd_buffered_io: | ||
| 502 | match_int(args, &arg); | ||
| 503 | if (arg != 1) { | ||
| 504 | pr_err("bogus fd_buffered_io=%d value\n", arg); | ||
| 505 | ret = -EINVAL; | ||
| 506 | goto out; | ||
| 507 | } | ||
| 508 | |||
| 509 | pr_debug("FILEIO: Using buffered I/O" | ||
| 510 | " operations for struct fd_dev\n"); | ||
| 511 | |||
| 512 | fd_dev->fbd_flags |= FDBD_USE_BUFFERED_IO; | ||
| 513 | break; | ||
| 514 | default: | 480 | default: |
| 515 | break; | 481 | break; |
| 516 | } | 482 | } |
| @@ -542,10 +508,8 @@ static ssize_t fd_show_configfs_dev_params( | |||
| 542 | ssize_t bl = 0; | 508 | ssize_t bl = 0; |
| 543 | 509 | ||
| 544 | bl = sprintf(b + bl, "TCM FILEIO ID: %u", fd_dev->fd_dev_id); | 510 | bl = sprintf(b + bl, "TCM FILEIO ID: %u", fd_dev->fd_dev_id); |
| 545 | bl += sprintf(b + bl, " File: %s Size: %llu Mode: %s\n", | 511 | bl += sprintf(b + bl, " File: %s Size: %llu Mode: O_DSYNC\n", |
| 546 | fd_dev->fd_dev_name, fd_dev->fd_dev_size, | 512 | fd_dev->fd_dev_name, fd_dev->fd_dev_size); |
| 547 | (fd_dev->fbd_flags & FDBD_USE_BUFFERED_IO) ? | ||
| 548 | "Buffered" : "Synchronous"); | ||
| 549 | return bl; | 513 | return bl; |
| 550 | } | 514 | } |
| 551 | 515 | ||
diff --git a/drivers/target/target_core_file.h b/drivers/target/target_core_file.h index fbd59ef7d8be..70ce7fd7111d 100644 --- a/drivers/target/target_core_file.h +++ b/drivers/target/target_core_file.h | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | 14 | ||
| 15 | #define FBDF_HAS_PATH 0x01 | 15 | #define FBDF_HAS_PATH 0x01 |
| 16 | #define FBDF_HAS_SIZE 0x02 | 16 | #define FBDF_HAS_SIZE 0x02 |
| 17 | #define FDBD_USE_BUFFERED_IO 0x04 | ||
| 18 | 17 | ||
| 19 | struct fd_dev { | 18 | struct fd_dev { |
| 20 | u32 fbd_flags; | 19 | u32 fbd_flags; |
