namei.c 26 KB

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