On 6/30/26 10:21, Rosen Penev wrote:
> Signed-off-by: Rosen Penev <[email protected]>

No commit message ? Please explain your reasonning, because I find this patch
incorrect. See below.

> ---
>  drivers/scsi/st.c | 12 +++---------
>  drivers/scsi/st.h |  3 ++-
>  2 files changed, 5 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
> index f1c3c4946637..31ae189b18e7 100644
> --- a/drivers/scsi/st.c
> +++ b/drivers/scsi/st.c
> @@ -149,7 +149,7 @@ static struct st_dev_parm {
>     mode counts */
>  static const char *st_formats[] = {
>       "",  "r", "k", "s", "l", "t", "o", "u",
> -     "m", "v", "p", "x", "a", "y", "q", "z"}; 
> +     "m", "v", "p", "x", "a", "y", "q", "z"};
>  
>  /* The default definitions have been moved to st_options.h */
>  
> @@ -3973,21 +3973,15 @@ static struct st_buffer *new_tape_buffer(int max_sg)
>  {
>       struct st_buffer *tb;
>  
> -     tb = kzalloc_obj(struct st_buffer);
> +     tb = kzalloc_flex(*tb, reserved_pages, max_sg);
>       if (!tb) {
>               printk(KERN_NOTICE "st: Can't allocate new tape buffer.\n");
>               return NULL;
>       }
> -     tb->frp_segs = 0;
>       tb->use_sg = max_sg;
> +     tb->frp_segs = 0;
>       tb->buffer_size = 0;
>  
> -     tb->reserved_pages = kzalloc_objs(struct page *, max_sg);

reserve_pages is in the middle of struct st_buffer so you cannot use a flex 
array.

> -     if (!tb->reserved_pages) {
> -             kfree(tb);
> -             return NULL;
> -     }
> -
>       return tb;
>  }
>  
> diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h
> index 0d7c4b8c2c8a..759f4c43d563 100644
> --- a/drivers/scsi/st.h
> +++ b/drivers/scsi/st.h
> @@ -45,7 +45,6 @@ struct st_buffer {
>       int syscall_result;
>       struct st_request *last_SRpnt;
>       struct st_cmdstatus cmdstat;
> -     struct page **reserved_pages;
>       int reserved_page_order;
>       struct page **mapped_pages;
>       struct rq_map_data map_data;
> @@ -53,6 +52,8 @@ struct st_buffer {
>       unsigned short use_sg;  /* zero or max number of s/g segments for this 
> adapter */
>       unsigned short sg_segs;         /* number of segments in s/g list */
>       unsigned short frp_segs;        /* number of buffer segments */
> +
> +     struct page *reserved_pages[] __counted_by(use_sg);
>  };
>  
>  /* The tape mode definition */


-- 
Damien Le Moal
Western Digital Research

Reply via email to