On Wed, 2017-06-07 at 14:43 -0700, Himanshu Madhani wrote:
> +enum {
> +     TYPE_SRB,
> +     TYPE_TGT_CMD,
> +};
> +
>  typedef struct srb {
> +     /*
> +      * Do not move cmd_type field, it needs to
> +      * line up with qla_tgt_cmd->cmd_type
> +      */
> +     uint8_t cmd_type;
> +     uint8_t pad[3];
>       atomic_t ref_count;
>       struct fc_port *fcport;
>       struct scsi_qla_host *vha;

[ ... ]
 
>  struct qla_tgt_cmd {
> +     /*
> +      * Do not move cmd_type field. it needs to line up with srb->cmd_type
> +      */
> +     uint8_t cmd_type;
> +     uint8_t pad[7];
>       struct se_cmd se_cmd;
>       struct fc_port *sess;
>       int state;

Hello Quinn and Himanshu,

Sorry but this is really inelegant. Have you considered the following?
- Keep the existing srb and qla_tgt_cmd data structures.
- Introduce a new data structure with enum cmd_type as the first member and
  a union of struct srb and struct qla_tgt_cmd as the second member.
- Use __attribute__((aligned(...))) to express alignment requirements instead
  of explicitly inserting padding bytes.

With that approach no casts are needed to convert a pointer to the new data
structure into a struct srb or struct qla_tgt_cmd pointer - all that will be
needed is to take the address of the appropriate member of the union.

Thanks,

Bart.

Reply via email to