super.c 65.3 KB
Newer Older
L
Linus Torvalds 已提交
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
/*
 * super.c
 *
 * PURPOSE
 *  Super block routines for the OSTA-UDF(tm) filesystem.
 *
 * DESCRIPTION
 *  OSTA-UDF(tm) = Optical Storage Technology Association
 *  Universal Disk Format.
 *
 *  This code is based on version 2.00 of the UDF specification,
 *  and revision 3 of the ECMA 167 standard [equivalent to ISO 13346].
 *    http://www.osta.org/
 *    http://www.ecma.ch/
 *    http://www.iso.org/
 *
 * COPYRIGHT
 *  This file is distributed under the terms of the GNU General Public
 *  License (GPL). Copies of the GPL can be obtained from:
 *    ftp://prep.ai.mit.edu/pub/gnu/GPL
 *  Each contributing author retains all rights to their own work.
 *
 *  (C) 1998 Dave Boynton
 *  (C) 1998-2004 Ben Fennema
 *  (C) 2000 Stelias Computing Inc
 *
 * HISTORY
 *
 *  09/24/98 dgb  changed to allow compiling outside of kernel, and
 *                added some debugging.
 *  10/01/98 dgb  updated to allow (some) possibility of compiling w/2.0.34
 *  10/16/98      attempting some multi-session support
 *  10/17/98      added freespace count for "df"
 *  11/11/98 gr   added novrs option
 *  11/26/98 dgb  added fileset,anchor mount options
36 37
 *  12/06/98 blf  really hosed things royally. vat/sparing support. sequenced
 *                vol descs. rewrote option handling based on isofs
L
Linus Torvalds 已提交
38 39 40
 *  12/20/98      find the free space bitmap (if it exists)
 */

41
#include "udfdecl.h"
L
Linus Torvalds 已提交
42 43 44 45 46 47 48 49 50 51 52 53

#include <linux/blkdev.h>
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/parser.h>
#include <linux/stat.h>
#include <linux/cdrom.h>
#include <linux/nls.h>
#include <linux/buffer_head.h>
#include <linux/vfs.h>
#include <linux/vmalloc.h>
54
#include <linux/errno.h>
M
Miklos Szeredi 已提交
55 56
#include <linux/mount.h>
#include <linux/seq_file.h>
57
#include <linux/bitmap.h>
58
#include <linux/crc-itu-t.h>
J
Jan Kara 已提交
59
#include <linux/log2.h>
L
Linus Torvalds 已提交
60 61 62 63 64 65
#include <asm/byteorder.h>

#include "udf_sb.h"
#include "udf_i.h"

#include <linux/init.h>
F
Fabian Frederick 已提交
66
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
67 68 69 70 71 72 73 74 75 76

#define VDS_POS_PRIMARY_VOL_DESC	0
#define VDS_POS_UNALLOC_SPACE_DESC	1
#define VDS_POS_LOGICAL_VOL_DESC	2
#define VDS_POS_PARTITION_DESC		3
#define VDS_POS_IMP_USE_VOL_DESC	4
#define VDS_POS_VOL_DESC_PTR		5
#define VDS_POS_TERMINATING_DESC	6
#define VDS_POS_LENGTH			7

M
Miklos Szeredi 已提交
77 78
#define UDF_DEFAULT_BLOCKSIZE 2048

79 80 81
#define VSD_FIRST_SECTOR_OFFSET		32768
#define VSD_MAX_SECTOR_OFFSET		0x800000

82 83
enum { UDF_MAX_LINKS = 0xffff };

L
Linus Torvalds 已提交
84 85 86
/* These are the "meat" - everything else is stuffing */
static int udf_fill_super(struct super_block *, void *, int);
static void udf_put_super(struct super_block *);
87
static int udf_sync_fs(struct super_block *, int);
L
Linus Torvalds 已提交
88
static int udf_remount_fs(struct super_block *, int *, char *);
89 90 91
static void udf_load_logicalvolint(struct super_block *, struct kernel_extent_ad);
static int udf_find_fileset(struct super_block *, struct kernel_lb_addr *,
			    struct kernel_lb_addr *);
92
static void udf_load_fileset(struct super_block *, struct buffer_head *,
93
			     struct kernel_lb_addr *);
L
Linus Torvalds 已提交
94 95 96
static void udf_open_lvid(struct super_block *);
static void udf_close_lvid(struct super_block *);
static unsigned int udf_count_free(struct super_block *);
97
static int udf_statfs(struct dentry *, struct kstatfs *);
98
static int udf_show_options(struct seq_file *, struct dentry *);
L
Linus Torvalds 已提交
99

J
Jan Kara 已提交
100
struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb)
M
Marcin Slusarz 已提交
101
{
J
Jan Kara 已提交
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
	struct logicalVolIntegrityDesc *lvid;
	unsigned int partnum;
	unsigned int offset;

	if (!UDF_SB(sb)->s_lvid_bh)
		return NULL;
	lvid = (struct logicalVolIntegrityDesc *)UDF_SB(sb)->s_lvid_bh->b_data;
	partnum = le32_to_cpu(lvid->numOfPartitions);
	if ((sb->s_blocksize - sizeof(struct logicalVolIntegrityDescImpUse) -
	     offsetof(struct logicalVolIntegrityDesc, impUse)) /
	     (2 * sizeof(uint32_t)) < partnum) {
		udf_err(sb, "Logical volume integrity descriptor corrupted "
			"(numOfPartitions = %u)!\n", partnum);
		return NULL;
	}
	/* The offset is to skip freeSpaceTable and sizeTable arrays */
	offset = partnum * 2 * sizeof(uint32_t);
M
Marcin Slusarz 已提交
119 120 121
	return (struct logicalVolIntegrityDescImpUse *)&(lvid->impUse[offset]);
}

L
Linus Torvalds 已提交
122
/* UDF filesystem type */
A
Al Viro 已提交
123 124
static struct dentry *udf_mount(struct file_system_type *fs_type,
		      int flags, const char *dev_name, void *data)
L
Linus Torvalds 已提交
125
{
A
Al Viro 已提交
126
	return mount_bdev(fs_type, flags, dev_name, data, udf_fill_super);
L
Linus Torvalds 已提交
127 128 129
}

static struct file_system_type udf_fstype = {
130 131
	.owner		= THIS_MODULE,
	.name		= "udf",
A
Al Viro 已提交
132
	.mount		= udf_mount,
133 134
	.kill_sb	= kill_block_super,
	.fs_flags	= FS_REQUIRES_DEV,
L
Linus Torvalds 已提交
135
};
136
MODULE_ALIAS_FS("udf");
L
Linus Torvalds 已提交
137

138
static struct kmem_cache *udf_inode_cachep;
L
Linus Torvalds 已提交
139 140 141 142

static struct inode *udf_alloc_inode(struct super_block *sb)
{
	struct udf_inode_info *ei;
143
	ei = kmem_cache_alloc(udf_inode_cachep, GFP_KERNEL);
L
Linus Torvalds 已提交
144 145
	if (!ei)
		return NULL;
146 147 148 149 150 151

	ei->i_unique = 0;
	ei->i_lenExtents = 0;
	ei->i_next_alloc_block = 0;
	ei->i_next_alloc_goal = 0;
	ei->i_strat4096 = 0;
152
	init_rwsem(&ei->i_data_sem);
153 154
	ei->cached_extent.lstart = -1;
	spin_lock_init(&ei->i_extent_cache_lock);
155

L
Linus Torvalds 已提交
156 157 158
	return &ei->vfs_inode;
}

N
Nick Piggin 已提交
159
static void udf_i_callback(struct rcu_head *head)
L
Linus Torvalds 已提交
160
{
N
Nick Piggin 已提交
161
	struct inode *inode = container_of(head, struct inode, i_rcu);
L
Linus Torvalds 已提交
162 163 164
	kmem_cache_free(udf_inode_cachep, UDF_I(inode));
}

N
Nick Piggin 已提交
165 166 167 168 169
static void udf_destroy_inode(struct inode *inode)
{
	call_rcu(&inode->i_rcu, udf_i_callback);
}

170
static void init_once(void *foo)
L
Linus Torvalds 已提交
171
{
172
	struct udf_inode_info *ei = (struct udf_inode_info *)foo;
L
Linus Torvalds 已提交
173

C
Christoph Lameter 已提交
174 175
	ei->i_ext.i_data = NULL;
	inode_init_once(&ei->vfs_inode);
L
Linus Torvalds 已提交
176 177
}

178
static int __init init_inodecache(void)
L
Linus Torvalds 已提交
179 180 181
{
	udf_inode_cachep = kmem_cache_create("udf_inode_cache",
					     sizeof(struct udf_inode_info),
182 183
					     0, (SLAB_RECLAIM_ACCOUNT |
						 SLAB_MEM_SPREAD),
184
					     init_once);
185
	if (!udf_inode_cachep)
L
Linus Torvalds 已提交
186 187 188 189 190 191
		return -ENOMEM;
	return 0;
}

static void destroy_inodecache(void)
{
192 193 194 195 196
	/*
	 * Make sure all delayed rcu free inodes are flushed before we
	 * destroy cache.
	 */
	rcu_barrier();
197
	kmem_cache_destroy(udf_inode_cachep);
L
Linus Torvalds 已提交
198 199 200
}

/* Superblock operations */
201
static const struct super_operations udf_sb_ops = {
202 203 204
	.alloc_inode	= udf_alloc_inode,
	.destroy_inode	= udf_destroy_inode,
	.write_inode	= udf_write_inode,
A
Al Viro 已提交
205
	.evict_inode	= udf_evict_inode,
206
	.put_super	= udf_put_super,
207
	.sync_fs	= udf_sync_fs,
208 209
	.statfs		= udf_statfs,
	.remount_fs	= udf_remount_fs,
M
Miklos Szeredi 已提交
210
	.show_options	= udf_show_options,
L
Linus Torvalds 已提交
211 212
};

213
struct udf_options {
L
Linus Torvalds 已提交
214 215 216 217 218 219 220 221 222 223
	unsigned char novrs;
	unsigned int blocksize;
	unsigned int session;
	unsigned int lastblock;
	unsigned int anchor;
	unsigned int volume;
	unsigned short partition;
	unsigned int fileset;
	unsigned int rootdir;
	unsigned int flags;
A
Al Viro 已提交
224
	umode_t umask;
225 226
	kgid_t gid;
	kuid_t uid;
A
Al Viro 已提交
227 228
	umode_t fmode;
	umode_t dmode;
L
Linus Torvalds 已提交
229 230 231 232 233 234
	struct nls_table *nls_map;
};

static int __init init_udf_fs(void)
{
	int err;
235

L
Linus Torvalds 已提交
236 237 238 239 240 241
	err = init_inodecache();
	if (err)
		goto out1;
	err = register_filesystem(&udf_fstype);
	if (err)
		goto out;
242

L
Linus Torvalds 已提交
243
	return 0;
244 245

out:
L
Linus Torvalds 已提交
246
	destroy_inodecache();
247 248

out1:
L
Linus Torvalds 已提交
249 250 251 252 253 254 255 256 257 258
	return err;
}

static void __exit exit_udf_fs(void)
{
	unregister_filesystem(&udf_fstype);
	destroy_inodecache();
}

module_init(init_udf_fs)
259
module_exit(exit_udf_fs)
L
Linus Torvalds 已提交
260

261 262 263 264 265 266 267
static int udf_sb_alloc_partition_maps(struct super_block *sb, u32 count)
{
	struct udf_sb_info *sbi = UDF_SB(sb);

	sbi->s_partmaps = kcalloc(count, sizeof(struct udf_part_map),
				  GFP_KERNEL);
	if (!sbi->s_partmaps) {
J
Joe Perches 已提交
268 269
		udf_err(sb, "Unable to allocate space for %d partition maps\n",
			count);
270 271 272 273 274 275 276 277
		sbi->s_partitions = 0;
		return -ENOMEM;
	}

	sbi->s_partitions = count;
	return 0;
}

J
Jan Kara 已提交
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
static void udf_sb_free_bitmap(struct udf_bitmap *bitmap)
{
	int i;
	int nr_groups = bitmap->s_nr_groups;
	int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) *
						nr_groups);

	for (i = 0; i < nr_groups; i++)
		if (bitmap->s_block_bitmap[i])
			brelse(bitmap->s_block_bitmap[i]);

	if (size <= PAGE_SIZE)
		kfree(bitmap);
	else
		vfree(bitmap);
}

static void udf_free_partition(struct udf_part_map *map)
{
	int i;
	struct udf_meta_data *mdata;

	if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
		iput(map->s_uspace.s_table);
	if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
		iput(map->s_fspace.s_table);
	if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
		udf_sb_free_bitmap(map->s_uspace.s_bitmap);
	if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
		udf_sb_free_bitmap(map->s_fspace.s_bitmap);
	if (map->s_partition_type == UDF_SPARABLE_MAP15)
		for (i = 0; i < 4; i++)
			brelse(map->s_type_specific.s_sparing.s_spar_map[i]);
	else if (map->s_partition_type == UDF_METADATA_MAP25) {
		mdata = &map->s_type_specific.s_metadata;
		iput(mdata->s_metadata_fe);
		mdata->s_metadata_fe = NULL;

		iput(mdata->s_mirror_fe);
		mdata->s_mirror_fe = NULL;

		iput(mdata->s_bitmap_fe);
		mdata->s_bitmap_fe = NULL;
	}
}

static void udf_sb_free_partitions(struct super_block *sb)
{
	struct udf_sb_info *sbi = UDF_SB(sb);
	int i;
328 329
	if (sbi->s_partmaps == NULL)
		return;
J
Jan Kara 已提交
330 331 332 333 334 335
	for (i = 0; i < sbi->s_partitions; i++)
		udf_free_partition(&sbi->s_partmaps[i]);
	kfree(sbi->s_partmaps);
	sbi->s_partmaps = NULL;
}

336
static int udf_show_options(struct seq_file *seq, struct dentry *root)
M
Miklos Szeredi 已提交
337
{
338
	struct super_block *sb = root->d_sb;
M
Miklos Szeredi 已提交
339 340 341 342
	struct udf_sb_info *sbi = UDF_SB(sb);

	if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT))
		seq_puts(seq, ",nostrict");
