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.