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