inode.c 65.2 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
/*
 * inode.c
 *
 * PURPOSE
 *  Inode handling routines for the OSTA-UDF(tm) filesystem.
 *
 * 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) 1999-2000 Stelias Computing Inc
 *
 * HISTORY
 *
 *  10/04/98 dgb  Added rudimentary directory functions
 *  10/07/98      Fully working udf_block_map! It works!
 *  11/25/98      bmap altered to better support extents
M
Marcin Slusarz 已提交
22 23
 *  12/06/98 blf  partition support in udf_iget, udf_block_map
 *                and udf_read_inode
L
Linus Torvalds 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37
 *  12/12/98      rewrote udf_block_map to handle next extents and descs across
 *                block boundaries (which is not actually allowed)
 *  12/20/98      added support for strategy 4096
 *  03/07/99      rewrote udf_block_map (again)
 *                New funcs, inode_bmap, udf_next_aext
 *  04/19/99      Support for writing device EA's for major/minor #
 */

#include "udfdecl.h"
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/pagemap.h>
#include <linux/writeback.h>
#include <linux/slab.h>
38
#include <linux/crc-itu-t.h>
N
Namjae Jeon 已提交
39
#include <linux/mpage.h>
40
#include <linux/uio.h>
41
#include <linux/bio.h>
L
Linus Torvalds 已提交
42 43 44 45 46 47

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

#define EXTENT_MERGE_SIZE 5

A
Al Viro 已提交
48
static umode_t udf_convert_permissions(struct fileEntry *);
L
Linus Torvalds 已提交
49
static int udf_update_inode(struct inode *, int);
J
Jan Kara 已提交
50
static int udf_sync_inode(struct inode *inode);
51
static int udf_alloc_i_data(struct inode *inode, size_t size);
52
static sector_t inode_getblk(struct inode *, sector_t, int *, int *);
J
Jan Kara 已提交
53
static int8_t udf_insert_aext(struct inode *, struct extent_position,
54
			      struct kernel_lb_addr, uint32_t);
L
Linus Torvalds 已提交
55
static void udf_split_extents(struct inode *, int *, int, int,
56
			      struct kernel_long_ad *, int *);
L
Linus Torvalds 已提交
57
static void udf_prealloc_extents(struct inode *, int, int,
58 59 60 61
				 struct kernel_long_ad *, int *);
static void udf_merge_extents(struct inode *, struct kernel_long_ad *, int *);
static void udf_update_extents(struct inode *, struct kernel_long_ad *, int,
			       int, struct extent_position *);
L
Linus Torvalds 已提交
62 63
static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int);

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
static void __udf_clear_extent_cache(struct inode *inode)
{
	struct udf_inode_info *iinfo = UDF_I(inode);

	if (iinfo->cached_extent.lstart != -1) {
		brelse(iinfo->cached_extent.epos.bh);
		iinfo->cached_extent.lstart = -1;
	}
}

/* Invalidate extent cache */
static void udf_clear_extent_cache(struct inode *inode)
{
	struct udf_inode_info *iinfo = UDF_I(inode);

	spin_lock(&iinfo->i_extent_cache_lock);
	__udf_clear_extent_cache(inode);
	spin_unlock(&iinfo->i_extent_cache_lock);
}

/* Return contents of extent cache */
static int udf_read_extent_cache(struct inode *inode, loff_t bcount,
				 loff_t *lbcount, struct extent_position *pos)
{
	struct udf_inode_info *iinfo = UDF_I(inode);
	int ret = 0;

	spin_lock(&iinfo->i_extent_cache_lock);
	if ((iinfo->cached_extent.lstart <= bcount) &&
	    (iinfo->cached_extent.lstart != -1)) {
		/* Cache hit */
		*lbcount = iinfo->cached_extent.lstart;
		memcpy(pos, &iinfo->cached_extent.epos,
		       sizeof(struct extent_position));
		if (pos->bh)
			get_bh(pos->bh);
		ret = 1;
	}
	spin_unlock(&iinfo->i_extent_cache_lock);
	return ret;
}

/* Add extent to extent cache */
static void udf_update_extent_cache(struct inode *inode, loff_t estart,
108
				    struct extent_position *pos)
109 110 111 112 113 114 115 116
{
	struct udf_inode_info *iinfo = UDF_I(inode);

	spin_lock(&iinfo->i_extent_cache_lock);
	/* Invalidate previously cached extent */
	__udf_clear_extent_cache(inode);
	if (pos->bh)
		get_bh(pos->bh);
117
	memcpy(&iinfo->cached_extent.epos, pos, sizeof(struct extent_position));
118
	iinfo->cached_extent.lstart = estart;
119 120 121 122 123 124 125 126
	switch (iinfo->i_alloc_type) {
	case ICBTAG_FLAG_AD_SHORT:
		iinfo->cached_extent.epos.offset -= sizeof(struct short_ad);
		break;
	case ICBTAG_FLAG_AD_LONG:
		iinfo->cached_extent.epos.offset -= sizeof(struct long_ad);
		break;
	}
127 128
	spin_unlock(&iinfo->i_extent_cache_lock);
}
129

A
Al Viro 已提交
130
void udf_evict_inode(struct inode *inode)
L
Linus Torvalds 已提交
131
{
J
Jan Kara 已提交
132
	struct udf_inode_info *iinfo = UDF_I(inode);
A
Al Viro 已提交
133 134 135 136
	int want_delete = 0;

	if (!inode->i_nlink && !is_bad_inode(inode)) {
		want_delete = 1;
137
		udf_setsize(inode, 0);
A
Al Viro 已提交
138
		udf_update_inode(inode, IS_SYNC(inode));
139 140
	}
	truncate_inode_pages_final(&inode->i_data);
A
Al Viro 已提交
141
	invalidate_inode_buffers(inode);
142
	clear_inode(inode);
J
Jan Kara 已提交
143 144
	if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB &&
	    inode->i_size != iinfo->i_lenExtents) {
J
Joe Perches 已提交
145 146 147 148
		udf_warn(inode->i_sb, "Inode %lu (mode %o) has inode size %llu different from extent length %llu. Filesystem need not be standards compliant.\n",
			 inode->i_ino, inode->i_mode,
			 (unsigned long long)inode->i_size,
			 (unsigned long long)iinfo->i_lenExtents);
L
Linus Torvalds 已提交
149
	}
150 151
	kfree(iinfo->i_ext.i_data);
	iinfo->i_ext.i_data = NULL;
152
	udf_clear_extent_cache(inode);
A
Al Viro 已提交
153 154 155
	if (want_delete) {
		udf_free_inode(inode);
	}
L
Linus Torvalds 已提交
156 157
}

I
Ian Abbott 已提交
158 159 160 161 162 163 164
static void udf_write_failed(struct address_space *mapping, loff_t to)
{
	struct inode *inode = mapping->host;
	struct udf_inode_info *iinfo = UDF_I(inode);
	loff_t isize = inode->i_size;

	if (to > isize) {
165
		truncate_pagecache(inode, isize);
I
Ian Abbott 已提交
166 167
		if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
			down_write(&iinfo->i_data_sem);
168
			udf_clear_extent_cache(inode);
I
Ian Abbott 已提交
169 170 171 172 173 174
			udf_truncate_extents(inode);
			up_write(&iinfo->i_data_sem);
		}
	}
}

L
Linus Torvalds 已提交
175 176 177 178 179
static int udf_writepage(struct page *page, struct writeback_control *wbc)
{
	return block_write_full_page(page, udf_get_block, wbc);
}

180 181 182 183 184 185
static int udf_writepages(struct address_space *mapping,
			struct writeback_control *wbc)
{
	return mpage_writepages(mapping, wbc, udf_get_block);
}

L
Linus Torvalds 已提交
186 187
static int udf_readpage(struct file *file, struct page *page)
{
N
Namjae Jeon 已提交
188 189 190 191 192 193 194
	return mpage_readpage(page, udf_get_block);
}

static int udf_readpages(struct file *file, struct address_space *mapping,
			struct list_head *pages, unsigned nr_pages)
{
	return mpage_readpages(mapping, pages, nr_pages, udf_get_block);
L
Linus Torvalds 已提交
195 196
}

N
Nick Piggin 已提交
197 198 199
static int udf_write_begin(struct file *file, struct address_space *mapping,
			loff_t pos, unsigned len, unsigned flags,
			struct page **pagep, void **fsdata)
L
Linus Torvalds 已提交
200
{
201 202 203
	int ret;

	ret = block_write_begin(mapping, pos, len, flags, pagep, udf_get_block);
I
Ian Abbott 已提交
204 205 206 207
	if (unlikely(ret))
		udf_write_failed(mapping, pos + len);
	return ret;
}
208

209
static ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
I
Ian Abbott 已提交
210 211 212 213
{
	struct file *file = iocb->ki_filp;
	struct address_space *mapping = file->f_mapping;
	struct inode *inode = mapping->host;
214
	size_t count = iov_iter_count(iter);
I
Ian Abbott 已提交
215 216
	ssize_t ret;

217
	ret = blockdev_direct_IO(iocb, inode, iter, udf_get_block);
218
	if (unlikely(ret < 0 && iov_iter_rw(iter) == WRITE))
219
		udf_write_failed(mapping, iocb->ki_pos + count);
220
	return ret;
L
Linus Torvalds 已提交
221 222 223 224
}

static sector_t udf_bmap(struct address_space *mapping, sector_t block)
{
225
	return generic_block_bmap(mapping, block, udf_get_block);
L
Linus Torvalds 已提交
226 227
}

228
const struct address_space_operations udf_aops = {
229
	.readpage	= udf_readpage,
N
Namjae Jeon 已提交
230
	.readpages	= udf_readpages,
231
	.writepage	= udf_writepage,
232
	.writepages	= udf_writepages,
I
Ian Abbott 已提交
233 234 235
	.write_begin	= udf_write_begin,
	.write_end	= generic_write_end,
	.direct_IO	= udf_direct_IO,
236
	.bmap		= udf_bmap,
L
Linus Torvalds 已提交
237 238
};

239 240 241 242 243 244
/*
 * Expand file stored in ICB to a normal one-block-file
 *
 * This function requires i_data_sem for writing and releases it.
 * This function requires i_mutex held
 */
245
int udf_expand_file_adinicb(struct inode *inode)
L
Linus Torvalds 已提交
246 247 248
{
	struct page *page;
	char *kaddr;
249
	struct udf_inode_info *iinfo = UDF_I(inode);
250
	int err;
L
Linus Torvalds 已提交
251 252 253 254 255
	struct writeback_control udf_wbc = {
		.sync_mode = WB_SYNC_NONE,
		.nr_to_write = 1,
	};

A
Al Viro 已提交
256
	WARN_ON_ONCE(!inode_is_locked(inode));
257
	if (!iinfo->i_lenAlloc) {
L
Linus Torvalds 已提交
258
		if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
259
			iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT;
L
Linus Torvalds 已提交
260
		else
261
			iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
262 263
		/* from now on we have normal address_space methods */
		inode->i_data.a_ops = &udf_aops;
264
		up_write(&iinfo->i_data_sem);
L
Linus Torvalds 已提交
265
		mark_inode_dirty(inode);
266
		return 0;
L
Linus Torvalds 已提交
267
	}
268 269 270 271 272
	/*
	 * Release i_data_sem so that we can lock a page - page lock ranks
	 * above i_data_sem. i_mutex still protects us against file changes.
	 */
	up_write(&iinfo->i_data_sem);
L
Linus Torvalds 已提交
273

274 275 276
	page = find_or_create_page(inode->i_mapping, 0, GFP_NOFS);
	if (!page)
		return -ENOMEM;
M
Matt Mackall 已提交
277

278
	if (!PageUptodate(page)) {
L
Linus Torvalds 已提交
279
		kaddr = kmap(page);
280
		memset(kaddr + iinfo->i_lenAlloc, 0x00,
281
		       PAGE_SIZE - iinfo->i_lenAlloc);
282 283
		memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr,
			iinfo->i_lenAlloc);
L
Linus Torvalds 已提交
284 285 286 287
		flush_dcache_page(page);
		SetPageUptodate(page);
		kunmap(page);
	}
288
	down_write(&iinfo->i_data_sem);
289 290 291
	memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0x00,
	       iinfo->i_lenAlloc);
	iinfo->i_lenAlloc = 0;
L
Linus Torvalds 已提交
292
	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
293
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT;
L
Linus Torvalds 已提交
294
	else
295
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
296 297
	/* from now on we have normal address_space methods */
	inode->i_data.a_ops = &udf_aops;
298
	up_write(&iinfo->i_data_sem);
299 300 301 302 303
	err = inode->i_data.a_ops->writepage(page, &udf_wbc);
	if (err) {
		/* Restore everything back so that we don't lose data... */
		lock_page(page);
		kaddr = kmap(page);
304
		down_write(&iinfo->i_data_sem);
305 306 307 308 309 310
		memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr,
		       inode->i_size);
		kunmap(page);
		unlock_page(page);
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
		inode->i_data.a_ops = &udf_adinicb_aops;
311
		up_write(&iinfo->i_data_sem);
312
	}
313
	put_page(page);
L
Linus Torvalds 已提交
314
	mark_inode_dirty(inode);
315 316

	return err;
L
Linus Torvalds 已提交
317 318
}

319 320
struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block,
					   int *err)
