diff options
author | Kees Cook <keescook@chromium.org> | 2018-06-12 17:28:35 -0400 |
---|---|---|
committer | Kees Cook <keescook@chromium.org> | 2018-06-12 19:19:22 -0400 |
commit | 9d2a789c1db75d0f55b14fa57bec548d94332ad8 (patch) | |
tree | fb238c2154c5d4ca9b63ae5f95d8f167cac8df3b | |
parent | 026f05079b00a56250e6e5864b6949eae50ae4b8 (diff) |
treewide: Use array_size in f2fs_kvzalloc()
The f2fs_kvzalloc() function has no 2-factor argument form, so
multiplication factors need to be wrapped in array_size(). This patch
replaces cases of:
f2fs_kvzalloc(handle, a * b, gfp)
with:
f2fs_kvzalloc(handle, array_size(a, b), gfp)
as well as handling cases of:
f2fs_kvzalloc(handle, a * b * c, gfp)
with:
f2fs_kvzalloc(handle, array3_size(a, b, c), gfp)
This does, however, attempt to ignore constant size factors like:
f2fs_kvzalloc(handle, 4 * 1024, gfp)
though any constants defined via macros get caught up in the conversion.
Any factors with a sizeof() of "unsigned char", "char", and "u8" were
dropped, since they're redundant.
The Coccinelle script used for this was:
// Fix redundant parens around sizeof().
@@
expression HANDLE;
type TYPE;
expression THING, E;
@@
(
f2fs_kvzalloc(HANDLE,
- (sizeof(TYPE)) * E
+ sizeof(TYPE) * E
, ...)
|
f2fs_kvzalloc(HANDLE,
- (sizeof(THING)) * E
+ sizeof(THING) * E
, ...)
)
// Drop single-byte sizes and redundant parens.
@@
expression HANDLE;
expression COUNT;
typedef u8;
typedef __u8;
@@
(
f2fs_kvzalloc(HANDLE,
- sizeof(u8) * (COUNT)
+ COUNT
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(__u8) * (COUNT)
+ COUNT
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(char) * (COUNT)
+ COUNT
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(unsigned char) * (COUNT)
+ COUNT
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(u8) * COUNT
+ COUNT
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(__u8) * COUNT
+ COUNT
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(char) * COUNT
+ COUNT
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(unsigned char) * COUNT
+ COUNT
, ...)
)
// 2-factor product with sizeof(type/expression) and identifier or constant.
@@
expression HANDLE;
type TYPE;
expression THING;
identifier COUNT_ID;
constant COUNT_CONST;
@@
(
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE) * (COUNT_ID)
+ array_size(COUNT_ID, sizeof(TYPE))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE) * COUNT_ID
+ array_size(COUNT_ID, sizeof(TYPE))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE) * (COUNT_CONST)
+ array_size(COUNT_CONST, sizeof(TYPE))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE) * COUNT_CONST
+ array_size(COUNT_CONST, sizeof(TYPE))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING) * (COUNT_ID)
+ array_size(COUNT_ID, sizeof(THING))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING) * COUNT_ID
+ array_size(COUNT_ID, sizeof(THING))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING) * (COUNT_CONST)
+ array_size(COUNT_CONST, sizeof(THING))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING) * COUNT_CONST
+ array_size(COUNT_CONST, sizeof(THING))
, ...)
)
// 2-factor product, only identifiers.
@@
expression HANDLE;
identifier SIZE, COUNT;
@@
f2fs_kvzalloc(HANDLE,
- SIZE * COUNT
+ array_size(COUNT, SIZE)
, ...)
// 3-factor product with 1 sizeof(type) or sizeof(expression), with
// redundant parens removed.
@@
expression HANDLE;
expression THING;
identifier STRIDE, COUNT;
type TYPE;
@@
(
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(TYPE))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING) * (COUNT) * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING) * (COUNT) * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING) * COUNT * (STRIDE)
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING) * COUNT * STRIDE
+ array3_size(COUNT, STRIDE, sizeof(THING))
, ...)
)
// 3-factor product with 2 sizeof(variable), with redundant parens removed.
@@
expression HANDLE;
expression THING1, THING2;
identifier COUNT;
type TYPE1, TYPE2;
@@
(
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE1) * sizeof(TYPE2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(THING1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(THING1), sizeof(THING2))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE1) * sizeof(THING2) * COUNT
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
|
f2fs_kvzalloc(HANDLE,
- sizeof(TYPE1) * sizeof(THING2) * (COUNT)
+ array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
, ...)
)
// 3-factor product, only identifiers, with redundant parens removed.
@@
expression HANDLE;
identifier STRIDE, SIZE, COUNT;
@@
(
f2fs_kvzalloc(HANDLE,
- (COUNT) * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
f2fs_kvzalloc(HANDLE,
- COUNT * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
f2fs_kvzalloc(HANDLE,
- COUNT * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
f2fs_kvzalloc(HANDLE,
- (COUNT) * (STRIDE) * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
f2fs_kvzalloc(HANDLE,
- COUNT * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
f2fs_kvzalloc(HANDLE,
- (COUNT) * STRIDE * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
f2fs_kvzalloc(HANDLE,
- (COUNT) * (STRIDE) * (SIZE)
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
|
f2fs_kvzalloc(HANDLE,
- COUNT * STRIDE * SIZE
+ array3_size(COUNT, STRIDE, SIZE)
, ...)
)
// Any remaining multi-factor products, first at least 3-factor products
// when they're not all constants...
@@
expression HANDLE;
expression E1, E2, E3;
constant C1, C2, C3;
@@
(
f2fs_kvzalloc(HANDLE, C1 * C2 * C3, ...)
|
f2fs_kvzalloc(HANDLE,
- E1 * E2 * E3
+ array3_size(E1, E2, E3)
, ...)
)
// And then all remaining 2 factors products when they're not all constants.
@@
expression HANDLE;
expression E1, E2;
constant C1, C2;
@@
(
f2fs_kvzalloc(HANDLE, C1 * C2, ...)
|
f2fs_kvzalloc(HANDLE,
- E1 * E2
+ array_size(E1, E2)
, ...)
)
Signed-off-by: Kees Cook <keescook@chromium.org>
-rw-r--r-- | fs/f2fs/file.c | 6 | ||||
-rw-r--r-- | fs/f2fs/node.c | 6 | ||||
-rw-r--r-- | fs/f2fs/segment.c | 12 |
3 files changed, 16 insertions, 8 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 13f2f6845e87..cadb425c02d7 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -1122,12 +1122,14 @@ static int __exchange_data_block(struct inode *src_inode, | |||
1122 | olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len); | 1122 | olen = min((pgoff_t)4 * ADDRS_PER_BLOCK, len); |
1123 | 1123 | ||
1124 | src_blkaddr = f2fs_kvzalloc(F2FS_I_SB(src_inode), | 1124 | src_blkaddr = f2fs_kvzalloc(F2FS_I_SB(src_inode), |
1125 | sizeof(block_t) * olen, GFP_KERNEL); | 1125 | array_size(olen, sizeof(block_t)), |
1126 | GFP_KERNEL); | ||
1126 | if (!src_blkaddr) | 1127 | if (!src_blkaddr) |
1127 | return -ENOMEM; | 1128 | return -ENOMEM; |
1128 | 1129 | ||
1129 | do_replace = f2fs_kvzalloc(F2FS_I_SB(src_inode), | 1130 | do_replace = f2fs_kvzalloc(F2FS_I_SB(src_inode), |
1130 | sizeof(int) * olen, GFP_KERNEL); | 1131 | array_size(olen, sizeof(int)), |
1132 | GFP_KERNEL); | ||
1131 | if (!do_replace) { | 1133 | if (!do_replace) { |
1132 | kvfree(src_blkaddr); | 1134 | kvfree(src_blkaddr); |
1133 | return -ENOMEM; | 1135 | return -ENOMEM; |
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 53e5bc6f9efb..10643b11bd59 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -2772,8 +2772,10 @@ static int init_free_nid_cache(struct f2fs_sb_info *sbi) | |||
2772 | if (!nm_i->nat_block_bitmap) | 2772 | if (!nm_i->nat_block_bitmap) |
2773 | return -ENOMEM; | 2773 | return -ENOMEM; |
2774 | 2774 | ||
2775 | nm_i->free_nid_count = f2fs_kvzalloc(sbi, nm_i->nat_blocks * | 2775 | nm_i->free_nid_count = |
2776 | sizeof(unsigned short), GFP_KERNEL); | 2776 | f2fs_kvzalloc(sbi, array_size(sizeof(unsigned short), |
2777 | nm_i->nat_blocks), | ||
2778 | GFP_KERNEL); | ||
2777 | if (!nm_i->free_nid_count) | 2779 | if (!nm_i->free_nid_count) |
2778 | return -ENOMEM; | 2780 | return -ENOMEM; |
2779 | return 0; | 2781 | return 0; |
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 50a10f512051..9efce174c51a 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -3517,8 +3517,10 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
3517 | 3517 | ||
3518 | SM_I(sbi)->sit_info = sit_i; | 3518 | SM_I(sbi)->sit_info = sit_i; |
3519 | 3519 | ||
3520 | sit_i->sentries = f2fs_kvzalloc(sbi, MAIN_SEGS(sbi) * | 3520 | sit_i->sentries = |
3521 | sizeof(struct seg_entry), GFP_KERNEL); | 3521 | f2fs_kvzalloc(sbi, array_size(sizeof(struct seg_entry), |
3522 | MAIN_SEGS(sbi)), | ||
3523 | GFP_KERNEL); | ||
3522 | if (!sit_i->sentries) | 3524 | if (!sit_i->sentries) |
3523 | return -ENOMEM; | 3525 | return -ENOMEM; |
3524 | 3526 | ||
@@ -3558,8 +3560,10 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
3558 | return -ENOMEM; | 3560 | return -ENOMEM; |
3559 | 3561 | ||
3560 | if (sbi->segs_per_sec > 1) { | 3562 | if (sbi->segs_per_sec > 1) { |
3561 | sit_i->sec_entries = f2fs_kvzalloc(sbi, MAIN_SECS(sbi) * | 3563 | sit_i->sec_entries = |
3562 | sizeof(struct sec_entry), GFP_KERNEL); | 3564 | f2fs_kvzalloc(sbi, array_size(sizeof(struct sec_entry), |
3565 | MAIN_SECS(sbi)), | ||
3566 | GFP_KERNEL); | ||
3563 | if (!sit_i->sec_entries) | 3567 | if (!sit_i->sec_entries) |
3564 | return -ENOMEM; | 3568 | return -ENOMEM; |
3565 | } | 3569 | } |