Lines Matching refs:fatent
41 static void fat12_ent_set_ptr(struct fat_entry *fatent, int offset) in fat12_ent_set_ptr() argument
43 struct buffer_head **bhs = fatent->bhs; in fat12_ent_set_ptr()
44 if (fatent->nr_bhs == 1) { in fat12_ent_set_ptr()
46 fatent->u.ent12_p[0] = bhs[0]->b_data + offset; in fat12_ent_set_ptr()
47 fatent->u.ent12_p[1] = bhs[0]->b_data + (offset + 1); in fat12_ent_set_ptr()
50 fatent->u.ent12_p[0] = bhs[0]->b_data + offset; in fat12_ent_set_ptr()
51 fatent->u.ent12_p[1] = bhs[1]->b_data; in fat12_ent_set_ptr()
55 static void fat16_ent_set_ptr(struct fat_entry *fatent, int offset) in fat16_ent_set_ptr() argument
58 fatent->u.ent16_p = (__le16 *)(fatent->bhs[0]->b_data + offset); in fat16_ent_set_ptr()
61 static void fat32_ent_set_ptr(struct fat_entry *fatent, int offset) in fat32_ent_set_ptr() argument
64 fatent->u.ent32_p = (__le32 *)(fatent->bhs[0]->b_data + offset); in fat32_ent_set_ptr()
67 static int fat12_ent_bread(struct super_block *sb, struct fat_entry *fatent, in fat12_ent_bread() argument
70 struct buffer_head **bhs = fatent->bhs; in fat12_ent_bread()
73 fatent->fat_inode = MSDOS_SB(sb)->fat_inode; in fat12_ent_bread()
80 fatent->nr_bhs = 1; in fat12_ent_bread()
87 fatent->nr_bhs = 2; in fat12_ent_bread()
89 fat12_ent_set_ptr(fatent, offset); in fat12_ent_bread()
99 static int fat_ent_bread(struct super_block *sb, struct fat_entry *fatent, in fat_ent_bread() argument
105 fatent->fat_inode = MSDOS_SB(sb)->fat_inode; in fat_ent_bread()
106 fatent->bhs[0] = sb_bread(sb, blocknr); in fat_ent_bread()
107 if (!fatent->bhs[0]) { in fat_ent_bread()
112 fatent->nr_bhs = 1; in fat_ent_bread()
113 ops->ent_set_ptr(fatent, offset); in fat_ent_bread()
117 static int fat12_ent_get(struct fat_entry *fatent) in fat12_ent_get() argument
119 u8 **ent12_p = fatent->u.ent12_p; in fat12_ent_get()
123 if (fatent->entry & 1) in fat12_ent_get()
135 static int fat16_ent_get(struct fat_entry *fatent) in fat16_ent_get() argument
137 int next = le16_to_cpu(*fatent->u.ent16_p); in fat16_ent_get()
138 WARN_ON((unsigned long)fatent->u.ent16_p & (2 - 1)); in fat16_ent_get()
144 static int fat32_ent_get(struct fat_entry *fatent) in fat32_ent_get() argument
146 int next = le32_to_cpu(*fatent->u.ent32_p) & 0x0fffffff; in fat32_ent_get()
147 WARN_ON((unsigned long)fatent->u.ent32_p & (4 - 1)); in fat32_ent_get()
153 static void fat12_ent_put(struct fat_entry *fatent, int new) in fat12_ent_put() argument
155 u8 **ent12_p = fatent->u.ent12_p; in fat12_ent_put()
161 if (fatent->entry & 1) { in fat12_ent_put()
170 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); in fat12_ent_put()
171 if (fatent->nr_bhs == 2) in fat12_ent_put()
172 mark_buffer_dirty_inode(fatent->bhs[1], fatent->fat_inode); in fat12_ent_put()
175 static void fat16_ent_put(struct fat_entry *fatent, int new) in fat16_ent_put() argument
180 *fatent->u.ent16_p = cpu_to_le16(new); in fat16_ent_put()
181 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); in fat16_ent_put()
184 static void fat32_ent_put(struct fat_entry *fatent, int new) in fat32_ent_put() argument
187 new |= le32_to_cpu(*fatent->u.ent32_p) & ~0x0fffffff; in fat32_ent_put()
188 *fatent->u.ent32_p = cpu_to_le32(new); in fat32_ent_put()
189 mark_buffer_dirty_inode(fatent->bhs[0], fatent->fat_inode); in fat32_ent_put()
192 static int fat12_ent_next(struct fat_entry *fatent) in fat12_ent_next() argument
194 u8 **ent12_p = fatent->u.ent12_p; in fat12_ent_next()
195 struct buffer_head **bhs = fatent->bhs; in fat12_ent_next()
196 u8 *nextp = ent12_p[1] + 1 + (fatent->entry & 1); in fat12_ent_next()
198 fatent->entry++; in fat12_ent_next()
199 if (fatent->nr_bhs == 1) { in fat12_ent_next()
217 fatent->nr_bhs = 1; in fat12_ent_next()
225 static int fat16_ent_next(struct fat_entry *fatent) in fat16_ent_next() argument
227 const struct buffer_head *bh = fatent->bhs[0]; in fat16_ent_next()
228 fatent->entry++; in fat16_ent_next()
229 if (fatent->u.ent16_p < (__le16 *)(bh->b_data + (bh->b_size - 2))) { in fat16_ent_next()
230 fatent->u.ent16_p++; in fat16_ent_next()
233 fatent->u.ent16_p = NULL; in fat16_ent_next()
237 static int fat32_ent_next(struct fat_entry *fatent) in fat32_ent_next() argument
239 const struct buffer_head *bh = fatent->bhs[0]; in fat32_ent_next()
240 fatent->entry++; in fat32_ent_next()
241 if (fatent->u.ent32_p < (__le32 *)(bh->b_data + (bh->b_size - 4))) { in fat32_ent_next()
242 fatent->u.ent32_p++; in fat32_ent_next()
245 fatent->u.ent32_p = NULL; in fat32_ent_next()
319 struct fat_entry *fatent, in fat_ent_update_ptr() argument
324 struct buffer_head **bhs = fatent->bhs; in fat_ent_update_ptr()
327 if (!fatent->nr_bhs || bhs[0]->b_blocknr != blocknr) in fat_ent_update_ptr()
332 if (fatent->nr_bhs == 2) { in fat_ent_update_ptr()
334 fatent->nr_bhs = 1; in fat_ent_update_ptr()
338 if (fatent->nr_bhs != 2) in fat_ent_update_ptr()
344 ops->ent_set_ptr(fatent, offset); in fat_ent_update_ptr()
348 int fat_ent_read(struct inode *inode, struct fat_entry *fatent, int entry) in fat_ent_read() argument
357 fatent_brelse(fatent); in fat_ent_read()
362 fatent_set_entry(fatent, entry); in fat_ent_read()
365 if (!fat_ent_update_ptr(sb, fatent, offset, blocknr)) { in fat_ent_read()
366 fatent_brelse(fatent); in fat_ent_read()
367 err = ops->ent_bread(sb, fatent, offset, blocknr); in fat_ent_read()
371 return ops->ent_get(fatent); in fat_ent_read()
406 int fat_ent_write(struct inode *inode, struct fat_entry *fatent, in fat_ent_write() argument
413 ops->ent_put(fatent, new); in fat_ent_write()
415 err = fat_sync_bhs(fatent->bhs, fatent->nr_bhs); in fat_ent_write()
419 return fat_mirror_bhs(sb, fatent->bhs, fatent->nr_bhs); in fat_ent_write()
423 struct fat_entry *fatent) in fat_ent_next() argument
425 if (sbi->fatent_ops->ent_next(fatent)) { in fat_ent_next()
426 if (fatent->entry < sbi->max_cluster) in fat_ent_next()
433 struct fat_entry *fatent) in fat_ent_read_block() argument
439 fatent_brelse(fatent); in fat_ent_read_block()
440 ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr); in fat_ent_read_block()
441 return ops->ent_bread(sb, fatent, offset, blocknr); in fat_ent_read_block()
445 struct fat_entry *fatent) in fat_collect_bhs() argument
449 for (n = 0; n < fatent->nr_bhs; n++) { in fat_collect_bhs()
451 if (fatent->bhs[n] == bhs[i]) in fat_collect_bhs()
455 get_bh(fatent->bhs[n]); in fat_collect_bhs()
456 bhs[i] = fatent->bhs[n]; in fat_collect_bhs()
467 struct fat_entry fatent, prev_ent; in fat_alloc_clusters() local
483 fatent_init(&fatent); in fat_alloc_clusters()
484 fatent_set_entry(&fatent, sbi->prev_free + 1); in fat_alloc_clusters()
486 if (fatent.entry >= sbi->max_cluster) in fat_alloc_clusters()
487 fatent.entry = FAT_START_ENT; in fat_alloc_clusters()
488 fatent_set_entry(&fatent, fatent.entry); in fat_alloc_clusters()
489 err = fat_ent_read_block(sb, &fatent); in fat_alloc_clusters()
495 if (ops->ent_get(&fatent) == FAT_ENT_FREE) { in fat_alloc_clusters()
496 int entry = fatent.entry; in fat_alloc_clusters()
499 ops->ent_put(&fatent, FAT_ENT_EOF); in fat_alloc_clusters()
503 fat_collect_bhs(bhs, &nr_bhs, &fatent); in fat_alloc_clusters()
518 prev_ent = fatent; in fat_alloc_clusters()
523 } while (fat_ent_next(sbi, &fatent)); in fat_alloc_clusters()
534 fatent_brelse(&fatent); in fat_alloc_clusters()
555 struct fat_entry fatent; in fat_free_clusters() local
561 fatent_init(&fatent); in fat_free_clusters()
564 cluster = fat_ent_read(inode, &fatent, cluster); in fat_free_clusters()
581 if (cluster != fatent.entry + 1) { in fat_free_clusters()
582 int nr_clus = fatent.entry - first_cl + 1; in fat_free_clusters()
593 ops->ent_put(&fatent, FAT_ENT_FREE); in fat_free_clusters()
599 if (nr_bhs + fatent.nr_bhs > MAX_BUF_PER_PAGE) { in fat_free_clusters()
612 fat_collect_bhs(bhs, &nr_bhs, &fatent); in fat_free_clusters()
622 fatent_brelse(&fatent); in fat_free_clusters()
636 static void fat_ent_reada(struct super_block *sb, struct fat_entry *fatent, in fat_ent_reada() argument
643 ops->ent_blocknr(sb, fatent->entry, &offset, &blocknr); in fat_ent_reada()
653 struct fat_entry fatent; in fat_count_free_clusters() local
666 fatent_init(&fatent); in fat_count_free_clusters()
667 fatent_set_entry(&fatent, FAT_START_ENT); in fat_count_free_clusters()
668 while (fatent.entry < sbi->max_cluster) { in fat_count_free_clusters()
672 fat_ent_reada(sb, &fatent, min(reada_blocks, rest)); in fat_count_free_clusters()
676 err = fat_ent_read_block(sb, &fatent); in fat_count_free_clusters()
681 if (ops->ent_get(&fatent) == FAT_ENT_FREE) in fat_count_free_clusters()
683 } while (fat_ent_next(sbi, &fatent)); in fat_count_free_clusters()
688 fatent_brelse(&fatent); in fat_count_free_clusters()