Commit 3aec97e0 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull exfat fix from Namjae Jeon:

 - Fix ftruncate failure when allocating non-contiguous clusters

* tag 'exfat-for-6.8-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat:
  exfat: fix appending discontinuous clusters to empty file
parents 1678f8d8 3a784504
Loading
Loading
Loading
Loading
+22 −15
Original line number Diff line number Diff line
@@ -35,13 +35,18 @@ static int exfat_cont_expand(struct inode *inode, loff_t size)
	if (new_num_clusters == num_clusters)
		goto out;

	if (num_clusters) {
		exfat_chain_set(&clu, ei->start_clu, num_clusters, ei->flags);
		ret = exfat_find_last_cluster(sb, &clu, &last_clu);
		if (ret)
			return ret;

	clu.dir = (last_clu == EXFAT_EOF_CLUSTER) ?
			EXFAT_EOF_CLUSTER : last_clu + 1;
		clu.dir = last_clu + 1;
	} else {
		last_clu = EXFAT_EOF_CLUSTER;
		clu.dir = EXFAT_EOF_CLUSTER;
	}

	clu.size = 0;
	clu.flags = ei->flags;

@@ -51,17 +56,19 @@ static int exfat_cont_expand(struct inode *inode, loff_t size)
		return ret;

	/* Append new clusters to chain */
	if (clu.flags != ei->flags) {
		exfat_chain_cont_cluster(sb, ei->start_clu, num_clusters);
		ei->flags = ALLOC_FAT_CHAIN;
	}
	if (num_clusters) {
		if (clu.flags != ei->flags)
			if (exfat_chain_cont_cluster(sb, ei->start_clu, num_clusters))
				goto free_clu;

		if (clu.flags == ALLOC_FAT_CHAIN)
			if (exfat_ent_set(sb, last_clu, clu.dir))
				goto free_clu;

	if (num_clusters == 0)
	} else
		ei->start_clu = clu.dir;

	ei->flags = clu.flags;

out:
	inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
	/* Expanded range not zeroed, do not update valid_size */