namei.c 33 KB

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