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