Linux Audio

Check our new training course

Loading...
v4.10.11
   1/*
   2 * namei.c
   3 *
   4 * PURPOSE
   5 *      Inode name handling routines for the OSTA-UDF(tm) filesystem.
   6 *
   7 * COPYRIGHT
   8 *      This file is distributed under the terms of the GNU General Public
   9 *      License (GPL). Copies of the GPL can be obtained from:
  10 *              ftp://prep.ai.mit.edu/pub/gnu/GPL
  11 *      Each contributing author retains all rights to their own work.
  12 *
  13 *  (C) 1998-2004 Ben Fennema
  14 *  (C) 1999-2000 Stelias Computing Inc
  15 *
  16 * HISTORY
  17 *
  18 *  12/12/98 blf  Created. Split out the lookup code from dir.c
  19 *  04/19/99 blf  link, mknod, symlink support
  20 */
  21
  22#include "udfdecl.h"
  23
  24#include "udf_i.h"
  25#include "udf_sb.h"
  26#include <linux/string.h>
  27#include <linux/errno.h>
  28#include <linux/mm.h>
  29#include <linux/slab.h>
  30#include <linux/sched.h>
  31#include <linux/crc-itu-t.h>
  32#include <linux/exportfs.h>
  33
  34static inline int udf_match(int len1, const unsigned char *name1, int len2,
  35			    const unsigned char *name2)
  36{
  37	if (len1 != len2)
  38		return 0;
  39
  40	return !memcmp(name1, name2, len1);
  41}
  42
  43int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi,
  44		 struct fileIdentDesc *sfi, struct udf_fileident_bh *fibh,
  45		 uint8_t *impuse, uint8_t *fileident)
  46{
  47	uint16_t crclen = fibh->eoffset - fibh->soffset - sizeof(struct tag);
  48	uint16_t crc;
  49	int offset;
  50	uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse);
  51	uint8_t lfi = cfi->lengthFileIdent;
  52	int padlen = fibh->eoffset - fibh->soffset - liu - lfi -
  53		sizeof(struct fileIdentDesc);
  54	int adinicb = 0;
  55
  56	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
  57		adinicb = 1;
  58
  59	offset = fibh->soffset + sizeof(struct fileIdentDesc);
  60
  61	if (impuse) {
  62		if (adinicb || (offset + liu < 0)) {
  63			memcpy((uint8_t *)sfi->impUse, impuse, liu);
  64		} else if (offset >= 0) {
  65			memcpy(fibh->ebh->b_data + offset, impuse, liu);
  66		} else {
  67			memcpy((uint8_t *)sfi->impUse, impuse, -offset);
  68			memcpy(fibh->ebh->b_data, impuse - offset,
  69				liu + offset);
  70		}
  71	}
  72
  73	offset += liu;
  74
  75	if (fileident) {
  76		if (adinicb || (offset + lfi < 0)) {
  77			memcpy((uint8_t *)sfi->fileIdent + liu, fileident, lfi);
  78		} else if (offset >= 0) {
  79			memcpy(fibh->ebh->b_data + offset, fileident, lfi);
  80		} else {
  81			memcpy((uint8_t *)sfi->fileIdent + liu, fileident,
  82				-offset);
  83			memcpy(fibh->ebh->b_data, fileident - offset,
  84				lfi + offset);
  85		}
  86	}
  87
  88	offset += lfi;
  89
  90	if (adinicb || (offset + padlen < 0)) {
  91		memset((uint8_t *)sfi->padding + liu + lfi, 0x00, padlen);
  92	} else if (offset >= 0) {
  93		memset(fibh->ebh->b_data + offset, 0x00, padlen);
  94	} else {
  95		memset((uint8_t *)sfi->padding + liu + lfi, 0x00, -offset);
  96		memset(fibh->ebh->b_data, 0x00, padlen + offset);
  97	}
  98
  99	crc = crc_itu_t(0, (uint8_t *)cfi + sizeof(struct tag),
 100		      sizeof(struct fileIdentDesc) - sizeof(struct tag));
 101
 102	if (fibh->sbh == fibh->ebh) {
 103		crc = crc_itu_t(crc, (uint8_t *)sfi->impUse,
 104			      crclen + sizeof(struct tag) -
 105			      sizeof(struct fileIdentDesc));
 106	} else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) {
 107		crc = crc_itu_t(crc, fibh->ebh->b_data +
 108					sizeof(struct fileIdentDesc) +
 109					fibh->soffset,
 110			      crclen + sizeof(struct tag) -
 111					sizeof(struct fileIdentDesc));
 112	} else {
 113		crc = crc_itu_t(crc, (uint8_t *)sfi->impUse,
 114			      -fibh->soffset - sizeof(struct fileIdentDesc));
 115		crc = crc_itu_t(crc, fibh->ebh->b_data, fibh->eoffset);
 116	}
 117
 118	cfi->descTag.descCRC = cpu_to_le16(crc);
 119	cfi->descTag.descCRCLength = cpu_to_le16(crclen);
 120	cfi->descTag.tagChecksum = udf_tag_checksum(&cfi->descTag);
 121
 122	if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) {
 123		memcpy((uint8_t *)sfi, (uint8_t *)cfi,
 124			sizeof(struct fileIdentDesc));
 125	} else {
 126		memcpy((uint8_t *)sfi, (uint8_t *)cfi, -fibh->soffset);
 127		memcpy(fibh->ebh->b_data, (uint8_t *)cfi - fibh->soffset,
 128		       sizeof(struct fileIdentDesc) + fibh->soffset);
 129	}
 130
 131	if (adinicb) {
 132		mark_inode_dirty(inode);
 133	} else {
 134		if (fibh->sbh != fibh->ebh)
 135			mark_buffer_dirty_inode(fibh->ebh, inode);
 136		mark_buffer_dirty_inode(fibh->sbh, inode);
 137	}
 138	return 0;
 139}
 140
 141/**
 142 * udf_find_entry - find entry in given directory.
 143 *
 144 * @dir:	directory inode to search in
 145 * @child:	qstr of the name
 146 * @fibh:	buffer head / inode with file identifier descriptor we found
 147 * @cfi:	found file identifier descriptor with given name
 148 *
 149 * This function searches in the directory @dir for a file name @child. When
 150 * found, @fibh points to the buffer head(s) (bh is NULL for in ICB
 151 * directories) containing the file identifier descriptor (FID). In that case
 152 * the function returns pointer to the FID in the buffer or inode - but note
 153 * that FID may be split among two buffers (blocks) so accessing it via that
 154 * pointer isn't easily possible. This pointer can be used only as an iterator
 155 * for other directory manipulation functions. For inspection of the FID @cfi
 156 * can be used - the found FID is copied there.
 157 *
 158 * Returns pointer to FID, NULL when nothing found, or error code.
 159 */
 160static struct fileIdentDesc *udf_find_entry(struct inode *dir,
 161					    const struct qstr *child,
 162					    struct udf_fileident_bh *fibh,
 163					    struct fileIdentDesc *cfi)
 164{
 165	struct fileIdentDesc *fi = NULL;
 166	loff_t f_pos;
 167	int block, flen;
 
 168	unsigned char *fname = NULL, *copy_name = NULL;
 169	unsigned char *nameptr;
 170	uint8_t lfi;
 171	uint16_t liu;
 172	loff_t size;
 173	struct kernel_lb_addr eloc;
 174	uint32_t elen;
 175	sector_t offset;
 176	struct extent_position epos = {};
 177	struct udf_inode_info *dinfo = UDF_I(dir);
 178	int isdotdot = child->len == 2 &&
 179		child->name[0] == '.' && child->name[1] == '.';
 180	struct super_block *sb = dir->i_sb;
 181
 182	size = udf_ext0_offset(dir) + dir->i_size;
 183	f_pos = udf_ext0_offset(dir);
 184
 185	fibh->sbh = fibh->ebh = NULL;
 186	fibh->soffset = fibh->eoffset = f_pos & (sb->s_blocksize - 1);
 187	if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 188		if (inode_bmap(dir, f_pos >> sb->s_blocksize_bits, &epos,
 189		    &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) {
 190			fi = ERR_PTR(-EIO);
 191			goto out_err;
 192		}
 193
 194		block = udf_get_lb_pblock(sb, &eloc, offset);
 195		if ((++offset << sb->s_blocksize_bits) < elen) {
 196			if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 197				epos.offset -= sizeof(struct short_ad);
 198			else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 199				epos.offset -= sizeof(struct long_ad);
 200		} else
 201			offset = 0;
 202
 203		fibh->sbh = fibh->ebh = udf_tread(sb, block);
 204		if (!fibh->sbh) {
 205			fi = ERR_PTR(-EIO);
 206			goto out_err;
 207		}
 208	}
 209
 210	fname = kmalloc(UDF_NAME_LEN, GFP_NOFS);
 211	if (!fname) {
 212		fi = ERR_PTR(-ENOMEM);
 213		goto out_err;
 214	}
 215
 216	while (f_pos < size) {
 217		fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
 218					&elen, &offset);
 219		if (!fi) {
 220			fi = ERR_PTR(-EIO);
 221			goto out_err;
 222		}
 223
 224		liu = le16_to_cpu(cfi->lengthOfImpUse);
 225		lfi = cfi->lengthFileIdent;
 226
 227		if (fibh->sbh == fibh->ebh) {
 228			nameptr = fi->fileIdent + liu;
 229		} else {
 230			int poffset;	/* Unpaded ending offset */
 231
 232			poffset = fibh->soffset + sizeof(struct fileIdentDesc) +
 233					liu + lfi;
 234
 235			if (poffset >= lfi)
 236				nameptr = (uint8_t *)(fibh->ebh->b_data +
 237						      poffset - lfi);
 238			else {
 239				if (!copy_name) {
 240					copy_name = kmalloc(UDF_NAME_LEN,
 241							    GFP_NOFS);
 242					if (!copy_name) {
 243						fi = ERR_PTR(-ENOMEM);
 244						goto out_err;
 245					}
 246				}
 247				nameptr = copy_name;
 248				memcpy(nameptr, fi->fileIdent + liu,
 249					lfi - poffset);
 250				memcpy(nameptr + lfi - poffset,
 251					fibh->ebh->b_data, poffset);
 252			}
 253		}
 254
 255		if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
 256			if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE))
 257				continue;
 258		}
 259
 260		if ((cfi->fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) {
 261			if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE))
 262				continue;
 263		}
 264
 265		if ((cfi->fileCharacteristics & FID_FILE_CHAR_PARENT) &&
 266		    isdotdot)
 267			goto out_ok;
 268
 269		if (!lfi)
 270			continue;
 271
 272		flen = udf_get_filename(sb, nameptr, lfi, fname, UDF_NAME_LEN);
 273		if (flen < 0) {
 274			fi = ERR_PTR(flen);
 275			goto out_err;
 276		}
 277
 278		if (udf_match(flen, fname, child->len, child->name))
 279			goto out_ok;
 280	}
 281
 282	fi = NULL;
 283out_err:
 284	if (fibh->sbh != fibh->ebh)
 285		brelse(fibh->ebh);
 286	brelse(fibh->sbh);
 287out_ok:
 288	brelse(epos.bh);
 289	kfree(fname);
 290	kfree(copy_name);
 291
 292	return fi;
 293}
 294
 295static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
 296				 unsigned int flags)
 297{
 298	struct inode *inode = NULL;
 299	struct fileIdentDesc cfi;
 300	struct udf_fileident_bh fibh;
 301	struct fileIdentDesc *fi;
 302
 303	if (dentry->d_name.len > UDF_NAME_LEN)
 304		return ERR_PTR(-ENAMETOOLONG);
 305
 306#ifdef UDF_RECOVERY
 307	/* temporary shorthand for specifying files by inode number */
 308	if (!strncmp(dentry->d_name.name, ".B=", 3)) {
 309		struct kernel_lb_addr lb = {
 310			.logicalBlockNum = 0,
 311			.partitionReferenceNum =
 312				simple_strtoul(dentry->d_name.name + 3,
 313						NULL, 0),
 314		};
 315		inode = udf_iget(dir->i_sb, lb);
 316		if (IS_ERR(inode))
 317			return inode;
 318	} else
 319#endif /* UDF_RECOVERY */
 320
 321	fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 322	if (IS_ERR(fi))
 323		return ERR_CAST(fi);
 324
 325	if (fi) {
 326		struct kernel_lb_addr loc;
 327
 328		if (fibh.sbh != fibh.ebh)
 329			brelse(fibh.ebh);
 330		brelse(fibh.sbh);
 331
 332		loc = lelb_to_cpu(cfi.icb.extLocation);
 333		inode = udf_iget(dir->i_sb, &loc);
 334		if (IS_ERR(inode))
 335			return ERR_CAST(inode);
 336	}
 337
 338	return d_splice_alias(inode, dentry);
 339}
 340
 341static struct fileIdentDesc *udf_add_entry(struct inode *dir,
 342					   struct dentry *dentry,
 343					   struct udf_fileident_bh *fibh,
 344					   struct fileIdentDesc *cfi, int *err)
 345{
 346	struct super_block *sb = dir->i_sb;
 347	struct fileIdentDesc *fi = NULL;
 348	unsigned char *name = NULL;
 349	int namelen;
 350	loff_t f_pos;
 351	loff_t size = udf_ext0_offset(dir) + dir->i_size;
 352	int nfidlen;
 353	uint8_t lfi;
 354	uint16_t liu;
 355	int block;
 356	struct kernel_lb_addr eloc;
 357	uint32_t elen = 0;
 358	sector_t offset;
 359	struct extent_position epos = {};
 360	struct udf_inode_info *dinfo;
 361
 362	fibh->sbh = fibh->ebh = NULL;
 363	name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
 364	if (!name) {
 365		*err = -ENOMEM;
 366		goto out_err;
 367	}
 368
 369	if (dentry) {
 370		if (!dentry->d_name.len) {
 371			*err = -EINVAL;
 372			goto out_err;
 373		}
 374		namelen = udf_put_filename(sb, dentry->d_name.name,
 375					   dentry->d_name.len,
 376					   name, UDF_NAME_LEN_CS0);
 377		if (!namelen) {
 378			*err = -ENAMETOOLONG;
 379			goto out_err;
 380		}
 381	} else {
 382		namelen = 0;
 383	}
 384
 385	nfidlen = (sizeof(struct fileIdentDesc) + namelen + 3) & ~3;
 386
 387	f_pos = udf_ext0_offset(dir);
 388
 389	fibh->soffset = fibh->eoffset = f_pos & (dir->i_sb->s_blocksize - 1);
 390	dinfo = UDF_I(dir);
 391	if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 392		if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos,
 393		    &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) {
 394			block = udf_get_lb_pblock(dir->i_sb,
 395					&dinfo->i_location, 0);
 396			fibh->soffset = fibh->eoffset = sb->s_blocksize;
 397			goto add;
 398		}
 399		block = udf_get_lb_pblock(dir->i_sb, &eloc, offset);
 400		if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
 401			if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 402				epos.offset -= sizeof(struct short_ad);
 403			else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 404				epos.offset -= sizeof(struct long_ad);
 405		} else
 406			offset = 0;
 407
 408		fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block);
 409		if (!fibh->sbh) {
 410			*err = -EIO;
 411			goto out_err;
 412		}
 413
 414		block = dinfo->i_location.logicalBlockNum;
 415	}
 416
 417	while (f_pos < size) {
 418		fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
 419					&elen, &offset);
 420
 421		if (!fi) {
 422			*err = -EIO;
 423			goto out_err;
 424		}
 425
 426		liu = le16_to_cpu(cfi->lengthOfImpUse);
 427		lfi = cfi->lengthFileIdent;
 428
 429		if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
 430			if (((sizeof(struct fileIdentDesc) +
 431					liu + lfi + 3) & ~3) == nfidlen) {
 432				cfi->descTag.tagSerialNum = cpu_to_le16(1);
 433				cfi->fileVersionNum = cpu_to_le16(1);
 434				cfi->fileCharacteristics = 0;
 435				cfi->lengthFileIdent = namelen;
 436				cfi->lengthOfImpUse = cpu_to_le16(0);
 437				if (!udf_write_fi(dir, cfi, fi, fibh, NULL,
 438						  name))
 439					goto out_ok;
 440				else {
 441					*err = -EIO;
 442					goto out_err;
 443				}
 444			}
 445		}
 446	}
 447
 448add:
 449	f_pos += nfidlen;
 450
 451	if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB &&
 452	    sb->s_blocksize - fibh->eoffset < nfidlen) {
 453		brelse(epos.bh);
 454		epos.bh = NULL;
 455		fibh->soffset -= udf_ext0_offset(dir);
 456		fibh->eoffset -= udf_ext0_offset(dir);
 457		f_pos -= udf_ext0_offset(dir);
 458		if (fibh->sbh != fibh->ebh)
 459			brelse(fibh->ebh);
 460		brelse(fibh->sbh);
 461		fibh->sbh = fibh->ebh =
 462				udf_expand_dir_adinicb(dir, &block, err);
 463		if (!fibh->sbh)
 464			goto out_err;
 465		epos.block = dinfo->i_location;
 466		epos.offset = udf_file_entry_alloc_offset(dir);
 467		/* Load extent udf_expand_dir_adinicb() has created */
 468		udf_current_aext(dir, &epos, &eloc, &elen, 1);
 469	}
 470
 471	/* Entry fits into current block? */
 472	if (sb->s_blocksize - fibh->eoffset >= nfidlen) {
 473		fibh->soffset = fibh->eoffset;
 474		fibh->eoffset += nfidlen;
 475		if (fibh->sbh != fibh->ebh) {
 476			brelse(fibh->sbh);
 477			fibh->sbh = fibh->ebh;
 478		}
 479
 480		if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
 481			block = dinfo->i_location.logicalBlockNum;
 482			fi = (struct fileIdentDesc *)
 483					(dinfo->i_ext.i_data +
 484					 fibh->soffset -
 485					 udf_ext0_offset(dir) +
 486					 dinfo->i_lenEAttr);
 487		} else {
 488			block = eloc.logicalBlockNum +
 489					((elen - 1) >>
 490						dir->i_sb->s_blocksize_bits);
 491			fi = (struct fileIdentDesc *)
 492				(fibh->sbh->b_data + fibh->soffset);
 493		}
 494	} else {
 495		/* Round up last extent in the file */
 496		elen = (elen + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1);
 497		if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 498			epos.offset -= sizeof(struct short_ad);
 499		else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 500			epos.offset -= sizeof(struct long_ad);
 501		udf_write_aext(dir, &epos, &eloc, elen, 1);
 502		dinfo->i_lenExtents = (dinfo->i_lenExtents + sb->s_blocksize
 503					- 1) & ~(sb->s_blocksize - 1);
 504
 505		fibh->soffset = fibh->eoffset - sb->s_blocksize;
 506		fibh->eoffset += nfidlen - sb->s_blocksize;
 507		if (fibh->sbh != fibh->ebh) {
 508			brelse(fibh->sbh);
 509			fibh->sbh = fibh->ebh;
 510		}
 511
 512		block = eloc.logicalBlockNum + ((elen - 1) >>
 513						dir->i_sb->s_blocksize_bits);
 514		fibh->ebh = udf_bread(dir,
 515				f_pos >> dir->i_sb->s_blocksize_bits, 1, err);
 516		if (!fibh->ebh)
 517			goto out_err;
 518		/* Extents could have been merged, invalidate our position */
 519		brelse(epos.bh);
 520		epos.bh = NULL;
 521		epos.block = dinfo->i_location;
 522		epos.offset = udf_file_entry_alloc_offset(dir);
 523
 524		if (!fibh->soffset) {
 525			/* Find the freshly allocated block */
 526			while (udf_next_aext(dir, &epos, &eloc, &elen, 1) ==
 527				(EXT_RECORDED_ALLOCATED >> 30))
 528				;
 529			block = eloc.logicalBlockNum + ((elen - 1) >>
 530					dir->i_sb->s_blocksize_bits);
 531			brelse(fibh->sbh);
 532			fibh->sbh = fibh->ebh;
 533			fi = (struct fileIdentDesc *)(fibh->sbh->b_data);
 534		} else {
 535			fi = (struct fileIdentDesc *)
 536				(fibh->sbh->b_data + sb->s_blocksize +
 537					fibh->soffset);
 538		}
 539	}
 540
 541	memset(cfi, 0, sizeof(struct fileIdentDesc));
 542	if (UDF_SB(sb)->s_udfrev >= 0x0200)
 543		udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block,
 544			    sizeof(struct tag));
 545	else
 546		udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block,
 547			    sizeof(struct tag));
 548	cfi->fileVersionNum = cpu_to_le16(1);
 549	cfi->lengthFileIdent = namelen;
 550	cfi->lengthOfImpUse = cpu_to_le16(0);
 551	if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) {
 552		dir->i_size += nfidlen;
 553		if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 554			dinfo->i_lenAlloc += nfidlen;
 555		else {
 556			/* Find the last extent and truncate it to proper size */
 557			while (udf_next_aext(dir, &epos, &eloc, &elen, 1) ==
 558				(EXT_RECORDED_ALLOCATED >> 30))
 559				;
 560			elen -= dinfo->i_lenExtents - dir->i_size;
 561			if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 562				epos.offset -= sizeof(struct short_ad);
 563			else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 564				epos.offset -= sizeof(struct long_ad);
 565			udf_write_aext(dir, &epos, &eloc, elen, 1);
 566			dinfo->i_lenExtents = dir->i_size;
 567		}
 568
 569		mark_inode_dirty(dir);
 570		goto out_ok;
 571	} else {
 572		*err = -EIO;
 573		goto out_err;
 574	}
 575
 576out_err:
 577	fi = NULL;
 578	if (fibh->sbh != fibh->ebh)
 579		brelse(fibh->ebh);
 580	brelse(fibh->sbh);
 581out_ok:
 582	brelse(epos.bh);
 583	kfree(name);
 584	return fi;
 585}
 586
 587static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi,
 588			    struct udf_fileident_bh *fibh,
 589			    struct fileIdentDesc *cfi)
 590{
 591	cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED;
 592
 593	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
 594		memset(&(cfi->icb), 0x00, sizeof(struct long_ad));
 595
 596	return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL);
 597}
 598
 599static int udf_add_nondir(struct dentry *dentry, struct inode *inode)
 600{
 601	struct udf_inode_info *iinfo = UDF_I(inode);
 602	struct inode *dir = d_inode(dentry->d_parent);
 603	struct udf_fileident_bh fibh;
 604	struct fileIdentDesc cfi, *fi;
 605	int err;
 606
 607	fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
 608	if (unlikely(!fi)) {
 609		inode_dec_link_count(inode);
 610		unlock_new_inode(inode);
 611		iput(inode);
 612		return err;
 613	}
 614	cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 615	cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location);
 616	*(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 617		cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
 618	udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
 619	dir->i_ctime = dir->i_mtime = current_time(dir);
 620	mark_inode_dirty(dir);
 621	if (fibh.sbh != fibh.ebh)
 622		brelse(fibh.ebh);
 623	brelse(fibh.sbh);
 624	unlock_new_inode(inode);
 625	d_instantiate(dentry, inode);
 626
 627	return 0;
 628}
 629
 630static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 631		      bool excl)
 632{
 633	struct inode *inode = udf_new_inode(dir, mode);
 634
 635	if (IS_ERR(inode))
 636		return PTR_ERR(inode);
 637
 638	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 639		inode->i_data.a_ops = &udf_adinicb_aops;
 640	else
 641		inode->i_data.a_ops = &udf_aops;
 642	inode->i_op = &udf_file_inode_operations;
 643	inode->i_fop = &udf_file_operations;
 644	mark_inode_dirty(inode);
 645
 646	return udf_add_nondir(dentry, inode);
 647}
 648
 649static int udf_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
 650{
 651	struct inode *inode = udf_new_inode(dir, mode);
 652
 653	if (IS_ERR(inode))
 654		return PTR_ERR(inode);
 655
 656	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 657		inode->i_data.a_ops = &udf_adinicb_aops;
 658	else
 659		inode->i_data.a_ops = &udf_aops;
 660	inode->i_op = &udf_file_inode_operations;
 661	inode->i_fop = &udf_file_operations;
 662	mark_inode_dirty(inode);
 663	d_tmpfile(dentry, inode);
 664	unlock_new_inode(inode);
 665	return 0;
 666}
 667
 668static int udf_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
 669		     dev_t rdev)
 670{
 671	struct inode *inode;
 672
 673	if (!old_valid_dev(rdev))
 674		return -EINVAL;
 675
 676	inode = udf_new_inode(dir, mode);
 677	if (IS_ERR(inode))
 678		return PTR_ERR(inode);
 679
 680	init_special_inode(inode, mode, rdev);
 681	return udf_add_nondir(dentry, inode);
 682}
 683
 684static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 685{
 686	struct inode *inode;
 687	struct udf_fileident_bh fibh;
 688	struct fileIdentDesc cfi, *fi;
 689	int err;
 690	struct udf_inode_info *dinfo = UDF_I(dir);
 691	struct udf_inode_info *iinfo;
 692
 693	inode = udf_new_inode(dir, S_IFDIR | mode);
 694	if (IS_ERR(inode))
 695		return PTR_ERR(inode);
 696
 697	iinfo = UDF_I(inode);
 698	inode->i_op = &udf_dir_inode_operations;
 699	inode->i_fop = &udf_dir_operations;
 700	fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err);
 701	if (!fi) {
 702		inode_dec_link_count(inode);
 703		unlock_new_inode(inode);
 704		iput(inode);
 705		goto out;
 706	}
 707	set_nlink(inode, 2);
 708	cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 709	cfi.icb.extLocation = cpu_to_lelb(dinfo->i_location);
 710	*(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 711		cpu_to_le32(dinfo->i_unique & 0x00000000FFFFFFFFUL);
 712	cfi.fileCharacteristics =
 713			FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT;
 714	udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL);
 715	brelse(fibh.sbh);
 716	mark_inode_dirty(inode);
 717
 718	fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
 719	if (!fi) {
 720		clear_nlink(inode);
 721		mark_inode_dirty(inode);
 722		unlock_new_inode(inode);
 723		iput(inode);
 724		goto out;
 725	}
 726	cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 727	cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location);
 728	*(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 729		cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
 730	cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY;
 731	udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
 732	inc_nlink(dir);
 733	dir->i_ctime = dir->i_mtime = current_time(dir);
 734	mark_inode_dirty(dir);
 735	unlock_new_inode(inode);
 736	d_instantiate(dentry, inode);
 737	if (fibh.sbh != fibh.ebh)
 738		brelse(fibh.ebh);
 739	brelse(fibh.sbh);
 740	err = 0;
 741
 742out:
 743	return err;
 744}
 745
 746static int empty_dir(struct inode *dir)
 747{
 748	struct fileIdentDesc *fi, cfi;
 749	struct udf_fileident_bh fibh;
 750	loff_t f_pos;
 751	loff_t size = udf_ext0_offset(dir) + dir->i_size;
 752	int block;
 753	struct kernel_lb_addr eloc;
 754	uint32_t elen;
 755	sector_t offset;
 756	struct extent_position epos = {};
 757	struct udf_inode_info *dinfo = UDF_I(dir);
 758
 759	f_pos = udf_ext0_offset(dir);
 760	fibh.soffset = fibh.eoffset = f_pos & (dir->i_sb->s_blocksize - 1);
 761
 762	if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 763		fibh.sbh = fibh.ebh = NULL;
 764	else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits,
 765			      &epos, &eloc, &elen, &offset) ==
 766					(EXT_RECORDED_ALLOCATED >> 30)) {
 767		block = udf_get_lb_pblock(dir->i_sb, &eloc, offset);
 768		if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
 769			if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 770				epos.offset -= sizeof(struct short_ad);
 771			else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 772				epos.offset -= sizeof(struct long_ad);
 773		} else
 774			offset = 0;
 775
 776		fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block);
 777		if (!fibh.sbh) {
 778			brelse(epos.bh);
 779			return 0;
 780		}
 781	} else {
 782		brelse(epos.bh);
 783		return 0;
 784	}
 785
 786	while (f_pos < size) {
 787		fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc,
 788					&elen, &offset);
 789		if (!fi) {
 790			if (fibh.sbh != fibh.ebh)
 791				brelse(fibh.ebh);
 792			brelse(fibh.sbh);
 793			brelse(epos.bh);
 794			return 0;
 795		}
 796
 797		if (cfi.lengthFileIdent &&
 798		    (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) {
 799			if (fibh.sbh != fibh.ebh)
 800				brelse(fibh.ebh);
 801			brelse(fibh.sbh);
 802			brelse(epos.bh);
 803			return 0;
 804		}
 805	}
 806
 807	if (fibh.sbh != fibh.ebh)
 808		brelse(fibh.ebh);
 809	brelse(fibh.sbh);
 810	brelse(epos.bh);
 811
 812	return 1;
 813}
 814
 815static int udf_rmdir(struct inode *dir, struct dentry *dentry)
 816{
 817	int retval;
 818	struct inode *inode = d_inode(dentry);
 819	struct udf_fileident_bh fibh;
 820	struct fileIdentDesc *fi, cfi;
 821	struct kernel_lb_addr tloc;
 822
 823	retval = -ENOENT;
 824	fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 825	if (IS_ERR_OR_NULL(fi)) {
 826		if (fi)
 827			retval = PTR_ERR(fi);
 828		goto out;
 829	}
 830
 831	retval = -EIO;
 832	tloc = lelb_to_cpu(cfi.icb.extLocation);
 833	if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino)
 834		goto end_rmdir;
 835	retval = -ENOTEMPTY;
 836	if (!empty_dir(inode))
 837		goto end_rmdir;
 838	retval = udf_delete_entry(dir, fi, &fibh, &cfi);
 839	if (retval)
 840		goto end_rmdir;
 841	if (inode->i_nlink != 2)
 842		udf_warn(inode->i_sb, "empty directory has nlink != 2 (%d)\n",
 843			 inode->i_nlink);
 844	clear_nlink(inode);
 845	inode->i_size = 0;
 846	inode_dec_link_count(dir);
 847	inode->i_ctime = dir->i_ctime = dir->i_mtime =
 848						current_time(inode);
 849	mark_inode_dirty(dir);
 850
 851end_rmdir:
 852	if (fibh.sbh != fibh.ebh)
 853		brelse(fibh.ebh);
 854	brelse(fibh.sbh);
 855
 856out:
 857	return retval;
 858}
 859
 860static int udf_unlink(struct inode *dir, struct dentry *dentry)
 861{
 862	int retval;
 863	struct inode *inode = d_inode(dentry);
 864	struct udf_fileident_bh fibh;
 865	struct fileIdentDesc *fi;
 866	struct fileIdentDesc cfi;
 867	struct kernel_lb_addr tloc;
 868
 869	retval = -ENOENT;
 870	fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 871
 872	if (IS_ERR_OR_NULL(fi)) {
 873		if (fi)
 874			retval = PTR_ERR(fi);
 875		goto out;
 876	}
 877
 878	retval = -EIO;
 879	tloc = lelb_to_cpu(cfi.icb.extLocation);
 880	if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino)
 881		goto end_unlink;
 882
 883	if (!inode->i_nlink) {
 884		udf_debug("Deleting nonexistent file (%lu), %d\n",
 885			  inode->i_ino, inode->i_nlink);
 886		set_nlink(inode, 1);
 887	}
 888	retval = udf_delete_entry(dir, fi, &fibh, &cfi);
 889	if (retval)
 890		goto end_unlink;
 891	dir->i_ctime = dir->i_mtime = current_time(dir);
 892	mark_inode_dirty(dir);
 893	inode_dec_link_count(inode);
 894	inode->i_ctime = dir->i_ctime;
 895	retval = 0;
 896
 897end_unlink:
 898	if (fibh.sbh != fibh.ebh)
 899		brelse(fibh.ebh);
 900	brelse(fibh.sbh);
 901
 902out:
 903	return retval;
 904}
 905
 906static int udf_symlink(struct inode *dir, struct dentry *dentry,
 907		       const char *symname)
 908{
 909	struct inode *inode = udf_new_inode(dir, S_IFLNK | S_IRWXUGO);
 910	struct pathComponent *pc;
 911	const char *compstart;
 912	struct extent_position epos = {};
 913	int eoffset, elen = 0;
 914	uint8_t *ea;
 915	int err;
 916	int block;
 917	unsigned char *name = NULL;
 918	int namelen;
 919	struct udf_inode_info *iinfo;
 920	struct super_block *sb = dir->i_sb;
 921
 922	if (IS_ERR(inode))
 923		return PTR_ERR(inode);
 924
 925	iinfo = UDF_I(inode);
 926	down_write(&iinfo->i_data_sem);
 927	name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
 928	if (!name) {
 929		err = -ENOMEM;
 930		goto out_no_entry;
 931	}
 932
 933	inode->i_data.a_ops = &udf_symlink_aops;
 934	inode->i_op = &page_symlink_inode_operations;
 935	inode_nohighmem(inode);
 936
 937	if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 938		struct kernel_lb_addr eloc;
 939		uint32_t bsize;
 940
 941		block = udf_new_block(sb, inode,
 942				iinfo->i_location.partitionReferenceNum,
 943				iinfo->i_location.logicalBlockNum, &err);
 944		if (!block)
 945			goto out_no_entry;
 946		epos.block = iinfo->i_location;
 947		epos.offset = udf_file_entry_alloc_offset(inode);
 948		epos.bh = NULL;
 949		eloc.logicalBlockNum = block;
 950		eloc.partitionReferenceNum =
 951				iinfo->i_location.partitionReferenceNum;
 952		bsize = sb->s_blocksize;
 953		iinfo->i_lenExtents = bsize;
 954		udf_add_aext(inode, &epos, &eloc, bsize, 0);
 955		brelse(epos.bh);
 956
 957		block = udf_get_pblock(sb, block,
 958				iinfo->i_location.partitionReferenceNum,
 959				0);
 960		epos.bh = udf_tgetblk(sb, block);
 961		lock_buffer(epos.bh);
 962		memset(epos.bh->b_data, 0x00, bsize);
 963		set_buffer_uptodate(epos.bh);
 964		unlock_buffer(epos.bh);
 965		mark_buffer_dirty_inode(epos.bh, inode);
 966		ea = epos.bh->b_data + udf_ext0_offset(inode);
 967	} else
 968		ea = iinfo->i_ext.i_data + iinfo->i_lenEAttr;
 969
 970	eoffset = sb->s_blocksize - udf_ext0_offset(inode);
 971	pc = (struct pathComponent *)ea;
 972
 973	if (*symname == '/') {
 974		do {
 975			symname++;
 976		} while (*symname == '/');
 977
 978		pc->componentType = 1;
 979		pc->lengthComponentIdent = 0;
 980		pc->componentFileVersionNum = 0;
 981		elen += sizeof(struct pathComponent);
 982	}
 983
 984	err = -ENAMETOOLONG;
 985
 986	while (*symname) {
 987		if (elen + sizeof(struct pathComponent) > eoffset)
 988			goto out_no_entry;
 989
 990		pc = (struct pathComponent *)(ea + elen);
 991
 992		compstart = symname;
 993
 994		do {
 995			symname++;
 996		} while (*symname && *symname != '/');
 997
 998		pc->componentType = 5;
 999		pc->lengthComponentIdent = 0;
1000		pc->componentFileVersionNum = 0;
1001		if (compstart[0] == '.') {
1002			if ((symname - compstart) == 1)
1003				pc->componentType = 4;
1004			else if ((symname - compstart) == 2 &&
1005					compstart[1] == '.')
1006				pc->componentType = 3;
1007		}
1008
1009		if (pc->componentType == 5) {
1010			namelen = udf_put_filename(sb, compstart,
1011						   symname - compstart,
1012						   name, UDF_NAME_LEN_CS0);
1013			if (!namelen)
1014				goto out_no_entry;
1015
1016			if (elen + sizeof(struct pathComponent) + namelen >
1017					eoffset)
1018				goto out_no_entry;
1019			else
1020				pc->lengthComponentIdent = namelen;
1021
1022			memcpy(pc->componentIdent, name, namelen);
1023		}
1024
1025		elen += sizeof(struct pathComponent) + pc->lengthComponentIdent;
1026
1027		if (*symname) {
1028			do {
1029				symname++;
1030			} while (*symname == '/');
1031		}
1032	}
1033
1034	brelse(epos.bh);
1035	inode->i_size = elen;
1036	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1037		iinfo->i_lenAlloc = inode->i_size;
1038	else
1039		udf_truncate_tail_extent(inode);
1040	mark_inode_dirty(inode);
1041	up_write(&iinfo->i_data_sem);
1042
1043	err = udf_add_nondir(dentry, inode);
1044out:
1045	kfree(name);
1046	return err;
1047
1048out_no_entry:
1049	up_write(&iinfo->i_data_sem);
1050	inode_dec_link_count(inode);
1051	unlock_new_inode(inode);
1052	iput(inode);
1053	goto out;
1054}
1055
1056static int udf_link(struct dentry *old_dentry, struct inode *dir,
1057		    struct dentry *dentry)
1058{
1059	struct inode *inode = d_inode(old_dentry);
1060	struct udf_fileident_bh fibh;
1061	struct fileIdentDesc cfi, *fi;
1062	int err;
1063
1064	fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
1065	if (!fi) {
1066		return err;
1067	}
1068	cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
1069	cfi.icb.extLocation = cpu_to_lelb(UDF_I(inode)->i_location);
1070	if (UDF_SB(inode->i_sb)->s_lvid_bh) {
1071		*(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
1072			cpu_to_le32(lvid_get_unique_id(inode->i_sb));
1073	}
1074	udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
1075	if (UDF_I(dir)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1076		mark_inode_dirty(dir);
1077
1078	if (fibh.sbh != fibh.ebh)
1079		brelse(fibh.ebh);
1080	brelse(fibh.sbh);
1081	inc_nlink(inode);
1082	inode->i_ctime = current_time(inode);
1083	mark_inode_dirty(inode);
1084	dir->i_ctime = dir->i_mtime = current_time(dir);
1085	mark_inode_dirty(dir);
1086	ihold(inode);
1087	d_instantiate(dentry, inode);
1088
1089	return 0;
1090}
1091
1092/* Anybody can rename anything with this: the permission checks are left to the
1093 * higher-level routines.
1094 */
1095static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
1096		      struct inode *new_dir, struct dentry *new_dentry,
1097		      unsigned int flags)
1098{
1099	struct inode *old_inode = d_inode(old_dentry);
1100	struct inode *new_inode = d_inode(new_dentry);
1101	struct udf_fileident_bh ofibh, nfibh;
1102	struct fileIdentDesc *ofi = NULL, *nfi = NULL, *dir_fi = NULL;
1103	struct fileIdentDesc ocfi, ncfi;
1104	struct buffer_head *dir_bh = NULL;
1105	int retval = -ENOENT;
1106	struct kernel_lb_addr tloc;
1107	struct udf_inode_info *old_iinfo = UDF_I(old_inode);
1108
1109	if (flags & ~RENAME_NOREPLACE)
1110		return -EINVAL;
1111
1112	ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
1113	if (IS_ERR(ofi)) {
1114		retval = PTR_ERR(ofi);
1115		goto end_rename;
1116	}
1117
1118	if (ofibh.sbh != ofibh.ebh)
1119		brelse(ofibh.ebh);
1120
1121	brelse(ofibh.sbh);
1122	tloc = lelb_to_cpu(ocfi.icb.extLocation);
1123	if (!ofi || udf_get_lb_pblock(old_dir->i_sb, &tloc, 0)
1124	    != old_inode->i_ino)
1125		goto end_rename;
1126
1127	nfi = udf_find_entry(new_dir, &new_dentry->d_name, &nfibh, &ncfi);
1128	if (IS_ERR(nfi)) {
1129		retval = PTR_ERR(nfi);
1130		goto end_rename;
1131	}
1132	if (nfi && !new_inode) {
1133		if (nfibh.sbh != nfibh.ebh)
1134			brelse(nfibh.ebh);
1135		brelse(nfibh.sbh);
1136		nfi = NULL;
1137	}
1138	if (S_ISDIR(old_inode->i_mode)) {
1139		int offset = udf_ext0_offset(old_inode);
1140
1141		if (new_inode) {
1142			retval = -ENOTEMPTY;
1143			if (!empty_dir(new_inode))
1144				goto end_rename;
1145		}
1146		retval = -EIO;
1147		if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
1148			dir_fi = udf_get_fileident(
1149					old_iinfo->i_ext.i_data -
1150					  (old_iinfo->i_efe ?
1151					   sizeof(struct extendedFileEntry) :
1152					   sizeof(struct fileEntry)),
1153					old_inode->i_sb->s_blocksize, &offset);
1154		} else {
1155			dir_bh = udf_bread(old_inode, 0, 0, &retval);
1156			if (!dir_bh)
1157				goto end_rename;
1158			dir_fi = udf_get_fileident(dir_bh->b_data,
1159					old_inode->i_sb->s_blocksize, &offset);
1160		}
1161		if (!dir_fi)
1162			goto end_rename;
1163		tloc = lelb_to_cpu(dir_fi->icb.extLocation);
1164		if (udf_get_lb_pblock(old_inode->i_sb, &tloc, 0) !=
1165				old_dir->i_ino)
1166			goto end_rename;
1167	}
1168	if (!nfi) {
1169		nfi = udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi,
1170				    &retval);
1171		if (!nfi)
1172			goto end_rename;
1173	}
1174
1175	/*
1176	 * Like most other Unix systems, set the ctime for inodes on a
1177	 * rename.
1178	 */
1179	old_inode->i_ctime = current_time(old_inode);
1180	mark_inode_dirty(old_inode);
1181
1182	/*
1183	 * ok, that's it
1184	 */
1185	ncfi.fileVersionNum = ocfi.fileVersionNum;
1186	ncfi.fileCharacteristics = ocfi.fileCharacteristics;
1187	memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(struct long_ad));
1188	udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL);
1189
1190	/* The old fid may have moved - find it again */
1191	ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
1192	udf_delete_entry(old_dir, ofi, &ofibh, &ocfi);
1193
1194	if (new_inode) {
1195		new_inode->i_ctime = current_time(new_inode);
1196		inode_dec_link_count(new_inode);
1197	}
1198	old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
1199	new_dir->i_ctime = new_dir->i_mtime = current_time(new_dir);
1200	mark_inode_dirty(old_dir);
1201	mark_inode_dirty(new_dir);
1202
1203	if (dir_fi) {
1204		dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location);
1205		udf_update_tag((char *)dir_fi,
1206				(sizeof(struct fileIdentDesc) +
1207				le16_to_cpu(dir_fi->lengthOfImpUse) + 3) & ~3);
1208		if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1209			mark_inode_dirty(old_inode);
1210		else
1211			mark_buffer_dirty_inode(dir_bh, old_inode);
1212
1213		inode_dec_link_count(old_dir);
1214		if (new_inode)
1215			inode_dec_link_count(new_inode);
1216		else {
1217			inc_nlink(new_dir);
1218			mark_inode_dirty(new_dir);
1219		}
1220	}
1221
1222	if (ofi) {
1223		if (ofibh.sbh != ofibh.ebh)
1224			brelse(ofibh.ebh);
1225		brelse(ofibh.sbh);
1226	}
1227
1228	retval = 0;
1229
1230end_rename:
1231	brelse(dir_bh);
1232	if (nfi) {
1233		if (nfibh.sbh != nfibh.ebh)
1234			brelse(nfibh.ebh);
1235		brelse(nfibh.sbh);
1236	}
1237
1238	return retval;
1239}
1240
1241static struct dentry *udf_get_parent(struct dentry *child)
1242{
1243	struct kernel_lb_addr tloc;
1244	struct inode *inode = NULL;
1245	struct qstr dotdot = QSTR_INIT("..", 2);
1246	struct fileIdentDesc cfi;
1247	struct udf_fileident_bh fibh;
1248
1249	if (!udf_find_entry(d_inode(child), &dotdot, &fibh, &cfi))
1250		return ERR_PTR(-EACCES);
1251
1252	if (fibh.sbh != fibh.ebh)
1253		brelse(fibh.ebh);
1254	brelse(fibh.sbh);
1255
1256	tloc = lelb_to_cpu(cfi.icb.extLocation);
1257	inode = udf_iget(child->d_sb, &tloc);
1258	if (IS_ERR(inode))
1259		return ERR_CAST(inode);
1260
1261	return d_obtain_alias(inode);
1262}
1263
1264
1265static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block,
1266					u16 partref, __u32 generation)
1267{
1268	struct inode *inode;
1269	struct kernel_lb_addr loc;
1270
1271	if (block == 0)
1272		return ERR_PTR(-ESTALE);
1273
1274	loc.logicalBlockNum = block;
1275	loc.partitionReferenceNum = partref;
1276	inode = udf_iget(sb, &loc);
1277
1278	if (IS_ERR(inode))
1279		return ERR_CAST(inode);
1280
1281	if (generation && inode->i_generation != generation) {
1282		iput(inode);
1283		return ERR_PTR(-ESTALE);
1284	}
1285	return d_obtain_alias(inode);
1286}
1287
1288static struct dentry *udf_fh_to_dentry(struct super_block *sb,
1289				       struct fid *fid, int fh_len, int fh_type)
1290{
1291	if (fh_len < 3 ||
1292	    (fh_type != FILEID_UDF_WITH_PARENT &&
1293	     fh_type != FILEID_UDF_WITHOUT_PARENT))
1294		return NULL;
1295
1296	return udf_nfs_get_inode(sb, fid->udf.block, fid->udf.partref,
1297			fid->udf.generation);
1298}
1299
1300static struct dentry *udf_fh_to_parent(struct super_block *sb,
1301				       struct fid *fid, int fh_len, int fh_type)
1302{
1303	if (fh_len < 5 || fh_type != FILEID_UDF_WITH_PARENT)
1304		return NULL;
1305
1306	return udf_nfs_get_inode(sb, fid->udf.parent_block,
1307				 fid->udf.parent_partref,
1308				 fid->udf.parent_generation);
1309}
1310static int udf_encode_fh(struct inode *inode, __u32 *fh, int *lenp,
1311			 struct inode *parent)
1312{
1313	int len = *lenp;
1314	struct kernel_lb_addr location = UDF_I(inode)->i_location;
1315	struct fid *fid = (struct fid *)fh;
1316	int type = FILEID_UDF_WITHOUT_PARENT;
1317
1318	if (parent && (len < 5)) {
1319		*lenp = 5;
1320		return FILEID_INVALID;
1321	} else if (len < 3) {
1322		*lenp = 3;
1323		return FILEID_INVALID;
1324	}
1325
1326	*lenp = 3;
1327	fid->udf.block = location.logicalBlockNum;
1328	fid->udf.partref = location.partitionReferenceNum;
1329	fid->udf.parent_partref = 0;
1330	fid->udf.generation = inode->i_generation;
1331
1332	if (parent) {
1333		location = UDF_I(parent)->i_location;
1334		fid->udf.parent_block = location.logicalBlockNum;
1335		fid->udf.parent_partref = location.partitionReferenceNum;
1336		fid->udf.parent_generation = inode->i_generation;
1337		*lenp = 5;
1338		type = FILEID_UDF_WITH_PARENT;
1339	}
1340
1341	return type;
1342}
1343
1344const struct export_operations udf_export_ops = {
1345	.encode_fh	= udf_encode_fh,
1346	.fh_to_dentry   = udf_fh_to_dentry,
1347	.fh_to_parent   = udf_fh_to_parent,
1348	.get_parent     = udf_get_parent,
1349};
1350
1351const struct inode_operations udf_dir_inode_operations = {
1352	.lookup				= udf_lookup,
1353	.create				= udf_create,
1354	.link				= udf_link,
1355	.unlink				= udf_unlink,
1356	.symlink			= udf_symlink,
1357	.mkdir				= udf_mkdir,
1358	.rmdir				= udf_rmdir,
1359	.mknod				= udf_mknod,
1360	.rename				= udf_rename,
1361	.tmpfile			= udf_tmpfile,
1362};
v5.4
   1/*
   2 * namei.c
   3 *
   4 * PURPOSE
   5 *      Inode name handling routines for the OSTA-UDF(tm) filesystem.
   6 *
   7 * COPYRIGHT
   8 *      This file is distributed under the terms of the GNU General Public
   9 *      License (GPL). Copies of the GPL can be obtained from:
  10 *              ftp://prep.ai.mit.edu/pub/gnu/GPL
  11 *      Each contributing author retains all rights to their own work.
  12 *
  13 *  (C) 1998-2004 Ben Fennema
  14 *  (C) 1999-2000 Stelias Computing Inc
  15 *
  16 * HISTORY
  17 *
  18 *  12/12/98 blf  Created. Split out the lookup code from dir.c
  19 *  04/19/99 blf  link, mknod, symlink support
  20 */
  21
  22#include "udfdecl.h"
  23
  24#include "udf_i.h"
  25#include "udf_sb.h"
  26#include <linux/string.h>
  27#include <linux/errno.h>
  28#include <linux/mm.h>
  29#include <linux/slab.h>
  30#include <linux/sched.h>
  31#include <linux/crc-itu-t.h>
  32#include <linux/exportfs.h>
  33
  34static inline int udf_match(int len1, const unsigned char *name1, int len2,
  35			    const unsigned char *name2)
  36{
  37	if (len1 != len2)
  38		return 0;
  39
  40	return !memcmp(name1, name2, len1);
  41}
  42
  43int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi,
  44		 struct fileIdentDesc *sfi, struct udf_fileident_bh *fibh,
  45		 uint8_t *impuse, uint8_t *fileident)
  46{
  47	uint16_t crclen = fibh->eoffset - fibh->soffset - sizeof(struct tag);
  48	uint16_t crc;
  49	int offset;
  50	uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse);
  51	uint8_t lfi = cfi->lengthFileIdent;
  52	int padlen = fibh->eoffset - fibh->soffset - liu - lfi -
  53		sizeof(struct fileIdentDesc);
  54	int adinicb = 0;
  55
  56	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
  57		adinicb = 1;
  58
  59	offset = fibh->soffset + sizeof(struct fileIdentDesc);
  60
  61	if (impuse) {
  62		if (adinicb || (offset + liu < 0)) {
  63			memcpy((uint8_t *)sfi->impUse, impuse, liu);
  64		} else if (offset >= 0) {
  65			memcpy(fibh->ebh->b_data + offset, impuse, liu);
  66		} else {
  67			memcpy((uint8_t *)sfi->impUse, impuse, -offset);
  68			memcpy(fibh->ebh->b_data, impuse - offset,
  69				liu + offset);
  70		}
  71	}
  72
  73	offset += liu;
  74
  75	if (fileident) {
  76		if (adinicb || (offset + lfi < 0)) {
  77			memcpy((uint8_t *)sfi->fileIdent + liu, fileident, lfi);
  78		} else if (offset >= 0) {
  79			memcpy(fibh->ebh->b_data + offset, fileident, lfi);
  80		} else {
  81			memcpy((uint8_t *)sfi->fileIdent + liu, fileident,
  82				-offset);
  83			memcpy(fibh->ebh->b_data, fileident - offset,
  84				lfi + offset);
  85		}
  86	}
  87
  88	offset += lfi;
  89
  90	if (adinicb || (offset + padlen < 0)) {
  91		memset((uint8_t *)sfi->padding + liu + lfi, 0x00, padlen);
  92	} else if (offset >= 0) {
  93		memset(fibh->ebh->b_data + offset, 0x00, padlen);
  94	} else {
  95		memset((uint8_t *)sfi->padding + liu + lfi, 0x00, -offset);
  96		memset(fibh->ebh->b_data, 0x00, padlen + offset);
  97	}
  98
  99	crc = crc_itu_t(0, (uint8_t *)cfi + sizeof(struct tag),
 100		      sizeof(struct fileIdentDesc) - sizeof(struct tag));
 101
 102	if (fibh->sbh == fibh->ebh) {
 103		crc = crc_itu_t(crc, (uint8_t *)sfi->impUse,
 104			      crclen + sizeof(struct tag) -
 105			      sizeof(struct fileIdentDesc));
 106	} else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) {
 107		crc = crc_itu_t(crc, fibh->ebh->b_data +
 108					sizeof(struct fileIdentDesc) +
 109					fibh->soffset,
 110			      crclen + sizeof(struct tag) -
 111					sizeof(struct fileIdentDesc));
 112	} else {
 113		crc = crc_itu_t(crc, (uint8_t *)sfi->impUse,
 114			      -fibh->soffset - sizeof(struct fileIdentDesc));
 115		crc = crc_itu_t(crc, fibh->ebh->b_data, fibh->eoffset);
 116	}
 117
 118	cfi->descTag.descCRC = cpu_to_le16(crc);
 119	cfi->descTag.descCRCLength = cpu_to_le16(crclen);
 120	cfi->descTag.tagChecksum = udf_tag_checksum(&cfi->descTag);
 121
 122	if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) {
 123		memcpy((uint8_t *)sfi, (uint8_t *)cfi,
 124			sizeof(struct fileIdentDesc));
 125	} else {
 126		memcpy((uint8_t *)sfi, (uint8_t *)cfi, -fibh->soffset);
 127		memcpy(fibh->ebh->b_data, (uint8_t *)cfi - fibh->soffset,
 128		       sizeof(struct fileIdentDesc) + fibh->soffset);
 129	}
 130
 131	if (adinicb) {
 132		mark_inode_dirty(inode);
 133	} else {
 134		if (fibh->sbh != fibh->ebh)
 135			mark_buffer_dirty_inode(fibh->ebh, inode);
 136		mark_buffer_dirty_inode(fibh->sbh, inode);
 137	}
 138	return 0;
 139}
 140
 141/**
 142 * udf_find_entry - find entry in given directory.
 143 *
 144 * @dir:	directory inode to search in
 145 * @child:	qstr of the name
 146 * @fibh:	buffer head / inode with file identifier descriptor we found
 147 * @cfi:	found file identifier descriptor with given name
 148 *
 149 * This function searches in the directory @dir for a file name @child. When
 150 * found, @fibh points to the buffer head(s) (bh is NULL for in ICB
 151 * directories) containing the file identifier descriptor (FID). In that case
 152 * the function returns pointer to the FID in the buffer or inode - but note
 153 * that FID may be split among two buffers (blocks) so accessing it via that
 154 * pointer isn't easily possible. This pointer can be used only as an iterator
 155 * for other directory manipulation functions. For inspection of the FID @cfi
 156 * can be used - the found FID is copied there.
 157 *
 158 * Returns pointer to FID, NULL when nothing found, or error code.
 159 */
 160static struct fileIdentDesc *udf_find_entry(struct inode *dir,
 161					    const struct qstr *child,
 162					    struct udf_fileident_bh *fibh,
 163					    struct fileIdentDesc *cfi)
 164{
 165	struct fileIdentDesc *fi = NULL;
 166	loff_t f_pos;
 167	udf_pblk_t block;
 168	int flen;
 169	unsigned char *fname = NULL, *copy_name = NULL;
 170	unsigned char *nameptr;
 171	uint8_t lfi;
 172	uint16_t liu;
 173	loff_t size;
 174	struct kernel_lb_addr eloc;
 175	uint32_t elen;
 176	sector_t offset;
 177	struct extent_position epos = {};
 178	struct udf_inode_info *dinfo = UDF_I(dir);
 179	int isdotdot = child->len == 2 &&
 180		child->name[0] == '.' && child->name[1] == '.';
 181	struct super_block *sb = dir->i_sb;
 182
 183	size = udf_ext0_offset(dir) + dir->i_size;
 184	f_pos = udf_ext0_offset(dir);
 185
 186	fibh->sbh = fibh->ebh = NULL;
 187	fibh->soffset = fibh->eoffset = f_pos & (sb->s_blocksize - 1);
 188	if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 189		if (inode_bmap(dir, f_pos >> sb->s_blocksize_bits, &epos,
 190		    &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) {
 191			fi = ERR_PTR(-EIO);
 192			goto out_err;
 193		}
 194
 195		block = udf_get_lb_pblock(sb, &eloc, offset);
 196		if ((++offset << sb->s_blocksize_bits) < elen) {
 197			if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 198				epos.offset -= sizeof(struct short_ad);
 199			else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 200				epos.offset -= sizeof(struct long_ad);
 201		} else
 202			offset = 0;
 203
 204		fibh->sbh = fibh->ebh = udf_tread(sb, block);
 205		if (!fibh->sbh) {
 206			fi = ERR_PTR(-EIO);
 207			goto out_err;
 208		}
 209	}
 210
 211	fname = kmalloc(UDF_NAME_LEN, GFP_NOFS);
 212	if (!fname) {
 213		fi = ERR_PTR(-ENOMEM);
 214		goto out_err;
 215	}
 216
 217	while (f_pos < size) {
 218		fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
 219					&elen, &offset);
 220		if (!fi) {
 221			fi = ERR_PTR(-EIO);
 222			goto out_err;
 223		}
 224
 225		liu = le16_to_cpu(cfi->lengthOfImpUse);
 226		lfi = cfi->lengthFileIdent;
 227
 228		if (fibh->sbh == fibh->ebh) {
 229			nameptr = fi->fileIdent + liu;
 230		} else {
 231			int poffset;	/* Unpaded ending offset */
 232
 233			poffset = fibh->soffset + sizeof(struct fileIdentDesc) +
 234					liu + lfi;
 235
 236			if (poffset >= lfi)
 237				nameptr = (uint8_t *)(fibh->ebh->b_data +
 238						      poffset - lfi);
 239			else {
 240				if (!copy_name) {
 241					copy_name = kmalloc(UDF_NAME_LEN,
 242							    GFP_NOFS);
 243					if (!copy_name) {
 244						fi = ERR_PTR(-ENOMEM);
 245						goto out_err;
 246					}
 247				}
 248				nameptr = copy_name;
 249				memcpy(nameptr, fi->fileIdent + liu,
 250					lfi - poffset);
 251				memcpy(nameptr + lfi - poffset,
 252					fibh->ebh->b_data, poffset);
 253			}
 254		}
 255
 256		if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
 257			if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE))
 258				continue;
 259		}
 260
 261		if ((cfi->fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) {
 262			if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE))
 263				continue;
 264		}
 265
 266		if ((cfi->fileCharacteristics & FID_FILE_CHAR_PARENT) &&
 267		    isdotdot)
 268			goto out_ok;
 269
 270		if (!lfi)
 271			continue;
 272
 273		flen = udf_get_filename(sb, nameptr, lfi, fname, UDF_NAME_LEN);
 274		if (flen < 0) {
 275			fi = ERR_PTR(flen);
 276			goto out_err;
 277		}
 278
 279		if (udf_match(flen, fname, child->len, child->name))
 280			goto out_ok;
 281	}
 282
 283	fi = NULL;
 284out_err:
 285	if (fibh->sbh != fibh->ebh)
 286		brelse(fibh->ebh);
 287	brelse(fibh->sbh);
 288out_ok:
 289	brelse(epos.bh);
 290	kfree(fname);
 291	kfree(copy_name);
 292
 293	return fi;
 294}
 295
 296static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
 297				 unsigned int flags)
 298{
 299	struct inode *inode = NULL;
 300	struct fileIdentDesc cfi;
 301	struct udf_fileident_bh fibh;
 302	struct fileIdentDesc *fi;
 303
 304	if (dentry->d_name.len > UDF_NAME_LEN)
 305		return ERR_PTR(-ENAMETOOLONG);
 306
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 307	fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 308	if (IS_ERR(fi))
 309		return ERR_CAST(fi);
 310
 311	if (fi) {
 312		struct kernel_lb_addr loc;
 313
 314		if (fibh.sbh != fibh.ebh)
 315			brelse(fibh.ebh);
 316		brelse(fibh.sbh);
 317
 318		loc = lelb_to_cpu(cfi.icb.extLocation);
 319		inode = udf_iget(dir->i_sb, &loc);
 320		if (IS_ERR(inode))
 321			return ERR_CAST(inode);
 322	}
 323
 324	return d_splice_alias(inode, dentry);
 325}
 326
 327static struct fileIdentDesc *udf_add_entry(struct inode *dir,
 328					   struct dentry *dentry,
 329					   struct udf_fileident_bh *fibh,
 330					   struct fileIdentDesc *cfi, int *err)
 331{
 332	struct super_block *sb = dir->i_sb;
 333	struct fileIdentDesc *fi = NULL;
 334	unsigned char *name = NULL;
 335	int namelen;
 336	loff_t f_pos;
 337	loff_t size = udf_ext0_offset(dir) + dir->i_size;
 338	int nfidlen;
 339	udf_pblk_t block;
 
 
 340	struct kernel_lb_addr eloc;
 341	uint32_t elen = 0;
 342	sector_t offset;
 343	struct extent_position epos = {};
 344	struct udf_inode_info *dinfo;
 345
 346	fibh->sbh = fibh->ebh = NULL;
 347	name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
 348	if (!name) {
 349		*err = -ENOMEM;
 350		goto out_err;
 351	}
 352
 353	if (dentry) {
 354		if (!dentry->d_name.len) {
 355			*err = -EINVAL;
 356			goto out_err;
 357		}
 358		namelen = udf_put_filename(sb, dentry->d_name.name,
 359					   dentry->d_name.len,
 360					   name, UDF_NAME_LEN_CS0);
 361		if (!namelen) {
 362			*err = -ENAMETOOLONG;
 363			goto out_err;
 364		}
 365	} else {
 366		namelen = 0;
 367	}
 368
 369	nfidlen = ALIGN(sizeof(struct fileIdentDesc) + namelen, UDF_NAME_PAD);
 370
 371	f_pos = udf_ext0_offset(dir);
 372
 373	fibh->soffset = fibh->eoffset = f_pos & (dir->i_sb->s_blocksize - 1);
 374	dinfo = UDF_I(dir);
 375	if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 376		if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos,
 377		    &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) {
 378			block = udf_get_lb_pblock(dir->i_sb,
 379					&dinfo->i_location, 0);
 380			fibh->soffset = fibh->eoffset = sb->s_blocksize;
 381			goto add;
 382		}
 383		block = udf_get_lb_pblock(dir->i_sb, &eloc, offset);
 384		if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
 385			if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 386				epos.offset -= sizeof(struct short_ad);
 387			else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 388				epos.offset -= sizeof(struct long_ad);
 389		} else
 390			offset = 0;
 391
 392		fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block);
 393		if (!fibh->sbh) {
 394			*err = -EIO;
 395			goto out_err;
 396		}
 397
 398		block = dinfo->i_location.logicalBlockNum;
 399	}
 400
 401	while (f_pos < size) {
 402		fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
 403					&elen, &offset);
 404
 405		if (!fi) {
 406			*err = -EIO;
 407			goto out_err;
 408		}
 409
 
 
 
 410		if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
 411			if (udf_dir_entry_len(cfi) == nfidlen) {
 
 412				cfi->descTag.tagSerialNum = cpu_to_le16(1);
 413				cfi->fileVersionNum = cpu_to_le16(1);
 414				cfi->fileCharacteristics = 0;
 415				cfi->lengthFileIdent = namelen;
 416				cfi->lengthOfImpUse = cpu_to_le16(0);
 417				if (!udf_write_fi(dir, cfi, fi, fibh, NULL,
 418						  name))
 419					goto out_ok;
 420				else {
 421					*err = -EIO;
 422					goto out_err;
 423				}
 424			}
 425		}
 426	}
 427
 428add:
 429	f_pos += nfidlen;
 430
 431	if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB &&
 432	    sb->s_blocksize - fibh->eoffset < nfidlen) {
 433		brelse(epos.bh);
 434		epos.bh = NULL;
 435		fibh->soffset -= udf_ext0_offset(dir);
 436		fibh->eoffset -= udf_ext0_offset(dir);
 437		f_pos -= udf_ext0_offset(dir);
 438		if (fibh->sbh != fibh->ebh)
 439			brelse(fibh->ebh);
 440		brelse(fibh->sbh);
 441		fibh->sbh = fibh->ebh =
 442				udf_expand_dir_adinicb(dir, &block, err);
 443		if (!fibh->sbh)
 444			goto out_err;
 445		epos.block = dinfo->i_location;
 446		epos.offset = udf_file_entry_alloc_offset(dir);
 447		/* Load extent udf_expand_dir_adinicb() has created */
 448		udf_current_aext(dir, &epos, &eloc, &elen, 1);
 449	}
 450
 451	/* Entry fits into current block? */
 452	if (sb->s_blocksize - fibh->eoffset >= nfidlen) {
 453		fibh->soffset = fibh->eoffset;
 454		fibh->eoffset += nfidlen;
 455		if (fibh->sbh != fibh->ebh) {
 456			brelse(fibh->sbh);
 457			fibh->sbh = fibh->ebh;
 458		}
 459
 460		if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
 461			block = dinfo->i_location.logicalBlockNum;
 462			fi = (struct fileIdentDesc *)
 463					(dinfo->i_ext.i_data +
 464					 fibh->soffset -
 465					 udf_ext0_offset(dir) +
 466					 dinfo->i_lenEAttr);
 467		} else {
 468			block = eloc.logicalBlockNum +
 469					((elen - 1) >>
 470						dir->i_sb->s_blocksize_bits);
 471			fi = (struct fileIdentDesc *)
 472				(fibh->sbh->b_data + fibh->soffset);
 473		}
 474	} else {
 475		/* Round up last extent in the file */
 476		elen = (elen + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1);
 477		if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 478			epos.offset -= sizeof(struct short_ad);
 479		else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 480			epos.offset -= sizeof(struct long_ad);
 481		udf_write_aext(dir, &epos, &eloc, elen, 1);
 482		dinfo->i_lenExtents = (dinfo->i_lenExtents + sb->s_blocksize
 483					- 1) & ~(sb->s_blocksize - 1);
 484
 485		fibh->soffset = fibh->eoffset - sb->s_blocksize;
 486		fibh->eoffset += nfidlen - sb->s_blocksize;
 487		if (fibh->sbh != fibh->ebh) {
 488			brelse(fibh->sbh);
 489			fibh->sbh = fibh->ebh;
 490		}
 491
 492		block = eloc.logicalBlockNum + ((elen - 1) >>
 493						dir->i_sb->s_blocksize_bits);
 494		fibh->ebh = udf_bread(dir,
 495				f_pos >> dir->i_sb->s_blocksize_bits, 1, err);
 496		if (!fibh->ebh)
 497			goto out_err;
 498		/* Extents could have been merged, invalidate our position */
 499		brelse(epos.bh);
 500		epos.bh = NULL;
 501		epos.block = dinfo->i_location;
 502		epos.offset = udf_file_entry_alloc_offset(dir);
 503
 504		if (!fibh->soffset) {
 505			/* Find the freshly allocated block */
 506			while (udf_next_aext(dir, &epos, &eloc, &elen, 1) ==
 507				(EXT_RECORDED_ALLOCATED >> 30))
 508				;
 509			block = eloc.logicalBlockNum + ((elen - 1) >>
 510					dir->i_sb->s_blocksize_bits);
 511			brelse(fibh->sbh);
 512			fibh->sbh = fibh->ebh;
 513			fi = (struct fileIdentDesc *)(fibh->sbh->b_data);
 514		} else {
 515			fi = (struct fileIdentDesc *)
 516				(fibh->sbh->b_data + sb->s_blocksize +
 517					fibh->soffset);
 518		}
 519	}
 520
 521	memset(cfi, 0, sizeof(struct fileIdentDesc));
 522	if (UDF_SB(sb)->s_udfrev >= 0x0200)
 523		udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block,
 524			    sizeof(struct tag));
 525	else
 526		udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block,
 527			    sizeof(struct tag));
 528	cfi->fileVersionNum = cpu_to_le16(1);
 529	cfi->lengthFileIdent = namelen;
 530	cfi->lengthOfImpUse = cpu_to_le16(0);
 531	if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) {
 532		dir->i_size += nfidlen;
 533		if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 534			dinfo->i_lenAlloc += nfidlen;
 535		else {
 536			/* Find the last extent and truncate it to proper size */
 537			while (udf_next_aext(dir, &epos, &eloc, &elen, 1) ==
 538				(EXT_RECORDED_ALLOCATED >> 30))
 539				;
 540			elen -= dinfo->i_lenExtents - dir->i_size;
 541			if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 542				epos.offset -= sizeof(struct short_ad);
 543			else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 544				epos.offset -= sizeof(struct long_ad);
 545			udf_write_aext(dir, &epos, &eloc, elen, 1);
 546			dinfo->i_lenExtents = dir->i_size;
 547		}
 548
 549		mark_inode_dirty(dir);
 550		goto out_ok;
 551	} else {
 552		*err = -EIO;
 553		goto out_err;
 554	}
 555
 556out_err:
 557	fi = NULL;
 558	if (fibh->sbh != fibh->ebh)
 559		brelse(fibh->ebh);
 560	brelse(fibh->sbh);
 561out_ok:
 562	brelse(epos.bh);
 563	kfree(name);
 564	return fi;
 565}
 566
 567static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi,
 568			    struct udf_fileident_bh *fibh,
 569			    struct fileIdentDesc *cfi)
 570{
 571	cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED;
 572
 573	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
 574		memset(&(cfi->icb), 0x00, sizeof(struct long_ad));
 575
 576	return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL);
 577}
 578
 579static int udf_add_nondir(struct dentry *dentry, struct inode *inode)
 580{
 581	struct udf_inode_info *iinfo = UDF_I(inode);
 582	struct inode *dir = d_inode(dentry->d_parent);
 583	struct udf_fileident_bh fibh;
 584	struct fileIdentDesc cfi, *fi;
 585	int err;
 586
 587	fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
 588	if (unlikely(!fi)) {
 589		inode_dec_link_count(inode);
 590		discard_new_inode(inode);
 
 591		return err;
 592	}
 593	cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 594	cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location);
 595	*(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 596		cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
 597	udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
 598	dir->i_ctime = dir->i_mtime = current_time(dir);
 599	mark_inode_dirty(dir);
 600	if (fibh.sbh != fibh.ebh)
 601		brelse(fibh.ebh);
 602	brelse(fibh.sbh);
 603	d_instantiate_new(dentry, inode);
 
 604
 605	return 0;
 606}
 607
 608static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 609		      bool excl)
 610{
 611	struct inode *inode = udf_new_inode(dir, mode);
 612
 613	if (IS_ERR(inode))
 614		return PTR_ERR(inode);
 615
 616	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 617		inode->i_data.a_ops = &udf_adinicb_aops;
 618	else
 619		inode->i_data.a_ops = &udf_aops;
 620	inode->i_op = &udf_file_inode_operations;
 621	inode->i_fop = &udf_file_operations;
 622	mark_inode_dirty(inode);
 623
 624	return udf_add_nondir(dentry, inode);
 625}
 626
 627static int udf_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
 628{
 629	struct inode *inode = udf_new_inode(dir, mode);
 630
 631	if (IS_ERR(inode))
 632		return PTR_ERR(inode);
 633
 634	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 635		inode->i_data.a_ops = &udf_adinicb_aops;
 636	else
 637		inode->i_data.a_ops = &udf_aops;
 638	inode->i_op = &udf_file_inode_operations;
 639	inode->i_fop = &udf_file_operations;
 640	mark_inode_dirty(inode);
 641	d_tmpfile(dentry, inode);
 642	unlock_new_inode(inode);
 643	return 0;
 644}
 645
 646static int udf_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
 647		     dev_t rdev)
 648{
 649	struct inode *inode;
 650
 651	if (!old_valid_dev(rdev))
 652		return -EINVAL;
 653
 654	inode = udf_new_inode(dir, mode);
 655	if (IS_ERR(inode))
 656		return PTR_ERR(inode);
 657
 658	init_special_inode(inode, mode, rdev);
 659	return udf_add_nondir(dentry, inode);
 660}
 661
 662static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 663{
 664	struct inode *inode;
 665	struct udf_fileident_bh fibh;
 666	struct fileIdentDesc cfi, *fi;
 667	int err;
 668	struct udf_inode_info *dinfo = UDF_I(dir);
 669	struct udf_inode_info *iinfo;
 670
 671	inode = udf_new_inode(dir, S_IFDIR | mode);
 672	if (IS_ERR(inode))
 673		return PTR_ERR(inode);
 674
 675	iinfo = UDF_I(inode);
 676	inode->i_op = &udf_dir_inode_operations;
 677	inode->i_fop = &udf_dir_operations;
 678	fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err);
 679	if (!fi) {
 680		inode_dec_link_count(inode);
 681		discard_new_inode(inode);
 
 682		goto out;
 683	}
 684	set_nlink(inode, 2);
 685	cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 686	cfi.icb.extLocation = cpu_to_lelb(dinfo->i_location);
 687	*(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 688		cpu_to_le32(dinfo->i_unique & 0x00000000FFFFFFFFUL);
 689	cfi.fileCharacteristics =
 690			FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT;
 691	udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL);
 692	brelse(fibh.sbh);
 693	mark_inode_dirty(inode);
 694
 695	fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
 696	if (!fi) {
 697		clear_nlink(inode);
 698		mark_inode_dirty(inode);
 699		discard_new_inode(inode);
 
 700		goto out;
 701	}
 702	cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 703	cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location);
 704	*(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 705		cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
 706	cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY;
 707	udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
 708	inc_nlink(dir);
 709	dir->i_ctime = dir->i_mtime = current_time(dir);
 710	mark_inode_dirty(dir);
 711	d_instantiate_new(dentry, inode);
 
 712	if (fibh.sbh != fibh.ebh)
 713		brelse(fibh.ebh);
 714	brelse(fibh.sbh);
 715	err = 0;
 716
 717out:
 718	return err;
 719}
 720
 721static int empty_dir(struct inode *dir)
 722{
 723	struct fileIdentDesc *fi, cfi;
 724	struct udf_fileident_bh fibh;
 725	loff_t f_pos;
 726	loff_t size = udf_ext0_offset(dir) + dir->i_size;
 727	udf_pblk_t block;
 728	struct kernel_lb_addr eloc;
 729	uint32_t elen;
 730	sector_t offset;
 731	struct extent_position epos = {};
 732	struct udf_inode_info *dinfo = UDF_I(dir);
 733
 734	f_pos = udf_ext0_offset(dir);
 735	fibh.soffset = fibh.eoffset = f_pos & (dir->i_sb->s_blocksize - 1);
 736
 737	if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 738		fibh.sbh = fibh.ebh = NULL;
 739	else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits,
 740			      &epos, &eloc, &elen, &offset) ==
 741					(EXT_RECORDED_ALLOCATED >> 30)) {
 742		block = udf_get_lb_pblock(dir->i_sb, &eloc, offset);
 743		if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
 744			if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 745				epos.offset -= sizeof(struct short_ad);
 746			else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 747				epos.offset -= sizeof(struct long_ad);
 748		} else
 749			offset = 0;
 750
 751		fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block);
 752		if (!fibh.sbh) {
 753			brelse(epos.bh);
 754			return 0;
 755		}
 756	} else {
 757		brelse(epos.bh);
 758		return 0;
 759	}
 760
 761	while (f_pos < size) {
 762		fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc,
 763					&elen, &offset);
 764		if (!fi) {
 765			if (fibh.sbh != fibh.ebh)
 766				brelse(fibh.ebh);
 767			brelse(fibh.sbh);
 768			brelse(epos.bh);
 769			return 0;
 770		}
 771
 772		if (cfi.lengthFileIdent &&
 773		    (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) {
 774			if (fibh.sbh != fibh.ebh)
 775				brelse(fibh.ebh);
 776			brelse(fibh.sbh);
 777			brelse(epos.bh);
 778			return 0;
 779		}
 780	}
 781
 782	if (fibh.sbh != fibh.ebh)
 783		brelse(fibh.ebh);
 784	brelse(fibh.sbh);
 785	brelse(epos.bh);
 786
 787	return 1;
 788}
 789
 790static int udf_rmdir(struct inode *dir, struct dentry *dentry)
 791{
 792	int retval;
 793	struct inode *inode = d_inode(dentry);
 794	struct udf_fileident_bh fibh;
 795	struct fileIdentDesc *fi, cfi;
 796	struct kernel_lb_addr tloc;
 797
 798	retval = -ENOENT;
 799	fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 800	if (IS_ERR_OR_NULL(fi)) {
 801		if (fi)
 802			retval = PTR_ERR(fi);
 803		goto out;
 804	}
 805
 806	retval = -EIO;
 807	tloc = lelb_to_cpu(cfi.icb.extLocation);
 808	if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino)
 809		goto end_rmdir;
 810	retval = -ENOTEMPTY;
 811	if (!empty_dir(inode))
 812		goto end_rmdir;
 813	retval = udf_delete_entry(dir, fi, &fibh, &cfi);
 814	if (retval)
 815		goto end_rmdir;
 816	if (inode->i_nlink != 2)
 817		udf_warn(inode->i_sb, "empty directory has nlink != 2 (%u)\n",
 818			 inode->i_nlink);
 819	clear_nlink(inode);
 820	inode->i_size = 0;
 821	inode_dec_link_count(dir);
 822	inode->i_ctime = dir->i_ctime = dir->i_mtime =
 823						current_time(inode);
 824	mark_inode_dirty(dir);
 825
 826end_rmdir:
 827	if (fibh.sbh != fibh.ebh)
 828		brelse(fibh.ebh);
 829	brelse(fibh.sbh);
 830
 831out:
 832	return retval;
 833}
 834
 835static int udf_unlink(struct inode *dir, struct dentry *dentry)
 836{
 837	int retval;
 838	struct inode *inode = d_inode(dentry);
 839	struct udf_fileident_bh fibh;
 840	struct fileIdentDesc *fi;
 841	struct fileIdentDesc cfi;
 842	struct kernel_lb_addr tloc;
 843
 844	retval = -ENOENT;
 845	fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 846
 847	if (IS_ERR_OR_NULL(fi)) {
 848		if (fi)
 849			retval = PTR_ERR(fi);
 850		goto out;
 851	}
 852
 853	retval = -EIO;
 854	tloc = lelb_to_cpu(cfi.icb.extLocation);
 855	if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino)
 856		goto end_unlink;
 857
 858	if (!inode->i_nlink) {
 859		udf_debug("Deleting nonexistent file (%lu), %u\n",
 860			  inode->i_ino, inode->i_nlink);
 861		set_nlink(inode, 1);
 862	}
 863	retval = udf_delete_entry(dir, fi, &fibh, &cfi);
 864	if (retval)
 865		goto end_unlink;
 866	dir->i_ctime = dir->i_mtime = current_time(dir);
 867	mark_inode_dirty(dir);
 868	inode_dec_link_count(inode);
 869	inode->i_ctime = dir->i_ctime;
 870	retval = 0;
 871
 872end_unlink:
 873	if (fibh.sbh != fibh.ebh)
 874		brelse(fibh.ebh);
 875	brelse(fibh.sbh);
 876
 877out:
 878	return retval;
 879}
 880
 881static int udf_symlink(struct inode *dir, struct dentry *dentry,
 882		       const char *symname)
 883{
 884	struct inode *inode = udf_new_inode(dir, S_IFLNK | 0777);
 885	struct pathComponent *pc;
 886	const char *compstart;
 887	struct extent_position epos = {};
 888	int eoffset, elen = 0;
 889	uint8_t *ea;
 890	int err;
 891	udf_pblk_t block;
 892	unsigned char *name = NULL;
 893	int namelen;
 894	struct udf_inode_info *iinfo;
 895	struct super_block *sb = dir->i_sb;
 896
 897	if (IS_ERR(inode))
 898		return PTR_ERR(inode);
 899
 900	iinfo = UDF_I(inode);
 901	down_write(&iinfo->i_data_sem);
 902	name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
 903	if (!name) {
 904		err = -ENOMEM;
 905		goto out_no_entry;
 906	}
 907
 908	inode->i_data.a_ops = &udf_symlink_aops;
 909	inode->i_op = &udf_symlink_inode_operations;
 910	inode_nohighmem(inode);
 911
 912	if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 913		struct kernel_lb_addr eloc;
 914		uint32_t bsize;
 915
 916		block = udf_new_block(sb, inode,
 917				iinfo->i_location.partitionReferenceNum,
 918				iinfo->i_location.logicalBlockNum, &err);
 919		if (!block)
 920			goto out_no_entry;
 921		epos.block = iinfo->i_location;
 922		epos.offset = udf_file_entry_alloc_offset(inode);
 923		epos.bh = NULL;
 924		eloc.logicalBlockNum = block;
 925		eloc.partitionReferenceNum =
 926				iinfo->i_location.partitionReferenceNum;
 927		bsize = sb->s_blocksize;
 928		iinfo->i_lenExtents = bsize;
 929		udf_add_aext(inode, &epos, &eloc, bsize, 0);
 930		brelse(epos.bh);
 931
 932		block = udf_get_pblock(sb, block,
 933				iinfo->i_location.partitionReferenceNum,
 934				0);
 935		epos.bh = udf_tgetblk(sb, block);
 936		lock_buffer(epos.bh);
 937		memset(epos.bh->b_data, 0x00, bsize);
 938		set_buffer_uptodate(epos.bh);
 939		unlock_buffer(epos.bh);
 940		mark_buffer_dirty_inode(epos.bh, inode);
 941		ea = epos.bh->b_data + udf_ext0_offset(inode);
 942	} else
 943		ea = iinfo->i_ext.i_data + iinfo->i_lenEAttr;
 944
 945	eoffset = sb->s_blocksize - udf_ext0_offset(inode);
 946	pc = (struct pathComponent *)ea;
 947
 948	if (*symname == '/') {
 949		do {
 950			symname++;
 951		} while (*symname == '/');
 952
 953		pc->componentType = 1;
 954		pc->lengthComponentIdent = 0;
 955		pc->componentFileVersionNum = 0;
 956		elen += sizeof(struct pathComponent);
 957	}
 958
 959	err = -ENAMETOOLONG;
 960
 961	while (*symname) {
 962		if (elen + sizeof(struct pathComponent) > eoffset)
 963			goto out_no_entry;
 964
 965		pc = (struct pathComponent *)(ea + elen);
 966
 967		compstart = symname;
 968
 969		do {
 970			symname++;
 971		} while (*symname && *symname != '/');
 972
 973		pc->componentType = 5;
 974		pc->lengthComponentIdent = 0;
 975		pc->componentFileVersionNum = 0;
 976		if (compstart[0] == '.') {
 977			if ((symname - compstart) == 1)
 978				pc->componentType = 4;
 979			else if ((symname - compstart) == 2 &&
 980					compstart[1] == '.')
 981				pc->componentType = 3;
 982		}
 983
 984		if (pc->componentType == 5) {
 985			namelen = udf_put_filename(sb, compstart,
 986						   symname - compstart,
 987						   name, UDF_NAME_LEN_CS0);
 988			if (!namelen)
 989				goto out_no_entry;
 990
 991			if (elen + sizeof(struct pathComponent) + namelen >
 992					eoffset)
 993				goto out_no_entry;
 994			else
 995				pc->lengthComponentIdent = namelen;
 996
 997			memcpy(pc->componentIdent, name, namelen);
 998		}
 999
1000		elen += sizeof(struct pathComponent) + pc->lengthComponentIdent;
1001
1002		if (*symname) {
1003			do {
1004				symname++;
1005			} while (*symname == '/');
1006		}
1007	}
1008
1009	brelse(epos.bh);
1010	inode->i_size = elen;
1011	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1012		iinfo->i_lenAlloc = inode->i_size;
1013	else
1014		udf_truncate_tail_extent(inode);
1015	mark_inode_dirty(inode);
1016	up_write(&iinfo->i_data_sem);
1017
1018	err = udf_add_nondir(dentry, inode);
1019out:
1020	kfree(name);
1021	return err;
1022
1023out_no_entry:
1024	up_write(&iinfo->i_data_sem);
1025	inode_dec_link_count(inode);
1026	discard_new_inode(inode);
 
