Merge branch 'upstream-greg' of gregkh@master.kernel.org:/pub/scm/linux/kernel/git...
[pandora-kernel.git] / fs / udf / super.c
1 /*
2  * super.c
3  *
4  * PURPOSE
5  *  Super block routines for the OSTA-UDF(tm) filesystem.
6  *
7  * DESCRIPTION
8  *  OSTA-UDF(tm) = Optical Storage Technology Association
9  *  Universal Disk Format.
10  *
11  *  This code is based on version 2.00 of the UDF specification,
12  *  and revision 3 of the ECMA 167 standard [equivalent to ISO 13346].
13  *    http://www.osta.org/
14  *    http://www.ecma.ch/
15  *    http://www.iso.org/
16  *
17  * COPYRIGHT
18  *  This file is distributed under the terms of the GNU General Public
19  *  License (GPL). Copies of the GPL can be obtained from:
20  *    ftp://prep.ai.mit.edu/pub/gnu/GPL
21  *  Each contributing author retains all rights to their own work.
22  *
23  *  (C) 1998 Dave Boynton
24  *  (C) 1998-2004 Ben Fennema
25  *  (C) 2000 Stelias Computing Inc
26  *
27  * HISTORY
28  *
29  *  09/24/98 dgb  changed to allow compiling outside of kernel, and
30  *                added some debugging.
31  *  10/01/98 dgb  updated to allow (some) possibility of compiling w/2.0.34
32  *  10/16/98      attempting some multi-session support
33  *  10/17/98      added freespace count for "df"
34  *  11/11/98 gr   added novrs option
35  *  11/26/98 dgb  added fileset,anchor mount options
36  *  12/06/98 blf  really hosed things royally. vat/sparing support. sequenced vol descs
37  *                rewrote option handling based on isofs
38  *  12/20/98      find the free space bitmap (if it exists)
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 <asm/byteorder.h>
56
57 #include <linux/udf_fs.h>
58 #include "udf_sb.h"
59 #include "udf_i.h"
60
61 #include <linux/init.h>
62 #include <asm/uaccess.h>
63
64 #define VDS_POS_PRIMARY_VOL_DESC        0
65 #define VDS_POS_UNALLOC_SPACE_DESC      1
66 #define VDS_POS_LOGICAL_VOL_DESC        2
67 #define VDS_POS_PARTITION_DESC          3
68 #define VDS_POS_IMP_USE_VOL_DESC        4
69 #define VDS_POS_VOL_DESC_PTR            5
70 #define VDS_POS_TERMINATING_DESC        6
71 #define VDS_POS_LENGTH                  7
72
73 static char error_buf[1024];
74
75 /* These are the "meat" - everything else is stuffing */
76 static int udf_fill_super(struct super_block *, void *, int);
77 static void udf_put_super(struct super_block *);
78 static void udf_write_super(struct super_block *);
79 static int udf_remount_fs(struct super_block *, int *, char *);
80 static int udf_check_valid(struct super_block *, int, int);
81 static int udf_vrs(struct super_block *sb, int silent);
82 static int udf_load_partition(struct super_block *, kernel_lb_addr *);
83 static int udf_load_logicalvol(struct super_block *, struct buffer_head *, kernel_lb_addr *);
84 static void udf_load_logicalvolint(struct super_block *, kernel_extent_ad);
85 static void udf_find_anchor(struct super_block *);
86 static int udf_find_fileset(struct super_block *, kernel_lb_addr *, kernel_lb_addr *);
87 static void udf_load_pvoldesc(struct super_block *, struct buffer_head *);
88 static void udf_load_fileset(struct super_block *, struct buffer_head *, kernel_lb_addr *);
89 static void udf_load_partdesc(struct super_block *, struct buffer_head *);
90 static void udf_open_lvid(struct super_block *);
91 static void udf_close_lvid(struct super_block *);
92 static unsigned int udf_count_free(struct super_block *);
93 static int udf_statfs(struct dentry *, struct kstatfs *);
94
95 /* UDF filesystem type */
96 static int udf_get_sb(struct file_system_type *fs_type,
97         int flags, const char *dev_name, void *data, struct vfsmount *mnt)
98 {
99         return get_sb_bdev(fs_type, flags, dev_name, data, udf_fill_super, mnt);
100 }
101
102 static struct file_system_type udf_fstype = {
103         .owner          = THIS_MODULE,
104         .name           = "udf",
105         .get_sb         = udf_get_sb,
106         .kill_sb        = kill_block_super,
107         .fs_flags       = FS_REQUIRES_DEV,
108 };
109
110 static kmem_cache_t * udf_inode_cachep;
111
112 static struct inode *udf_alloc_inode(struct super_block *sb)
113 {
114         struct udf_inode_info *ei;
115         ei = (struct udf_inode_info *)kmem_cache_alloc(udf_inode_cachep, SLAB_KERNEL);
116         if (!ei)
117                 return NULL;
118
119         ei->i_unique = 0;
120         ei->i_lenExtents = 0;
121         ei->i_next_alloc_block = 0;
122         ei->i_next_alloc_goal = 0;
123         ei->i_strat4096 = 0;
124
125         return &ei->vfs_inode;
126 }
127
128 static void udf_destroy_inode(struct inode *inode)
129 {
130         kmem_cache_free(udf_inode_cachep, UDF_I(inode));
131 }
132
133 static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
134 {
135         struct udf_inode_info *ei = (struct udf_inode_info *) foo;
136
137         if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
138             SLAB_CTOR_CONSTRUCTOR)
139         {
140                 ei->i_ext.i_data = NULL;
141                 inode_init_once(&ei->vfs_inode);
142         }
143 }
144
145 static int init_inodecache(void)
146 {
147         udf_inode_cachep = kmem_cache_create("udf_inode_cache",
148                                              sizeof(struct udf_inode_info),
149                                              0, (SLAB_RECLAIM_ACCOUNT|
150                                                 SLAB_MEM_SPREAD),
151                                              init_once, NULL);
152         if (udf_inode_cachep == NULL)
153                 return -ENOMEM;
154         return 0;
155 }
156
157 static void destroy_inodecache(void)
158 {
159         if (kmem_cache_destroy(udf_inode_cachep))
160                 printk(KERN_INFO "udf_inode_cache: not all structures were freed\n");
161 }
162
163 /* Superblock operations */
164 static struct super_operations udf_sb_ops = {
165         .alloc_inode            = udf_alloc_inode,
166         .destroy_inode          = udf_destroy_inode,
167         .write_inode            = udf_write_inode,
168         .delete_inode           = udf_delete_inode,
169         .clear_inode            = udf_clear_inode,
170         .put_super              = udf_put_super,
171         .write_super            = udf_write_super,
172         .statfs                 = udf_statfs,
173         .remount_fs             = udf_remount_fs,
174 };
175
176 struct udf_options
177 {
178         unsigned char novrs;
179         unsigned int blocksize;
180         unsigned int session;
181         unsigned int lastblock;
182         unsigned int anchor;
183         unsigned int volume;
184         unsigned short partition;
185         unsigned int fileset;
186         unsigned int rootdir;
187         unsigned int flags;
188         mode_t umask;
189         gid_t gid;
190         uid_t uid;
191         struct nls_table *nls_map;
192 };
193
194 static int __init init_udf_fs(void)
195 {
196         int err;
197         err = init_inodecache();
198         if (err)
199                 goto out1;
200         err = register_filesystem(&udf_fstype);
201         if (err)
202                 goto out;
203         return 0;
204 out:
205         destroy_inodecache();
206 out1:
207         return err;
208 }
209
210 static void __exit exit_udf_fs(void)
211 {
212         unregister_filesystem(&udf_fstype);
213         destroy_inodecache();
214 }
215
216 module_init(init_udf_fs)
217 module_exit(exit_udf_fs)
218
219 /*
220  * udf_parse_options
221  *
222  * PURPOSE
223  *      Parse mount options.
224  *
225  * DESCRIPTION
226  *      The following mount options are supported:
227  *
228  *      gid=            Set the default group.
229  *      umask=          Set the default umask.
230  *      uid=            Set the default user.
231  *      bs=             Set the block size.
232  *      unhide          Show otherwise hidden files.
233  *      undelete        Show deleted files in lists.
234  *      adinicb         Embed data in the inode (default)
235  *      noadinicb       Don't embed data in the inode
236  *      shortad         Use short ad's
237  *      longad          Use long ad's (default)
238  *      nostrict        Unset strict conformance
239  *      iocharset=      Set the NLS character set
240  *
241  *      The remaining are for debugging and disaster recovery:
242  *
243  *      novrs           Skip volume sequence recognition 
244  *
245  *      The following expect a offset from 0.
246  *
247  *      session=        Set the CDROM session (default= last session)
248  *      anchor=         Override standard anchor location. (default= 256)
249  *      volume=         Override the VolumeDesc location. (unused)
250  *      partition=      Override the PartitionDesc location. (unused)
251  *      lastblock=      Set the last block of the filesystem/
252  *
253  *      The following expect a offset from the partition root.
254  *
255  *      fileset=        Override the fileset block location. (unused)
256  *      rootdir=        Override the root directory location. (unused)
257  *              WARNING: overriding the rootdir to a non-directory may
258  *              yield highly unpredictable results.
259  *
260  * PRE-CONDITIONS
261  *      options         Pointer to mount options string.
262  *      uopts           Pointer to mount options variable.
263  *
264  * POST-CONDITIONS
265  *      <return>        1       Mount options parsed okay.
266  *      <return>        0       Error parsing mount options.
267  *
268  * HISTORY
269  *      July 1, 1997 - Andrew E. Mileski
270  *      Written, tested, and released.
271  */
272
273 enum {
274         Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete,
275         Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad,
276         Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock,
277         Opt_anchor, Opt_volume, Opt_partition, Opt_fileset,
278         Opt_rootdir, Opt_utf8, Opt_iocharset,
279         Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore
280 };
281
282 static match_table_t tokens = {
283         {Opt_novrs, "novrs"},
284         {Opt_nostrict, "nostrict"},
285         {Opt_bs, "bs=%u"},
286         {Opt_unhide, "unhide"},
287         {Opt_undelete, "undelete"},
288         {Opt_noadinicb, "noadinicb"},
289         {Opt_adinicb, "adinicb"},
290         {Opt_shortad, "shortad"},
291         {Opt_longad, "longad"},
292         {Opt_uforget, "uid=forget"},
293         {Opt_uignore, "uid=ignore"},
294         {Opt_gforget, "gid=forget"},
295         {Opt_gignore, "gid=ignore"},
296         {Opt_gid, "gid=%u"},
297         {Opt_uid, "uid=%u"},
298         {Opt_umask, "umask=%o"},
299         {Opt_session, "session=%u"},
300         {Opt_lastblock, "lastblock=%u"},
301         {Opt_anchor, "anchor=%u"},
302         {Opt_volume, "volume=%u"},
303         {Opt_partition, "partition=%u"},
304         {Opt_fileset, "fileset=%u"},
305         {Opt_rootdir, "rootdir=%u"},
306         {Opt_utf8, "utf8"},
307         {Opt_iocharset, "iocharset=%s"},
308         {Opt_err, NULL}
309 };
310
311 static int
312 udf_parse_options(char *options, struct udf_options *uopt)
313 {
314         char *p;
315         int option;
316
317         uopt->novrs = 0;
318         uopt->blocksize = 2048;
319         uopt->partition = 0xFFFF;
320         uopt->session = 0xFFFFFFFF;
321         uopt->lastblock = 0;
322         uopt->anchor = 0;
323         uopt->volume = 0xFFFFFFFF;
324         uopt->rootdir = 0xFFFFFFFF;
325         uopt->fileset = 0xFFFFFFFF;
326         uopt->nls_map = NULL;
327
328         if (!options)
329                 return 1;
330
331         while ((p = strsep(&options, ",")) != NULL)
332         {
333                 substring_t args[MAX_OPT_ARGS];
334                 int token;
335                 if (!*p)
336                         continue;
337
338                 token = match_token(p, tokens, args);
339                 switch (token)
340                 {
341                         case Opt_novrs:
342                                 uopt->novrs = 1;
343                         case Opt_bs:
344                                 if (match_int(&args[0], &option))
345                                         return 0;
346                                 uopt->blocksize = option;
347                                 break;
348                         case Opt_unhide:
349                                 uopt->flags |= (1 << UDF_FLAG_UNHIDE);
350                                 break;
351                         case Opt_undelete:
352                                 uopt->flags |= (1 << UDF_FLAG_UNDELETE);
353                                 break;
354                         case Opt_noadinicb:
355                                 uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB);
356                                 break;
357                         case Opt_adinicb:
358                                 uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB);
359                                 break;
360                         case Opt_shortad:
361                                 uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD);
362                                 break;
363                         case Opt_longad:
364                                 uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD);
365                                 break;
366                         case Opt_gid:
367                                 if (match_int(args, &option))
368                                         return 0;
369                                 uopt->gid = option;
370                                 break;
371                         case Opt_uid:
372                                 if (match_int(args, &option))
373                                         return 0;
374                                 uopt->uid = option;
375                                 break;
376                         case Opt_umask:
377                                 if (match_octal(args, &option))
378                                         return 0;
379                                 uopt->umask = option;
380                                 break;
381                         case Opt_nostrict:
382                                 uopt->flags &= ~(1 << UDF_FLAG_STRICT);
383                                 break;
384                         case Opt_session:
385                                 if (match_int(args, &option))
386                                         return 0;
387                                 uopt->session = option;
388                                 break;
389                         case Opt_lastblock:
390                                 if (match_int(args, &option))
391                                         return 0;
392                                 uopt->lastblock = option;
393                                 break;
394                         case Opt_anchor:
395                                 if (match_int(args, &option))
396                                         return 0;
397                                 uopt->anchor = option;
398                                 break;
399                         case Opt_volume:
400                                 if (match_int(args, &option))
401                                         return 0;
402                                 uopt->volume = option;
403                                 break;
404                         case Opt_partition:
405                                 if (match_int(args, &option))
406                                         return 0;
407                                 uopt->partition = option;
408                                 break;
409                         case Opt_fileset:
410                                 if (match_int(args, &option))
411                                         return 0;
412                                 uopt->fileset = option;
413                                 break;
414                         case Opt_rootdir:
415                                 if (match_int(args, &option))
416                                         return 0;
417                                 uopt->rootdir = option;
418                                 break;
419                         case Opt_utf8:
420                                 uopt->flags |= (1 << UDF_FLAG_UTF8);
421                                 break;
422 #ifdef CONFIG_UDF_NLS
423                         case Opt_iocharset:
424                                 uopt->nls_map = load_nls(args[0].from);
425                                 uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
426                                 break;
427 #endif
428                         case Opt_uignore:
429                                 uopt->flags |= (1 << UDF_FLAG_UID_IGNORE);
430                                 break;
431                         case Opt_uforget:
432                                 uopt->flags |= (1 << UDF_FLAG_UID_FORGET);
433                                 break;
434                         case Opt_gignore:
435                             uopt->flags |= (1 << UDF_FLAG_GID_IGNORE);
436                                 break;
437                         case Opt_gforget:
438                             uopt->flags |= (1 << UDF_FLAG_GID_FORGET);
439                                 break;
440                         default:
441                                 printk(KERN_ERR "udf: bad mount option \"%s\" "
442                                                 "or missing value\n", p);
443                         return 0;
444                 }
445         }
446         return 1;
447 }
448
449 void
450 udf_write_super(struct super_block *sb)
451 {
452         lock_kernel();
453         if (!(sb->s_flags & MS_RDONLY))
454                 udf_open_lvid(sb);
455         sb->s_dirt = 0;
456         unlock_kernel();
457 }
458
459 static int
460 udf_remount_fs(struct super_block *sb, int *flags, char *options)
461 {
462         struct udf_options uopt;
463
464         uopt.flags = UDF_SB(sb)->s_flags ;
465         uopt.uid   = UDF_SB(sb)->s_uid ;
466         uopt.gid   = UDF_SB(sb)->s_gid ;
467         uopt.umask = UDF_SB(sb)->s_umask ;
468
469         if ( !udf_parse_options(options, &uopt) )
470                 return -EINVAL;
471
472         UDF_SB(sb)->s_flags = uopt.flags;
473         UDF_SB(sb)->s_uid   = uopt.uid;
474         UDF_SB(sb)->s_gid   = uopt.gid;
475         UDF_SB(sb)->s_umask = uopt.umask;
476
477         if (UDF_SB_LVIDBH(sb)) {
478                 int write_rev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev);
479                 if (write_rev > UDF_MAX_WRITE_VERSION)
480                         *flags |= MS_RDONLY;
481         }
482
483         if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
484                 return 0;
485         if (*flags & MS_RDONLY)
486                 udf_close_lvid(sb);
487         else
488                 udf_open_lvid(sb);
489
490         return 0;
491 }
492
493 /*
494  * udf_set_blocksize
495  *
496  * PURPOSE
497  *      Set the block size to be used in all transfers.
498  *
499  * DESCRIPTION
500  *      To allow room for a DMA transfer, it is best to guess big when unsure.
501  *      This routine picks 2048 bytes as the blocksize when guessing. This
502  *      should be adequate until devices with larger block sizes become common.
503  *
504  *      Note that the Linux kernel can currently only deal with blocksizes of
505  *      512, 1024, 2048, 4096, and 8192 bytes.
506  *
507  * PRE-CONDITIONS
508  *      sb                      Pointer to _locked_ superblock.
509  *
510  * POST-CONDITIONS
511  *      sb->s_blocksize         Blocksize.
512  *      sb->s_blocksize_bits    log2 of blocksize.
513  *      <return>        0       Blocksize is valid.
514  *      <return>        1       Blocksize is invalid.
515  *
516  * HISTORY
517  *      July 1, 1997 - Andrew E. Mileski
518  *      Written, tested, and released.
519  */
520 static  int
521 udf_set_blocksize(struct super_block *sb, int bsize)
522 {
523         if (!sb_min_blocksize(sb, bsize)) {
524                 udf_debug("Bad block size (%d)\n", bsize);
525                 printk(KERN_ERR "udf: bad block size (%d)\n", bsize);
526                 return 0;
527         }
528         return sb->s_blocksize;
529 }
530
531 static int
532 udf_vrs(struct super_block *sb, int silent)
533 {
534         struct volStructDesc *vsd = NULL;
535         int sector = 32768;
536         int sectorsize;
537         struct buffer_head *bh = NULL;
538         int iso9660=0;
539         int nsr02=0;
540         int nsr03=0;
541
542         /* Block size must be a multiple of 512 */
543         if (sb->s_blocksize & 511)
544                 return 0;
545
546         if (sb->s_blocksize < sizeof(struct volStructDesc))
547                 sectorsize = sizeof(struct volStructDesc);
548         else
549                 sectorsize = sb->s_blocksize;
550
551         sector += (UDF_SB_SESSION(sb) << sb->s_blocksize_bits);
552
553         udf_debug("Starting at sector %u (%ld byte sectors)\n",
554                 (sector >> sb->s_blocksize_bits), sb->s_blocksize);
555         /* Process the sequence (if applicable) */
556         for (;!nsr02 && !nsr03; sector += sectorsize)
557         {
558                 /* Read a block */
559                 bh = udf_tread(sb, sector >> sb->s_blocksize_bits);
560                 if (!bh)
561                         break;
562
563                 /* Look for ISO  descriptors */
564                 vsd = (struct volStructDesc *)(bh->b_data +
565                         (sector & (sb->s_blocksize - 1)));
566
567                 if (vsd->stdIdent[0] == 0)
568                 {
569                         udf_release_data(bh);
570                         break;
571                 }
572                 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001, VSD_STD_ID_LEN))
573                 {
574                         iso9660 = sector;
575                         switch (vsd->structType)
576                         {
577                                 case 0: 
578                                         udf_debug("ISO9660 Boot Record found\n");
579                                         break;
580                                 case 1: 
581                                         udf_debug("ISO9660 Primary Volume Descriptor found\n");
582                                         break;
583                                 case 2: 
584                                         udf_debug("ISO9660 Supplementary Volume Descriptor found\n");
585                                         break;
586                                 case 3: 
587                                         udf_debug("ISO9660 Volume Partition Descriptor found\n");
588                                         break;
589                                 case 255: 
590                                         udf_debug("ISO9660 Volume Descriptor Set Terminator found\n");
591                                         break;
592                                 default: 
593                                         udf_debug("ISO9660 VRS (%u) found\n", vsd->structType);
594                                         break;
595                         }
596                 }
597                 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BEA01, VSD_STD_ID_LEN))
598                 {
599                 }
600                 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_TEA01, VSD_STD_ID_LEN))
601                 {
602                         udf_release_data(bh);
603                         break;
604                 }
605                 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR02, VSD_STD_ID_LEN))
606                 {
607                         nsr02 = sector;
608                 }
609                 else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR03, VSD_STD_ID_LEN))
610                 {
611                         nsr03 = sector;
612                 }
613                 udf_release_data(bh);
614         }
615
616         if (nsr03)
617                 return nsr03;
618         else if (nsr02)
619                 return nsr02;
620         else if (sector - (UDF_SB_SESSION(sb) << sb->s_blocksize_bits) == 32768)
621                 return -1;
622         else
623                 return 0;
624 }
625
626 /*
627  * udf_find_anchor
628  *
629  * PURPOSE
630  *      Find an anchor volume descriptor.
631  *
632  * PRE-CONDITIONS
633  *      sb                      Pointer to _locked_ superblock.
634  *      lastblock               Last block on media.
635  *
636  * POST-CONDITIONS
637  *      <return>                1 if not found, 0 if ok
638  *
639  * HISTORY
640  *      July 1, 1997 - Andrew E. Mileski
641  *      Written, tested, and released.
642  */
643 static void
644 udf_find_anchor(struct super_block *sb)
645 {
646         int lastblock = UDF_SB_LASTBLOCK(sb);
647         struct buffer_head *bh = NULL;
648         uint16_t ident;
649         uint32_t location;
650         int i;
651
652         if (lastblock)
653         {
654                 int varlastblock = udf_variable_to_fixed(lastblock);
655                 int last[] =  { lastblock, lastblock - 2,
656                                 lastblock - 150, lastblock - 152,
657                                 varlastblock, varlastblock - 2,
658                                 varlastblock - 150, varlastblock - 152 };
659
660                 lastblock = 0;
661
662                 /* Search for an anchor volume descriptor pointer */
663
664                 /*  according to spec, anchor is in either:
665                  *     block 256
666                  *     lastblock-256
667                  *     lastblock
668                  *  however, if the disc isn't closed, it could be 512 */
669
670                 for (i = 0; !lastblock && i < ARRAY_SIZE(last); i++) {
671                         if (last[i] < 0 || !(bh = sb_bread(sb, last[i])))
672                         {
673                                 ident = location = 0;
674                         }
675                         else
676                         {
677                                 ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
678                                 location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
679                                 udf_release_data(bh);
680                         }
681
682                         if (ident == TAG_IDENT_AVDP)
683                         {
684                                 if (location == last[i] - UDF_SB_SESSION(sb))
685                                 {
686                                         lastblock = UDF_SB_ANCHOR(sb)[0] = last[i] - UDF_SB_SESSION(sb);
687                                         UDF_SB_ANCHOR(sb)[1] = last[i] - 256 - UDF_SB_SESSION(sb);
688                                 }
689                                 else if (location == udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb))
690                                 {
691                                         UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
692                                         lastblock = UDF_SB_ANCHOR(sb)[0] = udf_variable_to_fixed(last[i]) - UDF_SB_SESSION(sb);
693                                         UDF_SB_ANCHOR(sb)[1] = lastblock - 256 - UDF_SB_SESSION(sb);
694                                 }
695                                 else
696                                         udf_debug("Anchor found at block %d, location mismatch %d.\n",
697                                                 last[i], location);
698                         }
699                         else if (ident == TAG_IDENT_FE || ident == TAG_IDENT_EFE)
700                         {
701                                 lastblock = last[i];
702                                 UDF_SB_ANCHOR(sb)[3] = 512;
703                         }
704                         else
705                         {
706                                 if (last[i] < 256 || !(bh = sb_bread(sb, last[i] - 256)))
707                                 {
708                                         ident = location = 0;
709                                 }
710                                 else
711                                 {
712                                         ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
713                                         location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
714                                         udf_release_data(bh);
715                                 }
716         
717                                 if (ident == TAG_IDENT_AVDP &&
718                                         location == last[i] - 256 - UDF_SB_SESSION(sb))
719                                 {
720                                         lastblock = last[i];
721                                         UDF_SB_ANCHOR(sb)[1] = last[i] - 256;
722                                 }
723                                 else
724                                 {
725                                         if (last[i] < 312 + UDF_SB_SESSION(sb) || !(bh = sb_bread(sb, last[i] - 312 - UDF_SB_SESSION(sb))))
726                                         {
727                                                 ident = location = 0;
728                                         }
729                                         else
730                                         {
731                                                 ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
732                                                 location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
733                                                 udf_release_data(bh);
734                                         }
735         
736                                         if (ident == TAG_IDENT_AVDP &&
737                                                 location == udf_variable_to_fixed(last[i]) - 256)
738                                         {
739                                                 UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
740                                                 lastblock = udf_variable_to_fixed(last[i]);
741                                                 UDF_SB_ANCHOR(sb)[1] = lastblock - 256;
742                                         }
743                                 }
744                         }
745                 }
746         }
747
748         if (!lastblock)
749         {
750                 /* We havn't found the lastblock. check 312 */
751                 if ((bh = sb_bread(sb, 312 + UDF_SB_SESSION(sb))))
752                 {
753                         ident = le16_to_cpu(((tag *)bh->b_data)->tagIdent);
754                         location = le32_to_cpu(((tag *)bh->b_data)->tagLocation);
755                         udf_release_data(bh);
756
757                         if (ident == TAG_IDENT_AVDP && location == 256)
758                                 UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
759                 }
760         }
761
762         for (i = 0; i < ARRAY_SIZE(UDF_SB_ANCHOR(sb)); i++) {
763                 if (UDF_SB_ANCHOR(sb)[i])
764                 {
765                         if (!(bh = udf_read_tagged(sb,
766                                 UDF_SB_ANCHOR(sb)[i], UDF_SB_ANCHOR(sb)[i], &ident)))
767                         {
768                                 UDF_SB_ANCHOR(sb)[i] = 0;
769                         }
770                         else
771                         {
772                                 udf_release_data(bh);
773                                 if ((ident != TAG_IDENT_AVDP) && (i ||
774                                         (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE)))
775                                 {
776                                         UDF_SB_ANCHOR(sb)[i] = 0;
777                                 }
778                         }
779                 }
780         }
781
782         UDF_SB_LASTBLOCK(sb) = lastblock;
783 }
784
785 static int 
786 udf_find_fileset(struct super_block *sb, kernel_lb_addr *fileset, kernel_lb_addr *root)
787 {
788         struct buffer_head *bh = NULL;
789         long lastblock;
790         uint16_t ident;
791
792         if (fileset->logicalBlockNum != 0xFFFFFFFF ||
793                 fileset->partitionReferenceNum != 0xFFFF)
794         {
795                 bh = udf_read_ptagged(sb, *fileset, 0, &ident);
796
797                 if (!bh)
798                         return 1;
799                 else if (ident != TAG_IDENT_FSD)
800                 {
801                         udf_release_data(bh);
802                         return 1;
803                 }
804                         
805         }
806
807         if (!bh) /* Search backwards through the partitions */
808         {
809                 kernel_lb_addr newfileset;
810
811                 return 1;
812                 
813                 for (newfileset.partitionReferenceNum=UDF_SB_NUMPARTS(sb)-1;
814                         (newfileset.partitionReferenceNum != 0xFFFF &&
815                                 fileset->logicalBlockNum == 0xFFFFFFFF &&
816                                 fileset->partitionReferenceNum == 0xFFFF);
817                         newfileset.partitionReferenceNum--)
818                 {
819                         lastblock = UDF_SB_PARTLEN(sb, newfileset.partitionReferenceNum);
820                         newfileset.logicalBlockNum = 0;
821
822                         do
823                         {
824                                 bh = udf_read_ptagged(sb, newfileset, 0, &ident);
825                                 if (!bh)
826                                 {
827                                         newfileset.logicalBlockNum ++;
828                                         continue;
829                                 }
830
831                                 switch (ident)
832                                 {
833                                         case TAG_IDENT_SBD:
834                                         {
835                                                 struct spaceBitmapDesc *sp;
836                                                 sp = (struct spaceBitmapDesc *)bh->b_data;
837                                                 newfileset.logicalBlockNum += 1 +
838                                                         ((le32_to_cpu(sp->numOfBytes) + sizeof(struct spaceBitmapDesc) - 1)
839                                                                 >> sb->s_blocksize_bits);
840                                                 udf_release_data(bh);
841                                                 break;
842                                         }
843                                         case TAG_IDENT_FSD:
844                                         {
845                                                 *fileset = newfileset;
846                                                 break;
847                                         }
848                                         default:
849                                         {
850                                                 newfileset.logicalBlockNum ++;
851                                                 udf_release_data(bh);
852                                                 bh = NULL;
853                                                 break;
854                                         }
855                                 }
856                         }
857                         while (newfileset.logicalBlockNum < lastblock &&
858                                 fileset->logicalBlockNum == 0xFFFFFFFF &&
859                                 fileset->partitionReferenceNum == 0xFFFF);
860                 }
861         }
862
863         if ((fileset->logicalBlockNum != 0xFFFFFFFF ||
864                 fileset->partitionReferenceNum != 0xFFFF) && bh)
865         {
866                 udf_debug("Fileset at block=%d, partition=%d\n",
867                         fileset->logicalBlockNum, fileset->partitionReferenceNum);
868
869                 UDF_SB_PARTITION(sb) = fileset->partitionReferenceNum;
870                 udf_load_fileset(sb, bh, root);
871                 udf_release_data(bh);
872                 return 0;
873         }
874         return 1;
875 }
876
877 static void 
878 udf_load_pvoldesc(struct super_block *sb, struct buffer_head *bh)
879 {
880         struct primaryVolDesc *pvoldesc;
881         time_t recording;
882         long recording_usec;
883         struct ustr instr;
884         struct ustr outstr;
885
886         pvoldesc = (struct primaryVolDesc *)bh->b_data;
887
888         if ( udf_stamp_to_time(&recording, &recording_usec,
889                 lets_to_cpu(pvoldesc->recordingDateAndTime)) )
890         {
891                 kernel_timestamp ts;
892                 ts = lets_to_cpu(pvoldesc->recordingDateAndTime);
893                 udf_debug("recording time %ld/%ld, %04u/%02u/%02u %02u:%02u (%x)\n",
894                         recording, recording_usec,
895                         ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.typeAndTimezone);
896                 UDF_SB_RECORDTIME(sb).tv_sec = recording;
897                 UDF_SB_RECORDTIME(sb).tv_nsec = recording_usec * 1000;
898         }
899
900         if ( !udf_build_ustr(&instr, pvoldesc->volIdent, 32) )
901         {
902                 if (udf_CS0toUTF8(&outstr, &instr))
903                 {
904                         strncpy( UDF_SB_VOLIDENT(sb), outstr.u_name,
905                                 outstr.u_len > 31 ? 31 : outstr.u_len);
906                         udf_debug("volIdent[] = '%s'\n", UDF_SB_VOLIDENT(sb));
907                 }
908         }
909
910         if ( !udf_build_ustr(&instr, pvoldesc->volSetIdent, 128) )
911         {
912                 if (udf_CS0toUTF8(&outstr, &instr))
913                         udf_debug("volSetIdent[] = '%s'\n", outstr.u_name);
914         }
915 }
916
917 static void 
918 udf_load_fileset(struct super_block *sb, struct buffer_head *bh, kernel_lb_addr *root)
919 {
920         struct fileSetDesc *fset;
921
922         fset = (struct fileSetDesc *)bh->b_data;
923
924         *root = lelb_to_cpu(fset->rootDirectoryICB.extLocation);
925
926         UDF_SB_SERIALNUM(sb) = le16_to_cpu(fset->descTag.tagSerialNum);
927
928         udf_debug("Rootdir at block=%d, partition=%d\n", 
929                 root->logicalBlockNum, root->partitionReferenceNum);
930 }
931
932 static void 
933 udf_load_partdesc(struct super_block *sb, struct buffer_head *bh)
934 {
935         struct partitionDesc *p;
936         int i;
937
938         p = (struct partitionDesc *)bh->b_data;
939
940         for (i=0; i<UDF_SB_NUMPARTS(sb); i++)
941         {
942                 udf_debug("Searching map: (%d == %d)\n", 
943                         UDF_SB_PARTMAPS(sb)[i].s_partition_num, le16_to_cpu(p->partitionNumber));
944                 if (UDF_SB_PARTMAPS(sb)[i].s_partition_num == le16_to_cpu(p->partitionNumber))
945                 {
946                         UDF_SB_PARTLEN(sb,i) = le32_to_cpu(p->partitionLength); /* blocks */
947                         UDF_SB_PARTROOT(sb,i) = le32_to_cpu(p->partitionStartingLocation);
948                         if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_READ_ONLY)
949                                 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_READ_ONLY;
950                         if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_WRITE_ONCE)
951                                 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_WRITE_ONCE;
952                         if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_REWRITABLE)
953                                 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_REWRITABLE;
954                         if (le32_to_cpu(p->accessType) == PD_ACCESS_TYPE_OVERWRITABLE)
955                                 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_OVERWRITABLE;
956
957                         if (!strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) ||
958                                 !strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03))
959                         {
960                                 struct partitionHeaderDesc *phd;
961
962                                 phd = (struct partitionHeaderDesc *)(p->partitionContentsUse);
963                                 if (phd->unallocSpaceTable.extLength)
964                                 {
965                                         kernel_lb_addr loc = { le32_to_cpu(phd->unallocSpaceTable.extPosition), i };
966
967                                         UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table =
968                                                 udf_iget(sb, loc);
969                                         UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_TABLE;
970                                         udf_debug("unallocSpaceTable (part %d) @ %ld\n",
971                                                 i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_table->i_ino);
972                                 }
973                                 if (phd->unallocSpaceBitmap.extLength)
974                                 {
975                                         UDF_SB_ALLOC_BITMAP(sb, i, s_uspace);
976                                         if (UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap != NULL)
977                                         {
978                                                 UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extLength =
979                                                         le32_to_cpu(phd->unallocSpaceBitmap.extLength);
980                                                 UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition =
981                                                         le32_to_cpu(phd->unallocSpaceBitmap.extPosition);
982                                                 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_UNALLOC_BITMAP;
983                                                 udf_debug("unallocSpaceBitmap (part %d) @ %d\n",
984                                                         i, UDF_SB_PARTMAPS(sb)[i].s_uspace.s_bitmap->s_extPosition);
985                                         }
986                                 }
987                                 if (phd->partitionIntegrityTable.extLength)
988                                         udf_debug("partitionIntegrityTable (part %d)\n", i);
989                                 if (phd->freedSpaceTable.extLength)
990                                 {
991                                         kernel_lb_addr loc = { le32_to_cpu(phd->freedSpaceTable.extPosition), i };
992
993                                         UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table =
994                                                 udf_iget(sb, loc);
995                                         UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_TABLE;
996                                         udf_debug("freedSpaceTable (part %d) @ %ld\n",
997                                                 i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_table->i_ino);
998                                 }
999                                 if (phd->freedSpaceBitmap.extLength)
1000                                 {
1001                                         UDF_SB_ALLOC_BITMAP(sb, i, s_fspace);
1002                                         if (UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap != NULL)
1003                                         {
1004                                                 UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extLength =
1005                                                         le32_to_cpu(phd->freedSpaceBitmap.extLength);
1006                                                 UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition =
1007                                                         le32_to_cpu(phd->freedSpaceBitmap.extPosition);
1008                                                 UDF_SB_PARTFLAGS(sb,i) |= UDF_PART_FLAG_FREED_BITMAP;
1009                                                 udf_debug("freedSpaceBitmap (part %d) @ %d\n",
1010                                                         i, UDF_SB_PARTMAPS(sb)[i].s_fspace.s_bitmap->s_extPosition);
1011                                         }
1012                                 }
1013                         }
1014                         break;
1015                 }
1016         }
1017         if (i == UDF_SB_NUMPARTS(sb))
1018         {
1019                 udf_debug("Partition (%d) not found in partition map\n", le16_to_cpu(p->partitionNumber));
1020         }
1021         else
1022         {
1023                 udf_debug("Partition (%d:%d type %x) starts at physical %d, block length %d\n",
1024                         le16_to_cpu(p->partitionNumber), i, UDF_SB_PARTTYPE(sb,i),
1025                         UDF_SB_PARTROOT(sb,i), UDF_SB_PARTLEN(sb,i));
1026         }
1027 }
1028
1029 static int 
1030 udf_load_logicalvol(struct super_block *sb, struct buffer_head * bh, kernel_lb_addr *fileset)
1031 {
1032         struct logicalVolDesc *lvd;
1033         int i, j, offset;
1034         uint8_t type;
1035
1036         lvd = (struct logicalVolDesc *)bh->b_data;
1037
1038         UDF_SB_ALLOC_PARTMAPS(sb, le32_to_cpu(lvd->numPartitionMaps));
1039
1040         for (i=0,offset=0;
1041                  i<UDF_SB_NUMPARTS(sb) && offset<le32_to_cpu(lvd->mapTableLength);
1042                  i++,offset+=((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapLength)
1043         {
1044                 type = ((struct genericPartitionMap *)&(lvd->partitionMaps[offset]))->partitionMapType;
1045                 if (type == 1)
1046                 {
1047                         struct genericPartitionMap1 *gpm1 = (struct genericPartitionMap1 *)&(lvd->partitionMaps[offset]);
1048                         UDF_SB_PARTTYPE(sb,i) = UDF_TYPE1_MAP15;
1049                         UDF_SB_PARTVSN(sb,i) = le16_to_cpu(gpm1->volSeqNum);
1050                         UDF_SB_PARTNUM(sb,i) = le16_to_cpu(gpm1->partitionNum);
1051                         UDF_SB_PARTFUNC(sb,i) = NULL;
1052                 }
1053                 else if (type == 2)
1054                 {
1055                         struct udfPartitionMap2 *upm2 = (struct udfPartitionMap2 *)&(lvd->partitionMaps[offset]);
1056                         if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL, strlen(UDF_ID_VIRTUAL)))
1057                         {
1058                                 if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0150)
1059                                 {
1060                                         UDF_SB_PARTTYPE(sb,i) = UDF_VIRTUAL_MAP15;
1061                                         UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_virt15;
1062                                 }
1063                                 else if (le16_to_cpu(((__le16 *)upm2->partIdent.identSuffix)[0]) == 0x0200)
1064                                 {
1065                                         UDF_SB_PARTTYPE(sb,i) = UDF_VIRTUAL_MAP20;
1066                                         UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_virt20;
1067                                 }
1068                         }
1069                         else if (!strncmp(upm2->partIdent.ident, UDF_ID_SPARABLE, strlen(UDF_ID_SPARABLE)))
1070                         {
1071                                 uint32_t loc;
1072                                 uint16_t ident;
1073                                 struct sparingTable *st;
1074                                 struct sparablePartitionMap *spm = (struct sparablePartitionMap *)&(lvd->partitionMaps[offset]);
1075
1076                                 UDF_SB_PARTTYPE(sb,i) = UDF_SPARABLE_MAP15;
1077                                 UDF_SB_TYPESPAR(sb,i).s_packet_len = le16_to_cpu(spm->packetLength);
1078                                 for (j=0; j<spm->numSparingTables; j++)
1079                                 {
1080                                         loc = le32_to_cpu(spm->locSparingTable[j]);
1081                                         UDF_SB_TYPESPAR(sb,i).s_spar_map[j] =
1082                                                 udf_read_tagged(sb, loc, loc, &ident);
1083                                         if (UDF_SB_TYPESPAR(sb,i).s_spar_map[j] != NULL)
1084                                         {
1085                                                 st = (struct sparingTable *)UDF_SB_TYPESPAR(sb,i).s_spar_map[j]->b_data;
1086                                                 if (ident != 0 ||
1087                                                         strncmp(st->sparingIdent.ident, UDF_ID_SPARING, strlen(UDF_ID_SPARING)))
1088                                                 {
1089                                                         udf_release_data(UDF_SB_TYPESPAR(sb,i).s_spar_map[j]);
1090                                                         UDF_SB_TYPESPAR(sb,i).s_spar_map[j] = NULL;
1091                                                 }
1092                                         }
1093                                 }
1094                                 UDF_SB_PARTFUNC(sb,i) = udf_get_pblock_spar15;
1095                         }
1096                         else
1097                         {
1098                                 udf_debug("Unknown ident: %s\n", upm2->partIdent.ident);
1099                                 continue;
1100                         }
1101                         UDF_SB_PARTVSN(sb,i) = le16_to_cpu(upm2->volSeqNum);
1102                         UDF_SB_PARTNUM(sb,i) = le16_to_cpu(upm2->partitionNum);
1103                 }
1104                 udf_debug("Partition (%d:%d) type %d on volume %d\n",
1105                         i, UDF_SB_PARTNUM(sb,i), type, UDF_SB_PARTVSN(sb,i));
1106         }
1107
1108         if (fileset)
1109         {
1110                 long_ad *la = (long_ad *)&(lvd->logicalVolContentsUse[0]);
1111
1112                 *fileset = lelb_to_cpu(la->extLocation);
1113                 udf_debug("FileSet found in LogicalVolDesc at block=%d, partition=%d\n",
1114                         fileset->logicalBlockNum,
1115                         fileset->partitionReferenceNum);
1116         }
1117         if (lvd->integritySeqExt.extLength)
1118                 udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt));
1119         return 0;
1120 }
1121
1122 /*
1123  * udf_load_logicalvolint
1124  *
1125  */
1126 static void
1127 udf_load_logicalvolint(struct super_block *sb, kernel_extent_ad loc)
1128 {
1129         struct buffer_head *bh = NULL;
1130         uint16_t ident;
1131
1132         while (loc.extLength > 0 &&
1133                 (bh = udf_read_tagged(sb, loc.extLocation,
1134                         loc.extLocation, &ident)) &&
1135                 ident == TAG_IDENT_LVID)
1136         {
1137                 UDF_SB_LVIDBH(sb) = bh;
1138                 
1139                 if (UDF_SB_LVID(sb)->nextIntegrityExt.extLength)
1140                         udf_load_logicalvolint(sb, leea_to_cpu(UDF_SB_LVID(sb)->nextIntegrityExt));
1141                 
1142                 if (UDF_SB_LVIDBH(sb) != bh)
1143                         udf_release_data(bh);
1144                 loc.extLength -= sb->s_blocksize;
1145                 loc.extLocation ++;
1146         }
1147         if (UDF_SB_LVIDBH(sb) != bh)
1148                 udf_release_data(bh);
1149 }
1150
1151 /*
1152  * udf_process_sequence
1153  *
1154  * PURPOSE
1155  *      Process a main/reserve volume descriptor sequence.
1156  *
1157  * PRE-CONDITIONS
1158  *      sb                      Pointer to _locked_ superblock.
1159  *      block                   First block of first extent of the sequence.
1160  *      lastblock               Lastblock of first extent of the sequence.
1161  *
1162  * HISTORY
1163  *      July 1, 1997 - Andrew E. Mileski
1164  *      Written, tested, and released.
1165  */
1166 static  int
1167 udf_process_sequence(struct super_block *sb, long block, long lastblock, kernel_lb_addr *fileset)
1168 {
1169         struct buffer_head *bh = NULL;
1170         struct udf_vds_record vds[VDS_POS_LENGTH];
1171         struct generic_desc *gd;
1172         struct volDescPtr *vdp;
1173         int done=0;
1174         int i,j;
1175         uint32_t vdsn;
1176         uint16_t ident;
1177         long next_s = 0, next_e = 0;
1178
1179         memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH);
1180
1181         /* Read the main descriptor sequence */
1182         for (;(!done && block <= lastblock); block++)
1183         {
1184
1185                 bh = udf_read_tagged(sb, block, block, &ident);
1186                 if (!bh) 
1187                         break;
1188
1189                 /* Process each descriptor (ISO 13346 3/8.3-8.4) */
1190                 gd = (struct generic_desc *)bh->b_data;
1191                 vdsn = le32_to_cpu(gd->volDescSeqNum);
1192                 switch (ident)
1193                 {
1194                         case TAG_IDENT_PVD: /* ISO 13346 3/10.1 */
1195                                 if (vdsn >= vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum)
1196                                 {
1197                                         vds[VDS_POS_PRIMARY_VOL_DESC].volDescSeqNum = vdsn;
1198                                         vds[VDS_POS_PRIMARY_VOL_DESC].block = block;
1199                                 }
1200                                 break;
1201                         case TAG_IDENT_VDP: /* ISO 13346 3/10.3 */
1202                                 if (vdsn >= vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum)
1203                                 {
1204                                         vds[VDS_POS_VOL_DESC_PTR].volDescSeqNum = vdsn;
1205                                         vds[VDS_POS_VOL_DESC_PTR].block = block;
1206
1207                                         vdp = (struct volDescPtr *)bh->b_data;
1208                                         next_s = le32_to_cpu(vdp->nextVolDescSeqExt.extLocation);
1209                                         next_e = le32_to_cpu(vdp->nextVolDescSeqExt.extLength);
1210                                         next_e = next_e >> sb->s_blocksize_bits;
1211                                         next_e += next_s;
1212                                 }
1213                                 break;
1214                         case TAG_IDENT_IUVD: /* ISO 13346 3/10.4 */
1215                                 if (vdsn >= vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum)
1216                                 {
1217                                         vds[VDS_POS_IMP_USE_VOL_DESC].volDescSeqNum = vdsn;
1218                                         vds[VDS_POS_IMP_USE_VOL_DESC].block = block;
1219                                 }
1220                                 break;
1221                         case TAG_IDENT_PD: /* ISO 13346 3/10.5 */
1222                                 if (!vds[VDS_POS_PARTITION_DESC].block)
1223                                         vds[VDS_POS_PARTITION_DESC].block = block;
1224                                 break;
1225                         case TAG_IDENT_LVD: /* ISO 13346 3/10.6 */
1226                                 if (vdsn >= vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum)
1227                                 {
1228                                         vds[VDS_POS_LOGICAL_VOL_DESC].volDescSeqNum = vdsn;
1229                                         vds[VDS_POS_LOGICAL_VOL_DESC].block = block;
1230                                 }
1231                                 break;
1232                         case TAG_IDENT_USD: /* ISO 13346 3/10.8 */
1233                                 if (vdsn >= vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum)
1234                                 {
1235                                         vds[VDS_POS_UNALLOC_SPACE_DESC].volDescSeqNum = vdsn;
1236                                         vds[VDS_POS_UNALLOC_SPACE_DESC].block = block;
1237                                 }
1238                                 break;
1239                         case TAG_IDENT_TD: /* ISO 13346 3/10.9 */
1240                                 vds[VDS_POS_TERMINATING_DESC].block = block;
1241                                 if (next_e)
1242                                 {
1243                                         block = next_s;
1244                                         lastblock = next_e;
1245                                         next_s = next_e = 0;
1246                                 }
1247                                 else
1248                                         done = 1;
1249                                 break;
1250                 }
1251                 udf_release_data(bh);
1252         }
1253         for (i=0; i<VDS_POS_LENGTH; i++)
1254         {
1255                 if (vds[i].block)
1256                 {
1257                         bh = udf_read_tagged(sb, vds[i].block, vds[i].block, &ident);
1258
1259                         if (i == VDS_POS_PRIMARY_VOL_DESC)
1260                                 udf_load_pvoldesc(sb, bh);
1261                         else if (i == VDS_POS_LOGICAL_VOL_DESC)
1262                                 udf_load_logicalvol(sb, bh, fileset);
1263                         else if (i == VDS_POS_PARTITION_DESC)
1264                         {
1265                                 struct buffer_head *bh2 = NULL;
1266                                 udf_load_partdesc(sb, bh);
1267                                 for (j=vds[i].block+1; j<vds[VDS_POS_TERMINATING_DESC].block; j++)
1268                                 {
1269                                         bh2 = udf_read_tagged(sb, j, j, &ident);
1270                                         gd = (struct generic_desc *)bh2->b_data;
1271                                         if (ident == TAG_IDENT_PD)
1272                                                 udf_load_partdesc(sb, bh2);
1273                                         udf_release_data(bh2);
1274                                 }
1275                         }
1276                         udf_release_data(bh);
1277                 }
1278         }
1279
1280         return 0;
1281 }
1282
1283 /*
1284  * udf_check_valid()
1285  */
1286 static int
1287 udf_check_valid(struct super_block *sb, int novrs, int silent)
1288 {
1289         long block;
1290
1291         if (novrs)
1292         {
1293                 udf_debug("Validity check skipped because of novrs option\n");
1294                 return 0;
1295         }
1296         /* Check that it is NSR02 compliant */
1297         /* Process any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */
1298         else if ((block = udf_vrs(sb, silent)) == -1)
1299         {
1300                 udf_debug("Failed to read byte 32768. Assuming open disc. Skipping validity check\n");
1301                 if (!UDF_SB_LASTBLOCK(sb))
1302                         UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb);
1303                 return 0;
1304         }
1305         else 
1306                 return !block;
1307 }
1308
1309 static int
1310 udf_load_partition(struct super_block *sb, kernel_lb_addr *fileset)
1311 {
1312         struct anchorVolDescPtr *anchor;
1313         uint16_t ident;
1314         struct buffer_head *bh;
1315         long main_s, main_e, reserve_s, reserve_e;
1316         int i, j;
1317
1318         if (!sb)
1319                 return 1;
1320
1321         for (i = 0; i < ARRAY_SIZE(UDF_SB_ANCHOR(sb)); i++) {
1322                 if (UDF_SB_ANCHOR(sb)[i] && (bh = udf_read_tagged(sb,
1323                         UDF_SB_ANCHOR(sb)[i], UDF_SB_ANCHOR(sb)[i], &ident)))
1324                 {
1325                         anchor = (struct anchorVolDescPtr *)bh->b_data;
1326
1327                         /* Locate the main sequence */
1328                         main_s = le32_to_cpu( anchor->mainVolDescSeqExt.extLocation );
1329                         main_e = le32_to_cpu( anchor->mainVolDescSeqExt.extLength );
1330                         main_e = main_e >> sb->s_blocksize_bits;
1331                         main_e += main_s;
1332
1333                         /* Locate the reserve sequence */
1334                         reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation);
1335                         reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength);
1336                         reserve_e = reserve_e >> sb->s_blocksize_bits;
1337                         reserve_e += reserve_s;
1338
1339                         udf_release_data(bh);
1340
1341                         /* Process the main & reserve sequences */
1342                         /* responsible for finding the PartitionDesc(s) */
1343                         if (!(udf_process_sequence(sb, main_s, main_e, fileset) &&
1344                                 udf_process_sequence(sb, reserve_s, reserve_e, fileset)))
1345                         {
1346                                 break;
1347                         }
1348                 }
1349         }
1350
1351         if (i == ARRAY_SIZE(UDF_SB_ANCHOR(sb))) {
1352                 udf_debug("No Anchor block found\n");
1353                 return 1;
1354         } else
1355                 udf_debug("Using anchor in block %d\n", UDF_SB_ANCHOR(sb)[i]);
1356
1357         for (i=0; i<UDF_SB_NUMPARTS(sb); i++)
1358         {
1359                 switch UDF_SB_PARTTYPE(sb, i)
1360                 {
1361                         case UDF_VIRTUAL_MAP15:
1362                         case UDF_VIRTUAL_MAP20:
1363                         {
1364                                 kernel_lb_addr ino;
1365
1366                                 if (!UDF_SB_LASTBLOCK(sb))
1367                                 {
1368                                         UDF_SB_LASTBLOCK(sb) = udf_get_last_block(sb);
1369                                         udf_find_anchor(sb);
1370                                 }
1371
1372                                 if (!UDF_SB_LASTBLOCK(sb))
1373                                 {
1374                                         udf_debug("Unable to determine Lastblock (For Virtual Partition)\n");
1375                                         return 1;
1376                                 }
1377
1378                                 for (j=0; j<UDF_SB_NUMPARTS(sb); j++)
1379                                 {
1380                                         if (j != i &&
1381                                                 UDF_SB_PARTVSN(sb,i) == UDF_SB_PARTVSN(sb,j) &&
1382                                                 UDF_SB_PARTNUM(sb,i) == UDF_SB_PARTNUM(sb,j))
1383                                         {
1384                                                 ino.partitionReferenceNum = j;
1385                                                 ino.logicalBlockNum = UDF_SB_LASTBLOCK(sb) -
1386                                                         UDF_SB_PARTROOT(sb,j);
1387                                                 break;
1388                                         }
1389                                 }
1390
1391                                 if (j == UDF_SB_NUMPARTS(sb))
1392                                         return 1;
1393
1394                                 if (!(UDF_SB_VAT(sb) = udf_iget(sb, ino)))
1395                                         return 1;
1396
1397                                 if (UDF_SB_PARTTYPE(sb,i) == UDF_VIRTUAL_MAP15)
1398                                 {
1399                                         UDF_SB_TYPEVIRT(sb,i).s_start_offset = udf_ext0_offset(UDF_SB_VAT(sb));
1400                                         UDF_SB_TYPEVIRT(sb,i).s_num_entries = (UDF_SB_VAT(sb)->i_size - 36) >> 2;
1401                                 }
1402                                 else if (UDF_SB_PARTTYPE(sb,i) == UDF_VIRTUAL_MAP20)
1403                                 {
1404                                         struct buffer_head *bh = NULL;
1405                                         uint32_t pos;
1406
1407                                         pos = udf_block_map(UDF_SB_VAT(sb), 0);
1408                                         bh = sb_bread(sb, pos);
1409                                         UDF_SB_TYPEVIRT(sb,i).s_start_offset =
1410                                                 le16_to_cpu(((struct virtualAllocationTable20 *)bh->b_data + udf_ext0_offset(UDF_SB_VAT(sb)))->lengthHeader) +
1411                                                         udf_ext0_offset(UDF_SB_VAT(sb));
1412                                         UDF_SB_TYPEVIRT(sb,i).s_num_entries = (UDF_SB_VAT(sb)->i_size -
1413                                                 UDF_SB_TYPEVIRT(sb,i).s_start_offset) >> 2;
1414                                         udf_release_data(bh);
1415                                 }
1416                                 UDF_SB_PARTROOT(sb,i) = udf_get_pblock(sb, 0, i, 0);
1417                                 UDF_SB_PARTLEN(sb,i) = UDF_SB_PARTLEN(sb,ino.partitionReferenceNum);
1418                         }
1419                 }
1420         }
1421         return 0;
1422 }
1423
1424 static void udf_open_lvid(struct super_block *sb)
1425 {
1426         if (UDF_SB_LVIDBH(sb))
1427         {
1428                 int i;
1429                 kernel_timestamp cpu_time;
1430
1431                 UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1432                 UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1433                 if (udf_time_to_stamp(&cpu_time, CURRENT_TIME))
1434                         UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time);
1435                 UDF_SB_LVID(sb)->integrityType = LVID_INTEGRITY_TYPE_OPEN;
1436
1437                 UDF_SB_LVID(sb)->descTag.descCRC =
1438                         cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag),
1439                         le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0));
1440
1441                 UDF_SB_LVID(sb)->descTag.tagChecksum = 0;
1442                 for (i=0; i<16; i++)
1443                         if (i != 4)
1444                                 UDF_SB_LVID(sb)->descTag.tagChecksum +=
1445                                         ((uint8_t *)&(UDF_SB_LVID(sb)->descTag))[i];
1446
1447                 mark_buffer_dirty(UDF_SB_LVIDBH(sb));
1448         }
1449 }
1450
1451 static void udf_close_lvid(struct super_block *sb)
1452 {
1453         if (UDF_SB_LVIDBH(sb) &&
1454                 UDF_SB_LVID(sb)->integrityType == LVID_INTEGRITY_TYPE_OPEN)
1455         {
1456                 int i;
1457                 kernel_timestamp cpu_time;
1458
1459                 UDF_SB_LVIDIU(sb)->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1460                 UDF_SB_LVIDIU(sb)->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1461                 if (udf_time_to_stamp(&cpu_time, CURRENT_TIME))
1462                         UDF_SB_LVID(sb)->recordingDateAndTime = cpu_to_lets(cpu_time);
1463                 if (UDF_MAX_WRITE_VERSION > le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev))
1464                         UDF_SB_LVIDIU(sb)->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
1465                 if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev))
1466                         UDF_SB_LVIDIU(sb)->minUDFReadRev = cpu_to_le16(UDF_SB_UDFREV(sb));
1467                 if (UDF_SB_UDFREV(sb) > le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev))
1468                         UDF_SB_LVIDIU(sb)->minUDFWriteRev = cpu_to_le16(UDF_SB_UDFREV(sb));
1469                 UDF_SB_LVID(sb)->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE);
1470
1471                 UDF_SB_LVID(sb)->descTag.descCRC =
1472                         cpu_to_le16(udf_crc((char *)UDF_SB_LVID(sb) + sizeof(tag),
1473                         le16_to_cpu(UDF_SB_LVID(sb)->descTag.descCRCLength), 0));
1474
1475                 UDF_SB_LVID(sb)->descTag.tagChecksum = 0;
1476                 for (i=0; i<16; i++)
1477                         if (i != 4)
1478                                 UDF_SB_LVID(sb)->descTag.tagChecksum +=
1479                                         ((uint8_t *)&(UDF_SB_LVID(sb)->descTag))[i];
1480
1481                 mark_buffer_dirty(UDF_SB_LVIDBH(sb));
1482         }
1483 }
1484
1485 /*
1486  * udf_read_super
1487  *
1488  * PURPOSE
1489  *      Complete the specified super block.
1490  *
1491  * PRE-CONDITIONS
1492  *      sb                      Pointer to superblock to complete - never NULL.
1493  *      sb->s_dev               Device to read suberblock from.
1494  *      options                 Pointer to mount options.
1495  *      silent                  Silent flag.
1496  *
1497  * HISTORY
1498  *      July 1, 1997 - Andrew E. Mileski
1499  *      Written, tested, and released.
1500  */
1501 static int udf_fill_super(struct super_block *sb, void *options, int silent)
1502 {
1503         int i;
1504         struct inode *inode=NULL;
1505         struct udf_options uopt;
1506         kernel_lb_addr rootdir, fileset;
1507         struct udf_sb_info *sbi;
1508
1509         uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT);
1510         uopt.uid = -1;
1511         uopt.gid = -1;
1512         uopt.umask = 0;
1513
1514         sbi = kmalloc(sizeof(struct udf_sb_info), GFP_KERNEL);
1515         if (!sbi)
1516                 return -ENOMEM;
1517         sb->s_fs_info = sbi;
1518         memset(UDF_SB(sb), 0x00, sizeof(struct udf_sb_info));
1519
1520         mutex_init(&sbi->s_alloc_mutex);
1521
1522         if (!udf_parse_options((char *)options, &uopt))
1523                 goto error_out;
1524
1525         if (uopt.flags & (1 << UDF_FLAG_UTF8) &&
1526             uopt.flags & (1 << UDF_FLAG_NLS_MAP))
1527         {
1528                 udf_error(sb, "udf_read_super",
1529                         "utf8 cannot be combined with iocharset\n");
1530                 goto error_out;
1531         }
1532 #ifdef CONFIG_UDF_NLS
1533         if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map)
1534         {
1535                 uopt.nls_map = load_nls_default();
1536                 if (!uopt.nls_map)
1537                         uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP);
1538                 else
1539                         udf_debug("Using default NLS map\n");
1540         }
1541 #endif
1542         if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP)))
1543                 uopt.flags |= (1 << UDF_FLAG_UTF8);
1544
1545         fileset.logicalBlockNum = 0xFFFFFFFF;
1546         fileset.partitionReferenceNum = 0xFFFF;
1547
1548         UDF_SB(sb)->s_flags = uopt.flags;
1549         UDF_SB(sb)->s_uid = uopt.uid;
1550         UDF_SB(sb)->s_gid = uopt.gid;
1551         UDF_SB(sb)->s_umask = uopt.umask;
1552         UDF_SB(sb)->s_nls_map = uopt.nls_map;
1553
1554         /* Set the block size for all transfers */
1555         if (!udf_set_blocksize(sb, uopt.blocksize))
1556                 goto error_out;
1557
1558         if ( uopt.session == 0xFFFFFFFF )
1559                 UDF_SB_SESSION(sb) = udf_get_last_session(sb);
1560         else
1561                 UDF_SB_SESSION(sb) = uopt.session;
1562
1563         udf_debug("Multi-session=%d\n", UDF_SB_SESSION(sb));
1564
1565         UDF_SB_LASTBLOCK(sb) = uopt.lastblock;
1566         UDF_SB_ANCHOR(sb)[0] = UDF_SB_ANCHOR(sb)[1] = 0;
1567         UDF_SB_ANCHOR(sb)[2] = uopt.anchor;
1568         UDF_SB_ANCHOR(sb)[3] = 256;
1569
1570         if (udf_check_valid(sb, uopt.novrs, silent)) /* read volume recognition sequences */
1571         {
1572                 printk("UDF-fs: No VRS found\n");
1573                 goto error_out;
1574         }
1575
1576         udf_find_anchor(sb);
1577
1578         /* Fill in the rest of the superblock */
1579         sb->s_op = &udf_sb_ops;
1580         sb->dq_op = NULL;
1581         sb->s_dirt = 0;
1582         sb->s_magic = UDF_SUPER_MAGIC;
1583         sb->s_time_gran = 1000;
1584
1585         if (udf_load_partition(sb, &fileset))
1586         {
1587                 printk("UDF-fs: No partition found (1)\n");
1588                 goto error_out;
1589         }
1590
1591         udf_debug("Lastblock=%d\n", UDF_SB_LASTBLOCK(sb));
1592
1593         if ( UDF_SB_LVIDBH(sb) )
1594         {
1595                 uint16_t minUDFReadRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev);
1596                 uint16_t minUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFWriteRev);
1597                 /* uint16_t maxUDFWriteRev = le16_to_cpu(UDF_SB_LVIDIU(sb)->maxUDFWriteRev); */
1598
1599                 if (minUDFReadRev > UDF_MAX_READ_VERSION)
1600                 {
1601                         printk("UDF-fs: minUDFReadRev=%x (max is %x)\n",
1602                                 le16_to_cpu(UDF_SB_LVIDIU(sb)->minUDFReadRev),
1603                                 UDF_MAX_READ_VERSION);
1604                         goto error_out;
1605                 }
1606                 else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION)
1607                 {
1608                         sb->s_flags |= MS_RDONLY;
1609                 }
1610
1611                 UDF_SB_UDFREV(sb) = minUDFWriteRev;
1612
1613                 if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE)
1614                         UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE);
1615                 if (minUDFReadRev >= UDF_VERS_USE_STREAMS)
1616                         UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS);
1617         }
1618
1619         if ( !UDF_SB_NUMPARTS(sb) )
1620         {
1621                 printk("UDF-fs: No partition found (2)\n");
1622                 goto error_out;
1623         }
1624
1625         if ( udf_find_fileset(sb, &fileset, &rootdir) )
1626         {
1627                 printk("UDF-fs: No fileset found\n");
1628                 goto error_out;
1629         }
1630
1631         if (!silent)
1632         {
1633                 kernel_timestamp ts;
1634                 udf_time_to_stamp(&ts, UDF_SB_RECORDTIME(sb));
1635                 udf_info("UDF %s (%s) Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n",
1636                         UDFFS_VERSION, UDFFS_DATE,
1637                         UDF_SB_VOLIDENT(sb), ts.year, ts.month, ts.day, ts.hour, ts.minute,
1638                         ts.typeAndTimezone);
1639         }
1640         if (!(sb->s_flags & MS_RDONLY))
1641                 udf_open_lvid(sb);
1642
1643         /* Assign the root inode */
1644         /* assign inodes by physical block number */
1645         /* perhaps it's not extensible enough, but for now ... */
1646         inode = udf_iget(sb, rootdir); 
1647         if (!inode)
1648         {
1649                 printk("UDF-fs: Error in udf_iget, block=%d, partition=%d\n",
1650                         rootdir.logicalBlockNum, rootdir.partitionReferenceNum);
1651                 goto error_out;
1652         }
1653
1654         /* Allocate a dentry for the root inode */
1655         sb->s_root = d_alloc_root(inode);
1656         if (!sb->s_root)
1657         {
1658                 printk("UDF-fs: Couldn't allocate root dentry\n");
1659                 iput(inode);
1660                 goto error_out;
1661         }
1662         sb->s_maxbytes = 1<<30;
1663         return 0;
1664
1665 error_out:
1666         if (UDF_SB_VAT(sb))
1667                 iput(UDF_SB_VAT(sb));
1668         if (UDF_SB_NUMPARTS(sb))
1669         {
1670                 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE)
1671                         iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table);
1672                 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE)
1673                         iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table);
1674                 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP)
1675                         UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb),s_uspace);
1676                 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP)
1677                         UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb),s_fspace);
1678                 if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15)
1679                 {
1680                         for (i=0; i<4; i++)
1681                                 udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
1682                 }
1683         }
1684 #ifdef CONFIG_UDF_NLS
1685         if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
1686                 unload_nls(UDF_SB(sb)->s_nls_map);
1687 #endif
1688         if (!(sb->s_flags & MS_RDONLY))
1689                 udf_close_lvid(sb);
1690         udf_release_data(UDF_SB_LVIDBH(sb));
1691         UDF_SB_FREE(sb);
1692         kfree(sbi);
1693         sb->s_fs_info = NULL;
1694         return -EINVAL;
1695 }
1696
1697 void udf_error(struct super_block *sb, const char *function,
1698         const char *fmt, ...)
1699 {
1700         va_list args;
1701
1702         if (!(sb->s_flags & MS_RDONLY))
1703         {
1704                 /* mark sb error */
1705                 sb->s_dirt = 1;
1706         }
1707         va_start(args, fmt);
1708         vsprintf(error_buf, fmt, args);
1709         va_end(args);
1710         printk (KERN_CRIT "UDF-fs error (device %s): %s: %s\n",
1711                 sb->s_id, function, error_buf);
1712 }
1713
1714 void udf_warning(struct super_block *sb, const char *function,
1715         const char *fmt, ...)
1716 {
1717         va_list args;
1718
1719         va_start (args, fmt);
1720         vsprintf(error_buf, fmt, args);
1721         va_end(args);
1722         printk(KERN_WARNING "UDF-fs warning (device %s): %s: %s\n",
1723                 sb->s_id, function, error_buf);
1724 }
1725
1726 /*
1727  * udf_put_super
1728  *
1729  * PURPOSE
1730  *      Prepare for destruction of the superblock.
1731  *
1732  * DESCRIPTION
1733  *      Called before the filesystem is unmounted.
1734  *
1735  * HISTORY
1736  *      July 1, 1997 - Andrew E. Mileski
1737  *      Written, tested, and released.
1738  */
1739 static void
1740 udf_put_super(struct super_block *sb)
1741 {
1742         int i;
1743
1744         if (UDF_SB_VAT(sb))
1745                 iput(UDF_SB_VAT(sb));
1746         if (UDF_SB_NUMPARTS(sb))
1747         {
1748                 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE)
1749                         iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table);
1750                 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE)
1751                         iput(UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table);
1752                 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP)
1753                         UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb),s_uspace);
1754                 if (UDF_SB_PARTFLAGS(sb, UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP)
1755                         UDF_SB_FREE_BITMAP(sb,UDF_SB_PARTITION(sb),s_fspace);
1756                 if (UDF_SB_PARTTYPE(sb, UDF_SB_PARTITION(sb)) == UDF_SPARABLE_MAP15)
1757                 {
1758                         for (i=0; i<4; i++)
1759                                 udf_release_data(UDF_SB_TYPESPAR(sb, UDF_SB_PARTITION(sb)).s_spar_map[i]);
1760                 }
1761         }
1762 #ifdef CONFIG_UDF_NLS
1763         if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
1764                 unload_nls(UDF_SB(sb)->s_nls_map);
1765 #endif
1766         if (!(sb->s_flags & MS_RDONLY))
1767                 udf_close_lvid(sb);
1768         udf_release_data(UDF_SB_LVIDBH(sb));
1769         UDF_SB_FREE(sb);
1770         kfree(sb->s_fs_info);
1771         sb->s_fs_info = NULL;
1772 }
1773
1774 /*
1775  * udf_stat_fs
1776  *
1777  * PURPOSE
1778  *      Return info about the filesystem.
1779  *
1780  * DESCRIPTION
1781  *      Called by sys_statfs()
1782  *
1783  * HISTORY
1784  *      July 1, 1997 - Andrew E. Mileski
1785  *      Written, tested, and released.
1786  */
1787 static int
1788 udf_statfs(struct dentry *dentry, struct kstatfs *buf)
1789 {
1790         struct super_block *sb = dentry->d_sb;
1791
1792         buf->f_type = UDF_SUPER_MAGIC;
1793         buf->f_bsize = sb->s_blocksize;
1794         buf->f_blocks = UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb));
1795         buf->f_bfree = udf_count_free(sb);
1796         buf->f_bavail = buf->f_bfree;
1797         buf->f_files = (UDF_SB_LVIDBH(sb) ?
1798                 (le32_to_cpu(UDF_SB_LVIDIU(sb)->numFiles) +
1799                 le32_to_cpu(UDF_SB_LVIDIU(sb)->numDirs)) : 0) + buf->f_bfree;
1800         buf->f_ffree = buf->f_bfree;
1801         /* __kernel_fsid_t f_fsid */
1802         buf->f_namelen = UDF_NAME_LEN-2;
1803
1804         return 0;
1805 }
1806
1807 static unsigned char udf_bitmap_lookup[16] = {
1808         0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4
1809 };
1810
1811 static unsigned int
1812 udf_count_free_bitmap(struct super_block *sb, struct udf_bitmap *bitmap)
1813 {
1814         struct buffer_head *bh = NULL;
1815         unsigned int accum = 0;
1816         int index;
1817         int block = 0, newblock;
1818         kernel_lb_addr loc;
1819         uint32_t bytes;
1820         uint8_t value;
1821         uint8_t *ptr;
1822         uint16_t ident;
1823         struct spaceBitmapDesc *bm;
1824
1825         lock_kernel();
1826
1827         loc.logicalBlockNum = bitmap->s_extPosition;
1828         loc.partitionReferenceNum = UDF_SB_PARTITION(sb);
1829         bh = udf_read_ptagged(sb, loc, 0, &ident);
1830
1831         if (!bh)
1832         {
1833                 printk(KERN_ERR "udf: udf_count_free failed\n");
1834                 goto out;
1835         }
1836         else if (ident != TAG_IDENT_SBD)
1837         {
1838                 udf_release_data(bh);
1839                 printk(KERN_ERR "udf: udf_count_free failed\n");
1840                 goto out;
1841         }
1842
1843         bm = (struct spaceBitmapDesc *)bh->b_data;
1844         bytes = le32_to_cpu(bm->numOfBytes);
1845         index = sizeof(struct spaceBitmapDesc); /* offset in first block only */
1846         ptr = (uint8_t *)bh->b_data;
1847
1848         while ( bytes > 0 )
1849         {
1850                 while ((bytes > 0) && (index < sb->s_blocksize))
1851                 {
1852                         value = ptr[index];
1853                         accum += udf_bitmap_lookup[ value & 0x0f ];
1854                         accum += udf_bitmap_lookup[ value >> 4 ];
1855                         index++;
1856                         bytes--;
1857                 }
1858                 if ( bytes )
1859                 {
1860                         udf_release_data(bh);
1861                         newblock = udf_get_lb_pblock(sb, loc, ++block);
1862                         bh = udf_tread(sb, newblock);
1863                         if (!bh)
1864                         {
1865                                 udf_debug("read failed\n");
1866                                 goto out;
1867                         }
1868                         index = 0;
1869                         ptr = (uint8_t *)bh->b_data;
1870                 }
1871         }
1872         udf_release_data(bh);
1873
1874 out:
1875         unlock_kernel();
1876
1877         return accum;
1878 }
1879
1880 static unsigned int
1881 udf_count_free_table(struct super_block *sb, struct inode * table)
1882 {
1883         unsigned int accum = 0;
1884         uint32_t extoffset, elen;
1885         kernel_lb_addr bloc, eloc;
1886         int8_t etype;
1887         struct buffer_head *bh = NULL;
1888
1889         lock_kernel();
1890
1891         bloc = UDF_I_LOCATION(table);
1892         extoffset = sizeof(struct unallocSpaceEntry);
1893
1894         while ((etype = udf_next_aext(table, &bloc, &extoffset, &eloc, &elen, &bh, 1)) != -1)
1895         {
1896                 accum += (elen >> table->i_sb->s_blocksize_bits);
1897         }
1898         udf_release_data(bh);
1899
1900         unlock_kernel();
1901
1902         return accum;
1903 }
1904         
1905 static unsigned int
1906 udf_count_free(struct super_block *sb)
1907 {
1908         unsigned int accum = 0;
1909
1910         if (UDF_SB_LVIDBH(sb))
1911         {
1912                 if (le32_to_cpu(UDF_SB_LVID(sb)->numOfPartitions) > UDF_SB_PARTITION(sb))
1913                 {
1914                         accum = le32_to_cpu(UDF_SB_LVID(sb)->freeSpaceTable[UDF_SB_PARTITION(sb)]);
1915
1916                         if (accum == 0xFFFFFFFF)
1917                                 accum = 0;
1918                 }
1919         }
1920
1921         if (accum)
1922                 return accum;
1923
1924         if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_BITMAP)
1925         {
1926                 accum += udf_count_free_bitmap(sb,
1927                         UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_bitmap);
1928         }
1929         if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_BITMAP)
1930         {
1931                 accum += udf_count_free_bitmap(sb,
1932                         UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_bitmap);
1933         }
1934         if (accum)
1935                 return accum;
1936
1937         if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_UNALLOC_TABLE)
1938         {
1939                 accum += udf_count_free_table(sb,
1940                         UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_uspace.s_table);
1941         }
1942         if (UDF_SB_PARTFLAGS(sb,UDF_SB_PARTITION(sb)) & UDF_PART_FLAG_FREED_TABLE)
1943         {
1944                 accum += udf_count_free_table(sb,
1945                         UDF_SB_PARTMAPS(sb)[UDF_SB_PARTITION(sb)].s_fspace.s_table);
1946         }
1947
1948         return accum;
1949 }