L
Linus Torvalds 已提交
321 322
{
	int newblock;
J
Jan Kara 已提交
323
	struct buffer_head *dbh = NULL;
324
	struct kernel_lb_addr eloc;
L
Linus Torvalds 已提交
325
	uint8_t alloctype;
J
Jan Kara 已提交
326
	struct extent_position epos;
L
Linus Torvalds 已提交
327 328

	struct udf_fileident_bh sfibh, dfibh;
329 330
	loff_t f_pos = udf_ext0_offset(inode);
	int size = udf_ext0_offset(inode) + inode->i_size;
L
Linus Torvalds 已提交
331
	struct fileIdentDesc cfi, *sfi, *dfi;
332
	struct udf_inode_info *iinfo = UDF_I(inode);
L
Linus Torvalds 已提交
333 334 335 336 337 338

	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
		alloctype = ICBTAG_FLAG_AD_SHORT;
	else
		alloctype = ICBTAG_FLAG_AD_LONG;

339
	if (!inode->i_size) {
340
		iinfo->i_alloc_type = alloctype;
L
Linus Torvalds 已提交
341 342 343 344 345 346
		mark_inode_dirty(inode);
		return NULL;
	}

	/* alloc block, and copy data to it */
	*block = udf_new_block(inode->i_sb, inode,
347 348
			       iinfo->i_location.partitionReferenceNum,
			       iinfo->i_location.logicalBlockNum, err);
L
Linus Torvalds 已提交
349 350 351
	if (!(*block))
		return NULL;
	newblock = udf_get_pblock(inode->i_sb, *block,
352
				  iinfo->i_location.partitionReferenceNum,
353
				0);
L
Linus Torvalds 已提交
354 355 356 357 358 359 360 361 362 363 364
	if (!newblock)
		return NULL;
	dbh = udf_tgetblk(inode->i_sb, newblock);
	if (!dbh)
		return NULL;
	lock_buffer(dbh);
	memset(dbh->b_data, 0x00, inode->i_sb->s_blocksize);
	set_buffer_uptodate(dbh);
	unlock_buffer(dbh);
	mark_buffer_dirty_inode(dbh, inode);

M
Marcin Slusarz 已提交
365
	sfibh.soffset = sfibh.eoffset =
366
			f_pos & (inode->i_sb->s_blocksize - 1);
J
Jan Kara 已提交
367
	sfibh.sbh = sfibh.ebh = NULL;
L
Linus Torvalds 已提交
368 369
	dfibh.soffset = dfibh.eoffset = 0;
	dfibh.sbh = dfibh.ebh = dbh;
370
	while (f_pos < size) {
371
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
M
Marcin Slusarz 已提交
372 373
		sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL,
					 NULL, NULL, NULL);
374
		if (!sfi) {
J
Jan Kara 已提交
375
			brelse(dbh);
L
Linus Torvalds 已提交
376 377
			return NULL;
		}
378
		iinfo->i_alloc_type = alloctype;
L
Linus Torvalds 已提交
379 380 381 382 383
		sfi->descTag.tagLocation = cpu_to_le32(*block);
		dfibh.soffset = dfibh.eoffset;
		dfibh.eoffset += (sfibh.eoffset - sfibh.soffset);
		dfi = (struct fileIdentDesc *)(dbh->b_data + dfibh.soffset);
		if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse,
M
Marcin Slusarz 已提交
384 385
				 sfi->fileIdent +
					le16_to_cpu(sfi->lengthOfImpUse))) {
386
			iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
J
Jan Kara 已提交
387
			brelse(dbh);
L
Linus Torvalds 已提交
388 389 390 391 392
			return NULL;
		}
	}
	mark_buffer_dirty_inode(dbh, inode);

393 394 395
	memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0,
		iinfo->i_lenAlloc);
	iinfo->i_lenAlloc = 0;
L
Linus Torvalds 已提交
396
	eloc.logicalBlockNum = *block;
M
Marcin Slusarz 已提交
397
	eloc.partitionReferenceNum =
398
				iinfo->i_location.partitionReferenceNum;
J
Jan Kara 已提交
399
	iinfo->i_lenExtents = inode->i_size;
J
Jan Kara 已提交
400
	epos.bh = NULL;
401
	epos.block = iinfo->i_location;
J
Jan Kara 已提交
402
	epos.offset = udf_file_entry_alloc_offset(inode);
J
Jan Kara 已提交
403
	udf_add_aext(inode, &epos, &eloc, inode->i_size, 0);
L
Linus Torvalds 已提交
404 405
	/* UniqueID stuff */

J
Jan Kara 已提交
406
	brelse(epos.bh);
L
Linus Torvalds 已提交
407 408 409 410
	mark_inode_dirty(inode);
	return dbh;
}

411 412
static int udf_get_block(struct inode *inode, sector_t block,
			 struct buffer_head *bh_result, int create)
L
Linus Torvalds 已提交
413 414
{
	int err, new;
415
	sector_t phys = 0;
416
	struct udf_inode_info *iinfo;
L
Linus Torvalds 已提交
417

418
	if (!create) {
L
Linus Torvalds 已提交
419 420 421 422 423 424 425 426
		phys = udf_block_map(inode, block);
		if (phys)
			map_bh(bh_result, inode->i_sb, phys);
		return 0;
	}

	err = -EIO;
	new = 0;
427
	iinfo = UDF_I(inode);
428 429

	down_write(&iinfo->i_data_sem);
430 431 432
	if (block == iinfo->i_next_alloc_block + 1) {
		iinfo->i_next_alloc_block++;
		iinfo->i_next_alloc_goal++;
L
Linus Torvalds 已提交
433 434
	}

435
	udf_clear_extent_cache(inode);
436 437
	phys = inode_getblk(inode, block, &err, &new);
	if (!phys)
L
Linus Torvalds 已提交
438 439 440 441 442
		goto abort;

	if (new)
		set_buffer_new(bh_result);
	map_bh(bh_result, inode->i_sb, phys);
443 444

abort:
445
	up_write(&iinfo->i_data_sem);
L
Linus Torvalds 已提交
446 447 448
	return err;
}

449 450
static struct buffer_head *udf_getblk(struct inode *inode, long block,
				      int create, int *err)
L
Linus Torvalds 已提交
451
{
452
	struct buffer_head *bh;
L
Linus Torvalds 已提交
453 454 455 456 457
	struct buffer_head dummy;

	dummy.b_state = 0;
	dummy.b_blocknr = -1000;
	*err = udf_get_block(inode, block, &dummy, create);
458
	if (!*err && buffer_mapped(&dummy)) {
L
Linus Torvalds 已提交
459
		bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
460
		if (buffer_new(&dummy)) {
L
Linus Torvalds 已提交
461 462 463 464 465 466 467 468
			lock_buffer(bh);
			memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
			set_buffer_uptodate(bh);
			unlock_buffer(bh);
			mark_buffer_dirty_inode(bh, inode);
		}
		return bh;
	}
469

L
Linus Torvalds 已提交
470 471 472
	return NULL;
}

J
Jan Kara 已提交
473
/* Extend the file by 'blocks' blocks, return the number of extents added */
474 475 476 477
static int udf_do_extend_file(struct inode *inode,
			      struct extent_position *last_pos,
			      struct kernel_long_ad *last_ext,
			      sector_t blocks)
J
Jan Kara 已提交
478 479 480 481
{
	sector_t add;
	int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
	struct super_block *sb = inode->i_sb;
482
	struct kernel_lb_addr prealloc_loc = {};
J
Jan Kara 已提交
483
	int prealloc_len = 0;
484
	struct udf_inode_info *iinfo;
485
	int err;
J
Jan Kara 已提交
486 487 488 489 490

	/* The previous extent is fake and we should not extend by anything
	 * - there's nothing to do... */
	if (!blocks && fake)
		return 0;
491

492
	iinfo = UDF_I(inode);
J
Jan Kara 已提交
493 494 495
	/* Round the last extent up to a multiple of block size */
	if (last_ext->extLength & (sb->s_blocksize - 1)) {
		last_ext->extLength =
496 497 498
			(last_ext->extLength & UDF_EXTENT_FLAG_MASK) |
			(((last_ext->extLength & UDF_EXTENT_LENGTH_MASK) +
			  sb->s_blocksize - 1) & ~(sb->s_blocksize - 1));
499 500
		iinfo->i_lenExtents =
			(iinfo->i_lenExtents + sb->s_blocksize - 1) &
501
			~(sb->s_blocksize - 1);
J
Jan Kara 已提交
502
	}
503

J
Jan Kara 已提交
504
	/* Last extent are just preallocated blocks? */
M
Marcin Slusarz 已提交
505 506
	if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) ==
						EXT_NOT_RECORDED_ALLOCATED) {
J
Jan Kara 已提交
507 508 509 510 511
		/* Save the extent so that we can reattach it to the end */
		prealloc_loc = last_ext->extLocation;
		prealloc_len = last_ext->extLength;
		/* Mark the extent as a hole */
		last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
512
			(last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
J
Jan Kara 已提交
513
		last_ext->extLocation.logicalBlockNum = 0;
M
Marcin Slusarz 已提交
514
		last_ext->extLocation.partitionReferenceNum = 0;
J
Jan Kara 已提交
515
	}
516

J
Jan Kara 已提交
517
	/* Can we merge with the previous extent? */
M
Marcin Slusarz 已提交
518 519 520 521 522
	if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) ==
					EXT_NOT_RECORDED_NOT_ALLOCATED) {
		add = ((1 << 30) - sb->s_blocksize -
			(last_ext->extLength & UDF_EXTENT_LENGTH_MASK)) >>
			sb->s_blocksize_bits;
J
Jan Kara 已提交
523 524 525 526 527 528 529
		if (add > blocks)
			add = blocks;
		blocks -= add;
		last_ext->extLength += add << sb->s_blocksize_bits;
	}

	if (fake) {
530
		udf_add_aext(inode, last_pos, &last_ext->extLocation,
531
			     last_ext->extLength, 1);
J
Jan Kara 已提交
532
		count++;
J
Jan Kara 已提交
533 534 535 536
	} else {
		struct kernel_lb_addr tmploc;
		uint32_t tmplen;

537
		udf_write_aext(inode, last_pos, &last_ext->extLocation,
M
Marcin Slusarz 已提交
538
				last_ext->extLength, 1);
J
Jan Kara 已提交
539 540 541 542 543 544
		/*
		 * We've rewritten the last extent but there may be empty
		 * indirect extent after it - enter it.
		 */
		udf_next_aext(inode, last_pos, &tmploc, &tmplen, 0);
	}
545

J
Jan Kara 已提交
546 547 548 549 550 551
	/* Managed to do everything necessary? */
	if (!blocks)
		goto out;

	/* All further extents will be NOT_RECORDED_NOT_ALLOCATED */
	last_ext->extLocation.logicalBlockNum = 0;
M
Marcin Slusarz 已提交
552
	last_ext->extLocation.partitionReferenceNum = 0;
553
	add = (1 << (30-sb->s_blocksize_bits)) - 1;
M
Marcin Slusarz 已提交
554 555
	last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
				(add << sb->s_blocksize_bits);
556

J
Jan Kara 已提交
557 558 559
	/* Create enough extents to cover the whole hole */
	while (blocks > add) {
		blocks -= add;
560 561 562 563
		err = udf_add_aext(inode, last_pos, &last_ext->extLocation,
				   last_ext->extLength, 1);
		if (err)
			return err;
J
Jan Kara 已提交
564 565 566 567
		count++;
	}
	if (blocks) {
		last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
568
			(blocks << sb->s_blocksize_bits);
569 570 571 572
		err = udf_add_aext(inode, last_pos, &last_ext->extLocation,
				   last_ext->extLength, 1);
		if (err)
			return err;
J
Jan Kara 已提交
573 574
		count++;
	}
575 576

out:
J
Jan Kara 已提交
577 578
	/* Do we have some preallocated blocks saved? */
	if (prealloc_len) {
579 580 581 582
		err = udf_add_aext(inode, last_pos, &prealloc_loc,
				   prealloc_len, 1);
		if (err)
			return err;
J
Jan Kara 已提交
583 584 585 586
		last_ext->extLocation = prealloc_loc;
		last_ext->extLength = prealloc_len;
		count++;
	}
587

J
Jan Kara 已提交
588
	/* last_pos should point to the last written extent... */
589
	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
590
		last_pos->offset -= sizeof(struct short_ad);
591
	else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
592
		last_pos->offset -= sizeof(struct long_ad);
J
Jan Kara 已提交
593
	else
594
		return -EIO;
595

J
Jan Kara 已提交
596 597 598
	return count;
}

599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
static int udf_extend_file(struct inode *inode, loff_t newsize)
{

	struct extent_position epos;
	struct kernel_lb_addr eloc;
	uint32_t elen;
	int8_t etype;
	struct super_block *sb = inode->i_sb;
	sector_t first_block = newsize >> sb->s_blocksize_bits, offset;
	int adsize;
	struct udf_inode_info *iinfo = UDF_I(inode);
	struct kernel_long_ad extent;
	int err;

	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
		adsize = sizeof(struct short_ad);
	else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
		adsize = sizeof(struct long_ad);
	else
		BUG();

	etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset);

	/* File has extent covering the new size (could happen when extending
	 * inside a block)? */
	if (etype != -1)
		return 0;
	if (newsize & (sb->s_blocksize - 1))
		offset++;
	/* Extended file just to the boundary of the last file block? */
	if (offset == 0)
		return 0;

	/* Truncate is extending the file by 'offset' blocks */
	if ((!epos.bh && epos.offset == udf_file_entry_alloc_offset(inode)) ||
	    (epos.bh && epos.offset == sizeof(struct allocExtDesc))) {
		/* File has no extents at all or has empty last
		 * indirect extent! Create a fake extent... */
		extent.extLocation.logicalBlockNum = 0;
		extent.extLocation.partitionReferenceNum = 0;
		extent.extLength = EXT_NOT_RECORDED_NOT_ALLOCATED;
	} else {
		epos.offset -= adsize;
		etype = udf_next_aext(inode, &epos, &extent.extLocation,
				      &extent.extLength, 0);
		extent.extLength |= etype << 30;
	}
	err = udf_do_extend_file(inode, &epos, &extent, offset);
	if (err < 0)
		goto out;
	err = 0;
	iinfo->i_lenExtents = newsize;