C
Clemens Ladisch 已提交
343
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_BLOCKSIZE_SET))
M
Miklos Szeredi 已提交
344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
		seq_printf(seq, ",bs=%lu", sb->s_blocksize);
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE))
		seq_puts(seq, ",unhide");
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE))
		seq_puts(seq, ",undelete");
	if (!UDF_QUERY_FLAG(sb, UDF_FLAG_USE_AD_IN_ICB))
		seq_puts(seq, ",noadinicb");
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_USE_SHORT_AD))
		seq_puts(seq, ",shortad");
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_FORGET))
		seq_puts(seq, ",uid=forget");
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_IGNORE))
		seq_puts(seq, ",uid=ignore");
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_FORGET))
		seq_puts(seq, ",gid=forget");
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_IGNORE))
		seq_puts(seq, ",gid=ignore");
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET))
362
		seq_printf(seq, ",uid=%u", from_kuid(&init_user_ns, sbi->s_uid));
M
Miklos Szeredi 已提交
363
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET))
364
		seq_printf(seq, ",gid=%u", from_kgid(&init_user_ns, sbi->s_gid));
M
Miklos Szeredi 已提交
365
	if (sbi->s_umask != 0)
A
Al Viro 已提交
366
		seq_printf(seq, ",umask=%ho", sbi->s_umask);
367
	if (sbi->s_fmode != UDF_INVALID_MODE)
A
Al Viro 已提交
368
		seq_printf(seq, ",mode=%ho", sbi->s_fmode);
369
	if (sbi->s_dmode != UDF_INVALID_MODE)
A
Al Viro 已提交
370
		seq_printf(seq, ",dmode=%ho", sbi->s_dmode);
M
Miklos Szeredi 已提交
371 372 373 374
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET))
		seq_printf(seq, ",session=%u", sbi->s_session);
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET))
		seq_printf(seq, ",lastblock=%u", sbi->s_last_block);
J
Jan Kara 已提交
375 376
	if (sbi->s_anchor != 0)
		seq_printf(seq, ",anchor=%u", sbi->s_anchor);
M
Miklos Szeredi 已提交
377 378 379 380 381 382 383 384 385 386 387 388
	/*
	 * volume, partition, fileset and rootdir seem to be ignored
	 * currently
	 */
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8))
		seq_puts(seq, ",utf8");
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP) && sbi->s_nls_map)
		seq_printf(seq, ",iocharset=%s", sbi->s_nls_map->charset);

	return 0;
}

L
Linus Torvalds 已提交
389 390 391 392 393 394 395 396 397 398 399
/*
 * udf_parse_options
 *
 * PURPOSE
 *	Parse mount options.
 *
 * DESCRIPTION
 *	The following mount options are supported:
 *
 *	gid=		Set the default group.
 *	umask=		Set the default umask.
400 401
 *	mode=		Set the default file permissions.
 *	dmode=		Set the default directory permissions.
L
Linus Torvalds 已提交
402 403 404 405 406 407 408 409 410 411 412 413 414
 *	uid=		Set the default user.
 *	bs=		Set the block size.
 *	unhide		Show otherwise hidden files.
 *	undelete	Show deleted files in lists.
 *	adinicb		Embed data in the inode (default)
 *	noadinicb	Don't embed data in the inode
 *	shortad		Use short ad's
 *	longad		Use long ad's (default)
 *	nostrict	Unset strict conformance
 *	iocharset=	Set the NLS character set
 *
 *	The remaining are for debugging and disaster recovery:
 *
415
 *	novrs		Skip volume sequence recognition
L
Linus Torvalds 已提交
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
 *
 *	The following expect a offset from 0.
 *
 *	session=	Set the CDROM session (default= last session)
 *	anchor=		Override standard anchor location. (default= 256)
 *	volume=		Override the VolumeDesc location. (unused)
 *	partition=	Override the PartitionDesc location. (unused)
 *	lastblock=	Set the last block of the filesystem/
 *
 *	The following expect a offset from the partition root.
 *
 *	fileset=	Override the fileset block location. (unused)
 *	rootdir=	Override the root directory location. (unused)
 *		WARNING: overriding the rootdir to a non-directory may
 *		yield highly unpredictable results.
 *
 * PRE-CONDITIONS
 *	options		Pointer to mount options string.
 *	uopts		Pointer to mount options variable.
 *
 * POST-CONDITIONS
 *	<return>	1	Mount options parsed okay.
 *	<return>	0	Error parsing mount options.
 *
 * HISTORY
 *	July 1, 1997 - Andrew E. Mileski
 *	Written, tested, and released.
 */
444

L
Linus Torvalds 已提交
445 446 447 448 449 450
enum {
	Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete,
	Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad,
	Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock,
	Opt_anchor, Opt_volume, Opt_partition, Opt_fileset,
	Opt_rootdir, Opt_utf8, Opt_iocharset,
451 452
	Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore,
	Opt_fmode, Opt_dmode
L
Linus Torvalds 已提交
453 454
};

455
static const match_table_t tokens = {
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
	{Opt_novrs,	"novrs"},
	{Opt_nostrict,	"nostrict"},
	{Opt_bs,	"bs=%u"},
	{Opt_unhide,	"unhide"},
	{Opt_undelete,	"undelete"},
	{Opt_noadinicb,	"noadinicb"},
	{Opt_adinicb,	"adinicb"},
	{Opt_shortad,	"shortad"},
	{Opt_longad,	"longad"},
	{Opt_uforget,	"uid=forget"},
	{Opt_uignore,	"uid=ignore"},
	{Opt_gforget,	"gid=forget"},
	{Opt_gignore,	"gid=ignore"},
	{Opt_gid,	"gid=%u"},
	{Opt_uid,	"uid=%u"},
	{Opt_umask,	"umask=%o"},
	{Opt_session,	"session=%u"},
	{Opt_lastblock,	"lastblock=%u"},
	{Opt_anchor,	"anchor=%u"},
	{Opt_volume,	"volume=%u"},
	{Opt_partition,	"partition=%u"},
	{Opt_fileset,	"fileset=%u"},
	{Opt_rootdir,	"rootdir=%u"},
	{Opt_utf8,	"utf8"},
	{Opt_iocharset,	"iocharset=%s"},
481 482
	{Opt_fmode,     "mode=%o"},
	{Opt_dmode,     "dmode=%o"},
483
	{Opt_err,	NULL}
L
Linus Torvalds 已提交
484 485
};

M
Miklos Szeredi 已提交
486 487
static int udf_parse_options(char *options, struct udf_options *uopt,
			     bool remount)
L
Linus Torvalds 已提交
488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
{
	char *p;
	int option;

	uopt->novrs = 0;
	uopt->partition = 0xFFFF;
	uopt->session = 0xFFFFFFFF;
	uopt->lastblock = 0;
	uopt->anchor = 0;
	uopt->volume = 0xFFFFFFFF;
	uopt->rootdir = 0xFFFFFFFF;
	uopt->fileset = 0xFFFFFFFF;
	uopt->nls_map = NULL;

	if (!options)
		return 1;

505
	while ((p = strsep(&options, ",")) != NULL) {
L
Linus Torvalds 已提交
506 507
		substring_t args[MAX_OPT_ARGS];
		int token;
508
		unsigned n;
L
Linus Torvalds 已提交
509 510 511 512
		if (!*p)
			continue;

		token = match_token(p, tokens, args);
513 514 515
		switch (token) {
		case Opt_novrs:
			uopt->novrs = 1;
C
Clemens Ladisch 已提交
516
			break;
517 518 519
		case Opt_bs:
			if (match_int(&args[0], &option))
				return 0;
520 521 522 523
			n = option;
			if (n != 512 && n != 1024 && n != 2048 && n != 4096)
				return 0;
			uopt->blocksize = n;
C
Clemens Ladisch 已提交
524
			uopt->flags |= (1 << UDF_FLAG_BLOCKSIZE_SET);
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546
			break;
		case Opt_unhide:
			uopt->flags |= (1 << UDF_FLAG_UNHIDE);
			break;
		case Opt_undelete:
			uopt->flags |= (1 << UDF_FLAG_UNDELETE);
			break;
		case Opt_noadinicb:
			uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB);
			break;
		case Opt_adinicb:
			uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB);
			break;
		case Opt_shortad:
			uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD);
			break;
		case Opt_longad:
			uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD);
			break;
		case Opt_gid:
			if (match_int(args, &option))
				return 0;
547 548 549
			uopt->gid = make_kgid(current_user_ns(), option);
			if (!gid_valid(uopt->gid))
				return 0;
550
			uopt->flags |= (1 << UDF_FLAG_GID_SET);
551 552 553 554
			break;
		case Opt_uid:
			if (match_int(args, &option))
				return 0;
555 556 557
			uopt->uid = make_kuid(current_user_ns(), option);
			if (!uid_valid(uopt->uid))
				return 0;
558
			uopt->flags |= (1 << UDF_FLAG_UID_SET);
559 560 561 562 563 564 565 566 567 568 569 570 571
			break;
		case Opt_umask:
			if (match_octal(args, &option))
				return 0;
			uopt->umask = option;
			break;
		case Opt_nostrict:
			uopt->flags &= ~(1 << UDF_FLAG_STRICT);
			break;
		case Opt_session:
			if (match_int(args, &option))
				return 0;
			uopt->session = option;
M
Miklos Szeredi 已提交
572 573
			if (!remount)
				uopt->flags |= (1 << UDF_FLAG_SESSION_SET);
574 575 576 577 578
			break;
		case Opt_lastblock:
			if (match_int(args, &option))
				return 0;
			uopt->lastblock = option;
M
Miklos Szeredi 已提交
579 580
			if (!remount)
				uopt->flags |= (1 << UDF_FLAG_LASTBLOCK_SET);
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609
			break;
		case Opt_anchor:
			if (match_int(args, &option))
				return 0;
			uopt->anchor = option;
			break;
		case Opt_volume:
			if (match_int(args, &option))
				return 0;
			uopt->volume = option;
			break;
		case Opt_partition:
			if (match_int(args, &option))
				return 0;
			uopt->partition = option;
			break;
		case Opt_fileset:
			if (match_int(args, &option))
				return 0;
			uopt->fileset = option;
			break;
		case Opt_rootdir:
			if (match_int(args, &option))
				return 0;
			uopt->rootdir = option;
			break;
		case Opt_utf8:
			uopt->flags |= (1 << UDF_FLAG_UTF8);
			break;
L
Linus Torvalds 已提交
610
#ifdef CONFIG_UDF_NLS
611 612 613 614
		case Opt_iocharset:
			uopt->nls_map = load_nls(args[0].from);
			uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
			break;
L
Linus Torvalds 已提交
615
#endif
616 617 618 619 620 621 622 623 624 625 626 627
		case Opt_uignore:
			uopt->flags |= (1 << UDF_FLAG_UID_IGNORE);
			break;
		case Opt_uforget:
			uopt->flags |= (1 << UDF_FLAG_UID_FORGET);
			break;
		case Opt_gignore:
			uopt->flags |= (1 << UDF_FLAG_GID_IGNORE);
			break;
		case Opt_gforget:
			uopt->flags |= (1 << UDF_FLAG_GID_FORGET);
			break;
628 629 630 631 632 633 634 635 636 637
		case Opt_fmode:
			if (match_octal(args, &option))
				return 0;
			uopt->fmode = option & 0777;
			break;
		case Opt_dmode:
			if (match_octal(args, &option))
				return 0;
			uopt->dmode = option & 0777;
			break;
638
		default:
J
Joe Perches 已提交
639
			pr_err("bad mount option \"%s\" or missing value\n", p);
L
Linus Torvalds 已提交
640 641 642 643 644 645
			return 0;
		}
	}
	return 1;
}

646
static int udf_remount_fs(struct super_block *sb, int *flags, char *options)
L
Linus Torvalds 已提交
647 648
{
	struct udf_options uopt;
M
Marcin Slusarz 已提交
649
	struct udf_sb_info *sbi = UDF_SB(sb);
650
	int error = 0;
J
Jan Kara 已提交
651
	struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb);
L
Linus Torvalds 已提交
652

653
	sync_filesystem(sb);
J
Jan Kara 已提交
654 655
	if (lvidiu) {
		int write_rev = le16_to_cpu(lvidiu->minUDFWriteRev);
656 657 658 659
		if (write_rev > UDF_MAX_WRITE_VERSION && !(*flags & MS_RDONLY))
			return -EACCES;
	}

M
Marcin Slusarz 已提交
660 661 662 663
	uopt.flags = sbi->s_flags;
	uopt.uid   = sbi->s_uid;
	uopt.gid   = sbi->s_gid;
	uopt.umask = sbi->s_umask;
664 665
	uopt.fmode = sbi->s_fmode;
	uopt.dmode = sbi->s_dmode;
L
Linus Torvalds 已提交
666

M
Miklos Szeredi 已提交
667
	if (!udf_parse_options(options, &uopt, true))
L
Linus Torvalds 已提交
668 669
		return -EINVAL;

670
	write_lock(&sbi->s_cred_lock);
M
Marcin Slusarz 已提交
671 672 673 674
	sbi->s_flags = uopt.flags;
	sbi->s_uid   = uopt.uid;
	sbi->s_gid   = uopt.gid;
	sbi->s_umask = uopt.umask;
675 676
	sbi->s_fmode = uopt.fmode;
	sbi->s_dmode = uopt.dmode;
677
	write_unlock(&sbi->s_cred_lock);
L
Linus Torvalds 已提交
678

679 680 681
	if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
		goto out_unlock;

J
Jan Kara 已提交
682
	if (*flags & MS_RDONLY)
L
Linus Torvalds 已提交
683
		udf_close_lvid(sb);
J
Jan Kara 已提交
684
	else
L
Linus Torvalds 已提交
685 686
		udf_open_lvid(sb);

687 688
out_unlock:
	return error;
L
Linus Torvalds 已提交
689 690
}

