This source file includes following definitions.
- file_ino
- dir_ino
- ino_secno
- ino_is_dir
- local_to_gmt
- hpfs_read_super
- check_warn
- zerop
- parse_opts
- hpfs_read_inode
- hpfs_put_super
- hpfs_statfs
- hpfs_remount_fs
- count_dnodes
- count_bitmap
- count_one_bitmap
- hpfs_file_read
- choose_conv
- convcpy_tofs
- hpfs_bmap
- bplus_lookup
- hpfs_lookup
- memcasecmp
- map_dirent
- hpfs_readdir
- write_one_dirent
- map_pos_dirent
- dir_subdno
- map_nth_dirent
- hpfs_dir_read
- fnode_dno
- map_fnode
- map_anode
- map_dnode
- map_sector
- map_4sectors
- brelse4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <linux/fs.h>
16 #include <linux/hpfs_fs.h>
17 #include <linux/errno.h>
18 #include <linux/malloc.h>
19 #include <linux/kernel.h>
20 #include <linux/sched.h>
21 #include <linux/locks.h>
22 #include <linux/stat.h>
23 #include <linux/string.h>
24 #include <asm/bitops.h>
25 #include <asm/segment.h>
26
27 #include "hpfs.h"
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120 #define little_ushort(x) (*(unsigned short *) &(x))
121 typedef void nonconst;
122
123
124
125 static void hpfs_read_inode(struct inode *);
126 static void hpfs_put_super(struct super_block *);
127 static void hpfs_statfs(struct super_block *, struct statfs *);
128 static int hpfs_remount_fs(struct super_block *, int *, char *);
129
130 static const struct super_operations hpfs_sops =
131 {
132 hpfs_read_inode,
133 NULL,
134 NULL,
135 NULL,
136 hpfs_put_super,
137 NULL,
138 hpfs_statfs,
139 hpfs_remount_fs,
140 };
141
142
143
144 static int hpfs_file_read(struct inode *, struct file *, char *, int);
145 static secno hpfs_bmap(struct inode *, unsigned);
146
147 static const struct file_operations hpfs_file_ops =
148 {
149 NULL,
150 hpfs_file_read,
151 NULL,
152 NULL,
153 NULL,
154 NULL,
155 generic_mmap,
156 NULL,
157 NULL,
158 file_fsync,
159 };
160
161 static const struct inode_operations hpfs_file_iops =
162 {
163 (nonconst *) & hpfs_file_ops,
164 NULL,
165 NULL,
166 NULL,
167 NULL,
168 NULL,
169 NULL,
170 NULL,
171 NULL,
172 NULL,
173 NULL,
174 NULL,
175 (int (*)(struct inode *, int))
176 &hpfs_bmap,
177 NULL,
178 NULL,
179 };
180
181
182
183 static int hpfs_dir_read(struct inode *inode, struct file *filp,
184 char *buf, int count);
185 static int hpfs_readdir(struct inode *inode, struct file *filp,
186 struct dirent *dirent, int count);
187 static int hpfs_lookup(struct inode *, const char *, int, struct inode **);
188
189 static const struct file_operations hpfs_dir_ops =
190 {
191 NULL,
192 hpfs_dir_read,
193 NULL,
194 hpfs_readdir,
195 NULL,
196 NULL,
197 NULL,
198 NULL,
199 NULL,
200 file_fsync,
201 };
202
203 static const struct inode_operations hpfs_dir_iops =
204 {
205 (nonconst *) & hpfs_dir_ops,
206 NULL,
207 hpfs_lookup,
208 NULL,
209 NULL,
210 NULL,
211 NULL,
212 NULL,
213 NULL,
214 NULL,
215 NULL,
216 NULL,
217 NULL,
218 NULL,
219 NULL,
220 };
221
222
223
224 struct quad_buffer_head {
225 struct buffer_head *bh[4];
226 void *data;
227 };
228
229
230
231 static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask,
232 int *lowercase, int *conv);
233 static int check_warn(int not_ok,
234 const char *p1, const char *p2, const char *p3);
235 static int zerop(void *addr, unsigned len);
236 static void count_dnodes(struct inode *inode, dnode_secno dno,
237 unsigned *n_dnodes, unsigned *n_subdirs);
238 static unsigned count_bitmap(struct super_block *s);
239 static unsigned count_one_bitmap(dev_t dev, secno secno);
240 static secno bplus_lookup(struct inode *inode, struct bplus_header *b,
241 secno file_secno, struct buffer_head **bhp);
242 static struct hpfs_dirent *map_dirent(struct inode *inode, dnode_secno dno,
243 const unsigned char *name, unsigned len,
244 struct quad_buffer_head *qbh);
245 static struct hpfs_dirent *map_pos_dirent(struct inode *inode, loff_t *posp,
246 struct quad_buffer_head *qbh);
247 static void write_one_dirent(struct dirent *dirent, const unsigned char *name,
248 unsigned namelen, ino_t ino, int lowercase);
249 static dnode_secno dir_subdno(struct inode *inode, unsigned pos);
250 static struct hpfs_dirent *map_nth_dirent(dev_t dev, dnode_secno dno,
251 int n,
252 struct quad_buffer_head *qbh);
253 static unsigned choose_conv(unsigned char *p, unsigned len);
254 static unsigned convcpy_tofs(unsigned char *out, unsigned char *in,
255 unsigned len);
256 static dnode_secno fnode_dno(dev_t dev, ino_t ino);
257 static struct fnode *map_fnode(dev_t dev, ino_t ino,
258 struct buffer_head **bhp);
259 static struct anode *map_anode(dev_t dev, unsigned secno,
260 struct buffer_head **bhp);
261 static struct dnode *map_dnode(dev_t dev, unsigned secno,
262 struct quad_buffer_head *qbh);
263 static void *map_sector(dev_t dev, unsigned secno, struct buffer_head **bhp);
264 static void *map_4sectors(dev_t dev, unsigned secno,
265 struct quad_buffer_head *qbh);
266 static void brelse4(struct quad_buffer_head *qbh);
267
268
269
270
271
272 static inline ino_t file_ino(fnode_secno secno)
273 {
274 return secno << 1 | 1;
275 }
276
277
278
279
280
281 static inline ino_t dir_ino(fnode_secno secno)
282 {
283 return secno << 1;
284 }
285
286
287
288
289
290 static inline fnode_secno ino_secno(ino_t ino)
291 {
292 return ino >> 1;
293 }
294
295
296
297
298
299 static inline int ino_is_dir(ino_t ino)
300 {
301 return (ino & 1) == 0;
302 }
303
304
305
306
307
308 #define CONV_BINARY 0
309 #define CONV_TEXT 1
310 #define CONV_AUTO 2
311
312
313
314
315
316 static inline time_t local_to_gmt(time_t t)
317 {
318 extern struct timezone sys_tz;
319 return t + sys_tz.tz_minuteswest * 60;
320 }
321
322
323
324
325
326
327
328
329 struct super_block *hpfs_read_super(struct super_block *s,
330 void *options, int silent)
331 {
332 struct hpfs_boot_block *bootblock;
333 struct hpfs_super_block *superblock;
334 struct hpfs_spare_block *spareblock;
335 struct hpfs_dirent *de;
336 struct buffer_head *bh0, *bh1, *bh2;
337 struct quad_buffer_head qbh;
338 dnode_secno root_dno;
339 dev_t dev;
340 uid_t uid;
341 gid_t gid;
342 umode_t umask;
343 int lowercase;
344 int conv;
345 int dubious;
346
347
348
349
350
351 if (!parse_opts(options, &uid, &gid, &umask, &lowercase, &conv)) {
352 printk("HPFS: syntax error in mount options. Not mounted.\n");
353 s->s_dev = 0;
354 return 0;
355 }
356
357
358
359
360
361 lock_super(s);
362 dev = s->s_dev;
363 set_blocksize(dev, 512);
364
365
366
367
368
369 bootblock = map_sector(dev, 0, &bh0);
370 if (!bootblock)
371 goto bail;
372
373 superblock = map_sector(dev, 16, &bh1);
374 if (!superblock)
375 goto bail0;
376
377 spareblock = map_sector(dev, 17, &bh2);
378 if (!spareblock)
379 goto bail1;
380
381
382
383
384
385
386 if (bootblock->magic != 0xaa55
387 || superblock->magic != SB_MAGIC
388 || spareblock->magic != SP_MAGIC
389 || bootblock->sig_28h != 0x28
390 || memcmp(&bootblock->sig_hpfs, "HPFS ", 8)
391 || little_ushort(bootblock->bytes_per_sector) != 512) {
392 printk("HPFS: hpfs_read_super: Not HPFS\n");
393 goto bail2;
394 }
395
396
397
398
399
400
401 dubious = 0;
402
403 dubious |= check_warn(spareblock->dirty != 0,
404 "`Improperly stopped'", "flag is set", "run CHKDSK");
405 dubious |= check_warn(spareblock->n_spares_used != 0,
406 "Spare blocks", "may be in use", "run CHKDSK");
407
408
409
410
411
412
413 if (dubious)
414 goto bail2;
415
416 dubious |= check_warn((spareblock->n_dnode_spares !=
417 spareblock->n_dnode_spares_free),
418 "Spare dnodes", "may be in use", "run CHKDSK");
419 dubious |= check_warn(superblock->zero1 != 0,
420 "#1", "unknown word nonzero", "investigate");
421 dubious |= check_warn(superblock->zero3 != 0,
422 "#3", "unknown word nonzero", "investigate");
423 dubious |= check_warn(superblock->zero4 != 0,
424 "#4", "unknown word nonzero", "investigate");
425 dubious |= check_warn(!zerop(superblock->zero5,
426 sizeof superblock->zero5),
427 "#5", "unknown word nonzero", "investigate");
428 dubious |= check_warn(!zerop(superblock->zero6,
429 sizeof superblock->zero6),
430 "#6", "unknown word nonzero", "investigate");
431
432 if (dubious)
433 printk("HPFS: Proceeding, but operation may be unreliable\n");
434
435
436
437
438
439 s->s_flags |= MS_RDONLY;
440
441
442
443
444
445 s->s_magic = HPFS_SUPER_MAGIC;
446 s->s_blocksize = 512;
447 s->s_blocksize_bits = 9;
448 s->s_op = (struct super_operations *) &hpfs_sops;
449
450
451
452
453
454 s->s_hpfs_root = dir_ino(superblock->root);
455 s->s_hpfs_fs_size = superblock->n_sectors;
456 s->s_hpfs_dirband_size = superblock->n_dir_band / 4;
457 s->s_hpfs_dmap = superblock->dir_band_bitmap;
458 s->s_hpfs_bitmaps = superblock->bitmaps;
459 s->s_hpfs_uid = uid;
460 s->s_hpfs_gid = gid;
461 s->s_hpfs_mode = 0777 & ~umask;
462 s->s_hpfs_n_free = -1;
463 s->s_hpfs_n_free_dnodes = -1;
464 s->s_hpfs_lowercase = lowercase;
465 s->s_hpfs_conv = conv;
466
467
468
469
470
471 brelse(bh2);
472 brelse(bh1);
473 brelse(bh0);
474
475
476
477
478
479 s->s_mounted = iget(s, s->s_hpfs_root);
480 unlock_super(s);
481
482 if (!s->s_mounted) {
483 printk("HPFS: hpfs_read_super: inode get failed\n");
484 s->s_dev = 0;
485 return 0;
486 }
487
488
489
490
491
492 root_dno = fnode_dno(dev, s->s_hpfs_root);
493 if (root_dno)
494 de = map_dirent(s->s_mounted, root_dno, "\001\001", 2, &qbh);
495 if (!root_dno || !de) {
496 printk("HPFS: "
497 "hpfs_read_super: root dir isn't in the root dir\n");
498 s->s_dev = 0;
499 return 0;
500 }
501
502 s->s_mounted->i_atime = local_to_gmt(de->read_date);
503 s->s_mounted->i_mtime = local_to_gmt(de->write_date);
504 s->s_mounted->i_ctime = local_to_gmt(de->creation_date);
505
506 brelse4(&qbh);
507 return s;
508
509 bail2:
510 brelse(bh2);
511 bail1:
512 brelse(bh1);
513 bail0:
514 brelse(bh0);
515 bail:
516 s->s_dev = 0;
517 unlock_super(s);
518 return 0;
519 }
520
521 static int check_warn(int not_ok,
522 const char *p1, const char *p2, const char *p3)
523 {
524 if (not_ok)
525 printk("HPFS: %s %s. Please %s\n", p1, p2, p3);
526 return not_ok;
527 }
528
529 static int zerop(void *addr, unsigned len)
530 {
531 unsigned char *p = addr;
532 return p[0] == 0 && memcmp(p, p + 1, len - 1) == 0;
533 }
534
535
536
537
538
539 static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask,
540 int *lowercase, int *conv)
541 {
542 char *p, *rhs;
543
544 *uid = current->uid;
545 *gid = current->gid;
546 *umask = current->fs->umask;
547 *lowercase = 1;
548 *conv = CONV_BINARY;
549
550 if (!opts)
551 return 1;
552
553 for (p = strtok(opts, ","); p != 0; p = strtok(0, ",")) {
554 if ((rhs = strchr(p, '=')) != 0)
555 *rhs++ = '\0';
556 if (!strcmp(p, "uid")) {
557 if (!rhs || !*rhs)
558 return 0;
559 *uid = simple_strtoul(rhs, &rhs, 0);
560 if (*rhs)
561 return 0;
562 }
563 else if (!strcmp(p, "gid")) {
564 if (!rhs || !*rhs)
565 return 0;
566 *gid = simple_strtoul(rhs, &rhs, 0);
567 if (*rhs)
568 return 0;
569 }
570 else if (!strcmp(p, "umask")) {
571 if (!rhs || !*rhs)
572 return 0;
573 *umask = simple_strtoul(rhs, &rhs, 8);
574 if (*rhs)
575 return 0;
576 }
577 else if (!strcmp(p, "case")) {
578 if (!strcmp(rhs, "lower"))
579 *lowercase = 1;
580 else if (!strcmp(rhs, "asis"))
581 *lowercase = 0;
582 else
583 return 0;
584 }
585 else if (!strcmp(p, "conv")) {
586 if (!strcmp(rhs, "binary"))
587 *conv = CONV_BINARY;
588 else if (!strcmp(rhs, "text"))
589 *conv = CONV_TEXT;
590 else if (!strcmp(rhs, "auto"))
591 *conv = CONV_AUTO;
592 else
593 return 0;
594 }
595 else
596 return 0;
597 }
598
599 return 1;
600 }
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618 static void hpfs_read_inode(struct inode *inode)
619 {
620 struct super_block *s = inode->i_sb;
621
622
623
624 inode->i_op = 0;
625 inode->i_mode = 0;
626
627 if (inode->i_ino == 0
628 || ino_secno(inode->i_ino) >= inode->i_sb->s_hpfs_fs_size) {
629 printk("HPFS: read_inode: bad ino\n");
630 return;
631 }
632
633
634
635
636
637 inode->i_uid = s->s_hpfs_uid;
638 inode->i_gid = s->s_hpfs_gid;
639 inode->i_mode = s->s_hpfs_mode;
640 inode->i_hpfs_conv = s->s_hpfs_conv;
641
642 inode->i_hpfs_dno = 0;
643 inode->i_hpfs_n_secs = 0;
644 inode->i_hpfs_file_sec = 0;
645 inode->i_hpfs_disk_sec = 0;
646 inode->i_hpfs_dpos = 0;
647 inode->i_hpfs_dsubdno = 0;
648
649
650
651
652
653 if (ino_is_dir(inode->i_ino))
654 inode->i_mode |= S_IFDIR;
655 else {
656 inode->i_mode |= S_IFREG;
657 inode->i_mode &= ~0111;
658 }
659
660
661
662
663
664
665
666 inode->i_atime = 0;
667 inode->i_mtime = 0;
668 inode->i_ctime = 0;
669 inode->i_size = 0;
670
671
672
673
674
675 if (S_ISREG(inode->i_mode)) {
676
677 inode->i_op = (struct inode_operations *) &hpfs_file_iops;
678 inode->i_nlink = 1;
679 inode->i_blksize = 512;
680
681 }
682 else {
683 unsigned n_dnodes, n_subdirs;
684 struct buffer_head *bh0;
685 struct fnode *fnode = map_fnode(inode->i_dev,
686 inode->i_ino, &bh0);
687
688 if (!fnode) {
689 printk("HPFS: read_inode: no fnode\n");
690 inode->i_mode = 0;
691 return;
692 }
693
694 inode->i_hpfs_parent_dir = dir_ino(fnode->up);
695 inode->i_hpfs_dno = fnode->u.external[0].disk_secno;
696
697 brelse(bh0);
698
699 n_dnodes = n_subdirs = 0;
700 count_dnodes(inode, inode->i_hpfs_dno, &n_dnodes, &n_subdirs);
701
702 inode->i_op = (struct inode_operations *) &hpfs_dir_iops;
703 inode->i_blksize = 512;
704 inode->i_blocks = 4 * n_dnodes;
705 inode->i_size = 512 * inode->i_blocks;
706 inode->i_nlink = 2 + n_subdirs;
707 }
708 }
709
710
711
712
713
714 static void hpfs_put_super(struct super_block *s)
715 {
716 lock_super(s);
717 s->s_dev = 0;
718 unlock_super(s);
719 }
720
721
722
723
724
725
726 static void hpfs_statfs(struct super_block *s, struct statfs *buf)
727 {
728
729
730
731
732 if (s->s_hpfs_n_free == -1) {
733 s->s_hpfs_n_free = count_bitmap(s);
734 s->s_hpfs_n_free_dnodes =
735 count_one_bitmap(s->s_dev, s->s_hpfs_dmap);
736 }
737
738
739
740
741
742 put_fs_long(s->s_magic, &buf->f_type);
743 put_fs_long(512, &buf->f_bsize);
744 put_fs_long(s->s_hpfs_fs_size, &buf->f_blocks);
745 put_fs_long(s->s_hpfs_n_free, &buf->f_bfree);
746 put_fs_long(s->s_hpfs_n_free, &buf->f_bavail);
747 put_fs_long(s->s_hpfs_dirband_size, &buf->f_files);
748 put_fs_long(s->s_hpfs_n_free_dnodes, &buf->f_ffree);
749 put_fs_long(254, &buf->f_namelen);
750 }
751
752
753
754
755
756 static int hpfs_remount_fs(struct super_block *s, int *flags, char *data)
757 {
758 if (!(*flags & MS_RDONLY))
759 return -EINVAL;
760 return 0;
761 }
762
763
764
765
766
767 static void count_dnodes(struct inode *inode, dnode_secno dno,
768 unsigned *n_dnodes, unsigned *n_subdirs)
769 {
770 struct quad_buffer_head qbh;
771 struct dnode *dnode;
772 struct hpfs_dirent *de;
773 struct hpfs_dirent *de_end;
774
775 dnode = map_dnode(inode->i_dev, dno, &qbh);
776 if (!dnode)
777 return;
778 de = dnode_first_de(dnode);
779 de_end = dnode_end_de(dnode);
780
781 (*n_dnodes)++;
782
783 for (; de < de_end; de = de_next_de(de)) {
784 if (de->down)
785 count_dnodes(inode, de_down_pointer(de),
786 n_dnodes, n_subdirs);
787 if (de->directory && !de->first)
788 (*n_subdirs)++;
789 if (de->last || de->length == 0)
790 break;
791 }
792
793 brelse4(&qbh);
794 }
795
796
797
798
799
800 static unsigned count_bitmap(struct super_block *s)
801 {
802 unsigned n, count, n_bands;
803 secno *bitmaps;
804 struct quad_buffer_head qbh;
805
806
807
808
809 n_bands = (s->s_hpfs_fs_size + 0x3fff) >> 14;
810
811
812
813
814
815 bitmaps = map_4sectors(s->s_dev, s->s_hpfs_bitmaps, &qbh);
816 if (!bitmaps)
817 return 0;
818
819 count = 0;
820
821
822
823
824 for (n = 0; n < n_bands; n++)
825 if (bitmaps[n] == 0)
826 printk("HPFS: bit map pointer missing\n");
827 else
828 count += count_one_bitmap(s->s_dev, bitmaps[n]);
829
830 brelse4(&qbh);
831 return count;
832 }
833
834
835
836
837
838 static unsigned count_one_bitmap(dev_t dev, secno secno)
839 {
840 struct quad_buffer_head qbh;
841 char *bits;
842 unsigned i, count;
843
844 bits = map_4sectors(dev, secno, &qbh);
845 if (!bits)
846 return 0;
847
848 count = 0;
849
850 for (i = 0; i < 8 * 2048; i++)
851 count += (test_bit(i, bits) != 0);
852 brelse4(&qbh);
853
854 return count;
855 }
856
857
858
859
860
861
862
863 static int hpfs_file_read(struct inode *inode, struct file *filp,
864 char *buf, int count)
865 {
866 unsigned q, r, n, n0;
867 struct buffer_head *bh;
868 char *block;
869 char *start;
870
871 if (inode == 0 || !S_ISREG(inode->i_mode))
872 return -EINVAL;
873
874
875
876
877 if (count > inode->i_size - (off_t) filp->f_pos)
878 count = inode->i_size - filp->f_pos;
879
880 start = buf;
881 while (count > 0) {
882
883
884
885
886 q = filp->f_pos >> 9;
887 r = filp->f_pos & 511;
888 n = 512 - r;
889
890
891
892
893 if (n > count)
894 n = count;
895
896
897
898
899 block = map_sector(inode->i_dev, hpfs_bmap(inode, q), &bh);
900 if (!block)
901 return -EIO;
902
903
904
905
906
907 if (inode->i_hpfs_conv == CONV_AUTO)
908 inode->i_hpfs_conv = choose_conv(block + r, n);
909
910 if (inode->i_hpfs_conv == CONV_BINARY) {
911
912
913
914
915 memcpy_tofs(buf, block + r, n);
916 n0 = n;
917 }
918 else {
919
920
921
922 n0 = convcpy_tofs(buf, block + r, n);
923 if (count > inode->i_size - (off_t) filp->f_pos - n + n0)
924 count = inode->i_size - filp->f_pos - n + n0;
925 }
926
927 brelse(bh);
928
929
930
931
932 filp->f_pos += n;
933 buf += n0;
934 count -= n0;
935 }
936
937 return buf - start;
938 }
939
940
941
942
943
944 static unsigned choose_conv(unsigned char *p, unsigned len)
945 {
946 unsigned tvote, bvote;
947 unsigned c;
948
949 tvote = bvote = 0;
950
951 while (len--) {
952 c = *p++;
953 if (c < ' ')
954 if (c == '\r' && len && *p == '\n')
955 tvote += 10;
956 else if (c == '\t' || c == '\n');
957 else
958 bvote += 5;
959 else if (c < '\177')
960 tvote++;
961 else
962 bvote += 5;
963 }
964
965 if (tvote > bvote)
966 return CONV_TEXT;
967 else
968 return CONV_BINARY;
969 }
970
971
972
973
974
975 static unsigned convcpy_tofs(unsigned char *out, unsigned char *in,
976 unsigned len)
977 {
978 unsigned char *start = out;
979
980 while (len--) {
981 unsigned c = *in++;
982 if (c == '\r' && (len == 0 || *in == '\n'));
983 else
984 put_fs_byte(c, out++);
985 }
986
987 return out - start;
988 }
989
990
991
992
993
994 static secno hpfs_bmap(struct inode *inode, unsigned file_secno)
995 {
996 unsigned n, disk_secno;
997 struct fnode *fnode;
998 struct buffer_head *bh;
999
1000
1001
1002
1003
1004
1005 n = file_secno - inode->i_hpfs_file_sec;
1006 if (n < inode->i_hpfs_n_secs)
1007 return inode->i_hpfs_disk_sec + n;
1008
1009
1010
1011
1012
1013 else {
1014 fnode = map_fnode(inode->i_dev, inode->i_ino, &bh);
1015 if (!fnode)
1016 return 0;
1017 disk_secno = bplus_lookup(inode, &fnode->btree,
1018 file_secno, &bh);
1019 brelse(bh);
1020 return disk_secno;
1021 }
1022 }
1023
1024
1025
1026
1027
1028
1029
1030
1031 static secno bplus_lookup(struct inode *inode, struct bplus_header *b,
1032 secno file_secno, struct buffer_head **bhp)
1033 {
1034 int i;
1035
1036
1037
1038
1039
1040
1041
1042 if (!b->internal) {
1043 struct bplus_leaf_node *n = b->u.external;
1044 for (i = 0; i < b->n_used_nodes; i++) {
1045 unsigned t = file_secno - n[i].file_secno;
1046 if (t < n[i].length) {
1047 inode->i_hpfs_file_sec = n[i].file_secno;
1048 inode->i_hpfs_disk_sec = n[i].disk_secno;
1049 inode->i_hpfs_n_secs = n[i].length;
1050 return n[i].disk_secno + t;
1051 }
1052 }
1053 }
1054
1055
1056
1057
1058
1059
1060 else {
1061 struct bplus_internal_node *n = b->u.internal;
1062 for (i = 0; i < b->n_used_nodes; i++) {
1063 if (file_secno < n[i].file_secno) {
1064 struct anode *anode;
1065 anode_secno ano = n[i].down;
1066 brelse(*bhp);
1067 anode = map_anode(inode->i_dev, ano, bhp);
1068 if (!anode)
1069 break;
1070 return bplus_lookup(inode, &anode->btree,
1071 file_secno, bhp);
1072 }
1073 }
1074 }
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084 printk("HPFS: bplus_lookup: sector not found\n");
1085 return 15;
1086 }
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101 static int hpfs_lookup(struct inode *dir, const char *name, int len,
1102 struct inode **result)
1103 {
1104 struct quad_buffer_head qbh;
1105 struct hpfs_dirent *de;
1106 struct inode *inode;
1107 ino_t ino;
1108
1109
1110
1111 *result = 0;
1112 if (dir == 0)
1113 return -ENOENT;
1114 if (!S_ISDIR(dir->i_mode))
1115 goto bail;
1116
1117
1118
1119
1120
1121
1122 if (name[0] == '.' && len == 1)
1123 de = map_dirent(dir, dir->i_hpfs_dno, "\001\001", 2, &qbh);
1124 else if (name[0] == '.' && name[1] == '.' && len == 2)
1125 de = map_dirent(dir,
1126 fnode_dno(dir->i_dev, dir->i_hpfs_parent_dir),
1127 "\001\001", 2, &qbh);
1128 else
1129 de = map_dirent(dir, dir->i_hpfs_dno, name, len, &qbh);
1130
1131
1132
1133
1134
1135 if (!de)
1136 goto bail;
1137
1138
1139
1140
1141
1142 if (de->directory)
1143 ino = dir_ino(de->fnode);
1144 else
1145 ino = file_ino(de->fnode);
1146
1147
1148
1149
1150
1151 if (!(inode = iget(dir->i_sb, ino)))
1152 goto bail1;
1153
1154
1155
1156
1157
1158
1159 if (!inode->i_atime) {
1160 inode->i_atime = local_to_gmt(de->read_date);
1161 inode->i_mtime = local_to_gmt(de->write_date);
1162 inode->i_ctime = local_to_gmt(de->creation_date);
1163 if (de->read_only)
1164 inode->i_mode &= ~0222;
1165 if (!de->directory) {
1166 inode->i_size = de->file_size;
1167
1168
1169
1170
1171
1172
1173 inode->i_blocks = 1 + ((inode->i_size + 511) >> 9);
1174 }
1175 }
1176
1177 brelse4(&qbh);
1178
1179
1180
1181
1182
1183 *result = inode;
1184 iput(dir);
1185 return 0;
1186
1187
1188
1189
1190 bail1:
1191 brelse4(&qbh);
1192 bail:
1193 iput(dir);
1194 return -ENOENT;
1195 }
1196
1197
1198
1199
1200
1201
1202 static inline int memcasecmp(const unsigned char *s1, const unsigned char *s2,
1203 unsigned n)
1204 {
1205 int t;
1206
1207 if (n != 0)
1208 do {
1209 unsigned c1 = *s1++;
1210 unsigned c2 = *s2++;
1211 if (c1 - 'a' < 26)
1212 c1 -= 040;
1213 if (c2 - 'a' < 26)
1214 c2 -= 040;
1215 if ((t = c1 - c2) != 0)
1216 return t;
1217 } while (--n != 0);
1218
1219 return 0;
1220 }
1221
1222
1223
1224
1225
1226
1227 static struct hpfs_dirent *map_dirent(struct inode *inode, dnode_secno dno,
1228 const unsigned char *name, unsigned len,
1229 struct quad_buffer_head *qbh)
1230 {
1231 struct dnode *dnode;
1232 struct hpfs_dirent *de;
1233 struct hpfs_dirent *de_end;
1234 int t, l;
1235
1236
1237
1238
1239 dnode = map_dnode(inode->i_dev, dno, qbh);
1240 if (!dnode)
1241 return 0;
1242
1243
1244
1245
1246 de = dnode_first_de(dnode);
1247 de_end = dnode_end_de(dnode);
1248
1249
1250
1251
1252 for ( ; de < de_end; de = de_next_de(de)) {
1253
1254
1255
1256
1257 l = len < de->namelen ? len : de->namelen;
1258 t = memcasecmp(name, de->name, l);
1259
1260
1261
1262
1263 if (t == 0) {
1264 t = len - de->namelen;
1265
1266 if (t == 0)
1267 return de;
1268 }
1269
1270
1271
1272
1273 if (t < 0) {
1274
1275
1276
1277 if (de->down) {
1278 dnode_secno sub_dno = de_down_pointer(de);
1279 brelse4(qbh);
1280 return map_dirent(inode, sub_dno,
1281 name, len, qbh);
1282 }
1283 else
1284 break;
1285 }
1286
1287
1288
1289
1290
1291
1292
1293 if (de->last || de->length == 0)
1294 break;
1295 }
1296
1297
1298
1299
1300
1301 return 0;
1302 }
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329 static int hpfs_readdir(struct inode *inode, struct file *filp,
1330 struct dirent *dirent, int likely_story)
1331 {
1332 struct quad_buffer_head qbh;
1333 struct hpfs_dirent *de;
1334 int namelen, lc;
1335 ino_t ino;
1336
1337 if (inode == 0
1338 || inode->i_sb == 0
1339 || !S_ISDIR(inode->i_mode))
1340 return -EBADF;
1341
1342 lc = inode->i_sb->s_hpfs_lowercase;
1343
1344 switch ((off_t) filp->f_pos) {
1345 case 0:
1346 write_one_dirent(dirent, ".", 1, inode->i_ino, lc);
1347 filp->f_pos = -1;
1348 return 1;
1349
1350 case -1:
1351 write_one_dirent(dirent, "..", 2,
1352 inode->i_hpfs_parent_dir, lc);
1353 filp->f_pos = 1;
1354 return 2;
1355
1356 case -2:
1357 return 0;
1358
1359 default:
1360 de = map_pos_dirent(inode, &filp->f_pos, &qbh);
1361 if (!de) {
1362 filp->f_pos = -2;
1363 return 0;
1364 }
1365
1366 namelen = de->namelen;
1367 if (de->directory)
1368 ino = dir_ino(de->fnode);
1369 else
1370 ino = file_ino(de->fnode);
1371 write_one_dirent(dirent, de->name, namelen, ino, lc);
1372 brelse4(&qbh);
1373
1374 return namelen;
1375 }
1376 }
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386 static void write_one_dirent(struct dirent *dirent, const unsigned char *name,
1387 unsigned namelen, ino_t ino, int lowercase)
1388 {
1389 unsigned n;
1390
1391 put_fs_long(ino, &dirent->d_ino);
1392 put_fs_word(namelen, &dirent->d_reclen);
1393
1394 if (lowercase)
1395 for (n = namelen; n != 0;) {
1396 unsigned t = name[--n];
1397 if (t - 'A' < 26)
1398 t += 040;
1399 put_fs_byte(t, &dirent->d_name[n]);
1400 }
1401 else
1402 memcpy_tofs(dirent->d_name, name, namelen);
1403
1404 put_fs_byte(0, &dirent->d_name[namelen]);
1405 }
1406
1407
1408
1409
1410
1411
1412 static struct hpfs_dirent *map_pos_dirent(struct inode *inode, loff_t *posp,
1413 struct quad_buffer_head *qbh)
1414 {
1415 unsigned pos, q, r;
1416 dnode_secno dno;
1417 struct hpfs_dirent *de;
1418
1419
1420
1421
1422
1423 pos = *posp;
1424 q = pos >> 6;
1425 r = pos & 077;
1426
1427
1428
1429
1430
1431
1432 dno = dir_subdno(inode, q);
1433 if (!dno)
1434 return 0;
1435
1436
1437
1438
1439
1440 de = map_nth_dirent(inode->i_dev, dno, r, qbh);
1441
1442
1443
1444
1445
1446 if (!de) {
1447 if (q == 0)
1448 return 0;
1449 *posp = q + 1;
1450 return map_pos_dirent(inode, posp, qbh);
1451 }
1452
1453
1454
1455
1456
1457 if (de->down)
1458 *posp = pos << 6 | 1;
1459 else
1460 *posp = pos + 1;
1461
1462
1463
1464
1465
1466 if (de->first || de->last) {
1467 brelse4(qbh);
1468 return map_pos_dirent(inode, posp, qbh);
1469 }
1470 else
1471 return de;
1472 }
1473
1474
1475
1476
1477
1478 static dnode_secno dir_subdno(struct inode *inode, unsigned pos)
1479 {
1480 struct hpfs_dirent *de;
1481 struct quad_buffer_head qbh;
1482
1483
1484
1485
1486
1487 if (pos == 0)
1488 return inode->i_hpfs_dno;
1489
1490
1491
1492
1493
1494 else if (pos == inode->i_hpfs_dpos)
1495 return inode->i_hpfs_dsubdno;
1496
1497
1498
1499
1500
1501 else {
1502 unsigned q = pos >> 6;
1503 unsigned r = pos & 077;
1504 dnode_secno dno;
1505
1506
1507
1508
1509 dno = dir_subdno(inode, q);
1510 if (dno == 0)
1511 return 0;
1512
1513
1514
1515
1516 de = map_nth_dirent(inode->i_dev, dno, r, &qbh);
1517 if (!de || !de->down)
1518 return 0;
1519
1520
1521
1522
1523 dno = de_down_pointer(de);
1524 brelse4(&qbh);
1525
1526
1527
1528
1529 inode->i_hpfs_dpos = pos;
1530 inode->i_hpfs_dsubdno = dno;
1531 return dno;
1532 }
1533 }
1534
1535
1536
1537
1538
1539 static struct hpfs_dirent *map_nth_dirent(dev_t dev, dnode_secno dno,
1540 int n,
1541 struct quad_buffer_head *qbh)
1542 {
1543 int i;
1544 struct hpfs_dirent *de, *de_end;
1545 struct dnode *dnode = map_dnode(dev, dno, qbh);
1546
1547 de = dnode_first_de(dnode);
1548 de_end = dnode_end_de(dnode);
1549
1550 for (i = 1; de < de_end; i++, de = de_next_de(de)) {
1551 if (i == n)
1552 return de;
1553 if (de->last || de->length == 0)
1554 break;
1555 }
1556
1557 brelse4(qbh);
1558 return 0;
1559 }
1560
1561 static int hpfs_dir_read(struct inode *inode, struct file *filp,
1562 char *buf, int count)
1563 {
1564 return -EISDIR;
1565 }
1566
1567
1568
1569 static dnode_secno fnode_dno(dev_t dev, ino_t ino)
1570 {
1571 struct buffer_head *bh;
1572 struct fnode *fnode;
1573 dnode_secno dno;
1574
1575 fnode = map_fnode(dev, ino, &bh);
1576 if (!fnode)
1577 return 0;
1578
1579 dno = fnode->u.external[0].disk_secno;
1580 brelse(bh);
1581 return dno;
1582 }
1583
1584
1585
1586 static struct fnode *map_fnode(dev_t dev, ino_t ino, struct buffer_head **bhp)
1587 {
1588 struct fnode *fnode;
1589
1590 if (ino == 0) {
1591 printk("HPFS: missing fnode\n");
1592 return 0;
1593 }
1594
1595 fnode = map_sector(dev, ino_secno(ino), bhp);
1596 if (fnode)
1597 if (fnode->magic != FNODE_MAGIC) {
1598 printk("HPFS: map_fnode: bad fnode pointer\n");
1599 brelse(*bhp);
1600 return 0;
1601 }
1602 return fnode;
1603 }
1604
1605
1606
1607 static struct anode *map_anode(dev_t dev, unsigned secno,
1608 struct buffer_head **bhp)
1609 {
1610 struct anode *anode;
1611
1612 if (secno == 0) {
1613 printk("HPFS: missing anode\n");
1614 return 0;
1615 }
1616
1617 anode = map_sector(dev, secno, bhp);
1618 if (anode)
1619 if (anode->magic != ANODE_MAGIC || anode->self != secno) {
1620 printk("HPFS: map_anode: bad anode pointer\n");
1621 brelse(*bhp);
1622 return 0;
1623 }
1624 return anode;
1625 }
1626
1627
1628
1629 static struct dnode *map_dnode(dev_t dev, unsigned secno,
1630 struct quad_buffer_head *qbh)
1631 {
1632 struct dnode *dnode;
1633
1634 if (secno == 0) {
1635 printk("HPFS: missing dnode\n");
1636 return 0;
1637 }
1638
1639 dnode = map_4sectors(dev, secno, qbh);
1640 if (dnode)
1641 if (dnode->magic != DNODE_MAGIC || dnode->self != secno) {
1642 printk("HPFS: map_dnode: bad dnode pointer\n");
1643 brelse4(qbh);
1644 return 0;
1645 }
1646 return dnode;
1647 }
1648
1649
1650
1651 static void *map_sector(dev_t dev, unsigned secno, struct buffer_head **bhp)
1652 {
1653 struct buffer_head *bh;
1654
1655 if ((*bhp = bh = bread(dev, secno, 512)) != 0)
1656 return bh->b_data;
1657 else {
1658 printk("HPFS: map_sector: read error\n");
1659 return 0;
1660 }
1661 }
1662
1663
1664
1665 static void *map_4sectors(dev_t dev, unsigned secno,
1666 struct quad_buffer_head *qbh)
1667 {
1668 struct buffer_head *bh;
1669 char *data;
1670
1671 if (secno & 3) {
1672 printk("HPFS: map_4sectors: unaligned read\n");
1673 return 0;
1674 }
1675
1676 qbh->data = data = kmalloc(2048, GFP_KERNEL);
1677 if (!data)
1678 goto bail;
1679
1680 qbh->bh[0] = bh = breada(dev, secno, 512, 0, UINT_MAX);
1681 if (!bh)
1682 goto bail0;
1683 memcpy(data, bh->b_data, 512);
1684
1685 qbh->bh[1] = bh = bread(dev, secno + 1, 512);
1686 if (!bh)
1687 goto bail1;
1688 memcpy(data + 512, bh->b_data, 512);
1689
1690 qbh->bh[2] = bh = bread(dev, secno + 2, 512);
1691 if (!bh)
1692 goto bail2;
1693 memcpy(data + 2 * 512, bh->b_data, 512);
1694
1695 qbh->bh[3] = bh = bread(dev, secno + 3, 512);
1696 if (!bh)
1697 goto bail3;
1698 memcpy(data + 3 * 512, bh->b_data, 512);
1699
1700 return data;
1701
1702 bail3:
1703 brelse(qbh->bh[2]);
1704 bail2:
1705 brelse(qbh->bh[1]);
1706 bail1:
1707 brelse(qbh->bh[0]);
1708 bail0:
1709 kfree_s(data, 2048);
1710 bail:
1711 printk("HPFS: map_4sectors: read error\n");
1712 return 0;
1713 }
1714
1715
1716
1717 static void brelse4(struct quad_buffer_head *qbh)
1718 {
1719 brelse(qbh->bh[3]);
1720 brelse(qbh->bh[2]);
1721 brelse(qbh->bh[1]);
1722 brelse(qbh->bh[0]);
1723 kfree_s(qbh->data, 2048);
1724 }