Lines Matching refs:fatent
42 static void fat12_ent_set_ptr(struct fat_entry *fatent, int offset) in fat12_ent_set_ptr() argument
44 struct buffer_head **bhs = fatent->bhs; in fat12_ent_set_ptr()
45 if (fatent->nr_bhs == 1) { in fat12_ent_set_ptr()
47 fatent->u.ent12_p[0] = bhs[0]->b_data + offset; in fat12_ent_set_ptr()
48 fatent->u.ent12_p[1] = bhs[0]->b_data + (offset + 1); in fat12_ent_set_ptr()
51 fatent->u.ent12_p[0] = bhs[0]->b_data + offset; in fat12_ent_set_ptr()
52 fatent->u.ent12_p[1] = bhs[1]->b_data; in fat12_ent_set_ptr()
56 static void fat16_ent_set_ptr(struct fat_entry *fatent, int offset) in fat16_ent_set_ptr() argument
59 fatent->u.ent16_p = (__le16 *)(fatent->bhs[0]->b_data + offset); in fat16_ent_set_ptr()
62 static void fat32_ent_set_ptr(struct fat_entry *fatent, int offset) in fat32_ent_set_ptr() argument
65 fatent->u.ent32_p = (__le32 *)(fatent->bhs[0]->b_data + offset); in fat32_ent_set_ptr()
68 static int fat12_ent_bread(struct super_block *sb, struct fat_entry *fatent, in fat12_ent_bread() argument
71 struct buffer_head **bhs = fatent->bhs; in fat12_ent_bread()
74 fatent->fat_inode = MSDOS_SB(sb)->fat_inode; in fat12_ent_bread()
81 fatent->nr_bhs = 1; in fat12_ent_bread()
88 fatent->nr_bhs = 2; in fat12_ent_bread()
90 fat12_ent_set_ptr(fatent, offset); in fat12_ent_bread()
100 static int fat_ent_bread(struct super_block *sb, struct fat_entry *fatent, in fat_ent_bread() argument
106 fatent->fat_inode = MSDOS_SB(sb)->fat_inode; in fat_ent_bread()
107 fatent->bhs[0] = sb_bread(sb, blocknr); in fat_ent_bread()
108 if (!fatent->bhs[0]) { in fat_ent_bread()
113 fatent->nr_bhs = 1; in fat_ent_bread()
114 ops->ent_set_ptr(fatent, offset); in fat_ent_bread()
118 static int fat12_ent_get(struct fat_entry *fatent) in fat12_ent_get() argument
120 u8 **ent12_p = fatent->u.ent12_p; in fat12_ent_get()
124 if (fatent->entry & 1) in fat12_ent_get()
136 static int fat16_ent_get(struct fat_entry *fatent) in fat16_ent_get() argument
138 int next = le16_to_cpu(*fatent->u.ent16_p); in fat16_ent_get()
139 WARN_ON((unsigned long)fatent->u.ent16_p & (2 - 1)); in fat16_ent_get()
145 static int fat32_ent_get(struct fat_entry *fatent) in fat32_ent_get() argument
147 int next = le32_to_cpu(*fatent->u.ent32_p) & 0x0fffffff; in fat32_ent_get()
148 WARN_ON((unsigned long)fatent->u.ent32_p & (4 - 1)); in fat32_ent_get()
154 static void fat12_ent_put(struct fat_entry *fatent, int new) in fat12_ent_put() argument
156 u8 **ent12_p = fatent->u.ent12_p; in fat12_ent_put()
162 if (fatent->entry & 1) { in fat12_ent_put()
171 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); in fat12_ent_put()
172 if (fatent->nr_bhs == 2) in fat12_ent_put()
173 mark_buffer_dirty_inode(fatent->bhs[1], fatent->fat_inode); in fat12_ent_put()
176 static void fat16_ent_put(struct fat_entry *fatent, int new) in fat16_ent_put() argument
181 *fatent->u.ent16_p = cpu_to_le16(new); in fat16_ent_put()
182 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); in fat16_ent_put()
185 static void fat32_ent_put(struct fat_entry *fatent, int new) in fat32_ent_put() argument
188 new |= le32_to_cpu(*fatent->u.ent32_p) & ~0x0fffffff; in fat32_ent_put()
189 *fatent->u.ent32_p = cpu_to_le32(new); in fat32_ent_put()
190 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); in fat32_ent_put()
193 static int fat12_ent_next(struct fat_entry *fatent) in fat12_ent_next() argument
195 u8 **ent12_p = fatent->u.ent12_p; in fat12_ent_next()
196 struct buffer_head **bhs = fatent->bhs; in fat12_ent_next()
197 u8 *nextp = ent12_p[1] + 1 + (fatent->entry & 1); in fat12_ent_next()
199 fatent->entry++; in fat12_ent_next()
200 if (fatent->nr_bhs == 1) { in fat12_ent_next()
218 fatent->nr_bhs = 1; in fat12_ent_next()
226 static int fat16_ent_next(struct fat_entry *fatent) in fat16_ent_next() argument
228 const struct buffer_head *bh = fatent->bhs[0]; in fat16_ent_next()
229 fatent->entry++; in fat16_ent_next()
230 if (fatent->u.ent16_p < (__le16 *)(bh->b_data + (bh->b_size - 2))) { in fat16_ent_next()
231 fatent->u.ent16_p++; in fat16_ent_next()
234 fatent->u.ent16_p = NULL; in fat16_ent_next()
238 static int fat32_ent_next(struct fat_entry *fatent) in fat32_ent_next() argument
240 const struct buffer_head *bh = fatent->bhs[0]; in fat32_ent_next()
241 fatent->entry++; in fat32_ent_next()
242 if (fatent->u.ent32_p < (__le32 *)(bh->b_data + (bh->b_size - 4))) { in fat32_ent_next()
243 fatent->u.ent32_p++; in fat32_ent_next()
246 fatent->u.ent32_p = NULL; in fat32_ent_next()
320 struct fat_entry *fatent, in fat_ent_update_ptr() argument
325 struct buffer_head **bhs = fatent->bhs; in fat_ent_update_ptr()
328 if (!fatent->nr_bhs || bhs[0]->b_blocknr != blocknr) in fat_ent_update_ptr()
333 if (fatent->nr_bhs == 2) { in fat_ent_update_ptr()
335 fatent->nr_bhs = 1; in fat_ent_update_ptr()
339 if (fatent->nr_bhs != 2) in fat_ent_update_ptr()
345 ops->ent_set_ptr(fatent, offset); in fat_ent_update_ptr()
349 int fat_ent_read(struct inode *inode, struct fat_entry *fatent, int entry) in fat_ent_read() argument
358 fatent_brelse(fatent); in fat_ent_read()
363 fatent_set_entry(fatent, entry); in fat_ent_read()
366 if (!fat_ent_update_ptr(sb, fatent, offset, blocknr)) { in fat_ent_read()
367 fatent_brelse(fatent); in fat_ent_read()
368 err = ops->ent_bread(sb, fatent, offset, blocknr); in fat_ent_read()
372 return ops->ent_get(fatent); in fat_ent_read()
407 int fat_ent_write(struct inode *inode, struct fat_entry *fatent, in fat_ent_write() argument
414 ops->ent_put(fatent, new); in fat_ent_write()
416 err = fat_sync_bhs(fatent->bhs, fatent->nr_bhs); in fat_ent_write()
420 return fat_mirror_bhs(sb, fatent->bhs, fatent->nr_bhs); in fat_ent_write()
424 struct fat_entry *fatent) in fat_ent_next() argument
426 if (sbi->fatent_ops->ent_next(fatent)) { in fat_ent_next()
427 if (fatent->entry < sbi->max_cluster) in fat_ent_next()
434 struct fat_entry *fatent) in fat_ent_read_block() argument
440 fatent_brelse(fatent); in fat_ent_read_block()
441 ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr); in fat_ent_read_block()
442 return ops->ent_bread(sb, fatent, offset, blocknr); in fat_ent_read_block()
446 struct fat_entry *fatent) in fat_collect_bhs() argument
450 for (n = 0; n < fatent->nr_bhs; n++) { in fat_collect_bhs()
452 if (fatent->bhs[n] == bhs[i]) in fat_collect_bhs()
456 get_bh(fatent->bhs[n]); in fat_collect_bhs()
457 bhs[i] = fatent->bhs[n]; in fat_collect_bhs()
468 struct fat_entry fatent, prev_ent; in fat_alloc_clusters() local
484 fatent_init(&fatent); in fat_alloc_clusters()
485 fatent_set_entry(&fatent, sbi->prev_free + 1); in fat_alloc_clusters()
487 if (fatent.entry >= sbi->max_cluster) in fat_alloc_clusters()
488 fatent.entry = FAT_START_ENT; in fat_alloc_clusters()
489 fatent_set_entry(&fatent, fatent.entry); in fat_alloc_clusters()
490 err = fat_ent_read_block(sb, &fatent); in fat_alloc_clusters()
496 if (ops->ent_get(&fatent) == FAT_ENT_FREE) { in fat_alloc_clusters()
497 int entry = fatent.entry; in fat_alloc_clusters()
500 ops->ent_put(&fatent, FAT_ENT_EOF); in fat_alloc_clusters()
504 fat_collect_bhs(bhs, &nr_bhs, &fatent); in fat_alloc_clusters()
519 prev_ent = fatent; in fat_alloc_clusters()
524 } while (fat_ent_next(sbi, &fatent)); in fat_alloc_clusters()
535 fatent_brelse(&fatent); in fat_alloc_clusters()
556 struct fat_entry fatent; in fat_free_clusters() local
562 fatent_init(&fatent); in fat_free_clusters()
565 cluster = fat_ent_read(inode, &fatent, cluster); in fat_free_clusters()
582 if (cluster != fatent.entry + 1) { in fat_free_clusters()
583 int nr_clus = fatent.entry - first_cl + 1; in fat_free_clusters()
594 ops->ent_put(&fatent, FAT_ENT_FREE); in fat_free_clusters()
600 if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) { in fat_free_clusters()
613 fat_collect_bhs(bhs, &nr_bhs, &fatent); in fat_free_clusters()
623 fatent_brelse(&fatent); in fat_free_clusters()
637 static void fat_ent_reada(struct super_block *sb, struct fat_entry *fatent, in fat_ent_reada() argument
644 ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr); in fat_ent_reada()
654 struct fat_entry fatent; in fat_count_free_clusters() local
667 fatent_init(&fatent); in fat_count_free_clusters()
668 fatent_set_entry(&fatent, FAT_START_ENT); in fat_count_free_clusters()
669 while (fatent.entry < sbi->max_cluster) { in fat_count_free_clusters()
673 fat_ent_reada(sb, &fatent, min(reada_blocks, rest)); in fat_count_free_clusters()
677 err = fat_ent_read_block(sb, &fatent); in fat_count_free_clusters()
682 if (ops->ent_get(&fatent) == FAT_ENT_FREE) in fat_count_free_clusters()
684 } while (fat_ent_next(sbi, &fatent)); in fat_count_free_clusters()
690 fatent_brelse(&fatent); in fat_count_free_clusters()
708 struct fat_entry fatent; in fat_trim_fs() local
732 fatent_init(&fatent); in fat_trim_fs()
734 fatent_set_entry(&fatent, ent_start); in fat_trim_fs()
735 while (fatent.entry <= ent_end) { in fat_trim_fs()
739 fat_ent_reada(sb, &fatent, min(reada_blocks, rest)); in fat_trim_fs()
743 err = fat_ent_read_block(sb, &fatent); in fat_trim_fs()
747 if (ops->ent_get(&fatent) == FAT_ENT_FREE) { in fat_trim_fs()
751 u32 clus = fatent.entry - free; in fat_trim_fs()
762 } while (fat_ent_next(sbi, &fatent) && fatent.entry <= ent_end); in fat_trim_fs()
770 fatent_brelse(&fatent); in fat_trim_fs()
778 u32 clus = fatent.entry - free; in fat_trim_fs()
789 fatent_brelse(&fatent); in fat_trim_fs()