1 // SPDX-License-Identifier: GPL-2.0-or-later 1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 2 /* 3 * Copyright (C) 2012-2013 Samsung Electronic 3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. 4 */ 4 */ 5 5 6 #include <linux/blkdev.h> 6 #include <linux/blkdev.h> 7 #include <linux/slab.h> 7 #include <linux/slab.h> 8 #include <linux/bitmap.h> << 9 #include <linux/buffer_head.h> 8 #include <linux/buffer_head.h> 10 9 11 #include "exfat_raw.h" 10 #include "exfat_raw.h" 12 #include "exfat_fs.h" 11 #include "exfat_fs.h" 13 12 14 #if BITS_PER_LONG == 32 !! 13 static const unsigned char free_bit[] = { 15 #define __le_long __le32 !! 14 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2,/* 0 ~ 19*/ 16 #define lel_to_cpu(A) le32_to_cpu(A) !! 15 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3,/* 20 ~ 39*/ 17 #define cpu_to_lel(A) cpu_to_le32(A) !! 16 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/* 40 ~ 59*/ 18 #elif BITS_PER_LONG == 64 !! 17 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,/* 60 ~ 79*/ 19 #define __le_long __le64 !! 18 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2,/* 80 ~ 99*/ 20 #define lel_to_cpu(A) le64_to_cpu(A) !! 19 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3,/*100 ~ 119*/ 21 #define cpu_to_lel(A) cpu_to_le64(A) !! 20 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/*120 ~ 139*/ 22 #else !! 21 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,/*140 ~ 159*/ 23 #error "BITS_PER_LONG not 32 or 64" !! 22 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2,/*160 ~ 179*/ 24 #endif !! 23 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3,/*180 ~ 199*/ >> 24 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/*200 ~ 219*/ >> 25 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,/*220 ~ 239*/ >> 26 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /*240 ~ 254*/ >> 27 }; >> 28 >> 29 static const unsigned char used_bit[] = { >> 30 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3,/* 0 ~ 19*/ >> 31 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4,/* 20 ~ 39*/ >> 32 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,/* 40 ~ 59*/ >> 33 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,/* 60 ~ 79*/ >> 34 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,/* 80 ~ 99*/ >> 35 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,/*100 ~ 119*/ >> 36 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,/*120 ~ 139*/ >> 37 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,/*140 ~ 159*/ >> 38 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,/*160 ~ 179*/ >> 39 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,/*180 ~ 199*/ >> 40 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6,/*200 ~ 219*/ >> 41 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,/*220 ~ 239*/ >> 42 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 /*240 ~ 255*/ >> 43 }; 25 44 26 /* 45 /* 27 * Allocation Bitmap Management Functions 46 * Allocation Bitmap Management Functions 28 */ 47 */ 29 static int exfat_allocate_bitmap(struct super_ 48 static int exfat_allocate_bitmap(struct super_block *sb, 30 struct exfat_dentry *ep) 49 struct exfat_dentry *ep) 31 { 50 { 32 struct exfat_sb_info *sbi = EXFAT_SB(s 51 struct exfat_sb_info *sbi = EXFAT_SB(sb); 33 long long map_size; 52 long long map_size; 34 unsigned int i, need_map_size; 53 unsigned int i, need_map_size; 35 sector_t sector; 54 sector_t sector; 36 55 37 sbi->map_clu = le32_to_cpu(ep->dentry. 56 sbi->map_clu = le32_to_cpu(ep->dentry.bitmap.start_clu); 38 map_size = le64_to_cpu(ep->dentry.bitm 57 map_size = le64_to_cpu(ep->dentry.bitmap.size); 39 need_map_size = ((EXFAT_DATA_CLUSTER_C 58 need_map_size = ((EXFAT_DATA_CLUSTER_COUNT(sbi) - 1) / BITS_PER_BYTE) 40 + 1; 59 + 1; 41 if (need_map_size != map_size) { 60 if (need_map_size != map_size) { 42 exfat_err(sb, "bogus allocatio !! 61 exfat_msg(sb, KERN_ERR, 43 need_map_size, map_s !! 62 "bogus allocation bitmap size(need : %u, cur : %lld)", >> 63 need_map_size, map_size); 44 /* 64 /* 45 * Only allowed when bogus all 65 * Only allowed when bogus allocation 46 * bitmap size is large 66 * bitmap size is large 47 */ 67 */ 48 if (need_map_size > map_size) 68 if (need_map_size > map_size) 49 return -EIO; 69 return -EIO; 50 } 70 } 51 sbi->map_sectors = ((need_map_size - 1 71 sbi->map_sectors = ((need_map_size - 1) >> 52 (sb->s_blocksize_bits) 72 (sb->s_blocksize_bits)) + 1; 53 sbi->vol_amap = kvmalloc_array(sbi->ma !! 73 sbi->vol_amap = kmalloc_array(sbi->map_sectors, 54 sizeof(struct 74 sizeof(struct buffer_head *), GFP_KERNEL); 55 if (!sbi->vol_amap) 75 if (!sbi->vol_amap) 56 return -ENOMEM; 76 return -ENOMEM; 57 77 58 sector = exfat_cluster_to_sector(sbi, 78 sector = exfat_cluster_to_sector(sbi, sbi->map_clu); 59 for (i = 0; i < sbi->map_sectors; i++) 79 for (i = 0; i < sbi->map_sectors; i++) { 60 sbi->vol_amap[i] = sb_bread(sb 80 sbi->vol_amap[i] = sb_bread(sb, sector + i); 61 if (!sbi->vol_amap[i]) { 81 if (!sbi->vol_amap[i]) { 62 /* release all buffers 82 /* release all buffers and free vol_amap */ 63 int j = 0; 83 int j = 0; 64 84 65 while (j < i) 85 while (j < i) 66 brelse(sbi->vo 86 brelse(sbi->vol_amap[j++]); 67 87 68 kvfree(sbi->vol_amap); !! 88 kfree(sbi->vol_amap); 69 sbi->vol_amap = NULL; 89 sbi->vol_amap = NULL; 70 return -EIO; 90 return -EIO; 71 } 91 } 72 } 92 } 73 93 74 return 0; 94 return 0; 75 } 95 } 76 96 77 int exfat_load_bitmap(struct super_block *sb) 97 int exfat_load_bitmap(struct super_block *sb) 78 { 98 { 79 unsigned int i, type; 99 unsigned int i, type; 80 struct exfat_chain clu; 100 struct exfat_chain clu; 81 struct exfat_sb_info *sbi = EXFAT_SB(s 101 struct exfat_sb_info *sbi = EXFAT_SB(sb); 82 102 83 exfat_chain_set(&clu, sbi->root_dir, 0 103 exfat_chain_set(&clu, sbi->root_dir, 0, ALLOC_FAT_CHAIN); 84 while (clu.dir != EXFAT_EOF_CLUSTER) { 104 while (clu.dir != EXFAT_EOF_CLUSTER) { 85 for (i = 0; i < sbi->dentries_ 105 for (i = 0; i < sbi->dentries_per_clu; i++) { 86 struct exfat_dentry *e 106 struct exfat_dentry *ep; 87 struct buffer_head *bh 107 struct buffer_head *bh; 88 108 89 ep = exfat_get_dentry( !! 109 ep = exfat_get_dentry(sb, &clu, i, &bh, NULL); 90 if (!ep) 110 if (!ep) 91 return -EIO; 111 return -EIO; 92 112 93 type = exfat_get_entry 113 type = exfat_get_entry_type(ep); 94 if (type == TYPE_UNUSE 114 if (type == TYPE_UNUSED) 95 break; 115 break; 96 if (type != TYPE_BITMA 116 if (type != TYPE_BITMAP) 97 continue; 117 continue; 98 if (ep->dentry.bitmap. 118 if (ep->dentry.bitmap.flags == 0x0) { 99 int err; 119 int err; 100 120 101 err = exfat_al 121 err = exfat_allocate_bitmap(sb, ep); 102 brelse(bh); 122 brelse(bh); 103 return err; 123 return err; 104 } 124 } 105 brelse(bh); 125 brelse(bh); 106 } 126 } 107 127 108 if (exfat_get_next_cluster(sb, 128 if (exfat_get_next_cluster(sb, &clu.dir)) 109 return -EIO; 129 return -EIO; 110 } 130 } 111 131 112 return -EINVAL; 132 return -EINVAL; 113 } 133 } 114 134 115 void exfat_free_bitmap(struct exfat_sb_info *s 135 void exfat_free_bitmap(struct exfat_sb_info *sbi) 116 { 136 { 117 int i; 137 int i; 118 138 119 for (i = 0; i < sbi->map_sectors; i++) 139 for (i = 0; i < sbi->map_sectors; i++) 120 __brelse(sbi->vol_amap[i]); 140 __brelse(sbi->vol_amap[i]); 121 141 122 kvfree(sbi->vol_amap); !! 142 kfree(sbi->vol_amap); 123 } 143 } 124 144 125 int exfat_set_bitmap(struct inode *inode, unsi !! 145 /* >> 146 * If the value of "clu" is 0, it means cluster 2 which is the first cluster of >> 147 * the cluster heap. >> 148 */ >> 149 int exfat_set_bitmap(struct inode *inode, unsigned int clu) 126 { 150 { 127 int i, b; 151 int i, b; 128 unsigned int ent_idx; 152 unsigned int ent_idx; 129 struct super_block *sb = inode->i_sb; 153 struct super_block *sb = inode->i_sb; 130 struct exfat_sb_info *sbi = EXFAT_SB(s 154 struct exfat_sb_info *sbi = EXFAT_SB(sb); 131 155 132 if (!is_valid_cluster(sbi, clu)) !! 156 WARN_ON(clu < EXFAT_FIRST_CLUSTER); 133 return -EINVAL; << 134 << 135 ent_idx = CLUSTER_TO_BITMAP_ENT(clu); 157 ent_idx = CLUSTER_TO_BITMAP_ENT(clu); 136 i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent 158 i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx); 137 b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, en 159 b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, ent_idx); 138 160 139 set_bit_le(b, sbi->vol_amap[i]->b_data 161 set_bit_le(b, sbi->vol_amap[i]->b_data); 140 exfat_update_bh(sbi->vol_amap[i], sync !! 162 exfat_update_bh(sb, sbi->vol_amap[i], IS_DIRSYNC(inode)); 141 return 0; 163 return 0; 142 } 164 } 143 165 144 void exfat_clear_bitmap(struct inode *inode, u !! 166 /* >> 167 * If the value of "clu" is 0, it means cluster 2 which is the first cluster of >> 168 * the cluster heap. >> 169 */ >> 170 void exfat_clear_bitmap(struct inode *inode, unsigned int clu) 145 { 171 { 146 int i, b; 172 int i, b; 147 unsigned int ent_idx; 173 unsigned int ent_idx; 148 struct super_block *sb = inode->i_sb; 174 struct super_block *sb = inode->i_sb; 149 struct exfat_sb_info *sbi = EXFAT_SB(s 175 struct exfat_sb_info *sbi = EXFAT_SB(sb); 150 struct exfat_mount_options *opts = &sb 176 struct exfat_mount_options *opts = &sbi->options; 151 177 152 if (!is_valid_cluster(sbi, clu)) !! 178 WARN_ON(clu < EXFAT_FIRST_CLUSTER); 153 return; << 154 << 155 ent_idx = CLUSTER_TO_BITMAP_ENT(clu); 179 ent_idx = CLUSTER_TO_BITMAP_ENT(clu); 156 i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent 180 i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx); 157 b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, en 181 b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, ent_idx); 158 182 159 clear_bit_le(b, sbi->vol_amap[i]->b_da 183 clear_bit_le(b, sbi->vol_amap[i]->b_data); 160 exfat_update_bh(sbi->vol_amap[i], sync !! 184 exfat_update_bh(sb, sbi->vol_amap[i], IS_DIRSYNC(inode)); 161 185 162 if (opts->discard) { 186 if (opts->discard) { 163 int ret_discard; 187 int ret_discard; 164 188 165 ret_discard = sb_issue_discard 189 ret_discard = sb_issue_discard(sb, 166 exfat_cluster_to_secto !! 190 exfat_cluster_to_sector(sbi, clu + >> 191 EXFAT_RESERVED_CLUSTERS), 167 (1 << sbi->sect_per_cl 192 (1 << sbi->sect_per_clus_bits), GFP_NOFS, 0); 168 193 169 if (ret_discard == -EOPNOTSUPP 194 if (ret_discard == -EOPNOTSUPP) { 170 exfat_err(sb, "discard !! 195 exfat_msg(sb, KERN_ERR, >> 196 "discard not supported by device, disabling"); 171 opts->discard = 0; 197 opts->discard = 0; 172 } 198 } 173 } 199 } 174 } 200 } 175 201 176 /* 202 /* 177 * If the value of "clu" is 0, it means cluste 203 * If the value of "clu" is 0, it means cluster 2 which is the first cluster of 178 * the cluster heap. 204 * the cluster heap. 179 */ 205 */ 180 unsigned int exfat_find_free_bitmap(struct sup 206 unsigned int exfat_find_free_bitmap(struct super_block *sb, unsigned int clu) 181 { 207 { 182 unsigned int i, map_i, map_b, ent_idx; 208 unsigned int i, map_i, map_b, ent_idx; 183 unsigned int clu_base, clu_free; 209 unsigned int clu_base, clu_free; 184 unsigned long clu_bits, clu_mask; !! 210 unsigned char k, clu_mask; 185 struct exfat_sb_info *sbi = EXFAT_SB(s 211 struct exfat_sb_info *sbi = EXFAT_SB(sb); 186 __le_long bitval; << 187 212 188 WARN_ON(clu < EXFAT_FIRST_CLUSTER); 213 WARN_ON(clu < EXFAT_FIRST_CLUSTER); 189 ent_idx = ALIGN_DOWN(CLUSTER_TO_BITMAP !! 214 ent_idx = CLUSTER_TO_BITMAP_ENT(clu); 190 clu_base = BITMAP_ENT_TO_CLUSTER(ent_i !! 215 clu_base = BITMAP_ENT_TO_CLUSTER(ent_idx & ~(BITS_PER_BYTE_MASK)); 191 clu_mask = IGNORED_BITS_REMAINED(clu, 216 clu_mask = IGNORED_BITS_REMAINED(clu, clu_base); 192 217 193 map_i = BITMAP_OFFSET_SECTOR_INDEX(sb, 218 map_i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx); 194 map_b = BITMAP_OFFSET_BYTE_IN_SECTOR(s 219 map_b = BITMAP_OFFSET_BYTE_IN_SECTOR(sb, ent_idx); 195 220 196 for (i = EXFAT_FIRST_CLUSTER; i < sbi- 221 for (i = EXFAT_FIRST_CLUSTER; i < sbi->num_clusters; 197 i += BITS_PER_LONG) { !! 222 i += BITS_PER_BYTE) { 198 bitval = *(__le_long *)(sbi->v !! 223 k = *(sbi->vol_amap[map_i]->b_data + map_b); 199 if (clu_mask > 0) { 224 if (clu_mask > 0) { 200 bitval |= cpu_to_lel(c !! 225 k |= clu_mask; 201 clu_mask = 0; 226 clu_mask = 0; 202 } 227 } 203 if (lel_to_cpu(bitval) != ULON !! 228 if (k < 0xFF) { 204 clu_bits = lel_to_cpu( !! 229 clu_free = clu_base + free_bit[k]; 205 clu_free = clu_base + << 206 if (clu_free < sbi->nu 230 if (clu_free < sbi->num_clusters) 207 return clu_fre 231 return clu_free; 208 } 232 } 209 clu_base += BITS_PER_LONG; !! 233 clu_base += BITS_PER_BYTE; 210 map_b += sizeof(long); << 211 234 212 if (map_b >= sb->s_blocksize | !! 235 if (++map_b >= sb->s_blocksize || 213 clu_base >= sbi->num_clust 236 clu_base >= sbi->num_clusters) { 214 if (++map_i >= sbi->ma 237 if (++map_i >= sbi->map_sectors) { 215 clu_base = EXF 238 clu_base = EXFAT_FIRST_CLUSTER; 216 map_i = 0; 239 map_i = 0; 217 } 240 } 218 map_b = 0; 241 map_b = 0; 219 } 242 } 220 } 243 } 221 244 222 return EXFAT_EOF_CLUSTER; 245 return EXFAT_EOF_CLUSTER; 223 } 246 } 224 247 225 int exfat_count_used_clusters(struct super_blo 248 int exfat_count_used_clusters(struct super_block *sb, unsigned int *ret_count) 226 { 249 { 227 struct exfat_sb_info *sbi = EXFAT_SB(s 250 struct exfat_sb_info *sbi = EXFAT_SB(sb); 228 unsigned int count = 0; 251 unsigned int count = 0; 229 unsigned int i, map_i = 0, map_b = 0; 252 unsigned int i, map_i = 0, map_b = 0; 230 unsigned int total_clus = EXFAT_DATA_C 253 unsigned int total_clus = EXFAT_DATA_CLUSTER_COUNT(sbi); 231 unsigned int last_mask = total_clus & !! 254 unsigned int last_mask = total_clus & BITS_PER_BYTE_MASK; 232 unsigned long *bitmap, clu_bits; !! 255 unsigned char clu_bits; >> 256 const unsigned char last_bit_mask[] = {0, 0b00000001, 0b00000011, >> 257 0b00000111, 0b00001111, 0b00011111, 0b00111111, 0b01111111}; 233 258 234 total_clus &= ~last_mask; 259 total_clus &= ~last_mask; 235 for (i = 0; i < total_clus; i += BITS_ !! 260 for (i = 0; i < total_clus; i += BITS_PER_BYTE) { 236 bitmap = (void *)(sbi->vol_ama !! 261 clu_bits = *(sbi->vol_amap[map_i]->b_data + map_b); 237 count += hweight_long(*bitmap) !! 262 count += used_bit[clu_bits]; 238 map_b += sizeof(long); !! 263 if (++map_b >= (unsigned int)sb->s_blocksize) { 239 if (map_b >= (unsigned int)sb- << 240 map_i++; 264 map_i++; 241 map_b = 0; 265 map_b = 0; 242 } 266 } 243 } 267 } 244 268 245 if (last_mask) { 269 if (last_mask) { 246 bitmap = (void *)(sbi->vol_ama !! 270 clu_bits = *(sbi->vol_amap[map_i]->b_data + map_b); 247 clu_bits = lel_to_cpu(*(__le_l !! 271 clu_bits &= last_bit_mask[last_mask]; 248 count += hweight_long(clu_bits !! 272 count += used_bit[clu_bits]; 249 } 273 } 250 274 251 *ret_count = count; 275 *ret_count = count; 252 return 0; 276 return 0; 253 } << 254 << 255 int exfat_trim_fs(struct inode *inode, struct << 256 { << 257 unsigned int trim_begin, trim_end, cou << 258 u64 clu_start, clu_end, trim_minlen, t << 259 struct super_block *sb = inode->i_sb; << 260 struct exfat_sb_info *sbi = EXFAT_SB(s << 261 int err = 0; << 262 << 263 clu_start = max_t(u64, range->start >> << 264 EXFAT_FIRST_CL << 265 clu_end = clu_start + (range->len >> s << 266 trim_minlen = range->minlen >> sbi->cl << 267 << 268 if (clu_start >= sbi->num_clusters || << 269 return -EINVAL; << 270 << 271 if (clu_end >= sbi->num_clusters) << 272 clu_end = sbi->num_clusters - << 273 << 274 mutex_lock(&sbi->bitmap_lock); << 275 << 276 trim_begin = trim_end = exfat_find_fre << 277 if (trim_begin == EXFAT_EOF_CLUSTER) << 278 goto unlock; << 279 << 280 next_free_clu = exfat_find_free_bitmap << 281 if (next_free_clu == EXFAT_EOF_CLUSTER << 282 goto unlock; << 283 << 284 do { << 285 if (next_free_clu == trim_end << 286 /* extend trim range f << 287 trim_end++; << 288 } else { << 289 /* trim current range << 290 count = trim_end - tri << 291 if (count >= trim_minl << 292 err = sb_issue << 293 exfat_ << 294 count << 295 if (err) << 296 goto u << 297 << 298 trimmed_total << 299 } << 300 << 301 /* set next start poin << 302 trim_begin = trim_end << 303 } << 304 << 305 if (next_free_clu >= clu_end) << 306 break; << 307 << 308 if (fatal_signal_pending(curre << 309 err = -ERESTARTSYS; << 310 goto unlock; << 311 } << 312 << 313 next_free_clu = exfat_find_fre << 314 } while (next_free_clu != EXFAT_EOF_CL << 315 next_free_clu > trim_e << 316 << 317 /* try to trim remainder */ << 318 count = trim_end - trim_begin + 1; << 319 if (count >= trim_minlen) { << 320 err = sb_issue_discard(sb, exf << 321 count * sbi->sect_per_ << 322 if (err) << 323 goto unlock; << 324 << 325 trimmed_total += count; << 326 } << 327 << 328 unlock: << 329 mutex_unlock(&sbi->bitmap_lock); << 330 range->len = trimmed_total << sbi->clu << 331 << 332 return err; << 333 } 277 } 334 278
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.