1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41#include "udfdecl.h"
42
43#include <linux/blkdev.h>
44#include <linux/slab.h>
45#include <linux/kernel.h>
46#include <linux/module.h>
47#include <linux/parser.h>
48#include <linux/stat.h>
49#include <linux/cdrom.h>
50#include <linux/nls.h>
51#include <linux/smp_lock.h>
52#include <linux/buffer_head.h>
53#include <linux/vfs.h>
54#include <linux/vmalloc.h>
55#include <linux/errno.h>
56#include <linux/mount.h>
57#include <linux/seq_file.h>
58#include <linux/bitmap.h>
59#include <linux/crc-itu-t.h>
60#include <asm/byteorder.h>
61
62#include "udf_sb.h"
63#include "udf_i.h"
64
65#include <linux/init.h>
66#include <asm/uaccess.h>
67
68#define VDS_POS_PRIMARY_VOL_DESC 0
69#define VDS_POS_UNALLOC_SPACE_DESC 1
70#define VDS_POS_LOGICAL_VOL_DESC 2
71#define VDS_POS_PARTITION_DESC 3
72#define VDS_POS_IMP_USE_VOL_DESC 4
73#define VDS_POS_VOL_DESC_PTR 5
74#define VDS_POS_TERMINATING_DESC 6
75#define VDS_POS_LENGTH 7
76
77#define UDF_DEFAULT_BLOCKSIZE 2048
78
79static char error_buf[1024];
80
81
82static int udf_fill_super(struct super_block *, void *, int);
83static void udf_put_super(struct super_block *);
84static int udf_sync_fs(struct super_block *, int);
85static int udf_remount_fs(struct super_block *, int *, char *);
86static void udf_load_logicalvolint(struct super_block *, struct kernel_extent_ad);
87static int udf_find_fileset(struct super_block *, struct kernel_lb_addr *,
88 struct kernel_lb_addr *);
89static void udf_load_fileset(struct super_block *, struct buffer_head *,
90 struct kernel_lb_addr *);
91static void udf_open_lvid(struct super_block *);
92static void udf_close_lvid(struct super_block *);
93static unsigned int udf_count_free(struct super_block *);
94static int udf_statfs(struct dentry *, struct kstatfs *);
95static int udf_show_options(struct seq_file *, struct vfsmount *);
96static void udf_error(struct super_block *sb, const char *function,
97 const char *fmt, ...);
98
99struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct udf_sb_info *sbi)
100{
101 struct logicalVolIntegrityDesc *lvid =
102 (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data;
103 __u32 number_of_partitions = le32_to_cpu(lvid->numOfPartitions);
104 __u32 offset = number_of_partitions * 2 *
105 sizeof(uint32_t)/sizeof(uint8_t);
106 return (struct logicalVolIntegrityDescImpUse *)&(lvid->impUse[offset]);
107}
108
109
110static int udf_get_sb(struct file_system_type *fs_type,
111 int flags, const char *dev_name, void *data,
112 struct vfsmount *mnt)
113{
114 return get_sb_bdev(fs_type, flags, dev_name, data, udf_fill_super, mnt);
115}
116
117static struct file_system_type udf_fstype = {
118 .owner = THIS_MODULE,
119 .name = "udf",
120 .get_sb = udf_get_sb,
121 .kill_sb = kill_block_super,
122 .fs_flags = FS_REQUIRES_DEV,
123};
124
125static struct kmem_cache *udf_inode_cachep;
126
127static struct inode *udf_alloc_inode(struct super_block *sb)
128{
129 struct udf_inode_info *ei;
130 ei = kmem_cache_alloc(udf_inode_cachep, GFP_KERNEL);
131 if (!ei)
132 return NULL;
133
134 ei->i_unique = 0;
135 ei->i_lenExtents = 0;
136 ei->i_next_alloc_block = 0;
137 ei->i_next_alloc_goal = 0;
138 ei->i_strat4096 = 0;
139
140 return &ei->vfs_inode;
141}
142
143static void udf_destroy_inode(struct inode *inode)
144{
145 kmem_cache_free(udf_inode_cachep, UDF_I(inode));
146}
147
148static void init_once(void *foo)
149{
150 struct udf_inode_info *ei = (struct udf_inode_info *)foo;
151
152 ei->i_ext.i_data = NULL;
153 inode_init_once(&ei->vfs_inode);
154}
155
156static int init_inodecache(void)
157{
158 udf_inode_cachep = kmem_cache_create("udf_inode_cache",
159 sizeof(struct udf_inode_info),
160 0, (SLAB_RECLAIM_ACCOUNT |
161 SLAB_MEM_SPREAD),
162 init_once);
163 if (!udf_inode_cachep)
164 return -ENOMEM;
165 return 0;
166}
167
168static void destroy_inodecache(void)
169{
170 kmem_cache_destroy(udf_inode_cachep);
171}
172
173
174static const struct super_operations udf_sb_ops = {
175 .alloc_inode = udf_alloc_inode,
176 .destroy_inode = udf_destroy_inode,
177 .write_inode = udf_write_inode,
178 .delete_inode = udf_delete_inode,
179 .clear_inode = udf_clear_inode,
180 .put_super = udf_put_super,
181 .sync_fs = udf_sync_fs,
182 .statfs = udf_statfs,
183 .remount_fs = udf_remount_fs,
184 .show_options = udf_show_options,
185};
186
187struct udf_options {
188 unsigned char novrs;
189 unsigned int blocksize;
190 unsigned int session;
191 unsigned int lastblock;
192 unsigned int anchor;
193 unsigned int volume;
194 unsigned short partition;
195 unsigned int fileset;
196 unsigned int rootdir;
197 unsigned int flags;
198 mode_t umask;
199 gid_t gid;
200 uid_t uid;
201 mode_t fmode;
202 mode_t dmode;
203 struct nls_table *nls_map;
204};
205
206static int __init init_udf_fs(void)
207{
208 int err;
209
210 err = init_inodecache();
211 if (err)
212 goto out1;
213 err = register_filesystem(&udf_fstype);
214 if (err)
215 goto out;
216
217 return 0;
218
219out:
220 destroy_inodecache();
221
222out1:
223 return err;
224}
225
226static void __exit exit_udf_fs(void)
227{
228 unregister_filesystem(&udf_fstype);
229 destroy_inodecache();
230}
231
232module_init(init_udf_fs)
233module_exit(exit_udf_fs)
234
235static int udf_sb_alloc_partition_maps(struct super_block *sb, u32 count)
236{
237 struct udf_sb_info *sbi = UDF_SB(sb);
238
239 sbi->s_partmaps = kcalloc(count, sizeof(struct udf_part_map),
240 GFP_KERNEL);
241 if (!sbi->s_partmaps) {
242 udf_error(sb, __func__,
243 "Unable to allocate space for %d partition maps",
244 count);
245 sbi->s_partitions = 0;
246 return -ENOMEM;
247 }
248
249 sbi->s_partitions = count;
250 return 0;
251}
252
253static int udf_show_options(struct seq_file *seq, struct vfsmount *mnt)
254{
255 struct super_block *sb = mnt->mnt_sb;
256 struct udf_sb_info *sbi = UDF_SB(sb);
257
258 if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT))
259 seq_puts(seq, ",nostrict");
260 if (UDF_QUERY_FLAG(sb, UDF_FLAG_BLOCKSIZE_SET))
261 seq_printf(seq, ",bs=%lu", sb->s_blocksize);
262 if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE))
263 seq_puts(seq, ",unhide");
264 if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE))
265 seq_puts(seq, ",undelete");
266 if (!UDF_QUERY_FLAG(sb, UDF_FLAG_USE_AD_IN_ICB))
267 seq_puts(seq, ",noadinicb");
268 if (UDF_QUERY_FLAG(sb, UDF_FLAG_USE_SHORT_AD))
269 seq_puts(seq, ",shortad");
270 if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_FORGET))
271 seq_puts(seq, ",uid=forget");
272 if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_IGNORE))
273 seq_puts(seq, ",uid=ignore");
274 if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_FORGET))
275 seq_puts(seq, ",gid=forget");
276 if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_IGNORE))
277 seq_puts(seq, ",gid=ignore");
278 if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET))
279 seq_printf(seq, ",uid=%u", sbi->s_uid);
280 if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET))
281 seq_printf(seq, ",gid=%u", sbi->s_gid);
282 if (sbi->s_umask != 0)
283 seq_printf(seq, ",umask=%o", sbi->s_umask);
284 if (sbi->s_fmode != UDF_INVALID_MODE)
285 seq_printf(seq, ",mode=%o", sbi->s_fmode);
286 if (sbi->s_dmode != UDF_INVALID_MODE)
287 seq_printf(seq, ",dmode=%o", sbi->s_dmode);
288 if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET))
289 seq_printf(seq, ",session=%u", sbi->s_session);
290 if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET))
291 seq_printf(seq, ",lastblock=%u", sbi->s_last_block);
292 if (sbi->s_anchor != 0)
293 seq_printf(seq, ",anchor=%u", sbi->s_anchor);
294
295
296
297
298 if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8))
299 seq_puts(seq, ",utf8");
300 if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP) && sbi->s_nls_map)
301 seq_printf(seq, ",iocharset=%s", sbi->s_nls_map->charset);
302
303 return 0;
304}
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362enum {
363 Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete,
364 Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad,
365 Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock,
366 Opt_anchor, Opt_volume, Opt_partition, Opt_fileset,
367 Opt_rootdir, Opt_utf8, Opt_iocharset,
368 Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore,
369 Opt_fmode, Opt_dmode
370};
371
372static const match_table_t tokens = {
373 {Opt_novrs, "novrs"},
374 {Opt_nostrict, "nostrict"},
375 {Opt_bs, "bs=%u"},
376 {Opt_unhide, "unhide"},
377 {Opt_undelete, "undelete"},
378 {Opt_noadinicb, "noadinicb"},
379 {Opt_adinicb, "adinicb"},
380 {Opt_shortad, "shortad"},
381 {Opt_longad, "longad"},
382 {Opt_uforget, "uid=forget"},
383 {Opt_uignore, "uid=ignore"},
384 {Opt_gforget, "gid=forget"},
385 {Opt_gignore, "gid=ignore"},
386 {Opt_gid, "gid=%u"},
387 {Opt_uid, "uid=%u"},
388 {Opt_umask, "umask=%o"},
389 {Opt_session, "session=%u"},
390 {Opt_lastblock, "lastblock=%u"},
391 {Opt_anchor, "anchor=%u"},
392 {Opt_volume, "volume=%u"},
393 {Opt_partition, "partition=%u"},
394 {Opt_fileset, "fileset=%u"},
395 {Opt_rootdir, "rootdir=%u"},
396 {Opt_utf8, "utf8"},
397 {Opt_iocharset, "iocharset=%s"},
398 {Opt_fmode, "mode=%o"},
399 {Opt_dmode, "dmode=%o"},
400 {Opt_err, NULL}
401};
402
403static int udf_parse_options(char *options, struct udf_options *uopt,
404 bool remount)
405{
406 char *p;
407 int option;
408
409 uopt->novrs = 0;
410 uopt->partition = 0xFFFF;
411 uopt->session = 0xFFFFFFFF;
412 uopt->lastblock = 0;
413 uopt->anchor = 0;
414 uopt->volume = 0xFFFFFFFF;
415 uopt->rootdir = 0xFFFFFFFF;
416 uopt->fileset = 0xFFFFFFFF;
417 uopt->nls_map = NULL;
418
419 if (!options)
420 return 1;
421
422 while ((p = strsep(&options, ",")) != NULL) {
423 substring_t args[MAX_OPT_ARGS];
424 int token;
425 if (!*p)
426 continue;
427
428 token = match_token(p, tokens, args);
429 switch (token) {
430 case Opt_novrs:
431 uopt->novrs = 1;
432 break;
433 case Opt_bs:
434 if (match_int(&args[0], &option))
435 return 0;
436 uopt->blocksize = option;
437 uopt->flags |= (1 << UDF_FLAG_BLOCKSIZE_SET);
438 break;
439 case Opt_unhide:
440 uopt->flags |= (1 << UDF_FLAG_UNHIDE);
441 break;
442 case Opt_undelete:
443 uopt->flags |= (1 << UDF_FLAG_UNDELETE);
444 break;
445 case Opt_noadinicb:
446 uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB);
447 break;
448 case Opt_adinicb:
449 uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB);
450 break;
451 case Opt_shortad:
452 uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD);
453 break;
454 case Opt_longad:
455 uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD);
456 break;
457 case Opt_gid:
458 if (match_int(args, &option))
459 return 0;
460 uopt->gid = option;
461 uopt->flags |= (1 << UDF_FLAG_GID_SET);
462 break;
463 case Opt_uid:
464 if (match_int(args, &option))
465 return 0;
466 uopt->uid = option;
467 uopt->flags |= (1 << UDF_FLAG_UID_SET);
468 break;
469 case Opt_umask:
470 if (match_octal(args, &option))
471 return 0;
472 uopt->umask = option;
473 break;
474 case Opt_nostrict:
475 uopt->flags &= ~(1 << UDF_FLAG_STRICT);
476 break;
477 case Opt_session:
478 if (match_int(args, &option))
479 return 0;
480 uopt->session = option;
481 if (!remount)
482 uopt->flags |= (1 << UDF_FLAG_SESSION_SET);
483 break;
484 case Opt_lastblock:
485 if (match_int(args, &option))
486 return 0;
487 uopt->lastblock = option;
488 if (!remount)
489 uopt->flags |= (1 << UDF_FLAG_LASTBLOCK_SET);
490 break;
491 case Opt_anchor:
492 if (match_int(args, &option))
493 return 0;
494 uopt->anchor = option;
495 break;
496 case Opt_volume:
497 if (match_int(args, &option))
498 return 0;
499 uopt->volume = option;
500 break;
501 case Opt_partition:
502 if (match_int(args, &option))
503 return 0;
504 uopt->partition = option;
505 break;
506 case Opt_fileset:
507 if (match_int(args, &option))
508 return 0;
509 uopt->fileset = option;
510 break;
511 case Opt_rootdir:
512 if (match_int(args, &option))
513 return 0;
514 uopt->rootdir = option;
515 break;
516 case Opt_utf8:
517 uopt->flags |= (1 << UDF_FLAG_UTF8);
518 break;
519#ifdef CONFIG_UDF_NLS
520 case Opt_iocharset:
521 uopt->nls_map = load_nls(args[0].from);
522 uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
523 break;
524#endif
525 case Opt_uignore:
526 uopt->flags |= (1 << UDF_FLAG_UID_IGNORE);
527 break;
528 case Opt_uforget:
529 uopt->flags |= (1 << UDF_FLAG_UID_FORGET);
530 break;
531 case Opt_gignore:
532 uopt->flags |= (1 << UDF_FLAG_GID_IGNORE);
533 break;
534 case Opt_gforget:
535 uopt->flags |= (1 << UDF_FLAG_GID_FORGET);
536 break;
537 case Opt_fmode:
538 if (match_octal(args, &option))
539 return 0;
540 uopt->fmode = option & 0777;
541 break;
542 case Opt_dmode:
543 if (match_octal(args, &option))
544 return 0;
545 uopt->dmode = option & 0777;
546 break;
547 default:
548 printk(KERN_ERR "udf: bad mount option \"%s\" "
549 "or missing value\n", p);
550 return 0;
551 }
552 }
553 return 1;
554}
555
556static int udf_remount_fs(struct super_block *sb, int *flags, char *options)
557{
558 struct udf_options uopt;
559 struct udf_sb_info *sbi = UDF_SB(sb);
560
561 uopt.flags = sbi->s_flags;
562 uopt.uid = sbi->s_uid;
563 uopt.gid = sbi->s_gid;
564 uopt.umask = sbi->s_umask;
565 uopt.fmode = sbi->s_fmode;
566 uopt.dmode = sbi->s_dmode;
567
568 if (!udf_parse_options(options, &uopt, true))
569 return -EINVAL;
570
571 lock_kernel();
572 sbi->s_flags = uopt.flags;
573 sbi->s_uid = uopt.uid;
574 sbi->s_gid = uopt.gid;
575 sbi->s_umask = uopt.umask;
576 sbi->s_fmode = uopt.fmode;
577 sbi->s_dmode = uopt.dmode;
578
579 if (sbi->s_lvid_bh) {
580 int write_rev = le16_to_cpu(udf_sb_lvidiu(sbi)->minUDFWriteRev);
581 if (write_rev > UDF_MAX_WRITE_VERSION)
582 *flags |= MS_RDONLY;
583 }
584
585 if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) {
586 unlock_kernel();
587 return 0;
588 }
589 if (*flags & MS_RDONLY)
590 udf_close_lvid(sb);
591 else
592 udf_open_lvid(sb);
593
594 unlock_kernel();
595 return 0;
596}
597
598
599
600static loff_t udf_check_vsd(struct super_block *sb)
601{
602 struct volStructDesc *vsd = NULL;
603 loff_t sector = 32768;
604 int sectorsize;
605 struct buffer_head *bh = NULL;
606 int nsr02 = 0;
607 int nsr03 = 0;
608 struct udf_sb_info *sbi;
609
610 sbi = UDF_SB(sb);
611 if (sb->s_blocksize < sizeof(struct volStructDesc))
612 sectorsize = sizeof(struct volStructDesc);
613 else
614 sectorsize = sb->s_blocksize;
615
616 sector += (sbi->s_session << sb->s_blocksize_bits);
617
618 udf_debug("Starting at sector %u (%ld byte sectors)\n",
619 (unsigned int)(sector >> sb->s_blocksize_bits),
620 sb->s_blocksize);
621
622 for (; !nsr02 && !nsr03; sector += sectorsize) {
623
624 bh = udf_tread(sb, sector >> sb->s_blocksize_bits);
625 if (!bh)
626 break;
627
628
629 vsd = (struct volStructDesc *)(bh->b_data +
630 (sector & (sb->s_blocksize - 1)));
631
632 if (vsd->stdIdent[0] == 0) {
633 brelse(bh);
634 break;
635 } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001,
636 VSD_STD_ID_LEN)) {
637 switch (vsd->structType) {
638 case 0:
639 udf_debug("ISO9660 Boot Record found\n");
640 break;
641 case 1:
642 udf_debug("ISO9660 Primary Volume Descriptor "
643 "found\n");
644 break;
645 case 2:
646 udf_debug("ISO9660 Supplementary Volume "
647 "Descriptor found\n");
648 break;
649 case 3:
650 udf_debug("ISO9660 Volume Partition Descriptor "
651 "found\n");
652 break;
653 case 255:
654 udf_debug("ISO9660 Volume Descriptor Set "
655 "Terminator found\n");
656 break;
657 default:
658 udf_debug("ISO9660 VRS (%u) found\n",
659 vsd->structType);
660 break;
661 }
662 } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BEA01,
663 VSD_STD_ID_LEN))
664 ;
665 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_TEA01,
666 VSD_STD_ID_LEN)) {
667 brelse(bh);
668 break;
669 } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR02,
670 VSD_STD_ID_LEN))
671 nsr02 = sector;
672 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR03,
673 VSD_STD_ID_LEN))
674 nsr03 = sector;
675 brelse(bh);
676 }
677
678 if (nsr03)
679 return nsr03;
680 else if (nsr02)
681 return nsr02;
682 else if (sector - (sbi->s_session << sb->s_blocksize_bits) == 32768)
683 return -1;
684 else
685 return 0;
686}
687
688static int udf_find_fileset(struct super_block *sb,
689 struct kernel_lb_addr *fileset,
690 struct kernel_lb_addr *root)
691{
692 struct buffer_head *bh = NULL;
693 long lastblock;
694 uint16_t ident;
695 struct udf_sb_info *sbi;
696
697 if (fileset->logicalBlockNum != 0xFFFFFFFF ||
698 fileset->partitionReferenceNum != 0xFFFF) {
699 bh = udf_read_ptagged(sb, fileset, 0, &ident);
700
701 if (!bh) {
702 return 1;
703 } else if (ident != TAG_IDENT_FSD) {
704 brelse(bh);
705 return 1;
706 }
707
708 }
709
710 sbi = UDF_SB(sb);
711 if (!bh) {
712
713 struct kernel_lb_addr newfileset;
714
715
716 return 1;
717
718 for (newfileset.partitionReferenceNum = sbi->s_partitions - 1;
719 (newfileset.partitionReferenceNum != 0xFFFF &&
720 fileset->logicalBlockNum == 0xFFFFFFFF &&
721 fileset->partitionReferenceNum == 0xFFFF);
722 newfileset.partitionReferenceNum--) {
723 lastblock = sbi->s_partmaps
724 [newfileset.partitionReferenceNum]
725 .s_partition_len;
726 newfileset.logicalBlockNum = 0;
727
728 do {
729 bh = udf_read_ptagged(sb, &newfileset, 0,
730 &ident);
731 if (!bh) {
732 newfileset.logicalBlockNum++;
733 continue;
734 }
735
736 switch (ident) {
737 case TAG_IDENT_SBD:
738 {
739 struct spaceBitmapDesc *sp;
740 sp = (struct spaceBitmapDesc *)
741 bh->b_data;
742 newfileset.logicalBlockNum += 1 +
743 ((le32_to_cpu(sp->numOfBytes) +
744 sizeof(struct spaceBitmapDesc)
745 - 1) >> sb->s_blocksize_bits);
746 brelse(bh);
747 break;
748 }
749 case TAG_IDENT_FSD:
750 *fileset = newfileset;
751 break;
752 default:
753 newfileset.logicalBlockNum++;
754 brelse(bh);
755 bh = NULL;
756 break;
757 }
758 } while (newfileset.logicalBlockNum < lastblock &&
759 fileset->logicalBlockNum == 0xFFFFFFFF &&
760 fileset->partitionReferenceNum == 0xFFFF);
761 }
762 }
763
764 if ((fileset->logicalBlockNum != 0xFFFFFFFF ||
765 fileset->partitionReferenceNum != 0xFFFF) && bh) {
766 udf_debug("Fileset at block=%d, partition=%d\n",
767 fileset->logicalBlockNum,
768 fileset->partitionReferenceNum);
769
770 sbi->s_partition = fileset->partitionReferenceNum;
771 udf_load_fileset(sb, bh, root);
772 brelse(bh);
773 return 0;
774 }
775 return 1;
776}
777
778static int udf_load_pvoldesc(struct super_block *sb, sector_t block)
779{
780 struct primaryVolDesc *pvoldesc;
781 struct ustr *instr, *outstr;
782 struct buffer_head *bh;
783 uint16_t ident;
784 int ret = 1;
785
786 instr = kmalloc(sizeof(struct ustr), GFP_NOFS);
787 if (!instr)
788 return 1;
789
790 outstr = kmalloc(sizeof(struct ustr), GFP_NOFS);
791 if (!outstr)
792 goto out1;
793
794 bh = udf_read_tagged(sb, block, block, &ident);
795 if (!bh)
796 goto out2;
797
798 BUG_ON(ident != TAG_IDENT_PVD);
799
800 pvoldesc = (struct primaryVolDesc *)bh->b_data;
801
802 if (udf_disk_stamp_to_time(&UDF_SB(sb)->s_record_time,
803 pvoldesc->recordingDateAndTime)) {
804#ifdef UDFFS_DEBUG
805 struct timestamp *ts = &pvoldesc->recordingDateAndTime;
806 udf_debug("recording time %04u/%02u/%02u"
807 " %02u:%02u (%x)\n",
808 le16_to_cpu(ts->year), ts->month, ts->day, ts->hour,
809 ts->minute, le16_to_cpu(ts->typeAndTimezone));
810#endif
811 }
812
813 if (!udf_build_ustr(instr, pvoldesc->volIdent, 32))
814 if (udf_CS0toUTF8(outstr, instr)) {
815 strncpy(UDF_SB(sb)->s_volume_ident, outstr->u_name,
816 outstr->u_len > 31 ? 31 : outstr->u_len);
817 udf_debug("volIdent[] = '%s'\n",
818 UDF_SB(sb)->s_volume_ident);
819 }
820
821 if (!udf_build_ustr(instr, pvoldesc->volSetIdent, 128))
822 if (udf_CS0toUTF8(outstr, instr))
823 udf_debug("volSetIdent[] = '%s'\n", outstr->u_name);
824
825 brelse(bh);
826 ret = 0;
827out2:
828 kfree(outstr);
829out1:
830 kfree(instr);
831 return ret;
832}
833
834static int udf_load_metadata_files(struct super_block *sb, int partition)
835{
836 struct udf_sb_info *sbi = UDF_SB(sb);
837 struct udf_part_map *map;
838 struct udf_meta_data *mdata;
839 struct kernel_lb_addr addr;
840 int fe_error = 0;
841
842 map = &sbi->s_partmaps[partition];
843 mdata = &map->s_type_specific.s_metadata;
844
845
846 addr.logicalBlockNum = mdata->s_meta_file_loc;
847 addr.partitionReferenceNum = map->s_partition_num;
848
849 udf_debug("Metadata file location: block = %d part = %d\n",
850 addr.logicalBlockNum, addr.partitionReferenceNum);
851
852 mdata->s_metadata_fe = udf_iget(sb, &addr);
853
854 if (mdata->s_metadata_fe == NULL) {
855 udf_warning(sb, __func__, "metadata inode efe not found, "
856 "will try mirror inode.");
857 fe_error = 1;
858 } else if (UDF_I(mdata->s_metadata_fe)->i_alloc_type !=
859 ICBTAG_FLAG_AD_SHORT) {
860 udf_warning(sb, __func__, "metadata inode efe does not have "
861 "short allocation descriptors!");
862 fe_error = 1;
863 iput(mdata->s_metadata_fe);
864 mdata->s_metadata_fe = NULL;
865 }
866
867
868 addr.logicalBlockNum = mdata->s_mirror_file_loc;
869 addr.partitionReferenceNum = map->s_partition_num;
870
871 udf_debug("Mirror metadata file location: block = %d part = %d\n",
872 addr.logicalBlockNum, addr.partitionReferenceNum);
873
874 mdata->s_mirror_fe = udf_iget(sb, &addr);
875
876 if (mdata->s_mirror_fe == NULL) {
877 if (fe_error) {
878 udf_error(sb, __func__, "mirror inode efe not found "
879 "and metadata inode is missing too, exiting...");
880 goto error_exit;
881 } else
882 udf_warning(sb, __func__, "mirror inode efe not found,"
883 " but metadata inode is OK");
884 } else if (UDF_I(mdata->s_mirror_fe)->i_alloc_type !=
885 ICBTAG_FLAG_AD_SHORT) {
886 udf_warning(sb, __func__, "mirror inode efe does not have "
887 "short allocation descriptors!");
888 iput(mdata->s_mirror_fe);
889 mdata->s_mirror_fe = NULL;
890 if (fe_error)
891 goto error_exit;
892 }
893
894
895
896
897
898
899 if (mdata->s_bitmap_file_loc != 0xFFFFFFFF) {
900 addr.logicalBlockNum = mdata->s_bitmap_file_loc;
901 addr.partitionReferenceNum = map->s_partition_num;
902
903 udf_debug("Bitmap file location: block = %d part = %d\n",
904 addr.logicalBlockNum, addr.partitionReferenceNum);
905
906 mdata->s_bitmap_fe = udf_iget(sb, &addr);
907
908 if (mdata->s_bitmap_fe == NULL) {
909 if (sb->s_flags & MS_RDONLY)
910 udf_warning(sb, __func__, "bitmap inode efe "
911 "not found but it's ok since the disc"
912 " is mounted read-only");
913 else {
914 udf_error(sb, __func__, "bitmap inode efe not "
915 "found and attempted read-write mount");
916 goto error_exit;
917 }
918 }
919 }
920
921 udf_debug("udf_load_metadata_files Ok\n");
922
923 return 0;
924
925error_exit:
926 return 1;
927}
928
929static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh,
930 struct kernel_lb_addr *root)
931{
932 struct fileSetDesc *fset;
933
934 fset = (struct fileSetDesc *)bh->b_data;
935
936 *root = lelb_to_cpu(fset->rootDirectoryICB.extLocation);
937
938 UDF_SB(sb)->s_serial_number = le16_to_cpu(fset->descTag.tagSerialNum);
939
940 udf_debug("Rootdir at block=%d, partition=%d\n",
941 root->logicalBlockNum, root->partitionReferenceNum);
942}
943
944int udf_compute_nr_groups(struct super_block *sb, u32 partition)
945{
946 struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
947 return DIV_ROUND_UP(map->s_partition_len +
948 (sizeof(struct spaceBitmapDesc) << 3),
949 sb->s_blocksize * 8);
950}
951
952static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index)
953{
954 struct udf_bitmap *bitmap;
955 int nr_groups;
956 int size;
957
958 nr_groups = udf_compute_nr_groups(sb, index);
959 size = sizeof(struct udf_bitmap) +
960 (sizeof(struct buffer_head *) * nr_groups);
961
962 if (size <= PAGE_SIZE)
963 bitmap = kmalloc(size, GFP_KERNEL);
964 else
965 bitmap = vmalloc(size);
966
967 if (bitmap == NULL) {
968 udf_error(sb, __func__,
969 "Unable to allocate space for bitmap "
970 "and %d buffer_head pointers", nr_groups);
971 return NULL;
972 }
973
974 memset(bitmap, 0x00, size);
975 bitmap->s_block_bitmap = (struct buffer_head **)(bitmap + 1);
976 bitmap->s_nr_groups = nr_groups;
977 return bitmap;
978}
979
980static int udf_fill_partdesc_info(struct super_block *sb,
981 struct partitionDesc *p, int p_index)
982{
983 struct udf_part_map *map;
984 struct udf_sb_info *sbi = UDF_SB(sb);
985 struct partitionHeaderDesc *phd;
986
987 map = &sbi->s_partmaps[p_index];
988
989 map->s_partition_len = le32_to_cpu(p->partitionLength);
990 map->s_partition_root = le32_to_cpu(p->partitionStartingLocation);
991
992 if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY))
993 map->s_partition_flags |= UDF_PART_FLAG_READ_ONLY;
994 if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_WRITE_ONCE))
995 map->s_partition_flags |= UDF_PART_FLAG_WRITE_ONCE;
996 if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_REWRITABLE))
997 map->s_partition_flags |= UDF_PART_FLAG_REWRITABLE;
998 if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_OVERWRITABLE))
999 map->s_partition_flags |= UDF_PART_FLAG_OVERWRITABLE;
1000
1001 udf_debug("Partition (%d type %x) starts at physical %d, "
1002 "block length %d\n", p_index,
1003 map->s_partition_type, map->s_partition_root,
1004 map->s_partition_len);
1005
1006 if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) &&
1007 strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03))
1008 return 0;
1009
1010 phd = (struct partitionHeaderDesc *)p->partitionContentsUse;
1011 if (phd->unallocSpaceTable.extLength) {
1012 struct kernel_lb_addr loc = {
1013 .logicalBlockNum = le32_to_cpu(
1014 phd->unallocSpaceTable.extPosition),
1015 .partitionReferenceNum = p_index,
1016 };
1017
1018 map->s_uspace.s_table = udf_iget(sb, &loc);
1019 if (!map->s_uspace.s_table) {
1020 udf_debug("cannot load unallocSpaceTable (part %d)\n",
1021 p_index);
1022 return 1;
1023 }
1024 map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE;
1025 udf_debug("unallocSpaceTable (part %d) @ %ld\n",
1026 p_index, map->s_uspace.s_table->i_ino);
1027 }
1028
1029 if (phd->unallocSpaceBitmap.extLength) {
1030 struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
1031 if (!bitmap)
1032 return 1;
1033 map->s_uspace.s_bitmap = bitmap;
1034 bitmap->s_extLength = le32_to_cpu(
1035 phd->unallocSpaceBitmap.extLength);
1036 bitmap->s_extPosition = le32_to_cpu(
1037 phd->unallocSpaceBitmap.extPosition);
1038 map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP;
1039 udf_debug("unallocSpaceBitmap (part %d) @ %d\n", p_index,
1040 bitmap->s_extPosition);
1041 }
1042
1043 if (phd->partitionIntegrityTable.extLength)
1044 udf_debug("partitionIntegrityTable (part %d)\n", p_index);
1045
1046 if (phd->freedSpaceTable.extLength) {
1047 struct kernel_lb_addr loc = {
1048 .logicalBlockNum = le32_to_cpu(
1049 phd->freedSpaceTable.extPosition),
1050 .partitionReferenceNum = p_index,
1051 };
1052
1053 map->s_fspace.s_table = udf_iget(sb, &loc);
1054 if (!map->s_fspace.s_table) {
1055 udf_debug("cannot load freedSpaceTable (part %d)\n",
1056 p_index);
1057 return 1;
1058 }
1059
1060 map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE;
1061 udf_debug("freedSpaceTable (part %d) @ %ld\n",
1062 p_index, map->s_fspace.s_table->i_ino);
1063 }
1064
1065 if (phd->freedSpaceBitmap.extLength) {
1066 struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
1067 if (!bitmap)
1068 return 1;
1069 map->s_fspace.s_bitmap = bitmap;
1070 bitmap->s_extLength = le32_to_cpu(
1071 phd->freedSpaceBitmap.extLength);
1072 bitmap->s_extPosition = le32_to_cpu(
1073 phd->freedSpaceBitmap.extPosition);
1074 map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP;
1075 udf_debug("freedSpaceBitmap (part %d) @ %d\n", p_index,
1076 bitmap->s_extPosition);
1077 }
1078 return 0;
1079}
1080
1081static void udf_find_vat_block(struct super_block *sb, int p_index,
1082 int type1_index, sector_t start_block)
1083{
1084 struct udf_sb_info *sbi = UDF_SB(sb);
1085 struct udf_part_map *map = &sbi->s_partmaps[p_index];
1086 sector_t vat_block;
1087 struct kernel_lb_addr ino;
1088
1089
1090
1091
1092
1093 ino.partitionReferenceNum = type1_index;
1094 for (vat_block = start_block;
1095 vat_block >= map->s_partition_root &&
1096 vat_block >= start_block - 3 &&
1097 !sbi->s_vat_inode; vat_block--) {
1098 ino.logicalBlockNum = vat_block - map->s_partition_root;
1099 sbi->s_vat_inode = udf_iget(sb, &ino);
1100 }
1101}
1102
1103static int udf_load_vat(struct super_block *sb, int p_index, int type1_index)
1104{
1105 struct udf_sb_info *sbi = UDF_SB(sb);
1106 struct udf_part_map *map = &sbi->s_partmaps[p_index];
1107 struct buffer_head *bh = NULL;
1108 struct udf_inode_info *vati;
1109 uint32_t pos;
1110 struct virtualAllocationTable20 *vat20;
1111 sector_t blocks = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits;
1112
1113 udf_find_vat_block(sb, p_index, type1_index, sbi->s_last_block);
1114 if (!sbi->s_vat_inode &&
1115 sbi->s_last_block != blocks - 1) {
1116 printk(KERN_NOTICE "UDF-fs: Failed to read VAT inode from the"
1117 " last recorded block (%lu), retrying with the last "
1118 "block of the device (%lu).\n",
1119 (unsigned long)sbi->s_last_block,
1120 (unsigned long)blocks - 1);
1121 udf_find_vat_block(sb, p_index, type1_index, blocks - 1);
1122 }
1123 if (!sbi->s_vat_inode)
1124 return 1;
1125
1126 if (map->s_partition_type == UDF_VIRTUAL_MAP15) {
1127 map->s_type_specific.s_virtual.s_start_offset = 0;
1128 map->s_type_specific.s_virtual.s_num_entries =
1129 (sbi->s_vat_inode->i_size - 36) >> 2;
1130 } else if (map->s_partition_type == UDF_VIRTUAL_MAP20) {
1131 vati = UDF_I(sbi->s_vat_inode);
1132 if (vati->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
1133 pos = udf_block_map(sbi->s_vat_inode, 0);
1134 bh = sb_bread(sb, pos);
1135 if (!bh)
1136 return 1;
1137 vat20 = (struct virtualAllocationTable20 *)bh->b_data;
1138 } else {
1139 vat20 = (struct virtualAllocationTable20 *)
1140 vati->i_ext.i_data;
1141 }
1142
1143 map->s_type_specific.s_virtual.s_start_offset =
1144 le16_to_cpu(vat20->lengthHeader);
1145 map->s_type_specific.s_virtual.s_num_entries =
1146 (sbi->s_vat_inode->i_size -
1147 map->s_type_specific.s_virtual.
1148 s_start_offset) >> 2;
1149 brelse(bh);
1150 }
1151 return 0;
1152}
1153
1154static int udf_load_partdesc(struct super_block *sb, sector_t block)
1155{
1156 struct buffer_head *bh;
1157 struct partitionDesc *p;
1158 struct udf_part_map *map;
1159 struct udf_sb_info *sbi = UDF_SB(sb);
1160 int i, type1_idx;
1161 uint16_t partitionNumber;
1162 uint16_t ident;
1163 int ret = 0;
1164
1165 bh = udf_read_tagged(sb, block, block, &ident);
1166 if (!bh)
1167 return 1;
1168 if (ident != TAG_IDENT_PD)
1169 goto out_bh;
1170
1171 p = (struct partitionDesc *)bh->b_data;
1172 partitionNumber = le16_to_cpu(p->partitionNumber);
1173
1174
1175 for (i = 0; i < sbi->s_partitions; i++) {
1176 map = &sbi->s_partmaps[i];
1177 udf_debug("Searching map: (%d == %d)\n",
1178 map->s_partition_num, partitionNumber);
1179 if (map->s_partition_num == partitionNumber &&
1180 (map->s_partition_type == UDF_TYPE1_MAP15 ||
1181 map->s_partition_type == UDF_SPARABLE_MAP15))
1182 break;
1183 }
1184
1185 if (i >= sbi->s_partitions) {
1186 udf_debug("Partition (%d) not found in partition map\n",
1187 partitionNumber);
1188 goto out_bh;
1189 }
1190
1191 ret = udf_fill_partdesc_info(sb, p, i);
1192
1193
1194
1195
1196
1197 type1_idx = i;
1198 for (i = 0; i < sbi->s_partitions; i++) {
1199 map = &sbi->s_partmaps[i];
1200
1201 if (map->s_partition_num == partitionNumber &&
1202 (map->s_partition_type == UDF_VIRTUAL_MAP15 ||
1203 map->s_partition_type == UDF_VIRTUAL_MAP20 ||
1204 map->s_partition_type == UDF_METADATA_MAP25))
1205 break;
1206 }
1207
1208 if (i >= sbi->s_partitions)
1209 goto out_bh;
1210
1211 ret = udf_fill_partdesc_info(sb, p, i);
1212 if (ret)
1213 goto out_bh;
1214
1215 if (map->s_partition_type == UDF_METADATA_MAP25) {
1216 ret = udf_load_metadata_files(sb, i);
1217 if (ret) {
1218 printk(KERN_ERR "UDF-fs: error loading MetaData "
1219 "partition map %d\n", i);
1220 goto out_bh;
1221 }
1222 } else {
1223 ret = udf_load_vat(sb, i, type1_idx);
1224 if (ret)
1225 goto out_bh;
1226
1227
1228
1229
1230
1231 sb->s_flags |= MS_RDONLY;
1232 printk(KERN_NOTICE "UDF-fs: Filesystem marked read-only "
1233 "because writing to pseudooverwrite partition is "
1234 "not implemented.\n");
1235 }
1236out_bh:
1237
1238 brelse(bh);
1239 return ret;
1240}
1241
1242static int udf_load_logicalvol(struct super_block *sb, sector_t block,
1243 struct kernel_lb_addr *fileset)
1244{
1245 struct logicalVolDesc *lvd;
1246 int i, j, offset;
1247 uint8_t type;
1248 struct udf_sb_info *sbi = UDF_SB(sb);
1249 struct genericPartitionMap *gpm;
1250 uint16_t ident;
1251 struct buffer_head *bh;
1252 int ret = 0;
1253
1254 bh = udf_read_tagged(sb, block, block, &ident);
1255 if (!bh)
1256 return 1;
1257 BUG_ON(ident != TAG_IDENT_LVD);
1258 lvd = (struct logicalVolDesc *)bh->b_data;
1259
1260 i = udf_sb_alloc_partition_maps(sb, le32_to_cpu(lvd->numPartitionMaps));
1261 if (i != 0) {
1262 ret = i;
1263 goto out_bh;
1264 }
1265
1266 for (i = 0, offset = 0;
1267 i < sbi->s_partitions && offset < le32_to_cpu(lvd->mapTableLength);
1268 i++, offset += gpm->partitionMapLength) {
1269 struct udf_part_map *map = &sbi->s_partmaps[i];
1270 gpm = (struct genericPartitionMap *)
1271 &(lvd->partitionMaps[offset]);
1272 type = gpm->partitionMapType;
1273 if (type == 1) {
1274 struct genericPartitionMap1 *gpm1 =
1275 (struct genericPartitionMap1 *)gpm;
1276 map->s_partition_type = UDF_TYPE1_MAP15;
1277 map->s_volumeseqnum = le16_to_cpu(gpm1->volSeqNum);
1278 map->s_partition_num = le16_to_cpu(gpm1->partitionNum);
1279 map->s_partition_func = NULL;
1280 } else if (type == 2) {
1281 struct udfPartitionMap2 *upm2 =
1282 (struct udfPartitionMap2 *)gpm;
1283 if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL,
1284 strlen(UDF_ID_VIRTUAL))) {
1285 u16 suf =
1286 le16_to_cpu(((__le16 *)upm2->partIdent.
1287 identSuffix)[0]);
1288 if (suf < 0x0200) {
1289 map->s_partition_type =
1290 UDF_VIRTUAL_MAP15;
1291 map->s_partition_func =
1292 udf_get_pblock_virt15;
1293 } else {
1294 map->s_partition_type =
1295 UDF_VIRTUAL_MAP20;
1296 map->s_partition_func =
1297 udf_get_pblock_virt20;
1298 }
1299 } else if (!strncmp(upm2->partIdent.ident,
1300 UDF_ID_SPARABLE,
1301 strlen(UDF_ID_SPARABLE))) {
1302 uint32_t loc;
1303 struct sparingTable *st;
1304 struct sparablePartitionMap *spm =
1305 (struct sparablePartitionMap *)gpm;
1306
1307 map->s_partition_type = UDF_SPARABLE_MAP15;
1308 map->s_type_specific.s_sparing.s_packet_len =
1309 le16_to_cpu(spm->packetLength);
1310 for (j = 0; j < spm->numSparingTables; j++) {
1311 struct buffer_head *bh2;
1312
1313 loc = le32_to_cpu(
1314 spm->locSparingTable[j]);
1315 bh2 = udf_read_tagged(sb, loc, loc,
1316 &ident);
1317 map->s_type_specific.s_sparing.
1318 s_spar_map[j] = bh2;
1319
1320 if (bh2 == NULL)
1321 continue;
1322
1323 st = (struct sparingTable *)bh2->b_data;
1324 if (ident != 0 || strncmp(
1325 st->sparingIdent.ident,
1326 UDF_ID_SPARING,
1327 strlen(UDF_ID_SPARING))) {
1328 brelse(bh2);
1329 map->s_type_specific.s_sparing.
1330 s_spar_map[j] = NULL;
1331 }
1332 }
1333 map->s_partition_func = udf_get_pblock_spar15;
1334 } else if (!strncmp(upm2->partIdent.ident,
1335 UDF_ID_METADATA,
1336 strlen(UDF_ID_METADATA))) {
1337 struct udf_meta_data *mdata =
1338 &map->s_type_specific.s_metadata;
1339 struct metadataPartitionMap *mdm =
1340 (struct metadataPartitionMap *)
1341 &(lvd->partitionMaps[offset]);
1342 udf_debug("Parsing Logical vol part %d "
1343 "type %d id=%s\n", i, type,
1344 UDF_ID_METADATA);
1345
1346 map->s_partition_type = UDF_METADATA_MAP25;
1347 map->s_partition_func = udf_get_pblock_meta25;
1348
1349 mdata->s_meta_file_loc =
1350 le32_to_cpu(mdm->metadataFileLoc);
1351 mdata->s_mirror_file_loc =
1352 le32_to_cpu(mdm->metadataMirrorFileLoc);
1353 mdata->s_bitmap_file_loc =
1354 le32_to_cpu(mdm->metadataBitmapFileLoc);
1355 mdata->s_alloc_unit_size =
1356 le32_to_cpu(mdm->allocUnitSize);
1357 mdata->s_align_unit_size =
1358 le16_to_cpu(mdm->alignUnitSize);
1359 mdata->s_dup_md_flag =
1360 mdm->flags & 0x01;
1361
1362 udf_debug("Metadata Ident suffix=0x%x\n",
1363 (le16_to_cpu(
1364 ((__le16 *)
1365 mdm->partIdent.identSuffix)[0])));
1366 udf_debug("Metadata part num=%d\n",
1367 le16_to_cpu(mdm->partitionNum));
1368 udf_debug("Metadata part alloc unit size=%d\n",
1369 le32_to_cpu(mdm->allocUnitSize));
1370 udf_debug("Metadata file loc=%d\n",
1371 le32_to_cpu(mdm->metadataFileLoc));
1372 udf_debug("Mirror file loc=%d\n",
1373 le32_to_cpu(mdm->metadataMirrorFileLoc));
1374 udf_debug("Bitmap file loc=%d\n",
1375 le32_to_cpu(mdm->metadataBitmapFileLoc));
1376 udf_debug("Duplicate Flag: %d %d\n",
1377 mdata->s_dup_md_flag, mdm->flags);
1378 } else {
1379 udf_debug("Unknown ident: %s\n",
1380 upm2->partIdent.ident);
1381 continue;
1382 }
1383 map->s_volumeseqnum = le16_to_cpu(upm2->volSeqNum);
1384 map->s_partition_num = le16_to_cpu(upm2->partitionNum);
1385 }
1386 udf_debug("Partition (%d:%d) type %d on volume %d\n",
1387 i, map->s_partition_num, type,
1388 map->s_volumeseqnum);
1389 }
1390
1391 if (fileset) {
1392 struct long_ad *la = (struct long_ad *)&(lvd->logicalVolContentsUse[0]);
1393
1394 *fileset = lelb_to_cpu(la->extLocation);
1395 udf_debug("FileSet found in LogicalVolDesc at block=%d, "
1396 "partition=%d\n", fileset->logicalBlockNum,
1397 fileset->partitionReferenceNum);
1398 }
1399 if (lvd->integritySeqExt.extLength)
1400 udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt));
1401
1402out_bh:
1403 brelse(bh);
1404 return ret;
1405}
1406
1407
1408
1409
1410
1411static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_ad loc)
1412{
1413 struct buffer_head *bh = NULL;
1414 uint16_t ident;
1415 struct udf_sb_info *sbi = UDF_SB(sb);
1416 struct logicalVolIntegrityDesc *lvid;
1417
1418 while (loc.extLength > 0 &&
1419 (bh = udf_read_tagged(sb, loc.extLocation,
1420 loc.extLocation, &ident)) &&
1421 ident == TAG_IDENT_LVID) {
1422 sbi->s_lvid_bh = bh;
1423 lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
1424
1425 if (lvid->nextIntegrityExt.extLength)
1426 udf_load_logicalvolint(sb,
1427 leea_to_cpu(lvid->nextIntegrityExt));
1428
1429 if (sbi->s_lvid_bh != bh)
1430 brelse(bh);
1431 loc.extLength -= sb->s_blocksize;
1432 loc.extLocation++;
1433 }
1434 if (sbi->s_lvid_bh != bh)
1435 brelse(bh);
1436}
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453static noinline int udf_process_sequence(struct super_block *sb, long block,
1454 long lastblock, struct kernel_lb_addr *fileset)
1455{
1456 struct buffer_head *bh = NULL;
1457 struct udf_vds_record vds[VDS_POS_LENGTH];
1458 struct udf_vds_record *curr;
1459 struct generic_desc *gd;
1460 struct volDescPtr *vdp;
1461 int done = 0;
1462 uint32_t vdsn;
1463 uint16_t ident;
1464 long next_s = 0, next_e = 0;
1465
1466 memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH);
1467
1468
1469
1470
1471
1472 for (; (!done && block <= lastblock); block++) {
1473
1474 bh = udf_read_tagged(sb, block, block, &ident);
1475 if (!bh) {
1476 printk(KERN_ERR "udf: Block %Lu of volume descriptor "
1477 "sequence is corrupted or we could not read "
1478 "it.\n", (unsigned long long)block);
1479 return 1;
1480 }
1481
1482
1483 gd = (struct generic_desc *)bh->b_data;
1484 vdsn = le32_to_cpu(gd->volDescSeqNum);
1485 switch (ident) {
1486 case TAG_IDENT_PVD:
1487 curr = &vds[VDS_POS_PRIMARY_VOL_DESC];
1488 if (vdsn >= curr->volDescSeqNum) {
1489 curr->volDescSeqNum = vdsn;
1490 curr->block = block;
1491 }
1492 break;
1493 case TAG_IDENT_VDP:
1494 curr = &vds[VDS_POS_VOL_DESC_PTR];
1495 if (vdsn >= curr->volDescSeqNum) {
1496 curr->volDescSeqNum = vdsn;
1497 curr->block = block;
1498
1499 vdp = (struct volDescPtr *)bh->b_data;
1500 next_s = le32_to_cpu(
1501 vdp->nextVolDescSeqExt.extLocation);
1502 next_e = le32_to_cpu(
1503 vdp->nextVolDescSeqExt.extLength);
1504 next_e = next_e >> sb->s_blocksize_bits;
1505 next_e += next_s;
1506 }
1507 break;
1508 case TAG_IDENT_IUVD:
1509 curr = &vds[VDS_POS_IMP_USE_VOL_DESC];
1510 if (vdsn >= curr->volDescSeqNum) {
1511 curr->volDescSeqNum = vdsn;
1512 curr->block = block;
1513 }
1514 break;
1515 case TAG_IDENT_PD:
1516 curr = &vds[VDS_POS_PARTITION_DESC];
1517 if (!curr->block)
1518 curr->block = block;
1519 break;
1520 case TAG_IDENT_LVD:
1521 curr = &vds[VDS_POS_LOGICAL_VOL_DESC];
1522 if (vdsn >= curr->volDescSeqNum) {
1523 curr->volDescSeqNum = vdsn;
1524 curr->block = block;
1525 }
1526 break;
1527 case TAG_IDENT_USD:
1528 curr = &vds[VDS_POS_UNALLOC_SPACE_DESC];
1529 if (vdsn >= curr->volDescSeqNum) {
1530 curr->volDescSeqNum = vdsn;
1531 curr->block = block;
1532 }
1533 break;
1534 case TAG_IDENT_TD:
1535 vds[VDS_POS_TERMINATING_DESC].block = block;
1536 if (next_e) {
1537 block = next_s;
1538 lastblock = next_e;
1539 next_s = next_e = 0;
1540 } else
1541 done = 1;
1542 break;
1543 }
1544 brelse(bh);
1545 }
1546
1547
1548
1549
1550 if (!vds[VDS_POS_PRIMARY_VOL_DESC].block) {
1551 printk(KERN_ERR "udf: Primary Volume Descriptor not found!\n");
1552 return 1;
1553 }
1554 if (udf_load_pvoldesc(sb, vds[VDS_POS_PRIMARY_VOL_DESC].block))
1555 return 1;
1556
1557 if (vds[VDS_POS_LOGICAL_VOL_DESC].block && udf_load_logicalvol(sb,
1558 vds[VDS_POS_LOGICAL_VOL_DESC].block, fileset))
1559 return 1;
1560
1561 if (vds[VDS_POS_PARTITION_DESC].block) {
1562
1563
1564
1565
1566 for (block = vds[VDS_POS_PARTITION_DESC].block;
1567 block < vds[VDS_POS_TERMINATING_DESC].block;
1568 block++)
1569 if (udf_load_partdesc(sb, block))
1570 return 1;
1571 }
1572
1573 return 0;
1574}
1575
1576static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh,
1577 struct kernel_lb_addr *fileset)
1578{
1579 struct anchorVolDescPtr *anchor;
1580 long main_s, main_e, reserve_s, reserve_e;
1581 struct udf_sb_info *sbi;
1582
1583 sbi = UDF_SB(sb);
1584 anchor = (struct anchorVolDescPtr *)bh->b_data;
1585
1586
1587 main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation);
1588 main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength);
1589 main_e = main_e >> sb->s_blocksize_bits;
1590 main_e += main_s;
1591
1592
1593 reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation);
1594 reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength);
1595 reserve_e = reserve_e >> sb->s_blocksize_bits;
1596 reserve_e += reserve_s;
1597
1598
1599
1600 if (!udf_process_sequence(sb, main_s, main_e, fileset))
1601 return 1;
1602 return !udf_process_sequence(sb, reserve_s, reserve_e, fileset);
1603}
1604
1605
1606
1607
1608
1609static int udf_check_anchor_block(struct super_block *sb, sector_t block,
1610 struct kernel_lb_addr *fileset)
1611{
1612 struct buffer_head *bh;
1613 uint16_t ident;
1614 int ret;
1615
1616 if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) &&
1617 udf_fixed_to_variable(block) >=
1618 sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits)
1619 return 0;
1620
1621 bh = udf_read_tagged(sb, block, block, &ident);
1622 if (!bh)
1623 return 0;
1624 if (ident != TAG_IDENT_AVDP) {
1625 brelse(bh);
1626 return 0;
1627 }
1628 ret = udf_load_sequence(sb, bh, fileset);
1629 brelse(bh);
1630 return ret;
1631}
1632
1633
1634static sector_t udf_scan_anchors(struct super_block *sb, sector_t lastblock,
1635 struct kernel_lb_addr *fileset)
1636{
1637 sector_t last[6];
1638 int i;
1639 struct udf_sb_info *sbi = UDF_SB(sb);
1640 int last_count = 0;
1641
1642
1643 if (sbi->s_anchor) {
1644 if (udf_check_anchor_block(sb, sbi->s_anchor, fileset))
1645 return lastblock;
1646 }
1647
1648
1649
1650
1651
1652
1653
1654 if (udf_check_anchor_block(sb, sbi->s_session + 256, fileset))
1655 return lastblock;
1656
1657
1658
1659
1660 last[last_count++] = lastblock;
1661 if (lastblock >= 1)
1662 last[last_count++] = lastblock - 1;
1663 last[last_count++] = lastblock + 1;
1664 if (lastblock >= 2)
1665 last[last_count++] = lastblock - 2;
1666 if (lastblock >= 150)
1667 last[last_count++] = lastblock - 150;
1668 if (lastblock >= 152)
1669 last[last_count++] = lastblock - 152;
1670
1671 for (i = 0; i < last_count; i++) {
1672 if (last[i] >= sb->s_bdev->bd_inode->i_size >>
1673 sb->s_blocksize_bits)
1674 continue;
1675 if (udf_check_anchor_block(sb, last[i], fileset))
1676 return last[i];
1677 if (last[i] < 256)
1678 continue;
1679 if (udf_check_anchor_block(sb, last[i] - 256, fileset))
1680 return last[i];
1681 }
1682
1683
1684 if (udf_check_anchor_block(sb, sbi->s_session + 512, fileset))
1685 return last[0];
1686 return 0;
1687}
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697static int udf_find_anchor(struct super_block *sb,
1698 struct kernel_lb_addr *fileset)
1699{
1700 sector_t lastblock;
1701 struct udf_sb_info *sbi = UDF_SB(sb);
1702
1703 lastblock = udf_scan_anchors(sb, sbi->s_last_block, fileset);
1704 if (lastblock)
1705 goto out;
1706
1707
1708 UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
1709
1710 lastblock = udf_scan_anchors(sb,
1711 udf_variable_to_fixed(sbi->s_last_block),
1712 fileset);
1713 if (lastblock)
1714 goto out;
1715
1716
1717 lastblock = udf_scan_anchors(sb, sbi->s_last_block, fileset);
1718 if (!lastblock) {
1719
1720 UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV);
1721 return 0;
1722 }
1723out:
1724 sbi->s_last_block = lastblock;
1725 return 1;
1726}
1727
1728
1729
1730
1731
1732static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt,
1733 int silent, struct kernel_lb_addr *fileset)
1734{
1735 struct udf_sb_info *sbi = UDF_SB(sb);
1736 loff_t nsr_off;
1737
1738 if (!sb_set_blocksize(sb, uopt->blocksize)) {
1739 if (!silent)
1740 printk(KERN_WARNING "UDF-fs: Bad block size\n");
1741 return 0;
1742 }
1743 sbi->s_last_block = uopt->lastblock;
1744 if (!uopt->novrs) {
1745
1746 nsr_off = udf_check_vsd(sb);
1747 if (!nsr_off) {
1748 if (!silent)
1749 printk(KERN_WARNING "UDF-fs: No VRS found\n");
1750 return 0;
1751 }
1752 if (nsr_off == -1)
1753 udf_debug("Failed to read byte 32768. Assuming open "
1754 "disc. Skipping validity check\n");
1755 if (!sbi->s_last_block)
1756 sbi->s_last_block = udf_get_last_block(sb);
1757 } else {
1758 udf_debug("Validity check skipped because of novrs option\n");
1759 }
1760
1761
1762 sbi->s_anchor = uopt->anchor;
1763 if (!udf_find_anchor(sb, fileset)) {
1764 if (!silent)
1765 printk(KERN_WARNING "UDF-fs: No anchor found\n");
1766 return 0;
1767 }
1768 return 1;
1769}
1770
1771static void udf_open_lvid(struct super_block *sb)
1772{
1773 struct udf_sb_info *sbi = UDF_SB(sb);
1774 struct buffer_head *bh = sbi->s_lvid_bh;
1775 struct logicalVolIntegrityDesc *lvid;
1776 struct logicalVolIntegrityDescImpUse *lvidiu;
1777
1778 if (!bh)
1779 return;
1780 lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
1781 lvidiu = udf_sb_lvidiu(sbi);
1782
1783 lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1784 lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1785 udf_time_to_disk_stamp(&lvid->recordingDateAndTime,
1786 CURRENT_TIME);
1787 lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN);
1788
1789 lvid->descTag.descCRC = cpu_to_le16(
1790 crc_itu_t(0, (char *)lvid + sizeof(struct tag),
1791 le16_to_cpu(lvid->descTag.descCRCLength)));
1792
1793 lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
1794 mark_buffer_dirty(bh);
1795 sbi->s_lvid_dirty = 0;
1796}
1797
1798static void udf_close_lvid(struct super_block *sb)
1799{
1800 struct udf_sb_info *sbi = UDF_SB(sb);
1801 struct buffer_head *bh = sbi->s_lvid_bh;
1802 struct logicalVolIntegrityDesc *lvid;
1803 struct logicalVolIntegrityDescImpUse *lvidiu;
1804
1805 if (!bh)
1806 return;
1807
1808 lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
1809 lvidiu = udf_sb_lvidiu(sbi);
1810 lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1811 lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1812 udf_time_to_disk_stamp(&lvid->recordingDateAndTime, CURRENT_TIME);
1813 if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev))
1814 lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
1815 if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFReadRev))
1816 lvidiu->minUDFReadRev = cpu_to_le16(sbi->s_udfrev);
1817 if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFWriteRev))
1818 lvidiu->minUDFWriteRev = cpu_to_le16(sbi->s_udfrev);
1819 lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE);
1820
1821 lvid->descTag.descCRC = cpu_to_le16(
1822 crc_itu_t(0, (char *)lvid + sizeof(struct tag),
1823 le16_to_cpu(lvid->descTag.descCRCLength)));
1824
1825 lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
1826 mark_buffer_dirty(bh);
1827 sbi->s_lvid_dirty = 0;
1828}
1829
1830static void udf_sb_free_bitmap(struct udf_bitmap *bitmap)
1831{
1832 int i;
1833 int nr_groups = bitmap->s_nr_groups;
1834 int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) *
1835 nr_groups);
1836
1837 for (i = 0; i < nr_groups; i++)
1838 if (bitmap->s_block_bitmap[i])
1839 brelse(bitmap->s_block_bitmap[i]);
1840
1841 if (size <= PAGE_SIZE)
1842 kfree(bitmap);
1843 else
1844 vfree(bitmap);
1845}
1846
1847static void udf_free_partition(struct udf_part_map *map)
1848{
1849 int i;
1850 struct udf_meta_data *mdata;
1851
1852 if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
1853 iput(map->s_uspace.s_table);
1854 if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
1855 iput(map->s_fspace.s_table);
1856 if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
1857 udf_sb_free_bitmap(map->s_uspace.s_bitmap);
1858 if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
1859 udf_sb_free_bitmap(map->s_fspace.s_bitmap);
1860 if (map->s_partition_type == UDF_SPARABLE_MAP15)
1861 for (i = 0; i < 4; i++)
1862 brelse(map->s_type_specific.s_sparing.s_spar_map[i]);
1863 else if (map->s_partition_type == UDF_METADATA_MAP25) {
1864 mdata = &map->s_type_specific.s_metadata;
1865 iput(mdata->s_metadata_fe);
1866 mdata->s_metadata_fe = NULL;
1867
1868 iput(mdata->s_mirror_fe);
1869 mdata->s_mirror_fe = NULL;
1870
1871 iput(mdata->s_bitmap_fe);
1872 mdata->s_bitmap_fe = NULL;
1873 }
1874}
1875
1876static int udf_fill_super(struct super_block *sb, void *options, int silent)
1877{
1878 int i;
1879 int ret;
1880 struct inode *inode = NULL;
1881 struct udf_options uopt;
1882 struct kernel_lb_addr rootdir, fileset;
1883 struct udf_sb_info *sbi;
1884
1885 uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT);
1886 uopt.uid = -1;
1887 uopt.gid = -1;
1888 uopt.umask = 0;
1889 uopt.fmode = UDF_INVALID_MODE;
1890 uopt.dmode = UDF_INVALID_MODE;
1891
1892 sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL);
1893 if (!sbi)
1894 return -ENOMEM;
1895
1896 sb->s_fs_info = sbi;
1897
1898 mutex_init(&sbi->s_alloc_mutex);
1899
1900 if (!udf_parse_options((char *)options, &uopt, false))
1901 goto error_out;
1902
1903 if (uopt.flags & (1 << UDF_FLAG_UTF8) &&
1904 uopt.flags & (1 << UDF_FLAG_NLS_MAP)) {
1905 udf_error(sb, "udf_read_super",
1906 "utf8 cannot be combined with iocharset\n");
1907 goto error_out;
1908 }
1909#ifdef CONFIG_UDF_NLS
1910 if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map) {
1911 uopt.nls_map = load_nls_default();
1912 if (!uopt.nls_map)
1913 uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP);
1914 else
1915 udf_debug("Using default NLS map\n");
1916 }
1917#endif
1918 if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP)))
1919 uopt.flags |= (1 << UDF_FLAG_UTF8);
1920
1921 fileset.logicalBlockNum = 0xFFFFFFFF;
1922 fileset.partitionReferenceNum = 0xFFFF;
1923
1924 sbi->s_flags = uopt.flags;
1925 sbi->s_uid = uopt.uid;
1926 sbi->s_gid = uopt.gid;
1927 sbi->s_umask = uopt.umask;
1928 sbi->s_fmode = uopt.fmode;
1929 sbi->s_dmode = uopt.dmode;
1930 sbi->s_nls_map = uopt.nls_map;
1931
1932 if (uopt.session == 0xFFFFFFFF)
1933 sbi->s_session = udf_get_last_session(sb);
1934 else
1935 sbi->s_session = uopt.session;
1936
1937 udf_debug("Multi-session=%d\n", sbi->s_session);
1938
1939
1940 sb->s_op = &udf_sb_ops;
1941 sb->s_export_op = &udf_export_ops;
1942 sb->dq_op = NULL;
1943 sb->s_dirt = 0;
1944 sb->s_magic = UDF_SUPER_MAGIC;
1945 sb->s_time_gran = 1000;
1946
1947 if (uopt.flags & (1 << UDF_FLAG_BLOCKSIZE_SET)) {
1948 ret = udf_load_vrs(sb, &uopt, silent, &fileset);
1949 } else {
1950 uopt.blocksize = bdev_logical_block_size(sb->s_bdev);
1951 ret = udf_load_vrs(sb, &uopt, silent, &fileset);
1952 if (!ret && uopt.blocksize != UDF_DEFAULT_BLOCKSIZE) {
1953 if (!silent)
1954 printk(KERN_NOTICE
1955 "UDF-fs: Rescanning with blocksize "
1956 "%d\n", UDF_DEFAULT_BLOCKSIZE);
1957 uopt.blocksize = UDF_DEFAULT_BLOCKSIZE;
1958 ret = udf_load_vrs(sb, &uopt, silent, &fileset);
1959 }
1960 }
1961 if (!ret) {
1962 printk(KERN_WARNING "UDF-fs: No partition found (1)\n");
1963 goto error_out;
1964 }
1965
1966 udf_debug("Lastblock=%d\n", sbi->s_last_block);
1967
1968 if (sbi->s_lvid_bh) {
1969 struct logicalVolIntegrityDescImpUse *lvidiu =
1970 udf_sb_lvidiu(sbi);
1971 uint16_t minUDFReadRev = le16_to_cpu(lvidiu->minUDFReadRev);
1972 uint16_t minUDFWriteRev = le16_to_cpu(lvidiu->minUDFWriteRev);
1973
1974
1975
1976 if (minUDFReadRev > UDF_MAX_READ_VERSION) {
1977 printk(KERN_ERR "UDF-fs: minUDFReadRev=%x "
1978 "(max is %x)\n",
1979 le16_to_cpu(lvidiu->minUDFReadRev),
1980 UDF_MAX_READ_VERSION);
1981 goto error_out;
1982 } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION)
1983 sb->s_flags |= MS_RDONLY;
1984
1985 sbi->s_udfrev = minUDFWriteRev;
1986
1987 if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE)
1988 UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE);
1989 if (minUDFReadRev >= UDF_VERS_USE_STREAMS)
1990 UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS);
1991 }
1992
1993 if (!sbi->s_partitions) {
1994 printk(KERN_WARNING "UDF-fs: No partition found (2)\n");
1995 goto error_out;
1996 }
1997
1998 if (sbi->s_partmaps[sbi->s_partition].s_partition_flags &
1999 UDF_PART_FLAG_READ_ONLY) {
2000 printk(KERN_NOTICE "UDF-fs: Partition marked readonly; "
2001 "forcing readonly mount\n");
2002 sb->s_flags |= MS_RDONLY;
2003 }
2004
2005 if (udf_find_fileset(sb, &fileset, &rootdir)) {
2006 printk(KERN_WARNING "UDF-fs: No fileset found\n");
2007 goto error_out;
2008 }
2009
2010 if (!silent) {
2011 struct timestamp ts;
2012 udf_time_to_disk_stamp(&ts, sbi->s_record_time);
2013 udf_info("UDF: Mounting volume '%s', "
2014 "timestamp %04u/%02u/%02u %02u:%02u (%x)\n",
2015 sbi->s_volume_ident, le16_to_cpu(ts.year), ts.month, ts.day,
2016 ts.hour, ts.minute, le16_to_cpu(ts.typeAndTimezone));
2017 }
2018 if (!(sb->s_flags & MS_RDONLY))
2019 udf_open_lvid(sb);
2020
2021
2022
2023
2024 inode = udf_iget(sb, &rootdir);
2025 if (!inode) {
2026 printk(KERN_ERR "UDF-fs: Error in udf_iget, block=%d, "
2027 "partition=%d\n",
2028 rootdir.logicalBlockNum, rootdir.partitionReferenceNum);
2029 goto error_out;
2030 }
2031
2032
2033 sb->s_root = d_alloc_root(inode);
2034 if (!sb->s_root) {
2035 printk(KERN_ERR "UDF-fs: Couldn't allocate root dentry\n");
2036 iput(inode);
2037 goto error_out;
2038 }
2039 sb->s_maxbytes = MAX_LFS_FILESIZE;
2040 return 0;
2041
2042error_out:
2043 if (sbi->s_vat_inode)
2044 iput(sbi->s_vat_inode);
2045 if (sbi->s_partitions)
2046 for (i = 0; i < sbi->s_partitions; i++)
2047 udf_free_partition(&sbi->s_partmaps[i]);
2048#ifdef CONFIG_UDF_NLS
2049 if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
2050 unload_nls(sbi->s_nls_map);
2051#endif
2052 if (!(sb->s_flags & MS_RDONLY))
2053 udf_close_lvid(sb);
2054 brelse(sbi->s_lvid_bh);
2055
2056 kfree(sbi->s_partmaps);
2057 kfree(sbi);
2058 sb->s_fs_info = NULL;
2059
2060 return -EINVAL;
2061}
2062
2063static void udf_error(struct super_block *sb, const char *function,
2064 const char *fmt, ...)
2065{
2066 va_list args;
2067
2068 if (!(sb->s_flags & MS_RDONLY)) {
2069
2070 sb->s_dirt = 1;
2071 }
2072 va_start(args, fmt);
2073 vsnprintf(error_buf, sizeof(error_buf), fmt, args);
2074 va_end(args);
2075 printk(KERN_CRIT "UDF-fs error (device %s): %s: %s\n",
2076 sb->s_id, function, error_buf);
2077}
2078
2079void udf_warning(struct super_block *sb, const char *function,
2080 const char *fmt, ...)
2081{
2082 va_list args;
2083
2084 va_start(args, fmt);
2085 vsnprintf(error_buf, sizeof(error_buf), fmt, args);
2086 va_end(args);
2087 printk(KERN_WARNING "UDF-fs warning (device %s): %s: %s\n",
2088 sb->s_id, function, error_buf);
2089}
2090
2091static void udf_put_super(struct super_block *sb)
2092{
2093 int i;
2094 struct udf_sb_info *sbi;
2095
2096 sbi = UDF_SB(sb);
2097
2098 lock_kernel();
2099
2100 if (sbi->s_vat_inode)
2101 iput(sbi->s_vat_inode);
2102 if (sbi->s_partitions)
2103 for (i = 0; i < sbi->s_partitions; i++)
2104 udf_free_partition(&sbi->s_partmaps[i]);
2105#ifdef CONFIG_UDF_NLS
2106 if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
2107 unload_nls(sbi->s_nls_map);
2108#endif
2109 if (!(sb->s_flags & MS_RDONLY))
2110 udf_close_lvid(sb);
2111 brelse(sbi->s_lvid_bh);
2112 kfree(sbi->s_partmaps);
2113 kfree(sb->s_fs_info);
2114 sb->s_fs_info = NULL;
2115
2116 unlock_kernel();
2117}
2118
2119static int udf_sync_fs(struct super_block *sb, int wait)
2120{
2121 struct udf_sb_info *sbi = UDF_SB(sb);
2122
2123 mutex_lock(&sbi->s_alloc_mutex);
2124 if (sbi->s_lvid_dirty) {
2125
2126
2127
2128
2129 mark_buffer_dirty(sbi->s_lvid_bh);
2130 sb->s_dirt = 0;
2131 sbi->s_lvid_dirty = 0;
2132 }
2133 mutex_unlock(&sbi->s_alloc_mutex);
2134
2135 return 0;
2136}
2137
2138static int udf_statfs(struct dentry *dentry, struct kstatfs *buf)
2139{
2140 struct super_block *sb = dentry->d_sb;
2141 struct udf_sb_info *sbi = UDF_SB(sb);
2142 struct logicalVolIntegrityDescImpUse *lvidiu;
2143 u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
2144
2145 if (sbi->s_lvid_bh != NULL)
2146 lvidiu = udf_sb_lvidiu(sbi);
2147 else
2148 lvidiu = NULL;
2149
2150 buf->f_type = UDF_SUPER_MAGIC;
2151 buf->f_bsize = sb->s_blocksize;
2152 buf->f_blocks = sbi->s_partmaps[sbi->s_partition].s_partition_len;
2153 buf->f_bfree = udf_count_free(sb);
2154 buf->f_bavail = buf->f_bfree;
2155 buf->f_files = (lvidiu != NULL ? (le32_to_cpu(lvidiu->numFiles) +
2156 le32_to_cpu(lvidiu->numDirs)) : 0)
2157 + buf->f_bfree;
2158 buf->f_ffree = buf->f_bfree;
2159 buf->f_namelen = UDF_NAME_LEN - 2;
2160 buf->f_fsid.val[0] = (u32)id;
2161 buf->f_fsid.val[1] = (u32)(id >> 32);
2162
2163 return 0;
2164}
2165
2166static unsigned int udf_count_free_bitmap(struct super_block *sb,
2167 struct udf_bitmap *bitmap)
2168{
2169 struct buffer_head *bh = NULL;
2170 unsigned int accum = 0;
2171 int index;
2172 int block = 0, newblock;
2173 struct kernel_lb_addr loc;
2174 uint32_t bytes;
2175 uint8_t *ptr;
2176 uint16_t ident;
2177 struct spaceBitmapDesc *bm;
2178
2179 lock_kernel();
2180
2181 loc.logicalBlockNum = bitmap->s_extPosition;
2182 loc.partitionReferenceNum = UDF_SB(sb)->s_partition;
2183 bh = udf_read_ptagged(sb, &loc, 0, &ident);
2184
2185 if (!bh) {
2186 printk(KERN_ERR "udf: udf_count_free failed\n");
2187 goto out;
2188 } else if (ident != TAG_IDENT_SBD) {
2189 brelse(bh);
2190 printk(KERN_ERR "udf: udf_count_free failed\n");
2191 goto out;
2192 }
2193
2194 bm = (struct spaceBitmapDesc *)bh->b_data;
2195 bytes = le32_to_cpu(bm->numOfBytes);
2196 index = sizeof(struct spaceBitmapDesc);
2197 ptr = (uint8_t *)bh->b_data;
2198
2199 while (bytes > 0) {
2200 u32 cur_bytes = min_t(u32, bytes, sb->s_blocksize - index);
2201 accum += bitmap_weight((const unsigned long *)(ptr + index),
2202 cur_bytes * 8);
2203 bytes -= cur_bytes;
2204 if (bytes) {
2205 brelse(bh);
2206 newblock = udf_get_lb_pblock(sb, &loc, ++block);
2207 bh = udf_tread(sb, newblock);
2208 if (!bh) {
2209 udf_debug("read failed\n");
2210 goto out;
2211 }
2212 index = 0;
2213 ptr = (uint8_t *)bh->b_data;
2214 }
2215 }
2216 brelse(bh);
2217
2218out:
2219 unlock_kernel();
2220
2221 return accum;
2222}
2223
2224static unsigned int udf_count_free_table(struct super_block *sb,
2225 struct inode *table)
2226{
2227 unsigned int accum = 0;
2228 uint32_t elen;
2229 struct kernel_lb_addr eloc;
2230 int8_t etype;
2231 struct extent_position epos;
2232
2233 lock_kernel();
2234
2235 epos.block = UDF_I(table)->i_location;
2236 epos.offset = sizeof(struct unallocSpaceEntry);
2237 epos.bh = NULL;
2238
2239 while ((etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1)
2240 accum += (elen >> table->i_sb->s_blocksize_bits);
2241
2242 brelse(epos.bh);
2243
2244 unlock_kernel();
2245
2246 return accum;
2247}
2248
2249static unsigned int udf_count_free(struct super_block *sb)
2250{
2251 unsigned int accum = 0;
2252 struct udf_sb_info *sbi;
2253 struct udf_part_map *map;
2254
2255 sbi = UDF_SB(sb);
2256 if (sbi->s_lvid_bh) {
2257 struct logicalVolIntegrityDesc *lvid =
2258 (struct logicalVolIntegrityDesc *)
2259 sbi->s_lvid_bh->b_data;
2260 if (le32_to_cpu(lvid->numOfPartitions) > sbi->s_partition) {
2261 accum = le32_to_cpu(
2262 lvid->freeSpaceTable[sbi->s_partition]);
2263 if (accum == 0xFFFFFFFF)
2264 accum = 0;
2265 }
2266 }
2267
2268 if (accum)
2269 return accum;
2270
2271 map = &sbi->s_partmaps[sbi->s_partition];
2272 if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) {
2273 accum += udf_count_free_bitmap(sb,
2274 map->s_uspace.s_bitmap);
2275 }
2276 if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) {
2277 accum += udf_count_free_bitmap(sb,
2278 map->s_fspace.s_bitmap);
2279 }
2280 if (accum)
2281 return accum;
2282
2283 if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) {
2284 accum += udf_count_free_table(sb,
2285 map->s_uspace.s_table);
2286 }
2287 if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) {
2288 accum += udf_count_free_table(sb,
2289 map->s_fspace.s_table);
2290 }
2291
2292 return accum;
2293}
2294