xref: /openbmc/linux/fs/udf/namei.c (revision 1e0290d6)
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 /**
45  * udf_fiiter_find_entry - find entry in given directory.
46  *
47  * @dir:	directory inode to search in
48  * @child:	qstr of the name
49  * @iter:	iter to use for searching
50  *
51  * This function searches in the directory @dir for a file name @child. When
52  * found, @iter points to the position in the directory with given entry.
53  *
54  * Returns 0 on success, < 0 on error (including -ENOENT).
55  */
56 static int udf_fiiter_find_entry(struct inode *dir, const struct qstr *child,
57 				 struct udf_fileident_iter *iter)
58 {
59 	int flen;
60 	unsigned char *fname = NULL;
61 	struct super_block *sb = dir->i_sb;
62 	int isdotdot = child->len == 2 &&
63 		child->name[0] == '.' && child->name[1] == '.';
64 	int ret;
65 
66 	fname = kmalloc(UDF_NAME_LEN, GFP_NOFS);
67 	if (!fname)
68 		return -ENOMEM;
69 
70 	for (ret = udf_fiiter_init(iter, dir, 0);
71 	     !ret && iter->pos < dir->i_size;
72 	     ret = udf_fiiter_advance(iter)) {
73 		if (iter->fi.fileCharacteristics & FID_FILE_CHAR_DELETED) {
74 			if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE))
75 				continue;
76 		}
77 
78 		if (iter->fi.fileCharacteristics & FID_FILE_CHAR_HIDDEN) {
79 			if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE))
80 				continue;
81 		}
82 
83 		if ((iter->fi.fileCharacteristics & FID_FILE_CHAR_PARENT) &&
84 		    isdotdot)
85 			goto out_ok;
86 
87 		if (!iter->fi.lengthFileIdent)
88 			continue;
89 
90 		flen = udf_get_filename(sb, iter->name,
91 				iter->fi.lengthFileIdent, fname, UDF_NAME_LEN);
92 		if (flen < 0) {
93 			ret = flen;
94 			goto out_err;
95 		}
96 
97 		if (udf_match(flen, fname, child->len, child->name))
98 			goto out_ok;
99 	}
100 	if (!ret)
101 		ret = -ENOENT;
102 
103 out_err:
104 	udf_fiiter_release(iter);
105 out_ok:
106 	kfree(fname);
107 
108 	return ret;
109 }
110 
111 static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
112 				 unsigned int flags)
113 {
114 	struct inode *inode = NULL;
115 	struct udf_fileident_iter iter;
116 	int err;
117 
118 	if (dentry->d_name.len > UDF_NAME_LEN)
119 		return ERR_PTR(-ENAMETOOLONG);
120 
121 	err = udf_fiiter_find_entry(dir, &dentry->d_name, &iter);
122 	if (err < 0 && err != -ENOENT)
123 		return ERR_PTR(err);
124 
125 	if (err == 0) {
126 		struct kernel_lb_addr loc;
127 
128 		loc = lelb_to_cpu(iter.fi.icb.extLocation);
129 		udf_fiiter_release(&iter);
130 
131 		inode = udf_iget(dir->i_sb, &loc);
132 		if (IS_ERR(inode))
133 			return ERR_CAST(inode);
134 	}
135 
136 	return d_splice_alias(inode, dentry);
137 }
138 
139 static struct buffer_head *udf_expand_dir_adinicb(struct inode *inode,
140 					udf_pblk_t *block, int *err)
141 {
142 	udf_pblk_t newblock;
143 	struct buffer_head *dbh = NULL;
144 	struct kernel_lb_addr eloc;
145 	struct extent_position epos;
146 	uint8_t alloctype;
147 	struct udf_inode_info *iinfo = UDF_I(inode);
148 	struct udf_fileident_iter iter;
149 	uint8_t *impuse;
150 	int ret;
151 
152 	if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
153 		alloctype = ICBTAG_FLAG_AD_SHORT;
154 	else
155 		alloctype = ICBTAG_FLAG_AD_LONG;
156 
157 	if (!inode->i_size) {
158 		iinfo->i_alloc_type = alloctype;
159 		mark_inode_dirty(inode);
160 		return NULL;
161 	}
162 
163 	/* alloc block, and copy data to it */
164 	*block = udf_new_block(inode->i_sb, inode,
165 			       iinfo->i_location.partitionReferenceNum,
166 			       iinfo->i_location.logicalBlockNum, err);
167 	if (!(*block))
168 		return NULL;
169 	newblock = udf_get_pblock(inode->i_sb, *block,
170 				  iinfo->i_location.partitionReferenceNum,
171 				0);
172 	if (!newblock)
173 		return NULL;
174 	dbh = udf_tgetblk(inode->i_sb, newblock);
175 	if (!dbh)
176 		return NULL;
177 	lock_buffer(dbh);
178 	memcpy(dbh->b_data, iinfo->i_data, inode->i_size);
179 	memset(dbh->b_data + inode->i_size, 0,
180 	       inode->i_sb->s_blocksize - inode->i_size);
181 	set_buffer_uptodate(dbh);
182 	unlock_buffer(dbh);
183 
184 	/* Drop inline data, add block instead */
185 	iinfo->i_alloc_type = alloctype;
186 	memset(iinfo->i_data + iinfo->i_lenEAttr, 0, iinfo->i_lenAlloc);
187 	iinfo->i_lenAlloc = 0;
188 	eloc.logicalBlockNum = *block;
189 	eloc.partitionReferenceNum =
190 				iinfo->i_location.partitionReferenceNum;
191 	iinfo->i_lenExtents = inode->i_size;
192 	epos.bh = NULL;
193 	epos.block = iinfo->i_location;
194 	epos.offset = udf_file_entry_alloc_offset(inode);
195 	udf_add_aext(inode, &epos, &eloc, inode->i_size, 0);
196 	brelse(epos.bh);
197 	mark_inode_dirty(inode);
198 
199 	/* Now fixup tags in moved directory entries */
200 	for (ret = udf_fiiter_init(&iter, inode, 0);
201 	     !ret && iter.pos < inode->i_size;
202 	     ret = udf_fiiter_advance(&iter)) {
203 		iter.fi.descTag.tagLocation = cpu_to_le32(*block);
204 		if (iter.fi.lengthOfImpUse != cpu_to_le16(0))
205 			impuse = dbh->b_data + iter.pos +
206 						sizeof(struct fileIdentDesc);
207 		else
208 			impuse = NULL;
209 		udf_fiiter_write_fi(&iter, impuse);
210 	}
211 	/*
212 	 * We don't expect the iteration to fail as the directory has been
213 	 * already verified to be correct
214 	 */
215 	WARN_ON_ONCE(ret);
216 	udf_fiiter_release(&iter);
217 
218 	return dbh;
219 }
220 
221 static int udf_fiiter_add_entry(struct inode *dir, struct dentry *dentry,
222 				struct udf_fileident_iter *iter)
223 {
224 	struct udf_inode_info *dinfo = UDF_I(dir);
225 	int nfidlen, namelen = 0;
226 	int ret;
227 	int off, blksize = 1 << dir->i_blkbits;
228 	udf_pblk_t block;
229 	char name[UDF_NAME_LEN_CS0];
230 
231 	if (dentry) {
232 		if (!dentry->d_name.len)
233 			return -EINVAL;
234 		namelen = udf_put_filename(dir->i_sb, dentry->d_name.name,
235 					   dentry->d_name.len,
236 					   name, UDF_NAME_LEN_CS0);
237 		if (!namelen)
238 			return -ENAMETOOLONG;
239 	}
240 	nfidlen = ALIGN(sizeof(struct fileIdentDesc) + namelen, UDF_NAME_PAD);
241 
242 	for (ret = udf_fiiter_init(iter, dir, 0);
243 	     !ret && iter->pos < dir->i_size;
244 	     ret = udf_fiiter_advance(iter)) {
245 		if (iter->fi.fileCharacteristics & FID_FILE_CHAR_DELETED) {
246 			if (udf_dir_entry_len(&iter->fi) == nfidlen) {
247 				iter->fi.descTag.tagSerialNum = cpu_to_le16(1);
248 				iter->fi.fileVersionNum = cpu_to_le16(1);
249 				iter->fi.fileCharacteristics = 0;
250 				iter->fi.lengthFileIdent = namelen;
251 				iter->fi.lengthOfImpUse = cpu_to_le16(0);
252 				memcpy(iter->namebuf, name, namelen);
253 				iter->name = iter->namebuf;
254 				return 0;
255 			}
256 		}
257 	}
258 	if (ret) {
259 		udf_fiiter_release(iter);
260 		return ret;
261 	}
262 	if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB &&
263 	    blksize - udf_ext0_offset(dir) - iter->pos < nfidlen) {
264 		struct buffer_head *retbh;
265 
266 		udf_fiiter_release(iter);
267 		/*
268 		 * FIXME: udf_expand_dir_adinicb does not need to return bh
269 		 * once other users are gone
270 		 */
271 		retbh = udf_expand_dir_adinicb(dir, &block, &ret);
272 		if (!retbh)
273 			return ret;
274 		brelse(retbh);
275 		ret = udf_fiiter_init(iter, dir, dir->i_size);
276 		if (ret < 0)
277 			return ret;
278 	}
279 
280 	/* Get blocknumber to use for entry tag */
281 	if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
282 		block = dinfo->i_location.logicalBlockNum;
283 	} else {
284 		block = iter->eloc.logicalBlockNum +
285 				((iter->elen - 1) >> dir->i_blkbits);
286 	}
287 	off = iter->pos & (blksize - 1);
288 	if (!off)
289 		off = blksize;
290 	/* Entry fits into current block? */
291 	if (blksize - udf_ext0_offset(dir) - off >= nfidlen)
292 		goto store_fi;
293 
294 	ret = udf_fiiter_append_blk(iter);
295 	if (ret) {
296 		udf_fiiter_release(iter);
297 		return ret;
298 	}
299 
300 	/* Entry will be completely in the new block? Update tag location... */
301 	if (!(iter->pos & (blksize - 1)))
302 		block = iter->eloc.logicalBlockNum +
303 				((iter->elen - 1) >> dir->i_blkbits);
304 store_fi:
305 	memset(&iter->fi, 0, sizeof(struct fileIdentDesc));
306 	if (UDF_SB(dir->i_sb)->s_udfrev >= 0x0200)
307 		udf_new_tag((char *)(&iter->fi), TAG_IDENT_FID, 3, 1, block,
308 			    sizeof(struct tag));
309 	else
310 		udf_new_tag((char *)(&iter->fi), TAG_IDENT_FID, 2, 1, block,
311 			    sizeof(struct tag));
312 	iter->fi.fileVersionNum = cpu_to_le16(1);
313 	iter->fi.lengthFileIdent = namelen;
314 	iter->fi.lengthOfImpUse = cpu_to_le16(0);
315 	memcpy(iter->namebuf, name, namelen);
316 	iter->name = iter->namebuf;
317 
318 	dir->i_size += nfidlen;
319 	if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
320 		dinfo->i_lenAlloc += nfidlen;
321 	} else {
322 		/* Truncate last extent to proper size */
323 		udf_fiiter_update_elen(iter, iter->elen -
324 					(dinfo->i_lenExtents - dir->i_size));
325 	}
326 	mark_inode_dirty(dir);
327 
328 	return 0;
329 }
330 
331 static void udf_fiiter_delete_entry(struct udf_fileident_iter *iter)
332 {
333 	iter->fi.fileCharacteristics |= FID_FILE_CHAR_DELETED;
334 
335 	if (UDF_QUERY_FLAG(iter->dir->i_sb, UDF_FLAG_STRICT))
336 		memset(&iter->fi.icb, 0x00, sizeof(struct long_ad));
337 
338 	udf_fiiter_write_fi(iter, NULL);
339 }
340 
341 static int udf_add_nondir(struct dentry *dentry, struct inode *inode)
342 {
343 	struct udf_inode_info *iinfo = UDF_I(inode);
344 	struct inode *dir = d_inode(dentry->d_parent);
345 	struct udf_fileident_iter iter;
346 	int err;
347 
348 	err = udf_fiiter_add_entry(dir, dentry, &iter);
349 	if (err) {
350 		inode_dec_link_count(inode);
351 		discard_new_inode(inode);
352 		return err;
353 	}
354 	iter.fi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
355 	iter.fi.icb.extLocation = cpu_to_lelb(iinfo->i_location);
356 	*(__le32 *)((struct allocDescImpUse *)iter.fi.icb.impUse)->impUse =
357 		cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
358 	udf_fiiter_write_fi(&iter, NULL);
359 	dir->i_ctime = dir->i_mtime = current_time(dir);
360 	mark_inode_dirty(dir);
361 	udf_fiiter_release(&iter);
362 	d_instantiate_new(dentry, inode);
363 
364 	return 0;
365 }
366 
367 static int udf_create(struct user_namespace *mnt_userns, struct inode *dir,
368 		      struct dentry *dentry, umode_t mode, bool excl)
369 {
370 	struct inode *inode = udf_new_inode(dir, mode);
371 
372 	if (IS_ERR(inode))
373 		return PTR_ERR(inode);
374 
375 	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
376 		inode->i_data.a_ops = &udf_adinicb_aops;
377 	else
378 		inode->i_data.a_ops = &udf_aops;
379 	inode->i_op = &udf_file_inode_operations;
380 	inode->i_fop = &udf_file_operations;
381 	mark_inode_dirty(inode);
382 
383 	return udf_add_nondir(dentry, inode);
384 }
385 
386 static int udf_tmpfile(struct user_namespace *mnt_userns, struct inode *dir,
387 		       struct file *file, umode_t mode)
388 {
389 	struct inode *inode = udf_new_inode(dir, mode);
390 
391 	if (IS_ERR(inode))
392 		return PTR_ERR(inode);
393 
394 	if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
395 		inode->i_data.a_ops = &udf_adinicb_aops;
396 	else
397 		inode->i_data.a_ops = &udf_aops;
398 	inode->i_op = &udf_file_inode_operations;
399 	inode->i_fop = &udf_file_operations;
400 	mark_inode_dirty(inode);
401 	d_tmpfile(file, inode);
402 	unlock_new_inode(inode);
403 	return finish_open_simple(file, 0);
404 }
405 
406 static int udf_mknod(struct user_namespace *mnt_userns, struct inode *dir,
407 		     struct dentry *dentry, umode_t mode, dev_t rdev)
408 {
409 	struct inode *inode;
410 
411 	if (!old_valid_dev(rdev))
412 		return -EINVAL;
413 
414 	inode = udf_new_inode(dir, mode);
415 	if (IS_ERR(inode))
416 		return PTR_ERR(inode);
417 
418 	init_special_inode(inode, mode, rdev);
419 	return udf_add_nondir(dentry, inode);
420 }
421 
422 static int udf_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
423 		     struct dentry *dentry, umode_t mode)
424 {
425 	struct inode *inode;
426 	struct udf_fileident_iter iter;
427 	int err;
428 	struct udf_inode_info *dinfo = UDF_I(dir);
429 	struct udf_inode_info *iinfo;
430 
431 	inode = udf_new_inode(dir, S_IFDIR | mode);
432 	if (IS_ERR(inode))
433 		return PTR_ERR(inode);
434 
435 	iinfo = UDF_I(inode);
436 	inode->i_op = &udf_dir_inode_operations;
437 	inode->i_fop = &udf_dir_operations;
438 	err = udf_fiiter_add_entry(inode, NULL, &iter);
439 	if (err) {
440 		clear_nlink(inode);
441 		discard_new_inode(inode);
442 		return err;
443 	}
444 	set_nlink(inode, 2);
445 	iter.fi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
446 	iter.fi.icb.extLocation = cpu_to_lelb(dinfo->i_location);
447 	*(__le32 *)((struct allocDescImpUse *)iter.fi.icb.impUse)->impUse =
448 		cpu_to_le32(dinfo->i_unique & 0x00000000FFFFFFFFUL);
449 	iter.fi.fileCharacteristics =
450 			FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT;
451 	udf_fiiter_write_fi(&iter, NULL);
452 	udf_fiiter_release(&iter);
453 	mark_inode_dirty(inode);
454 
455 	err = udf_fiiter_add_entry(dir, dentry, &iter);
456 	if (err) {
457 		clear_nlink(inode);
458 		discard_new_inode(inode);
459 		return err;
460 	}
461 	iter.fi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
462 	iter.fi.icb.extLocation = cpu_to_lelb(iinfo->i_location);
463 	*(__le32 *)((struct allocDescImpUse *)iter.fi.icb.impUse)->impUse =
464 		cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
465 	iter.fi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY;
466 	udf_fiiter_write_fi(&iter, NULL);
467 	udf_fiiter_release(&iter);
468 	inc_nlink(dir);
469 	dir->i_ctime = dir->i_mtime = current_time(dir);
470 	mark_inode_dirty(dir);
471 	d_instantiate_new(dentry, inode);
472 
473 	return 0;
474 }
475 
476 static int empty_dir(struct inode *dir)
477 {
478 	struct udf_fileident_iter iter;
479 	int ret;
480 
481 	for (ret = udf_fiiter_init(&iter, dir, 0);
482 	     !ret && iter.pos < dir->i_size;
483 	     ret = udf_fiiter_advance(&iter)) {
484 		if (iter.fi.lengthFileIdent &&
485 		    !(iter.fi.fileCharacteristics & FID_FILE_CHAR_DELETED)) {
486 			udf_fiiter_release(&iter);
487 			return 0;
488 		}
489 	}
490 	udf_fiiter_release(&iter);
491 
492 	return 1;
493 }
494 
495 static int udf_rmdir(struct inode *dir, struct dentry *dentry)
496 {
497 	int ret;
498 	struct inode *inode = d_inode(dentry);
499 	struct udf_fileident_iter iter;
500 	struct kernel_lb_addr tloc;
501 
502 	ret = udf_fiiter_find_entry(dir, &dentry->d_name, &iter);
503 	if (ret)
504 		goto out;
505 
506 	ret = -EFSCORRUPTED;
507 	tloc = lelb_to_cpu(iter.fi.icb.extLocation);
508 	if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino)
509 		goto end_rmdir;
510 	ret = -ENOTEMPTY;
511 	if (!empty_dir(inode))
512 		goto end_rmdir;
513 	udf_fiiter_delete_entry(&iter);
514 	if (inode->i_nlink != 2)
515 		udf_warn(inode->i_sb, "empty directory has nlink != 2 (%u)\n",
516 			 inode->i_nlink);
517 	clear_nlink(inode);
518 	inode->i_size = 0;
519 	inode_dec_link_count(dir);
520 	inode->i_ctime = dir->i_ctime = dir->i_mtime =
521 						current_time(inode);
522 	mark_inode_dirty(dir);
523 	ret = 0;
524 end_rmdir:
525 	udf_fiiter_release(&iter);
526 out:
527 	return ret;
528 }
529 
530 static int udf_unlink(struct inode *dir, struct dentry *dentry)
531 {
532 	int ret;
533 	struct inode *inode = d_inode(dentry);
534 	struct udf_fileident_iter iter;
535 	struct kernel_lb_addr tloc;
536 
537 	ret = udf_fiiter_find_entry(dir, &dentry->d_name, &iter);
538 	if (ret)
539 		goto out;
540 
541 	ret = -EFSCORRUPTED;
542 	tloc = lelb_to_cpu(iter.fi.icb.extLocation);
543 	if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino)
544 		goto end_unlink;
545 
546 	if (!inode->i_nlink) {
547 		udf_debug("Deleting nonexistent file (%lu), %u\n",
548 			  inode->i_ino, inode->i_nlink);
549 		set_nlink(inode, 1);
550 	}
551 	udf_fiiter_delete_entry(&iter);
552 	dir->i_ctime = dir->i_mtime = current_time(dir);
553 	mark_inode_dirty(dir);
554 	inode_dec_link_count(inode);
555 	inode->i_ctime = dir->i_ctime;
556 	ret = 0;
557 end_unlink:
558 	udf_fiiter_release(&iter);
559 out:
560 	return ret;
561 }
562 
563 static int udf_symlink(struct user_namespace *mnt_userns, struct inode *dir,
564 		       struct dentry *dentry, const char *symname)
565 {
566 	struct inode *inode = udf_new_inode(dir, S_IFLNK | 0777);
567 	struct pathComponent *pc;
568 	const char *compstart;
569 	struct extent_position epos = {};
570 	int eoffset, elen = 0;
571 	uint8_t *ea;
572 	int err;
573 	udf_pblk_t block;
574 	unsigned char *name = NULL;
575 	int namelen;
576 	struct udf_inode_info *iinfo;
577 	struct super_block *sb = dir->i_sb;
578 
579 	if (IS_ERR(inode))
580 		return PTR_ERR(inode);
581 
582 	iinfo = UDF_I(inode);
583 	down_write(&iinfo->i_data_sem);
584 	name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
585 	if (!name) {
586 		err = -ENOMEM;
587 		goto out_no_entry;
588 	}
589 
590 	inode->i_data.a_ops = &udf_symlink_aops;
591 	inode->i_op = &udf_symlink_inode_operations;
592 	inode_nohighmem(inode);
593 
594 	if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
595 		struct kernel_lb_addr eloc;
596 		uint32_t bsize;
597 
598 		block = udf_new_block(sb, inode,
599 				iinfo->i_location.partitionReferenceNum,
600 				iinfo->i_location.logicalBlockNum, &err);
601 		if (!block)
602 			goto out_no_entry;
603 		epos.block = iinfo->i_location;
604 		epos.offset = udf_file_entry_alloc_offset(inode);
605 		epos.bh = NULL;
606 		eloc.logicalBlockNum = block;
607 		eloc.partitionReferenceNum =
608 				iinfo->i_location.partitionReferenceNum;
609 		bsize = sb->s_blocksize;
610 		iinfo->i_lenExtents = bsize;
611 		udf_add_aext(inode, &epos, &eloc, bsize, 0);
612 		brelse(epos.bh);
613 
614 		block = udf_get_pblock(sb, block,
615 				iinfo->i_location.partitionReferenceNum,
616 				0);
617 		epos.bh = udf_tgetblk(sb, block);
618 		if (unlikely(!epos.bh)) {
619 			err = -ENOMEM;
620 			goto out_no_entry;
621 		}
622 		lock_buffer(epos.bh);
623 		memset(epos.bh->b_data, 0x00, bsize);
624 		set_buffer_uptodate(epos.bh);
625 		unlock_buffer(epos.bh);
626 		mark_buffer_dirty_inode(epos.bh, inode);
627 		ea = epos.bh->b_data + udf_ext0_offset(inode);
628 	} else
629 		ea = iinfo->i_data + iinfo->i_lenEAttr;
630 
631 	eoffset = sb->s_blocksize - udf_ext0_offset(inode);
632 	pc = (struct pathComponent *)ea;
633 
634 	if (*symname == '/') {
635 		do {
636 			symname++;
637 		} while (*symname == '/');
638 
639 		pc->componentType = 1;
640 		pc->lengthComponentIdent = 0;
641 		pc->componentFileVersionNum = 0;
642 		elen += sizeof(struct pathComponent);
643 	}
644 
645 	err = -ENAMETOOLONG;
646 
647 	while (*symname) {
648 		if (elen + sizeof(struct pathComponent) > eoffset)
649 			goto out_no_entry;
650 
651 		pc = (struct pathComponent *)(ea + elen);
652 
653 		compstart = symname;
654 
655 		do {
656 			symname++;
657 		} while (*symname && *symname != '/');
658 
659 		pc->componentType = 5;
660 		pc->lengthComponentIdent = 0;
661 		pc->componentFileVersionNum = 0;
662 		if (compstart[0] == '.') {
663 			if ((symname - compstart) == 1)
664 				pc->componentType = 4;
665 			else if ((symname - compstart) == 2 &&
666 					compstart[1] == '.')
667 				pc->componentType = 3;
668 		}
669 
670 		if (pc->componentType == 5) {
671 			namelen = udf_put_filename(sb, compstart,
672 						   symname - compstart,
673 						   name, UDF_NAME_LEN_CS0);
674 			if (!namelen)
675 				goto out_no_entry;
676 
677 			if (elen + sizeof(struct pathComponent) + namelen >
678 					eoffset)
679 				goto out_no_entry;
680 			else
681 				pc->lengthComponentIdent = namelen;
682 
683 			memcpy(pc->componentIdent, name, namelen);
684 		}
685 
686 		elen += sizeof(struct pathComponent) + pc->lengthComponentIdent;
687 
688 		if (*symname) {
689 			do {
690 				symname++;
691 			} while (*symname == '/');
692 		}
693 	}
694 
695 	brelse(epos.bh);
696 	inode->i_size = elen;
697 	if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
698 		iinfo->i_lenAlloc = inode->i_size;
699 	else
700 		udf_truncate_tail_extent(inode);
701 	mark_inode_dirty(inode);
702 	up_write(&iinfo->i_data_sem);
703 
704 	err = udf_add_nondir(dentry, inode);
705 out:
706 	kfree(name);
707 	return err;
708 
709 out_no_entry:
710 	up_write(&iinfo->i_data_sem);
711 	inode_dec_link_count(inode);
712 	discard_new_inode(inode);
713 	goto out;
714 }
715 
716 static int udf_link(struct dentry *old_dentry, struct inode *dir,
717 		    struct dentry *dentry)
718 {
719 	struct inode *inode = d_inode(old_dentry);
720 	struct udf_fileident_iter iter;
721 	int err;
722 
723 	err = udf_fiiter_add_entry(dir, dentry, &iter);
724 	if (err)
725 		return err;
726 	iter.fi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
727 	iter.fi.icb.extLocation = cpu_to_lelb(UDF_I(inode)->i_location);
728 	if (UDF_SB(inode->i_sb)->s_lvid_bh) {
729 		*(__le32 *)((struct allocDescImpUse *)iter.fi.icb.impUse)->impUse =
730 			cpu_to_le32(lvid_get_unique_id(inode->i_sb));
731 	}
732 	udf_fiiter_write_fi(&iter, NULL);
733 	udf_fiiter_release(&iter);
734 
735 	inc_nlink(inode);
736 	inode->i_ctime = current_time(inode);
737 	mark_inode_dirty(inode);
738 	dir->i_ctime = dir->i_mtime = current_time(dir);
739 	mark_inode_dirty(dir);
740 	ihold(inode);
741 	d_instantiate(dentry, inode);
742 
743 	return 0;
744 }
745 
746 /* Anybody can rename anything with this: the permission checks are left to the
747  * higher-level routines.
748  */
749 static int udf_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
750 		      struct dentry *old_dentry, struct inode *new_dir,
751 		      struct dentry *new_dentry, unsigned int flags)
752 {
753 	struct inode *old_inode = d_inode(old_dentry);
754 	struct inode *new_inode = d_inode(new_dentry);
755 	struct udf_fileident_iter oiter, niter, diriter;
756 	bool has_diriter = false;
757 	int retval;
758 	struct kernel_lb_addr tloc;
759 
760 	if (flags & ~RENAME_NOREPLACE)
761 		return -EINVAL;
762 
763 	retval = udf_fiiter_find_entry(old_dir, &old_dentry->d_name, &oiter);
764 	if (retval)
765 		return retval;
766 
767 	tloc = lelb_to_cpu(oiter.fi.icb.extLocation);
768 	if (udf_get_lb_pblock(old_dir->i_sb, &tloc, 0) != old_inode->i_ino) {
769 		retval = -ENOENT;
770 		goto out_oiter;
771 	}
772 
773 	if (S_ISDIR(old_inode->i_mode)) {
774 		if (new_inode) {
775 			retval = -ENOTEMPTY;
776 			if (!empty_dir(new_inode))
777 				goto out_oiter;
778 		}
779 		retval = udf_fiiter_find_entry(old_inode, &dotdot_name,
780 					       &diriter);
781 		if (retval == -ENOENT) {
782 			udf_err(old_inode->i_sb,
783 				"directory (ino %lu) has no '..' entry\n",
784 				old_inode->i_ino);
785 			retval = -EFSCORRUPTED;
786 		}
787 		if (retval)
788 			goto out_oiter;
789 		has_diriter = true;
790 		tloc = lelb_to_cpu(diriter.fi.icb.extLocation);
791 		if (udf_get_lb_pblock(old_inode->i_sb, &tloc, 0) !=
792 				old_dir->i_ino) {
793 			retval = -EFSCORRUPTED;
794 			udf_err(old_inode->i_sb,
795 				"directory (ino %lu) has parent entry pointing to another inode (%lu != %u)\n",
796 				old_inode->i_ino, old_dir->i_ino,
797 				udf_get_lb_pblock(old_inode->i_sb, &tloc, 0));
798 			goto out_oiter;
799 		}
800 	}
801 
802 	retval = udf_fiiter_find_entry(new_dir, &new_dentry->d_name, &niter);
803 	if (retval && retval != -ENOENT)
804 		goto out_oiter;
805 	/* Entry found but not passed by VFS? */
806 	if (!retval && !new_inode) {
807 		retval = -EFSCORRUPTED;
808 		udf_fiiter_release(&niter);
809 		goto out_oiter;
810 	}
811 	/* Entry not found? Need to add one... */
812 	if (retval) {
813 		udf_fiiter_release(&niter);
814 		retval = udf_fiiter_add_entry(new_dir, new_dentry, &niter);
815 		if (retval)
816 			goto out_oiter;
817 	}
818 
819 	/*
820 	 * Like most other Unix systems, set the ctime for inodes on a
821 	 * rename.
822 	 */
823 	old_inode->i_ctime = current_time(old_inode);
824 	mark_inode_dirty(old_inode);
825 
826 	/*
827 	 * ok, that's it
828 	 */
829 	niter.fi.fileVersionNum = oiter.fi.fileVersionNum;
830 	niter.fi.fileCharacteristics = oiter.fi.fileCharacteristics;
831 	memcpy(&(niter.fi.icb), &(oiter.fi.icb), sizeof(oiter.fi.icb));
832 	udf_fiiter_write_fi(&niter, NULL);
833 	udf_fiiter_release(&niter);
834 
835 	/*
836 	 * The old entry may have moved due to new entry allocation. Find it
837 	 * again.
838 	 */
839 	udf_fiiter_release(&oiter);
840 	retval = udf_fiiter_find_entry(old_dir, &old_dentry->d_name, &oiter);
841 	if (retval) {
842 		udf_err(old_dir->i_sb,
843 			"failed to find renamed entry again in directory (ino %lu)\n",
844 			old_dir->i_ino);
845 	} else {
846 		udf_fiiter_delete_entry(&oiter);
847 		udf_fiiter_release(&oiter);
848 	}
849 
850 	if (new_inode) {
851 		new_inode->i_ctime = current_time(new_inode);
852 		inode_dec_link_count(new_inode);
853 	}
854 	old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
855 	new_dir->i_ctime = new_dir->i_mtime = current_time(new_dir);
856 	mark_inode_dirty(old_dir);
857 	mark_inode_dirty(new_dir);
858 
859 	if (has_diriter) {
860 		diriter.fi.icb.extLocation =
861 					cpu_to_lelb(UDF_I(new_dir)->i_location);
862 		udf_update_tag((char *)&diriter.fi,
863 			       udf_dir_entry_len(&diriter.fi));
864 		udf_fiiter_write_fi(&diriter, NULL);
865 		udf_fiiter_release(&diriter);
866 
867 		inode_dec_link_count(old_dir);
868 		if (new_inode)
869 			inode_dec_link_count(new_inode);
870 		else {
871 			inc_nlink(new_dir);
872 			mark_inode_dirty(new_dir);
873 		}
874 	}
875 	return 0;
876 out_oiter:
877 	if (has_diriter)
878 		udf_fiiter_release(&diriter);
879 	udf_fiiter_release(&oiter);
880 
881 	return retval;
882 }
883 
884 static struct dentry *udf_get_parent(struct dentry *child)
885 {
886 	struct kernel_lb_addr tloc;
887 	struct inode *inode = NULL;
888 	struct udf_fileident_iter iter;
889 	int err;
890 
891 	err = udf_fiiter_find_entry(d_inode(child), &dotdot_name, &iter);
892 	if (err)
893 		return ERR_PTR(err);
894 
895 	tloc = lelb_to_cpu(iter.fi.icb.extLocation);
896 	udf_fiiter_release(&iter);
897 	inode = udf_iget(child->d_sb, &tloc);
898 	if (IS_ERR(inode))
899 		return ERR_CAST(inode);
900 
901 	return d_obtain_alias(inode);
902 }
903 
904 
905 static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block,
906 					u16 partref, __u32 generation)
907 {
908 	struct inode *inode;
909 	struct kernel_lb_addr loc;
910 
911 	if (block == 0)
912 		return ERR_PTR(-ESTALE);
913 
914 	loc.logicalBlockNum = block;
915 	loc.partitionReferenceNum = partref;
916 	inode = udf_iget(sb, &loc);
917 
918 	if (IS_ERR(inode))
919 		return ERR_CAST(inode);
920 
921 	if (generation && inode->i_generation != generation) {
922 		iput(inode);
923 		return ERR_PTR(-ESTALE);
924 	}
925 	return d_obtain_alias(inode);
926 }
927 
928 static struct dentry *udf_fh_to_dentry(struct super_block *sb,
929 				       struct fid *fid, int fh_len, int fh_type)
930 {
931 	if (fh_len < 3 ||
932 	    (fh_type != FILEID_UDF_WITH_PARENT &&
933 	     fh_type != FILEID_UDF_WITHOUT_PARENT))
934 		return NULL;
935 
936 	return udf_nfs_get_inode(sb, fid->udf.block, fid->udf.partref,
937 			fid->udf.generation);
938 }
939 
940 static struct dentry *udf_fh_to_parent(struct super_block *sb,
941 				       struct fid *fid, int fh_len, int fh_type)
942 {
943 	if (fh_len < 5 || fh_type != FILEID_UDF_WITH_PARENT)
944 		return NULL;
945 
946 	return udf_nfs_get_inode(sb, fid->udf.parent_block,
947 				 fid->udf.parent_partref,
948 				 fid->udf.parent_generation);
949 }
950 static int udf_encode_fh(struct inode *inode, __u32 *fh, int *lenp,
951 			 struct inode *parent)
952 {
953 	int len = *lenp;
954 	struct kernel_lb_addr location = UDF_I(inode)->i_location;
955 	struct fid *fid = (struct fid *)fh;
956 	int type = FILEID_UDF_WITHOUT_PARENT;
957 
958 	if (parent && (len < 5)) {
959 		*lenp = 5;
960 		return FILEID_INVALID;
961 	} else if (len < 3) {
962 		*lenp = 3;
963 		return FILEID_INVALID;
964 	}
965 
966 	*lenp = 3;
967 	fid->udf.block = location.logicalBlockNum;
968 	fid->udf.partref = location.partitionReferenceNum;
969 	fid->udf.parent_partref = 0;
970 	fid->udf.generation = inode->i_generation;
971 
972 	if (parent) {
973 		location = UDF_I(parent)->i_location;
974 		fid->udf.parent_block = location.logicalBlockNum;
975 		fid->udf.parent_partref = location.partitionReferenceNum;
976 		fid->udf.parent_generation = inode->i_generation;
977 		*lenp = 5;
978 		type = FILEID_UDF_WITH_PARENT;
979 	}
980 
981 	return type;
982 }
983 
984 const struct export_operations udf_export_ops = {
985 	.encode_fh	= udf_encode_fh,
986 	.fh_to_dentry   = udf_fh_to_dentry,
987 	.fh_to_parent   = udf_fh_to_parent,
988 	.get_parent     = udf_get_parent,
989 };
990 
991 const struct inode_operations udf_dir_inode_operations = {
992 	.lookup				= udf_lookup,
993 	.create				= udf_create,
994 	.link				= udf_link,
995 	.unlink				= udf_unlink,
996 	.symlink			= udf_symlink,
997 	.mkdir				= udf_mkdir,
998 	.rmdir				= udf_rmdir,
999 	.mknod				= udf_mknod,
1000 	.rename				= udf_rename,
1001 	.tmpfile			= udf_tmpfile,
1002 };
1003