J
Jan Kara 已提交
691 692 693
/* Check Volume Structure Descriptors (ECMA 167 2/9.1) */
/* We also check any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */
static loff_t udf_check_vsd(struct super_block *sb)
L
Linus Torvalds 已提交
694 695
{
	struct volStructDesc *vsd = NULL;
696
	loff_t sector = VSD_FIRST_SECTOR_OFFSET;
L
Linus Torvalds 已提交
697 698
	int sectorsize;
	struct buffer_head *bh = NULL;
699 700
	int nsr02 = 0;
	int nsr03 = 0;
M
Marcin Slusarz 已提交
701
	struct udf_sb_info *sbi;
L
Linus Torvalds 已提交
702

M
Marcin Slusarz 已提交
703
	sbi = UDF_SB(sb);
L
Linus Torvalds 已提交
704 705 706 707 708
	if (sb->s_blocksize < sizeof(struct volStructDesc))
		sectorsize = sizeof(struct volStructDesc);
	else
		sectorsize = sb->s_blocksize;

M
Marcin Slusarz 已提交
709
	sector += (sbi->s_session << sb->s_blocksize_bits);
L
Linus Torvalds 已提交
710 711

	udf_debug("Starting at sector %u (%ld byte sectors)\n",
712 713
		  (unsigned int)(sector >> sb->s_blocksize_bits),
		  sb->s_blocksize);
714 715 716 717 718 719 720 721 722 723 724 725
	/* Process the sequence (if applicable). The hard limit on the sector
	 * offset is arbitrary, hopefully large enough so that all valid UDF
	 * filesystems will be recognised. There is no mention of an upper
	 * bound to the size of the volume recognition area in the standard.
	 *  The limit will prevent the code to read all the sectors of a
	 * specially crafted image (like a bluray disc full of CD001 sectors),
	 * potentially causing minutes or even hours of uninterruptible I/O
	 * activity. This actually happened with uninitialised SSD partitions
	 * (all 0xFF) before the check for the limit and all valid IDs were
	 * added */
	for (; !nsr02 && !nsr03 && sector < VSD_MAX_SECTOR_OFFSET;
	     sector += sectorsize) {
L
Linus Torvalds 已提交
726 727 728 729 730 731 732
		/* Read a block */
		bh = udf_tread(sb, sector >> sb->s_blocksize_bits);
		if (!bh)
			break;

		/* Look for ISO  descriptors */
		vsd = (struct volStructDesc *)(bh->b_data +
733
					      (sector & (sb->s_blocksize - 1)));
L
Linus Torvalds 已提交
734

735
		if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001,
736
				    VSD_STD_ID_LEN)) {
737 738 739 740 741
			switch (vsd->structType) {
			case 0:
				udf_debug("ISO9660 Boot Record found\n");
				break;
			case 1:
J
Joe Perches 已提交
742
				udf_debug("ISO9660 Primary Volume Descriptor found\n");
743 744
				break;
			case 2:
J
Joe Perches 已提交
745
				udf_debug("ISO9660 Supplementary Volume Descriptor found\n");
746 747
				break;
			case 3:
J
Joe Perches 已提交
748
				udf_debug("ISO9660 Volume Partition Descriptor found\n");
749 750
				break;
			case 255:
J
Joe Perches 已提交
751
				udf_debug("ISO9660 Volume Descriptor Set Terminator found\n");
752 753 754 755 756
				break;
			default:
				udf_debug("ISO9660 VRS (%u) found\n",
					  vsd->structType);
				break;
L
Linus Torvalds 已提交
757
			}
758 759 760 761 762
		} else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BEA01,
				    VSD_STD_ID_LEN))
			; /* nothing */
		else if (!strncmp(vsd->stdIdent, VSD_STD_ID_TEA01,
				    VSD_STD_ID_LEN)) {
J
Jan Kara 已提交
763
			brelse(bh);
L
Linus Torvalds 已提交
764
			break;
765 766
		} else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR02,
				    VSD_STD_ID_LEN))
L
Linus Torvalds 已提交
767
			nsr02 = sector;
768 769
		else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR03,
				    VSD_STD_ID_LEN))
L
Linus Torvalds 已提交
770
			nsr03 = sector;
771 772 773 774 775 776 777 778 779 780 781
		else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BOOT2,
				    VSD_STD_ID_LEN))
			; /* nothing */
		else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CDW02,
				    VSD_STD_ID_LEN))
			; /* nothing */
		else {
			/* invalid id : end of volume recognition area */
			brelse(bh);
			break;
		}
J
Jan Kara 已提交
782
		brelse(bh);
L
Linus Torvalds 已提交
783 784 785 786 787 788
	}

	if (nsr03)
		return nsr03;
	else if (nsr02)
		return nsr02;
789 790
	else if (!bh && sector - (sbi->s_session << sb->s_blocksize_bits) ==
			VSD_FIRST_SECTOR_OFFSET)
L
Linus Torvalds 已提交
791 792 793 794 795
		return -1;
	else
		return 0;
}

796
static int udf_find_fileset(struct super_block *sb,
797 798
			    struct kernel_lb_addr *fileset,
			    struct kernel_lb_addr *root)
L
Linus Torvalds 已提交
799 800 801 802
{
	struct buffer_head *bh = NULL;
	long lastblock;
	uint16_t ident;
M
Marcin Slusarz 已提交
803
	struct udf_sb_info *sbi;
L
Linus Torvalds 已提交
804 805

	if (fileset->logicalBlockNum != 0xFFFFFFFF ||
806
	    fileset->partitionReferenceNum != 0xFFFF) {
807
		bh = udf_read_ptagged(sb, fileset, 0, &ident);
L
Linus Torvalds 已提交
808

809
		if (!bh) {
L
Linus Torvalds 已提交
810
			return 1;
811
		} else if (ident != TAG_IDENT_FSD) {
J
Jan Kara 已提交
812
			brelse(bh);
L
Linus Torvalds 已提交
813 814
			return 1;
		}
815

L
Linus Torvalds 已提交
816 817
	}

M
Marcin Slusarz 已提交
818
	sbi = UDF_SB(sb);
819 820
	if (!bh) {
		/* Search backwards through the partitions */
821
		struct kernel_lb_addr newfileset;
L
Linus Torvalds 已提交
822

823
/* --> cvg: FIXME - is it reasonable? */
L
Linus Torvalds 已提交
824
		return 1;
825

M
Marcin Slusarz 已提交
826
		for (newfileset.partitionReferenceNum = sbi->s_partitions - 1;
827 828 829 830
		     (newfileset.partitionReferenceNum != 0xFFFF &&
		      fileset->logicalBlockNum == 0xFFFFFFFF &&
		      fileset->partitionReferenceNum == 0xFFFF);
		     newfileset.partitionReferenceNum--) {
M
Marcin Slusarz 已提交
831 832 833
			lastblock = sbi->s_partmaps
					[newfileset.partitionReferenceNum]
						.s_partition_len;
L
Linus Torvalds 已提交
834 835
			newfileset.logicalBlockNum = 0;

836
			do {
837
				bh = udf_read_ptagged(sb, &newfileset, 0,
838
						      &ident);
839 840
				if (!bh) {
					newfileset.logicalBlockNum++;
L
Linus Torvalds 已提交
841 842 843
					continue;
				}

844 845
				switch (ident) {
				case TAG_IDENT_SBD:
846 847
				{
					struct spaceBitmapDesc *sp;
M
Marcin Slusarz 已提交
848 849
					sp = (struct spaceBitmapDesc *)
								bh->b_data;
850 851
					newfileset.logicalBlockNum += 1 +
						((le32_to_cpu(sp->numOfBytes) +
M
Marcin Slusarz 已提交
852 853
						  sizeof(struct spaceBitmapDesc)
						  - 1) >> sb->s_blocksize_bits);
854 855 856
					brelse(bh);
					break;
				}
857
				case TAG_IDENT_FSD:
858 859
					*fileset = newfileset;
					break;
860
				default:
861 862 863 864
					newfileset.logicalBlockNum++;
					brelse(bh);
					bh = NULL;
					break;
L
Linus Torvalds 已提交
865
				}
866 867 868
			} while (newfileset.logicalBlockNum < lastblock &&
				 fileset->logicalBlockNum == 0xFFFFFFFF &&
				 fileset->partitionReferenceNum == 0xFFFF);
L
Linus Torvalds 已提交
869 870 871 872
		}
	}

	if ((fileset->logicalBlockNum != 0xFFFFFFFF ||
873
	     fileset->partitionReferenceNum != 0xFFFF) && bh) {
L
Linus Torvalds 已提交
874
		udf_debug("Fileset at block=%d, partition=%d\n",
875 876
			  fileset->logicalBlockNum,
			  fileset->partitionReferenceNum);
L
Linus Torvalds 已提交
877

M
Marcin Slusarz 已提交
878
		sbi->s_partition = fileset->partitionReferenceNum;
L
Linus Torvalds 已提交
879
		udf_load_fileset(sb, bh, root);
J
Jan Kara 已提交
880
		brelse(bh);
L
Linus Torvalds 已提交
881 882 883 884 885
		return 0;
	}
	return 1;
}

886 887 888 889 890 891
/*
 * Load primary Volume Descriptor Sequence
 *
 * Return <0 on error, 0 on success. -EAGAIN is special meaning next sequence
 * should be tried.
 */
892
static int udf_load_pvoldesc(struct super_block *sb, sector_t block)
L
Linus Torvalds 已提交
893 894
{
	struct primaryVolDesc *pvoldesc;
895
	struct ustr *instr, *outstr;
896 897
	struct buffer_head *bh;
	uint16_t ident;
898
	int ret = -ENOMEM;
899 900 901

	instr = kmalloc(sizeof(struct ustr), GFP_NOFS);
	if (!instr)
902
		return -ENOMEM;
903 904 905 906

	outstr = kmalloc(sizeof(struct ustr), GFP_NOFS);
	if (!outstr)
		goto out1;
907 908

	bh = udf_read_tagged(sb, block, block, &ident);
909 910
	if (!bh) {
		ret = -EAGAIN;
911
		goto out2;
912
	}
913

914 915 916 917
	if (ident != TAG_IDENT_PVD) {
		ret = -EIO;
		goto out_bh;
	}
L
Linus Torvalds 已提交
918 919 920

	pvoldesc = (struct primaryVolDesc *)bh->b_data;

921 922
	if (udf_disk_stamp_to_time(&UDF_SB(sb)->s_record_time,
			      pvoldesc->recordingDateAndTime)) {
923
#ifdef UDFFS_DEBUG
924
		struct timestamp *ts = &pvoldesc->recordingDateAndTime;
J
Joe Perches 已提交
925
		udf_debug("recording time %04u/%02u/%02u %02u:%02u (%x)\n",
926 927 928
			  le16_to_cpu(ts->year), ts->month, ts->day, ts->hour,
			  ts->minute, le16_to_cpu(ts->typeAndTimezone));
#endif
L
Linus Torvalds 已提交
929 930
	}

931 932 933 934
	if (!udf_build_ustr(instr, pvoldesc->volIdent, 32))
		if (udf_CS0toUTF8(outstr, instr)) {
			strncpy(UDF_SB(sb)->s_volume_ident, outstr->u_name,
				outstr->u_len > 31 ? 31 : outstr->u_len);
M
Marcin Slusarz 已提交
935
			udf_debug("volIdent[] = '%s'\n",
J
Joe Perches 已提交
936
				  UDF_SB(sb)->s_volume_ident);
L
Linus Torvalds 已提交
937 938
		}

939 940 941
	if (!udf_build_ustr(instr, pvoldesc->volSetIdent, 128))
		if (udf_CS0toUTF8(outstr, instr))
			udf_debug("volSetIdent[] = '%s'\n", outstr->u_name);
942

943
	ret = 0;
944 945
out_bh:
	brelse(bh);
946 947 948 949 950
out2:
	kfree(outstr);
out1:
	kfree(instr);
	return ret;
L
Linus Torvalds 已提交
951 952
}

953 954 955 956 957 958 959 960 961
struct inode *udf_find_metadata_inode_efe(struct super_block *sb,
					u32 meta_file_loc, u32 partition_num)
{
	struct kernel_lb_addr addr;
	struct inode *metadata_fe;

	addr.logicalBlockNum = meta_file_loc;
	addr.partitionReferenceNum = partition_num;

J
Jan Kara 已提交
962
	metadata_fe = udf_iget_special(sb, &addr);
963

964
	if (IS_ERR(metadata_fe)) {
965
		udf_warn(sb, "metadata inode efe not found\n");
966 967 968
		return metadata_fe;
	}
	if (UDF_I(metadata_fe)->i_alloc_type != ICBTAG_FLAG_AD_SHORT) {
969 970
		udf_warn(sb, "metadata inode efe does not have short allocation descriptors!\n");
		iput(metadata_fe);
971
		return ERR_PTR(-EIO);
972 973 974 975 976
	}

	return metadata_fe;
}

977 978 979 980 981
static int udf_load_metadata_files(struct super_block *sb, int partition)
{
	struct udf_sb_info *sbi = UDF_SB(sb);
	struct udf_part_map *map;
	struct udf_meta_data *mdata;
982
	struct kernel_lb_addr addr;
983
	struct inode *fe;
984 985 986 987 988 989

	map = &sbi->s_partmaps[partition];
	mdata = &map->s_type_specific.s_metadata;

	/* metadata address */
	udf_debug("Metadata file location: block = %d part = %d\n",
990
		  mdata->s_meta_file_loc, map->s_partition_num);
991

992 993 994
	fe = udf_find_metadata_inode_efe(sb, mdata->s_meta_file_loc,
					 map->s_partition_num);
	if (IS_ERR(fe)) {
995 996 997
		/* mirror file entry */
		udf_debug("Mirror metadata file location: block = %d part = %d\n",
			  mdata->s_mirror_file_loc, map->s_partition_num);
998

999 1000
		fe = udf_find_metadata_inode_efe(sb, mdata->s_mirror_file_loc,
						 map->s_partition_num);
1001

1002
		if (IS_ERR(fe)) {
1003
			udf_err(sb, "Both metadata and mirror metadata inode efe can not found\n");
1004
			return PTR_ERR(fe);
1005
		}
1006 1007 1008 1009
		mdata->s_mirror_fe = fe;
	} else
		mdata->s_metadata_fe = fe;

1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020

	/*
	 * bitmap file entry
	 * Note:
	 * Load only if bitmap file location differs from 0xFFFFFFFF (DCN-5102)
	*/
	if (mdata->s_bitmap_file_loc != 0xFFFFFFFF) {
		addr.logicalBlockNum = mdata->s_bitmap_file_loc;
		addr.partitionReferenceNum = map->s_partition_num;

		udf_debug("Bitmap file location: block = %d part = %d\n",
J
Joe Perches 已提交
1021
			  addr.logicalBlockNum, addr.partitionReferenceNum);
1022

J
Jan Kara 已提交
1023
		fe = udf_iget_special(sb, &addr);
1024
		if (IS_ERR(fe)) {
1025
			if (sb->s_flags & MS_RDONLY)
J
Joe Perches 已提交
1026
				udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n");
1027
			else {
J
Joe Perches 已提交
1028
				udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n");
1029
				return PTR_ERR(fe);
1030
			}
1031 1032
		} else
			mdata->s_bitmap_fe = fe;
1033 1034 1035 1036 1037 1038
	}

	udf_debug("udf_load_metadata_files Ok\n");
	return 0;
}

