^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/buffer_head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "exfat_raw.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "exfat_fs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) static const unsigned char free_bit[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2,/* 0 ~ 19*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3,/* 20 ~ 39*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/* 40 ~ 59*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,/* 60 ~ 79*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2,/* 80 ~ 99*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3,/*100 ~ 119*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/*120 ~ 139*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,/*140 ~ 159*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2,/*160 ~ 179*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3,/*180 ~ 199*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/*200 ~ 219*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,/*220 ~ 239*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /*240 ~ 254*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) static const unsigned char used_bit[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3,/* 0 ~ 19*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4,/* 20 ~ 39*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,/* 40 ~ 59*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,/* 60 ~ 79*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,/* 80 ~ 99*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,/*100 ~ 119*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,/*120 ~ 139*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,/*140 ~ 159*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,/*160 ~ 179*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,/*180 ~ 199*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6,/*200 ~ 219*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,/*220 ~ 239*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 /*240 ~ 255*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * Allocation Bitmap Management Functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) static int exfat_allocate_bitmap(struct super_block *sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct exfat_dentry *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct exfat_sb_info *sbi = EXFAT_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) long long map_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) unsigned int i, need_map_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) sector_t sector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) sbi->map_clu = le32_to_cpu(ep->dentry.bitmap.start_clu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) map_size = le64_to_cpu(ep->dentry.bitmap.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) need_map_size = ((EXFAT_DATA_CLUSTER_COUNT(sbi) - 1) / BITS_PER_BYTE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) if (need_map_size != map_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) exfat_err(sb, "bogus allocation bitmap size(need : %u, cur : %lld)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) need_map_size, map_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * Only allowed when bogus allocation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * bitmap size is large
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (need_map_size > map_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) sbi->map_sectors = ((need_map_size - 1) >>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) (sb->s_blocksize_bits)) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) sbi->vol_amap = kmalloc_array(sbi->map_sectors,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) sizeof(struct buffer_head *), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (!sbi->vol_amap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) sector = exfat_cluster_to_sector(sbi, sbi->map_clu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) for (i = 0; i < sbi->map_sectors; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) sbi->vol_amap[i] = sb_bread(sb, sector + i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) if (!sbi->vol_amap[i]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* release all buffers and free vol_amap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) int j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) while (j < i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) brelse(sbi->vol_amap[j++]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) kfree(sbi->vol_amap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) sbi->vol_amap = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) int exfat_load_bitmap(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) unsigned int i, type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) struct exfat_chain clu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct exfat_sb_info *sbi = EXFAT_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) exfat_chain_set(&clu, sbi->root_dir, 0, ALLOC_FAT_CHAIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) while (clu.dir != EXFAT_EOF_CLUSTER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) for (i = 0; i < sbi->dentries_per_clu; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct exfat_dentry *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) struct buffer_head *bh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) ep = exfat_get_dentry(sb, &clu, i, &bh, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) type = exfat_get_entry_type(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) if (type == TYPE_UNUSED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) if (type != TYPE_BITMAP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) if (ep->dentry.bitmap.flags == 0x0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) err = exfat_allocate_bitmap(sb, ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) brelse(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) brelse(bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) if (exfat_get_next_cluster(sb, &clu.dir))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) void exfat_free_bitmap(struct exfat_sb_info *sbi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) for (i = 0; i < sbi->map_sectors; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) __brelse(sbi->vol_amap[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) kfree(sbi->vol_amap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) int exfat_set_bitmap(struct inode *inode, unsigned int clu, bool sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) int i, b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) unsigned int ent_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) struct super_block *sb = inode->i_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) struct exfat_sb_info *sbi = EXFAT_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) WARN_ON(clu < EXFAT_FIRST_CLUSTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) ent_idx = CLUSTER_TO_BITMAP_ENT(clu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, ent_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) set_bit_le(b, sbi->vol_amap[i]->b_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) exfat_update_bh(sbi->vol_amap[i], sync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) void exfat_clear_bitmap(struct inode *inode, unsigned int clu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) int i, b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) unsigned int ent_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) struct super_block *sb = inode->i_sb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) struct exfat_sb_info *sbi = EXFAT_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) struct exfat_mount_options *opts = &sbi->options;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) WARN_ON(clu < EXFAT_FIRST_CLUSTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) ent_idx = CLUSTER_TO_BITMAP_ENT(clu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, ent_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) clear_bit_le(b, sbi->vol_amap[i]->b_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) exfat_update_bh(sbi->vol_amap[i], IS_DIRSYNC(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if (opts->discard) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) int ret_discard;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) ret_discard = sb_issue_discard(sb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) exfat_cluster_to_sector(sbi, clu),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) (1 << sbi->sect_per_clus_bits), GFP_NOFS, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) if (ret_discard == -EOPNOTSUPP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) exfat_err(sb, "discard not supported by device, disabling");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) opts->discard = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * If the value of "clu" is 0, it means cluster 2 which is the first cluster of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * the cluster heap.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) unsigned int exfat_find_free_bitmap(struct super_block *sb, unsigned int clu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) unsigned int i, map_i, map_b, ent_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) unsigned int clu_base, clu_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) unsigned char k, clu_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) struct exfat_sb_info *sbi = EXFAT_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) WARN_ON(clu < EXFAT_FIRST_CLUSTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) ent_idx = CLUSTER_TO_BITMAP_ENT(clu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) clu_base = BITMAP_ENT_TO_CLUSTER(ent_idx & ~(BITS_PER_BYTE_MASK));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) clu_mask = IGNORED_BITS_REMAINED(clu, clu_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) map_i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) map_b = BITMAP_OFFSET_BYTE_IN_SECTOR(sb, ent_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) for (i = EXFAT_FIRST_CLUSTER; i < sbi->num_clusters;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) i += BITS_PER_BYTE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) k = *(sbi->vol_amap[map_i]->b_data + map_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) if (clu_mask > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) k |= clu_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) clu_mask = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if (k < 0xFF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) clu_free = clu_base + free_bit[k];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) if (clu_free < sbi->num_clusters)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) return clu_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) clu_base += BITS_PER_BYTE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if (++map_b >= sb->s_blocksize ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) clu_base >= sbi->num_clusters) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (++map_i >= sbi->map_sectors) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) clu_base = EXFAT_FIRST_CLUSTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) map_i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) map_b = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) return EXFAT_EOF_CLUSTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) int exfat_count_used_clusters(struct super_block *sb, unsigned int *ret_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct exfat_sb_info *sbi = EXFAT_SB(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) unsigned int count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) unsigned int i, map_i = 0, map_b = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) unsigned int total_clus = EXFAT_DATA_CLUSTER_COUNT(sbi);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) unsigned int last_mask = total_clus & BITS_PER_BYTE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) unsigned char clu_bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) const unsigned char last_bit_mask[] = {0, 0b00000001, 0b00000011,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 0b00000111, 0b00001111, 0b00011111, 0b00111111, 0b01111111};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) total_clus &= ~last_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) for (i = 0; i < total_clus; i += BITS_PER_BYTE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) clu_bits = *(sbi->vol_amap[map_i]->b_data + map_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) count += used_bit[clu_bits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if (++map_b >= (unsigned int)sb->s_blocksize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) map_i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) map_b = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) if (last_mask) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) clu_bits = *(sbi->vol_amap[map_i]->b_data + map_b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) clu_bits &= last_bit_mask[last_mask];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) count += used_bit[clu_bits];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) *ret_count = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }