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

exfat: use exfat_chain_advance helper



Replace open-coded cluster chain walking logic with exfat_chain_advance()
across exfat_readdir, exfat_find_dir_entry, exfat_count_dir_entries,
exfat_search_empty_slot and exfat_check_dir_empty.

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 227468fc
Loading
Loading
Loading
Loading
+18 −53
Original line number Diff line number Diff line
@@ -93,25 +93,19 @@ static int exfat_readdir(struct inode *inode, loff_t *cpos, struct exfat_dir_ent
	clu_offset = EXFAT_DEN_TO_CLU(dentry, sbi);
	exfat_chain_dup(&clu, &dir);

	if (clu.flags == ALLOC_NO_FAT_CHAIN) {
		clu.dir += clu_offset;
		clu.size -= clu_offset;
	} else {
	if (clu.flags == ALLOC_FAT_CHAIN) {
		/* hint_information */
		if (clu_offset > 0 && ei->hint_bmap.off != EXFAT_EOF_CLUSTER &&
		    ei->hint_bmap.off > 0 && clu_offset >= ei->hint_bmap.off) {
			clu_offset -= ei->hint_bmap.off;
			clu.dir = ei->hint_bmap.clu;
			clu.size -= ei->hint_bmap.off;
		}
	}

		while (clu_offset > 0 && clu.dir != EXFAT_EOF_CLUSTER) {
			if (exfat_get_next_cluster(sb, &(clu.dir)))
	if (exfat_chain_advance(sb, &clu, clu_offset))
		return -EIO;

			clu_offset--;
		}
	}

	while (clu.dir != EXFAT_EOF_CLUSTER && dentry < max_dentries) {
		i = dentry & (dentries_per_clu - 1);

@@ -160,16 +154,9 @@ static int exfat_readdir(struct inode *inode, loff_t *cpos, struct exfat_dir_ent
			return 0;
		}

		if (clu.flags == ALLOC_NO_FAT_CHAIN) {
			if (--clu.size > 0)
				clu.dir++;
			else
				clu.dir = EXFAT_EOF_CLUSTER;
		} else {
			if (exfat_get_next_cluster(sb, &(clu.dir)))
		if (exfat_chain_advance(sb, &clu, 1))
			return -EIO;
	}
	}

out:
	dir_entry->namebuf.lfn[0] = '\0';
@@ -1085,20 +1072,13 @@ int exfat_find_dir_entry(struct super_block *sb, struct exfat_inode_info *ei,
			step = DIRENT_STEP_FILE;
		}

		if (clu.flags == ALLOC_NO_FAT_CHAIN) {
			if (--clu.size > 0)
				clu.dir++;
			else
				clu.dir = EXFAT_EOF_CLUSTER;
		} else {
			if (exfat_get_next_cluster(sb, &clu.dir))
		if (exfat_chain_advance(sb, &clu, 1))
			return -EIO;

		/* break if the cluster chain includes a loop */
		if (unlikely(++clu_count > EXFAT_DATA_CLUSTER_COUNT(sbi)))
			goto not_found;
	}
	}

not_found:
	/*
@@ -1132,14 +1112,7 @@ int exfat_find_dir_entry(struct super_block *sb, struct exfat_inode_info *ei,
	if (!((dentry + 1) & (dentries_per_clu - 1))) {
		int ret = 0;

		if (clu.flags == ALLOC_NO_FAT_CHAIN) {
			if (--clu.size > 0)
				clu.dir++;
			else
				clu.dir = EXFAT_EOF_CLUSTER;
		} else {
			ret = exfat_get_next_cluster(sb, &clu.dir);
		}
		ret = exfat_chain_advance(sb, &clu, 1);

		if (ret || clu.dir == EXFAT_EOF_CLUSTER) {
			/* just initialized hint_stat */
@@ -1184,21 +1157,13 @@ int exfat_count_dir_entries(struct super_block *sb, struct exfat_chain *p_dir)
			count++;
		}

		if (clu.flags == ALLOC_NO_FAT_CHAIN) {
			if (--clu.size > 0)
				clu.dir++;
			else
				clu.dir = EXFAT_EOF_CLUSTER;
		} else {
			if (exfat_get_next_cluster(sb, &(clu.dir)))
		if (exfat_chain_advance(sb, &clu, 1))
			return -EIO;

		if (unlikely(++clu_count > sbi->used_clusters)) {
			exfat_fs_error(sb, "FAT or bitmap is corrupted");
			return -EIO;
		}

		}
	}

	return count;
+7 −21
Original line number Diff line number Diff line
@@ -246,15 +246,8 @@ static int exfat_search_empty_slot(struct super_block *sb,
		i += ret;

		while (i >= dentries_per_clu) {
			if (clu.flags == ALLOC_NO_FAT_CHAIN) {
				if (--clu.size > 0)
					clu.dir++;
				else
					clu.dir = EXFAT_EOF_CLUSTER;
			} else {
				if (exfat_get_next_cluster(sb, &clu.dir))
			if (exfat_chain_advance(sb, &clu, 1))
				return -EIO;
			}

			i -= dentries_per_clu;
		}
@@ -925,20 +918,13 @@ static int exfat_check_dir_empty(struct super_block *sb,
			return -ENOTEMPTY;
		}

		if (clu.flags == ALLOC_NO_FAT_CHAIN) {
			if (--clu.size > 0)
				clu.dir++;
			else
				clu.dir = EXFAT_EOF_CLUSTER;
		} else {
			if (exfat_get_next_cluster(sb, &(clu.dir)))
		if (exfat_chain_advance(sb, &clu, 1))
			return -EIO;

		/* break if the cluster chain includes a loop */
		if (unlikely(++clu_count > EXFAT_DATA_CLUSTER_COUNT(sbi)))
			break;
	}
	}

	return 0;
}