dir.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. /*
  2. * fs/logfs/dir.c - directory-related code
  3. *
  4. * As should be obvious for Linux kernel code, license is GPLv2
  5. *
  6. * Copyright (c) 2005-2008 Joern Engel <joern@logfs.org>
  7. */
  8. #include "logfs.h"
  9. /*
  10. * Atomic dir operations
  11. *
  12. * Directory operations are by default not atomic. Dentries and Inodes are
  13. * created/removed/altered in seperate operations. Therefore we need to do
  14. * a small amount of journaling.
  15. *
  16. * Create, link, mkdir, mknod and symlink all share the same function to do
  17. * the work: __logfs_create. This function works in two atomic steps:
  18. * 1. allocate inode (remember in journal)
  19. * 2. allocate dentry (clear journal)
  20. *
  21. * As we can only get interrupted between the two, when the inode we just
  22. * created is simply stored in the anchor. On next mount, if we were
  23. * interrupted, we delete the inode. From a users point of view the
  24. * operation never happened.
  25. *
  26. * Unlink and rmdir also share the same function: unlink. Again, this
  27. * function works in two atomic steps
  28. * 1. remove dentry (remember inode in journal)
  29. * 2. unlink inode (clear journal)
  30. *
  31. * And again, on the next mount, if we were interrupted, we delete the inode.
  32. * From a users point of view the operation succeeded.
  33. *
  34. * Rename is the real pain to deal with, harder than all the other methods
  35. * combined. Depending on the circumstances we can run into three cases.
  36. * A "target rename" where the target dentry already existed, a "local
  37. * rename" where both parent directories are identical or a "cross-directory
  38. * rename" in the remaining case.
  39. *
  40. * Local rename is atomic, as the old dentry is simply rewritten with a new
  41. * name.
  42. *
  43. * Cross-directory rename works in two steps, similar to __logfs_create and
  44. * logfs_unlink:
  45. * 1. Write new dentry (remember old dentry in journal)
  46. * 2. Remove old dentry (clear journal)
  47. *
  48. * Here we remember a dentry instead of an inode. On next mount, if we were
  49. * interrupted, we delete the dentry. From a users point of view, the
  50. * operation succeeded.
  51. *
  52. * Target rename works in three atomic steps:
  53. * 1. Attach old inode to new dentry (remember old dentry and new inode)
  54. * 2. Remove old dentry (still remember the new inode)
  55. * 3. Remove victim inode
  56. *
  57. * Here we remember both an inode an a dentry. If we get interrupted
  58. * between steps 1 and 2, we delete both the dentry and the inode. If
  59. * we get interrupted between steps 2 and 3, we delete just the inode.
  60. * In either case, the remaining objects are deleted on next mount. From
  61. * a users point of view, the operation succeeded.
  62. */
  63. static int write_dir(struct inode *dir, struct logfs_disk_dentry *dd,
  64. loff_t pos)
  65. {
  66. return logfs_inode_write(dir, dd, sizeof(*dd), pos, WF_LOCK, NULL);
  67. }
  68. static int write_inode(struct inode *inode)
  69. {
  70. return __logfs_write_inode(inode, WF_LOCK);
  71. }
  72. static s64 dir_seek_data(struct inode *inode, s64 pos)
  73. {
  74. s64 new_pos = logfs_seek_data(inode, pos);
  75. return max(pos, new_pos - 1);
  76. }
  77. static int beyond_eof(struct inode *inode, loff_t bix)
  78. {
  79. loff_t pos = bix << inode->i_sb->s_blocksize_bits;
  80. return pos >= i_size_read(inode);
  81. }
  82. /*
  83. * Prime value was chosen to be roughly 256 + 26. r5 hash uses 11,
  84. * so short names (len <= 9) don't even occupy the complete 32bit name
  85. * space. A prime >256 ensures short names quickly spread the 32bit
  86. * name space. Add about 26 for the estimated amount of information
  87. * of each character and pick a prime nearby, preferrably a bit-sparse
  88. * one.
  89. */
  90. static u32 hash_32(const char *s, int len, u32 seed)
  91. {
  92. u32 hash = seed;
  93. int i;
  94. for (i = 0; i < len; i++)
  95. hash = hash * 293 + s[i];
  96. return hash;
  97. }
  98. /*
  99. * We have to satisfy several conflicting requirements here. Small
  100. * directories should stay fairly compact and not require too many
  101. * indirect blocks. The number of possible locations for a given hash
  102. * should be small to make lookup() fast. And we should try hard not
  103. * to overflow the 32bit name space or nfs and 32bit host systems will
  104. * be unhappy.
  105. *
  106. * So we use the following scheme. First we reduce the hash to 0..15
  107. * and try a direct block. If that is occupied we reduce the hash to
  108. * 16..255 and try an indirect block. Same for 2x and 3x indirect
  109. * blocks. Lastly we reduce the hash to 0x800_0000 .. 0xffff_ffff,
  110. * but use buckets containing eight entries instead of a single one.
  111. *
  112. * Using 16 entries should allow for a reasonable amount of hash
  113. * collisions, so the 32bit name space can be packed fairly tight
  114. * before overflowing. Oh and currently we don't overflow but return
  115. * and error.
  116. *
  117. * How likely are collisions? Doing the appropriate math is beyond me
  118. * and the Bronstein textbook. But running a test program to brute
  119. * force collisions for a couple of days showed that on average the
  120. * first collision occurs after 598M entries, with 290M being the
  121. * smallest result. Obviously 21 entries could already cause a
  122. * collision if all entries are carefully chosen.
  123. */
  124. static pgoff_t hash_index(u32 hash, int round)
  125. {
  126. u32 i0_blocks = I0_BLOCKS;
  127. u32 i1_blocks = I1_BLOCKS;
  128. u32 i2_blocks = I2_BLOCKS;
  129. u32 i3_blocks = I3_BLOCKS;
  130. switch (round) {
  131. case 0:
  132. return hash % i0_blocks;
  133. case 1:
  134. return i0_blocks + hash % (i1_blocks - i0_blocks);
  135. case 2:
  136. return i1_blocks + hash % (i2_blocks - i1_blocks);
  137. case 3:
  138. return i2_blocks + hash % (i3_blocks - i2_blocks);
  139. case 4 ... 19:
  140. return i3_blocks + 16 * (hash % (((1<<31) - i3_blocks) / 16))
  141. + round - 4;
  142. }
  143. BUG();
  144. }
  145. static struct page *logfs_get_dd_page(struct inode *dir, struct dentry *dentry)
  146. {
  147. struct qstr *name = &dentry->d_name;
  148. struct page *page;
  149. struct logfs_disk_dentry *dd;
  150. u32 hash = hash_32(name->name, name->len, 0);
  151. pgoff_t index;
  152. int round;
  153. if (name->len > LOGFS_MAX_NAMELEN)
  154. return ERR_PTR(-ENAMETOOLONG);
  155. for (round = 0; round < 20; round++) {
  156. index = hash_index(hash, round);
  157. if (beyond_eof(dir, index))
  158. return NULL;
  159. if (!logfs_exist_block(dir, index))
  160. continue;
  161. page = read_cache_page(dir->i_mapping, index,
  162. (filler_t *)logfs_readpage, NULL);
  163. if (IS_ERR(page))
  164. return page;
  165. dd = kmap_atomic(page, KM_USER0);
  166. BUG_ON(dd->namelen == 0);
  167. if (name->len != be16_to_cpu(dd->namelen) ||
  168. memcmp(name->name, dd->name, name->len)) {
  169. kunmap_atomic(dd, KM_USER0);
  170. page_cache_release(page);
  171. continue;
  172. }
  173. kunmap_atomic(dd, KM_USER0);
  174. return page;
  175. }
  176. return NULL;
  177. }
  178. static int logfs_remove_inode(struct inode *inode)
  179. {
  180. int ret;
  181. inode->i_nlink--;
  182. ret = write_inode(inode);
  183. LOGFS_BUG_ON(ret, inode->i_sb);
  184. return ret;
  185. }
  186. static void abort_transaction(struct inode *inode, struct logfs_transaction *ta)
  187. {
  188. if (logfs_inode(inode)->li_block)
  189. logfs_inode(inode)->li_block->ta = NULL;
  190. kfree(ta);
  191. }
  192. static int logfs_unlink(struct inode *dir, struct dentry *dentry)
  193. {
  194. struct logfs_super *super = logfs_super(dir->i_sb);
  195. struct inode *inode = dentry->d_inode;
  196. struct logfs_transaction *ta;
  197. struct page *page;
  198. pgoff_t index;
  199. int ret;
  200. ta = kzalloc(sizeof(*ta), GFP_KERNEL);
  201. if (!ta)
  202. return -ENOMEM;
  203. ta->state = UNLINK_1;
  204. ta->ino = inode->i_ino;
  205. inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
  206. page = logfs_get_dd_page(dir, dentry);
  207. if (!page) {
  208. kfree(ta);
  209. return -ENOENT;
  210. }
  211. if (IS_ERR(page)) {
  212. kfree(ta);
  213. return PTR_ERR(page);
  214. }
  215. index = page->index;
  216. page_cache_release(page);
  217. mutex_lock(&super->s_dirop_mutex);
  218. logfs_add_transaction(dir, ta);
  219. ret = logfs_delete(dir, index, NULL);
  220. if (!ret)
  221. ret = write_inode(dir);
  222. if (ret) {
  223. abort_transaction(dir, ta);
  224. printk(KERN_ERR"LOGFS: unable to delete inode\n");
  225. goto out;
  226. }
  227. ta->state = UNLINK_2;
  228. logfs_add_transaction(inode, ta);
  229. ret = logfs_remove_inode(inode);
  230. out:
  231. mutex_unlock(&super->s_dirop_mutex);
  232. return ret;
  233. }
  234. static inline int logfs_empty_dir(struct inode *dir)
  235. {
  236. u64 data;
  237. data = logfs_seek_data(dir, 0) << dir->i_sb->s_blocksize_bits;
  238. return data >= i_size_read(dir);
  239. }
  240. static int logfs_rmdir(struct inode *dir, struct dentry *dentry)
  241. {
  242. struct inode *inode = dentry->d_inode;
  243. if (!logfs_empty_dir(inode))
  244. return -ENOTEMPTY;
  245. return logfs_unlink(dir, dentry);
  246. }
  247. /* FIXME: readdir currently has it's own dir_walk code. I don't see a good
  248. * way to combine the two copies */
  249. #define IMPLICIT_NODES 2
  250. static int __logfs_readdir(struct file *file, void *buf, filldir_t filldir)
  251. {
  252. struct inode *dir = file->f_dentry->d_inode;
  253. loff_t pos = file->f_pos - IMPLICIT_NODES;
  254. struct page *page;
  255. struct logfs_disk_dentry *dd;
  256. int full;
  257. BUG_ON(pos < 0);
  258. for (;; pos++) {
  259. if (beyond_eof(dir, pos))
  260. break;
  261. if (!logfs_exist_block(dir, pos)) {
  262. /* deleted dentry */
  263. pos = dir_seek_data(dir, pos);
  264. continue;
  265. }
  266. page = read_cache_page(dir->i_mapping, pos,
  267. (filler_t *)logfs_readpage, NULL);
  268. if (IS_ERR(page))
  269. return PTR_ERR(page);
  270. dd = kmap_atomic(page, KM_USER0);
  271. BUG_ON(dd->namelen == 0);
  272. full = filldir(buf, (char *)dd->name, be16_to_cpu(dd->namelen),
  273. pos, be64_to_cpu(dd->ino), dd->type);
  274. kunmap_atomic(dd, KM_USER0);
  275. page_cache_release(page);
  276. if (full)
  277. break;
  278. }
  279. file->f_pos = pos + IMPLICIT_NODES;
  280. return 0;
  281. }
  282. static int logfs_readdir(struct file *file, void *buf, filldir_t filldir)
  283. {
  284. struct inode *inode = file->f_dentry->d_inode;
  285. ino_t pino = parent_ino(file->f_dentry);
  286. int err;
  287. if (file->f_pos < 0)
  288. return -EINVAL;
  289. if (file->f_pos == 0) {
  290. if (filldir(buf, ".", 1, 1, inode->i_ino, DT_DIR) < 0)
  291. return 0;
  292. file->f_pos++;
  293. }
  294. if (file->f_pos == 1) {
  295. if (filldir(buf, "..", 2, 2, pino, DT_DIR) < 0)
  296. return 0;
  297. file->f_pos++;
  298. }
  299. err = __logfs_readdir(file, buf, filldir);
  300. return err;
  301. }
  302. static void logfs_set_name(struct logfs_disk_dentry *dd, struct qstr *name)
  303. {
  304. dd->namelen = cpu_to_be16(name->len);
  305. memcpy(dd->name, name->name, name->len);
  306. }
  307. static struct dentry *logfs_lookup(struct inode *dir, struct dentry *dentry,
  308. struct nameidata *nd)
  309. {
  310. struct page *page;
  311. struct logfs_disk_dentry *dd;
  312. pgoff_t index;
  313. u64 ino = 0;
  314. struct inode *inode;
  315. page = logfs_get_dd_page(dir, dentry);
  316. if (IS_ERR(page))
  317. return ERR_CAST(page);
  318. if (!page) {
  319. d_add(dentry, NULL);
  320. return NULL;
  321. }
  322. index = page->index;
  323. dd = kmap_atomic(page, KM_USER0);
  324. ino = be64_to_cpu(dd->ino);
  325. kunmap_atomic(dd, KM_USER0);
  326. page_cache_release(page);
  327. inode = logfs_iget(dir->i_sb, ino);
  328. if (IS_ERR(inode)) {
  329. printk(KERN_ERR"LogFS: Cannot read inode #%llx for dentry (%lx, %lx)n",
  330. ino, dir->i_ino, index);
  331. return ERR_CAST(inode);
  332. }
  333. return d_splice_alias(inode, dentry);
  334. }
  335. static void grow_dir(struct inode *dir, loff_t index)
  336. {
  337. index = (index + 1) << dir->i_sb->s_blocksize_bits;
  338. if (i_size_read(dir) < index)
  339. i_size_write(dir, index);
  340. }
  341. static int logfs_write_dir(struct inode *dir, struct dentry *dentry,
  342. struct inode *inode)
  343. {
  344. struct page *page;
  345. struct logfs_disk_dentry *dd;
  346. u32 hash = hash_32(dentry->d_name.name, dentry->d_name.len, 0);
  347. pgoff_t index;
  348. int round, err;
  349. for (round = 0; round < 20; round++) {
  350. index = hash_index(hash, round);
  351. if (logfs_exist_block(dir, index))
  352. continue;
  353. page = find_or_create_page(dir->i_mapping, index, GFP_KERNEL);
  354. if (!page)
  355. return -ENOMEM;
  356. dd = kmap_atomic(page, KM_USER0);
  357. memset(dd, 0, sizeof(*dd));
  358. dd->ino = cpu_to_be64(inode->i_ino);
  359. dd->type = logfs_type(inode);
  360. logfs_set_name(dd, &dentry->d_name);
  361. kunmap_atomic(dd, KM_USER0);
  362. err = logfs_write_buf(dir, page, WF_LOCK);
  363. unlock_page(page);
  364. page_cache_release(page);
  365. if (!err)
  366. grow_dir(dir, index);
  367. return err;
  368. }
  369. /* FIXME: Is there a better return value? In most cases neither
  370. * the filesystem nor the directory are full. But we have had
  371. * too many collisions for this particular hash and no fallback.
  372. */
  373. return -ENOSPC;
  374. }
  375. static int __logfs_create(struct inode *dir, struct dentry *dentry,
  376. struct inode *inode, const char *dest, long destlen)
  377. {
  378. struct logfs_super *super = logfs_super(dir->i_sb);
  379. struct logfs_inode *li = logfs_inode(inode);
  380. struct logfs_transaction *ta;
  381. int ret;
  382. ta = kzalloc(sizeof(*ta), GFP_KERNEL);
  383. if (!ta)
  384. return -ENOMEM;
  385. ta->state = CREATE_1;
  386. ta->ino = inode->i_ino;
  387. mutex_lock(&super->s_dirop_mutex);
  388. logfs_add_transaction(inode, ta);
  389. if (dest) {
  390. /* symlink */
  391. ret = logfs_inode_write(inode, dest, destlen, 0, WF_LOCK, NULL);
  392. if (!ret)
  393. ret = write_inode(inode);
  394. } else {
  395. /* creat/mkdir/mknod */
  396. ret = write_inode(inode);
  397. }
  398. if (ret) {
  399. abort_transaction(inode, ta);
  400. li->li_flags |= LOGFS_IF_STILLBORN;
  401. /* FIXME: truncate symlink */
  402. inode->i_nlink--;
  403. iput(inode);
  404. goto out;
  405. }
  406. ta->state = CREATE_2;
  407. logfs_add_transaction(dir, ta);
  408. ret = logfs_write_dir(dir, dentry, inode);
  409. /* sync directory */
  410. if (!ret)
  411. ret = write_inode(dir);
  412. if (ret) {
  413. logfs_del_transaction(dir, ta);
  414. ta->state = CREATE_2;
  415. logfs_add_transaction(inode, ta);
  416. logfs_remove_inode(inode);
  417. iput(inode);
  418. goto out;
  419. }
  420. d_instantiate(dentry, inode);
  421. out:
  422. mutex_unlock(&super->s_dirop_mutex);
  423. return ret;
  424. }
  425. static int logfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
  426. {
  427. struct inode *inode;
  428. /*
  429. * FIXME: why do we have to fill in S_IFDIR, while the mode is
  430. * correct for mknod, creat, etc.? Smells like the vfs *should*
  431. * do it for us but for some reason fails to do so.
  432. */
  433. inode = logfs_new_inode(dir, S_IFDIR | mode);
  434. if (IS_ERR(inode))
  435. return PTR_ERR(inode);
  436. inode->i_op = &logfs_dir_iops;
  437. inode->i_fop = &logfs_dir_fops;
  438. return __logfs_create(dir, dentry, inode, NULL, 0);
  439. }
  440. static int logfs_create(struct inode *dir, struct dentry *dentry, int mode,
  441. struct nameidata *nd)
  442. {
  443. struct inode *inode;
  444. inode = logfs_new_inode(dir, mode);
  445. if (IS_ERR(inode))
  446. return PTR_ERR(inode);
  447. inode->i_op = &logfs_reg_iops;
  448. inode->i_fop = &logfs_reg_fops;
  449. inode->i_mapping->a_ops = &logfs_reg_aops;
  450. return __logfs_create(dir, dentry, inode, NULL, 0);
  451. }
  452. static int logfs_mknod(struct inode *dir, struct dentry *dentry, int mode,
  453. dev_t rdev)
  454. {
  455. struct inode *inode;
  456. if (dentry->d_name.len > LOGFS_MAX_NAMELEN)
  457. return -ENAMETOOLONG;
  458. inode = logfs_new_inode(dir, mode);
  459. if (IS_ERR(inode))
  460. return PTR_ERR(inode);
  461. init_special_inode(inode, mode, rdev);
  462. return __logfs_create(dir, dentry, inode, NULL, 0);
  463. }
  464. static int logfs_symlink(struct inode *dir, struct dentry *dentry,
  465. const char *target)
  466. {
  467. struct inode *inode;
  468. size_t destlen = strlen(target) + 1;
  469. if (destlen > dir->i_sb->s_blocksize)
  470. return -ENAMETOOLONG;
  471. inode = logfs_new_inode(dir, S_IFLNK | 0777);
  472. if (IS_ERR(inode))
  473. return PTR_ERR(inode);
  474. inode->i_op = &logfs_symlink_iops;
  475. inode->i_mapping->a_ops = &logfs_reg_aops;
  476. return __logfs_create(dir, dentry, inode, target, destlen);
  477. }
  478. static int logfs_permission(struct inode *inode, int mask)
  479. {
  480. return generic_permission(inode, mask, NULL);
  481. }
  482. static int logfs_link(struct dentry *old_dentry, struct inode *dir,
  483. struct dentry *dentry)
  484. {
  485. struct inode *inode = old_dentry->d_inode;
  486. if (inode->i_nlink >= LOGFS_LINK_MAX)
  487. return -EMLINK;
  488. inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
  489. atomic_inc(&inode->i_count);
  490. inode->i_nlink++;
  491. mark_inode_dirty_sync(inode);
  492. return __logfs_create(dir, dentry, inode, NULL, 0);
  493. }
  494. static int logfs_get_dd(struct inode *dir, struct dentry *dentry,
  495. struct logfs_disk_dentry *dd, loff_t *pos)
  496. {
  497. struct page *page;
  498. void *map;
  499. page = logfs_get_dd_page(dir, dentry);
  500. if (IS_ERR(page))
  501. return PTR_ERR(page);
  502. *pos = page->index;
  503. map = kmap_atomic(page, KM_USER0);
  504. memcpy(dd, map, sizeof(*dd));
  505. kunmap_atomic(map, KM_USER0);
  506. page_cache_release(page);
  507. return 0;
  508. }
  509. static int logfs_delete_dd(struct inode *dir, loff_t pos)
  510. {
  511. /*
  512. * Getting called with pos somewhere beyond eof is either a goofup
  513. * within this file or means someone maliciously edited the
  514. * (crc-protected) journal.
  515. */
  516. BUG_ON(beyond_eof(dir, pos));
  517. dir->i_ctime = dir->i_mtime = CURRENT_TIME;
  518. log_dir(" Delete dentry (%lx, %llx)\n", dir->i_ino, pos);
  519. return logfs_delete(dir, pos, NULL);
  520. }
  521. /*
  522. * Cross-directory rename, target does not exist. Just a little nasty.
  523. * Create a new dentry in the target dir, then remove the old dentry,
  524. * all the while taking care to remember our operation in the journal.
  525. */
  526. static int logfs_rename_cross(struct inode *old_dir, struct dentry *old_dentry,
  527. struct inode *new_dir, struct dentry *new_dentry)
  528. {
  529. struct logfs_super *super = logfs_super(old_dir->i_sb);
  530. struct logfs_disk_dentry dd;
  531. struct logfs_transaction *ta;
  532. loff_t pos;
  533. int err;
  534. /* 1. locate source dd */
  535. err = logfs_get_dd(old_dir, old_dentry, &dd, &pos);
  536. if (err)
  537. return err;
  538. ta = kzalloc(sizeof(*ta), GFP_KERNEL);
  539. if (!ta)
  540. return -ENOMEM;
  541. ta->state = CROSS_RENAME_1;
  542. ta->dir = old_dir->i_ino;
  543. ta->pos = pos;
  544. /* 2. write target dd */
  545. mutex_lock(&super->s_dirop_mutex);
  546. logfs_add_transaction(new_dir, ta);
  547. err = logfs_write_dir(new_dir, new_dentry, old_dentry->d_inode);
  548. if (!err)
  549. err = write_inode(new_dir);
  550. if (err) {
  551. super->s_rename_dir = 0;
  552. super->s_rename_pos = 0;
  553. abort_transaction(new_dir, ta);
  554. goto out;
  555. }
  556. /* 3. remove source dd */
  557. ta->state = CROSS_RENAME_2;
  558. logfs_add_transaction(old_dir, ta);
  559. err = logfs_delete_dd(old_dir, pos);
  560. if (!err)
  561. err = write_inode(old_dir);
  562. LOGFS_BUG_ON(err, old_dir->i_sb);
  563. out:
  564. mutex_unlock(&super->s_dirop_mutex);
  565. return err;
  566. }
  567. static int logfs_replace_inode(struct inode *dir, struct dentry *dentry,
  568. struct logfs_disk_dentry *dd, struct inode *inode)
  569. {
  570. loff_t pos;
  571. int err;
  572. err = logfs_get_dd(dir, dentry, dd, &pos);
  573. if (err)
  574. return err;
  575. dd->ino = cpu_to_be64(inode->i_ino);
  576. dd->type = logfs_type(inode);
  577. err = write_dir(dir, dd, pos);
  578. if (err)
  579. return err;
  580. log_dir("Replace dentry (%lx, %llx) %s -> %llx\n", dir->i_ino, pos,
  581. dd->name, be64_to_cpu(dd->ino));
  582. return write_inode(dir);
  583. }
  584. /* Target dentry exists - the worst case. We need to attach the source
  585. * inode to the target dentry, then remove the orphaned target inode and
  586. * source dentry.
  587. */
  588. static int logfs_rename_target(struct inode *old_dir, struct dentry *old_dentry,
  589. struct inode *new_dir, struct dentry *new_dentry)
  590. {
  591. struct logfs_super *super = logfs_super(old_dir->i_sb);
  592. struct inode *old_inode = old_dentry->d_inode;
  593. struct inode *new_inode = new_dentry->d_inode;
  594. int isdir = S_ISDIR(old_inode->i_mode);
  595. struct logfs_disk_dentry dd;
  596. struct logfs_transaction *ta;
  597. loff_t pos;
  598. int err;
  599. BUG_ON(isdir != S_ISDIR(new_inode->i_mode));
  600. if (isdir) {
  601. if (!logfs_empty_dir(new_inode))
  602. return -ENOTEMPTY;
  603. }
  604. /* 1. locate source dd */
  605. err = logfs_get_dd(old_dir, old_dentry, &dd, &pos);
  606. if (err)
  607. return err;
  608. ta = kzalloc(sizeof(*ta), GFP_KERNEL);
  609. if (!ta)
  610. return -ENOMEM;
  611. ta->state = TARGET_RENAME_1;
  612. ta->dir = old_dir->i_ino;
  613. ta->pos = pos;
  614. ta->ino = new_inode->i_ino;
  615. /* 2. attach source inode to target dd */
  616. mutex_lock(&super->s_dirop_mutex);
  617. logfs_add_transaction(new_dir, ta);
  618. err = logfs_replace_inode(new_dir, new_dentry, &dd, old_inode);
  619. if (err) {
  620. super->s_rename_dir = 0;
  621. super->s_rename_pos = 0;
  622. super->s_victim_ino = 0;
  623. abort_transaction(new_dir, ta);
  624. goto out;
  625. }
  626. /* 3. remove source dd */
  627. ta->state = TARGET_RENAME_2;
  628. logfs_add_transaction(old_dir, ta);
  629. err = logfs_delete_dd(old_dir, pos);
  630. if (!err)
  631. err = write_inode(old_dir);
  632. LOGFS_BUG_ON(err, old_dir->i_sb);
  633. /* 4. remove target inode */
  634. ta->state = TARGET_RENAME_3;
  635. logfs_add_transaction(new_inode, ta);
  636. err = logfs_remove_inode(new_inode);
  637. out:
  638. mutex_unlock(&super->s_dirop_mutex);
  639. return err;
  640. }
  641. static int logfs_rename(struct inode *old_dir, struct dentry *old_dentry,
  642. struct inode *new_dir, struct dentry *new_dentry)
  643. {
  644. if (new_dentry->d_inode)
  645. return logfs_rename_target(old_dir, old_dentry,
  646. new_dir, new_dentry);
  647. return logfs_rename_cross(old_dir, old_dentry, new_dir, new_dentry);
  648. }
  649. /* No locking done here, as this is called before .get_sb() returns. */
  650. int logfs_replay_journal(struct super_block *sb)
  651. {
  652. struct logfs_super *super = logfs_super(sb);
  653. struct inode *inode;
  654. u64 ino, pos;
  655. int err;
  656. if (super->s_victim_ino) {
  657. /* delete victim inode */
  658. ino = super->s_victim_ino;
  659. printk(KERN_INFO"LogFS: delete unmapped inode #%llx\n", ino);
  660. inode = logfs_iget(sb, ino);
  661. if (IS_ERR(inode))
  662. goto fail;
  663. LOGFS_BUG_ON(i_size_read(inode) > 0, sb);
  664. super->s_victim_ino = 0;
  665. err = logfs_remove_inode(inode);
  666. iput(inode);
  667. if (err) {
  668. super->s_victim_ino = ino;
  669. goto fail;
  670. }
  671. }
  672. if (super->s_rename_dir) {
  673. /* delete old dd from rename */
  674. ino = super->s_rename_dir;
  675. pos = super->s_rename_pos;
  676. printk(KERN_INFO"LogFS: delete unbacked dentry (%llx, %llx)\n",
  677. ino, pos);
  678. inode = logfs_iget(sb, ino);
  679. if (IS_ERR(inode))
  680. goto fail;
  681. super->s_rename_dir = 0;
  682. super->s_rename_pos = 0;
  683. err = logfs_delete_dd(inode, pos);
  684. iput(inode);
  685. if (err) {
  686. super->s_rename_dir = ino;
  687. super->s_rename_pos = pos;
  688. goto fail;
  689. }
  690. }
  691. return 0;
  692. fail:
  693. LOGFS_BUG(sb);
  694. return -EIO;
  695. }
  696. const struct inode_operations logfs_symlink_iops = {
  697. .readlink = generic_readlink,
  698. .follow_link = page_follow_link_light,
  699. };
  700. const struct inode_operations logfs_dir_iops = {
  701. .create = logfs_create,
  702. .link = logfs_link,
  703. .lookup = logfs_lookup,
  704. .mkdir = logfs_mkdir,
  705. .mknod = logfs_mknod,
  706. .rename = logfs_rename,
  707. .rmdir = logfs_rmdir,
  708. .permission = logfs_permission,
  709. .symlink = logfs_symlink,
  710. .unlink = logfs_unlink,
  711. };
  712. const struct file_operations logfs_dir_fops = {
  713. .fsync = logfs_fsync,
  714. .ioctl = logfs_ioctl,
  715. .readdir = logfs_readdir,
  716. .read = generic_read_dir,
  717. };