1039
static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh,
1040
			     struct kernel_lb_addr *root)
L
Linus Torvalds 已提交
1041 1042 1043 1044 1045 1046 1047
{
	struct fileSetDesc *fset;

	fset = (struct fileSetDesc *)bh->b_data;

	*root = lelb_to_cpu(fset->rootDirectoryICB.extLocation);

M
Marcin Slusarz 已提交
1048
	UDF_SB(sb)->s_serial_number = le16_to_cpu(fset->descTag.tagSerialNum);
L
Linus Torvalds 已提交
1049

1050 1051
	udf_debug("Rootdir at block=%d, partition=%d\n",
		  root->logicalBlockNum, root->partitionReferenceNum);
L
Linus Torvalds 已提交
1052 1053
}

1054 1055 1056
int udf_compute_nr_groups(struct super_block *sb, u32 partition)
{
	struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
J
Julia Lawall 已提交
1057 1058 1059
	return DIV_ROUND_UP(map->s_partition_len +
			    (sizeof(struct spaceBitmapDesc) << 3),
			    sb->s_blocksize * 8);
1060 1061
}

1062 1063 1064 1065 1066 1067
static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index)
{
	struct udf_bitmap *bitmap;
	int nr_groups;
	int size;

1068
	nr_groups = udf_compute_nr_groups(sb, index);
1069 1070 1071 1072
	size = sizeof(struct udf_bitmap) +
		(sizeof(struct buffer_head *) * nr_groups);

	if (size <= PAGE_SIZE)
J
Joe Perches 已提交
1073
		bitmap = kzalloc(size, GFP_KERNEL);
1074
	else
J
Joe Perches 已提交
1075
		bitmap = vzalloc(size); /* TODO: get rid of vzalloc */
1076

1077
	if (bitmap == NULL)
1078 1079 1080 1081 1082 1083
		return NULL;

	bitmap->s_nr_groups = nr_groups;
	return bitmap;
}

1084 1085
static int udf_fill_partdesc_info(struct super_block *sb,
		struct partitionDesc *p, int p_index)
L
Linus Torvalds 已提交
1086
{
M
Marcin Slusarz 已提交
1087
	struct udf_part_map *map;
M
Marcin Slusarz 已提交
1088
	struct udf_sb_info *sbi = UDF_SB(sb);
1089
	struct partitionHeaderDesc *phd;
M
Marcin Slusarz 已提交
1090

1091
	map = &sbi->s_partmaps[p_index];
M
Marcin Slusarz 已提交
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104

	map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */
	map->s_partition_root = le32_to_cpu(p->partitionStartingLocation);

	if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY))
		map->s_partition_flags |= UDF_PART_FLAG_READ_ONLY;
	if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_WRITE_ONCE))
		map->s_partition_flags |= UDF_PART_FLAG_WRITE_ONCE;
	if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_REWRITABLE))
		map->s_partition_flags |= UDF_PART_FLAG_REWRITABLE;
	if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_OVERWRITABLE))
		map->s_partition_flags |= UDF_PART_FLAG_OVERWRITABLE;

J
Joe Perches 已提交
1105 1106 1107
	udf_debug("Partition (%d type %x) starts at physical %d, block length %d\n",
		  p_index, map->s_partition_type,
		  map->s_partition_root, map->s_partition_len);
M
Marcin Slusarz 已提交
1108 1109 1110

	if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) &&
	    strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03))
1111
		return 0;
M
Marcin Slusarz 已提交
1112 1113 1114

	phd = (struct partitionHeaderDesc *)p->partitionContentsUse;
	if (phd->unallocSpaceTable.extLength) {
1115
		struct kernel_lb_addr loc = {
M
Marcin Slusarz 已提交
1116 1117
			.logicalBlockNum = le32_to_cpu(
				phd->unallocSpaceTable.extPosition),
1118
			.partitionReferenceNum = p_index,
M
Marcin Slusarz 已提交
1119
		};
1120
		struct inode *inode;
M
Marcin Slusarz 已提交
1121

J
Jan Kara 已提交
1122
		inode = udf_iget_special(sb, &loc);
1123
		if (IS_ERR(inode)) {
M
Marcin Slusarz 已提交
1124
			udf_debug("cannot load unallocSpaceTable (part %d)\n",
J
Joe Perches 已提交
1125
				  p_index);
1126
			return PTR_ERR(inode);
M
Marcin Slusarz 已提交
1127
		}
1128
		map->s_uspace.s_table = inode;
M
Marcin Slusarz 已提交
1129 1130
		map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE;
		udf_debug("unallocSpaceTable (part %d) @ %ld\n",
J
Joe Perches 已提交
1131
			  p_index, map->s_uspace.s_table->i_ino);
M
Marcin Slusarz 已提交
1132 1133 1134
	}

	if (phd->unallocSpaceBitmap.extLength) {
1135 1136
		struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
		if (!bitmap)
1137
			return -ENOMEM;
M
Marcin Slusarz 已提交
1138
		map->s_uspace.s_bitmap = bitmap;
J
Jan Kara 已提交
1139
		bitmap->s_extPosition = le32_to_cpu(
M
Marcin Slusarz 已提交
1140
				phd->unallocSpaceBitmap.extPosition);
J
Jan Kara 已提交
1141
		map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP;
J
Joe Perches 已提交
1142 1143
		udf_debug("unallocSpaceBitmap (part %d) @ %d\n",
			  p_index, bitmap->s_extPosition);
M
Marcin Slusarz 已提交
1144 1145 1146
	}

	if (phd->partitionIntegrityTable.extLength)
1147
		udf_debug("partitionIntegrityTable (part %d)\n", p_index);
M
Marcin Slusarz 已提交
1148 1149

	if (phd->freedSpaceTable.extLength) {
1150
		struct kernel_lb_addr loc = {
M
Marcin Slusarz 已提交
1151 1152
			.logicalBlockNum = le32_to_cpu(
				phd->freedSpaceTable.extPosition),
1153
			.partitionReferenceNum = p_index,
M
Marcin Slusarz 已提交
1154
		};
1155
		struct inode *inode;
M
Marcin Slusarz 已提交
1156

J
Jan Kara 已提交
1157
		inode = udf_iget_special(sb, &loc);
1158
		if (IS_ERR(inode)) {
1159
			udf_debug("cannot load freedSpaceTable (part %d)\n",
J
Joe Perches 已提交
1160
				  p_index);
1161
			return PTR_ERR(inode);
M
Marcin Slusarz 已提交
1162
		}
1163
		map->s_fspace.s_table = inode;
M
Marcin Slusarz 已提交
1164 1165
		map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE;
		udf_debug("freedSpaceTable (part %d) @ %ld\n",
J
Joe Perches 已提交
1166
			  p_index, map->s_fspace.s_table->i_ino);
M
Marcin Slusarz 已提交
1167 1168 1169
	}

	if (phd->freedSpaceBitmap.extLength) {
1170 1171
		struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
		if (!bitmap)
1172
			return -ENOMEM;
M
Marcin Slusarz 已提交
1173
		map->s_fspace.s_bitmap = bitmap;
J
Jan Kara 已提交
1174
		bitmap->s_extPosition = le32_to_cpu(
M
Marcin Slusarz 已提交
1175
				phd->freedSpaceBitmap.extPosition);
J
Jan Kara 已提交
1176
		map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP;
J
Joe Perches 已提交
1177 1178
		udf_debug("freedSpaceBitmap (part %d) @ %d\n",
			  p_index, bitmap->s_extPosition);
M
Marcin Slusarz 已提交
1179
	}
1180 1181 1182
	return 0;
}

1183 1184
static void udf_find_vat_block(struct super_block *sb, int p_index,
			       int type1_index, sector_t start_block)
1185 1186 1187
{
	struct udf_sb_info *sbi = UDF_SB(sb);
	struct udf_part_map *map = &sbi->s_partmaps[p_index];
1188
	sector_t vat_block;
1189
	struct kernel_lb_addr ino;
1190
	struct inode *inode;
1191 1192 1193 1194 1195 1196 1197 1198

	/*
	 * VAT file entry is in the last recorded block. Some broken disks have
	 * it a few blocks before so try a bit harder...
	 */
	ino.partitionReferenceNum = type1_index;
	for (vat_block = start_block;
	     vat_block >= map->s_partition_root &&
1199
	     vat_block >= start_block - 3; vat_block--) {
1200
		ino.logicalBlockNum = vat_block - map->s_partition_root;
J
Jan Kara 已提交
1201
		inode = udf_iget_special(sb, &ino);
1202 1203 1204 1205
		if (!IS_ERR(inode)) {
			sbi->s_vat_inode = inode;
			break;
		}
1206 1207 1208 1209 1210 1211 1212
	}
}

static int udf_load_vat(struct super_block *sb, int p_index, int type1_index)
{
	struct udf_sb_info *sbi = UDF_SB(sb);
	struct udf_part_map *map = &sbi->s_partmaps[p_index];
1213 1214 1215 1216
	struct buffer_head *bh = NULL;
	struct udf_inode_info *vati;
	uint32_t pos;
	struct virtualAllocationTable20 *vat20;
1217
	sector_t blocks = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits;
1218

1219
	udf_find_vat_block(sb, p_index, type1_index, sbi->s_last_block);
1220 1221
	if (!sbi->s_vat_inode &&
	    sbi->s_last_block != blocks - 1) {
J
Joe Perches 已提交
1222 1223 1224
		pr_notice("Failed to read VAT inode from the last recorded block (%lu), retrying with the last block of the device (%lu).\n",
			  (unsigned long)sbi->s_last_block,
			  (unsigned long)blocks - 1);
1225
		udf_find_vat_block(sb, p_index, type1_index, blocks - 1);
1226
	}
1227
	if (!sbi->s_vat_inode)
1228
		return -EIO;
1229 1230

	if (map->s_partition_type == UDF_VIRTUAL_MAP15) {
1231
		map->s_type_specific.s_virtual.s_start_offset = 0;
1232 1233 1234
		map->s_type_specific.s_virtual.s_num_entries =
			(sbi->s_vat_inode->i_size - 36) >> 2;
	} else if (map->s_partition_type == UDF_VIRTUAL_MAP20) {
1235 1236 1237 1238 1239
		vati = UDF_I(sbi->s_vat_inode);
		if (vati->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
			pos = udf_block_map(sbi->s_vat_inode, 0);
			bh = sb_bread(sb, pos);
			if (!bh)
1240
				return -EIO;
1241 1242 1243 1244 1245
			vat20 = (struct virtualAllocationTable20 *)bh->b_data;
		} else {
			vat20 = (struct virtualAllocationTable20 *)
							vati->i_ext.i_data;
		}
1246 1247

		map->s_type_specific.s_virtual.s_start_offset =
1248
			le16_to_cpu(vat20->lengthHeader);
1249 1250 1251 1252 1253 1254 1255 1256 1257
		map->s_type_specific.s_virtual.s_num_entries =
			(sbi->s_vat_inode->i_size -
				map->s_type_specific.s_virtual.
					s_start_offset) >> 2;
		brelse(bh);
	}
	return 0;
}

1258 1259 1260 1261 1262 1263
/*
 * Load partition descriptor block
 *
 * Returns <0 on error, 0 on success, -EAGAIN is special - try next descriptor
 * sequence.
 */
1264 1265 1266 1267 1268 1269
static int udf_load_partdesc(struct super_block *sb, sector_t block)
{
	struct buffer_head *bh;
	struct partitionDesc *p;
	struct udf_part_map *map;
	struct udf_sb_info *sbi = UDF_SB(sb);
1270
	int i, type1_idx;
1271 1272
	uint16_t partitionNumber;
	uint16_t ident;
1273
	int ret;
1274 1275 1276

	bh = udf_read_tagged(sb, block, block, &ident);
	if (!bh)
1277 1278 1279
		return -EAGAIN;
	if (ident != TAG_IDENT_PD) {
		ret = 0;
1280
		goto out_bh;
1281
	}
1282 1283 1284

	p = (struct partitionDesc *)bh->b_data;
	partitionNumber = le16_to_cpu(p->partitionNumber);
1285

1286
	/* First scan for TYPE1, SPARABLE and METADATA partitions */
1287 1288 1289 1290
	for (i = 0; i < sbi->s_partitions; i++) {
		map = &sbi->s_partmaps[i];
		udf_debug("Searching map: (%d == %d)\n",
			  map->s_partition_num, partitionNumber);
1291 1292 1293
		if (map->s_partition_num == partitionNumber &&
		    (map->s_partition_type == UDF_TYPE1_MAP15 ||
		     map->s_partition_type == UDF_SPARABLE_MAP15))
1294 1295 1296
			break;
	}

1297
	if (i >= sbi->s_partitions) {
1298 1299
		udf_debug("Partition (%d) not found in partition map\n",
			  partitionNumber);
1300
		ret = 0;
1301 1302
		goto out_bh;
	}
M
Marcin Slusarz 已提交
1303

1304
	ret = udf_fill_partdesc_info(sb, p, i);
1305 1306
	if (ret < 0)
		goto out_bh;
1307 1308

	/*
1309 1310
	 * Now rescan for VIRTUAL or METADATA partitions when SPARABLE and
	 * PHYSICAL partitions are already set up
1311 1312
	 */
	type1_idx = i;
1313 1314 1315
#ifdef UDFFS_DEBUG
	map = NULL; /* supress 'maybe used uninitialized' warning */
#endif
1316 1317 1318 1319 1320
	for (i = 0; i < sbi->s_partitions; i++) {
		map = &sbi->s_partmaps[i];

		if (map->s_partition_num == partitionNumber &&
		    (map->s_partition_type == UDF_VIRTUAL_MAP15 ||
1321 1322
		     map->s_partition_type == UDF_VIRTUAL_MAP20 ||
		     map->s_partition_type == UDF_METADATA_MAP25))
1323 1324 1325
			break;
	}

1326 1327
	if (i >= sbi->s_partitions) {
		ret = 0;
1328
		goto out_bh;
1329
	}
1330 1331

	ret = udf_fill_partdesc_info(sb, p, i);
1332
	if (ret < 0)
1333 1334
		goto out_bh;

1335 1336
	if (map->s_partition_type == UDF_METADATA_MAP25) {
		ret = udf_load_metadata_files(sb, i);
1337
		if (ret < 0) {
J
Joe Perches 已提交
1338 1339
			udf_err(sb, "error loading MetaData partition map %d\n",
				i);
1340 1341 1342
			goto out_bh;
		}
	} else {
1343 1344 1345 1346 1347 1348 1349 1350 1351
		/*
		 * If we have a partition with virtual map, we don't handle
		 * writing to it (we overwrite blocks instead of relocating
		 * them).
		 */
		if (!(sb->s_flags & MS_RDONLY)) {
			ret = -EACCES;
			goto out_bh;
		}
1352
		ret = udf_load_vat(sb, i, type1_idx);
1353
		if (ret < 0)
1354 1355
			goto out_bh;
	}
1356
	ret = 0;
1357
out_bh:
J
Jan Kara 已提交
1358
	/* In case loading failed, we handle cleanup in udf_fill_super */
1359 1360
	brelse(bh);
	return ret;
L
Linus Torvalds 已提交
1361 1362
}

