diff mbox series

libflash/blocklevel: Correct miscalculation in blocklevel_smart_erase()

Message ID 20180227053139.11411-1-cyril.bur@au1.ibm.com
State Accepted
Headers show
Series libflash/blocklevel: Correct miscalculation in blocklevel_smart_erase() | expand

Commit Message

Cyril Bur Feb. 27, 2018, 5:31 a.m. UTC
If blocklevel_smart_erase() detects that the smart erase fits entire in
one erase block, it has an early bail path. In this path it miscaculates
where in the buffer the backend needs to read from to perform the final
write.

Fixes: d6a5b53f ("libflash/blocklevel: Add blocklevel_smart_erase()")
Fixes: https://github.com/open-power/skiboot/issues/151
Reported-by: Pridhiviraj Paidipeddi <ppaidipe@linux.vnet.ibm.com>
Tested-by: Pridhiviraj Paidipeddi <ppaidipe@linux.vnet.ibm.com>
Signed-off-by: Cyril Bur <cyril.bur@au1.ibm.com>
---
 libflash/blocklevel.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Stewart Smith March 1, 2018, 4:02 a.m. UTC | #1
Cyril Bur <cyril.bur@au1.ibm.com> writes:
> If blocklevel_smart_erase() detects that the smart erase fits entire in
> one erase block, it has an early bail path. In this path it miscaculates
> where in the buffer the backend needs to read from to perform the final
> write.
>
> Fixes: d6a5b53f ("libflash/blocklevel: Add blocklevel_smart_erase()")
> Fixes: https://github.com/open-power/skiboot/issues/151
> Reported-by: Pridhiviraj Paidipeddi <ppaidipe@linux.vnet.ibm.com>
> Tested-by: Pridhiviraj Paidipeddi <ppaidipe@linux.vnet.ibm.com>
> Signed-off-by: Cyril Bur <cyril.bur@au1.ibm.com>
> ---
>  libflash/blocklevel.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Thanks!

Merged to master as of 682e196627a062731dc2596276013f2e9fa9f6db

and I created a 5.10.x stable branch and merged it there as of
fe8945fb5edb98a1a2ad8f0ce91ef49b9edbbdac
diff mbox series

Patch

diff --git a/libflash/blocklevel.c b/libflash/blocklevel.c
index eaab431a..809d33cb 100644
--- a/libflash/blocklevel.c
+++ b/libflash/blocklevel.c
@@ -348,7 +348,7 @@  int blocklevel_smart_erase(struct blocklevel_device *bl, uint64_t pos, uint64_t
 		 * so we need to write back the chunk at the end of the block
 		 */
 		if (base_pos + base_len + len < base_pos + block_size) {
-			rc = bl->write(bl, pos + len, erase_buf + pos + len,
+			rc = bl->write(bl, pos + len, erase_buf + base_len + len,
 					block_size - base_len - len);
 			FL_DBG("%s: Early exit, everything was in one erase block\n",
 					__func__);