Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cee6482c authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

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: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 8dbfcba5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -766,7 +766,7 @@ struct f2fs_nm_info {
	unsigned int nid_cnt[MAX_NID_STATE];	/* the number of free node id */
	spinlock_t nid_list_lock;	/* protect nid lists ops */
	struct mutex build_lock;	/* lock for build free nids */
	unsigned char (*free_nid_bitmap)[NAT_ENTRY_BITMAP_SIZE];
	unsigned char **free_nid_bitmap;
	unsigned char *nat_block_bitmap;
	unsigned short *free_nid_count;	/* free nid count of NAT block */

+17 −3
Original line number Diff line number Diff line
@@ -2727,12 +2727,20 @@ static int init_node_manager(struct f2fs_sb_info *sbi)
static int init_free_nid_cache(struct f2fs_sb_info *sbi)
{
	struct f2fs_nm_info *nm_i = NM_I(sbi);
	int i;

	nm_i->free_nid_bitmap = f2fs_kvzalloc(sbi, nm_i->nat_blocks *
					NAT_ENTRY_BITMAP_SIZE, GFP_KERNEL);
	nm_i->free_nid_bitmap = f2fs_kzalloc(sbi, nm_i->nat_blocks *
				sizeof(unsigned char *), GFP_KERNEL);
	if (!nm_i->free_nid_bitmap)
		return -ENOMEM;

	for (i = 0; i < nm_i->nat_blocks; i++) {
		nm_i->free_nid_bitmap[i] = f2fs_kvzalloc(sbi,
				NAT_ENTRY_BITMAP_SIZE_ALIGNED, GFP_KERNEL);
		if (!nm_i->free_nid_bitmap)
			return -ENOMEM;
	}

	nm_i->nat_block_bitmap = f2fs_kvzalloc(sbi, nm_i->nat_blocks / 8,
								GFP_KERNEL);
	if (!nm_i->nat_block_bitmap)
@@ -2823,7 +2831,13 @@ void destroy_node_manager(struct f2fs_sb_info *sbi)
	up_write(&nm_i->nat_tree_lock);

	kvfree(nm_i->nat_block_bitmap);
	kvfree(nm_i->free_nid_bitmap);
	if (nm_i->free_nid_bitmap) {
		int i;

		for (i = 0; i < nm_i->nat_blocks; i++)
			kvfree(nm_i->free_nid_bitmap[i]);
		kfree(nm_i->free_nid_bitmap);
	}
	kvfree(nm_i->free_nid_count);

	kfree(nm_i->nat_bitmap);
+4 −0
Original line number Diff line number Diff line
@@ -305,6 +305,10 @@ struct f2fs_node {
 */
#define NAT_ENTRY_PER_BLOCK (PAGE_SIZE / sizeof(struct f2fs_nat_entry))
#define NAT_ENTRY_BITMAP_SIZE	((NAT_ENTRY_PER_BLOCK + 7) / 8)
#define NAT_ENTRY_BITMAP_SIZE_ALIGNED				\
	((NAT_ENTRY_BITMAP_SIZE + BITS_PER_LONG - 1) /		\
	BITS_PER_LONG * BITS_PER_LONG)


struct f2fs_nat_entry {
	__u8 version;		/* latest version of cached nat entry */