Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
[pandora-kernel.git] / fs / udf / namei.c
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
35 static inline int udf_match(int len1, const char *name1, int len2,
36                             const 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(tag);
49         uint16_t crc;
50         uint8_t checksum = 0;
51         int i;
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_ALLOCTYPE(inode) == 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, liu + offset);
72                 }
73         }
74
75         offset += liu;
76
77         if (fileident) {
78                 if (adinicb || (offset + lfi < 0)) {
79                         memcpy((uint8_t *)sfi->fileIdent + liu, fileident, lfi);
80                 } else if (offset >= 0) {
81                         memcpy(fibh->ebh->b_data + offset, fileident, lfi);
82                 } else {
83                         memcpy((uint8_t *)sfi->fileIdent + liu, fileident, -offset);
84                         memcpy(fibh->ebh->b_data, fileident - offset, lfi + offset);
85                 }
86         }
87
88         offset += lfi;
89
90         if (adinicb || (offset + padlen < 0)) {
91                 memset((uint8_t *)sfi->padding + liu + lfi, 0x00, padlen);
92         } else if (offset >= 0) {
93                 memset(fibh->ebh->b_data + offset, 0x00, padlen);
94         } else {
95                 memset((uint8_t *)sfi->padding + liu + lfi, 0x00, -offset);
96                 memset(fibh->ebh->b_data, 0x00, padlen + offset);
97         }
98
99         crc = udf_crc((uint8_t *)cfi + sizeof(tag),
100                       sizeof(struct fileIdentDesc) - sizeof(tag), 0);
101
102         if (fibh->sbh == fibh->ebh) {
103                 crc = udf_crc((uint8_t *)sfi->impUse,
104                               crclen + sizeof(tag) - sizeof(struct fileIdentDesc), crc);
105         } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) {
106                 crc = udf_crc(fibh->ebh->b_data + sizeof(struct fileIdentDesc) + fibh->soffset,
107                               crclen + sizeof(tag) - sizeof(struct fileIdentDesc), crc);
108         } else {
109                 crc = udf_crc((uint8_t *)sfi->impUse,
110                               -fibh->soffset - sizeof(struct fileIdentDesc), crc);
111                 crc = udf_crc(fibh->ebh->b_data, fibh->eoffset, crc);
112         }
113
114         cfi->descTag.descCRC = cpu_to_le16(crc);
115         cfi->descTag.descCRCLength = cpu_to_le16(crclen);
116
117         for (i = 0; i < 16; i++) {
118                 if (i != 4)
119                         checksum += ((uint8_t *)&cfi->descTag)[i];
120         }
121
122         cfi->descTag.tagChecksum = checksum;
123         if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) {
124                 memcpy((uint8_t *)sfi, (uint8_t *)cfi, sizeof(struct fileIdentDesc));
125         } else {
126                 memcpy((uint8_t *)sfi, (uint8_t *)cfi, -fibh->soffset);
127                 memcpy(fibh->ebh->b_data, (uint8_t *)cfi - fibh->soffset,
128                        sizeof(struct fileIdentDesc) + fibh->soffset);
129         }
130
131         if (adinicb) {
132                 mark_inode_dirty(inode);
133         } else {
134                 if (fibh->sbh != fibh->ebh)
135                         mark_buffer_dirty_inode(fibh->ebh, inode);
136                 mark_buffer_dirty_inode(fibh->sbh, inode);
137         }
138         return 0;
139 }
140
141 static struct fileIdentDesc *udf_find_entry(struct inode *dir,
142                                             struct dentry *dentry,
143                                             struct udf_fileident_bh *fibh,
144                                             struct fileIdentDesc *cfi)
145 {
146         struct fileIdentDesc *fi = NULL;
147         loff_t f_pos;
148         int block, flen;
149         char fname[UDF_NAME_LEN];
150         char *nameptr;
151         uint8_t lfi;
152         uint16_t liu;
153         loff_t size;
154         kernel_lb_addr eloc;
155         uint32_t elen;
156         sector_t offset;
157         struct extent_position epos = {};
158
159         size = (udf_ext0_offset(dir) + dir->i_size) >> 2;
160         f_pos = (udf_ext0_offset(dir) >> 2);
161
162         fibh->soffset = fibh->eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2;
163         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) {
164                 fibh->sbh = fibh->ebh = NULL;
165         } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2),
166                               &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) {
167                 block = udf_get_lb_pblock(dir->i_sb, eloc, offset);
168                 if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
169                         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT)
170                                 epos.offset -= sizeof(short_ad);
171                         else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG)
172                                 epos.offset -= sizeof(long_ad);
173                 } else {
174                         offset = 0;
175                 }
176
177                 if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block))) {
178                         brelse(epos.bh);
179                         return NULL;
180                 }
181         } else {
182                 brelse(epos.bh);
183                 return NULL;
184         }
185
186         while ((f_pos < size)) {
187                 fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
188                                         &elen, &offset);
189                 if (!fi) {
190                         if (fibh->sbh != fibh->ebh)
191                                 brelse(fibh->ebh);
192                         brelse(fibh->sbh);
193                         brelse(epos.bh);
194                         return NULL;
195                 }
196
197                 liu = le16_to_cpu(cfi->lengthOfImpUse);
198                 lfi = cfi->lengthFileIdent;
199
200                 if (fibh->sbh == fibh->ebh) {
201                         nameptr = fi->fileIdent + liu;
202                 } else {
203                         int poffset;    /* Unpaded ending offset */
204
205                         poffset = fibh->soffset + sizeof(struct fileIdentDesc) + liu + lfi;
206
207                         if (poffset >= lfi) {
208                                 nameptr = (uint8_t *)(fibh->ebh->b_data + poffset - lfi);
209                         } else {
210                                 nameptr = fname;
211                                 memcpy(nameptr, fi->fileIdent + liu, lfi - poffset);
212                                 memcpy(nameptr + lfi - poffset, fibh->ebh->b_data, poffset);
213                         }
214                 }
215
216                 if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
217                         if (!UDF_QUERY_FLAG(dir->i_sb, UDF_FLAG_UNDELETE))
218                                 continue;
219                 }
220
221                 if ((cfi->fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) {
222                         if (!UDF_QUERY_FLAG(dir->i_sb, UDF_FLAG_UNHIDE))
223                                 continue;
224                 }
225
226                 if (!lfi)
227                         continue;
228
229                 if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi))) {
230                         if (udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name)) {
231                                 brelse(epos.bh);
232                                 return fi;
233                         }
234                 }
235         }
236
237         if (fibh->sbh != fibh->ebh)
238                 brelse(fibh->ebh);
239         brelse(fibh->sbh);
240         brelse(epos.bh);
241
242         return NULL;
243 }
244
245 /*
246  * udf_lookup
247  *
248  * PURPOSE
249  *      Look-up the inode for a given name.
250  *
251  * DESCRIPTION
252  *      Required - lookup_dentry() will return -ENOTDIR if this routine is not
253  *      available for a directory. The filesystem is useless if this routine is
254  *      not available for at least the filesystem's root directory.
255  *
256  *      This routine is passed an incomplete dentry - it must be completed by
257  *      calling d_add(dentry, inode). If the name does not exist, then the
258  *      specified inode must be set to null. An error should only be returned
259  *      when the lookup fails for a reason other than the name not existing.
260  *      Note that the directory inode semaphore is held during the call.
261  *
262  *      Refer to lookup_dentry() in fs/namei.c
263  *      lookup_dentry() -> lookup() -> real_lookup() -> .
264  *
265  * PRE-CONDITIONS
266  *      dir                     Pointer to inode of parent directory.
267  *      dentry                  Pointer to dentry to complete.
268  *      nd                      Pointer to lookup nameidata
269  *
270  * POST-CONDITIONS
271  *      <return>                Zero on success.
272  *
273  * HISTORY
274  *      July 1, 1997 - Andrew E. Mileski
275  *      Written, tested, and released.
276  */
277
278 static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
279                                  struct nameidata *nd)
280 {
281         struct inode *inode = NULL;
282         struct fileIdentDesc cfi;
283         struct udf_fileident_bh fibh;
284
285         if (dentry->d_name.len > UDF_NAME_LEN - 2)
286                 return ERR_PTR(-ENAMETOOLONG);
287
288         lock_kernel();
289 #ifdef UDF_RECOVERY
290         /* temporary shorthand for specifying files by inode number */
291         if (!strncmp(dentry->d_name.name, ".B=", 3)) {
292                 kernel_lb_addr lb = {
293                         .logicalBlockNum = 0,
294                         .partitionReferenceNum = simple_strtoul(dentry->d_name.name + 3,
295                                                                 NULL, 0),
296                 };
297                 inode = udf_iget(dir->i_sb, lb);
298                 if (!inode) {
299                         unlock_kernel();
300                         return ERR_PTR(-EACCES);
301                 }
302         }
303         else
304 #endif /* UDF_RECOVERY */
305
306         if (udf_find_entry(dir, dentry, &fibh, &cfi)) {
307                 if (fibh.sbh != fibh.ebh)
308                         brelse(fibh.ebh);
309                 brelse(fibh.sbh);
310
311                 inode = udf_iget(dir->i_sb, lelb_to_cpu(cfi.icb.extLocation));
312                 if (!inode) {
313                         unlock_kernel();
314                         return ERR_PTR(-EACCES);
315                 }
316         }
317         unlock_kernel();
318         d_add(dentry, inode);
319
320         return NULL;
321 }
322
323 static struct fileIdentDesc *udf_add_entry(struct inode *dir,
324                                            struct dentry *dentry,
325                                            struct udf_fileident_bh *fibh,
326                                            struct fileIdentDesc *cfi, int *err)
327 {
328         struct super_block *sb;
329         struct fileIdentDesc *fi = NULL;
330         char name[UDF_NAME_LEN], fname[UDF_NAME_LEN];
331         int namelen;
332         loff_t f_pos;
333         int flen;
334         char *nameptr;
335         loff_t size = (udf_ext0_offset(dir) + dir->i_size) >> 2;
336         int nfidlen;
337         uint8_t lfi;
338         uint16_t liu;
339         int block;
340         kernel_lb_addr eloc;
341         uint32_t elen;
342         sector_t offset;
343         struct extent_position epos = {};
344
345         sb = dir->i_sb;
346
347         if (dentry) {
348                 if (!dentry->d_name.len) {
349                         *err = -EINVAL;
350                         return NULL;
351                 }
352                 if (!(namelen = udf_put_filename(sb, dentry->d_name.name, name,
353                                                  dentry->d_name.len))) {
354                         *err = -ENAMETOOLONG;
355                         return NULL;
356                 }
357         } else {
358                 namelen = 0;
359         }
360
361         nfidlen = (sizeof(struct fileIdentDesc) + namelen + 3) & ~3;
362
363         f_pos = (udf_ext0_offset(dir) >> 2);
364
365         fibh->soffset = fibh->eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2;
366         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) {
367                 fibh->sbh = fibh->ebh = NULL;
368         } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2),
369                               &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) {
370                 block = udf_get_lb_pblock(dir->i_sb, eloc, offset);
371                 if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
372                         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT)
373                                 epos.offset -= sizeof(short_ad);
374                         else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG)
375                                 epos.offset -= sizeof(long_ad);
376                 } else {
377                         offset = 0;
378                 }
379
380                 if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block))) {
381                         brelse(epos.bh);
382                         *err = -EIO;
383                         return NULL;
384                 }
385
386                 block = UDF_I_LOCATION(dir).logicalBlockNum;
387
388         } else {
389                 block = udf_get_lb_pblock(dir->i_sb, UDF_I_LOCATION(dir), 0);
390                 fibh->sbh = fibh->ebh = NULL;
391                 fibh->soffset = fibh->eoffset = sb->s_blocksize;
392                 goto add;
393         }
394
395         while ((f_pos < size)) {
396                 fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
397                                         &elen, &offset);
398
399                 if (!fi) {
400                         if (fibh->sbh != fibh->ebh)
401                                 brelse(fibh->ebh);
402                         brelse(fibh->sbh);
403                         brelse(epos.bh);
404                         *err = -EIO;
405                         return NULL;
406                 }
407
408                 liu = le16_to_cpu(cfi->lengthOfImpUse);
409                 lfi = cfi->lengthFileIdent;
410
411                 if (fibh->sbh == fibh->ebh) {
412                         nameptr = fi->fileIdent + liu;
413                 } else {
414                         int poffset;    /* Unpaded ending offset */
415
416                         poffset = fibh->soffset + sizeof(struct fileIdentDesc) + liu + lfi;
417
418                         if (poffset >= lfi) {
419                                 nameptr = (char *)(fibh->ebh->b_data + poffset - lfi);
420                         } else {
421                                 nameptr = fname;
422                                 memcpy(nameptr, fi->fileIdent + liu, lfi - poffset);
423                                 memcpy(nameptr + lfi - poffset, fibh->ebh->b_data, poffset);
424                         }
425                 }
426
427                 if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
428                         if (((sizeof(struct fileIdentDesc) + liu + lfi + 3) & ~3) == nfidlen) {
429                                 brelse(epos.bh);
430                                 cfi->descTag.tagSerialNum = cpu_to_le16(1);
431                                 cfi->fileVersionNum = cpu_to_le16(1);
432                                 cfi->fileCharacteristics = 0;
433                                 cfi->lengthFileIdent = namelen;
434                                 cfi->lengthOfImpUse = cpu_to_le16(0);
435                                 if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) {
436                                         return fi;
437                                 } else {
438                                         *err = -EIO;
439                                         return NULL;
440                                 }
441                         }
442                 }
443
444                 if (!lfi || !dentry)
445                         continue;
446
447                 if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi)) &&
448                     udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name)) {
449                         if (fibh->sbh != fibh->ebh)
450                                 brelse(fibh->ebh);
451                         brelse(fibh->sbh);
452                         brelse(epos.bh);
453                         *err = -EEXIST;
454                         return NULL;
455                 }
456         }
457
458 add:
459         f_pos += nfidlen;
460
461         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB &&
462             sb->s_blocksize - fibh->eoffset < nfidlen) {
463                 brelse(epos.bh);
464                 epos.bh = NULL;
465                 fibh->soffset -= udf_ext0_offset(dir);
466                 fibh->eoffset -= udf_ext0_offset(dir);
467                 f_pos -= (udf_ext0_offset(dir) >> 2);
468                 if (fibh->sbh != fibh->ebh)
469                         brelse(fibh->ebh);
470                 brelse(fibh->sbh);
471                 if (!(fibh->sbh = fibh->ebh = udf_expand_dir_adinicb(dir, &block, err)))
472                         return NULL;
473                 epos.block = UDF_I_LOCATION(dir);
474                 eloc.logicalBlockNum = block;
475                 eloc.partitionReferenceNum = UDF_I_LOCATION(dir).partitionReferenceNum;
476                 elen = dir->i_sb->s_blocksize;
477                 epos.offset = udf_file_entry_alloc_offset(dir);
478                 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT)
479                         epos.offset += sizeof(short_ad);
480                 else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG)
481                         epos.offset += sizeof(long_ad);
482         }
483
484         if (sb->s_blocksize - fibh->eoffset >= nfidlen) {
485                 fibh->soffset = fibh->eoffset;
486                 fibh->eoffset += nfidlen;
487                 if (fibh->sbh != fibh->ebh) {
488                         brelse(fibh->sbh);
489                         fibh->sbh = fibh->ebh;
490                 }
491
492                 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) {
493                         block = UDF_I_LOCATION(dir).logicalBlockNum;
494                         fi = (struct fileIdentDesc *)(UDF_I_DATA(dir) + fibh->soffset -
495                                                       udf_ext0_offset(dir) +
496                                                       UDF_I_LENEATTR(dir));
497                 } else {
498                         block = eloc.logicalBlockNum + ((elen - 1) >>
499                                                         dir->i_sb->s_blocksize_bits);
500                         fi = (struct fileIdentDesc *)(fibh->sbh->b_data + fibh->soffset);
501                 }
502         } else {
503                 fibh->soffset = fibh->eoffset - sb->s_blocksize;
504                 fibh->eoffset += nfidlen - sb->s_blocksize;
505                 if (fibh->sbh != fibh->ebh) {
506                         brelse(fibh->sbh);
507                         fibh->sbh = fibh->ebh;
508                 }
509
510                 block = eloc.logicalBlockNum + ((elen - 1) >>
511                                                 dir->i_sb->s_blocksize_bits);
512                 fibh->ebh = udf_bread(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), 1, err);
513                 if (!fibh->ebh) {
514                         brelse(epos.bh);
515                         brelse(fibh->sbh);
516                         return NULL;
517                 }
518
519                 if (!fibh->soffset) {
520                         if (udf_next_aext(dir, &epos, &eloc, &elen, 1) ==
521                             (EXT_RECORDED_ALLOCATED >> 30)) {
522                                 block = eloc.logicalBlockNum + ((elen - 1) >>
523                                         dir->i_sb->s_blocksize_bits);
524                         } else {
525                                 block++;
526                         }
527
528                         brelse(fibh->sbh);
529                         fibh->sbh = fibh->ebh;
530                         fi = (struct fileIdentDesc *)(fibh->sbh->b_data);
531                 } else {
532                         fi = (struct fileIdentDesc *)
533                                 (fibh->sbh->b_data + sb->s_blocksize + fibh->soffset);
534                 }
535         }
536
537         memset(cfi, 0, sizeof(struct fileIdentDesc));
538         if (UDF_SB_UDFREV(sb) >= 0x0200)
539                 udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, sizeof(tag));
540         else
541                 udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, sizeof(tag));
542         cfi->fileVersionNum = cpu_to_le16(1);
543         cfi->lengthFileIdent = namelen;
544         cfi->lengthOfImpUse = cpu_to_le16(0);
545         if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) {
546                 brelse(epos.bh);
547                 dir->i_size += nfidlen;
548                 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB)
549                         UDF_I_LENALLOC(dir) += nfidlen;
550                 mark_inode_dirty(dir);
551                 return fi;
552         } else {
553                 brelse(epos.bh);
554                 if (fibh->sbh != fibh->ebh)
555                         brelse(fibh->ebh);
556                 brelse(fibh->sbh);
557                 *err = -EIO;
558                 return NULL;
559         }
560 }
561
562 static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi,
563                             struct udf_fileident_bh *fibh,
564                             struct fileIdentDesc *cfi)
565 {
566         cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED;
567
568         if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
569                 memset(&(cfi->icb), 0x00, sizeof(long_ad));
570
571         return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL);
572 }
573
574 static int udf_create(struct inode *dir, struct dentry *dentry, int mode,
575                       struct nameidata *nd)
576 {
577         struct udf_fileident_bh fibh;
578         struct inode *inode;
579         struct fileIdentDesc cfi, *fi;
580         int err;
581
582         lock_kernel();
583         inode = udf_new_inode(dir, mode, &err);
584         if (!inode) {
585                 unlock_kernel();
586                 return err;
587         }
588
589         if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
590                 inode->i_data.a_ops = &udf_adinicb_aops;
591         else
592                 inode->i_data.a_ops = &udf_aops;
593         inode->i_op = &udf_file_inode_operations;
594         inode->i_fop = &udf_file_operations;
595         inode->i_mode = mode;
596         mark_inode_dirty(inode);
597
598         if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) {
599                 inode->i_nlink--;
600                 mark_inode_dirty(inode);
601                 iput(inode);
602                 unlock_kernel();
603                 return err;
604         }
605         cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
606         cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode));
607         *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
608                 cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL);
609         udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
610         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) {
611                 mark_inode_dirty(dir);
612         }
613         if (fibh.sbh != fibh.ebh)
614                 brelse(fibh.ebh);
615         brelse(fibh.sbh);
616         unlock_kernel();
617         d_instantiate(dentry, inode);
618
619         return 0;
620 }
621
622 static int udf_mknod(struct inode *dir, struct dentry *dentry, int mode,
623                      dev_t rdev)
624 {
625         struct inode *inode;
626         struct udf_fileident_bh fibh;
627         struct fileIdentDesc cfi, *fi;
628         int err;
629
630         if (!old_valid_dev(rdev))
631                 return -EINVAL;
632
633         lock_kernel();
634         err = -EIO;
635         inode = udf_new_inode(dir, mode, &err);
636         if (!inode)
637                 goto out;
638
639         inode->i_uid = current->fsuid;
640         init_special_inode(inode, mode, rdev);
641         if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) {
642                 inode->i_nlink--;
643                 mark_inode_dirty(inode);
644                 iput(inode);
645                 unlock_kernel();
646                 return err;
647         }
648         cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
649         cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode));
650         *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
651                 cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL);
652         udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
653         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) {
654                 mark_inode_dirty(dir);
655         }
656         mark_inode_dirty(inode);
657
658         if (fibh.sbh != fibh.ebh)
659                 brelse(fibh.ebh);
660         brelse(fibh.sbh);
661         d_instantiate(dentry, inode);
662         err = 0;
663
664 out:
665         unlock_kernel();
666         return err;
667 }
668
669 static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode)
670 {
671         struct inode *inode;
672         struct udf_fileident_bh fibh;
673         struct fileIdentDesc cfi, *fi;
674         int err;
675
676         lock_kernel();
677         err = -EMLINK;
678         if (dir->i_nlink >= (256 << sizeof(dir->i_nlink)) - 1)
679                 goto out;
680
681         err = -EIO;
682         inode = udf_new_inode(dir, S_IFDIR, &err);
683         if (!inode)
684                 goto out;
685
686         inode->i_op = &udf_dir_inode_operations;
687         inode->i_fop = &udf_dir_operations;
688         if (!(fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err))) {
689                 inode->i_nlink--;
690                 mark_inode_dirty(inode);
691                 iput(inode);
692                 goto out;
693         }
694         inode->i_nlink = 2;
695         cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
696         cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(dir));
697         *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
698                 cpu_to_le32(UDF_I_UNIQUE(dir) & 0x00000000FFFFFFFFUL);
699         cfi.fileCharacteristics = FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT;
700         udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL);
701         brelse(fibh.sbh);
702         inode->i_mode = S_IFDIR | mode;
703         if (dir->i_mode & S_ISGID)
704                 inode->i_mode |= S_ISGID;
705         mark_inode_dirty(inode);
706
707         if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) {
708                 inode->i_nlink = 0;
709                 mark_inode_dirty(inode);
710                 iput(inode);
711                 goto out;
712         }
713         cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
714         cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode));
715         *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
716                 cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL);
717         cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY;
718         udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
719         inc_nlink(dir);
720         mark_inode_dirty(dir);
721         d_instantiate(dentry, inode);
722         if (fibh.sbh != fibh.ebh)
723                 brelse(fibh.ebh);
724         brelse(fibh.sbh);
725         err = 0;
726
727 out:
728         unlock_kernel();
729         return err;
730 }
731
732 static int empty_dir(struct inode *dir)
733 {
734         struct fileIdentDesc *fi, cfi;
735         struct udf_fileident_bh fibh;
736         loff_t f_pos;
737         loff_t size = (udf_ext0_offset(dir) + dir->i_size) >> 2;
738         int block;
739         kernel_lb_addr eloc;
740         uint32_t elen;
741         sector_t offset;
742         struct extent_position epos = {};
743
744         f_pos = (udf_ext0_offset(dir) >> 2);
745
746         fibh.soffset = fibh.eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2;
747
748         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) {
749                 fibh.sbh = fibh.ebh = NULL;
750         } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2),
751                               &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) {
752                 block = udf_get_lb_pblock(dir->i_sb, eloc, offset);
753                 if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
754                         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT)
755                                 epos.offset -= sizeof(short_ad);
756                         else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG)
757                                 epos.offset -= sizeof(long_ad);
758                 } else {
759                         offset = 0;
760                 }
761
762                 if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block))) {
763                         brelse(epos.bh);
764                         return 0;
765                 }
766         } else {
767                 brelse(epos.bh);
768                 return 0;
769         }
770
771         while ((f_pos < size)) {
772                 fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc,
773                                         &elen, &offset);
774                 if (!fi) {
775                         if (fibh.sbh != fibh.ebh)
776                                 brelse(fibh.ebh);
777                         brelse(fibh.sbh);
778                         brelse(epos.bh);
779                         return 0;
780                 }
781
782                 if (cfi.lengthFileIdent &&
783                     (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) {
784                         if (fibh.sbh != fibh.ebh)
785                                 brelse(fibh.ebh);
786                         brelse(fibh.sbh);
787                         brelse(epos.bh);
788                         return 0;
789                 }
790         }
791
792         if (fibh.sbh != fibh.ebh)
793                 brelse(fibh.ebh);
794         brelse(fibh.sbh);
795         brelse(epos.bh);
796
797         return 1;
798 }
799
800 static int udf_rmdir(struct inode *dir, struct dentry *dentry)
801 {
802         int retval;
803         struct inode *inode = dentry->d_inode;
804         struct udf_fileident_bh fibh;
805         struct fileIdentDesc *fi, cfi;
806         kernel_lb_addr tloc;
807
808         retval = -ENOENT;
809         lock_kernel();
810         fi = udf_find_entry(dir, dentry, &fibh, &cfi);
811         if (!fi)
812                 goto out;
813
814         retval = -EIO;
815         tloc = lelb_to_cpu(cfi.icb.extLocation);
816         if (udf_get_lb_pblock(dir->i_sb, tloc, 0) != inode->i_ino)
817                 goto end_rmdir;
818         retval = -ENOTEMPTY;
819         if (!empty_dir(inode))
820                 goto end_rmdir;
821         retval = udf_delete_entry(dir, fi, &fibh, &cfi);
822         if (retval)
823                 goto end_rmdir;
824         if (inode->i_nlink != 2)
825                 udf_warning(inode->i_sb, "udf_rmdir",
826                             "empty directory has nlink != 2 (%d)",
827                             inode->i_nlink);
828         clear_nlink(inode);
829         inode->i_size = 0;
830         inode_dec_link_count(dir);
831         inode->i_ctime = dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb);
832         mark_inode_dirty(dir);
833
834 end_rmdir:
835         if (fibh.sbh != fibh.ebh)
836                 brelse(fibh.ebh);
837         brelse(fibh.sbh);
838
839 out:
840         unlock_kernel();
841         return retval;
842 }
843
844 static int udf_unlink(struct inode *dir, struct dentry *dentry)
845 {
846         int retval;
847         struct inode *inode = dentry->d_inode;
848         struct udf_fileident_bh fibh;
849         struct fileIdentDesc *fi;
850         struct fileIdentDesc cfi;
851         kernel_lb_addr tloc;
852
853         retval = -ENOENT;
854         lock_kernel();
855         fi = udf_find_entry(dir, dentry, &fibh, &cfi);
856         if (!fi)
857                 goto out;
858
859         retval = -EIO;
860         tloc = lelb_to_cpu(cfi.icb.extLocation);
861         if (udf_get_lb_pblock(dir->i_sb, tloc, 0) != inode->i_ino)
862                 goto end_unlink;
863
864         if (!inode->i_nlink) {
865                 udf_debug("Deleting nonexistent file (%lu), %d\n",
866                           inode->i_ino, inode->i_nlink);
867                 inode->i_nlink = 1;
868         }
869         retval = udf_delete_entry(dir, fi, &fibh, &cfi);
870         if (retval)
871                 goto end_unlink;
872         dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb);
873         mark_inode_dirty(dir);
874         inode_dec_link_count(inode);
875         inode->i_ctime = dir->i_ctime;
876         retval = 0;
877
878 end_unlink:
879         if (fibh.sbh != fibh.ebh)
880                 brelse(fibh.ebh);
881         brelse(fibh.sbh);
882
883 out:
884         unlock_kernel();
885         return retval;
886 }
887
888 static int udf_symlink(struct inode *dir, struct dentry *dentry,
889                        const char *symname)
890 {
891         struct inode *inode;
892         struct pathComponent *pc;
893         char *compstart;
894         struct udf_fileident_bh fibh;
895         struct extent_position epos = {};
896         int eoffset, elen = 0;
897         struct fileIdentDesc *fi;
898         struct fileIdentDesc cfi;
899         char *ea;
900         int err;
901         int block;
902         char name[UDF_NAME_LEN];
903         int namelen;
904
905         lock_kernel();
906         if (!(inode = udf_new_inode(dir, S_IFLNK, &err)))
907                 goto out;
908
909         inode->i_mode = S_IFLNK | S_IRWXUGO;
910         inode->i_data.a_ops = &udf_symlink_aops;
911         inode->i_op = &page_symlink_inode_operations;
912
913         if (UDF_I_ALLOCTYPE(inode) != ICBTAG_FLAG_AD_IN_ICB) {
914                 kernel_lb_addr eloc;
915                 uint32_t elen;
916
917                 block = udf_new_block(inode->i_sb, inode,
918                                       UDF_I_LOCATION(inode).partitionReferenceNum,
919                                       UDF_I_LOCATION(inode).logicalBlockNum, &err);
920                 if (!block)
921                         goto out_no_entry;
922                 epos.block = UDF_I_LOCATION(inode);
923                 epos.offset = udf_file_entry_alloc_offset(inode);
924                 epos.bh = NULL;
925                 eloc.logicalBlockNum = block;
926                 eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
927                 elen = inode->i_sb->s_blocksize;
928                 UDF_I_LENEXTENTS(inode) = elen;
929                 udf_add_aext(inode, &epos, eloc, elen, 0);
930                 brelse(epos.bh);
931
932                 block = udf_get_pblock(inode->i_sb, block,
933                                        UDF_I_LOCATION(inode).partitionReferenceNum, 0);
934                 epos.bh = udf_tread(inode->i_sb, block);
935                 lock_buffer(epos.bh);
936                 memset(epos.bh->b_data, 0x00, inode->i_sb->s_blocksize);
937                 set_buffer_uptodate(epos.bh);
938                 unlock_buffer(epos.bh);
939                 mark_buffer_dirty_inode(epos.bh, inode);
940                 ea = epos.bh->b_data + udf_ext0_offset(inode);
941         } else {
942                 ea = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode);
943         }
944
945         eoffset = inode->i_sb->s_blocksize - udf_ext0_offset(inode);
946         pc = (struct pathComponent *)ea;
947
948         if (*symname == '/') {
949                 do {
950                         symname++;
951                 } while (*symname == '/');
952
953                 pc->componentType = 1;
954                 pc->lengthComponentIdent = 0;
955                 pc->componentFileVersionNum = 0;
956                 pc += sizeof(struct pathComponent);
957                 elen += sizeof(struct pathComponent);
958         }
959
960         err = -ENAMETOOLONG;
961
962         while (*symname) {
963                 if (elen + sizeof(struct pathComponent) > eoffset)
964                         goto out_no_entry;
965
966                 pc = (struct pathComponent *)(ea + elen);
967
968                 compstart = (char *)symname;
969
970                 do {
971                         symname++;
972                 } while (*symname && *symname != '/');
973
974                 pc->componentType = 5;
975                 pc->lengthComponentIdent = 0;
976                 pc->componentFileVersionNum = 0;
977                 if (compstart[0] == '.') {
978                         if ((symname - compstart) == 1)
979                                 pc->componentType = 4;
980                         else if ((symname - compstart) == 2 && compstart[1] == '.')
981                                 pc->componentType = 3;
982                 }
983
984                 if (pc->componentType == 5) {
985                         namelen = udf_put_filename(inode->i_sb, compstart, name,
986                                                    symname - compstart);
987                         if (!namelen)
988                                 goto out_no_entry;
989
990                         if (elen + sizeof(struct pathComponent) + namelen > eoffset)
991                                 goto out_no_entry;
992                         else
993                                 pc->lengthComponentIdent = namelen;
994
995                         memcpy(pc->componentIdent, name, namelen);
996                 }
997
998                 elen += sizeof(struct pathComponent) + pc->lengthComponentIdent;
999
1000                 if (*symname) {
1001                         do {
1002                                 symname++;
1003                         } while (*symname == '/');
1004                 }
1005         }
1006
1007         brelse(epos.bh);
1008         inode->i_size = elen;
1009         if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
1010                 UDF_I_LENALLOC(inode) = inode->i_size;
1011         mark_inode_dirty(inode);
1012
1013         if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err)))
1014                 goto out_no_entry;
1015         cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
1016         cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode));
1017         if (UDF_SB_LVIDBH(inode->i_sb)) {
1018                 struct logicalVolHeaderDesc *lvhd;
1019                 uint64_t uniqueID;
1020                 lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)->logicalVolContentsUse);
1021                 uniqueID = le64_to_cpu(lvhd->uniqueID);
1022                 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
1023                         cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL);
1024                 if (!(++uniqueID & 0x00000000FFFFFFFFUL))
1025                         uniqueID += 16;
1026                 lvhd->uniqueID = cpu_to_le64(uniqueID);
1027                 mark_buffer_dirty(UDF_SB_LVIDBH(inode->i_sb));
1028         }
1029         udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
1030         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) {
1031                 mark_inode_dirty(dir);
1032         }
1033         if (fibh.sbh != fibh.ebh)
1034                 brelse(fibh.ebh);
1035         brelse(fibh.sbh);
1036         d_instantiate(dentry, inode);
1037         err = 0;
1038
1039 out:
1040         unlock_kernel();
1041         return err;
1042
1043 out_no_entry:
1044         inode_dec_link_count(inode);
1045         iput(inode);
1046         goto out;
1047 }
1048
1049 static int udf_link(struct dentry *old_dentry, struct inode *dir,
1050                     struct dentry *dentry)
1051 {
1052         struct inode *inode = old_dentry->d_inode;
1053         struct udf_fileident_bh fibh;
1054         struct fileIdentDesc cfi, *fi;
1055         int err;
1056
1057         lock_kernel();
1058         if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) {
1059                 unlock_kernel();
1060                 return -EMLINK;
1061         }
1062
1063         if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) {
1064                 unlock_kernel();
1065                 return err;
1066         }
1067         cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
1068         cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode));
1069         if (UDF_SB_LVIDBH(inode->i_sb)) {
1070                 struct logicalVolHeaderDesc *lvhd;
1071                 uint64_t uniqueID;
1072                 lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)->logicalVolContentsUse);
1073                 uniqueID = le64_to_cpu(lvhd->uniqueID);
1074                 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
1075                         cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL);
1076                 if (!(++uniqueID & 0x00000000FFFFFFFFUL))
1077                         uniqueID += 16;
1078                 lvhd->uniqueID = cpu_to_le64(uniqueID);
1079                 mark_buffer_dirty(UDF_SB_LVIDBH(inode->i_sb));
1080         }
1081         udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
1082         if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) {
1083                 mark_inode_dirty(dir);
1084         }
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, ocfi, ncfi;
1109         struct buffer_head *dir_bh = NULL;
1110         int retval = -ENOENT;
1111         kernel_lb_addr tloc;
1112
1113         lock_kernel();
1114         if ((ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi))) {
1115                 if (ofibh.sbh != ofibh.ebh)
1116                         brelse(ofibh.ebh);
1117                 brelse(ofibh.sbh);
1118         }
1119         tloc = lelb_to_cpu(ocfi.icb.extLocation);
1120         if (!ofi || udf_get_lb_pblock(old_dir->i_sb, tloc, 0)
1121             != old_inode->i_ino)
1122                 goto end_rename;
1123
1124         nfi = udf_find_entry(new_dir, new_dentry, &nfibh, &ncfi);
1125         if (nfi) {
1126                 if (!new_inode) {
1127                         if (nfibh.sbh != nfibh.ebh)
1128                                 brelse(nfibh.ebh);
1129                         brelse(nfibh.sbh);
1130                         nfi = NULL;
1131                 }
1132         }
1133         if (S_ISDIR(old_inode->i_mode)) {
1134                 uint32_t offset = udf_ext0_offset(old_inode);
1135
1136                 if (new_inode) {
1137                         retval = -ENOTEMPTY;
1138                         if (!empty_dir(new_inode))
1139                                 goto end_rename;
1140                 }
1141                 retval = -EIO;
1142                 if (UDF_I_ALLOCTYPE(old_inode) == ICBTAG_FLAG_AD_IN_ICB) {
1143                         dir_fi = udf_get_fileident(UDF_I_DATA(old_inode) -
1144                                                    (UDF_I_EFE(old_inode) ?
1145                                                     sizeof(struct extendedFileEntry) :
1146                                                     sizeof(struct fileEntry)),
1147                                                    old_inode->i_sb->s_blocksize, &offset);
1148                 } else {
1149                         dir_bh = udf_bread(old_inode, 0, 0, &retval);
1150                         if (!dir_bh)
1151                                 goto end_rename;
1152                         dir_fi = udf_get_fileident(dir_bh->b_data, old_inode->i_sb->s_blocksize, &offset);
1153                 }
1154                 if (!dir_fi)
1155                         goto end_rename;
1156                 tloc = lelb_to_cpu(dir_fi->icb.extLocation);
1157                 if (udf_get_lb_pblock(old_inode->i_sb, tloc, 0) != old_dir->i_ino)
1158                         goto end_rename;
1159
1160                 retval = -EMLINK;
1161                 if (!new_inode && new_dir->i_nlink >= (256 << sizeof(new_dir->i_nlink)) - 1)
1162                         goto end_rename;
1163         }
1164         if (!nfi) {
1165                 nfi = udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi, &retval);
1166                 if (!nfi)
1167                         goto end_rename;
1168         }
1169
1170         /*
1171          * Like most other Unix systems, set the ctime for inodes on a
1172          * rename.
1173          */
1174         old_inode->i_ctime = current_fs_time(old_inode->i_sb);
1175         mark_inode_dirty(old_inode);
1176
1177         /*
1178          * ok, that's it
1179          */
1180         ncfi.fileVersionNum = ocfi.fileVersionNum;
1181         ncfi.fileCharacteristics = ocfi.fileCharacteristics;
1182         memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(long_ad));
1183         udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL);
1184
1185         /* The old fid may have moved - find it again */
1186         ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi);
1187         udf_delete_entry(old_dir, ofi, &ofibh, &ocfi);
1188
1189         if (new_inode) {
1190                 new_inode->i_ctime = current_fs_time(new_inode->i_sb);
1191                 inode_dec_link_count(new_inode);
1192         }
1193         old_dir->i_ctime = old_dir->i_mtime = current_fs_time(old_dir->i_sb);
1194         mark_inode_dirty(old_dir);
1195
1196         if (dir_fi) {
1197                 dir_fi->icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(new_dir));
1198                 udf_update_tag((char *)dir_fi, (sizeof(struct fileIdentDesc) +
1199                                                 le16_to_cpu(dir_fi->lengthOfImpUse) + 3) & ~3);
1200                 if (UDF_I_ALLOCTYPE(old_inode) == ICBTAG_FLAG_AD_IN_ICB) {
1201                         mark_inode_dirty(old_inode);
1202                 } else {
1203                         mark_buffer_dirty_inode(dir_bh, old_inode);
1204                 }
1205                 inode_dec_link_count(old_dir);
1206                 if (new_inode) {
1207                         inode_dec_link_count(new_inode);
1208                 } else {
1209                         inc_nlink(new_dir);
1210                         mark_inode_dirty(new_dir);
1211                 }
1212         }
1213
1214         if (ofi) {
1215                 if (ofibh.sbh != ofibh.ebh)
1216                         brelse(ofibh.ebh);
1217                 brelse(ofibh.sbh);
1218         }
1219
1220         retval = 0;
1221
1222 end_rename:
1223         brelse(dir_bh);
1224         if (nfi) {
1225                 if (nfibh.sbh != nfibh.ebh)
1226                         brelse(nfibh.ebh);
1227                 brelse(nfibh.sbh);
1228         }
1229         unlock_kernel();
1230
1231         return retval;
1232 }
1233
1234 const struct inode_operations udf_dir_inode_operations = {
1235         .lookup                         = udf_lookup,
1236         .create                         = udf_create,
1237         .link                           = udf_link,
1238         .unlink                         = udf_unlink,
1239         .symlink                        = udf_symlink,
1240         .mkdir                          = udf_mkdir,
1241         .rmdir                          = udf_rmdir,
1242         .mknod                          = udf_mknod,
1243         .rename                         = udf_rename,
1244 };