nvmem: properly handle returned value nvmem_reg_read
PATCH 1/1 nvmem: properly handle returned value nvmem_reg_read
Function nvmem_reg_read can return a non zero value indicating an error. This returned value must be read and error propagated to nvmem_cell_prepare_write_buffer. Silence the following gcc warning (W=1):
drivers/nvmem/core.c:1093:9: warning: variable ‘rc’ set but not used [-Wunused-but-set-variable]
--- drivers/nvmem/core.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/nvmem/core.c +7 -0
@@ -1107,6 +1107,8 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the first byte with lsb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset, &v,1 ); +if (rc) + goto err; *b++ |=GENMASK (bit_offset -1 ,0 ) & v;/* setup rest of the byte if any */
@@ -1125,11 +1127,16 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the last byte with msb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset + cell->bytes -1 , &v,1 ); +if (rc) + goto err; *p |=GENMASK (7 , (nbits + bit_offset) %BITS_PER_BYTE ) & v; }return buf; +err: +kfree (buf); +return NULL ; }/**
Signature · 1 line
2.11.0
Quoted 3 lines · Mathieu Malaterre
Function
nvmem_reg_readcan return a non zero value indicating an error. This returned value must be read and error propagated tonvmem_cell_prepare_write_buffer.
Must is to strong word here. How come it *must*?
Did you investigate the history of the changes that brought us to current code?
How had you tested your change?
While it looks subtle it is in one of the storage class devices core, which might be very sensible to changing workflow.
Quoted 3 lines
Silence the following gcc warning (W=1):
drivers/nvmem/core.c:1093:9: warning: variable ‘rc’ set but not used [-Wunused-but-set-variable]
This is least argument to accept this patch.
Quoted 39 lines
Signed-off-by Mathieu Malaterre <[email protected]>--- drivers/nvmem/core.c | 7 +++++++ 1 file changed, 7 insertions(+)drivers/nvmem/core.c +7
-1@@ -1107,6 +1107,8 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the first byte with lsb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset, &v,1 ); +if (rc) + goto err; *b++ |=GENMASK (bit_offset -1 ,0 ) & v;/* setup rest of the byte if any */ @@ -1125,11 +1127,16 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the last byte with msb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset + cell->bytes -1 , &v,1 ); +if (rc) + goto err; *p |=GENMASK (7 , (nbits + bit_offset) %BITS_PER_BYTE ) & v; }return buf; +err: +kfree (buf); +return NULL ; }/** -- 2.11.0
Signature · 2 lines
With Best Regards, Andy Shevchenko
Thanks for the patch,
Quoted 28 lines · Mathieu Malaterre
Function
nvmem_reg_readcan return a non zero value indicating an error. This returned value must be read and error propagated tonvmem_cell_prepare_write_buffer. Silence the following gcc warning (W=1):
drivers/nvmem/core.c:1093:9: warning: variable ‘rc’ set but not used [-Wunused-but-set-variable]Signed-off-by Mathieu Malaterre <[email protected]>--- drivers/nvmem/core.c | 7 +++++++ 1 file changed, 7 insertions(+)drivers/nvmem/core.c +2
-0@@ -1107,6 +1107,8 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the first byte with lsb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset, &v,1 ); +if (rc) + goto err; *b++ |=GENMASK (bit_offset -1 ,0 ) & v;/* setup rest of the byte if any */ @@ -1125,11 +1127,16 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the last byte with msb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset + cell->bytes -1 , &v,1 );
drivers/nvmem/core.c static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell, · line 1139
Quoted 10 lines
drivers/nvmem/core.c +5
-0+if (rc) + goto err; *p |=GENMASK (7 , (nbits + bit_offset) %BITS_PER_BYTE ) & v; }return buf; +err: +kfree (buf); +return NULL ;
You should return an error pointer here, not NULL.
thanks,
srini
Quoted 4 lines
drivers/nvmem/core.c +0
-0}/**
PATCH v2 1/1 nvmem: properly handle returned value nvmem_reg_read
In reply to Mathieu MalaterreFunction nvmem_reg_read can return a non zero value indicating an error. This returned value must be read and error propagated to nvmem_cell_prepare_write_buffer. Silence the following gcc warning (W=1):
drivers/nvmem/core.c:1093:9: warning: variable ‘rc’ set but not used [-Wunused-but-set-variable]
---
v2: prefer ERR_PTR(-EINVAL) over a simple return NULL
drivers/nvmem/core.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/nvmem/core.c +7 -0
@@ -1107,6 +1107,8 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the first byte with lsb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset, &v,1 ); +if (rc) + goto err; *b++ |=GENMASK (bit_offset -1 ,0 ) & v;/* setup rest of the byte if any */
@@ -1125,11 +1127,16 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the last byte with msb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset + cell->bytes -1 , &v,1 ); +if (rc) + goto err; *p |=GENMASK (7 , (nbits + bit_offset) %BITS_PER_BYTE ) & v; }return buf; +err: +kfree (buf); +return ERR_PTR (-EINVAL ); }/**
Signature · 1 line
2.11.0
Quoted 30 lines · Mathieu Malaterre
Function
nvmem_reg_readcan return a non zero value indicating an error. This returned value must be read and error propagated tonvmem_cell_prepare_write_buffer. Silence the following gcc warning (W=1):
drivers/nvmem/core.c:1093:9: warning: variable ‘rc’ set but not used [-Wunused-but-set-variable]Signed-off-by Mathieu Malaterre <[email protected]>---
v2: preferERR_PTR(-EINVAL)over a simple return NULLdrivers/nvmem/core.c | 7 +++++++ 1 file changed, 7 insertions(+)drivers/nvmem/core.c +2
-0@@ -1107,6 +1107,8 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the first byte with lsb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset, &v,1 ); +if (rc) + goto err; *b++ |=GENMASK (bit_offset -1 ,0 ) & v;/* setup rest of the byte if any */ @@ -1125,11 +1127,16 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the last byte with msb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset + cell->bytes -1 , &v,1 );
drivers/nvmem/core.c static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell, · line 1139
Quoted 10 lines
drivers/nvmem/core.c +5
-0+if (rc) + goto err; *p |=GENMASK (7 , (nbits + bit_offset) %BITS_PER_BYTE ) & v; }return buf; +err: +kfree (buf); +return ERR_PTR (-EINVAL );
You should return ERR_PTR(rc) not EINVAL here.
errors should always propagate to caller!
thanks,
srini
Quoted 4 lines
drivers/nvmem/core.c +0
-0}/**
Quoted 40 lines · Srinivas Kandagatla
Quoted 37 lines · Mathieu Malaterre
Function
nvmem_reg_readcan return a non zero value indicating an error. This returned value must be read and error propagated tonvmem_cell_prepare_write_buffer. Silence the following gcc warning (W=1):
drivers/nvmem/core.c:1093:9: warning: variable ‘rc’ set but not used
[-Wunused-but-set-variable]Signed-off-by Mathieu Malaterre <[email protected]>---
v2: preferERR_PTR(-EINVAL)over a simple return NULLdrivers/nvmem/core.c | 7 +++++++ 1 file changed, 7 insertions(+)drivers/nvmem/core.c +4
-0@@ -1107,6 +1107,8 @@ static void *nvmem_cell_prepare_write_buffer(structnvmem_cell *cell,/* setup the first byte with lsb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset, &v,1 ); +if (rc) + goto err; *b++ |=GENMASK (bit_offset -1 ,0 ) & v;/* setup rest of the byte if any */ @@ -1125,11 +1127,16 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the last byte with msb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset + cell->bytes -1 , &v, 1); +if (rc) + goto err; *p |=GENMASK (7 , (nbits + bit_offset) %BITS_PER_BYTE ) & v;
Quoted 8 lines
drivers/nvmem/core.c static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell, · line 1139
Quoted 5 lines
drivers/nvmem/core.c +3
-0}return buf; +err: +kfree (buf); +return ERR_PTR (-EINVAL );You should return
ERR_PTR(rc)not EINVAL here.
errors should always propagate to caller!
third time's a charm ?
Sorry about this, I was not paying attention.
Quoted 7 lines
thanks,
sriniQuoted 4 lines
drivers/nvmem/core.c +0
-0}/**
PATCH v3 1/1 nvmem: properly handle returned value from nvmem_reg_read
In reply to Mathieu MalaterreFunction ‘nvmem_reg_read’ can return a non zero value indicating an error. This returned value should be read and error propagated to ‘nvmem_cell_prepare_write_buffer’. Silence a gcc warning (using W=1):
drivers/nvmem/core.c:1093:9: warning: variable ‘rc’ set but not used [-Wunused-but-set-variable]
---
v3: return exact error code instead of EINVAL, tweak commit message a bit
v2: prefer ERR_PTR(-EINVAL) over a simple return NULL
drivers/nvmem/core.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/nvmem/core.c +7 -0
@@ -1107,6 +1107,8 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the first byte with lsb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset, &v,1 ); +if (rc) + goto err; *b++ |=GENMASK (bit_offset -1 ,0 ) & v;/* setup rest of the byte if any */
@@ -1125,11 +1127,16 @@ static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,/* setup the last byte with msb bits from nvmem */ rc =nvmem_reg_read (nvmem, cell->offset + cell->bytes -1 , &v,1 ); +if (rc) + goto err; *p |=GENMASK (7 , (nbits + bit_offset) %BITS_PER_BYTE ) & v; }return buf; +err: +kfree (buf); +return ERR_PTR (rc); }/**
Signature · 1 line
2.11.0