J
Jan Kara 已提交
1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410
static int udf_load_sparable_map(struct super_block *sb,
				 struct udf_part_map *map,
				 struct sparablePartitionMap *spm)
{
	uint32_t loc;
	uint16_t ident;
	struct sparingTable *st;
	struct udf_sparing_data *sdata = &map->s_type_specific.s_sparing;
	int i;
	struct buffer_head *bh;

	map->s_partition_type = UDF_SPARABLE_MAP15;
	sdata->s_packet_len = le16_to_cpu(spm->packetLength);
	if (!is_power_of_2(sdata->s_packet_len)) {
		udf_err(sb, "error loading logical volume descriptor: "
			"Invalid packet length %u\n",
			(unsigned)sdata->s_packet_len);
		return -EIO;
	}
	if (spm->numSparingTables > 4) {
		udf_err(sb, "error loading logical volume descriptor: "
			"Too many sparing tables (%d)\n",
			(int)spm->numSparingTables);
		return -EIO;
	}

	for (i = 0; i < spm->numSparingTables; i++) {
		loc = le32_to_cpu(spm->locSparingTable[i]);
		bh = udf_read_tagged(sb, loc, loc, &ident);
		if (!bh)
			continue;

		st = (struct sparingTable *)bh->b_data;
		if (ident != 0 ||
		    strncmp(st->sparingIdent.ident, UDF_ID_SPARING,
			    strlen(UDF_ID_SPARING)) ||
		    sizeof(*st) + le16_to_cpu(st->reallocationTableLen) >
							sb->s_blocksize) {
			brelse(bh);
			continue;
		}

		sdata->s_spar_map[i] = bh;
	}
	map->s_partition_func = udf_get_pblock_spar15;
	return 0;
}

1411
static int udf_load_logicalvol(struct super_block *sb, sector_t block,
1412
			       struct kernel_lb_addr *fileset)
L
Linus Torvalds 已提交
1413 1414
{
	struct logicalVolDesc *lvd;
J
Jan Kara 已提交
1415
	int i, offset;
L
Linus Torvalds 已提交
1416
	uint8_t type;
M
Marcin Slusarz 已提交
1417
	struct udf_sb_info *sbi = UDF_SB(sb);
M
Marcin Slusarz 已提交
1418
	struct genericPartitionMap *gpm;
1419 1420
	uint16_t ident;
	struct buffer_head *bh;
1421
	unsigned int table_len;
1422
	int ret;
L
Linus Torvalds 已提交
1423

1424 1425
	bh = udf_read_tagged(sb, block, block, &ident);
	if (!bh)
1426
		return -EAGAIN;
1427
	BUG_ON(ident != TAG_IDENT_LVD);
L
Linus Torvalds 已提交
1428
	lvd = (struct logicalVolDesc *)bh->b_data;
1429
	table_len = le32_to_cpu(lvd->mapTableLength);
1430
	if (table_len > sb->s_blocksize - sizeof(*lvd)) {
1431 1432 1433
		udf_err(sb, "error loading logical volume descriptor: "
			"Partition table too long (%u > %lu)\n", table_len,
			sb->s_blocksize - sizeof(*lvd));
1434
		ret = -EIO;
1435 1436
		goto out_bh;
	}
L
Linus Torvalds 已提交
1437

1438 1439
	ret = udf_sb_alloc_partition_maps(sb, le32_to_cpu(lvd->numPartitionMaps));
	if (ret)
1440
		goto out_bh;
L
Linus Torvalds 已提交
1441

1442
	for (i = 0, offset = 0;
1443
	     i < sbi->s_partitions && offset < table_len;
M
Marcin Slusarz 已提交
1444 1445 1446 1447 1448
	     i++, offset += gpm->partitionMapLength) {
		struct udf_part_map *map = &sbi->s_partmaps[i];
		gpm = (struct genericPartitionMap *)
				&(lvd->partitionMaps[offset]);
		type = gpm->partitionMapType;
1449
		if (type == 1) {
M
Marcin Slusarz 已提交
1450 1451
			struct genericPartitionMap1 *gpm1 =
				(struct genericPartitionMap1 *)gpm;
M
Marcin Slusarz 已提交
1452 1453 1454 1455
			map->s_partition_type = UDF_TYPE1_MAP15;
			map->s_volumeseqnum = le16_to_cpu(gpm1->volSeqNum);
			map->s_partition_num = le16_to_cpu(gpm1->partitionNum);
			map->s_partition_func = NULL;
1456
		} else if (type == 2) {
M
Marcin Slusarz 已提交
1457 1458 1459 1460 1461 1462 1463
			struct udfPartitionMap2 *upm2 =
						(struct udfPartitionMap2 *)gpm;
			if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL,
						strlen(UDF_ID_VIRTUAL))) {
				u16 suf =
					le16_to_cpu(((__le16 *)upm2->partIdent.
							identSuffix)[0]);
J
Jan Kara 已提交
1464
				if (suf < 0x0200) {
M
Marcin Slusarz 已提交
1465 1466 1467 1468
					map->s_partition_type =
							UDF_VIRTUAL_MAP15;
					map->s_partition_func =
							udf_get_pblock_virt15;
J
Jan Kara 已提交
1469
				} else {
M
Marcin Slusarz 已提交
1470 1471 1472 1473
					map->s_partition_type =
							UDF_VIRTUAL_MAP20;
					map->s_partition_func =
							udf_get_pblock_virt20;
L
Linus Torvalds 已提交
1474
				}
M
Marcin Slusarz 已提交
1475 1476 1477
			} else if (!strncmp(upm2->partIdent.ident,
						UDF_ID_SPARABLE,
						strlen(UDF_ID_SPARABLE))) {
1478 1479 1480
				ret = udf_load_sparable_map(sb, map,
					(struct sparablePartitionMap *)gpm);
				if (ret < 0)
J
Jan Kara 已提交
1481
					goto out_bh;
1482 1483 1484 1485 1486 1487 1488 1489
			} else if (!strncmp(upm2->partIdent.ident,
						UDF_ID_METADATA,
						strlen(UDF_ID_METADATA))) {
				struct udf_meta_data *mdata =
					&map->s_type_specific.s_metadata;
				struct metadataPartitionMap *mdm =
						(struct metadataPartitionMap *)
						&(lvd->partitionMaps[offset]);
J
Joe Perches 已提交
1490 1491
				udf_debug("Parsing Logical vol part %d type %d  id=%s\n",
					  i, type, UDF_ID_METADATA);
1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505

				map->s_partition_type = UDF_METADATA_MAP25;
				map->s_partition_func = udf_get_pblock_meta25;

				mdata->s_meta_file_loc   =
					le32_to_cpu(mdm->metadataFileLoc);
				mdata->s_mirror_file_loc =
					le32_to_cpu(mdm->metadataMirrorFileLoc);
				mdata->s_bitmap_file_loc =
					le32_to_cpu(mdm->metadataBitmapFileLoc);
				mdata->s_alloc_unit_size =
					le32_to_cpu(mdm->allocUnitSize);
				mdata->s_align_unit_size =
					le16_to_cpu(mdm->alignUnitSize);
J
Jan Kara 已提交
1506 1507
				if (mdm->flags & 0x01)
					mdata->s_flags |= MF_DUPLICATE_MD;
1508 1509

				udf_debug("Metadata Ident suffix=0x%x\n",
J
Joe Perches 已提交
1510 1511
					  le16_to_cpu(*(__le16 *)
						      mdm->partIdent.identSuffix));
1512
				udf_debug("Metadata part num=%d\n",
J
Joe Perches 已提交
1513
					  le16_to_cpu(mdm->partitionNum));
1514
				udf_debug("Metadata part alloc unit size=%d\n",
J
Joe Perches 已提交
1515
					  le32_to_cpu(mdm->allocUnitSize));
1516
				udf_debug("Metadata file loc=%d\n",
J
Joe Perches 已提交
1517
					  le32_to_cpu(mdm->metadataFileLoc));
1518
				udf_debug("Mirror file loc=%d\n",
J
Joe Perches 已提交
1519
					  le32_to_cpu(mdm->metadataMirrorFileLoc));
1520
				udf_debug("Bitmap file loc=%d\n",
J
Joe Perches 已提交
1521
					  le32_to_cpu(mdm->metadataBitmapFileLoc));
J
Jan Kara 已提交
1522 1523
				udf_debug("Flags: %d %d\n",
					  mdata->s_flags, mdm->flags);
1524
			} else {
1525 1526
				udf_debug("Unknown ident: %s\n",
					  upm2->partIdent.ident);
L
Linus Torvalds 已提交
1527 1528
				continue;
			}
M
Marcin Slusarz 已提交
1529 1530
			map->s_volumeseqnum = le16_to_cpu(upm2->volSeqNum);
			map->s_partition_num = le16_to_cpu(upm2->partitionNum);
L
Linus Torvalds 已提交
1531 1532
		}
		udf_debug("Partition (%d:%d) type %d on volume %d\n",
J
Joe Perches 已提交
1533
			  i, map->s_partition_num, type, map->s_volumeseqnum);
L
Linus Torvalds 已提交
1534 1535
	}

1536
	if (fileset) {
1537
		struct long_ad *la = (struct long_ad *)&(lvd->logicalVolContentsUse[0]);
L
Linus Torvalds 已提交
1538 1539

		*fileset = lelb_to_cpu(la->extLocation);
J
Joe Perches 已提交
1540 1541
		udf_debug("FileSet found in LogicalVolDesc at block=%d, partition=%d\n",
			  fileset->logicalBlockNum,
1542
			  fileset->partitionReferenceNum);
L
Linus Torvalds 已提交
1543 1544 1545
	}
	if (lvd->integritySeqExt.extLength)
		udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt));
1546
	ret = 0;
1547 1548 1549
out_bh:
	brelse(bh);
	return ret;
L
Linus Torvalds 已提交
1550 1551 1552 1553 1554 1555
}

/*
 * udf_load_logicalvolint
 *
 */
1556
static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_ad loc)
L
Linus Torvalds 已提交
1557 1558 1559
{
	struct buffer_head *bh = NULL;
	uint16_t ident;
M
Marcin Slusarz 已提交
1560 1561
	struct udf_sb_info *sbi = UDF_SB(sb);
	struct logicalVolIntegrityDesc *lvid;
L
Linus Torvalds 已提交
1562 1563

	while (loc.extLength > 0 &&
1564 1565 1566
	       (bh = udf_read_tagged(sb, loc.extLocation,
				     loc.extLocation, &ident)) &&
	       ident == TAG_IDENT_LVID) {
M
Marcin Slusarz 已提交
1567 1568
		sbi->s_lvid_bh = bh;
		lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
1569

M
Marcin Slusarz 已提交
1570
		if (lvid->nextIntegrityExt.extLength)
1571
			udf_load_logicalvolint(sb,
M
Marcin Slusarz 已提交
1572
				leea_to_cpu(lvid->nextIntegrityExt));
1573

M
Marcin Slusarz 已提交
1574
		if (sbi->s_lvid_bh != bh)
J
Jan Kara 已提交
1575
			brelse(bh);
L
Linus Torvalds 已提交
1576
		loc.extLength -= sb->s_blocksize;
1577
		loc.extLocation++;
L
Linus Torvalds 已提交
1578
	}
M
Marcin Slusarz 已提交
1579
	if (sbi->s_lvid_bh != bh)
J
Jan Kara 已提交
1580
		brelse(bh);
L
Linus Torvalds 已提交
1581 1582 1583
}

/*
1584 1585 1586 1587
 * Process a main/reserve volume descriptor sequence.
 *   @block		First block of first extent of the sequence.
 *   @lastblock		Lastblock of first extent of the sequence.
 *   @fileset		There we store extent containing root fileset
L
Linus Torvalds 已提交
1588
 *
1589 1590
 * Returns <0 on error, 0 on success. -EAGAIN is special - try next descriptor
 * sequence
L
Linus Torvalds 已提交
1591
 */
1592 1593 1594 1595
static noinline int udf_process_sequence(
		struct super_block *sb,
		sector_t block, sector_t lastblock,
		struct kernel_lb_addr *fileset)
L
Linus Torvalds 已提交
1596 1597 1598
{
	struct buffer_head *bh = NULL;
	struct udf_vds_record vds[VDS_POS_LENGTH];
M
Marcin Slusarz 已提交
1599
	struct udf_vds_record *curr;
L
Linus Torvalds 已提交
1600 1601
	struct generic_desc *gd;
	struct volDescPtr *vdp;
1602
	int done = 0;
L
Linus Torvalds 已提交
1603 1604 1605
	uint32_t vdsn;
	uint16_t ident;
	long next_s = 0, next_e = 0;
1606
	int ret;
L
Linus Torvalds 已提交
1607 1608 1609

	memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH);

