ret = sb_issue_discard(sb, exfat_cluster_to_sector(sbi, clu),
sbi->sect_per_clus * num_clusters, GFP_NOFS, 0); if (ret == -EOPNOTSUPP) {
exfat_err(sb, "discard not supported by device, disabling");
sbi->options.discard = 0;
}
}
/* This function must be called with bitmap_lock held */ staticint __exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain)
{ struct super_block *sb = inode->i_sb; struct exfat_sb_info *sbi = EXFAT_SB(sb); int cur_cmap_i, next_cmap_i; unsignedint num_clusters = 0; unsignedint clu;
/* invalid cluster number */ if (p_chain->dir == EXFAT_FREE_CLUSTER ||
p_chain->dir == EXFAT_EOF_CLUSTER ||
p_chain->dir < EXFAT_FIRST_CLUSTER) return0;
/* no cluster to truncate */ if (p_chain->size == 0) return0;
if (p_chain->flags == ALLOC_NO_FAT_CHAIN) { int err; unsignedint last_cluster = p_chain->dir + p_chain->size - 1; do { bool sync = false;
if (clu < last_cluster)
next_cmap_i =
BITMAP_OFFSET_SECTOR_INDEX(sb, CLUSTER_TO_BITMAP_ENT(clu+1));
/* flush bitmap only if index would be changed or for last cluster */ if (clu == last_cluster || cur_cmap_i != next_cmap_i) {
sync = true;
cur_cmap_i = next_cmap_i;
}
err = exfat_clear_bitmap(inode, clu, (sync && IS_DIRSYNC(inode))); if (err) break;
clu++;
num_clusters++;
} while (num_clusters < p_chain->size);
if (num_clusters >= sbi->num_clusters - EXFAT_FIRST_CLUSTER) { /* * The cluster chain includes a loop, scan the * bitmap to get the number of used clusters.
*/
exfat_count_used_clusters(sb, &sbi->used_clusters);
return0;
}
} while (clu != EXFAT_EOF_CLUSTER);
}
sbi->used_clusters -= num_clusters; return0;
}
int exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain)
{ int ret = 0;
mutex_lock(&EXFAT_SB(inode->i_sb)->bitmap_lock);
ret = __exfat_free_cluster(inode, p_chain);
mutex_unlock(&EXFAT_SB(inode->i_sb)->bitmap_lock);
if (p_chain->flags == ALLOC_NO_FAT_CHAIN) {
*ret_count = p_chain->size; return0;
}
clu = p_chain->dir;
count = 0; for (i = EXFAT_FIRST_CLUSTER; i < sbi->num_clusters; i++) {
count++; if (exfat_ent_get(sb, clu, &clu)) return -EIO; if (clu == EXFAT_EOF_CLUSTER) break;
}
*ret_count = count;
/* * since exfat_count_used_clusters() is not called, sbi->used_clusters * cannot be used here.
*/ if (unlikely(i == sbi->num_clusters && clu != EXFAT_EOF_CLUSTER)) {
exfat_fs_error(sb, "The cluster chain has a loop"); return -EIO;
}
return0;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.