Similar to ->get_firmware_status() introduce ->{get,set}_xfer() and
->{get,set}_offset() so that the iteration core can consult/update the
command data in place.Link: https://github.com/pmem/ndctl/issues/131 Signed-off-by: Dan Williams <[email protected]> --- ndctl/lib/libndctl.c | 60 ++++++++++++++++++++++++++++++++++++++++---------- ndctl/lib/private.h | 6 +++-- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c index 97fd98545440..a996bff66fb2 100644 --- a/ndctl/lib/libndctl.c +++ b/ndctl/lib/libndctl.c @@ -2523,6 +2523,36 @@ static u32 cmd_get_firmware_status(struct ndctl_cmd *cmd) return -1U; } +static void cmd_set_xfer(struct ndctl_cmd *cmd, u32 xfer) +{ + if (cmd->type == ND_CMD_GET_CONFIG_DATA) + cmd->get_data->in_length = xfer; + else + cmd->set_data->in_length = xfer; +} + +static u32 cmd_get_xfer(struct ndctl_cmd *cmd) +{ + if (cmd->type == ND_CMD_GET_CONFIG_DATA) + return cmd->get_data->in_length; + return cmd->set_data->in_length; +} + +static void cmd_set_offset(struct ndctl_cmd *cmd, u32 offset) +{ + if (cmd->type == ND_CMD_GET_CONFIG_DATA) + cmd->get_data->in_offset = offset; + else + cmd->set_data->in_offset = offset; +} + +static u32 cmd_get_offset(struct ndctl_cmd *cmd) +{ + if (cmd->type == ND_CMD_GET_CONFIG_DATA) + return cmd->get_data->in_offset; + return cmd->set_data->in_offset; +} + NDCTL_EXPORT struct ndctl_cmd *ndctl_dimm_cmd_new_vendor_specific( struct ndctl_dimm *dimm, unsigned int opcode, size_t input_size, size_t output_size) @@ -2659,9 +2689,11 @@ NDCTL_EXPORT struct ndctl_cmd *ndctl_dimm_cmd_new_cfg_read(struct ndctl_cmd *cfg cmd->get_data->in_offset = 0; cmd->get_data->in_length = cfg_size->get_size->max_xfer; cmd->get_firmware_status = cmd_get_firmware_status; + cmd->get_xfer = cmd_get_xfer; + cmd->set_xfer = cmd_set_xfer; + cmd->get_offset = cmd_get_offset; + cmd->set_offset = cmd_set_offset; cmd->iter.init_offset = 0; - cmd->iter.offset = &cmd->get_data->in_offset; - cmd->iter.xfer = &cmd->get_data->in_length; cmd->iter.max_xfer = cfg_size->get_size->max_xfer; cmd->iter.data = cmd->get_data->out_buf; cmd->iter.total_xfer = cfg_size->get_size->config_size; @@ -2680,9 +2712,11 @@ NDCTL_EXPORT struct ndctl_cmd *ndctl_dimm_cmd_new_cfg_read(struct ndctl_cmd *cfg static void iter_set_extent(struct ndctl_cmd_iter *iter, unsigned int len, unsigned int offset) { + struct ndctl_cmd *cmd = container_of(iter, typeof(*cmd), iter); + iter->init_offset = offset; - *iter->offset = offset; - *iter->xfer = min(iter->max_xfer, len); + cmd->set_offset(cmd, offset); + cmd->set_xfer(cmd, min(cmd->get_xfer(cmd), len)); iter->total_xfer = len; } @@ -2746,9 +2780,11 @@ NDCTL_EXPORT struct ndctl_cmd *ndctl_dimm_cmd_new_cfg_write(struct ndctl_cmd *cf cmd->set_data->in_offset = cfg_read->iter.init_offset; cmd->set_data->in_length = cfg_read->iter.max_xfer; cmd->get_firmware_status = cmd_get_firmware_status; + cmd->get_xfer = cmd_get_xfer; + cmd->set_xfer = cmd_set_xfer; + cmd->get_offset = cmd_get_offset; + cmd->set_offset = cmd_set_offset; cmd->iter.init_offset = cfg_read->iter.init_offset; - cmd->iter.offset = &cmd->set_data->in_offset; - cmd->iter.xfer = &cmd->set_data->in_length; cmd->iter.max_xfer = cfg_read->iter.max_xfer; cmd->iter.data = cmd->set_data->in_buf; cmd->iter.total_xfer = cfg_read->iter.total_xfer; @@ -2961,12 +2997,12 @@ static int do_cmd(int fd, int ioctl_cmd, struct ndctl_cmd *cmd) } for (offset = 0; offset < iter->total_xfer; offset += iter->max_xfer) { - *(cmd->iter.xfer) = min(iter->total_xfer - offset, - iter->max_xfer); - *(cmd->iter.offset) = offset; + cmd->set_xfer(cmd, min(iter->total_xfer - offset, + iter->max_xfer)); + cmd->set_offset(cmd, offset); if (iter->dir == WRITE) memcpy(iter->data, iter->total_buf + offset, - *(cmd->iter.xfer)); + cmd->get_xfer(cmd)); rc = ioctl(fd, ioctl_cmd, cmd->cmd_buf); if (rc < 0) { rc = -errno; @@ -2975,9 +3011,9 @@ static int do_cmd(int fd, int ioctl_cmd, struct ndctl_cmd *cmd) if (iter->dir == READ) memcpy(iter->total_buf + offset, iter->data, - *(cmd->iter.xfer) - rc); + cmd->get_xfer(cmd) - rc); if (cmd->get_firmware_status(cmd) || rc) { - rc = offset + *(cmd->iter.xfer) - rc; + rc = offset + cmd->get_xfer(cmd) - rc; break; } } diff --git a/ndctl/lib/private.h b/ndctl/lib/private.h index 3c121bd00437..2e537f0a8649 100644 --- a/ndctl/lib/private.h +++ b/ndctl/lib/private.h @@ -252,10 +252,12 @@ struct ndctl_cmd { int size; int status; u32 (*get_firmware_status)(struct ndctl_cmd *cmd); + u32 (*get_xfer)(struct ndctl_cmd *cmd); + u32 (*get_offset)(struct ndctl_cmd *cmd); + void (*set_xfer)(struct ndctl_cmd *cmd, u32 xfer); + void (*set_offset)(struct ndctl_cmd *cmd, u32 offset); struct ndctl_cmd_iter { u32 init_offset; - u32 *offset; - u32 *xfer; /* pointer to xfer length in cmd */ u8 *data; /* pointer to the data buffer location in cmd */ u32 max_xfer; char *total_buf; _______________________________________________ Linux-nvdimm mailing list -- [email protected] To unsubscribe send an email to [email protected]