1610 1611 1612 1613
	/*
	 * Read the main descriptor sequence and find which descriptors
	 * are in it.
	 */
1614
	for (; (!done && block <= lastblock); block++) {
L
Linus Torvalds 已提交
1615 1616

		bh = udf_read_tagged(sb, block, block, &ident);
1617
		if (!bh) {
J
Joe Perches 已提交
1618 1619 1620
			udf_err(sb,
				"Block %llu of volume descriptor sequence is corrupted or we could not read it\n",
				(unsigned long long)block);
1621
			return -EAGAIN;
1622
		}
L
Linus Torvalds 已提交
1623 1624 1625 1626

		/* Process each descriptor (ISO 13346 3/8.3-8.4) */
		gd = (struct generic_desc *)bh->b_data;
		vdsn = le32_to_cpu(gd->volDescSeqNum);
1627
		switch (ident) {
1628
		case TAG_IDENT_PVD: /* ISO 13346 3/10.1 */
M
Marcin Slusarz 已提交
1629 1630 1631 1632
			curr = &vds[VDS_POS_PRIMARY_VOL_DESC];
			if (vdsn >= curr->volDescSeqNum) {
				curr->volDescSeqNum = vdsn;
				curr->block = block;
1633 1634
			}
			break;
1635
		case TAG_IDENT_VDP: /* ISO 13346 3/10.3 */
M
Marcin Slusarz 已提交
1636 1637 1638 1639
			curr = &vds[VDS_POS_VOL_DESC_PTR];
			if (vdsn >= curr->volDescSeqNum) {
				curr->volDescSeqNum = vdsn;
				curr->block = block;
1640 1641

				vdp = (struct volDescPtr *)bh->b_data;
M
Marcin Slusarz 已提交
1642 1643 1644 1645
				next_s = le32_to_cpu(
					vdp->nextVolDescSeqExt.extLocation);
				next_e = le32_to_cpu(
					vdp->nextVolDescSeqExt.extLength);
1646 1647 1648 1649
				next_e = next_e >> sb->s_blocksize_bits;
				next_e += next_s;
			}
			break;
1650
		case TAG_IDENT_IUVD: /* ISO 13346 3/10.4 */
M
Marcin Slusarz 已提交
1651 1652 1653 1654
			curr = &vds[VDS_POS_IMP_USE_VOL_DESC];
			if (vdsn >= curr->volDescSeqNum) {
				curr->volDescSeqNum = vdsn;
				curr->block = block;
1655 1656
			}
			break;
1657
		case TAG_IDENT_PD: /* ISO 13346 3/10.5 */
M
Marcin Slusarz 已提交
1658 1659 1660
			curr = &vds[VDS_POS_PARTITION_DESC];
			if (!curr->block)
				curr->block = block;
1661
			break;
1662
		case TAG_IDENT_LVD: /* ISO 13346 3/10.6 */
M
Marcin Slusarz 已提交
1663 1664 1665 1666
			curr = &vds[VDS_POS_LOGICAL_VOL_DESC];
			if (vdsn >= curr->volDescSeqNum) {
				curr->volDescSeqNum = vdsn;
				curr->block = block;
1667 1668
			}
			break;
1669
		case TAG_IDENT_USD: /* ISO 13346 3/10.8 */
M
Marcin Slusarz 已提交
1670 1671 1672 1673
			curr = &vds[VDS_POS_UNALLOC_SPACE_DESC];
			if (vdsn >= curr->volDescSeqNum) {
				curr->volDescSeqNum = vdsn;
				curr->block = block;
1674 1675
			}
			break;
1676
		case TAG_IDENT_TD: /* ISO 13346 3/10.9 */
1677 1678 1679 1680 1681
			vds[VDS_POS_TERMINATING_DESC].block = block;
			if (next_e) {
				block = next_s;
				lastblock = next_e;
				next_s = next_e = 0;
M
Marcin Slusarz 已提交
1682
			} else
1683 1684
				done = 1;
			break;
L
Linus Torvalds 已提交
1685
		}
J
Jan Kara 已提交
1686
		brelse(bh);
L
Linus Torvalds 已提交
1687
	}
1688 1689 1690 1691 1692
	/*
	 * Now read interesting descriptors again and process them
	 * in a suitable order
	 */
	if (!vds[VDS_POS_PRIMARY_VOL_DESC].block) {
J
Joe Perches 已提交
1693
		udf_err(sb, "Primary Volume Descriptor not found!\n");
1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705
		return -EAGAIN;
	}
	ret = udf_load_pvoldesc(sb, vds[VDS_POS_PRIMARY_VOL_DESC].block);
	if (ret < 0)
		return ret;

	if (vds[VDS_POS_LOGICAL_VOL_DESC].block) {
		ret = udf_load_logicalvol(sb,
					  vds[VDS_POS_LOGICAL_VOL_DESC].block,
					  fileset);
		if (ret < 0)
			return ret;
1706
	}
M
Marcin Slusarz 已提交
1707

1708 1709 1710 1711 1712 1713 1714
	if (vds[VDS_POS_PARTITION_DESC].block) {
		/*
		 * We rescan the whole descriptor sequence to find
		 * partition descriptor blocks and process them.
		 */
		for (block = vds[VDS_POS_PARTITION_DESC].block;
		     block < vds[VDS_POS_TERMINATING_DESC].block;
1715 1716 1717 1718 1719
		     block++) {
			ret = udf_load_partdesc(sb, block);
			if (ret < 0)
				return ret;
		}
L
Linus Torvalds 已提交
1720 1721 1722 1723 1724
	}

	return 0;
}

1725 1726 1727 1728 1729
/*
 * Load Volume Descriptor Sequence described by anchor in bh
 *
 * Returns <0 on error, 0 on success
 */
J
Jan Kara 已提交
1730 1731
static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh,
			     struct kernel_lb_addr *fileset)
L
Linus Torvalds 已提交
1732
{
J
Jan Kara 已提交
1733
	struct anchorVolDescPtr *anchor;
1734 1735
	sector_t main_s, main_e, reserve_s, reserve_e;
	int ret;
L
Linus Torvalds 已提交
1736

J
Jan Kara 已提交
1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752
	anchor = (struct anchorVolDescPtr *)bh->b_data;

	/* Locate the main sequence */
	main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation);
	main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength);
	main_e = main_e >> sb->s_blocksize_bits;
	main_e += main_s;

	/* Locate the reserve sequence */
	reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation);
	reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength);
	reserve_e = reserve_e >> sb->s_blocksize_bits;
	reserve_e += reserve_s;

	/* Process the main & reserve sequences */
	/* responsible for finding the PartitionDesc(s) */
1753 1754 1755
	ret = udf_process_sequence(sb, main_s, main_e, fileset);
	if (ret != -EAGAIN)
		return ret;
J
Jan Kara 已提交
1756
	udf_sb_free_partitions(sb);
1757 1758 1759 1760 1761 1762 1763 1764
	ret = udf_process_sequence(sb, reserve_s, reserve_e, fileset);
	if (ret < 0) {
		udf_sb_free_partitions(sb);
		/* No sequence was OK, return -EIO */
		if (ret == -EAGAIN)
			ret = -EIO;
	}
	return ret;
L
Linus Torvalds 已提交
1765 1766
}

J
Jan Kara 已提交
1767 1768 1769
/*
 * Check whether there is an anchor block in the given block and
 * load Volume Descriptor Sequence if so.
1770 1771 1772
 *
 * Returns <0 on error, 0 on success, -EAGAIN is special - try next anchor
 * block
J
Jan Kara 已提交
1773 1774 1775
 */
static int udf_check_anchor_block(struct super_block *sb, sector_t block,
				  struct kernel_lb_addr *fileset)
C
Clemens Ladisch 已提交
1776
{
J
Jan Kara 已提交
1777 1778 1779
	struct buffer_head *bh;
	uint16_t ident;
	int ret;
C
Clemens Ladisch 已提交
1780

J
Jan Kara 已提交
1781 1782 1783
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) &&
	    udf_fixed_to_variable(block) >=
	    sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits)
1784
		return -EAGAIN;
J
Jan Kara 已提交
1785 1786 1787

	bh = udf_read_tagged(sb, block, block, &ident);
	if (!bh)
1788
		return -EAGAIN;
J
Jan Kara 已提交
1789 1790
	if (ident != TAG_IDENT_AVDP) {
		brelse(bh);
1791
		return -EAGAIN;
C
Clemens Ladisch 已提交
1792
	}
J
Jan Kara 已提交
1793 1794 1795
	ret = udf_load_sequence(sb, bh, fileset);
	brelse(bh);
	return ret;
C
Clemens Ladisch 已提交
1796 1797
}

1798 1799 1800 1801 1802 1803 1804 1805
/*
 * Search for an anchor volume descriptor pointer.
 *
 * Returns < 0 on error, 0 on success. -EAGAIN is special - try next set
 * of anchors.
 */
static int udf_scan_anchors(struct super_block *sb, sector_t *lastblock,
			    struct kernel_lb_addr *fileset)
L
Linus Torvalds 已提交
1806
{
J
Jan Kara 已提交
1807
	sector_t last[6];
1808
	int i;
J
Jan Kara 已提交
1809 1810
	struct udf_sb_info *sbi = UDF_SB(sb);
	int last_count = 0;
1811
	int ret;
L
Linus Torvalds 已提交
1812

J
Jan Kara 已提交
1813 1814
	/* First try user provided anchor */
	if (sbi->s_anchor) {
1815 1816 1817
		ret = udf_check_anchor_block(sb, sbi->s_anchor, fileset);
		if (ret != -EAGAIN)
			return ret;
J
Jan Kara 已提交
1818 1819 1820 1821 1822 1823 1824 1825
	}
	/*
	 * according to spec, anchor is in either:
	 *     block 256
	 *     lastblock-256
	 *     lastblock
	 *  however, if the disc isn't closed, it could be 512.
	 */
1826 1827 1828
	ret = udf_check_anchor_block(sb, sbi->s_session + 256, fileset);
	if (ret != -EAGAIN)
		return ret;
J
Jan Kara 已提交
1829 1830 1831 1832
	/*
	 * The trouble is which block is the last one. Drives often misreport
	 * this so we try various possibilities.
	 */
1833 1834 1835 1836 1837 1838 1839 1840 1841 1842
	last[last_count++] = *lastblock;
	if (*lastblock >= 1)
		last[last_count++] = *lastblock - 1;
	last[last_count++] = *lastblock + 1;
	if (*lastblock >= 2)
		last[last_count++] = *lastblock - 2;
	if (*lastblock >= 150)
		last[last_count++] = *lastblock - 150;
	if (*lastblock >= 152)
		last[last_count++] = *lastblock - 152;
L
Linus Torvalds 已提交
1843

J
Jan Kara 已提交
1844 1845 1846
	for (i = 0; i < last_count; i++) {
		if (last[i] >= sb->s_bdev->bd_inode->i_size >>
				sb->s_blocksize_bits)
1847
			continue;
1848 1849 1850 1851 1852 1853
		ret = udf_check_anchor_block(sb, last[i], fileset);
		if (ret != -EAGAIN) {
			if (!ret)
				*lastblock = last[i];
			return ret;
		}
J
Jan Kara 已提交
1854
		if (last[i] < 256)
1855
			continue;
1856 1857 1858 1859 1860 1861
		ret = udf_check_anchor_block(sb, last[i] - 256, fileset);
		if (ret != -EAGAIN) {
			if (!ret)
				*lastblock = last[i];
			return ret;
		}
J
Jan Kara 已提交
1862
	}
1863

J
Jan Kara 已提交
1864
	/* Finally try block 512 in case media is open */
1865
	return udf_check_anchor_block(sb, sbi->s_session + 512, fileset);
J
Jan Kara 已提交
1866
}
1867

J
Jan Kara 已提交
1868 1869 1870 1871 1872
/*
 * Find an anchor volume descriptor and load Volume Descriptor Sequence from
 * area specified by it. The function expects sbi->s_lastblock to be the last
 * block on the media.
 *
1873 1874
 * Return <0 on error, 0 if anchor found. -EAGAIN is special meaning anchor
 * was not found.
J
Jan Kara 已提交
1875 1876 1877 1878 1879
 */
static int udf_find_anchor(struct super_block *sb,
			   struct kernel_lb_addr *fileset)
{
	struct udf_sb_info *sbi = UDF_SB(sb);
1880 1881
	sector_t lastblock = sbi->s_last_block;
	int ret;
1882

1883 1884
	ret = udf_scan_anchors(sb, &lastblock, fileset);
	if (ret != -EAGAIN)
J
Jan Kara 已提交
1885
		goto out;
L
Linus Torvalds 已提交
1886

J
Jan Kara 已提交
1887 1888
	/* No anchor found? Try VARCONV conversion of block numbers */
	UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
1889
	lastblock = udf_variable_to_fixed(sbi->s_last_block);
J
Jan Kara 已提交
1890
	/* Firstly, we try to not convert number of the last block */
1891 1892
	ret = udf_scan_anchors(sb, &lastblock, fileset);
	if (ret != -EAGAIN)
J
Jan Kara 已提交
1893
		goto out;
L
Linus Torvalds 已提交
1894

1895
	lastblock = sbi->s_last_block;
J
Jan Kara 已提交
1896
	/* Secondly, we try with converted number of the last block */
1897 1898
	ret = udf_scan_anchors(sb, &lastblock, fileset);
	if (ret < 0) {
J
Jan Kara 已提交
1899 1900
		/* VARCONV didn't help. Clear it. */
		UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV);
L
Linus Torvalds 已提交
1901
	}
J
Jan Kara 已提交
1902
out:
1903 1904 1905
	if (ret == 0)
		sbi->s_last_block = lastblock;
	return ret;
J
Jan Kara 已提交
1906
}
L
Linus Torvalds 已提交
1907

J
Jan Kara 已提交
1908 1909
/*
 * Check Volume Structure Descriptor, find Anchor block and load Volume
1910 1911 1912 1913
 * Descriptor Sequence.
 *
 * Returns < 0 on error, 0 on success. -EAGAIN is special meaning anchor
 * block was not found.
J
Jan Kara 已提交
1914 1915 1916 1917 1918 1919
 */