1027	goto out;
1028}
1029
1030static int udf_link(struct dentry *old_dentry, struct inode *dir,
1031		    struct dentry *dentry)
1032{
1033	struct inode *inode = d_inode(old_dentry);
1034	struct udf_fileident_bh fibh;
1035	struct fileIdentDesc cfi, *fi;
1036	int err;
1037
1038	fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
1039	if (!fi) {
1040		return err;
1041	}
1042	cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
1043	cfi.icb.extLocation = cpu_to_lelb(UDF_I(inode)->i_location);
1044	if (UDF_SB(inode->i_sb)->s_lvid_bh) {
1045		*(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
1046			cpu_to_le32(lvid_get_unique_id(inode->i_sb));
1047	}
1048	udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
1049	if (UDF_I(dir)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1050		mark_inode_dirty(dir);
1051
1052	if (fibh.sbh != fibh.ebh)
1053		brelse(fibh.ebh);
1054	brelse(fibh.sbh);
1055	inc_nlink(inode);
1056	inode->i_ctime = current_time(inode);
1057	mark_inode_dirty(inode);
1058	dir->i_ctime = dir->i_mtime = current_time(dir);
1059	mark_inode_dirty(dir);
1060	ihold(inode);
1061	d_instantiate(dentry, inode);
1062
1063	return 0;
1064}
1065
1066/* Anybody can rename anything with this: the permission checks are left to the
1067 * higher-level routines.
1068 */
1069static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
1070		      struct inode *new_dir, struct dentry *new_dentry,
1071		      unsigned int flags)
1072{
1073	struct inode *old_inode = d_inode(old_dentry);
1074	struct inode *new_inode = d_inode(new_dentry);
1075	struct udf_fileident_bh ofibh, nfibh;
1076	struct fileIdentDesc *ofi = NULL, *nfi = NULL, *dir_fi = NULL;
1077	struct fileIdentDesc ocfi, ncfi;
1078	struct buffer_head *dir_bh = NULL;
1079	int retval = -ENOENT;
1080	struct kernel_lb_addr tloc;
1081	struct udf_inode_info *old_iinfo = UDF_I(old_inode);
1082
1083	if (flags & ~RENAME_NOREPLACE)
1084		return -EINVAL;
1085
1086	ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
1087	if (IS_ERR(ofi)) {
1088		retval = PTR_ERR(ofi);
1089		goto end_rename;
1090	}
1091
1092	if (ofibh.sbh != ofibh.ebh)
1093		brelse(ofibh.ebh);
1094
1095	brelse(ofibh.sbh);
1096	tloc = lelb_to_cpu(ocfi.icb.extLocation);
1097	if (!ofi || udf_get_lb_pblock(old_dir->i_sb, &tloc, 0)
1098	    != old_inode->i_ino)
1099		goto end_rename;
1100
1101	nfi = udf_find_entry(new_dir, &new_dentry->d_name, &nfibh, &ncfi);
1102	if (IS_ERR(nfi)) {
1103		retval = PTR_ERR(nfi);
1104		goto end_rename;
1105	}
1106	if (nfi && !new_inode) {
1107		if (nfibh.sbh != nfibh.ebh)
1108			brelse(nfibh.ebh);
1109		brelse(nfibh.sbh);
1110		nfi = NULL;
1111	}
1112	if (S_ISDIR(old_inode->i_mode)) {
1113		int offset = udf_ext0_offset(old_inode);
1114
1115		if (new_inode) {
1116			retval = -ENOTEMPTY;
1117			if (!empty_dir(new_inode))
1118				goto end_rename;
1119		}
1120		retval = -EIO;
1121		if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
1122			dir_fi = udf_get_fileident(
1123					old_iinfo->i_ext.i_data -
1124					  (old_iinfo->i_efe ?
1125					   sizeof(struct extendedFileEntry) :
1126					   sizeof(struct fileEntry)),
1127					old_inode->i_sb->s_blocksize, &offset);
1128		} else {
1129			dir_bh = udf_bread(old_inode, 0, 0, &retval);
1130			if (!dir_bh)
1131				goto end_rename;
1132			dir_fi = udf_get_fileident(dir_bh->b_data,
1133					old_inode->i_sb->s_blocksize, &offset);
1134		}
1135		if (!dir_fi)
1136			goto end_rename;
1137		tloc = lelb_to_cpu(dir_fi->icb.extLocation);
1138		if (udf_get_lb_pblock(old_inode->i_sb, &tloc, 0) !=
1139				old_dir->i_ino)
1140			goto end_rename;
1141	}
1142	if (!nfi) {
1143		nfi = udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi,
1144				    &retval);
1145		if (!nfi)
1146			goto end_rename;
1147	}
1148
1149	/*
1150	 * Like most other Unix systems, set the ctime for inodes on a
1151	 * rename.
1152	 */
1153	old_inode->i_ctime = current_time(old_inode);
1154	mark_inode_dirty(old_inode);
1155
1156	/*
1157	 * ok, that's it
1158	 */
1159	ncfi.fileVersionNum = ocfi.fileVersionNum;
1160	ncfi.fileCharacteristics = ocfi.fileCharacteristics;
1161	memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(ocfi.icb));
1162	udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL);
1163
1164	/* The old fid may have moved - find it again */
1165	ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
1166	udf_delete_entry(old_dir, ofi, &ofibh, &ocfi);
1167
1168	if (new_inode) {
1169		new_inode->i_ctime = current_time(new_inode);
1170		inode_dec_link_count(new_inode);
1171	}
1172	old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
1173	new_dir->i_ctime = new_dir->i_mtime = current_time(new_dir);
1174	mark_inode_dirty(old_dir);
1175	mark_inode_dirty(new_dir);
1176
1177	if (dir_fi) {
1178		dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location);
1179		udf_update_tag((char *)dir_fi, udf_dir_entry_len(dir_fi));
 
 
1180		if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1181			mark_inode_dirty(old_inode);
1182		else
1183			mark_buffer_dirty_inode(dir_bh, old_inode);
1184
1185		inode_dec_link_count(old_dir);
1186		if (new_inode)
1187			inode_dec_link_count(new_inode);
1188		else {
1189			inc_nlink(new_dir);
1190			mark_inode_dirty(new_dir);
1191		}
1192	}
1193
1194	if (ofi) {
1195		if (ofibh.sbh != ofibh.ebh)
1196			brelse(ofibh.ebh);
1197		brelse(ofibh.sbh);
1198	}
1199
1200	retval = 0;
1201
1202end_rename:
1203	brelse(dir_bh);
1204	if (nfi) {
1205		if (nfibh.sbh != nfibh.ebh)
1206			brelse(nfibh.ebh);
1207		brelse(nfibh.sbh);
1208	}
1209
1210	return retval;
1211}
1212
1213static struct dentry *udf_get_parent(struct dentry *child)
1214{
1215	struct kernel_lb_addr tloc;
1216	struct inode *inode = NULL;
1217	struct qstr dotdot = QSTR_INIT("..", 2);
1218	struct fileIdentDesc cfi;
1219	struct udf_fileident_bh fibh;
1220
1221	if (!udf_find_entry(d_inode(child), &dotdot, &fibh, &cfi))
1222		return ERR_PTR(-EACCES);
1223
1224	if (fibh.sbh != fibh.ebh)
1225		brelse(fibh.ebh);
1226	brelse(fibh.sbh);
1227
1228	tloc = lelb_to_cpu(cfi.icb.extLocation);
1229	inode = udf_iget(child->d_sb, &tloc);
1230	if (IS_ERR(inode))
1231		return ERR_CAST(inode);
1232
1233	return d_obtain_alias(inode);
1234}
1235
1236
1237static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block,
1238					u16 partref, __u32 generation)
1239{
1240	struct inode *inode;
1241	struct kernel_lb_addr loc;
1242
1243	if (block == 0)
1244		return ERR_PTR(-ESTALE);
1245
1246	loc.logicalBlockNum = block;
1247	loc.partitionReferenceNum = partref;
1248	inode = udf_iget(sb, &loc);
1249
1250	if (IS_ERR(inode))
1251		return ERR_CAST(inode);
1252
1253	if (generation && inode->i_generation != generation) {
1254		iput(inode);
1255		return ERR_PTR(-ESTALE);
1256	}
1257	return d_obtain_alias(inode);
1258}
1259
1260static struct dentry *udf_fh_to_dentry(struct super_block *sb,
1261				       struct fid *fid, int fh_len, int fh_type)
1262{
1263	if (fh_len < 3 ||
1264	    (fh_type != FILEID_UDF_WITH_PARENT &&
1265	     fh_type != FILEID_UDF_WITHOUT_PARENT))
1266		return NULL;
1267
1268	return udf_nfs_get_inode(sb, fid->udf.block, fid->udf.partref,
1269			fid->udf.generation);
1270}
1271
1272static struct dentry *udf_fh_to_parent(struct super_block *sb,
1273				       struct fid *fid, int fh_len, int fh_type)
1274{
1275	if (fh_len < 5 || fh_type != FILEID_UDF_WITH_PARENT)
1276		return NULL;
1277
1278	return udf_nfs_get_inode(sb, fid->udf.parent_block,
1279				 fid->udf.parent_partref,
1280				 fid->udf.parent_generation);
1281}
1282static int udf_encode_fh(struct inode *inode, __u32 *fh, int *lenp,
1283			 struct inode *parent)
1284{
1285	int len = *lenp;
1286	struct kernel_lb_addr location = UDF_I(inode)->i_location;
1287	struct fid *fid = (struct fid *)fh;
1288	int type = FILEID_UDF_WITHOUT_PARENT;
1289
1290	if (parent && (len < 5)) {
1291		*lenp = 5;
1292		return FILEID_INVALID;
1293	} else if (len < 3) {
1294		*lenp = 3;
1295		return FILEID_INVALID;
1296	}
1297
1298	*lenp = 3;
1299	fid->udf.block = location.logicalBlockNum;
1300	fid->udf.partref = location.partitionReferenceNum;
1301	fid->udf.parent_partref = 0;
1302	fid->udf.generation = inode->i_generation;
1303
1304	if (parent) {
1305		location = UDF_I(parent)->i_location;
1306		fid->udf.parent_block = location.logicalBlockNum;
1307		fid->udf.parent_partref = location.partitionReferenceNum;
1308		fid->udf.parent_generation = inode->i_generation;
1309		*lenp = 5;
1310		type = FILEID_UDF_WITH_PARENT;
1311	}
1312
1313	return type;
1314}
1315
1316const struct export_operations udf_export_ops = {
1317	.encode_fh	= udf_encode_fh,
1318	.fh_to_dentry   = udf_fh_to_dentry,
1319	.fh_to_parent   = udf_fh_to_parent,
1320	.get_parent     = udf_get_parent,
1321};
1322
1323const struct inode_operations udf_dir_inode_operations = {
1324	.lookup				= udf_lookup,
1325	.create				= udf_create,
1326	.link				= udf_link,
1327	.unlink				= udf_unlink,
1328	.symlink			= udf_symlink,
1329	.mkdir				= udf_mkdir,
1330	.rmdir				= udf_rmdir,
1331	.mknod				= udf_mknod,
1332	.rename				= udf_rename,
1333	.tmpfile			= udf_tmpfile,
1334};