Lines Matching defs:fatent
42 static void fat12_ent_set_ptr(struct fat_entry *fatent, int offset)
44 struct buffer_head **bhs = fatent->bhs;
45 if (fatent->nr_bhs == 1) {
47 fatent->u.ent12_p[0] = bhs[0]->b_data + offset;
48 fatent->u.ent12_p[1] = bhs[0]->b_data + (offset + 1);
51 fatent->u.ent12_p[0] = bhs[0]->b_data + offset;
52 fatent->u.ent12_p[1] = bhs[1]->b_data;
56 static void fat16_ent_set_ptr(struct fat_entry *fatent, int offset)
59 fatent->u.ent16_p = (__le16 *)(fatent->bhs[0]->b_data + offset);
62 static void fat32_ent_set_ptr(struct fat_entry *fatent, int offset)
65 fatent->u.ent32_p = (__le32 *)(fatent->bhs[0]->b_data + offset);
68 static int fat12_ent_bread(struct super_block *sb, struct fat_entry *fatent,
71 struct buffer_head **bhs = fatent->bhs;
74 fatent->fat_inode = MSDOS_SB(sb)->fat_inode;
81 fatent->nr_bhs = 1;
88 fatent->nr_bhs = 2;
90 fat12_ent_set_ptr(fatent, offset);
101 static int fat_ent_bread(struct super_block *sb, struct fat_entry *fatent,
107 fatent->fat_inode = MSDOS_SB(sb)->fat_inode;
108 fatent->bhs[0] = sb_bread(sb, blocknr);
109 if (!fatent->bhs[0]) {
114 fatent->nr_bhs = 1;
115 ops->ent_set_ptr(fatent, offset);
119 static int fat12_ent_get(struct fat_entry *fatent)
121 u8 **ent12_p = fatent->u.ent12_p;
125 if (fatent->entry & 1)
137 static int fat16_ent_get(struct fat_entry *fatent)
139 int next = le16_to_cpu(*fatent->u.ent16_p);
140 WARN_ON((unsigned long)fatent->u.ent16_p & (2 - 1));
146 static int fat32_ent_get(struct fat_entry *fatent)
148 int next = le32_to_cpu(*fatent->u.ent32_p) & 0x0fffffff;
149 WARN_ON((unsigned long)fatent->u.ent32_p & (4 - 1));
155 static void fat12_ent_put(struct fat_entry *fatent, int new)
157 u8 **ent12_p = fatent->u.ent12_p;
163 if (fatent->entry & 1) {
172 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode);
173 if (fatent->nr_bhs == 2)
174 mark_buffer_dirty_inode(fatent->bhs[1], fatent->fat_inode);
177 static void fat16_ent_put(struct fat_entry *fatent, int new)
182 *fatent->u.ent16_p = cpu_to_le16(new);
183 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode);
186 static void fat32_ent_put(struct fat_entry *fatent, int new)
189 new |= le32_to_cpu(*fatent->u.ent32_p) & ~0x0fffffff;
190 *fatent->u.ent32_p = cpu_to_le32(new);
191 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode);
194 static int fat12_ent_next(struct fat_entry *fatent)
196 u8 **ent12_p = fatent->u.ent12_p;
197 struct buffer_head **bhs = fatent->bhs;
198 u8 *nextp = ent12_p[1] + 1 + (fatent->entry & 1);
200 fatent->entry++;
201 if (fatent->nr_bhs == 1) {
219 fatent->nr_bhs = 1;
227 static int fat16_ent_next(struct fat_entry *fatent)
229 const struct buffer_head *bh = fatent->bhs[0];
230 fatent->entry++;
231 if (fatent->u.ent16_p < (__le16 *)(bh->b_data + (bh->b_size - 2))) {
232 fatent->u.ent16_p++;
235 fatent->u.ent16_p = NULL;
239 static int fat32_ent_next(struct fat_entry *fatent)
241 const struct buffer_head *bh = fatent->bhs[0];
242 fatent->entry++;
243 if (fatent->u.ent32_p < (__le32 *)(bh->b_data + (bh->b_size - 4))) {
244 fatent->u.ent32_p++;
247 fatent->u.ent32_p = NULL;
319 struct fat_entry *fatent,
324 struct buffer_head **bhs = fatent->bhs;
326 /* Is this fatent's blocks including this entry? */
327 if (!fatent->nr_bhs || bhs[0]->b_blocknr != blocknr)
332 if (fatent->nr_bhs == 2) {
334 fatent->nr_bhs = 1;
338 if (fatent->nr_bhs != 2)
344 ops->ent_set_ptr(fatent, offset);
348 int fat_ent_read(struct inode *inode, struct fat_entry *fatent, int entry)
357 fatent_brelse(fatent);
362 fatent_set_entry(fatent, entry);
365 if (!fat_ent_update_ptr(sb, fatent, offset, blocknr)) {
366 fatent_brelse(fatent);
367 err = ops->ent_bread(sb, fatent, offset, blocknr);
371 return ops->ent_get(fatent);
409 int fat_ent_write(struct inode *inode, struct fat_entry *fatent,
416 ops->ent_put(fatent, new);
418 err = fat_sync_bhs(fatent->bhs, fatent->nr_bhs);
422 return fat_mirror_bhs(sb, fatent->bhs, fatent->nr_bhs);
426 struct fat_entry *fatent)
428 if (sbi->fatent_ops->ent_next(fatent)) {
429 if (fatent->entry < sbi->max_cluster)
436 struct fat_entry *fatent)
442 fatent_brelse(fatent);
443 ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr);
444 return ops->ent_bread(sb, fatent, offset, blocknr);
448 struct fat_entry *fatent)
452 for (n = 0; n < fatent->nr_bhs; n++) {
454 if (fatent->bhs[n] == bhs[i])
458 get_bh(fatent->bhs[n]);
459 bhs[i] = fatent->bhs[n];
470 struct fat_entry fatent, prev_ent;
486 fatent_init(&fatent);
487 fatent_set_entry(&fatent, sbi->prev_free + 1);
489 if (fatent.entry >= sbi->max_cluster)
490 fatent.entry = FAT_START_ENT;
491 fatent_set_entry(&fatent, fatent.entry);
492 err = fat_ent_read_block(sb, &fatent);
498 if (ops->ent_get(&fatent) == FAT_ENT_FREE) {
499 int entry = fatent.entry;
502 ops->ent_put(&fatent, FAT_ENT_EOF);
506 fat_collect_bhs(bhs, &nr_bhs, &fatent);
521 prev_ent = fatent;
526 } while (fat_ent_next(sbi, &fatent));
537 fatent_brelse(&fatent);
558 struct fat_entry fatent;
564 fatent_init(&fatent);
567 cluster = fat_ent_read(inode, &fatent, cluster);
584 if (cluster != fatent.entry + 1) {
585 int nr_clus = fatent.entry - first_cl + 1;
596 ops->ent_put(&fatent, FAT_ENT_FREE);
602 if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) {
615 fat_collect_bhs(bhs, &nr_bhs, &fatent);
625 fatent_brelse(&fatent);
647 struct fat_entry *fatent, int ent_limit)
661 if (fatent->entry >= ent_limit)
669 ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr);
683 struct fat_entry *fatent)
695 ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr);
719 struct fat_entry fatent;
728 fatent_init(&fatent);
729 fatent_set_entry(&fatent, FAT_START_ENT);
730 fat_ra_init(sb, &fatent_ra, &fatent, sbi->max_cluster);
731 while (fatent.entry < sbi->max_cluster) {
733 fat_ent_reada(sb, &fatent_ra, &fatent);
735 err = fat_ent_read_block(sb, &fatent);
740 if (ops->ent_get(&fatent) == FAT_ENT_FREE)
742 } while (fat_ent_next(sbi, &fatent));
748 fatent_brelse(&fatent);
766 struct fat_entry fatent;
787 fatent_init(&fatent);
789 fatent_set_entry(&fatent, ent_start);
790 fat_ra_init(sb, &fatent_ra, &fatent, ent_end + 1);
791 while (fatent.entry <= ent_end) {
793 fat_ent_reada(sb, &fatent_ra, &fatent);
795 err = fat_ent_read_block(sb, &fatent);
799 if (ops->ent_get(&fatent) == FAT_ENT_FREE) {
803 u32 clus = fatent.entry - free;
814 } while (fat_ent_next(sbi, &fatent) && fatent.entry <= ent_end);
822 fatent_brelse(&fatent);
830 u32 clus = fatent.entry - free;
841 fatent_brelse(&fatent);