out:
	brelse(epos.bh);
	return err;
}

656 657
static sector_t inode_getblk(struct inode *inode, sector_t block,
			     int *err, int *new)
L
Linus Torvalds 已提交
658
{
659
	struct kernel_long_ad laarr[EXTENT_MERGE_SIZE];
J
Jan Kara 已提交
660
	struct extent_position prev_epos, cur_epos, next_epos;
L
Linus Torvalds 已提交
661
	int count = 0, startnum = 0, endnum = 0;
J
Jan Kara 已提交
662
	uint32_t elen = 0, tmpelen;
663
	struct kernel_lb_addr eloc, tmpeloc;
L
Linus Torvalds 已提交
664
	int c = 1;
665 666 667
	loff_t lbcount = 0, b_off = 0;
	uint32_t newblocknum, newblock;
	sector_t offset = 0;
L
Linus Torvalds 已提交
668
	int8_t etype;
669 670
	struct udf_inode_info *iinfo = UDF_I(inode);
	int goal = 0, pgoal = iinfo->i_location.logicalBlockNum;
J
Jan Kara 已提交
671
	int lastblock = 0;
672
	bool isBeyondEOF;
L
Linus Torvalds 已提交
673

674 675
	*err = 0;
	*new = 0;
J
Jan Kara 已提交
676
	prev_epos.offset = udf_file_entry_alloc_offset(inode);
677
	prev_epos.block = iinfo->i_location;
J
Jan Kara 已提交
678 679
	prev_epos.bh = NULL;
	cur_epos = next_epos = prev_epos;
680
	b_off = (loff_t)block << inode->i_sb->s_blocksize_bits;
L
Linus Torvalds 已提交
681 682

	/* find the extent which contains the block we are looking for.
683 684 685 686
	   alternate between laarr[0] and laarr[1] for locations of the
	   current extent, and the previous extent */
	do {
		if (prev_epos.bh != cur_epos.bh) {
J
Jan Kara 已提交
687 688
			brelse(prev_epos.bh);
			get_bh(cur_epos.bh);
J
Jan Kara 已提交
689
			prev_epos.bh = cur_epos.bh;
L
Linus Torvalds 已提交
690
		}
691
		if (cur_epos.bh != next_epos.bh) {
J
Jan Kara 已提交
692 693
			brelse(cur_epos.bh);
			get_bh(next_epos.bh);
J
Jan Kara 已提交
694
			cur_epos.bh = next_epos.bh;
L
Linus Torvalds 已提交
695 696 697 698
		}

		lbcount += elen;

J
Jan Kara 已提交
699 700
		prev_epos.block = cur_epos.block;
		cur_epos.block = next_epos.block;
L
Linus Torvalds 已提交
701

J
Jan Kara 已提交
702 703
		prev_epos.offset = cur_epos.offset;
		cur_epos.offset = next_epos.offset;
L
Linus Torvalds 已提交
704

M
Marcin Slusarz 已提交
705 706
		etype = udf_next_aext(inode, &next_epos, &eloc, &elen, 1);
		if (etype == -1)
L
Linus Torvalds 已提交
707 708 709 710 711 712 713 714 715
			break;

		c = !c;

		laarr[c].extLength = (etype << 30) | elen;
		laarr[c].extLocation = eloc;

		if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
			pgoal = eloc.logicalBlockNum +
716 717
				((elen + inode->i_sb->s_blocksize - 1) >>
				 inode->i_sb->s_blocksize_bits);
L
Linus Torvalds 已提交
718

719
		count++;
L
Linus Torvalds 已提交
720 721 722 723
	} while (lbcount + elen <= b_off);

	b_off -= lbcount;
	offset = b_off >> inode->i_sb->s_blocksize_bits;
J
Jan Kara 已提交
724 725 726 727 728 729
	/*
	 * Move prev_epos and cur_epos into indirect extent if we are at
	 * the pointer to it
	 */
	udf_next_aext(inode, &prev_epos, &tmpeloc, &tmpelen, 0);
	udf_next_aext(inode, &cur_epos, &tmpeloc, &tmpelen, 0);
L
Linus Torvalds 已提交
730 731

	/* if the extent is allocated and recorded, return the block
732
	   if the extent is not a multiple of the blocksize, round up */
L
Linus Torvalds 已提交
733

734 735
	if (etype == (EXT_RECORDED_ALLOCATED >> 30)) {
		if (elen & (inode->i_sb->s_blocksize - 1)) {
L
Linus Torvalds 已提交
736
			elen = EXT_RECORDED_ALLOCATED |
737 738
				((elen + inode->i_sb->s_blocksize - 1) &
				 ~(inode->i_sb->s_blocksize - 1));
739
			udf_write_aext(inode, &cur_epos, &eloc, elen, 1);
L
Linus Torvalds 已提交
740
		}
741
		newblock = udf_get_lb_pblock(inode->i_sb, &eloc, offset);
F
Fabian Frederick 已提交
742
		goto out_free;
L
Linus Torvalds 已提交
743 744
	}

J
Jan Kara 已提交
745
	/* Are we beyond EOF? */
746
	if (etype == -1) {
J
Jan Kara 已提交
747
		int ret;
748
		isBeyondEOF = true;
J
Jan Kara 已提交
749 750 751 752
		if (count) {
			if (c)
				laarr[0] = laarr[1];
			startnum = 1;
753
		} else {
J
Jan Kara 已提交
754
			/* Create a fake extent when there's not one */
M
Marcin Slusarz 已提交
755
			memset(&laarr[0].extLocation, 0x00,
756
				sizeof(struct kernel_lb_addr));
J
Jan Kara 已提交
757
			laarr[0].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED;
758
			/* Will udf_do_extend_file() create real extent from
M
Marcin Slusarz 已提交
759
			   a fake one? */
J
Jan Kara 已提交
760 761 762
			startnum = (offset > 0);
		}
		/* Create extents for the hole between EOF and offset */
763 764 765
		ret = udf_do_extend_file(inode, &prev_epos, laarr, offset);
		if (ret < 0) {
			*err = ret;
F
Fabian Frederick 已提交
766 767
			newblock = 0;
			goto out_free;
J
Jan Kara 已提交
768 769 770 771 772
		}
		c = 0;
		offset = 0;
		count += ret;
		/* We are not covered by a preallocated extent? */
M
Marcin Slusarz 已提交
773 774
		if ((laarr[0].extLength & UDF_EXTENT_FLAG_MASK) !=
						EXT_NOT_RECORDED_ALLOCATED) {
J
Jan Kara 已提交
775 776 777 778 779
			/* Is there any real extent? - otherwise we overwrite
			 * the fake one... */
			if (count)
				c = !c;
			laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
780
				inode->i_sb->s_blocksize;
M
Marcin Slusarz 已提交
781
			memset(&laarr[c].extLocation, 0x00,
782
				sizeof(struct kernel_lb_addr));
783
			count++;
J
Jan Kara 已提交
784
		}
785
		endnum = c + 1;
L
Linus Torvalds 已提交
786
		lastblock = 1;
787
	} else {
788
		isBeyondEOF = false;
L
Linus Torvalds 已提交
789 790
		endnum = startnum = ((count > 2) ? 2 : count);

M
Marcin Slusarz 已提交
791 792
		/* if the current extent is in position 0,
		   swap it with the previous */
793
		if (!c && count != 1) {
J
Jan Kara 已提交
794 795 796 797 798
			laarr[2] = laarr[0];
			laarr[0] = laarr[1];
			laarr[1] = laarr[2];
			c = 1;
		}
L
Linus Torvalds 已提交
799

M
Marcin Slusarz 已提交
800 801 802 803
		/* if the current block is located in an extent,
		   read the next extent */
		etype = udf_next_aext(inode, &next_epos, &eloc, &elen, 0);
		if (etype != -1) {
804 805 806 807 808
			laarr[c + 1].extLength = (etype << 30) | elen;
			laarr[c + 1].extLocation = eloc;
			count++;
			startnum++;
			endnum++;
M
Marcin Slusarz 已提交
809
		} else
L
Linus Torvalds 已提交
810 811 812 813
			lastblock = 1;
	}

	/* if the current extent is not recorded but allocated, get the
814
	 * block in the extent corresponding to the requested block */
M
Marcin Slusarz 已提交
815
	if ((laarr[c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
L
Linus Torvalds 已提交
816
		newblocknum = laarr[c].extLocation.logicalBlockNum + offset;
M
Marcin Slusarz 已提交
817
	else { /* otherwise, allocate a new block */
818 819
		if (iinfo->i_next_alloc_block == block)
			goal = iinfo->i_next_alloc_goal;
L
Linus Torvalds 已提交
820

821
		if (!goal) {
M
Marcin Slusarz 已提交
822
			if (!(goal = pgoal)) /* XXX: what was intended here? */
823
				goal = iinfo->i_location.logicalBlockNum + 1;
L
Linus Torvalds 已提交
824 825
		}

M
Marcin Slusarz 已提交
826
		newblocknum = udf_new_block(inode->i_sb, inode,
827
				iinfo->i_location.partitionReferenceNum,
M
Marcin Slusarz 已提交
828 829
				goal, err);
		if (!newblocknum) {
L
Linus Torvalds 已提交
830
			*err = -ENOSPC;
F
Fabian Frederick 已提交
831 832
			newblock = 0;
			goto out_free;
L
Linus Torvalds 已提交
833
		}
834 835
		if (isBeyondEOF)
			iinfo->i_lenExtents += inode->i_sb->s_blocksize;
L
Linus Torvalds 已提交
836 837
	}

M
Marcin Slusarz 已提交
838 839 840 841
	/* if the extent the requsted block is located in contains multiple
	 * blocks, split the extent into at most three extents. blocks prior
	 * to requested block, requested block, and blocks after requested
	 * block */
L
Linus Torvalds 已提交
842 843
	udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum);

844 845 846 847 848 849
	/* We preallocate blocks only for regular files. It also makes sense
	 * for directories but there's a problem when to drop the
	 * preallocation. We might use some delayed work for that but I feel
	 * it's overengineering for a filesystem like UDF. */
	if (S_ISREG(inode->i_mode))
		udf_prealloc_extents(inode, c, lastblock, laarr, &endnum);
L
Linus Torvalds 已提交
850 851 852 853 854

	/* merge any continuous blocks in laarr */
	udf_merge_extents(inode, laarr, &endnum);

	/* write back the new extents, inserting new extents if the new number
855 856
	 * of extents is greater than the old number, and deleting extents if
	 * the new number of extents is less than the old number */
J
Jan Kara 已提交
857
	udf_update_extents(inode, laarr, startnum, endnum, &prev_epos);
L
Linus Torvalds 已提交
858

M
Marcin Slusarz 已提交
859
	newblock = udf_get_pblock(inode->i_sb, newblocknum,
860
				iinfo->i_location.partitionReferenceNum, 0);
861 862
	if (!newblock) {
		*err = -EIO;
F
Fabian Frederick 已提交
863
		goto out_free;
864
	}
L
Linus Torvalds 已提交
865
	*new = 1;
866 867
	iinfo->i_next_alloc_block = block;
	iinfo->i_next_alloc_goal = newblocknum;
868
	inode->i_ctime = current_time(inode);
L
Linus Torvalds 已提交
869 870 871 872 873

	if (IS_SYNC(inode))
		udf_sync_inode(inode);
	else
		mark_inode_dirty(inode);
F
Fabian Frederick 已提交
874 875 876 877
out_free:
	brelse(prev_epos.bh);
	brelse(cur_epos.bh);
	brelse(next_epos.bh);
878
	return newblock;
L
Linus Torvalds 已提交
879 880
}

881
static void udf_split_extents(struct inode *inode, int *c, int offset,
882
			      int newblocknum, struct kernel_long_ad *laarr,
883
			      int *endnum)
L
Linus Torvalds 已提交
884
{
M
Marcin Slusarz 已提交
885 886 887
	unsigned long blocksize = inode->i_sb->s_blocksize;
	unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;

L
Linus Torvalds 已提交
888
	if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) ||
M
Marcin Slusarz 已提交
889 890
	    (laarr[*c].extLength >> 30) ==
				(EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) {
L
Linus Torvalds 已提交
891 892
		int curr = *c;
		int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) +
M
Marcin Slusarz 已提交
893
			    blocksize - 1) >> blocksize_bits;
L
Linus Torvalds 已提交
894 895
		int8_t etype = (laarr[curr].extLength >> 30);

M
Marcin Slusarz 已提交
896
		if (blen == 1)
897
			;
M
Marcin Slusarz 已提交
898
		else if (!offset || blen == offset + 1) {
899 900 901 902 903 904 905 906 907
			laarr[curr + 2] = laarr[curr + 1];
			laarr[curr + 1] = laarr[curr];
		} else {
			laarr[curr + 3] = laarr[curr + 1];
			laarr[curr + 2] = laarr[curr + 1] = laarr[curr];
		}

		if (offset) {
			if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30)) {
M
Marcin Slusarz 已提交
908
				udf_free_blocks(inode->i_sb, inode,
909
						&laarr[curr].extLocation,
M
Marcin Slusarz 已提交
910 911 912 913
						0, offset);
				laarr[curr].extLength =
					EXT_NOT_RECORDED_NOT_ALLOCATED |
					(offset << blocksize_bits);
L
Linus Torvalds 已提交
914
				laarr[curr].extLocation.logicalBlockNum = 0;
M
Marcin Slusarz 已提交
915 916 917
				laarr[curr].extLocation.
						partitionReferenceNum = 0;
			} else
L
Linus Torvalds 已提交
918
				laarr[curr].extLength = (etype << 30) |
M
Marcin Slusarz 已提交
919
					(offset << blocksize_bits);
