namei.c 31 KB

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