Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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) }