diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2018-03-09 20:42:28 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2018-03-17 00:57:39 -0400 |
commit | bb1105e479fbb8b0edc6f35affec71b75e31c8c0 (patch) | |
tree | 782efd263f26e6dfd3305fdccf2070acf82113f8 | |
parent | c56675750d7c45ce6cc21a67770629aaf41d1491 (diff) |
f2fs: align memory boundary for bitops
For example, in arm64, free_nid_bitmap should be aligned to word size in order
to use bit operations.
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r-- | fs/f2fs/f2fs.h | 2 | ||||
-rw-r--r-- | fs/f2fs/node.c | 20 | ||||
-rw-r--r-- | include/linux/f2fs_fs.h | 4 |
3 files changed, 22 insertions, 4 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 88f2b420de27..641b4b98d373 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -766,7 +766,7 @@ struct f2fs_nm_info { | |||
766 | unsigned int nid_cnt[MAX_NID_STATE]; /* the number of free node id */ | 766 | unsigned int nid_cnt[MAX_NID_STATE]; /* the number of free node id */ |
767 | spinlock_t nid_list_lock; /* protect nid lists ops */ | 767 | spinlock_t nid_list_lock; /* protect nid lists ops */ |
768 | struct mutex build_lock; /* lock for build free nids */ | 768 | struct mutex build_lock; /* lock for build free nids */ |
769 | unsigned char (*free_nid_bitmap)[NAT_ENTRY_BITMAP_SIZE]; | 769 | unsigned char **free_nid_bitmap; |
770 | unsigned char *nat_block_bitmap; | 770 | unsigned char *nat_block_bitmap; |
771 | unsigned short *free_nid_count; /* free nid count of NAT block */ | 771 | unsigned short *free_nid_count; /* free nid count of NAT block */ |
772 | 772 | ||
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index b86e2b15b619..f7886b46478d 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -2708,12 +2708,20 @@ static int init_node_manager(struct f2fs_sb_info *sbi) | |||
2708 | static int init_free_nid_cache(struct f2fs_sb_info *sbi) | 2708 | static int init_free_nid_cache(struct f2fs_sb_info *sbi) |
2709 | { | 2709 | { |
2710 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 2710 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
2711 | int i; | ||
2711 | 2712 | ||
2712 | nm_i->free_nid_bitmap = f2fs_kvzalloc(sbi, nm_i->nat_blocks * | 2713 | nm_i->free_nid_bitmap = f2fs_kzalloc(sbi, nm_i->nat_blocks * |
2713 | NAT_ENTRY_BITMAP_SIZE, GFP_KERNEL); | 2714 | sizeof(unsigned char *), GFP_KERNEL); |
2714 | if (!nm_i->free_nid_bitmap) | 2715 | if (!nm_i->free_nid_bitmap) |
2715 | return -ENOMEM; | 2716 | return -ENOMEM; |
2716 | 2717 | ||
2718 | for (i = 0; i < nm_i->nat_blocks; i++) { | ||
2719 | nm_i->free_nid_bitmap[i] = f2fs_kvzalloc(sbi, | ||
2720 | NAT_ENTRY_BITMAP_SIZE_ALIGNED, GFP_KERNEL); | ||
2721 | if (!nm_i->free_nid_bitmap) | ||
2722 | return -ENOMEM; | ||
2723 | } | ||
2724 | |||
2717 | nm_i->nat_block_bitmap = f2fs_kvzalloc(sbi, nm_i->nat_blocks / 8, | 2725 | nm_i->nat_block_bitmap = f2fs_kvzalloc(sbi, nm_i->nat_blocks / 8, |
2718 | GFP_KERNEL); | 2726 | GFP_KERNEL); |
2719 | if (!nm_i->nat_block_bitmap) | 2727 | if (!nm_i->nat_block_bitmap) |
@@ -2804,7 +2812,13 @@ void destroy_node_manager(struct f2fs_sb_info *sbi) | |||
2804 | up_write(&nm_i->nat_tree_lock); | 2812 | up_write(&nm_i->nat_tree_lock); |
2805 | 2813 | ||
2806 | kvfree(nm_i->nat_block_bitmap); | 2814 | kvfree(nm_i->nat_block_bitmap); |
2807 | kvfree(nm_i->free_nid_bitmap); | 2815 | if (nm_i->free_nid_bitmap) { |
2816 | int i; | ||
2817 | |||
2818 | for (i = 0; i < nm_i->nat_blocks; i++) | ||
2819 | kvfree(nm_i->free_nid_bitmap[i]); | ||
2820 | kfree(nm_i->free_nid_bitmap); | ||
2821 | } | ||
2808 | kvfree(nm_i->free_nid_count); | 2822 | kvfree(nm_i->free_nid_count); |
2809 | 2823 | ||
2810 | kfree(nm_i->nat_bitmap); | 2824 | kfree(nm_i->nat_bitmap); |
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index 124787e8db58..aa5db8b5521a 100644 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h | |||
@@ -305,6 +305,10 @@ struct f2fs_node { | |||
305 | */ | 305 | */ |
306 | #define NAT_ENTRY_PER_BLOCK (PAGE_SIZE / sizeof(struct f2fs_nat_entry)) | 306 | #define NAT_ENTRY_PER_BLOCK (PAGE_SIZE / sizeof(struct f2fs_nat_entry)) |
307 | #define NAT_ENTRY_BITMAP_SIZE ((NAT_ENTRY_PER_BLOCK + 7) / 8) | 307 | #define NAT_ENTRY_BITMAP_SIZE ((NAT_ENTRY_PER_BLOCK + 7) / 8) |
308 | #define NAT_ENTRY_BITMAP_SIZE_ALIGNED \ | ||
309 | ((NAT_ENTRY_BITMAP_SIZE + BITS_PER_LONG - 1) / \ | ||
310 | BITS_PER_LONG * BITS_PER_LONG) | ||
311 | |||
308 | 312 | ||
309 | struct f2fs_nat_entry { | 313 | struct f2fs_nat_entry { |
310 | __u8 version; /* latest version of cached nat entry */ | 314 | __u8 version; /* latest version of cached nat entry */ |