On Tue, Jun 30, 2026 at 12:28 AM Damien Le Moal <[email protected]> wrote:
>
> 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.
This patch moves it, no?
>
> > - 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