920 921 922
			curr++;
			(*c)++;
			(*endnum)++;
L
Linus Torvalds 已提交
923
		}
924

L
Linus Torvalds 已提交
925 926 927
		laarr[curr].extLocation.logicalBlockNum = newblocknum;
		if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
			laarr[curr].extLocation.partitionReferenceNum =
928
				UDF_I(inode)->i_location.partitionReferenceNum;
L
Linus Torvalds 已提交
929
		laarr[curr].extLength = EXT_RECORDED_ALLOCATED |
M
Marcin Slusarz 已提交
930
			blocksize;
931
		curr++;
L
Linus Torvalds 已提交
932

933
		if (blen != offset + 1) {
L
Linus Torvalds 已提交
934
			if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
M
Marcin Slusarz 已提交
935 936
				laarr[curr].extLocation.logicalBlockNum +=
								offset + 1;
937
			laarr[curr].extLength = (etype << 30) |
M
Marcin Slusarz 已提交
938
				((blen - (offset + 1)) << blocksize_bits);
939 940
			curr++;
			(*endnum)++;
L
Linus Torvalds 已提交
941 942 943 944 945
		}
	}
}

static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
946
				 struct kernel_long_ad *laarr,
947
				 int *endnum)
L
Linus Torvalds 已提交
948 949 950
{
	int start, length = 0, currlength = 0, i;

951
	if (*endnum >= (c + 1)) {
L
Linus Torvalds 已提交
952 953 954 955
		if (!lastblock)
			return;
		else
			start = c;
956
	} else {
M
Marcin Slusarz 已提交
957 958
		if ((laarr[c + 1].extLength >> 30) ==
					(EXT_NOT_RECORDED_ALLOCATED >> 30)) {
959
			start = c + 1;
M
Marcin Slusarz 已提交
960 961 962 963 964 965
			length = currlength =
				(((laarr[c + 1].extLength &
					UDF_EXTENT_LENGTH_MASK) +
				inode->i_sb->s_blocksize - 1) >>
				inode->i_sb->s_blocksize_bits);
		} else
L
Linus Torvalds 已提交
966 967 968
			start = c;
	}

969 970
	for (i = start + 1; i <= *endnum; i++) {
		if (i == *endnum) {
L
Linus Torvalds 已提交
971 972
			if (lastblock)
				length += UDF_DEFAULT_PREALLOC_BLOCKS;
M
Marcin Slusarz 已提交
973 974 975 976 977 978 979
		} else if ((laarr[i].extLength >> 30) ==
				(EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) {
			length += (((laarr[i].extLength &
						UDF_EXTENT_LENGTH_MASK) +
				    inode->i_sb->s_blocksize - 1) >>
				    inode->i_sb->s_blocksize_bits);
		} else
L
Linus Torvalds 已提交
980 981 982
			break;
	}

983
	if (length) {
L
Linus Torvalds 已提交
984
		int next = laarr[start].extLocation.logicalBlockNum +
985
			(((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) +
M
Marcin Slusarz 已提交
986 987
			  inode->i_sb->s_blocksize - 1) >>
			  inode->i_sb->s_blocksize_bits);
L
Linus Torvalds 已提交
988
		int numalloc = udf_prealloc_blocks(inode->i_sb, inode,
M
Marcin Slusarz 已提交
989 990 991 992
				laarr[start].extLocation.partitionReferenceNum,
				next, (UDF_DEFAULT_PREALLOC_BLOCKS > length ?
				length : UDF_DEFAULT_PREALLOC_BLOCKS) -
				currlength);
993
		if (numalloc) 	{
M
Marcin Slusarz 已提交
994
			if (start == (c + 1))
L
Linus Torvalds 已提交
995
				laarr[start].extLength +=
M
Marcin Slusarz 已提交
996 997 998
					(numalloc <<
					 inode->i_sb->s_blocksize_bits);
			else {
999
				memmove(&laarr[c + 2], &laarr[c + 1],
1000
					sizeof(struct long_ad) * (*endnum - (c + 1)));
1001 1002 1003
				(*endnum)++;
				laarr[c + 1].extLocation.logicalBlockNum = next;
				laarr[c + 1].extLocation.partitionReferenceNum =
M
Marcin Slusarz 已提交
1004 1005 1006 1007 1008 1009
					laarr[c].extLocation.
							partitionReferenceNum;
				laarr[c + 1].extLength =
					EXT_NOT_RECORDED_ALLOCATED |
					(numalloc <<
					 inode->i_sb->s_blocksize_bits);
1010
				start = c + 1;
L
Linus Torvalds 已提交
1011 1012
			}

1013
			for (i = start + 1; numalloc && i < *endnum; i++) {
M
Marcin Slusarz 已提交
1014 1015 1016 1017
				int elen = ((laarr[i].extLength &
						UDF_EXTENT_LENGTH_MASK) +
					    inode->i_sb->s_blocksize - 1) >>
					    inode->i_sb->s_blocksize_bits;
L
Linus Torvalds 已提交
1018

1019
				if (elen > numalloc) {
L
Linus Torvalds 已提交
1020
					laarr[i].extLength -=
M
Marcin Slusarz 已提交
1021 1022
						(numalloc <<
						 inode->i_sb->s_blocksize_bits);
L
Linus Torvalds 已提交
1023
					numalloc = 0;
1024
				} else {
L
Linus Torvalds 已提交
1025
					numalloc -= elen;
1026
					if (*endnum > (i + 1))
M
Marcin Slusarz 已提交
1027 1028
						memmove(&laarr[i],
							&laarr[i + 1],
1029
							sizeof(struct long_ad) *
M
Marcin Slusarz 已提交
1030
							(*endnum - (i + 1)));
1031 1032
					i--;
					(*endnum)--;
L
Linus Torvalds 已提交
1033 1034
				}
			}
1035
			UDF_I(inode)->i_lenExtents +=
M
Marcin Slusarz 已提交
1036
				numalloc << inode->i_sb->s_blocksize_bits;
L
Linus Torvalds 已提交
1037 1038 1039 1040
		}
	}
}

1041
static void udf_merge_extents(struct inode *inode, struct kernel_long_ad *laarr,
1042
			      int *endnum)
L
Linus Torvalds 已提交
1043 1044
{
	int i;
M
Marcin Slusarz 已提交
1045 1046
	unsigned long blocksize = inode->i_sb->s_blocksize;
	unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;
L
Linus Torvalds 已提交
1047

1048
	for (i = 0; i < (*endnum - 1); i++) {
1049 1050
		struct kernel_long_ad *li /*l[i]*/ = &laarr[i];
		struct kernel_long_ad *lip1 /*l[i plus 1]*/ = &laarr[i + 1];
M
Marcin Slusarz 已提交
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083

		if (((li->extLength >> 30) == (lip1->extLength >> 30)) &&
			(((li->extLength >> 30) ==
				(EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) ||
			((lip1->extLocation.logicalBlockNum -
			  li->extLocation.logicalBlockNum) ==
			(((li->extLength & UDF_EXTENT_LENGTH_MASK) +
			blocksize - 1) >> blocksize_bits)))) {

			if (((li->extLength & UDF_EXTENT_LENGTH_MASK) +
				(lip1->extLength & UDF_EXTENT_LENGTH_MASK) +
				blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK) {
				lip1->extLength = (lip1->extLength -
						  (li->extLength &
						   UDF_EXTENT_LENGTH_MASK) +
						   UDF_EXTENT_LENGTH_MASK) &
							~(blocksize - 1);
				li->extLength = (li->extLength &
						 UDF_EXTENT_FLAG_MASK) +
						(UDF_EXTENT_LENGTH_MASK + 1) -
						blocksize;
				lip1->extLocation.logicalBlockNum =
					li->extLocation.logicalBlockNum +
					((li->extLength &
						UDF_EXTENT_LENGTH_MASK) >>
						blocksize_bits);
			} else {
				li->extLength = lip1->extLength +
					(((li->extLength &
						UDF_EXTENT_LENGTH_MASK) +
					 blocksize - 1) & ~(blocksize - 1));
				if (*endnum > (i + 2))
					memmove(&laarr[i + 1], &laarr[i + 2],
1084
						sizeof(struct long_ad) *
M
Marcin Slusarz 已提交
1085 1086 1087
						(*endnum - (i + 2)));
				i--;
				(*endnum)--;
L
Linus Torvalds 已提交
1088
			}
M
Marcin Slusarz 已提交
1089 1090 1091 1092
		} else if (((li->extLength >> 30) ==
				(EXT_NOT_RECORDED_ALLOCATED >> 30)) &&
			   ((lip1->extLength >> 30) ==
				(EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))) {
1093
			udf_free_blocks(inode->i_sb, inode, &li->extLocation, 0,
M
Marcin Slusarz 已提交
1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111
					((li->extLength &
					  UDF_EXTENT_LENGTH_MASK) +
					 blocksize - 1) >> blocksize_bits);
			li->extLocation.logicalBlockNum = 0;
			li->extLocation.partitionReferenceNum = 0;

			if (((li->extLength & UDF_EXTENT_LENGTH_MASK) +
			     (lip1->extLength & UDF_EXTENT_LENGTH_MASK) +
			     blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK) {
				lip1->extLength = (lip1->extLength -
						   (li->extLength &
						   UDF_EXTENT_LENGTH_MASK) +
						   UDF_EXTENT_LENGTH_MASK) &
						   ~(blocksize - 1);
				li->extLength = (li->extLength &
						 UDF_EXTENT_FLAG_MASK) +
						(UDF_EXTENT_LENGTH_MASK + 1) -
						blocksize;
1112
			} else {
M
Marcin Slusarz 已提交
1113 1114 1115 1116
				li->extLength = lip1->extLength +
					(((li->extLength &
						UDF_EXTENT_LENGTH_MASK) +
					  blocksize - 1) & ~(blocksize - 1));
1117 1118
				if (*endnum > (i + 2))
					memmove(&laarr[i + 1], &laarr[i + 2],
1119
						sizeof(struct long_ad) *
M
Marcin Slusarz 已提交
1120
						(*endnum - (i + 2)));
1121 1122
				i--;
				(*endnum)--;
L
Linus Torvalds 已提交
1123
			}
M
Marcin Slusarz 已提交
1124 1125 1126
		} else if ((li->extLength >> 30) ==
					(EXT_NOT_RECORDED_ALLOCATED >> 30)) {
			udf_free_blocks(inode->i_sb, inode,
1127
					&li->extLocation, 0,
M
Marcin Slusarz 已提交
1128 1129 1130 1131 1132 1133 1134 1135
					((li->extLength &
						UDF_EXTENT_LENGTH_MASK) +
					 blocksize - 1) >> blocksize_bits);
			li->extLocation.logicalBlockNum = 0;
			li->extLocation.partitionReferenceNum = 0;
			li->extLength = (li->extLength &
						UDF_EXTENT_LENGTH_MASK) |
						EXT_NOT_RECORDED_NOT_ALLOCATED;
L
Linus Torvalds 已提交
1136 1137 1138 1139
		}
	}
}

1140
static void udf_update_extents(struct inode *inode, struct kernel_long_ad *laarr,
1141 1142
			       int startnum, int endnum,
			       struct extent_position *epos)
L
Linus Torvalds 已提交
1143 1144
{
	int start = 0, i;
1145
	struct kernel_lb_addr tmploc;
L
Linus Torvalds 已提交
1146 1147
	uint32_t tmplen;

1148 1149
	if (startnum > endnum) {
		for (i = 0; i < (startnum - endnum); i++)
J
Jan Kara 已提交
1150
			udf_delete_aext(inode, *epos, laarr[i].extLocation,
1151 1152 1153
					laarr[i].extLength);
	} else if (startnum < endnum) {
		for (i = 0; i < (endnum - startnum); i++) {
J
Jan Kara 已提交
1154
			udf_insert_aext(inode, *epos, laarr[i].extLocation,
1155
					laarr[i].extLength);
J
Jan Kara 已提交
1156
			udf_next_aext(inode, epos, &laarr[i].extLocation,
1157 1158
				      &laarr[i].extLength, 1);
			start++;
L
Linus Torvalds 已提交
1159 1160 1161
		}
	}

1162
	for (i = start; i < endnum; i++) {
J
Jan Kara 已提交
1163
		udf_next_aext(inode, epos, &tmploc, &tmplen, 0);
1164
		udf_write_aext(inode, epos, &laarr[i].extLocation,
1165
			       laarr[i].extLength, 1);
L
Linus Torvalds 已提交
1166 1167 1168
	}
}

1169 1170
struct buffer_head *udf_bread(struct inode *inode, int block,
			      int create, int *err)
L
Linus Torvalds 已提交
1171
{
1172
	struct buffer_head *bh = NULL;
L
Linus Torvalds 已提交
1173 1174 1175 1176 1177 1178 1179

	bh = udf_getblk(inode, block, create, err);
	if (!bh)
		return NULL;

	if (buffer_uptodate(bh))
		return bh;
1180

1181
	ll_rw_block(REQ_OP_READ, 0, 1, &bh);
1182

L
Linus Torvalds 已提交
1183 1184 1185
	wait_on_buffer(bh);
	if (buffer_uptodate(bh))
		return bh;
1186

L
Linus Torvalds 已提交
1187 1188 1189 1190 1191
	brelse(bh);
	*err = -EIO;
	return NULL;
}

1192
int udf_setsize(struct inode *inode, loff_t newsize)
L
Linus Torvalds 已提交
1193 1194
{
	int err;
1195
	struct udf_inode_info *iinfo;
1196
	int bsize = 1 << inode->i_blkbits;
L
Linus Torvalds 已提交
1197 1198

	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1199
	      S_ISLNK(inode->i_mode)))
1200
		return -EINVAL;
L
Linus Torvalds 已提交
1201
	if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
1202
		return -EPERM;
L
Linus Torvalds 已提交
1203

1204
	iinfo = UDF_I(inode);
1205
	if (newsize > inode->i_size) {
1206
		down_write(&iinfo->i_data_sem);
1207 1208 1209 1210
		if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
			if (bsize <
			    (udf_file_entry_alloc_offset(inode) + newsize)) {
				err = udf_expand_file_adinicb(inode);
1211
				if (err)
1212
					return err;
1213
				down_write(&iinfo->i_data_sem);
1214
			} else {
1215
				iinfo->i_lenAlloc = newsize;
1216 1217
				goto set_size;
			}
1218 1219 1220 1221 1222
		}
		err = udf_extend_file(inode, newsize);
		if (err) {
			up_write(&iinfo->i_data_sem);
			return err;
L
Linus Torvalds 已提交
1223
		}
1224
set_size:
1225
		truncate_setsize(inode, newsize);
1226
		up_write(&iinfo->i_data_sem);
1227
	} else {
1228 1229
		if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
			down_write(&iinfo->i_data_sem);
1230
			udf_clear_extent_cache(inode);
1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
			memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr + newsize,
			       0x00, bsize - newsize -
			       udf_file_entry_alloc_offset(inode));
			iinfo->i_lenAlloc = newsize;
			truncate_setsize(inode, newsize);
			up_write(&iinfo->i_data_sem);
			goto update_time;
		}
		err = block_truncate_page(inode->i_mapping, newsize,
					  udf_get_block);
		if (err)
			return err;
1243
		down_write(&iinfo->i_data_sem);
1244
		udf_clear_extent_cache(inode);
1245
		truncate_setsize(inode, newsize);
L
Linus Torvalds 已提交
1246
		udf_truncate_extents(inode);
1247
		up_write(&iinfo->i_data_sem);
1248
	}
1249
update_time:
1250
	inode->i_mtime = inode->i_ctime = current_time(inode);
L
Linus Torvalds 已提交
1251
	if (IS_SYNC(inode))
1252
		udf_sync_inode(inode);
L
Linus Torvalds 已提交
1253 1254
	else
		mark_inode_dirty(inode);
1255
	return 0;
L
Linus Torvalds 已提交
1256 1257
}

1258 1259 1260 1261 1262 1263 1264
/*
 * Maximum length of linked list formed by ICB hierarchy. The chosen number is
 * arbitrary - just that we hopefully don't limit any real use of rewritten
 * inode on write-once media but avoid looping for too long on corrupted media.
 */
#define UDF_MAX_ICB_NESTING 1024

J
Jan Kara 已提交
1265
static int udf_read_inode(struct inode *inode, bool hidden_inode)
L
Linus Torvalds 已提交
1266 1267 1268
{
	struct buffer_head *bh = NULL;
	struct fileEntry *fe;
1269
	struct extendedFileEntry *efe;
L
Linus Torvalds 已提交
1270
	uint16_t ident;
1271
	struct udf_inode_info *iinfo = UDF_I(inode);
1272
	struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
1273
	struct kernel_lb_addr *iloc = &iinfo->i_location;
1274
	unsigned int link_count;
1275
	unsigned int indirections = 0;
J
Jan Kara 已提交
1276
	int bs = inode->i_sb->s_blocksize;
1277
	int ret = -EIO;
L
Linus Torvalds 已提交
1278

1279
reread:
1280 1281 1282 1283 1284 1285 1286
	if (iloc->logicalBlockNum >=
	    sbi->s_partmaps[iloc->partitionReferenceNum].s_partition_len) {
		udf_debug("block=%d, partition=%d out of range\n",
			  iloc->logicalBlockNum, iloc->partitionReferenceNum);
		return -EIO;
	}

L
Linus Torvalds 已提交
1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298
	/*
	 * Set defaults, but the inode is still incomplete!
	 * Note: get_new_inode() sets the following on a new inode:
	 *      i_sb = sb
	 *      i_no = ino
	 *      i_flags = sb->s_flags
	 *      i_state = 0
	 * clean_inode(): zero fills and sets
	 *      i_count = 1
	 *      i_nlink = 1
	 *      i_op = NULL;
	 */
1299
	bh = udf_read_ptagged(inode->i_sb, iloc, 0, &ident);
1300
	if (!bh) {
J
Joe Perches 已提交
1301
		udf_err(inode->i_sb, "(ino %ld) failed !bh\n", inode->i_ino);
1302
		return -EIO;
L
Linus Torvalds 已提交
1303 1304 1305
	}

	if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE &&
1306
	    ident != TAG_IDENT_USE) {
J
Joe Perches 已提交
1307 1308
		udf_err(inode->i_sb, "(ino %ld) failed ident=%d\n",
			inode->i_ino, ident);
1309
		goto out;
L
Linus Torvalds 已提交
1310 1311 1312
	}

	fe = (struct fileEntry *)bh->b_data;
1313
	efe = (struct extendedFileEntry *)bh->b_data;
L
Linus Torvalds 已提交
1314

1315
	if (fe->icbTag.strategyType == cpu_to_le16(4096)) {
1316
		struct buffer_head *ibh;
L
Linus Torvalds 已提交
1317

1318
		ibh = udf_read_ptagged(inode->i_sb, iloc, 1, &ident);
1319
		if (ident == TAG_IDENT_IE && ibh) {
1320
			struct kernel_lb_addr loc;
1321 1322 1323 1324 1325
			struct indirectEntry *ie;

			ie = (struct indirectEntry *)ibh->b_data;
			loc = lelb_to_cpu(ie->indirectICB.extLocation);

1326 1327 1328 1329 1330 1331 1332 1333 1334
			if (ie->indirectICB.extLength) {
				brelse(ibh);
				memcpy(&iinfo->i_location, &loc,
				       sizeof(struct kernel_lb_addr));
				if (++indirections > UDF_MAX_ICB_NESTING) {
					udf_err(inode->i_sb,
						"too many ICBs in ICB hierarchy"
						" (max %d supported)\n",
						UDF_MAX_ICB_NESTING);
1335
					goto out;
1336
				}
1337
				brelse(bh);
1338
				goto reread;
L
Linus Torvalds 已提交
1339
			}
1340
		}
1341
		brelse(ibh);
1342
	} else if (fe->icbTag.strategyType != cpu_to_le16(4)) {
J
Joe Perches 已提交
1343 1344
		udf_err(inode->i_sb, "unsupported strategy type: %d\n",
			le16_to_cpu(fe->icbTag.strategyType));
1345
		goto out;
L
Linus Torvalds 已提交
1346
	}
1347
	if (fe->icbTag.strategyType == cpu_to_le16(4))
1348
		iinfo->i_strat4096 = 0;
1349
	else /* if (fe->icbTag.strategyType == cpu_to_le16(4096)) */
1350
		iinfo->i_strat4096 = 1;
L
Linus Torvalds 已提交
1351

1352
	iinfo->i_alloc_type = le16_to_cpu(fe->icbTag.flags) &
M
Marcin Slusarz 已提交
1353
							ICBTAG_FLAG_AD_MASK;
1354 1355 1356 1357 1358 1359
	iinfo->i_unique = 0;
	iinfo->i_lenEAttr = 0;
	iinfo->i_lenExtents = 0;
	iinfo->i_lenAlloc = 0;
	iinfo->i_next_alloc_block = 0;
	iinfo->i_next_alloc_goal = 0;
1360
	if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_EFE)) {
1361 1362
		iinfo->i_efe = 1;
		iinfo->i_use = 0;
J
Jan Kara 已提交
1363
		ret = udf_alloc_i_data(inode, bs -
1364 1365 1366
					sizeof(struct extendedFileEntry));
		if (ret)
			goto out;
1367
		memcpy(iinfo->i_ext.i_data,
M
Marcin Slusarz 已提交
1368
		       bh->b_data + sizeof(struct extendedFileEntry),
J
Jan Kara 已提交
1369
		       bs - sizeof(struct extendedFileEntry));
1370
	} else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_FE)) {
1371 1372
		iinfo->i_efe = 0;
		iinfo->i_use = 0;
J
Jan Kara 已提交
1373
		ret = udf_alloc_i_data(inode, bs - sizeof(struct fileEntry));
1374 1375
		if (ret)
			goto out;
1376
		memcpy(iinfo->i_ext.i_data,
1377
		       bh->b_data + sizeof(struct fileEntry),
J
Jan Kara 已提交
1378
		       bs - sizeof(struct fileEntry));
1379
	} else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_USE)) {
1380 1381 1382
		iinfo->i_efe = 0;
		iinfo->i_use = 1;
		iinfo->i_lenAlloc = le32_to_cpu(
M
Marcin Slusarz 已提交
1383 1384
				((struct unallocSpaceEntry *)bh->b_data)->
				 lengthAllocDescs);
J
Jan Kara 已提交
1385
		ret = udf_alloc_i_data(inode, bs -
1386 1387 1388
					sizeof(struct unallocSpaceEntry));
		if (ret)
			goto out;
1389
		memcpy(iinfo->i_ext.i_data,
M
Marcin Slusarz 已提交
1390
		       bh->b_data + sizeof(struct unallocSpaceEntry),
J
Jan Kara 已提交
1391
		       bs - sizeof(struct unallocSpaceEntry));
1392
		return 0;
L
Linus Torvalds 已提交
1393 1394
	}

1395
	ret = -EIO;
1396
	read_lock(&sbi->s_cred_lock);
1397 1398
	i_uid_write(inode, le32_to_cpu(fe->uid));
	if (!uid_valid(inode->i_uid) ||
1399 1400
	    UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_IGNORE) ||
	    UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_SET))
1401
		inode->i_uid = UDF_SB(inode->i_sb)->s_uid;
L
Linus Torvalds 已提交
1402

1403 1404
	i_gid_write(inode, le32_to_cpu(fe->gid));
	if (!gid_valid(inode->i_gid) ||
1405 1406
	    UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_IGNORE) ||
	    UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_SET))
1407
		inode->i_gid = UDF_SB(inode->i_sb)->s_gid;
L
Linus Torvalds 已提交
1408

1409
	if (fe->icbTag.fileType != ICBTAG_FILE_TYPE_DIRECTORY &&
1410
			sbi->s_fmode != UDF_INVALID_MODE)
1411 1412
		inode->i_mode = sbi->s_fmode;
	else if (fe->icbTag.fileType == ICBTAG_FILE_TYPE_DIRECTORY &&
1413
			sbi->s_dmode != UDF_INVALID_MODE)
1414 1415 1416 1417
		inode->i_mode = sbi->s_dmode;
	else
		inode->i_mode = udf_convert_permissions(fe);
	inode->i_mode &= ~sbi->s_umask;
1418 1419
	read_unlock(&sbi->s_cred_lock);

M
Miklos Szeredi 已提交
1420
	link_count = le16_to_cpu(fe->fileLinkCount);
J
Jan Kara 已提交
1421
	if (!link_count) {
J
Jan Kara 已提交
1422 1423 1424 1425 1426
		if (!hidden_inode) {
			ret = -ESTALE;
			goto out;
		}
		link_count = 1;
J
Jan Kara 已提交
1427
	}
M
Miklos Szeredi 已提交
1428
	set_nlink(inode, link_count);
1429 1430 1431

	inode->i_size = le64_to_cpu(fe->informationLength);
	iinfo->i_lenExtents = inode->i_size;
L
Linus Torvalds 已提交
1432

1433
	if (iinfo->i_efe == 0) {
L
Linus Torvalds 已提交
1434
		inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
1435
			(inode->i_sb->s_blocksize_bits - 9);
L
Linus Torvalds 已提交
1436

1437
		if (!udf_disk_stamp_to_time(&inode->i_atime, fe->accessTime))
1438 1439
			inode->i_atime = sbi->s_record_time;

1440 1441
		if (!udf_disk_stamp_to_time(&inode->i_mtime,
					    fe->modificationTime))
1442 1443
			inode->i_mtime = sbi->s_record_time;

1444
		if (!udf_disk_stamp_to_time(&inode->i_ctime, fe->attrTime))
1445
			inode->i_ctime = sbi->s_record_time;
L
Linus Torvalds 已提交
1446

1447 1448 1449
		iinfo->i_unique = le64_to_cpu(fe->uniqueID);
		iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
		iinfo->i_lenAlloc = le32_to_cpu(fe->lengthAllocDescs);
1450
		iinfo->i_checkpoint = le32_to_cpu(fe->checkpoint);
1451
	} else {
1452
		inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
1453
		    (inode->i_sb->s_blocksize_bits - 9);
L
Linus Torvalds 已提交
1454

1455
		if (!udf_disk_stamp_to_time(&inode->i_atime, efe->accessTime))
1456 1457
			inode->i_atime = sbi->s_record_time;

1458 1459
		if (!udf_disk_stamp_to_time(&inode->i_mtime,
					    efe->modificationTime))
1460 1461
			inode->i_mtime = sbi->s_record_time;

1462
		if (!udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime))
1463 1464
			iinfo->i_crtime = sbi->s_record_time;

1465
		if (!udf_disk_stamp_to_time(&inode->i_ctime, efe->attrTime))
1466
			inode->i_ctime = sbi->s_record_time;
L
Linus Torvalds 已提交
1467

1468 1469 1470
		iinfo->i_unique = le64_to_cpu(efe->uniqueID);
		iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr);
		iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs);
1471
		iinfo->i_checkpoint = le32_to_cpu(efe->checkpoint);
L
Linus Torvalds 已提交
1472
	}
J
Jan Kara 已提交
1473
	inode->i_generation = iinfo->i_unique;
L
Linus Torvalds 已提交
1474

1475 1476 1477 1478 1479 1480 1481 1482 1483
	/*
	 * Sanity check length of allocation descriptors and extended attrs to
	 * avoid integer overflows
	 */
	if (iinfo->i_lenEAttr > bs || iinfo->i_lenAlloc > bs)
		goto out;
	/* Now do exact checks */
	if (udf_file_entry_alloc_offset(inode) + iinfo->i_lenAlloc > bs)
		goto out;
J
Jan Kara 已提交
1484 1485 1486 1487 1488 1489 1490 1491 1492
	/* Sanity checks for files in ICB so that we don't get confused later */
	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
		/*
		 * For file in ICB data is stored in allocation descriptor
		 * so sizes should match
		 */
		if (iinfo->i_lenAlloc != inode->i_size)
			goto out;
		/* File in ICB has to fit in there... */
J
Jan Kara 已提交
1493
		if (inode->i_size > bs - udf_file_entry_alloc_offset(inode))
J
Jan Kara 已提交
1494 1495 1496
			goto out;
	}

1497 1498
	switch (fe->icbTag.fileType) {
	case ICBTAG_FILE_TYPE_DIRECTORY:
1499 1500 1501 1502 1503
		inode->i_op = &udf_dir_inode_operations;
		inode->i_fop = &udf_dir_operations;
		inode->i_mode |= S_IFDIR;
		inc_nlink(inode);
		break;
1504 1505 1506
	case ICBTAG_FILE_TYPE_REALTIME:
	case ICBTAG_FILE_TYPE_REGULAR:
	case ICBTAG_FILE_TYPE_UNDEF:
J
Jan Kara 已提交
1507
	case ICBTAG_FILE_TYPE_VAT20:
1508
		if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1509 1510 1511 1512 1513 1514 1515
			inode->i_data.a_ops = &udf_adinicb_aops;
		else
			inode->i_data.a_ops = &udf_aops;
		inode->i_op = &udf_file_inode_operations;
		inode->i_fop = &udf_file_operations;
		inode->i_mode |= S_IFREG;
		break;
1516
	case ICBTAG_FILE_TYPE_BLOCK:
1517 1518
		inode->i_mode |= S_IFBLK;
		break;
1519
	case ICBTAG_FILE_TYPE_CHAR:
1520 1521
		inode->i_mode |= S_IFCHR;
		break;
1522
	case ICBTAG_FILE_TYPE_FIFO:
1523 1524
		init_special_inode(inode, inode->i_mode | S_IFIFO, 0);
		break;
1525
	case ICBTAG_FILE_TYPE_SOCKET:
1526 1527
		init_special_inode(inode, inode->i_mode | S_IFSOCK, 0);
		break;
1528
	case ICBTAG_FILE_TYPE_SYMLINK:
1529
		inode->i_data.a_ops = &udf_symlink_aops;
1530
		inode->i_op = &udf_symlink_inode_operations;
1531
		inode_nohighmem(inode);
1532 1533
		inode->i_mode = S_IFLNK | S_IRWXUGO;
		break;
1534 1535 1536 1537 1538 1539 1540 1541 1542
	case ICBTAG_FILE_TYPE_MAIN:
		udf_debug("METADATA FILE-----\n");
		break;
	case ICBTAG_FILE_TYPE_MIRROR:
		udf_debug("METADATA MIRROR FILE-----\n");
		break;
	case ICBTAG_FILE_TYPE_BITMAP:
		udf_debug("METADATA BITMAP FILE-----\n");
		break;
1543
	default:
J
Joe Perches 已提交
1544 1545
		udf_err(inode->i_sb, "(ino %ld) failed unknown file type=%d\n",
			inode->i_ino, fe->icbTag.fileType);
1546
		goto out;
L
Linus Torvalds 已提交
1547
	}
1548
	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
M
Marcin Slusarz 已提交
1549 1550
		struct deviceSpec *dsea =
			(struct deviceSpec *)udf_get_extendedattr(inode, 12, 1);
1551 1552
		if (dsea) {
			init_special_inode(inode, inode->i_mode,
M
Marcin Slusarz 已提交
1553 1554
				MKDEV(le32_to_cpu(dsea->majorDeviceIdent),
				      le32_to_cpu(dsea->minorDeviceIdent)));
L
Linus Torvalds 已提交
1555
			/* Developer ID ??? */
M
Marcin Slusarz 已提交
1556
		} else
1557
			goto out;
L
Linus Torvalds 已提交
1558
	}
1559 1560
	ret = 0;
out:
1561
	brelse(bh);
1562
	return ret;
L
Linus Torvalds 已提交
1563 1564
}

1565 1566
static int udf_alloc_i_data(struct inode *inode, size_t size)
{
1567 1568
	struct udf_inode_info *iinfo = UDF_I(inode);
	iinfo->i_ext.i_data = kmalloc(size, GFP_KERNEL);
1569

1570
	if (!iinfo->i_ext.i_data) {
J
Joe Perches 已提交
1571 1572
		udf_err(inode->i_sb, "(ino %ld) no free memory\n",
			inode->i_ino);
1573 1574 1575 1576 1577 1578
		return -ENOMEM;
	}

	return 0;
}

A
Al Viro 已提交
1579
static umode_t udf_convert_permissions(struct fileEntry *fe)
L
Linus Torvalds 已提交
1580
{
A
Al Viro 已提交
1581
	umode_t mode;
L
Linus Torvalds 已提交
1582 1583 1584 1585 1586 1587
	uint32_t permissions;
	uint32_t flags;

	permissions = le32_to_cpu(fe->permissions);
	flags = le16_to_cpu(fe->icbTag.flags);

M
Marcin Slusarz 已提交
1588 1589 1590 1591 1592 1593
	mode =	((permissions) & S_IRWXO) |
		((permissions >> 2) & S_IRWXG) |
		((permissions >> 4) & S_IRWXU) |
		((flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) |
		((flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) |
		((flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0);
L
Linus Torvalds 已提交
1594 1595 1596 1597

	return mode;
}

1598
int udf_write_inode(struct inode *inode, struct writeback_control *wbc)
L
Linus Torvalds 已提交
1599
{
J
Jan Kara 已提交
1600
	return udf_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
L
Linus Torvalds 已提交
1601 1602
}

J
Jan Kara 已提交
1603
static int udf_sync_inode(struct inode *inode)
L
Linus Torvalds 已提交
1604 1605 1606 1607
{
	return udf_update_inode(inode, 1);
}

1608 1609 1610 1611 1612 1613 1614 1615
static void udf_adjust_time(struct udf_inode_info *iinfo, struct timespec time)
{
	if (iinfo->i_crtime.tv_sec > time.tv_sec ||
	    (iinfo->i_crtime.tv_sec == time.tv_sec &&
	     iinfo->i_crtime.tv_nsec > time.tv_nsec))
		iinfo->i_crtime = time;
}

1616
static int udf_update_inode(struct inode *inode, int do_sync)
L
Linus Torvalds 已提交
1617 1618 1619 1620
{
	struct buffer_head *bh = NULL;
	struct fileEntry *fe;
	struct extendedFileEntry *efe;
1621
	uint64_t lb_recorded;
L
Linus Torvalds 已提交
1622 1623 1624 1625
	uint32_t udfperms;
	uint16_t icbflags;
	uint16_t crclen;
	int err = 0;
M
Marcin Slusarz 已提交
1626
	struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
M
Marcin Slusarz 已提交
1627
	unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;
1628
	struct udf_inode_info *iinfo = UDF_I(inode);
L
Linus Torvalds 已提交
1629

1630 1631
	bh = udf_tgetblk(inode->i_sb,
			udf_get_lb_pblock(inode->i_sb, &iinfo->i_location, 0));
1632
	if (!bh) {
1633
		udf_debug("getblk failure\n");
1634
		return -EIO;
L
Linus Torvalds 已提交
1635 1636
	}

1637 1638
	lock_buffer(bh);
	memset(bh->b_data, 0, inode->i_sb->s_blocksize);
L
Linus Torvalds 已提交
1639 1640 1641
	fe = (struct fileEntry *)bh->b_data;
	efe = (struct extendedFileEntry *)bh->b_data;

1642
	if (iinfo->i_use) {
L
Linus Torvalds 已提交
1643
		struct unallocSpaceEntry *use =
1644
			(struct unallocSpaceEntry *)bh->b_data;
L
Linus Torvalds 已提交
1645

1646
		use->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc);
M
Marcin Slusarz 已提交
1647
		memcpy(bh->b_data + sizeof(struct unallocSpaceEntry),
1648
		       iinfo->i_ext.i_data, inode->i_sb->s_blocksize -
M
Marcin Slusarz 已提交
1649
					sizeof(struct unallocSpaceEntry));
1650
		use->descTag.tagIdent = cpu_to_le16(TAG_IDENT_USE);
1651
		crclen = sizeof(struct unallocSpaceEntry);
L
Linus Torvalds 已提交
1652

1653
		goto finish;
L
Linus Torvalds 已提交
1654 1655
	}

1656 1657
	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET))
		fe->uid = cpu_to_le32(-1);
1658
	else
1659
		fe->uid = cpu_to_le32(i_uid_read(inode));
L
Linus Torvalds 已提交
1660

1661 1662
	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_FORGET))
		fe->gid = cpu_to_le32(-1);
1663
	else
1664
		fe->gid = cpu_to_le32(i_gid_read(inode));
L
Linus Torvalds 已提交
1665

M
Marcin Slusarz 已提交
1666 1667 1668
	udfperms = ((inode->i_mode & S_IRWXO)) |
		   ((inode->i_mode & S_IRWXG) << 2) |
		   ((inode->i_mode & S_IRWXU) << 4);
L
Linus Torvalds 已提交
1669

M
Marcin Slusarz 已提交
1670 1671 1672 1673
	udfperms |= (le32_to_cpu(fe->permissions) &
		    (FE_PERM_O_DELETE | FE_PERM_O_CHATTR |
		     FE_PERM_G_DELETE | FE_PERM_G_CHATTR |
		     FE_PERM_U_DELETE | FE_PERM_U_CHATTR));
L
Linus Torvalds 已提交
1674 1675
	fe->permissions = cpu_to_le32(udfperms);

1676
	if (S_ISDIR(inode->i_mode) && inode->i_nlink > 0)
L
Linus Torvalds 已提交
1677 1678 1679 1680 1681 1682
		fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1);
	else
		fe->fileLinkCount = cpu_to_le16(inode->i_nlink);

	fe->informationLength = cpu_to_le64(inode->i_size);

1683
	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
1684
		struct regid *eid;
1685 1686
		struct deviceSpec *dsea =
			(struct deviceSpec *)udf_get_extendedattr(inode, 12, 1);
1687
		if (!dsea) {
L
Linus Torvalds 已提交
1688
			dsea = (struct deviceSpec *)
1689 1690
				udf_add_extendedattr(inode,
						     sizeof(struct deviceSpec) +
1691
						     sizeof(struct regid), 12, 0x3);
L
Linus Torvalds 已提交
1692 1693
			dsea->attrType = cpu_to_le32(12);
			dsea->attrSubtype = 1;
M
Marcin Slusarz 已提交
1694 1695
			dsea->attrLength = cpu_to_le32(
						sizeof(struct deviceSpec) +
1696 1697
						sizeof(struct regid));
			dsea->impUseLength = cpu_to_le32(sizeof(struct regid));
L
Linus Torvalds 已提交
1698
		}
1699 1700
		eid = (struct regid *)dsea->impUse;
		memset(eid, 0, sizeof(struct regid));
L
Linus Torvalds 已提交
1701 1702 1703 1704 1705 1706 1707
		strcpy(eid->ident, UDF_ID_DEVELOPER);
		eid->identSuffix[0] = UDF_OS_CLASS_UNIX;
		eid->identSuffix[1] = UDF_OS_ID_LINUX;
		dsea->majorDeviceIdent = cpu_to_le32(imajor(inode));
		dsea->minorDeviceIdent = cpu_to_le32(iminor(inode));
	}

1708 1709 1710 1711 1712 1713 1714
	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
		lb_recorded = 0; /* No extents => no blocks! */
	else
		lb_recorded =
			(inode->i_blocks + (1 << (blocksize_bits - 9)) - 1) >>
			(blocksize_bits - 9);

1715
	if (iinfo->i_efe == 0) {
1716
		memcpy(bh->b_data + sizeof(struct fileEntry),
1717
		       iinfo->i_ext.i_data,
1718
		       inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1719
		fe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
L
Linus Torvalds 已提交
1720

1721 1722 1723
		udf_time_to_disk_stamp(&fe->accessTime, inode->i_atime);
		udf_time_to_disk_stamp(&fe->modificationTime, inode->i_mtime);
		udf_time_to_disk_stamp(&fe->attrTime, inode->i_ctime);
1724
		memset(&(fe->impIdent), 0, sizeof(struct regid));
L
Linus Torvalds 已提交
1725 1726 1727
		strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
		fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
		fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1728 1729 1730
		fe->uniqueID = cpu_to_le64(iinfo->i_unique);
		fe->lengthExtendedAttr = cpu_to_le32(iinfo->i_lenEAttr);
		fe->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc);
1731
		fe->checkpoint = cpu_to_le32(iinfo->i_checkpoint);
L
Linus Torvalds 已提交
1732 1733
		fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE);
		crclen = sizeof(struct fileEntry);
1734
	} else {
M
Marcin Slusarz 已提交
1735
		memcpy(bh->b_data + sizeof(struct extendedFileEntry),
1736
		       iinfo->i_ext.i_data,
M
Marcin Slusarz 已提交
1737 1738
		       inode->i_sb->s_blocksize -
					sizeof(struct extendedFileEntry));
L
Linus Torvalds 已提交
1739
		efe->objectSize = cpu_to_le64(inode->i_size);
1740
		efe->logicalBlocksRecorded = cpu_to_le64(lb_recorded);
L
Linus Torvalds 已提交
1741

1742 1743 1744
		udf_adjust_time(iinfo, inode->i_atime);
		udf_adjust_time(iinfo, inode->i_mtime);
		udf_adjust_time(iinfo, inode->i_ctime);
L
Linus Torvalds 已提交
1745

1746 1747 1748 1749
		udf_time_to_disk_stamp(&efe->accessTime, inode->i_atime);
		udf_time_to_disk_stamp(&efe->modificationTime, inode->i_mtime);
		udf_time_to_disk_stamp(&efe->createTime, iinfo->i_crtime);
		udf_time_to_disk_stamp(&efe->attrTime, inode->i_ctime);
L
Linus Torvalds 已提交
1750

1751
		memset(&(efe->impIdent), 0, sizeof(struct regid));
L
Linus Torvalds 已提交
1752 1753 1754
		strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
		efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
		efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1755 1756 1757
		efe->uniqueID = cpu_to_le64(iinfo->i_unique);
		efe->lengthExtendedAttr = cpu_to_le32(iinfo->i_lenEAttr);
		efe->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc);
1758
		efe->checkpoint = cpu_to_le32(iinfo->i_checkpoint);
L
Linus Torvalds 已提交
1759 1760 1761
		efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE);
		crclen = sizeof(struct extendedFileEntry);
	}
1762 1763

finish:
1764
	if (iinfo->i_strat4096) {
L
Linus Torvalds 已提交
1765 1766 1767
		fe->icbTag.strategyType = cpu_to_le16(4096);
		fe->icbTag.strategyParameter = cpu_to_le16(1);
		fe->icbTag.numEntries = cpu_to_le16(2);
1768
	} else {
L
Linus Torvalds 已提交
1769 1770 1771 1772
		fe->icbTag.strategyType = cpu_to_le16(4);
		fe->icbTag.numEntries = cpu_to_le16(1);
	}

1773 1774 1775
	if (iinfo->i_use)
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_USE;
	else if (S_ISDIR(inode->i_mode))
L
Linus Torvalds 已提交
1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_DIRECTORY;
	else if (S_ISREG(inode->i_mode))
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_REGULAR;
	else if (S_ISLNK(inode->i_mode))
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_SYMLINK;
	else if (S_ISBLK(inode->i_mode))
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_BLOCK;
	else if (S_ISCHR(inode->i_mode))
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_CHAR;
	else if (S_ISFIFO(inode->i_mode))
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_FIFO;
	else if (S_ISSOCK(inode->i_mode))
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_SOCKET;

1790
	icbflags =	iinfo->i_alloc_type |
1791 1792 1793 1794 1795 1796
			((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) |
			((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) |
			((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) |
			(le16_to_cpu(fe->icbTag.flags) &
				~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID |
				ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY));
L
Linus Torvalds 已提交
1797 1798

	fe->icbTag.flags = cpu_to_le16(icbflags);
M
Marcin Slusarz 已提交
1799
	if (sbi->s_udfrev >= 0x0200)
L
Linus Torvalds 已提交
1800 1801 1802
		fe->descTag.descVersion = cpu_to_le16(3);
	else
		fe->descTag.descVersion = cpu_to_le16(2);
M
Marcin Slusarz 已提交
1803
	fe->descTag.tagSerialNum = cpu_to_le16(sbi->s_serial_number);
M
Marcin Slusarz 已提交
1804
	fe->descTag.tagLocation = cpu_to_le32(
1805
					iinfo->i_location.logicalBlockNum);
1806
	crclen += iinfo->i_lenEAttr + iinfo->i_lenAlloc - sizeof(struct tag);
L
Linus Torvalds 已提交
1807
	fe->descTag.descCRCLength = cpu_to_le16(crclen);
1808
	fe->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)fe + sizeof(struct tag),
1809
						  crclen));
1810
	fe->descTag.tagChecksum = udf_tag_checksum(&fe->descTag);
L
Linus Torvalds 已提交
1811

1812
	set_buffer_uptodate(bh);
1813 1814
	unlock_buffer(bh);

L
Linus Torvalds 已提交
1815 1816
	/* write the data blocks */
	mark_buffer_dirty(bh);
1817
	if (do_sync) {
L
Linus Torvalds 已提交
1818
		sync_dirty_buffer(bh);
1819
		if (buffer_write_io_error(bh)) {
J
Joe Perches 已提交
1820 1821
			udf_warn(inode->i_sb, "IO error syncing udf inode [%08lx]\n",
				 inode->i_ino);
L
Linus Torvalds 已提交
1822 1823 1824
			err = -EIO;
		}
	}
J
Jan Kara 已提交
1825
	brelse(bh);
1826

L
Linus Torvalds 已提交
1827 1828 1829
	return err;
}

J
Jan Kara 已提交
1830 1831
struct inode *__udf_iget(struct super_block *sb, struct kernel_lb_addr *ino,
			 bool hidden_inode)
L
Linus Torvalds 已提交
1832 1833 1834
{
	unsigned long block = udf_get_lb_pblock(sb, ino, 0);
	struct inode *inode = iget_locked(sb, block);
1835
	int err;
L
Linus Torvalds 已提交
1836 1837

	if (!inode)
1838
		return ERR_PTR(-ENOMEM);
L
Linus Torvalds 已提交
1839

1840 1841
	if (!(inode->i_state & I_NEW))
		return inode;
L
Linus Torvalds 已提交
1842

1843
	memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr));
J
Jan Kara 已提交
1844
	err = udf_read_inode(inode, hidden_inode);
1845 1846 1847
	if (err < 0) {
		iget_failed(inode);
		return ERR_PTR(err);
L
Linus Torvalds 已提交
1848
	}
1849
	unlock_new_inode(inode);
L
Linus Torvalds 已提交
1850 1851 1852 1853

	return inode;
}

1854 1855
int udf_setup_indirect_aext(struct inode *inode, int block,
			    struct extent_position *epos)
L
Linus Torvalds 已提交
1856
{
1857 1858
	struct super_block *sb = inode->i_sb;
	struct buffer_head *bh;
L
Linus Torvalds 已提交
1859
	struct allocExtDesc *aed;
1860 1861 1862
	struct extent_position nepos;
	struct kernel_lb_addr neloc;
	int ver, adsize;
L
Linus Torvalds 已提交
1863

1864 1865 1866 1867
	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
		adsize = sizeof(struct short_ad);
	else if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_LONG)
		adsize = sizeof(struct long_ad);
L
Linus Torvalds 已提交
1868
	else
1869
		return -EIO;
1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890

	neloc.logicalBlockNum = block;
	neloc.partitionReferenceNum = epos->block.partitionReferenceNum;

	bh = udf_tgetblk(sb, udf_get_lb_pblock(sb, &neloc, 0));
	if (!bh)
		return -EIO;
	lock_buffer(bh);
	memset(bh->b_data, 0x00, sb->s_blocksize);
	set_buffer_uptodate(bh);
	unlock_buffer(bh);
	mark_buffer_dirty_inode(bh, inode);

	aed = (struct allocExtDesc *)(bh->b_data);
	if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT)) {
		aed->previousAllocExtLocation =
				cpu_to_le32(epos->block.logicalBlockNum);
	}
	aed->lengthAllocDescs = cpu_to_le32(0);
	if (UDF_SB(sb)->s_udfrev >= 0x0200)
		ver = 3;
L
Linus Torvalds 已提交
1891
	else
1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937
		ver = 2;
	udf_new_tag(bh->b_data, TAG_IDENT_AED, ver, 1, block,
		    sizeof(struct tag));

	nepos.block = neloc;
	nepos.offset = sizeof(struct allocExtDesc);
	nepos.bh = bh;

	/*
	 * Do we have to copy current last extent to make space for indirect
	 * one?
	 */
	if (epos->offset + adsize > sb->s_blocksize) {
		struct kernel_lb_addr cp_loc;
		uint32_t cp_len;
		int cp_type;

		epos->offset -= adsize;
		cp_type = udf_current_aext(inode, epos, &cp_loc, &cp_len, 0);
		cp_len |= ((uint32_t)cp_type) << 30;

		__udf_add_aext(inode, &nepos, &cp_loc, cp_len, 1);
		udf_write_aext(inode, epos, &nepos.block,
			       sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDECS, 0);
	} else {
		__udf_add_aext(inode, epos, &nepos.block,
			       sb->s_blocksize | EXT_NEXT_EXTENT_ALLOCDECS, 0);
	}

	brelse(epos->bh);
	*epos = nepos;

	return 0;
}

/*
 * Append extent at the given position - should be the first free one in inode
 * / indirect extent. This function assumes there is enough space in the inode
 * or indirect extent. Use udf_add_aext() if you didn't check for this before.
 */
int __udf_add_aext(struct inode *inode, struct extent_position *epos,
		   struct kernel_lb_addr *eloc, uint32_t elen, int inc)
{
	struct udf_inode_info *iinfo = UDF_I(inode);
	struct allocExtDesc *aed;
	int adsize;
L
Linus Torvalds 已提交
1938

1939
	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
1940
		adsize = sizeof(struct short_ad);
1941
	else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
1942
		adsize = sizeof(struct long_ad);
L
Linus Torvalds 已提交
1943
	else
1944
		return -EIO;
L
Linus Torvalds 已提交
1945

1946 1947 1948 1949 1950 1951 1952 1953
	if (!epos->bh) {
		WARN_ON(iinfo->i_lenAlloc !=
			epos->offset - udf_file_entry_alloc_offset(inode));
	} else {
		aed = (struct allocExtDesc *)epos->bh->b_data;
		WARN_ON(le32_to_cpu(aed->lengthAllocDescs) !=
			epos->offset - sizeof(struct allocExtDesc));
		WARN_ON(epos->offset + adsize > inode->i_sb->s_blocksize);
L
Linus Torvalds 已提交
1954 1955
	}

1956
	udf_write_aext(inode, epos, eloc, elen, inc);
L
Linus Torvalds 已提交
1957

1958
	if (!epos->bh) {
1959
		iinfo->i_lenAlloc += adsize;
L
Linus Torvalds 已提交
1960
		mark_inode_dirty(inode);
1961
	} else {
J
Jan Kara 已提交
1962
		aed = (struct allocExtDesc *)epos->bh->b_data;
1963
		le32_add_cpu(&aed->lengthAllocDescs, adsize);
M
Marcin Slusarz 已提交
1964 1965 1966 1967
		if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
				UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
			udf_update_tag(epos->bh->b_data,
					epos->offset + (inc ? 0 : adsize));
L
Linus Torvalds 已提交
1968
		else
M
Marcin Slusarz 已提交
1969 1970
			udf_update_tag(epos->bh->b_data,
					sizeof(struct allocExtDesc));
J
Jan Kara 已提交
1971
		mark_buffer_dirty_inode(epos->bh, inode);
L
Linus Torvalds 已提交
1972 1973
	}

1974
	return 0;
L
Linus Torvalds 已提交
1975 1976
}

1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011
/*
 * Append extent at given position - should be the first free one in inode
 * / indirect extent. Takes care of allocating and linking indirect blocks.
 */
int udf_add_aext(struct inode *inode, struct extent_position *epos,
		 struct kernel_lb_addr *eloc, uint32_t elen, int inc)
{
	int adsize;
	struct super_block *sb = inode->i_sb;

	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
		adsize = sizeof(struct short_ad);
	else if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_LONG)
		adsize = sizeof(struct long_ad);
	else
		return -EIO;

	if (epos->offset + (2 * adsize) > sb->s_blocksize) {
		int err;
		int new_block;

		new_block = udf_new_block(sb, NULL,
					  epos->block.partitionReferenceNum,
					  epos->block.logicalBlockNum, &err);
		if (!new_block)
			return -ENOSPC;

		err = udf_setup_indirect_aext(inode, new_block, epos);
		if (err)
			return err;
	}

	return __udf_add_aext(inode, epos, eloc, elen, inc);
}

2012 2013
void udf_write_aext(struct inode *inode, struct extent_position *epos,
		    struct kernel_lb_addr *eloc, uint32_t elen, int inc)
L
Linus Torvalds 已提交
2014 2015 2016
{
	int adsize;
	uint8_t *ptr;
2017 2018
	struct short_ad *sad;
	struct long_ad *lad;
2019
	struct udf_inode_info *iinfo = UDF_I(inode);
L
Linus Torvalds 已提交
2020

J
Jan Kara 已提交
2021
	if (!epos->bh)
2022
		ptr = iinfo->i_ext.i_data + epos->offset -
M
Marcin Slusarz 已提交
2023
			udf_file_entry_alloc_offset(inode) +
2024
			iinfo->i_lenEAttr;
L
Linus Torvalds 已提交
2025
	else
J
Jan Kara 已提交
2026
		ptr = epos->bh->b_data + epos->offset;
L
Linus Torvalds 已提交
2027

2028
	switch (iinfo->i_alloc_type) {
2029
	case ICBTAG_FLAG_AD_SHORT:
2030
		sad = (struct short_ad *)ptr;
2031
		sad->extLength = cpu_to_le32(elen);
2032
		sad->extPosition = cpu_to_le32(eloc->logicalBlockNum);
2033
		adsize = sizeof(struct short_ad);
2034
		break;
2035
	case ICBTAG_FLAG_AD_LONG:
2036
		lad = (struct long_ad *)ptr;
2037
		lad->extLength = cpu_to_le32(elen);
2038
		lad->extLocation = cpu_to_lelb(*eloc);
2039
		memset(lad->impUse, 0x00, sizeof(lad->impUse));
2040
		adsize = sizeof(struct long_ad);
2041
		break;
2042
	default:
2043
		return;
L
Linus Torvalds 已提交
2044 2045
	}

2046
	if (epos->bh) {
2047
		if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
M
Marcin Slusarz 已提交
2048
		    UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) {
M
Marcin Slusarz 已提交
2049 2050
			struct allocExtDesc *aed =
				(struct allocExtDesc *)epos->bh->b_data;
J
Jan Kara 已提交
2051
			udf_update_tag(epos->bh->b_data,
M
Marcin Slusarz 已提交
2052 2053
				       le32_to_cpu(aed->lengthAllocDescs) +
				       sizeof(struct allocExtDesc));
L
Linus Torvalds 已提交
2054
		}
J
Jan Kara 已提交
2055
		mark_buffer_dirty_inode(epos->bh, inode);
2056
	} else {
L
Linus Torvalds 已提交
2057
		mark_inode_dirty(inode);
2058
	}
L
Linus Torvalds 已提交
2059 2060

	if (inc)
J
Jan Kara 已提交
2061
		epos->offset += adsize;
L
Linus Torvalds 已提交
2062 2063
}

2064 2065 2066 2067 2068 2069
/*
 * Only 1 indirect extent in a row really makes sense but allow upto 16 in case
 * someone does some weird stuff.
 */
#define UDF_MAX_INDIR_EXTS 16

M
Marcin Slusarz 已提交
2070
int8_t udf_next_aext(struct inode *inode, struct extent_position *epos,
2071
		     struct kernel_lb_addr *eloc, uint32_t *elen, int inc)
L
Linus Torvalds 已提交
2072 2073
{
	int8_t etype;
2074
	unsigned int indirections = 0;
L
Linus Torvalds 已提交
2075

J
Jan Kara 已提交
2076
	while ((etype = udf_current_aext(inode, epos, eloc, elen, inc)) ==
2077
	       (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) {
M
Marcin Slusarz 已提交
2078
		int block;
2079 2080 2081 2082 2083 2084 2085 2086

		if (++indirections > UDF_MAX_INDIR_EXTS) {
			udf_err(inode->i_sb,
				"too many indirect extents in inode %lu\n",
				inode->i_ino);
			return -1;
		}

J
Jan Kara 已提交
2087 2088
		epos->block = *eloc;
		epos->offset = sizeof(struct allocExtDesc);
J
Jan Kara 已提交
2089
		brelse(epos->bh);
2090
		block = udf_get_lb_pblock(inode->i_sb, &epos->block, 0);
M
Marcin Slusarz 已提交
2091 2092 2093
		epos->bh = udf_tread(inode->i_sb, block);
		if (!epos->bh) {
			udf_debug("reading block %d failed!\n", block);
L
Linus Torvalds 已提交
2094 2095 2096 2097 2098 2099 2100
			return -1;
		}
	}

	return etype;
}

M
Marcin Slusarz 已提交
2101
int8_t udf_current_aext(struct inode *inode, struct extent_position *epos,
2102
			struct kernel_lb_addr *eloc, uint32_t *elen, int inc)
L
Linus Torvalds 已提交
2103 2104 2105 2106
{
	int alen;
	int8_t etype;
	uint8_t *ptr;
2107 2108
	struct short_ad *sad;
	struct long_ad *lad;
2109
	struct udf_inode_info *iinfo = UDF_I(inode);
2110

2111
	if (!epos->bh) {
J
Jan Kara 已提交
2112 2113
		if (!epos->offset)
			epos->offset = udf_file_entry_alloc_offset(inode);
2114
		ptr = iinfo->i_ext.i_data + epos->offset -
M
Marcin Slusarz 已提交
2115
			udf_file_entry_alloc_offset(inode) +
2116
			iinfo->i_lenEAttr;
M
Marcin Slusarz 已提交
2117
		alen = udf_file_entry_alloc_offset(inode) +
2118
							iinfo->i_lenAlloc;
2119
	} else {
J
Jan Kara 已提交
2120 2121 2122
		if (!epos->offset)
			epos->offset = sizeof(struct allocExtDesc);
		ptr = epos->bh->b_data + epos->offset;
2123
		alen = sizeof(struct allocExtDesc) +
M
Marcin Slusarz 已提交
2124 2125
			le32_to_cpu(((struct allocExtDesc *)epos->bh->b_data)->
							lengthAllocDescs);
L
Linus Torvalds 已提交
2126 2127
	}

2128
	switch (iinfo->i_alloc_type) {
2129
	case ICBTAG_FLAG_AD_SHORT:
M
Marcin Slusarz 已提交
2130 2131
		sad = udf_get_fileshortad(ptr, alen, &epos->offset, inc);
		if (!sad)
2132 2133 2134
			return -1;
		etype = le32_to_cpu(sad->extLength) >> 30;
		eloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
M
Marcin Slusarz 已提交
2135
		eloc->partitionReferenceNum =
2136
				iinfo->i_location.partitionReferenceNum;
2137 2138
		*elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK;
		break;
2139
	case ICBTAG_FLAG_AD_LONG:
M
Marcin Slusarz 已提交
2140 2141
		lad = udf_get_filelongad(ptr, alen, &epos->offset, inc);
		if (!lad)
L
Linus Torvalds 已提交
2142
			return -1;
2143 2144 2145 2146 2147
		etype = le32_to_cpu(lad->extLength) >> 30;
		*eloc = lelb_to_cpu(lad->extLocation);
		*elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK;
		break;
	default:
J
Joe Perches 已提交
2148
		udf_debug("alloc_type = %d unsupported\n", iinfo->i_alloc_type);
2149
		return -1;
L
Linus Torvalds 已提交
2150 2151 2152 2153 2154
	}

	return etype;
}

2155
static int8_t udf_insert_aext(struct inode *inode, struct extent_position epos,
2156
			      struct kernel_lb_addr neloc, uint32_t nelen)
L
Linus Torvalds 已提交
2157
{
2158
	struct kernel_lb_addr oeloc;
L
Linus Torvalds 已提交
2159 2160 2161
	uint32_t oelen;
	int8_t etype;

J
Jan Kara 已提交
2162
	if (epos.bh)
J
Jan Kara 已提交
2163
		get_bh(epos.bh);
L
Linus Torvalds 已提交
2164

2165
	while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1) {
2166
		udf_write_aext(inode, &epos, &neloc, nelen, 1);
L
Linus Torvalds 已提交
2167 2168 2169
		neloc = oeloc;
		nelen = (etype << 30) | oelen;
	}
2170
	udf_add_aext(inode, &epos, &neloc, nelen, 1);
J
Jan Kara 已提交
2171
	brelse(epos.bh);
2172

L
Linus Torvalds 已提交
2173 2174 2175
	return (nelen >> 30);
}

M
Marcin Slusarz 已提交
2176
int8_t udf_delete_aext(struct inode *inode, struct extent_position epos,
2177
		       struct kernel_lb_addr eloc, uint32_t elen)
L
Linus Torvalds 已提交
2178
{
J
Jan Kara 已提交
2179 2180
	struct extent_position oepos;
	int adsize;
L
Linus Torvalds 已提交
2181 2182
	int8_t etype;
	struct allocExtDesc *aed;
2183
	struct udf_inode_info *iinfo;
L
Linus Torvalds 已提交
2184

2185
	if (epos.bh) {
J
Jan Kara 已提交
2186 2187
		get_bh(epos.bh);
		get_bh(epos.bh);
L
Linus Torvalds 已提交
2188 2189
	}

2190 2191
	iinfo = UDF_I(inode);
	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
2192
		adsize = sizeof(struct short_ad);
2193
	else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
2194
		adsize = sizeof(struct long_ad);
L
Linus Torvalds 已提交
2195 2196 2197
	else
		adsize = 0;

J
Jan Kara 已提交
2198 2199
	oepos = epos;
	if (udf_next_aext(inode, &epos, &eloc, &elen, 1) == -1)
L
Linus Torvalds 已提交
2200 2201
		return -1;

2202
	while ((etype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1) {
2203
		udf_write_aext(inode, &oepos, &eloc, (etype << 30) | elen, 1);
2204
		if (oepos.bh != epos.bh) {
J
Jan Kara 已提交
2205
			oepos.block = epos.block;
J
Jan Kara 已提交
2206 2207
			brelse(oepos.bh);
			get_bh(epos.bh);
J
Jan Kara 已提交
2208 2209
			oepos.bh = epos.bh;
			oepos.offset = epos.offset - adsize;
L
Linus Torvalds 已提交
2210 2211
		}
	}
2212
	memset(&eloc, 0x00, sizeof(struct kernel_lb_addr));
L
Linus Torvalds 已提交
2213 2214
	elen = 0;

2215
	if (epos.bh != oepos.bh) {
2216 2217 2218
		udf_free_blocks(inode->i_sb, inode, &epos.block, 0, 1);
		udf_write_aext(inode, &oepos, &eloc, elen, 1);
		udf_write_aext(inode, &oepos, &eloc, elen, 1);
2219
		if (!oepos.bh) {
2220
			iinfo->i_lenAlloc -= (adsize * 2);
L
Linus Torvalds 已提交
2221
			mark_inode_dirty(inode);
2222
		} else {
J
Jan Kara 已提交
2223
			aed = (struct allocExtDesc *)oepos.bh->b_data;
2224
			le32_add_cpu(&aed->lengthAllocDescs, -(2 * adsize));
2225
			if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
M
Marcin Slusarz 已提交
2226
			    UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
M
Marcin Slusarz 已提交
2227 2228
				udf_update_tag(oepos.bh->b_data,
						oepos.offset - (2 * adsize));
L
Linus Torvalds 已提交
2229
			else
M
Marcin Slusarz 已提交
2230 2231
				udf_update_tag(oepos.bh->b_data,
						sizeof(struct allocExtDesc));
J
Jan Kara 已提交
2232
			mark_buffer_dirty_inode(oepos.bh, inode);
L
Linus Torvalds 已提交
2233
		}
2234
	} else {
2235
		udf_write_aext(inode, &oepos, &eloc, elen, 1);
2236
		if (!oepos.bh) {
2237
			iinfo->i_lenAlloc -= adsize;
L
Linus Torvalds 已提交
2238
			mark_inode_dirty(inode);
2239
		} else {
J
Jan Kara 已提交
2240
			aed = (struct allocExtDesc *)oepos.bh->b_data;
2241
			le32_add_cpu(&aed->lengthAllocDescs, -adsize);
2242
			if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
M
Marcin Slusarz 已提交
2243
			    UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
M
Marcin Slusarz 已提交
2244 2245
				udf_update_tag(oepos.bh->b_data,
						epos.offset - adsize);
L
Linus Torvalds 已提交
2246
			else
M
Marcin Slusarz 已提交
2247 2248
				udf_update_tag(oepos.bh->b_data,
						sizeof(struct allocExtDesc));
J
Jan Kara 已提交
2249
			mark_buffer_dirty_inode(oepos.bh, inode);
L
Linus Torvalds 已提交
2250 2251
		}
	}
2252

J
Jan Kara 已提交
2253 2254
	brelse(epos.bh);
	brelse(oepos.bh);
2255

L
Linus Torvalds 已提交
2256 2257 2258
	return (elen >> 30);
}

M
Marcin Slusarz 已提交
2259
int8_t inode_bmap(struct inode *inode, sector_t block,
2260
		  struct extent_position *pos, struct kernel_lb_addr *eloc,
M
Marcin Slusarz 已提交
2261
		  uint32_t *elen, sector_t *offset)
L
Linus Torvalds 已提交
2262
{
M
Marcin Slusarz 已提交
2263
	unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;
2264
	loff_t lbcount = 0, bcount = (loff_t) block << blocksize_bits;
L
Linus Torvalds 已提交
2265
	int8_t etype;
2266
	struct udf_inode_info *iinfo;
L
Linus Torvalds 已提交
2267

2268
	iinfo = UDF_I(inode);
2269 2270 2271 2272 2273
	if (!udf_read_extent_cache(inode, bcount, &lbcount, pos)) {
		pos->offset = 0;
		pos->block = iinfo->i_location;
		pos->bh = NULL;
	}
L
Linus Torvalds 已提交
2274
	*elen = 0;
2275
	do {
M
Marcin Slusarz 已提交
2276 2277 2278
		etype = udf_next_aext(inode, pos, eloc, elen, 1);
		if (etype == -1) {
			*offset = (bcount - lbcount) >> blocksize_bits;
2279
			iinfo->i_lenExtents = lbcount;
L
Linus Torvalds 已提交
2280 2281 2282 2283
			return -1;
		}
		lbcount += *elen;
	} while (lbcount <= bcount);
2284
	/* update extent cache */
2285
	udf_update_extent_cache(inode, lbcount - *elen, pos);
M
Marcin Slusarz 已提交
2286
	*offset = (bcount + *elen - lbcount) >> blocksize_bits;
L
Linus Torvalds 已提交
2287 2288 2289 2290

	return etype;
}

2291
long udf_block_map(struct inode *inode, sector_t block)
L
Linus Torvalds 已提交
2292
{
2293
	struct kernel_lb_addr eloc;
J
Jan Kara 已提交
2294
	uint32_t elen;
2295
	sector_t offset;
2296
	struct extent_position epos = {};
L
Linus Torvalds 已提交
2297 2298
	int ret;

2299
	down_read(&UDF_I(inode)->i_data_sem);
L
Linus Torvalds 已提交
2300

M
Marcin Slusarz 已提交
2301 2302
	if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) ==
						(EXT_RECORDED_ALLOCATED >> 30))
2303
		ret = udf_get_lb_pblock(inode->i_sb, &eloc, offset);
L
Linus Torvalds 已提交
2304 2305 2306
	else
		ret = 0;

2307
	up_read(&UDF_I(inode)->i_data_sem);
J
Jan Kara 已提交
2308
	brelse(epos.bh);
L
Linus Torvalds 已提交
2309 2310 2311 2312 2313 2314

	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
		return udf_fixed_to_variable(ret);
	else
		return ret;
}