diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-12-12 15:24:11 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-01-09 15:24:20 -0500 |
commit | 480da400c39d5c4398765623c7bb007a359a059f (patch) | |
tree | b16ab85fc460e740e23468e46fa247c5534fa114 | |
parent | 42ea20ee7fe958123981979da1c459160733dfdb (diff) |
target/file: Update hw_max_sectors based on current block_size
commit 95cadace8f3959282e76ebf8b382bd0930807d2c upstream.
This patch allows FILEIO to update hw_max_sectors based on the current
max_bytes_per_io. This is required because vfs_[writev,readv]() can accept
a maximum of 2048 iovecs per call, so the enforced hw_max_sectors really
needs to be calculated based on block_size.
This addresses a >= v3.5 bug where block_size=512 was rejecting > 1M
sized I/O requests, because FD_MAX_SECTORS was hardcoded to 2048 for
the block_size=4096 case.
(v2: Use max_bytes_per_io instead of ->update_hw_max_sectors)
Reported-by: Henrik Goldman <hg@x-formation.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/target/target_core_device.c | 5 | ||||
-rw-r--r-- | drivers/target/target_core_file.c | 8 | ||||
-rw-r--r-- | drivers/target/target_core_file.h | 5 | ||||
-rw-r--r-- | include/target/target_core_base.h | 1 |
4 files changed, 14 insertions, 5 deletions
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 4630481b6043..660b109487ae 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
@@ -1078,6 +1078,11 @@ int se_dev_set_block_size(struct se_device *dev, u32 block_size) | |||
1078 | dev->dev_attrib.block_size = block_size; | 1078 | dev->dev_attrib.block_size = block_size; |
1079 | pr_debug("dev[%p]: SE Device block_size changed to %u\n", | 1079 | pr_debug("dev[%p]: SE Device block_size changed to %u\n", |
1080 | dev, block_size); | 1080 | dev, block_size); |
1081 | |||
1082 | if (dev->dev_attrib.max_bytes_per_io) | ||
1083 | dev->dev_attrib.hw_max_sectors = | ||
1084 | dev->dev_attrib.max_bytes_per_io / block_size; | ||
1085 | |||
1081 | return 0; | 1086 | return 0; |
1082 | } | 1087 | } |
1083 | 1088 | ||
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index b11890d85120..3b2879316b87 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c | |||
@@ -66,9 +66,8 @@ static int fd_attach_hba(struct se_hba *hba, u32 host_id) | |||
66 | pr_debug("CORE_HBA[%d] - TCM FILEIO HBA Driver %s on Generic" | 66 | pr_debug("CORE_HBA[%d] - TCM FILEIO HBA Driver %s on Generic" |
67 | " Target Core Stack %s\n", hba->hba_id, FD_VERSION, | 67 | " Target Core Stack %s\n", hba->hba_id, FD_VERSION, |
68 | TARGET_CORE_MOD_VERSION); | 68 | TARGET_CORE_MOD_VERSION); |
69 | pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic" | 69 | pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic\n", |
70 | " MaxSectors: %u\n", | 70 | hba->hba_id, fd_host->fd_host_id); |
71 | hba->hba_id, fd_host->fd_host_id, FD_MAX_SECTORS); | ||
72 | 71 | ||
73 | return 0; | 72 | return 0; |
74 | } | 73 | } |
@@ -220,7 +219,8 @@ static int fd_configure_device(struct se_device *dev) | |||
220 | } | 219 | } |
221 | 220 | ||
222 | dev->dev_attrib.hw_block_size = fd_dev->fd_block_size; | 221 | dev->dev_attrib.hw_block_size = fd_dev->fd_block_size; |
223 | dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS; | 222 | dev->dev_attrib.max_bytes_per_io = FD_MAX_BYTES; |
223 | dev->dev_attrib.hw_max_sectors = FD_MAX_BYTES / fd_dev->fd_block_size; | ||
224 | dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH; | 224 | dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH; |
225 | 225 | ||
226 | if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) { | 226 | if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) { |
diff --git a/drivers/target/target_core_file.h b/drivers/target/target_core_file.h index 37ffc5bd2399..d7772c167685 100644 --- a/drivers/target/target_core_file.h +++ b/drivers/target/target_core_file.h | |||
@@ -7,7 +7,10 @@ | |||
7 | #define FD_DEVICE_QUEUE_DEPTH 32 | 7 | #define FD_DEVICE_QUEUE_DEPTH 32 |
8 | #define FD_MAX_DEVICE_QUEUE_DEPTH 128 | 8 | #define FD_MAX_DEVICE_QUEUE_DEPTH 128 |
9 | #define FD_BLOCKSIZE 512 | 9 | #define FD_BLOCKSIZE 512 |
10 | #define FD_MAX_SECTORS 2048 | 10 | /* |
11 | * Limited by the number of iovecs (2048) per vfs_[writev,readv] call | ||
12 | */ | ||
13 | #define FD_MAX_BYTES 8388608 | ||
11 | 14 | ||
12 | #define RRF_EMULATE_CDB 0x01 | 15 | #define RRF_EMULATE_CDB 0x01 |
13 | #define RRF_GOT_LBA 0x02 | 16 | #define RRF_GOT_LBA 0x02 |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 4ea4f985f394..7d99c0b5b789 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
@@ -614,6 +614,7 @@ struct se_dev_attrib { | |||
614 | u32 unmap_granularity; | 614 | u32 unmap_granularity; |
615 | u32 unmap_granularity_alignment; | 615 | u32 unmap_granularity_alignment; |
616 | u32 max_write_same_len; | 616 | u32 max_write_same_len; |
617 | u32 max_bytes_per_io; | ||
617 | struct se_device *da_dev; | 618 | struct se_device *da_dev; |
618 | struct config_group da_group; | 619 | struct config_group da_group; |
619 | }; | 620 | }; |