Patch "mtd: spi-nor: avoid holes in struct spi_mem_op" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mtd: spi-nor: avoid holes in struct spi_mem_op

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mtd-spi-nor-avoid-holes-in-struct-spi_mem_op.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 0e6e961976d2c2516440107f215e2839b8d3ac3e
Author: Arnd Bergmann <arnd@xxxxxxxx>
Date:   Wed Jul 19 21:00:25 2023 +0200

    mtd: spi-nor: avoid holes in struct spi_mem_op
    
    [ Upstream commit 71c8f9cf2623d0db79665f876b95afcdd8214aec ]
    
    gcc gets confused when -ftrivial-auto-var-init=pattern is used on sparse
    bit fields such as 'struct spi_mem_op', which caused the previous false
    positive warning about an uninitialized variable:
    
    drivers/mtd/spi-nor/spansion.c: error: 'op' is used uninitialized [-Werror=uninitialized]
    
    In fact, the variable is fully initialized and gcc does not see it being
    used, so the warning is entirely bogus. The problem appears to be
    a misoptimization in the initialization of single bit fields when the
    rest of the bytes are not initialized.
    
    A previous workaround added another initialization, which ended up
    shutting up the warning in spansion.c, though it apparently still happens
    in other files as reported by Peter Foley in the gcc bugzilla. The
    workaround of adding a fake initialization seems particularly bad
    because it would set values that can never be correct but prevent the
    compiler from warning about actually missing initializations.
    
    Revert the broken workaround and instead pad the structure to only
    have bitfields that add up to full bytes, which should avoid this
    behavior in all drivers.
    
    I also filed a new bug against gcc with what I found, so this can
    hopefully be addressed in future gcc releases. At the moment, only
    gcc-12 and gcc-13 are affected.
    
    Cc: Peter Foley <pefoley2@xxxxxxxxxxx>
    Cc: Pedro Falcato <pedro.falcato@xxxxxxxxx>
    Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110743
    Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108402
    Link: https://godbolt.org/z/efMMsG1Kx
    Fixes: 420c4495b5e56 ("mtd: spi-nor: spansion: make sure local struct does not contain garbage")
    Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
    Acked-by: Mark Brown <broonie@xxxxxxxxxx>
    Acked-by: Tudor Ambarus <tudor.ambarus@xxxxxxxxxx>
    Signed-off-by: Miquel Raynal <miquel.raynal@xxxxxxxxxxx>
    Link: https://lore.kernel.org/linux-mtd/20230719190045.4007391-1-arnd@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/mtd/spi-nor/spansion.c b/drivers/mtd/spi-nor/spansion.c
index 36876aa849ede..15f9a80c10b9b 100644
--- a/drivers/mtd/spi-nor/spansion.c
+++ b/drivers/mtd/spi-nor/spansion.c
@@ -361,7 +361,7 @@ static int cypress_nor_determine_addr_mode_by_sr1(struct spi_nor *nor,
  */
 static int cypress_nor_set_addr_mode_nbytes(struct spi_nor *nor)
 {
-	struct spi_mem_op op = {};
+	struct spi_mem_op op;
 	u8 addr_mode;
 	int ret;
 
@@ -492,7 +492,7 @@ s25fs256t_post_bfpt_fixup(struct spi_nor *nor,
 			  const struct sfdp_parameter_header *bfpt_header,
 			  const struct sfdp_bfpt *bfpt)
 {
-	struct spi_mem_op op = {};
+	struct spi_mem_op op;
 	int ret;
 
 	ret = cypress_nor_set_addr_mode_nbytes(nor);
diff --git a/include/linux/spi/spi-mem.h b/include/linux/spi/spi-mem.h
index 8e984d75f5b6c..6b0a7dc48a4b7 100644
--- a/include/linux/spi/spi-mem.h
+++ b/include/linux/spi/spi-mem.h
@@ -101,6 +101,7 @@ struct spi_mem_op {
 		u8 nbytes;
 		u8 buswidth;
 		u8 dtr : 1;
+		u8 __pad : 7;
 		u16 opcode;
 	} cmd;
 
@@ -108,6 +109,7 @@ struct spi_mem_op {
 		u8 nbytes;
 		u8 buswidth;
 		u8 dtr : 1;
+		u8 __pad : 7;
 		u64 val;
 	} addr;
 
@@ -115,12 +117,14 @@ struct spi_mem_op {
 		u8 nbytes;
 		u8 buswidth;
 		u8 dtr : 1;
+		u8 __pad : 7;
 	} dummy;
 
 	struct {
 		u8 buswidth;
 		u8 dtr : 1;
 		u8 ecc : 1;
+		u8 __pad : 6;
 		enum spi_mem_data_dir dir;
 		unsigned int nbytes;
 		union {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux