inode.c 64.9 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>
L
Linus Torvalds 已提交
41 42 43 44 45 46 47 48 49 50

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

MODULE_AUTHOR("Ben Fennema");
MODULE_DESCRIPTION("Universal Disk Format Filesystem");
MODULE_LICENSE("GPL");

#define EXTENT_MERGE_SIZE 5

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

69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
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,
				    struct extent_position *pos, int next_epos)
{
	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);
	memcpy(&iinfo->cached_extent.epos, pos,
	       sizeof(struct extent_position));
	iinfo->cached_extent.lstart = estart;
	if (next_epos)
		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);
		}
	spin_unlock(&iinfo->i_extent_cache_lock);
}
137

A
Al Viro 已提交
138
void udf_evict_inode(struct inode *inode)
L
Linus Torvalds 已提交
139
{
J
Jan Kara 已提交
140
	struct udf_inode_info *iinfo = UDF_I(inode);
A
Al Viro 已提交
141 142 143 144
	int want_delete = 0;

	if (!inode->i_nlink && !is_bad_inode(inode)) {
		want_delete = 1;
145
		udf_setsize(inode, 0);
A
Al Viro 已提交
146
		udf_update_inode(inode, IS_SYNC(inode));
147 148
	}
	truncate_inode_pages_final(&inode->i_data);
A
Al Viro 已提交
149
	invalidate_inode_buffers(inode);
150
	clear_inode(inode);
J
Jan Kara 已提交
151 152
	if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB &&
	    inode->i_size != iinfo->i_lenExtents) {
J
Joe Perches 已提交
153 154 155 156
		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 已提交
157
	}
158 159
	kfree(iinfo->i_ext.i_data);
	iinfo->i_ext.i_data = NULL;
160
	udf_clear_extent_cache(inode);
A
Al Viro 已提交
161 162 163
	if (want_delete) {
		udf_free_inode(inode);
	}
L
Linus Torvalds 已提交
164 165
}

I
Ian Abbott 已提交
166 167 168 169 170 171 172
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) {
173
		truncate_pagecache(inode, isize);
I
Ian Abbott 已提交
174 175
		if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
			down_write(&iinfo->i_data_sem);
176
			udf_clear_extent_cache(inode);
I
Ian Abbott 已提交
177 178 179 180 181 182
			udf_truncate_extents(inode);
			up_write(&iinfo->i_data_sem);
		}
	}
}

L
Linus Torvalds 已提交
183 184 185 186 187
static int udf_writepage(struct page *page, struct writeback_control *wbc)
{
	return block_write_full_page(page, udf_get_block, wbc);
}

188 189 190 191 192 193
static int udf_writepages(struct address_space *mapping,
			struct writeback_control *wbc)
{
	return mpage_writepages(mapping, wbc, udf_get_block);
}

L
Linus Torvalds 已提交
194 195
static int udf_readpage(struct file *file, struct page *page)
{
N
Namjae Jeon 已提交
196 197 198 199 200 201 202
	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 已提交
203 204
}

N
Nick Piggin 已提交
205 206 207
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 已提交
208
{
209 210 211
	int ret;

	ret = block_write_begin(mapping, pos, len, flags, pagep, udf_get_block);
I
Ian Abbott 已提交
212 213 214 215
	if (unlikely(ret))
		udf_write_failed(mapping, pos + len);
	return ret;
}
216

217
static ssize_t udf_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
A
Al Viro 已提交
218
			     loff_t offset)
I
Ian Abbott 已提交
219 220 221 222
{
	struct file *file = iocb->ki_filp;
	struct address_space *mapping = file->f_mapping;
	struct inode *inode = mapping->host;
223
	size_t count = iov_iter_count(iter);
I
Ian Abbott 已提交
224 225
	ssize_t ret;

226
	ret = blockdev_direct_IO(iocb, inode, iter, offset, udf_get_block);
227
	if (unlikely(ret < 0 && iov_iter_rw(iter) == WRITE))
228
		udf_write_failed(mapping, offset + count);
229
	return ret;
L
Linus Torvalds 已提交
230 231 232 233
}

static sector_t udf_bmap(struct address_space *mapping, sector_t block)
{
234
	return generic_block_bmap(mapping, block, udf_get_block);
L
Linus Torvalds 已提交
235 236
}

237
const struct address_space_operations udf_aops = {
238
	.readpage	= udf_readpage,
N
Namjae Jeon 已提交
239
	.readpages	= udf_readpages,
240
	.writepage	= udf_writepage,
241
	.writepages	= udf_writepages,
I
Ian Abbott 已提交
242 243 244
	.write_begin	= udf_write_begin,
	.write_end	= generic_write_end,
	.direct_IO	= udf_direct_IO,
245
	.bmap		= udf_bmap,
L
Linus Torvalds 已提交
246 247
};

248 249 250 251 252 253
/*
 * 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
 */
254
int udf_expand_file_adinicb(struct inode *inode)
L
Linus Torvalds 已提交
255 256 257
{
	struct page *page;
	char *kaddr;
258
	struct udf_inode_info *iinfo = UDF_I(inode);
259
	int err;
L
Linus Torvalds 已提交
260 261 262 263 264
	struct writeback_control udf_wbc = {
		.sync_mode = WB_SYNC_NONE,
		.nr_to_write = 1,
	};

265
	WARN_ON_ONCE(!mutex_is_locked(&inode->i_mutex));
266
	if (!iinfo->i_lenAlloc) {
L
Linus Torvalds 已提交
267
		if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
268
			iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT;
L
Linus Torvalds 已提交
269
		else
270
			iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
271 272
		/* from now on we have normal address_space methods */
		inode->i_data.a_ops = &udf_aops;
273
		up_write(&iinfo->i_data_sem);
L
Linus Torvalds 已提交
274
		mark_inode_dirty(inode);
275
		return 0;
L
Linus Torvalds 已提交
276
	}
277 278 279 280 281
	/*
	 * 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 已提交
282

283 284 285
	page = find_or_create_page(inode->i_mapping, 0, GFP_NOFS);
	if (!page)
		return -ENOMEM;
M
Matt Mackall 已提交
286

287
	if (!PageUptodate(page)) {
L
Linus Torvalds 已提交
288
		kaddr = kmap(page);
289 290 291 292
		memset(kaddr + iinfo->i_lenAlloc, 0x00,
		       PAGE_CACHE_SIZE - iinfo->i_lenAlloc);
		memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr,
			iinfo->i_lenAlloc);
L
Linus Torvalds 已提交
293 294 295 296
		flush_dcache_page(page);
		SetPageUptodate(page);
		kunmap(page);
	}
297
	down_write(&iinfo->i_data_sem);
298 299 300
	memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0x00,
	       iinfo->i_lenAlloc);
	iinfo->i_lenAlloc = 0;
L
Linus Torvalds 已提交
301
	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
302
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_SHORT;
L
Linus Torvalds 已提交
303
	else
304
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_LONG;
305 306
	/* from now on we have normal address_space methods */
	inode->i_data.a_ops = &udf_aops;
307
	up_write(&iinfo->i_data_sem);
308 309 310 311 312
	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);
313
		down_write(&iinfo->i_data_sem);
314 315 316 317 318 319
		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;
320
		up_write(&iinfo->i_data_sem);
321
	}
L
Linus Torvalds 已提交
322 323
	page_cache_release(page);
	mark_inode_dirty(inode);
324 325

	return err;
L
Linus Torvalds 已提交
326 327
}

328 329
struct buffer_head *udf_expand_dir_adinicb(struct inode *inode, int *block,
					   int *err)
L
Linus Torvalds 已提交
330 331
{
	int newblock;
J
Jan Kara 已提交
332
	struct buffer_head *dbh = NULL;
333
	struct kernel_lb_addr eloc;
L
Linus Torvalds 已提交
334
	uint8_t alloctype;
J
Jan Kara 已提交
335
	struct extent_position epos;
L
Linus Torvalds 已提交
336 337

	struct udf_fileident_bh sfibh, dfibh;
338 339
	loff_t f_pos = udf_ext0_offset(inode);
	int size = udf_ext0_offset(inode) + inode->i_size;
L
Linus Torvalds 已提交
340
	struct fileIdentDesc cfi, *sfi, *dfi;
341
	struct udf_inode_info *iinfo = UDF_I(inode);
L
Linus Torvalds 已提交
342 343 344 345 346 347

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

348
	if (!inode->i_size) {
349
		iinfo->i_alloc_type = alloctype;
L
Linus Torvalds 已提交
350 351 352 353 354 355
		mark_inode_dirty(inode);
		return NULL;
	}

	/* alloc block, and copy data to it */
	*block = udf_new_block(inode->i_sb, inode,
356 357
			       iinfo->i_location.partitionReferenceNum,
			       iinfo->i_location.logicalBlockNum, err);
L
Linus Torvalds 已提交
358 359 360
	if (!(*block))
		return NULL;
	newblock = udf_get_pblock(inode->i_sb, *block,
361
				  iinfo->i_location.partitionReferenceNum,
362
				0);
L
Linus Torvalds 已提交
363 364 365 366 367 368 369 370 371 372 373
	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 已提交
374
	sfibh.soffset = sfibh.eoffset =
375
			f_pos & (inode->i_sb->s_blocksize - 1);
J
Jan Kara 已提交
376
	sfibh.sbh = sfibh.ebh = NULL;
L
Linus Torvalds 已提交
377 378
	dfibh.soffset = dfibh.eoffset = 0;
	dfibh.sbh = dfibh.ebh = dbh;
379
	while (f_pos < size) {
380
		iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
M
Marcin Slusarz 已提交
381 382
		sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL,
					 NULL, NULL, NULL);
383
		if (!sfi) {
J
Jan Kara 已提交
384
			brelse(dbh);
L
Linus Torvalds 已提交
385 386
			return NULL;
		}
387
		iinfo->i_alloc_type = alloctype;
L
Linus Torvalds 已提交
388 389 390 391 392
		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 已提交
393 394
				 sfi->fileIdent +
					le16_to_cpu(sfi->lengthOfImpUse))) {
395
			iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
J
Jan Kara 已提交
396
			brelse(dbh);
L
Linus Torvalds 已提交
397 398 399 400 401
			return NULL;
		}
	}
	mark_buffer_dirty_inode(dbh, inode);

402 403 404
	memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0,
		iinfo->i_lenAlloc);
	iinfo->i_lenAlloc = 0;
L
Linus Torvalds 已提交
405
	eloc.logicalBlockNum = *block;
M
Marcin Slusarz 已提交
406
	eloc.partitionReferenceNum =
407
				iinfo->i_location.partitionReferenceNum;
J
Jan Kara 已提交
408
	iinfo->i_lenExtents = inode->i_size;
J
Jan Kara 已提交
409
	epos.bh = NULL;
410
	epos.block = iinfo->i_location;
J
Jan Kara 已提交
411
	epos.offset = udf_file_entry_alloc_offset(inode);
J
Jan Kara 已提交
412
	udf_add_aext(inode, &epos, &eloc, inode->i_size, 0);
L
Linus Torvalds 已提交
413 414
	/* UniqueID stuff */

J
Jan Kara 已提交
415
	brelse(epos.bh);
L
Linus Torvalds 已提交
416 417 418 419
	mark_inode_dirty(inode);
	return dbh;
}

420 421
static int udf_get_block(struct inode *inode, sector_t block,
			 struct buffer_head *bh_result, int create)
L
Linus Torvalds 已提交
422 423
{
	int err, new;
424
	sector_t phys = 0;
425
	struct udf_inode_info *iinfo;
L
Linus Torvalds 已提交
426

427
	if (!create) {
L
Linus Torvalds 已提交
428 429 430 431 432 433 434 435
		phys = udf_block_map(inode, block);
		if (phys)
			map_bh(bh_result, inode->i_sb, phys);
		return 0;
	}

	err = -EIO;
	new = 0;
436
	iinfo = UDF_I(inode);
437 438

	down_write(&iinfo->i_data_sem);
439 440 441
	if (block == iinfo->i_next_alloc_block + 1) {
		iinfo->i_next_alloc_block++;
		iinfo->i_next_alloc_goal++;
L
Linus Torvalds 已提交
442 443
	}

444
	udf_clear_extent_cache(inode);
445 446
	phys = inode_getblk(inode, block, &err, &new);
	if (!phys)
L
Linus Torvalds 已提交
447 448 449 450 451
		goto abort;

	if (new)
		set_buffer_new(bh_result);
	map_bh(bh_result, inode->i_sb, phys);
452 453

abort:
454
	up_write(&iinfo->i_data_sem);
L
Linus Torvalds 已提交
455 456 457
	return err;
}

458 459
static struct buffer_head *udf_getblk(struct inode *inode, long block,
				      int create, int *err)
L
Linus Torvalds 已提交
460
{
461
	struct buffer_head *bh;
L
Linus Torvalds 已提交
462 463 464 465 466
	struct buffer_head dummy;

	dummy.b_state = 0;
	dummy.b_blocknr = -1000;
	*err = udf_get_block(inode, block, &dummy, create);
467
	if (!*err && buffer_mapped(&dummy)) {
L
Linus Torvalds 已提交
468
		bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
469
		if (buffer_new(&dummy)) {
L
Linus Torvalds 已提交
470 471 472 473 474 475 476 477
			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;
	}
478

L
Linus Torvalds 已提交
479 480 481
	return NULL;
}

J
Jan Kara 已提交
482
/* Extend the file by 'blocks' blocks, return the number of extents added */
483 484 485 486
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 已提交
487 488 489 490
{
	sector_t add;
	int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
	struct super_block *sb = inode->i_sb;
491
	struct kernel_lb_addr prealloc_loc = {};
J
Jan Kara 已提交
492
	int prealloc_len = 0;
493
	struct udf_inode_info *iinfo;
494
	int err;
J
Jan Kara 已提交
495 496 497 498 499

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

501
	iinfo = UDF_I(inode);
J
Jan Kara 已提交
502 503 504
	/* Round the last extent up to a multiple of block size */
	if (last_ext->extLength & (sb->s_blocksize - 1)) {
		last_ext->extLength =
505 506 507
			(last_ext->extLength & UDF_EXTENT_FLAG_MASK) |
			(((last_ext->extLength & UDF_EXTENT_LENGTH_MASK) +
			  sb->s_blocksize - 1) & ~(sb->s_blocksize - 1));
508 509
		iinfo->i_lenExtents =
			(iinfo->i_lenExtents + sb->s_blocksize - 1) &
510
			~(sb->s_blocksize - 1);
J
Jan Kara 已提交
511
	}
512

J
Jan Kara 已提交
513
	/* Last extent are just preallocated blocks? */
M
Marcin Slusarz 已提交
514 515
	if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) ==
						EXT_NOT_RECORDED_ALLOCATED) {
J
Jan Kara 已提交
516 517 518 519 520
		/* 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 |
521
			(last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
J
Jan Kara 已提交
522
		last_ext->extLocation.logicalBlockNum = 0;
M
Marcin Slusarz 已提交
523
		last_ext->extLocation.partitionReferenceNum = 0;
J
Jan Kara 已提交
524
	}
525

J
Jan Kara 已提交
526
	/* Can we merge with the previous extent? */
M
Marcin Slusarz 已提交
527 528 529 530 531
	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 已提交
532 533 534 535 536 537 538
		if (add > blocks)
			add = blocks;
		blocks -= add;
		last_ext->extLength += add << sb->s_blocksize_bits;
	}

	if (fake) {
539
		udf_add_aext(inode, last_pos, &last_ext->extLocation,
540
			     last_ext->extLength, 1);
J
Jan Kara 已提交
541
		count++;
M
Marcin Slusarz 已提交
542
	} else
543
		udf_write_aext(inode, last_pos, &last_ext->extLocation,
M
Marcin Slusarz 已提交
544
				last_ext->extLength, 1);
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
		}
J
Jan Kara 已提交
741 742 743
		brelse(prev_epos.bh);
		brelse(cur_epos.bh);
		brelse(next_epos.bh);
744
		newblock = udf_get_lb_pblock(inode->i_sb, &eloc, offset);
745
		return newblock;
L
Linus Torvalds 已提交
746 747
	}

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

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

M
Marcin Slusarz 已提交
805 806 807 808
		/* 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) {
809 810 811 812 813
			laarr[c + 1].extLength = (etype << 30) | elen;
			laarr[c + 1].extLocation = eloc;
			count++;
			startnum++;
			endnum++;
M
Marcin Slusarz 已提交
814
		} else
L
Linus Torvalds 已提交
815 816 817 818
			lastblock = 1;
	}

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

826
		if (!goal) {
M
Marcin Slusarz 已提交
827
			if (!(goal = pgoal)) /* XXX: what was intended here? */
828
				goal = iinfo->i_location.logicalBlockNum + 1;
L
Linus Torvalds 已提交
829 830
		}

M
Marcin Slusarz 已提交
831
		newblocknum = udf_new_block(inode->i_sb, inode,
832
				iinfo->i_location.partitionReferenceNum,
M
Marcin Slusarz 已提交
833 834
				goal, err);
		if (!newblocknum) {
J
Jan Kara 已提交
835
			brelse(prev_epos.bh);
836 837
			brelse(cur_epos.bh);
			brelse(next_epos.bh);
L
Linus Torvalds 已提交
838
			*err = -ENOSPC;
839
			return 0;
L
Linus Torvalds 已提交
840
		}
841 842
		if (isBeyondEOF)
			iinfo->i_lenExtents += inode->i_sb->s_blocksize;
L
Linus Torvalds 已提交
843 844
	}

M
Marcin Slusarz 已提交
845 846 847 848
	/* 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 已提交
849 850 851
	udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum);

#ifdef UDF_PREALLOCATE
852 853 854 855 856 857
	/* 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 已提交
858 859 860 861 862 863
#endif

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

	/* write back the new extents, inserting new extents if the new number
864 865
	 * 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 已提交
866
	udf_update_extents(inode, laarr, startnum, endnum, &prev_epos);
L
Linus Torvalds 已提交
867

J
Jan Kara 已提交
868
	brelse(prev_epos.bh);
869 870
	brelse(cur_epos.bh);
	brelse(next_epos.bh);
L
Linus Torvalds 已提交
871

M
Marcin Slusarz 已提交
872
	newblock = udf_get_pblock(inode->i_sb, newblocknum,
873
				iinfo->i_location.partitionReferenceNum, 0);
874 875 876 877
	if (!newblock) {
		*err = -EIO;
		return 0;
	}
L
Linus Torvalds 已提交
878
	*new = 1;
879 880
	iinfo->i_next_alloc_block = block;
	iinfo->i_next_alloc_goal = newblocknum;
L
Linus Torvalds 已提交
881 882 883 884 885 886
	inode->i_ctime = current_fs_time(inode->i_sb);

	if (IS_SYNC(inode))
		udf_sync_inode(inode);
	else
		mark_inode_dirty(inode);
887

888
	return newblock;
L
Linus Torvalds 已提交
889 890
}

891 892
static void udf_split_extents(struct inode *inode, int *c, int offset,
			      int newblocknum,
893
			      struct kernel_long_ad laarr[EXTENT_MERGE_SIZE],
894
			      int *endnum)
L
Linus Torvalds 已提交
895
{
M
Marcin Slusarz 已提交
896 897 898
	unsigned long blocksize = inode->i_sb->s_blocksize;
	unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;

L
Linus Torvalds 已提交
899
	if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) ||
M
Marcin Slusarz 已提交
900 901
	    (laarr[*c].extLength >> 30) ==
				(EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) {
L
Linus Torvalds 已提交
902 903
		int curr = *c;
		int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) +
M
Marcin Slusarz 已提交
904
			    blocksize - 1) >> blocksize_bits;
L
Linus Torvalds 已提交
905 906
		int8_t etype = (laarr[curr].extLength >> 30);

M
Marcin Slusarz 已提交
907
		if (blen == 1)
908
			;
M
Marcin Slusarz 已提交
909
		else if (!offset || blen == offset + 1) {
910 911 912 913 914 915 916 917 918
			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 已提交
919
				udf_free_blocks(inode->i_sb, inode,
920
						&laarr[curr].extLocation,
M
Marcin Slusarz 已提交
921 922 923 924
						0, offset);
				laarr[curr].extLength =
					EXT_NOT_RECORDED_NOT_ALLOCATED |
					(offset << blocksize_bits);
L
Linus Torvalds 已提交
925
				laarr[curr].extLocation.logicalBlockNum = 0;
M
Marcin Slusarz 已提交
926 927 928
				laarr[curr].extLocation.
						partitionReferenceNum = 0;
			} else
L
Linus Torvalds 已提交
929
				laarr[curr].extLength = (etype << 30) |
M
Marcin Slusarz 已提交
930
					(offset << blocksize_bits);
931 932 933
			curr++;
			(*c)++;
			(*endnum)++;
L
Linus Torvalds 已提交
934
		}
935

L
Linus Torvalds 已提交
936 937 938
		laarr[curr].extLocation.logicalBlockNum = newblocknum;
		if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
			laarr[curr].extLocation.partitionReferenceNum =
939
				UDF_I(inode)->i_location.partitionReferenceNum;
L
Linus Torvalds 已提交
940
		laarr[curr].extLength = EXT_RECORDED_ALLOCATED |
M
Marcin Slusarz 已提交
941
			blocksize;
942
		curr++;
L
Linus Torvalds 已提交
943

944
		if (blen != offset + 1) {
L
Linus Torvalds 已提交
945
			if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
M
Marcin Slusarz 已提交
946 947
				laarr[curr].extLocation.logicalBlockNum +=
								offset + 1;
948
			laarr[curr].extLength = (etype << 30) |
M
Marcin Slusarz 已提交
949
				((blen - (offset + 1)) << blocksize_bits);
950 951
			curr++;
			(*endnum)++;
L
Linus Torvalds 已提交
952 953 954 955 956
		}
	}
}

static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
957
				 struct kernel_long_ad laarr[EXTENT_MERGE_SIZE],
958
				 int *endnum)
L
Linus Torvalds 已提交
959 960 961
{
	int start, length = 0, currlength = 0, i;

962
	if (*endnum >= (c + 1)) {
L
Linus Torvalds 已提交
963 964 965 966
		if (!lastblock)
			return;
		else
			start = c;
967
	} else {
M
Marcin Slusarz 已提交
968 969
		if ((laarr[c + 1].extLength >> 30) ==
					(EXT_NOT_RECORDED_ALLOCATED >> 30)) {
970
			start = c + 1;
M
Marcin Slusarz 已提交
971 972 973 974 975 976
			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 已提交
977 978 979
			start = c;
	}

980 981
	for (i = start + 1; i <= *endnum; i++) {
		if (i == *endnum) {
L
Linus Torvalds 已提交
982 983
			if (lastblock)
				length += UDF_DEFAULT_PREALLOC_BLOCKS;
M
Marcin Slusarz 已提交
984 985 986 987 988 989 990
		} 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 已提交
991 992 993
			break;
	}

994
	if (length) {
L
Linus Torvalds 已提交
995
		int next = laarr[start].extLocation.logicalBlockNum +
996
			(((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) +
M
Marcin Slusarz 已提交
997 998
			  inode->i_sb->s_blocksize - 1) >>
			  inode->i_sb->s_blocksize_bits);
L
Linus Torvalds 已提交
999
		int numalloc = udf_prealloc_blocks(inode->i_sb, inode,
M
Marcin Slusarz 已提交
1000 1001 1002 1003
				laarr[start].extLocation.partitionReferenceNum,
				next, (UDF_DEFAULT_PREALLOC_BLOCKS > length ?
				length : UDF_DEFAULT_PREALLOC_BLOCKS) -
				currlength);
1004
		if (numalloc) 	{
M
Marcin Slusarz 已提交
1005
			if (start == (c + 1))
L
Linus Torvalds 已提交
1006
				laarr[start].extLength +=
M
Marcin Slusarz 已提交
1007 1008 1009
					(numalloc <<
					 inode->i_sb->s_blocksize_bits);
			else {
1010
				memmove(&laarr[c + 2], &laarr[c + 1],
1011
					sizeof(struct long_ad) * (*endnum - (c + 1)));
1012 1013 1014
				(*endnum)++;
				laarr[c + 1].extLocation.logicalBlockNum = next;
				laarr[c + 1].extLocation.partitionReferenceNum =
M
Marcin Slusarz 已提交
1015 1016 1017 1018 1019 1020
					laarr[c].extLocation.
							partitionReferenceNum;
				laarr[c + 1].extLength =
					EXT_NOT_RECORDED_ALLOCATED |
					(numalloc <<
					 inode->i_sb->s_blocksize_bits);
1021
				start = c + 1;
L
Linus Torvalds 已提交
1022 1023
			}

1024
			for (i = start + 1; numalloc && i < *endnum; i++) {
M
Marcin Slusarz 已提交
1025 1026 1027 1028
				int elen = ((laarr[i].extLength &
						UDF_EXTENT_LENGTH_MASK) +
					    inode->i_sb->s_blocksize - 1) >>
					    inode->i_sb->s_blocksize_bits;
L
Linus Torvalds 已提交
1029

1030
				if (elen > numalloc) {
L
Linus Torvalds 已提交
1031
					laarr[i].extLength -=
M
Marcin Slusarz 已提交
1032 1033
						(numalloc <<
						 inode->i_sb->s_blocksize_bits);
L
Linus Torvalds 已提交
1034
					numalloc = 0;
1035
				} else {
L
Linus Torvalds 已提交
1036
					numalloc -= elen;
1037
					if (*endnum > (i + 1))
M
Marcin Slusarz 已提交
1038 1039
						memmove(&laarr[i],
							&laarr[i + 1],
1040
							sizeof(struct long_ad) *
M
Marcin Slusarz 已提交
1041
							(*endnum - (i + 1)));
1042 1043
					i--;
					(*endnum)--;
L
Linus Torvalds 已提交
1044 1045
				}
			}
1046
			UDF_I(inode)->i_lenExtents +=
M
Marcin Slusarz 已提交
1047
				numalloc << inode->i_sb->s_blocksize_bits;
L
Linus Torvalds 已提交
1048 1049 1050 1051 1052
		}
	}
}

static void udf_merge_extents(struct inode *inode,
1053
			      struct kernel_long_ad laarr[EXTENT_MERGE_SIZE],
1054
			      int *endnum)
L
Linus Torvalds 已提交
1055 1056
{
	int i;
M
Marcin Slusarz 已提交
1057 1058
	unsigned long blocksize = inode->i_sb->s_blocksize;
	unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;
L
Linus Torvalds 已提交
1059

1060
	for (i = 0; i < (*endnum - 1); i++) {
1061 1062
		struct kernel_long_ad *li /*l[i]*/ = &laarr[i];
		struct kernel_long_ad *lip1 /*l[i plus 1]*/ = &laarr[i + 1];
M
Marcin Slusarz 已提交
1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095

		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],
1096
						sizeof(struct long_ad) *
M
Marcin Slusarz 已提交
1097 1098 1099
						(*endnum - (i + 2)));
				i--;
				(*endnum)--;
L
Linus Torvalds 已提交
1100
			}
M
Marcin Slusarz 已提交
1101 1102 1103 1104
		} else if (((li->extLength >> 30) ==
				(EXT_NOT_RECORDED_ALLOCATED >> 30)) &&
			   ((lip1->extLength >> 30) ==
				(EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))) {
1105
			udf_free_blocks(inode->i_sb, inode, &li->extLocation, 0,
M
Marcin Slusarz 已提交
1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123
					((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;
1124
			} else {
M
Marcin Slusarz 已提交
1125 1126 1127 1128
				li->extLength = lip1->extLength +
					(((li->extLength &
						UDF_EXTENT_LENGTH_MASK) +
					  blocksize - 1) & ~(blocksize - 1));
1129 1130
				if (*endnum > (i + 2))
					memmove(&laarr[i + 1], &laarr[i + 2],
1131
						sizeof(struct long_ad) *
M
Marcin Slusarz 已提交
1132
						(*endnum - (i + 2)));
1133 1134
				i--;
				(*endnum)--;
L
Linus Torvalds 已提交
1135
			}
M
Marcin Slusarz 已提交
1136 1137 1138
		} else if ((li->extLength >> 30) ==
					(EXT_NOT_RECORDED_ALLOCATED >> 30)) {
			udf_free_blocks(inode->i_sb, inode,
1139
					&li->extLocation, 0,
M
Marcin Slusarz 已提交
1140 1141 1142 1143 1144 1145 1146 1147
					((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 已提交
1148 1149 1150 1151 1152
		}
	}
}

static void udf_update_extents(struct inode *inode,
1153
			       struct kernel_long_ad laarr[EXTENT_MERGE_SIZE],
1154 1155
			       int startnum, int endnum,
			       struct extent_position *epos)
L
Linus Torvalds 已提交
1156 1157
{
	int start = 0, i;
1158
	struct kernel_lb_addr tmploc;
L
Linus Torvalds 已提交
1159 1160
	uint32_t tmplen;

1161 1162
	if (startnum > endnum) {
		for (i = 0; i < (startnum - endnum); i++)
J
Jan Kara 已提交
1163
			udf_delete_aext(inode, *epos, laarr[i].extLocation,
1164 1165 1166
					laarr[i].extLength);
	} else if (startnum < endnum) {
		for (i = 0; i < (endnum - startnum); i++) {
J
Jan Kara 已提交
1167
			udf_insert_aext(inode, *epos, laarr[i].extLocation,
1168
					laarr[i].extLength);
J
Jan Kara 已提交
1169
			udf_next_aext(inode, epos, &laarr[i].extLocation,
1170 1171
				      &laarr[i].extLength, 1);
			start++;
L
Linus Torvalds 已提交
1172 1173 1174
		}
	}

1175
	for (i = start; i < endnum; i++) {
J
Jan Kara 已提交
1176
		udf_next_aext(inode, epos, &tmploc, &tmplen, 0);
1177
		udf_write_aext(inode, epos, &laarr[i].extLocation,
1178
			       laarr[i].extLength, 1);
L
Linus Torvalds 已提交
1179 1180 1181
	}
}

1182 1183
struct buffer_head *udf_bread(struct inode *inode, int block,
			      int create, int *err)
L
Linus Torvalds 已提交
1184
{
1185
	struct buffer_head *bh = NULL;
L
Linus Torvalds 已提交
1186 1187 1188 1189 1190 1191 1192

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

	if (buffer_uptodate(bh))
		return bh;
1193

L
Linus Torvalds 已提交
1194
	ll_rw_block(READ, 1, &bh);
1195

L
Linus Torvalds 已提交
1196 1197 1198
	wait_on_buffer(bh);
	if (buffer_uptodate(bh))
		return bh;
1199

L
Linus Torvalds 已提交
1200 1201 1202 1203 1204
	brelse(bh);
	*err = -EIO;
	return NULL;
}

1205
int udf_setsize(struct inode *inode, loff_t newsize)
L
Linus Torvalds 已提交
1206 1207
{
	int err;
1208
	struct udf_inode_info *iinfo;
1209
	int bsize = 1 << inode->i_blkbits;
L
Linus Torvalds 已提交
1210 1211

	if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
1212
	      S_ISLNK(inode->i_mode)))
1213
		return -EINVAL;
L
Linus Torvalds 已提交
1214
	if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
1215
		return -EPERM;
L
Linus Torvalds 已提交
1216

1217
	iinfo = UDF_I(inode);
1218
	if (newsize > inode->i_size) {
1219
		down_write(&iinfo->i_data_sem);
1220 1221 1222 1223
		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);
1224
				if (err)
1225
					return err;
1226
				down_write(&iinfo->i_data_sem);
1227
			} else {
1228
				iinfo->i_lenAlloc = newsize;
1229 1230
				goto set_size;
			}
1231 1232 1233 1234 1235
		}
		err = udf_extend_file(inode, newsize);
		if (err) {
			up_write(&iinfo->i_data_sem);
			return err;
L
Linus Torvalds 已提交
1236
		}
1237
set_size:
1238
		truncate_setsize(inode, newsize);
1239
		up_write(&iinfo->i_data_sem);
1240
	} else {
1241 1242
		if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
			down_write(&iinfo->i_data_sem);
1243
			udf_clear_extent_cache(inode);
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255
			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;
1256
		down_write(&iinfo->i_data_sem);
1257
		udf_clear_extent_cache(inode);
1258
		truncate_setsize(inode, newsize);
L
Linus Torvalds 已提交
1259
		udf_truncate_extents(inode);
1260
		up_write(&iinfo->i_data_sem);
1261
	}
1262
update_time:
L
Linus Torvalds 已提交
1263 1264
	inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
	if (IS_SYNC(inode))
1265
		udf_sync_inode(inode);
L
Linus Torvalds 已提交
1266 1267
	else
		mark_inode_dirty(inode);
1268
	return 0;
L
Linus Torvalds 已提交
1269 1270
}

1271 1272 1273 1274 1275 1276 1277
/*
 * 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 已提交
1278
static int udf_read_inode(struct inode *inode, bool hidden_inode)
L
Linus Torvalds 已提交
1279 1280 1281
{
	struct buffer_head *bh = NULL;
	struct fileEntry *fe;
1282
	struct extendedFileEntry *efe;
L
Linus Torvalds 已提交
1283
	uint16_t ident;
1284
	struct udf_inode_info *iinfo = UDF_I(inode);
1285
	struct udf_sb_info *sbi = UDF_SB(inode->i_sb);
1286
	struct kernel_lb_addr *iloc = &iinfo->i_location;
1287
	unsigned int link_count;
1288
	unsigned int indirections = 0;
J
Jan Kara 已提交
1289
	int bs = inode->i_sb->s_blocksize;
1290
	int ret = -EIO;
L
Linus Torvalds 已提交
1291

1292
reread:
1293 1294 1295 1296 1297 1298 1299
	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 已提交
1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311
	/*
	 * 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;
	 */
1312
	bh = udf_read_ptagged(inode->i_sb, iloc, 0, &ident);
1313
	if (!bh) {
J
Joe Perches 已提交
1314
		udf_err(inode->i_sb, "(ino %ld) failed !bh\n", inode->i_ino);
1315
		return -EIO;
L
Linus Torvalds 已提交
1316 1317 1318
	}

	if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE &&
1319
	    ident != TAG_IDENT_USE) {
J
Joe Perches 已提交
1320 1321
		udf_err(inode->i_sb, "(ino %ld) failed ident=%d\n",
			inode->i_ino, ident);
1322
		goto out;
L
Linus Torvalds 已提交
1323 1324 1325
	}

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

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

1331
		ibh = udf_read_ptagged(inode->i_sb, iloc, 1, &ident);
1332
		if (ident == TAG_IDENT_IE && ibh) {
1333
			struct kernel_lb_addr loc;
1334 1335 1336 1337 1338
			struct indirectEntry *ie;

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

1339 1340 1341 1342 1343 1344 1345 1346 1347
			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);
1348
					goto out;
1349
				}
1350
				brelse(bh);
1351
				goto reread;
L
Linus Torvalds 已提交
1352
			}
1353
		}
1354
		brelse(ibh);
1355
	} else if (fe->icbTag.strategyType != cpu_to_le16(4)) {
J
Joe Perches 已提交
1356 1357
		udf_err(inode->i_sb, "unsupported strategy type: %d\n",
			le16_to_cpu(fe->icbTag.strategyType));
1358
		goto out;
L
Linus Torvalds 已提交
1359
	}
1360
	if (fe->icbTag.strategyType == cpu_to_le16(4))
1361
		iinfo->i_strat4096 = 0;
1362
	else /* if (fe->icbTag.strategyType == cpu_to_le16(4096)) */
1363
		iinfo->i_strat4096 = 1;
L
Linus Torvalds 已提交
1364

1365
	iinfo->i_alloc_type = le16_to_cpu(fe->icbTag.flags) &
M
Marcin Slusarz 已提交
1366
							ICBTAG_FLAG_AD_MASK;
1367 1368 1369 1370 1371 1372
	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;
1373
	if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_EFE)) {
1374 1375
		iinfo->i_efe = 1;
		iinfo->i_use = 0;
J
Jan Kara 已提交
1376
		ret = udf_alloc_i_data(inode, bs -
1377 1378 1379
					sizeof(struct extendedFileEntry));
		if (ret)
			goto out;
1380
		memcpy(iinfo->i_ext.i_data,
M
Marcin Slusarz 已提交
1381
		       bh->b_data + sizeof(struct extendedFileEntry),
J
Jan Kara 已提交
1382
		       bs - sizeof(struct extendedFileEntry));
1383
	} else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_FE)) {
1384 1385
		iinfo->i_efe = 0;
		iinfo->i_use = 0;
J
Jan Kara 已提交
1386
		ret = udf_alloc_i_data(inode, bs - sizeof(struct fileEntry));
1387 1388
		if (ret)
			goto out;
1389
		memcpy(iinfo->i_ext.i_data,
1390
		       bh->b_data + sizeof(struct fileEntry),
J
Jan Kara 已提交
1391
		       bs - sizeof(struct fileEntry));
1392
	} else if (fe->descTag.tagIdent == cpu_to_le16(TAG_IDENT_USE)) {
1393 1394 1395
		iinfo->i_efe = 0;
		iinfo->i_use = 1;
		iinfo->i_lenAlloc = le32_to_cpu(
M
Marcin Slusarz 已提交
1396 1397
				((struct unallocSpaceEntry *)bh->b_data)->
				 lengthAllocDescs);
J
Jan Kara 已提交
1398
		ret = udf_alloc_i_data(inode, bs -
1399 1400 1401
					sizeof(struct unallocSpaceEntry));
		if (ret)
			goto out;
1402
		memcpy(iinfo->i_ext.i_data,
M
Marcin Slusarz 已提交
1403
		       bh->b_data + sizeof(struct unallocSpaceEntry),
J
Jan Kara 已提交
1404
		       bs - sizeof(struct unallocSpaceEntry));
1405
		return 0;
L
Linus Torvalds 已提交
1406 1407
	}

1408
	ret = -EIO;
1409
	read_lock(&sbi->s_cred_lock);
1410 1411
	i_uid_write(inode, le32_to_cpu(fe->uid));
	if (!uid_valid(inode->i_uid) ||
1412 1413
	    UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_IGNORE) ||
	    UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_SET))
1414
		inode->i_uid = UDF_SB(inode->i_sb)->s_uid;
L
Linus Torvalds 已提交
1415

1416 1417
	i_gid_write(inode, le32_to_cpu(fe->gid));
	if (!gid_valid(inode->i_gid) ||
1418 1419
	    UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_IGNORE) ||
	    UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_SET))
1420
		inode->i_gid = UDF_SB(inode->i_sb)->s_gid;
L
Linus Torvalds 已提交
1421

1422
	if (fe->icbTag.fileType != ICBTAG_FILE_TYPE_DIRECTORY &&
1423
			sbi->s_fmode != UDF_INVALID_MODE)
1424 1425
		inode->i_mode = sbi->s_fmode;
	else if (fe->icbTag.fileType == ICBTAG_FILE_TYPE_DIRECTORY &&
1426
			sbi->s_dmode != UDF_INVALID_MODE)
1427 1428 1429 1430
		inode->i_mode = sbi->s_dmode;
	else
		inode->i_mode = udf_convert_permissions(fe);
	inode->i_mode &= ~sbi->s_umask;
1431 1432
	read_unlock(&sbi->s_cred_lock);

M
Miklos Szeredi 已提交
1433
	link_count = le16_to_cpu(fe->fileLinkCount);
J
Jan Kara 已提交
1434
	if (!link_count) {
J
Jan Kara 已提交
1435 1436 1437 1438 1439
		if (!hidden_inode) {
			ret = -ESTALE;
			goto out;
		}
		link_count = 1;
J
Jan Kara 已提交
1440
	}
M
Miklos Szeredi 已提交
1441
	set_nlink(inode, link_count);
1442 1443 1444

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

1446
	if (iinfo->i_efe == 0) {
L
Linus Torvalds 已提交
1447
		inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
1448
			(inode->i_sb->s_blocksize_bits - 9);
L
Linus Torvalds 已提交
1449

1450
		if (!udf_disk_stamp_to_time(&inode->i_atime, fe->accessTime))
1451 1452
			inode->i_atime = sbi->s_record_time;

1453 1454
		if (!udf_disk_stamp_to_time(&inode->i_mtime,
					    fe->modificationTime))
1455 1456
			inode->i_mtime = sbi->s_record_time;

1457
		if (!udf_disk_stamp_to_time(&inode->i_ctime, fe->attrTime))
1458
			inode->i_ctime = sbi->s_record_time;
L
Linus Torvalds 已提交
1459

1460 1461 1462
		iinfo->i_unique = le64_to_cpu(fe->uniqueID);
		iinfo->i_lenEAttr = le32_to_cpu(fe->lengthExtendedAttr);
		iinfo->i_lenAlloc = le32_to_cpu(fe->lengthAllocDescs);
1463
		iinfo->i_checkpoint = le32_to_cpu(fe->checkpoint);
1464
	} else {
1465
		inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
1466
		    (inode->i_sb->s_blocksize_bits - 9);
L
Linus Torvalds 已提交
1467

1468
		if (!udf_disk_stamp_to_time(&inode->i_atime, efe->accessTime))
1469 1470
			inode->i_atime = sbi->s_record_time;

1471 1472
		if (!udf_disk_stamp_to_time(&inode->i_mtime,
					    efe->modificationTime))
1473 1474
			inode->i_mtime = sbi->s_record_time;

1475
		if (!udf_disk_stamp_to_time(&iinfo->i_crtime, efe->createTime))
1476 1477
			iinfo->i_crtime = sbi->s_record_time;

1478
		if (!udf_disk_stamp_to_time(&inode->i_ctime, efe->attrTime))
1479
			inode->i_ctime = sbi->s_record_time;
L
Linus Torvalds 已提交
1480

1481 1482 1483
		iinfo->i_unique = le64_to_cpu(efe->uniqueID);
		iinfo->i_lenEAttr = le32_to_cpu(efe->lengthExtendedAttr);
		iinfo->i_lenAlloc = le32_to_cpu(efe->lengthAllocDescs);
1484
		iinfo->i_checkpoint = le32_to_cpu(efe->checkpoint);
L
Linus Torvalds 已提交
1485
	}
J
Jan Kara 已提交
1486
	inode->i_generation = iinfo->i_unique;
L
Linus Torvalds 已提交
1487

1488 1489 1490 1491 1492 1493 1494 1495 1496
	/*
	 * 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 已提交
1497 1498 1499 1500 1501 1502 1503 1504 1505
	/* 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 已提交
1506
		if (inode->i_size > bs - udf_file_entry_alloc_offset(inode))
J
Jan Kara 已提交
1507 1508 1509
			goto out;
	}

1510 1511
	switch (fe->icbTag.fileType) {
	case ICBTAG_FILE_TYPE_DIRECTORY:
1512 1513 1514 1515 1516
		inode->i_op = &udf_dir_inode_operations;
		inode->i_fop = &udf_dir_operations;
		inode->i_mode |= S_IFDIR;
		inc_nlink(inode);
		break;
1517 1518 1519
	case ICBTAG_FILE_TYPE_REALTIME:
	case ICBTAG_FILE_TYPE_REGULAR:
	case ICBTAG_FILE_TYPE_UNDEF:
J
Jan Kara 已提交
1520
	case ICBTAG_FILE_TYPE_VAT20:
1521
		if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1522 1523 1524 1525 1526 1527 1528
			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;
1529
	case ICBTAG_FILE_TYPE_BLOCK:
1530 1531
		inode->i_mode |= S_IFBLK;
		break;
1532
	case ICBTAG_FILE_TYPE_CHAR:
1533 1534
		inode->i_mode |= S_IFCHR;
		break;
1535
	case ICBTAG_FILE_TYPE_FIFO:
1536 1537
		init_special_inode(inode, inode->i_mode | S_IFIFO, 0);
		break;
1538
	case ICBTAG_FILE_TYPE_SOCKET:
1539 1540
		init_special_inode(inode, inode->i_mode | S_IFSOCK, 0);
		break;
1541
	case ICBTAG_FILE_TYPE_SYMLINK:
1542
		inode->i_data.a_ops = &udf_symlink_aops;
1543
		inode->i_op = &udf_symlink_inode_operations;
1544 1545
		inode->i_mode = S_IFLNK | S_IRWXUGO;
		break;
1546 1547 1548 1549 1550 1551 1552 1553 1554
	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;
1555
	default:
J
Joe Perches 已提交
1556 1557
		udf_err(inode->i_sb, "(ino %ld) failed unknown file type=%d\n",
			inode->i_ino, fe->icbTag.fileType);
1558
		goto out;
L
Linus Torvalds 已提交
1559
	}
1560
	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
M
Marcin Slusarz 已提交
1561 1562
		struct deviceSpec *dsea =
			(struct deviceSpec *)udf_get_extendedattr(inode, 12, 1);
1563 1564
		if (dsea) {
			init_special_inode(inode, inode->i_mode,
M
Marcin Slusarz 已提交
1565 1566
				MKDEV(le32_to_cpu(dsea->majorDeviceIdent),
				      le32_to_cpu(dsea->minorDeviceIdent)));
L
Linus Torvalds 已提交
1567
			/* Developer ID ??? */
M
Marcin Slusarz 已提交
1568
		} else
1569
			goto out;
L
Linus Torvalds 已提交
1570
	}
1571 1572
	ret = 0;
out:
1573
	brelse(bh);
1574
	return ret;
L
Linus Torvalds 已提交
1575 1576
}

1577 1578
static int udf_alloc_i_data(struct inode *inode, size_t size)
{
1579 1580
	struct udf_inode_info *iinfo = UDF_I(inode);
	iinfo->i_ext.i_data = kmalloc(size, GFP_KERNEL);
1581

1582
	if (!iinfo->i_ext.i_data) {
J
Joe Perches 已提交
1583 1584
		udf_err(inode->i_sb, "(ino %ld) no free memory\n",
			inode->i_ino);
1585 1586 1587 1588 1589 1590
		return -ENOMEM;
	}

	return 0;
}

A
Al Viro 已提交
1591
static umode_t udf_convert_permissions(struct fileEntry *fe)
L
Linus Torvalds 已提交
1592
{
A
Al Viro 已提交
1593
	umode_t mode;
L
Linus Torvalds 已提交
1594 1595 1596 1597 1598 1599
	uint32_t permissions;
	uint32_t flags;

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

M
Marcin Slusarz 已提交
1600 1601 1602 1603 1604 1605
	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 已提交
1606 1607 1608 1609

	return mode;
}

1610
int udf_write_inode(struct inode *inode, struct writeback_control *wbc)
L
Linus Torvalds 已提交
1611
{
J
Jan Kara 已提交
1612
	return udf_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL);
L
Linus Torvalds 已提交
1613 1614
}

J
Jan Kara 已提交
1615
static int udf_sync_inode(struct inode *inode)
L
Linus Torvalds 已提交
1616 1617 1618 1619
{
	return udf_update_inode(inode, 1);
}

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

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

1641 1642
	lock_buffer(bh);
	memset(bh->b_data, 0, inode->i_sb->s_blocksize);
L
Linus Torvalds 已提交
1643 1644 1645
	fe = (struct fileEntry *)bh->b_data;
	efe = (struct extendedFileEntry *)bh->b_data;

1646
	if (iinfo->i_use) {
L
Linus Torvalds 已提交
1647
		struct unallocSpaceEntry *use =
1648
			(struct unallocSpaceEntry *)bh->b_data;
L
Linus Torvalds 已提交
1649

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

1657
		goto finish;
L
Linus Torvalds 已提交
1658 1659
	}

1660 1661
	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET))
		fe->uid = cpu_to_le32(-1);
1662
	else
1663
		fe->uid = cpu_to_le32(i_uid_read(inode));
L
Linus Torvalds 已提交
1664

1665 1666
	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_FORGET))
		fe->gid = cpu_to_le32(-1);
1667
	else
1668
		fe->gid = cpu_to_le32(i_gid_read(inode));
L
Linus Torvalds 已提交
1669

M
Marcin Slusarz 已提交
1670 1671 1672
	udfperms = ((inode->i_mode & S_IRWXO)) |
		   ((inode->i_mode & S_IRWXG) << 2) |
		   ((inode->i_mode & S_IRWXU) << 4);
L
Linus Torvalds 已提交
1673

M
Marcin Slusarz 已提交
1674 1675 1676 1677
	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 已提交
1678 1679
	fe->permissions = cpu_to_le32(udfperms);

1680
	if (S_ISDIR(inode->i_mode) && inode->i_nlink > 0)
L
Linus Torvalds 已提交
1681 1682 1683 1684 1685 1686
		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);

1687
	if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
1688
		struct regid *eid;
1689 1690
		struct deviceSpec *dsea =
			(struct deviceSpec *)udf_get_extendedattr(inode, 12, 1);
1691
		if (!dsea) {
L
Linus Torvalds 已提交
1692
			dsea = (struct deviceSpec *)
1693 1694
				udf_add_extendedattr(inode,
						     sizeof(struct deviceSpec) +
1695
						     sizeof(struct regid), 12, 0x3);
L
Linus Torvalds 已提交
1696 1697
			dsea->attrType = cpu_to_le32(12);
			dsea->attrSubtype = 1;
M
Marcin Slusarz 已提交
1698 1699
			dsea->attrLength = cpu_to_le32(
						sizeof(struct deviceSpec) +
1700 1701
						sizeof(struct regid));
			dsea->impUseLength = cpu_to_le32(sizeof(struct regid));
L
Linus Torvalds 已提交
1702
		}
1703 1704
		eid = (struct regid *)dsea->impUse;
		memset(eid, 0, sizeof(struct regid));
L
Linus Torvalds 已提交
1705 1706 1707 1708 1709 1710 1711
		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));
	}

1712 1713 1714 1715 1716 1717 1718
	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);

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

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

1746 1747 1748 1749
		if (iinfo->i_crtime.tv_sec > inode->i_atime.tv_sec ||
		    (iinfo->i_crtime.tv_sec == inode->i_atime.tv_sec &&
		     iinfo->i_crtime.tv_nsec > inode->i_atime.tv_nsec))
			iinfo->i_crtime = inode->i_atime;
M
Marcin Slusarz 已提交
1750

1751 1752 1753 1754
		if (iinfo->i_crtime.tv_sec > inode->i_mtime.tv_sec ||
		    (iinfo->i_crtime.tv_sec == inode->i_mtime.tv_sec &&
		     iinfo->i_crtime.tv_nsec > inode->i_mtime.tv_nsec))
			iinfo->i_crtime = inode->i_mtime;
M
Marcin Slusarz 已提交
1755

1756 1757 1758 1759
		if (iinfo->i_crtime.tv_sec > inode->i_ctime.tv_sec ||
		    (iinfo->i_crtime.tv_sec == inode->i_ctime.tv_sec &&
		     iinfo->i_crtime.tv_nsec > inode->i_ctime.tv_nsec))
			iinfo->i_crtime = inode->i_ctime;
L
Linus Torvalds 已提交
1760

1761 1762 1763 1764
		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 已提交
1765

1766
		memset(&(efe->impIdent), 0, sizeof(struct regid));
L
Linus Torvalds 已提交
1767 1768 1769
		strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
		efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
		efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1770 1771 1772
		efe->uniqueID = cpu_to_le64(iinfo->i_unique);
		efe->lengthExtendedAttr = cpu_to_le32(iinfo->i_lenEAttr);
		efe->lengthAllocDescs = cpu_to_le32(iinfo->i_lenAlloc);
1773
		efe->checkpoint = cpu_to_le32(iinfo->i_checkpoint);
L
Linus Torvalds 已提交
1774 1775 1776
		efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE);
		crclen = sizeof(struct extendedFileEntry);
	}
1777 1778

finish:
1779
	if (iinfo->i_strat4096) {
L
Linus Torvalds 已提交
1780 1781 1782
		fe->icbTag.strategyType = cpu_to_le16(4096);
		fe->icbTag.strategyParameter = cpu_to_le16(1);
		fe->icbTag.numEntries = cpu_to_le16(2);
1783
	} else {
L
Linus Torvalds 已提交
1784 1785 1786 1787
		fe->icbTag.strategyType = cpu_to_le16(4);
		fe->icbTag.numEntries = cpu_to_le16(1);
	}

1788 1789 1790
	if (iinfo->i_use)
		fe->icbTag.fileType = ICBTAG_FILE_TYPE_USE;
	else if (S_ISDIR(inode->i_mode))
L
Linus Torvalds 已提交
1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804
		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;

1805
	icbflags =	iinfo->i_alloc_type |
1806 1807 1808 1809 1810 1811
			((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 已提交
1812 1813

	fe->icbTag.flags = cpu_to_le16(icbflags);
M
Marcin Slusarz 已提交
1814
	if (sbi->s_udfrev >= 0x0200)
L
Linus Torvalds 已提交
1815 1816 1817
		fe->descTag.descVersion = cpu_to_le16(3);
	else
		fe->descTag.descVersion = cpu_to_le16(2);
M
Marcin Slusarz 已提交
1818
	fe->descTag.tagSerialNum = cpu_to_le16(sbi->s_serial_number);
M
Marcin Slusarz 已提交
1819
	fe->descTag.tagLocation = cpu_to_le32(
1820
					iinfo->i_location.logicalBlockNum);
1821
	crclen += iinfo->i_lenEAttr + iinfo->i_lenAlloc - sizeof(struct tag);
L
Linus Torvalds 已提交
1822
	fe->descTag.descCRCLength = cpu_to_le16(crclen);
1823
	fe->descTag.descCRC = cpu_to_le16(crc_itu_t(0, (char *)fe + sizeof(struct tag),
1824
						  crclen));
1825
	fe->descTag.tagChecksum = udf_tag_checksum(&fe->descTag);
L
Linus Torvalds 已提交
1826

1827
	set_buffer_uptodate(bh);
1828 1829
	unlock_buffer(bh);

L
Linus Torvalds 已提交
1830 1831
	/* write the data blocks */
	mark_buffer_dirty(bh);
1832
	if (do_sync) {
L
Linus Torvalds 已提交
1833
		sync_dirty_buffer(bh);
1834
		if (buffer_write_io_error(bh)) {
J
Joe Perches 已提交
1835 1836
			udf_warn(inode->i_sb, "IO error syncing udf inode [%08lx]\n",
				 inode->i_ino);
L
Linus Torvalds 已提交
1837 1838 1839
			err = -EIO;
		}
	}
J
Jan Kara 已提交
1840
	brelse(bh);
1841

L
Linus Torvalds 已提交
1842 1843 1844
	return err;
}

J
Jan Kara 已提交
1845 1846
struct inode *__udf_iget(struct super_block *sb, struct kernel_lb_addr *ino,
			 bool hidden_inode)
L
Linus Torvalds 已提交
1847 1848 1849
{
	unsigned long block = udf_get_lb_pblock(sb, ino, 0);
	struct inode *inode = iget_locked(sb, block);
1850
	int err;
L
Linus Torvalds 已提交
1851 1852

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

1855 1856
	if (!(inode->i_state & I_NEW))
		return inode;
L
Linus Torvalds 已提交
1857

1858
	memcpy(&UDF_I(inode)->i_location, ino, sizeof(struct kernel_lb_addr));
J
Jan Kara 已提交
1859
	err = udf_read_inode(inode, hidden_inode);
1860 1861 1862
	if (err < 0) {
		iget_failed(inode);
		return ERR_PTR(err);
L
Linus Torvalds 已提交
1863
	}
1864
	unlock_new_inode(inode);
L
Linus Torvalds 已提交
1865 1866 1867 1868

	return inode;
}

1869 1870
int udf_add_aext(struct inode *inode, struct extent_position *epos,
		 struct kernel_lb_addr *eloc, uint32_t elen, int inc)
L
Linus Torvalds 已提交
1871 1872
{
	int adsize;
1873 1874
	struct short_ad *sad = NULL;
	struct long_ad *lad = NULL;
L
Linus Torvalds 已提交
1875 1876
	struct allocExtDesc *aed;
	uint8_t *ptr;
1877
	struct udf_inode_info *iinfo = UDF_I(inode);
L
Linus Torvalds 已提交
1878

J
Jan Kara 已提交
1879
	if (!epos->bh)
1880
		ptr = iinfo->i_ext.i_data + epos->offset -
M
Marcin Slusarz 已提交
1881
			udf_file_entry_alloc_offset(inode) +
1882
			iinfo->i_lenEAttr;
L
Linus Torvalds 已提交
1883
	else
J
Jan Kara 已提交
1884
		ptr = epos->bh->b_data + epos->offset;
L
Linus Torvalds 已提交
1885

1886
	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
1887
		adsize = sizeof(struct short_ad);
1888
	else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
1889
		adsize = sizeof(struct long_ad);
L
Linus Torvalds 已提交
1890
	else
1891
		return -EIO;
L
Linus Torvalds 已提交
1892

1893
	if (epos->offset + (2 * adsize) > inode->i_sb->s_blocksize) {
A
Al Viro 已提交
1894
		unsigned char *sptr, *dptr;
L
Linus Torvalds 已提交
1895 1896
		struct buffer_head *nbh;
		int err, loffset;
1897
		struct kernel_lb_addr obloc = epos->block;
L
Linus Torvalds 已提交
1898

M
Marcin Slusarz 已提交
1899 1900 1901 1902
		epos->block.logicalBlockNum = udf_new_block(inode->i_sb, NULL,
						obloc.partitionReferenceNum,
						obloc.logicalBlockNum, &err);
		if (!epos->block.logicalBlockNum)
1903
			return -ENOSPC;
M
Marcin Slusarz 已提交
1904
		nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb,
1905
								 &epos->block,
M
Marcin Slusarz 已提交
1906 1907
								 0));
		if (!nbh)
1908
			return -EIO;
L
Linus Torvalds 已提交
1909 1910 1911 1912 1913 1914 1915 1916
		lock_buffer(nbh);
		memset(nbh->b_data, 0x00, inode->i_sb->s_blocksize);
		set_buffer_uptodate(nbh);
		unlock_buffer(nbh);
		mark_buffer_dirty_inode(nbh, inode);

		aed = (struct allocExtDesc *)(nbh->b_data);
		if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
M
Marcin Slusarz 已提交
1917 1918
			aed->previousAllocExtLocation =
					cpu_to_le32(obloc.logicalBlockNum);
1919
		if (epos->offset + adsize > inode->i_sb->s_blocksize) {
J
Jan Kara 已提交
1920
			loffset = epos->offset;
L
Linus Torvalds 已提交
1921 1922 1923 1924
			aed->lengthAllocDescs = cpu_to_le32(adsize);
			sptr = ptr - adsize;
			dptr = nbh->b_data + sizeof(struct allocExtDesc);
			memcpy(dptr, sptr, adsize);
J
Jan Kara 已提交
1925
			epos->offset = sizeof(struct allocExtDesc) + adsize;
1926
		} else {
J
Jan Kara 已提交
1927
			loffset = epos->offset + adsize;
L
Linus Torvalds 已提交
1928 1929
			aed->lengthAllocDescs = cpu_to_le32(0);
			sptr = ptr;
J
Jan Kara 已提交
1930
			epos->offset = sizeof(struct allocExtDesc);
L
Linus Torvalds 已提交
1931

1932
			if (epos->bh) {
J
Jan Kara 已提交
1933
				aed = (struct allocExtDesc *)epos->bh->b_data;
1934
				le32_add_cpu(&aed->lengthAllocDescs, adsize);
1935
			} else {
1936
				iinfo->i_lenAlloc += adsize;
L
Linus Torvalds 已提交
1937 1938 1939
				mark_inode_dirty(inode);
			}
		}
M
Marcin Slusarz 已提交
1940
		if (UDF_SB(inode->i_sb)->s_udfrev >= 0x0200)
L
Linus Torvalds 已提交
1941
			udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1,
1942
				    epos->block.logicalBlockNum, sizeof(struct tag));
L
Linus Torvalds 已提交
1943 1944
		else
			udf_new_tag(nbh->b_data, TAG_IDENT_AED, 2, 1,
1945
				    epos->block.logicalBlockNum, sizeof(struct tag));
1946
		switch (iinfo->i_alloc_type) {
1947
		case ICBTAG_FLAG_AD_SHORT:
1948
			sad = (struct short_ad *)sptr;
1949 1950
			sad->extLength = cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS |
						     inode->i_sb->s_blocksize);
M
Marcin Slusarz 已提交
1951 1952
			sad->extPosition =
				cpu_to_le32(epos->block.logicalBlockNum);
1953
			break;
1954
		case ICBTAG_FLAG_AD_LONG:
1955
			lad = (struct long_ad *)sptr;
1956 1957 1958 1959 1960
			lad->extLength = cpu_to_le32(EXT_NEXT_EXTENT_ALLOCDECS |
						     inode->i_sb->s_blocksize);
			lad->extLocation = cpu_to_lelb(epos->block);
			memset(lad->impUse, 0x00, sizeof(lad->impUse));
			break;
L
Linus Torvalds 已提交
1961
		}
1962
		if (epos->bh) {
1963
			if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
M
Marcin Slusarz 已提交
1964
			    UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
J
Jan Kara 已提交
1965
				udf_update_tag(epos->bh->b_data, loffset);
L
Linus Torvalds 已提交
1966
			else
M
Marcin Slusarz 已提交
1967 1968
				udf_update_tag(epos->bh->b_data,
						sizeof(struct allocExtDesc));
J
Jan Kara 已提交
1969
			mark_buffer_dirty_inode(epos->bh, inode);
J
Jan Kara 已提交
1970
			brelse(epos->bh);
1971
		} else {
L
Linus Torvalds 已提交
1972
			mark_inode_dirty(inode);
1973
		}
J
Jan Kara 已提交
1974
		epos->bh = nbh;
L
Linus Torvalds 已提交
1975 1976
	}

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

1979
	if (!epos->bh) {
1980
		iinfo->i_lenAlloc += adsize;
L
Linus Torvalds 已提交
1981
		mark_inode_dirty(inode);
1982
	} else {
J
Jan Kara 已提交
1983
		aed = (struct allocExtDesc *)epos->bh->b_data;
1984
		le32_add_cpu(&aed->lengthAllocDescs, adsize);
M
Marcin Slusarz 已提交
1985 1986 1987 1988
		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 已提交
1989
		else
M
Marcin Slusarz 已提交
1990 1991
			udf_update_tag(epos->bh->b_data,
					sizeof(struct allocExtDesc));
J
Jan Kara 已提交
1992
		mark_buffer_dirty_inode(epos->bh, inode);
L
Linus Torvalds 已提交
1993 1994
	}

1995
	return 0;
L
Linus Torvalds 已提交
1996 1997
}

1998 1999
void udf_write_aext(struct inode *inode, struct extent_position *epos,
		    struct kernel_lb_addr *eloc, uint32_t elen, int inc)
L
Linus Torvalds 已提交
2000 2001 2002
{
	int adsize;
	uint8_t *ptr;
2003 2004
	struct short_ad *sad;
	struct long_ad *lad;
2005
	struct udf_inode_info *iinfo = UDF_I(inode);
L
Linus Torvalds 已提交
2006

J
Jan Kara 已提交
2007
	if (!epos->bh)
2008
		ptr = iinfo->i_ext.i_data + epos->offset -
M
Marcin Slusarz 已提交
2009
			udf_file_entry_alloc_offset(inode) +
2010
			iinfo->i_lenEAttr;
L
Linus Torvalds 已提交
2011
	else
J
Jan Kara 已提交
2012
		ptr = epos->bh->b_data + epos->offset;
L
Linus Torvalds 已提交
2013

2014
	switch (iinfo->i_alloc_type) {
2015
	case ICBTAG_FLAG_AD_SHORT:
2016
		sad = (struct short_ad *)ptr;
2017
		sad->extLength = cpu_to_le32(elen);
2018
		sad->extPosition = cpu_to_le32(eloc->logicalBlockNum);
2019
		adsize = sizeof(struct short_ad);
2020
		break;
2021
	case ICBTAG_FLAG_AD_LONG:
2022
		lad = (struct long_ad *)ptr;
2023
		lad->extLength = cpu_to_le32(elen);
2024
		lad->extLocation = cpu_to_lelb(*eloc);
2025
		memset(lad->impUse, 0x00, sizeof(lad->impUse));
2026
		adsize = sizeof(struct long_ad);
2027
		break;
2028
	default:
2029
		return;
L
Linus Torvalds 已提交
2030 2031
	}

2032
	if (epos->bh) {
2033
		if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
M
Marcin Slusarz 已提交
2034
		    UDF_SB(inode->i_sb)->s_udfrev >= 0x0201) {
M
Marcin Slusarz 已提交
2035 2036
			struct allocExtDesc *aed =
				(struct allocExtDesc *)epos->bh->b_data;
J
Jan Kara 已提交
2037
			udf_update_tag(epos->bh->b_data,
M
Marcin Slusarz 已提交
2038 2039
				       le32_to_cpu(aed->lengthAllocDescs) +
				       sizeof(struct allocExtDesc));
L
Linus Torvalds 已提交
2040
		}
J
Jan Kara 已提交
2041
		mark_buffer_dirty_inode(epos->bh, inode);
2042
	} else {
L
Linus Torvalds 已提交
2043
		mark_inode_dirty(inode);
2044
	}
L
Linus Torvalds 已提交
2045 2046

	if (inc)
J
Jan Kara 已提交
2047
		epos->offset += adsize;
L
Linus Torvalds 已提交
2048 2049
}

M
Marcin Slusarz 已提交
2050
int8_t udf_next_aext(struct inode *inode, struct extent_position *epos,
2051
		     struct kernel_lb_addr *eloc, uint32_t *elen, int inc)
L
Linus Torvalds 已提交
2052 2053 2054
{
	int8_t etype;

J
Jan Kara 已提交
2055
	while ((etype = udf_current_aext(inode, epos, eloc, elen, inc)) ==
2056
	       (EXT_NEXT_EXTENT_ALLOCDECS >> 30)) {
M
Marcin Slusarz 已提交
2057
		int block;
J
Jan Kara 已提交
2058 2059
		epos->block = *eloc;
		epos->offset = sizeof(struct allocExtDesc);
J
Jan Kara 已提交
2060
		brelse(epos->bh);
2061
		block = udf_get_lb_pblock(inode->i_sb, &epos->block, 0);
M
Marcin Slusarz 已提交
2062 2063 2064
		epos->bh = udf_tread(inode->i_sb, block);
		if (!epos->bh) {
			udf_debug("reading block %d failed!\n", block);
L
Linus Torvalds 已提交
2065 2066 2067 2068 2069 2070 2071
			return -1;
		}
	}

	return etype;
}

M
Marcin Slusarz 已提交
2072
int8_t udf_current_aext(struct inode *inode, struct extent_position *epos,
2073
			struct kernel_lb_addr *eloc, uint32_t *elen, int inc)
L
Linus Torvalds 已提交
2074 2075 2076 2077
{
	int alen;
	int8_t etype;
	uint8_t *ptr;
2078 2079
	struct short_ad *sad;
	struct long_ad *lad;
2080
	struct udf_inode_info *iinfo = UDF_I(inode);
2081

2082
	if (!epos->bh) {
J
Jan Kara 已提交
2083 2084
		if (!epos->offset)
			epos->offset = udf_file_entry_alloc_offset(inode);
2085
		ptr = iinfo->i_ext.i_data + epos->offset -
M
Marcin Slusarz 已提交
2086
			udf_file_entry_alloc_offset(inode) +
2087
			iinfo->i_lenEAttr;
M
Marcin Slusarz 已提交
2088
		alen = udf_file_entry_alloc_offset(inode) +
2089
							iinfo->i_lenAlloc;
2090
	} else {
J
Jan Kara 已提交
2091 2092 2093
		if (!epos->offset)
			epos->offset = sizeof(struct allocExtDesc);
		ptr = epos->bh->b_data + epos->offset;
2094
		alen = sizeof(struct allocExtDesc) +
M
Marcin Slusarz 已提交
2095 2096
			le32_to_cpu(((struct allocExtDesc *)epos->bh->b_data)->
							lengthAllocDescs);
L
Linus Torvalds 已提交
2097 2098
	}

2099
	switch (iinfo->i_alloc_type) {
2100
	case ICBTAG_FLAG_AD_SHORT:
M
Marcin Slusarz 已提交
2101 2102
		sad = udf_get_fileshortad(ptr, alen, &epos->offset, inc);
		if (!sad)
2103 2104 2105
			return -1;
		etype = le32_to_cpu(sad->extLength) >> 30;
		eloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
M
Marcin Slusarz 已提交
2106
		eloc->partitionReferenceNum =
2107
				iinfo->i_location.partitionReferenceNum;
2108 2109
		*elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK;
		break;
2110
	case ICBTAG_FLAG_AD_LONG:
M
Marcin Slusarz 已提交
2111 2112
		lad = udf_get_filelongad(ptr, alen, &epos->offset, inc);
		if (!lad)
L
Linus Torvalds 已提交
2113
			return -1;
2114 2115 2116 2117 2118
		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 已提交
2119
		udf_debug("alloc_type = %d unsupported\n", iinfo->i_alloc_type);
2120
		return -1;
L
Linus Torvalds 已提交
2121 2122 2123 2124 2125
	}

	return etype;
}

2126
static int8_t udf_insert_aext(struct inode *inode, struct extent_position epos,
2127
			      struct kernel_lb_addr neloc, uint32_t nelen)
L
Linus Torvalds 已提交
2128
{
2129
	struct kernel_lb_addr oeloc;
L
Linus Torvalds 已提交
2130 2131 2132
	uint32_t oelen;
	int8_t etype;

J
Jan Kara 已提交
2133
	if (epos.bh)
J
Jan Kara 已提交
2134
		get_bh(epos.bh);
L
Linus Torvalds 已提交
2135

2136
	while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1) {
2137
		udf_write_aext(inode, &epos, &neloc, nelen, 1);
L
Linus Torvalds 已提交
2138 2139 2140
		neloc = oeloc;
		nelen = (etype << 30) | oelen;
	}
2141
	udf_add_aext(inode, &epos, &neloc, nelen, 1);
J
Jan Kara 已提交
2142
	brelse(epos.bh);
2143

L
Linus Torvalds 已提交
2144 2145 2146
	return (nelen >> 30);
}

M
Marcin Slusarz 已提交
2147
int8_t udf_delete_aext(struct inode *inode, struct extent_position epos,
2148
		       struct kernel_lb_addr eloc, uint32_t elen)
L
Linus Torvalds 已提交
2149
{
J
Jan Kara 已提交
2150 2151
	struct extent_position oepos;
	int adsize;
L
Linus Torvalds 已提交
2152 2153
	int8_t etype;
	struct allocExtDesc *aed;
2154
	struct udf_inode_info *iinfo;
L
Linus Torvalds 已提交
2155

2156
	if (epos.bh) {
J
Jan Kara 已提交
2157 2158
		get_bh(epos.bh);
		get_bh(epos.bh);
L
Linus Torvalds 已提交
2159 2160
	}

2161 2162
	iinfo = UDF_I(inode);
	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
2163
		adsize = sizeof(struct short_ad);
2164
	else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
2165
		adsize = sizeof(struct long_ad);
L
Linus Torvalds 已提交
2166 2167 2168
	else
		adsize = 0;

J
Jan Kara 已提交
2169 2170
	oepos = epos;
	if (udf_next_aext(inode, &epos, &eloc, &elen, 1) == -1)
L
Linus Torvalds 已提交
2171 2172
		return -1;

2173
	while ((etype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1) {
2174
		udf_write_aext(inode, &oepos, &eloc, (etype << 30) | elen, 1);
2175
		if (oepos.bh != epos.bh) {
J
Jan Kara 已提交
2176
			oepos.block = epos.block;
J
Jan Kara 已提交
2177 2178
			brelse(oepos.bh);
			get_bh(epos.bh);
J
Jan Kara 已提交
2179 2180
			oepos.bh = epos.bh;
			oepos.offset = epos.offset - adsize;
L
Linus Torvalds 已提交
2181 2182
		}
	}
2183
	memset(&eloc, 0x00, sizeof(struct kernel_lb_addr));
L
Linus Torvalds 已提交
2184 2185
	elen = 0;

2186
	if (epos.bh != oepos.bh) {
2187 2188 2189
		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);
2190
		if (!oepos.bh) {
2191
			iinfo->i_lenAlloc -= (adsize * 2);
L
Linus Torvalds 已提交
2192
			mark_inode_dirty(inode);
2193
		} else {
J
Jan Kara 已提交
2194
			aed = (struct allocExtDesc *)oepos.bh->b_data;
2195
			le32_add_cpu(&aed->lengthAllocDescs, -(2 * adsize));
2196
			if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
M
Marcin Slusarz 已提交
2197
			    UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
M
Marcin Slusarz 已提交
2198 2199
				udf_update_tag(oepos.bh->b_data,
						oepos.offset - (2 * adsize));
L
Linus Torvalds 已提交
2200
			else
M
Marcin Slusarz 已提交
2201 2202
				udf_update_tag(oepos.bh->b_data,
						sizeof(struct allocExtDesc));
J
Jan Kara 已提交
2203
			mark_buffer_dirty_inode(oepos.bh, inode);
L
Linus Torvalds 已提交
2204
		}
2205
	} else {
2206
		udf_write_aext(inode, &oepos, &eloc, elen, 1);
2207
		if (!oepos.bh) {
2208
			iinfo->i_lenAlloc -= adsize;
L
Linus Torvalds 已提交
2209
			mark_inode_dirty(inode);
2210
		} else {
J
Jan Kara 已提交
2211
			aed = (struct allocExtDesc *)oepos.bh->b_data;
2212
			le32_add_cpu(&aed->lengthAllocDescs, -adsize);
2213
			if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) ||
M
Marcin Slusarz 已提交
2214
			    UDF_SB(inode->i_sb)->s_udfrev >= 0x0201)
M
Marcin Slusarz 已提交
2215 2216
				udf_update_tag(oepos.bh->b_data,
						epos.offset - adsize);
L
Linus Torvalds 已提交
2217
			else
M
Marcin Slusarz 已提交
2218 2219
				udf_update_tag(oepos.bh->b_data,
						sizeof(struct allocExtDesc));
J
Jan Kara 已提交
2220
			mark_buffer_dirty_inode(oepos.bh, inode);
L
Linus Torvalds 已提交
2221 2222
		}
	}
2223

J
Jan Kara 已提交
2224 2225
	brelse(epos.bh);
	brelse(oepos.bh);
2226

L
Linus Torvalds 已提交
2227 2228 2229
	return (elen >> 30);
}

M
Marcin Slusarz 已提交
2230
int8_t inode_bmap(struct inode *inode, sector_t block,
2231
		  struct extent_position *pos, struct kernel_lb_addr *eloc,
M
Marcin Slusarz 已提交
2232
		  uint32_t *elen, sector_t *offset)
L
Linus Torvalds 已提交
2233
{
M
Marcin Slusarz 已提交
2234
	unsigned char blocksize_bits = inode->i_sb->s_blocksize_bits;
2235
	loff_t lbcount = 0, bcount =
M
Marcin Slusarz 已提交
2236
	    (loff_t) block << blocksize_bits;
L
Linus Torvalds 已提交
2237
	int8_t etype;
2238
	struct udf_inode_info *iinfo;
L
Linus Torvalds 已提交
2239

2240
	iinfo = UDF_I(inode);
2241 2242 2243 2244 2245
	if (!udf_read_extent_cache(inode, bcount, &lbcount, pos)) {
		pos->offset = 0;
		pos->block = iinfo->i_location;
		pos->bh = NULL;
	}
L
Linus Torvalds 已提交
2246
	*elen = 0;
2247
	do {
M
Marcin Slusarz 已提交
2248 2249 2250
		etype = udf_next_aext(inode, pos, eloc, elen, 1);
		if (etype == -1) {
			*offset = (bcount - lbcount) >> blocksize_bits;
2251
			iinfo->i_lenExtents = lbcount;
L
Linus Torvalds 已提交
2252 2253 2254 2255
			return -1;
		}
		lbcount += *elen;
	} while (lbcount <= bcount);
2256 2257
	/* update extent cache */
	udf_update_extent_cache(inode, lbcount - *elen, pos, 1);
M
Marcin Slusarz 已提交
2258
	*offset = (bcount + *elen - lbcount) >> blocksize_bits;
L
Linus Torvalds 已提交
2259 2260 2261 2262

	return etype;
}

2263
long udf_block_map(struct inode *inode, sector_t block)
L
Linus Torvalds 已提交
2264
{
2265
	struct kernel_lb_addr eloc;
J
Jan Kara 已提交
2266
	uint32_t elen;
2267
	sector_t offset;
2268
	struct extent_position epos = {};
L
Linus Torvalds 已提交
2269 2270
	int ret;

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

M
Marcin Slusarz 已提交
2273 2274
	if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) ==
						(EXT_RECORDED_ALLOCATED >> 30))
2275
		ret = udf_get_lb_pblock(inode->i_sb, &eloc, offset);
L
Linus Torvalds 已提交
2276 2277 2278
	else
		ret = 0;

2279
	up_read(&UDF_I(inode)->i_data_sem);
J
Jan Kara 已提交
2280
	brelse(epos.bh);
L
Linus Torvalds 已提交
2281 2282 2283 2284 2285 2286

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