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