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; |