| From ab4949640d6674b617b314ad3c2c00353304bab9 Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Thu, 23 Mar 2017 16:06:13 +0100 |
| Subject: reiserfs: avoid a -Wmaybe-uninitialized warning |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| commit ab4949640d6674b617b314ad3c2c00353304bab9 upstream. |
| |
| The latest gcc-7.0.1 snapshot warns about an unintialized variable use: |
| |
| In file included from fs/reiserfs/lbalance.c:8:0: |
| fs/reiserfs/lbalance.c: In function 'leaf_item_bottle.isra.3': |
| fs/reiserfs/reiserfs.h:1279:13: error: '*((void *)&n_ih+8).v' may be used uninitialized in this function [-Werror=maybe-uninitialized] |
| v2->v = (v2->v & cpu_to_le64(15ULL << 60)) | cpu_to_le64(offset); |
| ~~^~~ |
| fs/reiserfs/reiserfs.h:1279:13: error: '*((void *)&n_ih+8).v' may be used uninitialized in this function [-Werror=maybe-uninitialized] |
| v2->v = (v2->v & cpu_to_le64(15ULL << 60)) | cpu_to_le64(offset); |
| |
| This happens because the offset/type pair that is stored in |
| ih.key.u.k_offset_v2 is actually uninitialized when we call |
| set_le_ih_k_offset() and set_le_ih_k_type(). After we have called both, |
| all data is correct, but the first of the two reads uninitialized data |
| for the type field and writes it back before it gets overwritten. |
| |
| This works around the warning by initializing the k_offset_v2 through |
| the slightly larger memcpy(). |
| |
| [JK: Remove now unused define and make it obvious we initialize the key] |
| |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: Jan Kara <jack@suse.cz> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/reiserfs/lbalance.c | 2 +- |
| fs/reiserfs/reiserfs.h | 1 - |
| 2 files changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/fs/reiserfs/lbalance.c |
| +++ b/fs/reiserfs/lbalance.c |
| @@ -475,7 +475,7 @@ static void leaf_item_bottle(struct buff |
| * 'cpy_bytes'; create new item header; |
| * n_ih = new item_header; |
| */ |
| - memcpy(&n_ih, ih, SHORT_KEY_SIZE); |
| + memcpy(&n_ih.ih_key, &ih->ih_key, KEY_SIZE); |
| |
| /* Endian safe, both le */ |
| n_ih.ih_version = ih->ih_version; |
| --- a/fs/reiserfs/reiserfs.h |
| +++ b/fs/reiserfs/reiserfs.h |
| @@ -1326,7 +1326,6 @@ struct cpu_key { |
| #define KEY_NOT_FOUND 0 |
| |
| #define KEY_SIZE (sizeof(struct reiserfs_key)) |
| -#define SHORT_KEY_SIZE (sizeof (__u32) + sizeof (__u32)) |
| |
| /* return values for search_by_key and clones */ |
| #define ITEM_FOUND 1 |