Commit f5e5177f authored by Chi Zhiling's avatar Chi Zhiling Committed by Namjae Jeon
Browse files

exfat: introduce exfat_cluster_walk helper



Introduce exfat_cluster_walk() to walk the FAT chain by a given step,
handling both ALLOC_NO_FAT_CHAIN and ALLOC_FAT_CHAIN modes. Also
redefine exfat_get_next_cluster as a thin wrapper around it for
backward compatibility.

Signed-off-by: default avatarChi Zhiling <chizhiling@kylinos.cn>
Reviewed-by: default avatarSungjong Seo <sj1557.seo@samsung.com>
Reviewed-by: default avatarYuezhang Mo <Yuezhang.Mo@sony.com>
Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
parent ff37797b
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -437,7 +437,8 @@ int exfat_set_volume_dirty(struct super_block *sb);
int exfat_clear_volume_dirty(struct super_block *sb);

/* fatent.c */
#define exfat_get_next_cluster(sb, pclu) exfat_ent_get(sb, *(pclu), pclu, NULL)
#define exfat_get_next_cluster(sb, pclu) \
	exfat_cluster_walk(sb, (pclu), 1, ALLOC_FAT_CHAIN)

int exfat_alloc_cluster(struct inode *inode, unsigned int num_alloc,
		struct exfat_chain *p_chain, bool sync_bmap);
@@ -456,6 +457,26 @@ int exfat_count_num_clusters(struct super_block *sb,
int exfat_blk_readahead(struct super_block *sb, sector_t sec,
		sector_t *ra, blkcnt_t *ra_cnt, sector_t end);

static inline int
exfat_cluster_walk(struct super_block *sb, unsigned int *clu,
		unsigned int step, int flags)
{
	struct buffer_head *bh = NULL;

	if (flags == ALLOC_NO_FAT_CHAIN) {
		(*clu) += step;
		return 0;
	}

	while (step--) {
		if (exfat_ent_get(sb, *clu, clu, &bh))
			return -EIO;
	}
	brelse(bh);

	return 0;
}

/* balloc.c */
int exfat_load_bitmap(struct super_block *sb);
void exfat_free_bitmap(struct exfat_sb_info *sbi);