disk-io.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. #include <linux/module.h>
  2. #include <linux/fs.h>
  3. #include <linux/blkdev.h>
  4. #include <linux/crypto.h>
  5. #include <linux/scatterlist.h>
  6. #include <linux/swap.h>
  7. #include <linux/radix-tree.h>
  8. #include "ctree.h"
  9. #include "disk-io.h"
  10. #include "transaction.h"
  11. #include "btrfs_inode.h"
  12. struct dev_lookup {
  13. u64 block_start;
  14. u64 num_blocks;
  15. u64 device_id;
  16. struct block_device *bdev;
  17. };
  18. int btrfs_insert_dev_radix(struct btrfs_root *root,
  19. struct block_device *bdev,
  20. u64 device_id,
  21. u64 block_start,
  22. u64 num_blocks)
  23. {
  24. struct dev_lookup *lookup;
  25. char b[BDEVNAME_SIZE];
  26. int ret;
  27. lookup = kmalloc(sizeof(*lookup), GFP_NOFS);
  28. if (!lookup)
  29. return -ENOMEM;
  30. lookup->block_start = block_start;
  31. lookup->num_blocks = num_blocks;
  32. lookup->bdev = bdev;
  33. lookup->device_id = device_id;
  34. printk("inserting %s into dev radix %Lu %Lu\n", bdevname(bdev, b), block_start, num_blocks);
  35. ret = radix_tree_insert(&root->fs_info->dev_radix, block_start +
  36. num_blocks - 1, lookup);
  37. return ret;
  38. }
  39. u64 bh_blocknr(struct buffer_head *bh)
  40. {
  41. int blkbits = bh->b_page->mapping->host->i_blkbits;
  42. u64 blocknr = bh->b_page->index << (PAGE_CACHE_SHIFT - blkbits);
  43. unsigned long offset;
  44. if (PageHighMem(bh->b_page))
  45. offset = (unsigned long)bh->b_data;
  46. else
  47. offset = bh->b_data - (char *)page_address(bh->b_page);
  48. blocknr += offset >> (PAGE_CACHE_SHIFT - blkbits);
  49. return blocknr;
  50. }
  51. static int check_tree_block(struct btrfs_root *root, struct buffer_head *buf)
  52. {
  53. struct btrfs_node *node = btrfs_buffer_node(buf);
  54. if (bh_blocknr(buf) != btrfs_header_blocknr(&node->header)) {
  55. printk(KERN_CRIT "bh_blocknr(buf) is %Lu, header is %Lu\n",
  56. bh_blocknr(buf), btrfs_header_blocknr(&node->header));
  57. BUG();
  58. }
  59. return 0;
  60. }
  61. struct buffer_head *btrfs_find_tree_block(struct btrfs_root *root, u64 blocknr)
  62. {
  63. struct address_space *mapping = root->fs_info->btree_inode->i_mapping;
  64. int blockbits = root->fs_info->sb->s_blocksize_bits;
  65. unsigned long index = blocknr >> (PAGE_CACHE_SHIFT - blockbits);
  66. struct page *page;
  67. struct buffer_head *bh;
  68. struct buffer_head *head;
  69. struct buffer_head *ret = NULL;
  70. page = find_lock_page(mapping, index);
  71. if (!page)
  72. return NULL;
  73. if (!page_has_buffers(page))
  74. goto out_unlock;
  75. head = page_buffers(page);
  76. bh = head;
  77. do {
  78. if (buffer_mapped(bh) && bh_blocknr(bh) == blocknr) {
  79. ret = bh;
  80. get_bh(bh);
  81. goto out_unlock;
  82. }
  83. bh = bh->b_this_page;
  84. } while (bh != head);
  85. out_unlock:
  86. unlock_page(page);
  87. if (ret) {
  88. touch_buffer(ret);
  89. }
  90. page_cache_release(page);
  91. return ret;
  92. }
  93. int btrfs_map_bh_to_logical(struct btrfs_root *root, struct buffer_head *bh,
  94. u64 logical)
  95. {
  96. struct dev_lookup *lookup[2];
  97. int ret;
  98. root = root->fs_info->dev_root;
  99. ret = radix_tree_gang_lookup(&root->fs_info->dev_radix,
  100. (void **)lookup,
  101. (unsigned long)logical,
  102. ARRAY_SIZE(lookup));
  103. if (ret == 0 || lookup[0]->block_start > logical ||
  104. lookup[0]->block_start + lookup[0]->num_blocks <= logical) {
  105. ret = -ENOENT;
  106. goto out;
  107. }
  108. bh->b_bdev = lookup[0]->bdev;
  109. bh->b_blocknr = logical - lookup[0]->block_start;
  110. set_buffer_mapped(bh);
  111. ret = 0;
  112. out:
  113. return ret;
  114. }
  115. struct buffer_head *btrfs_find_create_tree_block(struct btrfs_root *root,
  116. u64 blocknr)
  117. {
  118. struct address_space *mapping = root->fs_info->btree_inode->i_mapping;
  119. int blockbits = root->fs_info->sb->s_blocksize_bits;
  120. unsigned long index = blocknr >> (PAGE_CACHE_SHIFT - blockbits);
  121. struct page *page;
  122. struct buffer_head *bh;
  123. struct buffer_head *head;
  124. struct buffer_head *ret = NULL;
  125. int err;
  126. u64 first_block = index << (PAGE_CACHE_SHIFT - blockbits);
  127. page = grab_cache_page(mapping, index);
  128. if (!page)
  129. return NULL;
  130. if (!page_has_buffers(page))
  131. create_empty_buffers(page, root->fs_info->sb->s_blocksize, 0);
  132. head = page_buffers(page);
  133. bh = head;
  134. do {
  135. if (!buffer_mapped(bh)) {
  136. err = btrfs_map_bh_to_logical(root, bh, first_block);
  137. BUG_ON(err);
  138. }
  139. if (bh_blocknr(bh) == blocknr) {
  140. ret = bh;
  141. get_bh(bh);
  142. goto out_unlock;
  143. }
  144. bh = bh->b_this_page;
  145. first_block++;
  146. } while (bh != head);
  147. out_unlock:
  148. unlock_page(page);
  149. if (ret)
  150. touch_buffer(ret);
  151. page_cache_release(page);
  152. return ret;
  153. }
  154. static int btree_get_block(struct inode *inode, sector_t iblock,
  155. struct buffer_head *bh, int create)
  156. {
  157. int err;
  158. struct btrfs_root *root = BTRFS_I(bh->b_page->mapping->host)->root;
  159. err = btrfs_map_bh_to_logical(root, bh, iblock);
  160. return err;
  161. }
  162. int btrfs_csum_data(struct btrfs_root * root, char *data, size_t len,
  163. char *result)
  164. {
  165. struct scatterlist sg;
  166. struct crypto_hash *tfm = root->fs_info->hash_tfm;
  167. struct hash_desc desc;
  168. int ret;
  169. desc.tfm = tfm;
  170. desc.flags = 0;
  171. sg_init_one(&sg, data, len);
  172. spin_lock(&root->fs_info->hash_lock);
  173. ret = crypto_hash_digest(&desc, &sg, 1, result);
  174. spin_unlock(&root->fs_info->hash_lock);
  175. if (ret) {
  176. printk("sha256 digest failed\n");
  177. }
  178. return ret;
  179. }
  180. static int csum_tree_block(struct btrfs_root *root, struct buffer_head *bh,
  181. int verify)
  182. {
  183. char result[BTRFS_CSUM_SIZE];
  184. int ret;
  185. struct btrfs_node *node;
  186. ret = btrfs_csum_data(root, bh->b_data + BTRFS_CSUM_SIZE,
  187. bh->b_size - BTRFS_CSUM_SIZE, result);
  188. if (ret)
  189. return ret;
  190. if (verify) {
  191. if (memcmp(bh->b_data, result, BTRFS_CSUM_SIZE)) {
  192. printk("checksum verify failed on %Lu\n",
  193. bh_blocknr(bh));
  194. return 1;
  195. }
  196. } else {
  197. node = btrfs_buffer_node(bh);
  198. memcpy(node->header.csum, result, BTRFS_CSUM_SIZE);
  199. }
  200. return 0;
  201. }
  202. static int btree_writepage(struct page *page, struct writeback_control *wbc)
  203. {
  204. struct buffer_head *bh;
  205. struct btrfs_root *root = BTRFS_I(page->mapping->host)->root;
  206. struct buffer_head *head;
  207. if (!page_has_buffers(page)) {
  208. create_empty_buffers(page, root->fs_info->sb->s_blocksize,
  209. (1 << BH_Dirty)|(1 << BH_Uptodate));
  210. }
  211. head = page_buffers(page);
  212. bh = head;
  213. do {
  214. if (buffer_dirty(bh))
  215. csum_tree_block(root, bh, 0);
  216. bh = bh->b_this_page;
  217. } while (bh != head);
  218. return block_write_full_page(page, btree_get_block, wbc);
  219. }
  220. static int btree_readpage(struct file * file, struct page * page)
  221. {
  222. return block_read_full_page(page, btree_get_block);
  223. }
  224. static struct address_space_operations btree_aops = {
  225. .readpage = btree_readpage,
  226. .writepage = btree_writepage,
  227. .sync_page = block_sync_page,
  228. };
  229. struct buffer_head *read_tree_block(struct btrfs_root *root, u64 blocknr)
  230. {
  231. struct buffer_head *bh = NULL;
  232. bh = btrfs_find_create_tree_block(root, blocknr);
  233. if (!bh)
  234. return bh;
  235. if (buffer_uptodate(bh))
  236. goto uptodate;
  237. lock_buffer(bh);
  238. if (!buffer_uptodate(bh)) {
  239. get_bh(bh);
  240. bh->b_end_io = end_buffer_read_sync;
  241. submit_bh(READ, bh);
  242. wait_on_buffer(bh);
  243. if (!buffer_uptodate(bh))
  244. goto fail;
  245. csum_tree_block(root, bh, 1);
  246. } else {
  247. unlock_buffer(bh);
  248. }
  249. uptodate:
  250. if (check_tree_block(root, bh))
  251. BUG();
  252. return bh;
  253. fail:
  254. brelse(bh);
  255. return NULL;
  256. }
  257. int dirty_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root,
  258. struct buffer_head *buf)
  259. {
  260. WARN_ON(atomic_read(&buf->b_count) == 0);
  261. mark_buffer_dirty(buf);
  262. return 0;
  263. }
  264. int clean_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root,
  265. struct buffer_head *buf)
  266. {
  267. WARN_ON(atomic_read(&buf->b_count) == 0);
  268. clear_buffer_dirty(buf);
  269. return 0;
  270. }
  271. static int __setup_root(int blocksize,
  272. struct btrfs_root *root,
  273. struct btrfs_fs_info *fs_info,
  274. u64 objectid)
  275. {
  276. root->node = NULL;
  277. root->inode = NULL;
  278. root->commit_root = NULL;
  279. root->blocksize = blocksize;
  280. root->ref_cows = 0;
  281. root->fs_info = fs_info;
  282. root->objectid = objectid;
  283. root->last_trans = 0;
  284. root->highest_inode = 0;
  285. root->last_inode_alloc = 0;
  286. memset(&root->root_key, 0, sizeof(root->root_key));
  287. memset(&root->root_item, 0, sizeof(root->root_item));
  288. return 0;
  289. }
  290. static int find_and_setup_root(int blocksize,
  291. struct btrfs_root *tree_root,
  292. struct btrfs_fs_info *fs_info,
  293. u64 objectid,
  294. struct btrfs_root *root)
  295. {
  296. int ret;
  297. __setup_root(blocksize, root, fs_info, objectid);
  298. ret = btrfs_find_last_root(tree_root, objectid,
  299. &root->root_item, &root->root_key);
  300. BUG_ON(ret);
  301. root->node = read_tree_block(root,
  302. btrfs_root_blocknr(&root->root_item));
  303. BUG_ON(!root->node);
  304. return 0;
  305. }
  306. struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info,
  307. struct btrfs_key *location)
  308. {
  309. struct btrfs_root *root;
  310. struct btrfs_root *tree_root = fs_info->tree_root;
  311. struct btrfs_path *path;
  312. struct btrfs_leaf *l;
  313. u64 highest_inode;
  314. int ret = 0;
  315. printk("read_fs_root looking for %Lu %Lu %u\n", location->objectid, location->offset, location->flags);
  316. root = radix_tree_lookup(&fs_info->fs_roots_radix,
  317. (unsigned long)location->objectid);
  318. if (root) {
  319. printk("found %p in cache\n", root);
  320. return root;
  321. }
  322. root = kmalloc(sizeof(*root), GFP_NOFS);
  323. if (!root) {
  324. printk("failed1\n");
  325. return ERR_PTR(-ENOMEM);
  326. }
  327. if (location->offset == (u64)-1) {
  328. ret = find_and_setup_root(fs_info->sb->s_blocksize,
  329. fs_info->tree_root, fs_info,
  330. location->objectid, root);
  331. if (ret) {
  332. printk("failed2\n");
  333. kfree(root);
  334. return ERR_PTR(ret);
  335. }
  336. goto insert;
  337. }
  338. __setup_root(fs_info->sb->s_blocksize, root, fs_info,
  339. location->objectid);
  340. path = btrfs_alloc_path();
  341. BUG_ON(!path);
  342. ret = btrfs_search_slot(NULL, tree_root, location, path, 0, 0);
  343. if (ret != 0) {
  344. printk("internal search_slot gives us %d\n", ret);
  345. if (ret > 0)
  346. ret = -ENOENT;
  347. goto out;
  348. }
  349. l = btrfs_buffer_leaf(path->nodes[0]);
  350. memcpy(&root->root_item,
  351. btrfs_item_ptr(l, path->slots[0], struct btrfs_root_item),
  352. sizeof(root->root_item));
  353. memcpy(&root->root_key, location, sizeof(*location));
  354. ret = 0;
  355. out:
  356. btrfs_release_path(root, path);
  357. btrfs_free_path(path);
  358. if (ret) {
  359. kfree(root);
  360. return ERR_PTR(ret);
  361. }
  362. root->node = read_tree_block(root,
  363. btrfs_root_blocknr(&root->root_item));
  364. BUG_ON(!root->node);
  365. insert:
  366. printk("inserting %p\n", root);
  367. root->ref_cows = 1;
  368. ret = radix_tree_insert(&fs_info->fs_roots_radix,
  369. (unsigned long)root->root_key.objectid,
  370. root);
  371. if (ret) {
  372. printk("radix_tree_insert gives us %d\n", ret);
  373. brelse(root->node);
  374. kfree(root);
  375. return ERR_PTR(ret);
  376. }
  377. ret = btrfs_find_highest_inode(root, &highest_inode);
  378. if (ret == 0) {
  379. root->highest_inode = highest_inode;
  380. root->last_inode_alloc = highest_inode;
  381. printk("highest inode is %Lu\n", highest_inode);
  382. }
  383. printk("all worked\n");
  384. return root;
  385. }
  386. static int btrfs_open_disk(struct btrfs_root *root, u64 device_id,
  387. u64 block_start, u64 num_blocks,
  388. char *filename, int name_len)
  389. {
  390. char *null_filename;
  391. struct block_device *bdev;
  392. int ret;
  393. null_filename = kmalloc(name_len + 1, GFP_NOFS);
  394. if (!null_filename)
  395. return -ENOMEM;
  396. memcpy(null_filename, filename, name_len);
  397. null_filename[name_len] = '\0';
  398. bdev = open_bdev_excl(null_filename, O_RDWR, root->fs_info->sb);
  399. if (IS_ERR(bdev)) {
  400. ret = PTR_ERR(bdev);
  401. goto out;
  402. }
  403. set_blocksize(bdev, root->fs_info->sb->s_blocksize);
  404. ret = btrfs_insert_dev_radix(root, bdev, device_id,
  405. block_start, num_blocks);
  406. BUG_ON(ret);
  407. ret = 0;
  408. out:
  409. kfree(null_filename);
  410. return ret;
  411. }
  412. static int read_device_info(struct btrfs_root *root)
  413. {
  414. struct btrfs_path *path;
  415. int ret;
  416. struct btrfs_key key;
  417. struct btrfs_leaf *leaf;
  418. struct btrfs_device_item *dev_item;
  419. int nritems;
  420. int slot;
  421. root = root->fs_info->dev_root;
  422. path = btrfs_alloc_path();
  423. if (!path)
  424. return -ENOMEM;
  425. key.objectid = 0;
  426. key.offset = 0;
  427. key.flags = 0;
  428. btrfs_set_key_type(&key, BTRFS_DEV_ITEM_KEY);
  429. mutex_lock(&root->fs_info->fs_mutex);
  430. ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
  431. leaf = btrfs_buffer_leaf(path->nodes[0]);
  432. nritems = btrfs_header_nritems(&leaf->header);
  433. while(1) {
  434. slot = path->slots[0];
  435. if (slot >= nritems) {
  436. ret = btrfs_next_leaf(root, path);
  437. if (ret)
  438. break;
  439. leaf = btrfs_buffer_leaf(path->nodes[0]);
  440. nritems = btrfs_header_nritems(&leaf->header);
  441. slot = path->slots[0];
  442. }
  443. btrfs_disk_key_to_cpu(&key, &leaf->items[slot].key);
  444. if (btrfs_key_type(&key) != BTRFS_DEV_ITEM_KEY) {
  445. path->slots[0]++;
  446. continue;
  447. }
  448. dev_item = btrfs_item_ptr(leaf, slot, struct btrfs_device_item);
  449. printk("found key %Lu %Lu\n", key.objectid, key.offset);
  450. if (btrfs_device_id(dev_item) !=
  451. btrfs_super_device_id(root->fs_info->disk_super)) {
  452. ret = btrfs_open_disk(root, btrfs_device_id(dev_item),
  453. key.objectid, key.offset,
  454. (char *)(dev_item + 1),
  455. btrfs_device_pathlen(dev_item));
  456. BUG_ON(ret);
  457. }
  458. path->slots[0]++;
  459. }
  460. btrfs_free_path(path);
  461. mutex_unlock(&root->fs_info->fs_mutex);
  462. return 0;
  463. }
  464. struct btrfs_root *open_ctree(struct super_block *sb)
  465. {
  466. struct btrfs_root *extent_root = kmalloc(sizeof(struct btrfs_root),
  467. GFP_NOFS);
  468. struct btrfs_root *dev_root = kmalloc(sizeof(struct btrfs_root),
  469. GFP_NOFS);
  470. struct btrfs_root *tree_root = kmalloc(sizeof(struct btrfs_root),
  471. GFP_NOFS);
  472. struct btrfs_fs_info *fs_info = kmalloc(sizeof(*fs_info),
  473. GFP_NOFS);
  474. int ret;
  475. struct btrfs_super_block *disk_super;
  476. struct dev_lookup *dev_lookup;
  477. init_bit_radix(&fs_info->pinned_radix);
  478. init_bit_radix(&fs_info->pending_del_radix);
  479. INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_NOFS);
  480. INIT_RADIX_TREE(&fs_info->dev_radix, GFP_NOFS);
  481. sb_set_blocksize(sb, 4096);
  482. fs_info->running_transaction = NULL;
  483. fs_info->tree_root = tree_root;
  484. fs_info->extent_root = extent_root;
  485. fs_info->dev_root = dev_root;
  486. fs_info->sb = sb;
  487. fs_info->btree_inode = new_inode(sb);
  488. fs_info->btree_inode->i_ino = 1;
  489. fs_info->btree_inode->i_nlink = 1;
  490. fs_info->btree_inode->i_size = sb->s_bdev->bd_inode->i_size;
  491. fs_info->btree_inode->i_mapping->a_ops = &btree_aops;
  492. BTRFS_I(fs_info->btree_inode)->root = tree_root;
  493. memset(&BTRFS_I(fs_info->btree_inode)->location, 0,
  494. sizeof(struct btrfs_key));
  495. insert_inode_hash(fs_info->btree_inode);
  496. mapping_set_gfp_mask(fs_info->btree_inode->i_mapping, GFP_NOFS);
  497. fs_info->hash_tfm = crypto_alloc_hash("sha256", 0, CRYPTO_ALG_ASYNC);
  498. spin_lock_init(&fs_info->hash_lock);
  499. if (!fs_info->hash_tfm || IS_ERR(fs_info->hash_tfm)) {
  500. printk("failed to allocate sha256 hash\n");
  501. return NULL;
  502. }
  503. mutex_init(&fs_info->trans_mutex);
  504. mutex_init(&fs_info->fs_mutex);
  505. memset(&fs_info->current_insert, 0, sizeof(fs_info->current_insert));
  506. memset(&fs_info->last_insert, 0, sizeof(fs_info->last_insert));
  507. __setup_root(sb->s_blocksize, dev_root,
  508. fs_info, BTRFS_DEV_TREE_OBJECTID);
  509. __setup_root(sb->s_blocksize, tree_root,
  510. fs_info, BTRFS_ROOT_TREE_OBJECTID);
  511. dev_lookup = kmalloc(sizeof(*dev_lookup), GFP_NOFS);
  512. dev_lookup->block_start = 0;
  513. dev_lookup->num_blocks = (u32)-2;
  514. dev_lookup->bdev = sb->s_bdev;
  515. dev_lookup->device_id = 0;
  516. ret = radix_tree_insert(&fs_info->dev_radix, (u32)-2, dev_lookup);
  517. BUG_ON(ret);
  518. fs_info->sb_buffer = read_tree_block(tree_root,
  519. BTRFS_SUPER_INFO_OFFSET /
  520. sb->s_blocksize);
  521. if (!fs_info->sb_buffer)
  522. return NULL;
  523. disk_super = (struct btrfs_super_block *)fs_info->sb_buffer->b_data;
  524. if (!btrfs_super_root(disk_super))
  525. return NULL;
  526. i_size_write(fs_info->btree_inode,
  527. btrfs_super_total_blocks(disk_super) <<
  528. fs_info->btree_inode->i_blkbits);
  529. radix_tree_delete(&fs_info->dev_radix, (u32)-2);
  530. dev_lookup->block_start = btrfs_super_device_block_start(disk_super);
  531. dev_lookup->num_blocks = btrfs_super_device_num_blocks(disk_super);
  532. dev_lookup->device_id = btrfs_super_device_id(disk_super);
  533. ret = radix_tree_insert(&fs_info->dev_radix,
  534. dev_lookup->block_start +
  535. dev_lookup->num_blocks - 1, dev_lookup);
  536. BUG_ON(ret);
  537. fs_info->disk_super = disk_super;
  538. dev_root->node = read_tree_block(tree_root,
  539. btrfs_super_device_root(disk_super));
  540. ret = read_device_info(dev_root);
  541. BUG_ON(ret);
  542. tree_root->node = read_tree_block(tree_root,
  543. btrfs_super_root(disk_super));
  544. BUG_ON(!tree_root->node);
  545. mutex_lock(&fs_info->fs_mutex);
  546. ret = find_and_setup_root(sb->s_blocksize, tree_root, fs_info,
  547. BTRFS_EXTENT_TREE_OBJECTID, extent_root);
  548. BUG_ON(ret);
  549. fs_info->generation = btrfs_super_generation(disk_super) + 1;
  550. memset(&fs_info->kobj, 0, sizeof(fs_info->kobj));
  551. kobj_set_kset_s(fs_info, btrfs_subsys);
  552. kobject_set_name(&fs_info->kobj, "%s", sb->s_id);
  553. kobject_register(&fs_info->kobj);
  554. mutex_unlock(&fs_info->fs_mutex);
  555. return tree_root;
  556. }
  557. int write_ctree_super(struct btrfs_trans_handle *trans, struct btrfs_root
  558. *root)
  559. {
  560. struct buffer_head *bh = root->fs_info->sb_buffer;
  561. btrfs_set_super_root(root->fs_info->disk_super,
  562. bh_blocknr(root->fs_info->tree_root->node));
  563. lock_buffer(bh);
  564. WARN_ON(atomic_read(&bh->b_count) < 1);
  565. clear_buffer_dirty(bh);
  566. csum_tree_block(root, bh, 0);
  567. bh->b_end_io = end_buffer_write_sync;
  568. get_bh(bh);
  569. submit_bh(WRITE, bh);
  570. wait_on_buffer(bh);
  571. if (!buffer_uptodate(bh)) {
  572. WARN_ON(1);
  573. return -EIO;
  574. }
  575. return 0;
  576. }
  577. static int free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root)
  578. {
  579. radix_tree_delete(&fs_info->fs_roots_radix,
  580. (unsigned long)root->root_key.objectid);
  581. if (root->inode)
  582. iput(root->inode);
  583. if (root->node)
  584. brelse(root->node);
  585. if (root->commit_root)
  586. brelse(root->commit_root);
  587. kfree(root);
  588. return 0;
  589. }
  590. int del_fs_roots(struct btrfs_fs_info *fs_info)
  591. {
  592. int ret;
  593. struct btrfs_root *gang[8];
  594. int i;
  595. while(1) {
  596. ret = radix_tree_gang_lookup(&fs_info->fs_roots_radix,
  597. (void **)gang, 0,
  598. ARRAY_SIZE(gang));
  599. if (!ret)
  600. break;
  601. for (i = 0; i < ret; i++)
  602. free_fs_root(fs_info, gang[i]);
  603. }
  604. return 0;
  605. }
  606. static int free_dev_radix(struct btrfs_fs_info *fs_info)
  607. {
  608. struct dev_lookup *lookup[8];
  609. struct block_device *super_bdev = fs_info->sb->s_bdev;
  610. int ret;
  611. int i;
  612. while(1) {
  613. ret = radix_tree_gang_lookup(&fs_info->dev_radix,
  614. (void **)lookup, 0,
  615. ARRAY_SIZE(lookup));
  616. if (!ret)
  617. break;
  618. for (i = 0; i < ret; i++) {
  619. if (lookup[i]->bdev != super_bdev)
  620. close_bdev_excl(lookup[i]->bdev);
  621. radix_tree_delete(&fs_info->dev_radix,
  622. lookup[i]->block_start +
  623. lookup[i]->num_blocks - 1);
  624. kfree(lookup[i]);
  625. }
  626. }
  627. return 0;
  628. }
  629. int close_ctree(struct btrfs_root *root)
  630. {
  631. int ret;
  632. struct btrfs_trans_handle *trans;
  633. struct btrfs_fs_info *fs_info = root->fs_info;
  634. mutex_lock(&fs_info->fs_mutex);
  635. trans = btrfs_start_transaction(root, 1);
  636. btrfs_commit_transaction(trans, root);
  637. /* run commit again to drop the original snapshot */
  638. trans = btrfs_start_transaction(root, 1);
  639. btrfs_commit_transaction(trans, root);
  640. ret = btrfs_write_and_wait_transaction(NULL, root);
  641. BUG_ON(ret);
  642. write_ctree_super(NULL, root);
  643. mutex_unlock(&fs_info->fs_mutex);
  644. if (fs_info->extent_root->node)
  645. btrfs_block_release(fs_info->extent_root,
  646. fs_info->extent_root->node);
  647. if (fs_info->dev_root->node)
  648. btrfs_block_release(fs_info->dev_root,
  649. fs_info->dev_root->node);
  650. if (fs_info->tree_root->node)
  651. btrfs_block_release(fs_info->tree_root,
  652. fs_info->tree_root->node);
  653. btrfs_block_release(root, fs_info->sb_buffer);
  654. crypto_free_hash(fs_info->hash_tfm);
  655. truncate_inode_pages(fs_info->btree_inode->i_mapping, 0);
  656. iput(fs_info->btree_inode);
  657. free_dev_radix(fs_info);
  658. del_fs_roots(fs_info);
  659. kfree(fs_info->extent_root);
  660. kfree(fs_info->tree_root);
  661. kobject_unregister(&fs_info->kobj);
  662. return 0;
  663. }
  664. void btrfs_block_release(struct btrfs_root *root, struct buffer_head *buf)
  665. {
  666. brelse(buf);
  667. }