static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt,
			int silent, struct kernel_lb_addr *fileset)
{
	struct udf_sb_info *sbi = UDF_SB(sb);
	loff_t nsr_off;
1920
	int ret;
J
Jan Kara 已提交
1921 1922 1923

	if (!sb_set_blocksize(sb, uopt->blocksize)) {
		if (!silent)
J
Joe Perches 已提交
1924
			udf_warn(sb, "Bad block size\n");
1925
		return -EINVAL;
J
Jan Kara 已提交
1926 1927 1928 1929 1930 1931 1932
	}
	sbi->s_last_block = uopt->lastblock;
	if (!uopt->novrs) {
		/* Check that it is NSR02 compliant */
		nsr_off = udf_check_vsd(sb);
		if (!nsr_off) {
			if (!silent)
J
Joe Perches 已提交
1933
				udf_warn(sb, "No VRS found\n");
J
Jan Kara 已提交
1934 1935 1936
			return 0;
		}
		if (nsr_off == -1)
1937 1938 1939
			udf_debug("Failed to read sector at offset %d. "
				  "Assuming open disc. Skipping validity "
				  "check\n", VSD_FIRST_SECTOR_OFFSET);
J
Jan Kara 已提交
1940 1941 1942 1943
		if (!sbi->s_last_block)
			sbi->s_last_block = udf_get_last_block(sb);
	} else {
		udf_debug("Validity check skipped because of novrs option\n");
1944
	}
L
Linus Torvalds 已提交
1945

J
Jan Kara 已提交
1946 1947
	/* Look for anchor block and load Volume Descriptor Sequence */
	sbi->s_anchor = uopt->anchor;
1948 1949 1950
	ret = udf_find_anchor(sb, fileset);
	if (ret < 0) {
		if (!silent && ret == -EAGAIN)
J
Joe Perches 已提交
1951
			udf_warn(sb, "No anchor found\n");
1952
		return ret;
J
Jan Kara 已提交
1953
	}
1954
	return 0;
L
Linus Torvalds 已提交
1955 1956 1957 1958
}

static void udf_open_lvid(struct super_block *sb)
{
M
Marcin Slusarz 已提交
1959 1960
	struct udf_sb_info *sbi = UDF_SB(sb);
	struct buffer_head *bh = sbi->s_lvid_bh;
M
Marcin Slusarz 已提交
1961 1962
	struct logicalVolIntegrityDesc *lvid;
	struct logicalVolIntegrityDescImpUse *lvidiu;
1963

M
Marcin Slusarz 已提交
1964 1965 1966
	if (!bh)
		return;
	lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
J
Jan Kara 已提交
1967 1968 1969
	lvidiu = udf_sb_lvidiu(sb);
	if (!lvidiu)
		return;
M
Marcin Slusarz 已提交
1970

J
Jan Kara 已提交
1971
	mutex_lock(&sbi->s_alloc_mutex);
M
Marcin Slusarz 已提交
1972 1973 1974 1975
	lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
	lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
	udf_time_to_disk_stamp(&lvid->recordingDateAndTime,
				CURRENT_TIME);
1976
	lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN);
M
Marcin Slusarz 已提交
1977 1978

	lvid->descTag.descCRC = cpu_to_le16(
1979
		crc_itu_t(0, (char *)lvid + sizeof(struct tag),
1980
			le16_to_cpu(lvid->descTag.descCRCLength)));
M
Marcin Slusarz 已提交
1981 1982 1983

	lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
	mark_buffer_dirty(bh);
1984
	sbi->s_lvid_dirty = 0;
1985
	mutex_unlock(&sbi->s_alloc_mutex);
1986 1987
	/* Make opening of filesystem visible on the media immediately */
	sync_dirty_buffer(bh);
L
Linus Torvalds 已提交
1988 1989 1990 1991
}

static void udf_close_lvid(struct super_block *sb)
{
M
Marcin Slusarz 已提交
1992 1993 1994
	struct udf_sb_info *sbi = UDF_SB(sb);
	struct buffer_head *bh = sbi->s_lvid_bh;
	struct logicalVolIntegrityDesc *lvid;
M
Marcin Slusarz 已提交
1995
	struct logicalVolIntegrityDescImpUse *lvidiu;
1996

M
Marcin Slusarz 已提交
1997 1998
	if (!bh)
		return;
J
Jan Kara 已提交
1999 2000 2001 2002
	lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
	lvidiu = udf_sb_lvidiu(sb);
	if (!lvidiu)
		return;
M
Marcin Slusarz 已提交
2003

2004
	mutex_lock(&sbi->s_alloc_mutex);
M
Marcin Slusarz 已提交
2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016
	lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
	lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
	udf_time_to_disk_stamp(&lvid->recordingDateAndTime, CURRENT_TIME);
	if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev))
		lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
	if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFReadRev))
		lvidiu->minUDFReadRev = cpu_to_le16(sbi->s_udfrev);
	if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFWriteRev))
		lvidiu->minUDFWriteRev = cpu_to_le16(sbi->s_udfrev);
	lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE);

	lvid->descTag.descCRC = cpu_to_le16(
2017
			crc_itu_t(0, (char *)lvid + sizeof(struct tag),
2018
				le16_to_cpu(lvid->descTag.descCRCLength)));
M
Marcin Slusarz 已提交
2019 2020

	lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
2021 2022 2023 2024 2025 2026
	/*
	 * We set buffer uptodate unconditionally here to avoid spurious
	 * warnings from mark_buffer_dirty() when previous EIO has marked
	 * the buffer as !uptodate
	 */
	set_buffer_uptodate(bh);
M
Marcin Slusarz 已提交
2027
	mark_buffer_dirty(bh);
2028
	sbi->s_lvid_dirty = 0;
2029
	mutex_unlock(&sbi->s_alloc_mutex);
2030 2031
	/* Make closing of filesystem visible on the media immediately */
	sync_dirty_buffer(bh);
L
Linus Torvalds 已提交
2032 2033
}

2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058
u64 lvid_get_unique_id(struct super_block *sb)
{
	struct buffer_head *bh;
	struct udf_sb_info *sbi = UDF_SB(sb);
	struct logicalVolIntegrityDesc *lvid;
	struct logicalVolHeaderDesc *lvhd;
	u64 uniqueID;
	u64 ret;

	bh = sbi->s_lvid_bh;
	if (!bh)
		return 0;

	lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
	lvhd = (struct logicalVolHeaderDesc *)lvid->logicalVolContentsUse;

	mutex_lock(&sbi->s_alloc_mutex);
	ret = uniqueID = le64_to_cpu(lvhd->uniqueID);
	if (!(++uniqueID & 0xFFFFFFFF))
		uniqueID += 16;
	lvhd->uniqueID = cpu_to_le64(uniqueID);
	mutex_unlock(&sbi->s_alloc_mutex);
	mark_buffer_dirty(bh);

	return ret;
L
Linus Torvalds 已提交
2059 2060 2061 2062
}

static int udf_fill_super(struct super_block *sb, void *options, int silent)
{
2063
	int ret = -EINVAL;
2064
	struct inode *inode = NULL;
L
Linus Torvalds 已提交
2065
	struct udf_options uopt;
2066
	struct kernel_lb_addr rootdir, fileset;
L
Linus Torvalds 已提交
2067 2068 2069
	struct udf_sb_info *sbi;

	uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT);
2070 2071
	uopt.uid = INVALID_UID;
	uopt.gid = INVALID_GID;
L
Linus Torvalds 已提交
2072
	uopt.umask = 0;
2073 2074
	uopt.fmode = UDF_INVALID_MODE;
	uopt.dmode = UDF_INVALID_MODE;
L
Linus Torvalds 已提交
2075

M
Marcin Slusarz 已提交
2076
	sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL);
2077
	if (!sbi)
L
Linus Torvalds 已提交
2078
		return -ENOMEM;
2079

L
Linus Torvalds 已提交
2080 2081
	sb->s_fs_info = sbi;

I
Ingo Molnar 已提交
2082
	mutex_init(&sbi->s_alloc_mutex);
L
Linus Torvalds 已提交
2083

M
Miklos Szeredi 已提交
2084
	if (!udf_parse_options((char *)options, &uopt, false))
2085
		goto parse_options_failure;
L
Linus Torvalds 已提交
2086 2087

	if (uopt.flags & (1 << UDF_FLAG_UTF8) &&
2088
	    uopt.flags & (1 << UDF_FLAG_NLS_MAP)) {
J
Joe Perches 已提交
2089
		udf_err(sb, "utf8 cannot be combined with iocharset\n");
2090
		goto parse_options_failure;
L
Linus Torvalds 已提交
2091 2092
	}
#ifdef CONFIG_UDF_NLS
2093
	if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map) {
L
Linus Torvalds 已提交
2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106
		uopt.nls_map = load_nls_default();
		if (!uopt.nls_map)
			uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP);
		else
			udf_debug("Using default NLS map\n");
	}
#endif
	if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP)))
		uopt.flags |= (1 << UDF_FLAG_UTF8);

	fileset.logicalBlockNum = 0xFFFFFFFF;
	fileset.partitionReferenceNum = 0xFFFF;

M
Marcin Slusarz 已提交
2107 2108 2109 2110
	sbi->s_flags = uopt.flags;
	sbi->s_uid = uopt.uid;
	sbi->s_gid = uopt.gid;
	sbi->s_umask = uopt.umask;
2111 2112
	sbi->s_fmode = uopt.fmode;
	sbi->s_dmode = uopt.dmode;
M
Marcin Slusarz 已提交
2113
	sbi->s_nls_map = uopt.nls_map;
2114
	rwlock_init(&sbi->s_cred_lock);
L
Linus Torvalds 已提交
2115

2116
	if (uopt.session == 0xFFFFFFFF)
M
Marcin Slusarz 已提交
2117
		sbi->s_session = udf_get_last_session(sb);
L
Linus Torvalds 已提交
2118
	else
M
Marcin Slusarz 已提交
2119
		sbi->s_session = uopt.session;
L
Linus Torvalds 已提交
2120

M
Marcin Slusarz 已提交
2121
	udf_debug("Multi-session=%d\n", sbi->s_session);
L
Linus Torvalds 已提交
2122

J
Jan Kara 已提交
2123 2124 2125
	/* Fill in the rest of the superblock */
	sb->s_op = &udf_sb_ops;
	sb->s_export_op = &udf_export_ops;
2126

J
Jan Kara 已提交
2127 2128 2129
	sb->s_magic = UDF_SUPER_MAGIC;
	sb->s_time_gran = 1000;

C
Clemens Ladisch 已提交
2130
	if (uopt.flags & (1 << UDF_FLAG_BLOCKSIZE_SET)) {
J
Jan Kara 已提交
2131
		ret = udf_load_vrs(sb, &uopt, silent, &fileset);
C
Clemens Ladisch 已提交
2132
	} else {
2133
		uopt.blocksize = bdev_logical_block_size(sb->s_bdev);
J
Jan Kara 已提交
2134
		ret = udf_load_vrs(sb, &uopt, silent, &fileset);
2135
		if (ret == -EAGAIN && uopt.blocksize != UDF_DEFAULT_BLOCKSIZE) {
C
Clemens Ladisch 已提交
2136
			if (!silent)
J
Joe Perches 已提交
2137 2138
				pr_notice("Rescanning with blocksize %d\n",
					  UDF_DEFAULT_BLOCKSIZE);
2139 2140
			brelse(sbi->s_lvid_bh);
			sbi->s_lvid_bh = NULL;
C
Clemens Ladisch 已提交
2141
			uopt.blocksize = UDF_DEFAULT_BLOCKSIZE;
J
Jan Kara 已提交
2142
			ret = udf_load_vrs(sb, &uopt, silent, &fileset);
C
Clemens Ladisch 已提交
2143
		}
L
Linus Torvalds 已提交
2144
	}
2145 2146 2147 2148 2149
	if (ret < 0) {
		if (ret == -EAGAIN) {
			udf_warn(sb, "No partition found (1)\n");
			ret = -EINVAL;
		}
L
Linus Torvalds 已提交
2150 2151 2152
		goto error_out;
	}

M
Marcin Slusarz 已提交
2153
	udf_debug("Lastblock=%d\n", sbi->s_last_block);
L
Linus Torvalds 已提交
2154

M
Marcin Slusarz 已提交
2155
	if (sbi->s_lvid_bh) {
M
Marcin Slusarz 已提交
2156
		struct logicalVolIntegrityDescImpUse *lvidiu =
J
Jan Kara 已提交
2157 2158 2159
							udf_sb_lvidiu(sb);
		uint16_t minUDFReadRev;
		uint16_t minUDFWriteRev;
L
Linus Torvalds 已提交
2160

J
Jan Kara 已提交
2161 2162 2163 2164 2165 2166
		if (!lvidiu) {
			ret = -EINVAL;
			goto error_out;
		}
		minUDFReadRev = le16_to_cpu(lvidiu->minUDFReadRev);
		minUDFWriteRev = le16_to_cpu(lvidiu->minUDFWriteRev);
2167
		if (minUDFReadRev > UDF_MAX_READ_VERSION) {
J
Joe Perches 已提交
2168
			udf_err(sb, "minUDFReadRev=%x (max is %x)\n",
J
Jan Kara 已提交
2169
				minUDFReadRev,
J
Joe Perches 已提交
2170
				UDF_MAX_READ_VERSION);
2171
			ret = -EINVAL;
L
Linus Torvalds 已提交
2172
			goto error_out;
2173 2174 2175 2176 2177
		} else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION &&
			   !(sb->s_flags & MS_RDONLY)) {
			ret = -EACCES;
			goto error_out;
		}
L
Linus Torvalds 已提交
2178

M
Marcin Slusarz 已提交
2179
		sbi->s_udfrev = minUDFWriteRev;
L
Linus Torvalds 已提交
2180 2181 2182 2183 2184 2185 2186

		if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE)
			UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE);
		if (minUDFReadRev >= UDF_VERS_USE_STREAMS)
			UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS);
	}

