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

exfat: introduce exfat_chain_advance helper



Introduce exfat_chain_advance() to walk a exfat_chain structure by a
given step, updating both ->dir and ->size fields atomically. This
helper handles both ALLOC_NO_FAT_CHAIN and ALLOC_FAT_CHAIN modes with
proper boundary checking.

Suggested-by: default avatarYuezhang Mo <Yuezhang.Mo@sony.com>
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 f764c589
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -552,6 +552,27 @@ int exfat_read_volume_label(struct super_block *sb,
int exfat_write_volume_label(struct super_block *sb,
			     struct exfat_uni_name *label);

static inline int exfat_chain_advance(struct super_block *sb,
		struct exfat_chain *chain, unsigned int step)
{
	unsigned int clu = chain->dir;

	if (unlikely(chain->size < step))
		return -EIO;

	if (exfat_cluster_walk(sb, &clu, step, chain->flags))
		return -EIO;

	chain->size -= step;

	if (chain->size == 0 && chain->flags == ALLOC_NO_FAT_CHAIN)
		chain->dir = EXFAT_EOF_CLUSTER;
	else
		chain->dir = clu;

	return 0;
}

/* inode.c */
extern const struct inode_operations exfat_file_inode_operations;
void exfat_sync_inode(struct inode *inode);