On 03/21/2017 04:36 AM, lixiubo@xxxxxxxxxxxxxxxxxxxx wrote: > From: Xiubo Li <lixiubo@xxxxxxxxxxxxxxxxxxxx> > > The t_data_nents and t_bidi_data_nents are the numbers of the > segments, but it couldn't be sure the block size equals to size > of the segment. > > For the worst case, all the blocks are discontiguous and there > will need the same number of iovecs, that's to say: blocks == iovs. > So here just set the number of iovs to block count needed by tcmu > cmd. > > Signed-off-by: Xiubo Li <lixiubo@xxxxxxxxxxxxxxxxxxxx> > --- > drivers/target/target_core_user.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c > index 65d475f..ae5b74f 100644 > --- a/drivers/target/target_core_user.c > +++ b/drivers/target/target_core_user.c > @@ -408,6 +408,13 @@ static inline size_t tcmu_cmd_get_data_length(struct tcmu_cmd *tcmu_cmd) > return data_length; > } > > +static inline uint32_t tcmu_cmd_get_block_cnt(struct tcmu_cmd *tcmu_cmd) > +{ > + size_t data_length = tcmu_cmd_get_data_length(tcmu_cmd); > + > + return (data_length + DATA_BLOCK_SIZE - 1) / DATA_BLOCK_SIZE; > +} Can you just do data_length / DATA_BLOCK_SIZE, because tcmu_cmd_get_data_length will return data_length as a multiple of DATA_BLOCK_SIZE.