M
Marcin Slusarz 已提交
2187
	if (!sbi->s_partitions) {
J
Joe Perches 已提交
2188
		udf_warn(sb, "No partition found (2)\n");
2189
		ret = -EINVAL;
L
Linus Torvalds 已提交
2190 2191 2192
		goto error_out;
	}

M
Marcin Slusarz 已提交
2193
	if (sbi->s_partmaps[sbi->s_partition].s_partition_flags &
2194 2195 2196 2197
			UDF_PART_FLAG_READ_ONLY &&
	    !(sb->s_flags & MS_RDONLY)) {
		ret = -EACCES;
		goto error_out;
2198
	}
2199

2200
	if (udf_find_fileset(sb, &fileset, &rootdir)) {
J
Joe Perches 已提交
2201
		udf_warn(sb, "No fileset found\n");
2202
		ret = -EINVAL;
L
Linus Torvalds 已提交
2203 2204 2205
		goto error_out;
	}

2206
	if (!silent) {
2207
		struct timestamp ts;
2208
		udf_time_to_disk_stamp(&ts, sbi->s_record_time);
J
Joe Perches 已提交
2209 2210 2211
		udf_info("Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n",
			 sbi->s_volume_ident,
			 le16_to_cpu(ts.year), ts.month, ts.day,
2212
			 ts.hour, ts.minute, le16_to_cpu(ts.typeAndTimezone));
L
Linus Torvalds 已提交
2213 2214 2215 2216 2217 2218 2219
	}
	if (!(sb->s_flags & MS_RDONLY))
		udf_open_lvid(sb);

	/* Assign the root inode */
	/* assign inodes by physical block number */
	/* perhaps it's not extensible enough, but for now ... */
2220
	inode = udf_iget(sb, &rootdir);
2221
	if (IS_ERR(inode)) {
J
Joe Perches 已提交
2222
		udf_err(sb, "Error in udf_iget, block=%d, partition=%d\n",
2223
		       rootdir.logicalBlockNum, rootdir.partitionReferenceNum);
2224
		ret = PTR_ERR(inode);
L
Linus Torvalds 已提交
2225 2226 2227 2228
		goto error_out;
	}

	/* Allocate a dentry for the root inode */
2229
	sb->s_root = d_make_root(inode);
2230
	if (!sb->s_root) {
J
Joe Perches 已提交
2231
		udf_err(sb, "Couldn't allocate root dentry\n");
2232
		ret = -ENOMEM;
L
Linus Torvalds 已提交
2233 2234
		goto error_out;
	}
J
Jan Kara 已提交
2235
	sb->s_maxbytes = MAX_LFS_FILESIZE;
2236
	sb->s_max_links = UDF_MAX_LINKS;
L
Linus Torvalds 已提交
2237 2238
	return 0;

2239
error_out:
2240
	iput(sbi->s_vat_inode);
2241
parse_options_failure:
L
Linus Torvalds 已提交
2242 2243
#ifdef CONFIG_UDF_NLS
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
M
Marcin Slusarz 已提交
2244
		unload_nls(sbi->s_nls_map);
L
Linus Torvalds 已提交
2245 2246 2247
#endif
	if (!(sb->s_flags & MS_RDONLY))
		udf_close_lvid(sb);
M
Marcin Slusarz 已提交
2248
	brelse(sbi->s_lvid_bh);
J
Jan Kara 已提交
2249
	udf_sb_free_partitions(sb);
L
Linus Torvalds 已提交
2250 2251
	kfree(sbi);
	sb->s_fs_info = NULL;
2252

2253
	return ret;
L
Linus Torvalds 已提交
2254 2255
}

J
Joe Perches 已提交
2256 2257
void _udf_err(struct super_block *sb, const char *function,
	      const char *fmt, ...)
L
Linus Torvalds 已提交
2258
{
2259
	struct va_format vaf;
L
Linus Torvalds 已提交
2260 2261 2262
	va_list args;

	va_start(args, fmt);
2263 2264 2265 2266 2267 2268

	vaf.fmt = fmt;
	vaf.va = &args;

	pr_err("error (device %s): %s: %pV", sb->s_id, function, &vaf);

L
Linus Torvalds 已提交
2269 2270 2271
	va_end(args);
}

J
Joe Perches 已提交
2272 2273
void _udf_warn(struct super_block *sb, const char *function,
	       const char *fmt, ...)
L
Linus Torvalds 已提交
2274
{
2275
	struct va_format vaf;
L
Linus Torvalds 已提交
2276 2277
	va_list args;

2278
	va_start(args, fmt);
2279 2280 2281 2282 2283 2284

	vaf.fmt = fmt;
	vaf.va = &args;

	pr_warn("warning (device %s): %s: %pV", sb->s_id, function, &vaf);

L
Linus Torvalds 已提交
2285 2286 2287
	va_end(args);
}

2288
static void udf_put_super(struct super_block *sb)
L
Linus Torvalds 已提交
2289
{
M
Marcin Slusarz 已提交
2290
	struct udf_sb_info *sbi;
L
Linus Torvalds 已提交
2291

M
Marcin Slusarz 已提交
2292
	sbi = UDF_SB(sb);
2293

2294
	iput(sbi->s_vat_inode);
L
Linus Torvalds 已提交
2295 2296
#ifdef CONFIG_UDF_NLS
	if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
M
Marcin Slusarz 已提交
2297
		unload_nls(sbi->s_nls_map);
L
Linus Torvalds 已提交
2298 2299 2300
#endif
	if (!(sb->s_flags & MS_RDONLY))
		udf_close_lvid(sb);
M
Marcin Slusarz 已提交
2301
	brelse(sbi->s_lvid_bh);
J
Jan Kara 已提交
2302
	udf_sb_free_partitions(sb);
2303
	mutex_destroy(&sbi->s_alloc_mutex);
L
Linus Torvalds 已提交
2304 2305 2306 2307
	kfree(sb->s_fs_info);
	sb->s_fs_info = NULL;
}

2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325
static int udf_sync_fs(struct super_block *sb, int wait)
{
	struct udf_sb_info *sbi = UDF_SB(sb);

	mutex_lock(&sbi->s_alloc_mutex);
	if (sbi->s_lvid_dirty) {
		/*
		 * Blockdevice will be synced later so we don't have to submit
		 * the buffer for IO
		 */
		mark_buffer_dirty(sbi->s_lvid_bh);
		sbi->s_lvid_dirty = 0;
	}
	mutex_unlock(&sbi->s_alloc_mutex);

	return 0;
}

2326
static int udf_statfs(struct dentry *dentry, struct kstatfs *buf)
L
Linus Torvalds 已提交
2327
{
2328
	struct super_block *sb = dentry->d_sb;
M
Marcin Slusarz 已提交
2329 2330
	struct udf_sb_info *sbi = UDF_SB(sb);
	struct logicalVolIntegrityDescImpUse *lvidiu;
C
Coly Li 已提交
2331
	u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
M
Marcin Slusarz 已提交
2332

J
Jan Kara 已提交
2333
	lvidiu = udf_sb_lvidiu(sb);
L
Linus Torvalds 已提交
2334 2335
	buf->f_type = UDF_SUPER_MAGIC;
	buf->f_bsize = sb->s_blocksize;
M
Marcin Slusarz 已提交
2336
	buf->f_blocks = sbi->s_partmaps[sbi->s_partition].s_partition_len;
L
Linus Torvalds 已提交
2337 2338
	buf->f_bfree = udf_count_free(sb);
	buf->f_bavail = buf->f_bfree;
M
Marcin Slusarz 已提交
2339 2340 2341
	buf->f_files = (lvidiu != NULL ? (le32_to_cpu(lvidiu->numFiles) +
					  le32_to_cpu(lvidiu->numDirs)) : 0)
			+ buf->f_bfree;
L
Linus Torvalds 已提交
2342
	buf->f_ffree = buf->f_bfree;
2343
	buf->f_namelen = UDF_NAME_LEN - 2;
C
Coly Li 已提交
2344 2345
	buf->f_fsid.val[0] = (u32)id;
	buf->f_fsid.val[1] = (u32)(id >> 32);
L
Linus Torvalds 已提交
2346 2347 2348 2349

	return 0;
}

M
Marcin Slusarz 已提交
2350 2351
static unsigned int udf_count_free_bitmap(struct super_block *sb,
					  struct udf_bitmap *bitmap)
L
Linus Torvalds 已提交
2352 2353 2354 2355 2356
{
	struct buffer_head *bh = NULL;
	unsigned int accum = 0;
	int index;
	int block = 0, newblock;
2357
	struct kernel_lb_addr loc;
L
Linus Torvalds 已提交
2358 2359 2360 2361 2362 2363
	uint32_t bytes;
	uint8_t *ptr;
	uint16_t ident;
	struct spaceBitmapDesc *bm;

	loc.logicalBlockNum = bitmap->s_extPosition;
M
Marcin Slusarz 已提交
2364
	loc.partitionReferenceNum = UDF_SB(sb)->s_partition;
2365
	bh = udf_read_ptagged(sb, &loc, 0, &ident);
L
Linus Torvalds 已提交
2366

2367
	if (!bh) {
J
Joe Perches 已提交
2368
		udf_err(sb, "udf_count_free failed\n");
L
Linus Torvalds 已提交
2369
		goto out;
2370
	} else if (ident != TAG_IDENT_SBD) {
J
Jan Kara 已提交
2371
		brelse(bh);
J
Joe Perches 已提交
2372
		udf_err(sb, "udf_count_free failed\n");
L
Linus Torvalds 已提交
2373 2374 2375 2376 2377
		goto out;
	}

	bm = (struct spaceBitmapDesc *)bh->b_data;
	bytes = le32_to_cpu(bm->numOfBytes);
2378 2379
	index = sizeof(struct spaceBitmapDesc); /* offset in first block only */
	ptr = (uint8_t *)bh->b_data;
L
Linus Torvalds 已提交
2380

2381
	while (bytes > 0) {
2382 2383 2384 2385
		u32 cur_bytes = min_t(u32, bytes, sb->s_blocksize - index);
		accum += bitmap_weight((const unsigned long *)(ptr + index),
					cur_bytes * 8);
		bytes -= cur_bytes;
2386
		if (bytes) {
J
Jan Kara 已提交
2387
			brelse(bh);
2388
			newblock = udf_get_lb_pblock(sb, &loc, ++block);
L
Linus Torvalds 已提交
2389
			bh = udf_tread(sb, newblock);
2390
			if (!bh) {
L
Linus Torvalds 已提交
2391 2392 2393 2394
				udf_debug("read failed\n");
				goto out;
			}
			index = 0;
2395
			ptr = (uint8_t *)bh->b_data;
L
Linus Torvalds 已提交
2396 2397
		}
	}
J
Jan Kara 已提交
2398
	brelse(bh);
2399
out:
L
Linus Torvalds 已提交
2400 2401 2402
	return accum;
}

M
Marcin Slusarz 已提交
2403 2404
static unsigned int udf_count_free_table(struct super_block *sb,
					 struct inode *table)
L
Linus Torvalds 已提交
2405 2406
{
	unsigned int accum = 0;
J
Jan Kara 已提交
2407
	uint32_t elen;
2408
	struct kernel_lb_addr eloc;
L
Linus Torvalds 已提交
2409
	int8_t etype;
J
Jan Kara 已提交
2410
	struct extent_position epos;
L
Linus Torvalds 已提交
2411

2412
	mutex_lock(&UDF_SB(sb)->s_alloc_mutex);
2413
	epos.block = UDF_I(table)->i_location;
J
Jan Kara 已提交
2414 2415
	epos.offset = sizeof(struct unallocSpaceEntry);
	epos.bh = NULL;
L
Linus Torvalds 已提交
2416

2417
	while ((etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1)
L
Linus Torvalds 已提交
2418
		accum += (elen >> table->i_sb->s_blocksize_bits);
2419

J
Jan Kara 已提交
2420
	brelse(epos.bh);
2421
	mutex_unlock(&UDF_SB(sb)->s_alloc_mutex);
L
Linus Torvalds 已提交
2422 2423 2424

	return accum;
}
2425 2426

static unsigned int udf_count_free(struct super_block *sb)
L
Linus Torvalds 已提交
2427 2428
{
	unsigned int accum = 0;
M
Marcin Slusarz 已提交
2429 2430
	struct udf_sb_info *sbi;
	struct udf_part_map *map;
L
Linus Torvalds 已提交
2431

M
Marcin Slusarz 已提交
2432 2433
	sbi = UDF_SB(sb);
	if (sbi->s_lvid_bh) {
M
Marcin Slusarz 已提交
2434 2435 2436
		struct logicalVolIntegrityDesc *lvid =
			(struct logicalVolIntegrityDesc *)
			sbi->s_lvid_bh->b_data;
M
Marcin Slusarz 已提交
2437
		if (le32_to_cpu(lvid->numOfPartitions) > sbi->s_partition) {
M
Marcin Slusarz 已提交
2438 2439
			accum = le32_to_cpu(
					lvid->freeSpaceTable[sbi->s_partition]);
L
Linus Torvalds 已提交
2440 2441 2442 2443 2444 2445 2446 2447
			if (accum == 0xFFFFFFFF)
				accum = 0;
		}
	}

	if (accum)
		return accum;

M
Marcin Slusarz 已提交
2448 2449
	map = &sbi->s_partmaps[sbi->s_partition];
	if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) {
2450
		accum += udf_count_free_bitmap(sb,
M
Marcin Slusarz 已提交
2451
					       map->s_uspace.s_bitmap);
L
Linus Torvalds 已提交
2452
	}
M
Marcin Slusarz 已提交
2453
	if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) {
2454
		accum += udf_count_free_bitmap(sb,
M
Marcin Slusarz 已提交
2455
					       map->s_fspace.s_bitmap);
L
Linus Torvalds 已提交
2456 2457 2458 2459
	}
	if (accum)
		return accum;

M
Marcin Slusarz 已提交
2460
	if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) {
2461
		accum += udf_count_free_table(sb,
M
Marcin Slusarz 已提交
2462
					      map->s_uspace.s_table);
L
Linus Torvalds 已提交
2463
	}
M
Marcin Slusarz 已提交
2464
	if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) {
2465
		accum += udf_count_free_table(sb,
M
Marcin Slusarz 已提交
2466
					      map->s_fspace.s_table);
L
Linus Torvalds 已提交
2467 2468 2469 2470
	}

	return accum;
}