file-item.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. /*
  2. * Copyright (C) 2007 Oracle. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public
  6. * License v2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. * General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public
  14. * License along with this program; if not, write to the
  15. * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  16. * Boston, MA 021110-1307, USA.
  17. */
  18. #include <linux/bio.h>
  19. #include <linux/pagemap.h>
  20. #include <linux/highmem.h>
  21. #include "ctree.h"
  22. #include "disk-io.h"
  23. #include "transaction.h"
  24. #include "print-tree.h"
  25. #define MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r) - \
  26. sizeof(struct btrfs_item) * 2) / \
  27. size) - 1))
  28. #define MAX_ORDERED_SUM_BYTES(r) ((PAGE_SIZE - \
  29. sizeof(struct btrfs_ordered_sum)) / \
  30. sizeof(struct btrfs_sector_sum) * \
  31. (r)->sectorsize - (r)->sectorsize)
  32. int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
  33. struct btrfs_root *root,
  34. u64 objectid, u64 pos,
  35. u64 disk_offset, u64 disk_num_bytes,
  36. u64 num_bytes, u64 offset, u64 ram_bytes,
  37. u8 compression, u8 encryption, u16 other_encoding)
  38. {
  39. int ret = 0;
  40. struct btrfs_file_extent_item *item;
  41. struct btrfs_key file_key;
  42. struct btrfs_path *path;
  43. struct extent_buffer *leaf;
  44. path = btrfs_alloc_path();
  45. BUG_ON(!path);
  46. file_key.objectid = objectid;
  47. file_key.offset = pos;
  48. btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY);
  49. ret = btrfs_insert_empty_item(trans, root, path, &file_key,
  50. sizeof(*item));
  51. if (ret < 0)
  52. goto out;
  53. BUG_ON(ret);
  54. leaf = path->nodes[0];
  55. item = btrfs_item_ptr(leaf, path->slots[0],
  56. struct btrfs_file_extent_item);
  57. btrfs_set_file_extent_disk_bytenr(leaf, item, disk_offset);
  58. btrfs_set_file_extent_disk_num_bytes(leaf, item, disk_num_bytes);
  59. btrfs_set_file_extent_offset(leaf, item, offset);
  60. btrfs_set_file_extent_num_bytes(leaf, item, num_bytes);
  61. btrfs_set_file_extent_ram_bytes(leaf, item, ram_bytes);
  62. btrfs_set_file_extent_generation(leaf, item, trans->transid);
  63. btrfs_set_file_extent_type(leaf, item, BTRFS_FILE_EXTENT_REG);
  64. btrfs_set_file_extent_compression(leaf, item, compression);
  65. btrfs_set_file_extent_encryption(leaf, item, encryption);
  66. btrfs_set_file_extent_other_encoding(leaf, item, other_encoding);
  67. btrfs_mark_buffer_dirty(leaf);
  68. out:
  69. btrfs_free_path(path);
  70. return ret;
  71. }
  72. struct btrfs_csum_item *btrfs_lookup_csum(struct btrfs_trans_handle *trans,
  73. struct btrfs_root *root,
  74. struct btrfs_path *path,
  75. u64 bytenr, int cow)
  76. {
  77. int ret;
  78. struct btrfs_key file_key;
  79. struct btrfs_key found_key;
  80. struct btrfs_csum_item *item;
  81. struct extent_buffer *leaf;
  82. u64 csum_offset = 0;
  83. u16 csum_size =
  84. btrfs_super_csum_size(&root->fs_info->super_copy);
  85. int csums_in_item;
  86. file_key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
  87. file_key.offset = bytenr;
  88. btrfs_set_key_type(&file_key, BTRFS_EXTENT_CSUM_KEY);
  89. ret = btrfs_search_slot(trans, root, &file_key, path, 0, cow);
  90. if (ret < 0)
  91. goto fail;
  92. leaf = path->nodes[0];
  93. if (ret > 0) {
  94. ret = 1;
  95. if (path->slots[0] == 0)
  96. goto fail;
  97. path->slots[0]--;
  98. btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
  99. if (btrfs_key_type(&found_key) != BTRFS_EXTENT_CSUM_KEY)
  100. goto fail;
  101. csum_offset = (bytenr - found_key.offset) >>
  102. root->fs_info->sb->s_blocksize_bits;
  103. csums_in_item = btrfs_item_size_nr(leaf, path->slots[0]);
  104. csums_in_item /= csum_size;
  105. if (csum_offset >= csums_in_item) {
  106. ret = -EFBIG;
  107. goto fail;
  108. }
  109. }
  110. item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item);
  111. item = (struct btrfs_csum_item *)((unsigned char *)item +
  112. csum_offset * csum_size);
  113. return item;
  114. fail:
  115. if (ret > 0)
  116. ret = -ENOENT;
  117. return ERR_PTR(ret);
  118. }
  119. int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
  120. struct btrfs_root *root,
  121. struct btrfs_path *path, u64 objectid,
  122. u64 offset, int mod)
  123. {
  124. int ret;
  125. struct btrfs_key file_key;
  126. int ins_len = mod < 0 ? -1 : 0;
  127. int cow = mod != 0;
  128. file_key.objectid = objectid;
  129. file_key.offset = offset;
  130. btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY);
  131. ret = btrfs_search_slot(trans, root, &file_key, path, ins_len, cow);
  132. return ret;
  133. }
  134. int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode,
  135. struct bio *bio, u32 *dst)
  136. {
  137. u32 sum;
  138. struct bio_vec *bvec = bio->bi_io_vec;
  139. int bio_index = 0;
  140. u64 offset;
  141. u64 item_start_offset = 0;
  142. u64 item_last_offset = 0;
  143. u64 disk_bytenr;
  144. u32 diff;
  145. u16 csum_size =
  146. btrfs_super_csum_size(&root->fs_info->super_copy);
  147. int ret;
  148. struct btrfs_path *path;
  149. struct btrfs_csum_item *item = NULL;
  150. struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
  151. path = btrfs_alloc_path();
  152. if (bio->bi_size > PAGE_CACHE_SIZE * 8)
  153. path->reada = 2;
  154. WARN_ON(bio->bi_vcnt <= 0);
  155. disk_bytenr = (u64)bio->bi_sector << 9;
  156. while (bio_index < bio->bi_vcnt) {
  157. offset = page_offset(bvec->bv_page) + bvec->bv_offset;
  158. ret = btrfs_find_ordered_sum(inode, offset, disk_bytenr, &sum);
  159. if (ret == 0)
  160. goto found;
  161. if (!item || disk_bytenr < item_start_offset ||
  162. disk_bytenr >= item_last_offset) {
  163. struct btrfs_key found_key;
  164. u32 item_size;
  165. if (item)
  166. btrfs_release_path(root, path);
  167. item = btrfs_lookup_csum(NULL, root->fs_info->csum_root,
  168. path, disk_bytenr, 0);
  169. if (IS_ERR(item)) {
  170. ret = PTR_ERR(item);
  171. if (ret == -ENOENT || ret == -EFBIG)
  172. ret = 0;
  173. sum = 0;
  174. if (BTRFS_I(inode)->root->root_key.objectid ==
  175. BTRFS_DATA_RELOC_TREE_OBJECTID) {
  176. set_extent_bits(io_tree, offset,
  177. offset + bvec->bv_len - 1,
  178. EXTENT_NODATASUM, GFP_NOFS);
  179. } else {
  180. printk(KERN_INFO "btrfs no csum found "
  181. "for inode %lu start %llu\n",
  182. inode->i_ino,
  183. (unsigned long long)offset);
  184. }
  185. item = NULL;
  186. btrfs_release_path(root, path);
  187. goto found;
  188. }
  189. btrfs_item_key_to_cpu(path->nodes[0], &found_key,
  190. path->slots[0]);
  191. item_start_offset = found_key.offset;
  192. item_size = btrfs_item_size_nr(path->nodes[0],
  193. path->slots[0]);
  194. item_last_offset = item_start_offset +
  195. (item_size / csum_size) *
  196. root->sectorsize;
  197. item = btrfs_item_ptr(path->nodes[0], path->slots[0],
  198. struct btrfs_csum_item);
  199. }
  200. /*
  201. * this byte range must be able to fit inside
  202. * a single leaf so it will also fit inside a u32
  203. */
  204. diff = disk_bytenr - item_start_offset;
  205. diff = diff / root->sectorsize;
  206. diff = diff * csum_size;
  207. read_extent_buffer(path->nodes[0], &sum,
  208. ((unsigned long)item) + diff,
  209. csum_size);
  210. found:
  211. if (dst)
  212. *dst++ = sum;
  213. else
  214. set_state_private(io_tree, offset, sum);
  215. disk_bytenr += bvec->bv_len;
  216. bio_index++;
  217. bvec++;
  218. }
  219. btrfs_free_path(path);
  220. return 0;
  221. }
  222. int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
  223. struct list_head *list)
  224. {
  225. struct btrfs_key key;
  226. struct btrfs_path *path;
  227. struct extent_buffer *leaf;
  228. struct btrfs_ordered_sum *sums;
  229. struct btrfs_sector_sum *sector_sum;
  230. struct btrfs_csum_item *item;
  231. unsigned long offset;
  232. int ret;
  233. size_t size;
  234. u64 csum_end;
  235. u16 csum_size = btrfs_super_csum_size(&root->fs_info->super_copy);
  236. path = btrfs_alloc_path();
  237. BUG_ON(!path);
  238. key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
  239. key.offset = start;
  240. key.type = BTRFS_EXTENT_CSUM_KEY;
  241. ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
  242. if (ret < 0)
  243. goto fail;
  244. if (ret > 0 && path->slots[0] > 0) {
  245. leaf = path->nodes[0];
  246. btrfs_item_key_to_cpu(leaf, &key, path->slots[0] - 1);
  247. if (key.objectid == BTRFS_EXTENT_CSUM_OBJECTID &&
  248. key.type == BTRFS_EXTENT_CSUM_KEY) {
  249. offset = (start - key.offset) >>
  250. root->fs_info->sb->s_blocksize_bits;
  251. if (offset * csum_size <
  252. btrfs_item_size_nr(leaf, path->slots[0] - 1))
  253. path->slots[0]--;
  254. }
  255. }
  256. while (start <= end) {
  257. leaf = path->nodes[0];
  258. if (path->slots[0] >= btrfs_header_nritems(leaf)) {
  259. ret = btrfs_next_leaf(root, path);
  260. if (ret < 0)
  261. goto fail;
  262. if (ret > 0)
  263. break;
  264. leaf = path->nodes[0];
  265. }
  266. btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
  267. if (key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
  268. key.type != BTRFS_EXTENT_CSUM_KEY)
  269. break;
  270. btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
  271. if (key.offset > end)
  272. break;
  273. if (key.offset > start)
  274. start = key.offset;
  275. size = btrfs_item_size_nr(leaf, path->slots[0]);
  276. csum_end = key.offset + (size / csum_size) * root->sectorsize;
  277. if (csum_end <= start) {
  278. path->slots[0]++;
  279. continue;
  280. }
  281. csum_end = min(csum_end, end + 1);
  282. item = btrfs_item_ptr(path->nodes[0], path->slots[0],
  283. struct btrfs_csum_item);
  284. while (start < csum_end) {
  285. size = min_t(size_t, csum_end - start,
  286. MAX_ORDERED_SUM_BYTES(root));
  287. sums = kzalloc(btrfs_ordered_sum_size(root, size),
  288. GFP_NOFS);
  289. BUG_ON(!sums);
  290. sector_sum = sums->sums;
  291. sums->bytenr = start;
  292. sums->len = size;
  293. offset = (start - key.offset) >>
  294. root->fs_info->sb->s_blocksize_bits;
  295. offset *= csum_size;
  296. while (size > 0) {
  297. read_extent_buffer(path->nodes[0],
  298. &sector_sum->sum,
  299. ((unsigned long)item) +
  300. offset, csum_size);
  301. sector_sum->bytenr = start;
  302. size -= root->sectorsize;
  303. start += root->sectorsize;
  304. offset += csum_size;
  305. sector_sum++;
  306. }
  307. list_add_tail(&sums->list, list);
  308. }
  309. path->slots[0]++;
  310. }
  311. ret = 0;
  312. fail:
  313. btrfs_free_path(path);
  314. return ret;
  315. }
  316. int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode,
  317. struct bio *bio, u64 file_start, int contig)
  318. {
  319. struct btrfs_ordered_sum *sums;
  320. struct btrfs_sector_sum *sector_sum;
  321. struct btrfs_ordered_extent *ordered;
  322. char *data;
  323. struct bio_vec *bvec = bio->bi_io_vec;
  324. int bio_index = 0;
  325. unsigned long total_bytes = 0;
  326. unsigned long this_sum_bytes = 0;
  327. u64 offset;
  328. u64 disk_bytenr;
  329. WARN_ON(bio->bi_vcnt <= 0);
  330. sums = kzalloc(btrfs_ordered_sum_size(root, bio->bi_size), GFP_NOFS);
  331. if (!sums)
  332. return -ENOMEM;
  333. sector_sum = sums->sums;
  334. disk_bytenr = (u64)bio->bi_sector << 9;
  335. sums->len = bio->bi_size;
  336. INIT_LIST_HEAD(&sums->list);
  337. if (contig)
  338. offset = file_start;
  339. else
  340. offset = page_offset(bvec->bv_page) + bvec->bv_offset;
  341. ordered = btrfs_lookup_ordered_extent(inode, offset);
  342. BUG_ON(!ordered);
  343. sums->bytenr = ordered->start;
  344. while (bio_index < bio->bi_vcnt) {
  345. if (!contig)
  346. offset = page_offset(bvec->bv_page) + bvec->bv_offset;
  347. if (!contig && (offset >= ordered->file_offset + ordered->len ||
  348. offset < ordered->file_offset)) {
  349. unsigned long bytes_left;
  350. sums->len = this_sum_bytes;
  351. this_sum_bytes = 0;
  352. btrfs_add_ordered_sum(inode, ordered, sums);
  353. btrfs_put_ordered_extent(ordered);
  354. bytes_left = bio->bi_size - total_bytes;
  355. sums = kzalloc(btrfs_ordered_sum_size(root, bytes_left),
  356. GFP_NOFS);
  357. BUG_ON(!sums);
  358. sector_sum = sums->sums;
  359. sums->len = bytes_left;
  360. ordered = btrfs_lookup_ordered_extent(inode, offset);
  361. BUG_ON(!ordered);
  362. sums->bytenr = ordered->start;
  363. }
  364. data = kmap_atomic(bvec->bv_page, KM_USER0);
  365. sector_sum->sum = ~(u32)0;
  366. sector_sum->sum = btrfs_csum_data(root,
  367. data + bvec->bv_offset,
  368. sector_sum->sum,
  369. bvec->bv_len);
  370. kunmap_atomic(data, KM_USER0);
  371. btrfs_csum_final(sector_sum->sum,
  372. (char *)&sector_sum->sum);
  373. sector_sum->bytenr = disk_bytenr;
  374. sector_sum++;
  375. bio_index++;
  376. total_bytes += bvec->bv_len;
  377. this_sum_bytes += bvec->bv_len;
  378. disk_bytenr += bvec->bv_len;
  379. offset += bvec->bv_len;
  380. bvec++;
  381. }
  382. this_sum_bytes = 0;
  383. btrfs_add_ordered_sum(inode, ordered, sums);
  384. btrfs_put_ordered_extent(ordered);
  385. return 0;
  386. }
  387. /*
  388. * helper function for csum removal, this expects the
  389. * key to describe the csum pointed to by the path, and it expects
  390. * the csum to overlap the range [bytenr, len]
  391. *
  392. * The csum should not be entirely contained in the range and the
  393. * range should not be entirely contained in the csum.
  394. *
  395. * This calls btrfs_truncate_item with the correct args based on the
  396. * overlap, and fixes up the key as required.
  397. */
  398. static noinline int truncate_one_csum(struct btrfs_trans_handle *trans,
  399. struct btrfs_root *root,
  400. struct btrfs_path *path,
  401. struct btrfs_key *key,
  402. u64 bytenr, u64 len)
  403. {
  404. struct extent_buffer *leaf;
  405. u16 csum_size =
  406. btrfs_super_csum_size(&root->fs_info->super_copy);
  407. u64 csum_end;
  408. u64 end_byte = bytenr + len;
  409. u32 blocksize_bits = root->fs_info->sb->s_blocksize_bits;
  410. int ret;
  411. leaf = path->nodes[0];
  412. csum_end = btrfs_item_size_nr(leaf, path->slots[0]) / csum_size;
  413. csum_end <<= root->fs_info->sb->s_blocksize_bits;
  414. csum_end += key->offset;
  415. if (key->offset < bytenr && csum_end <= end_byte) {
  416. /*
  417. * [ bytenr - len ]
  418. * [ ]
  419. * [csum ]
  420. * A simple truncate off the end of the item
  421. */
  422. u32 new_size = (bytenr - key->offset) >> blocksize_bits;
  423. new_size *= csum_size;
  424. ret = btrfs_truncate_item(trans, root, path, new_size, 1);
  425. BUG_ON(ret);
  426. } else if (key->offset >= bytenr && csum_end > end_byte &&
  427. end_byte > key->offset) {
  428. /*
  429. * [ bytenr - len ]
  430. * [ ]
  431. * [csum ]
  432. * we need to truncate from the beginning of the csum
  433. */
  434. u32 new_size = (csum_end - end_byte) >> blocksize_bits;
  435. new_size *= csum_size;
  436. ret = btrfs_truncate_item(trans, root, path, new_size, 0);
  437. BUG_ON(ret);
  438. key->offset = end_byte;
  439. ret = btrfs_set_item_key_safe(trans, root, path, key);
  440. BUG_ON(ret);
  441. } else {
  442. BUG();
  443. }
  444. return 0;
  445. }
  446. /*
  447. * deletes the csum items from the csum tree for a given
  448. * range of bytes.
  449. */
  450. int btrfs_del_csums(struct btrfs_trans_handle *trans,
  451. struct btrfs_root *root, u64 bytenr, u64 len)
  452. {
  453. struct btrfs_path *path;
  454. struct btrfs_key key;
  455. u64 end_byte = bytenr + len;
  456. u64 csum_end;
  457. struct extent_buffer *leaf;
  458. int ret;
  459. u16 csum_size =
  460. btrfs_super_csum_size(&root->fs_info->super_copy);
  461. int blocksize_bits = root->fs_info->sb->s_blocksize_bits;
  462. root = root->fs_info->csum_root;
  463. path = btrfs_alloc_path();
  464. while (1) {
  465. key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
  466. key.offset = end_byte - 1;
  467. key.type = BTRFS_EXTENT_CSUM_KEY;
  468. ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
  469. if (ret > 0) {
  470. if (path->slots[0] == 0)
  471. goto out;
  472. path->slots[0]--;
  473. }
  474. leaf = path->nodes[0];
  475. btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
  476. if (key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
  477. key.type != BTRFS_EXTENT_CSUM_KEY) {
  478. break;
  479. }
  480. if (key.offset >= end_byte)
  481. break;
  482. csum_end = btrfs_item_size_nr(leaf, path->slots[0]) / csum_size;
  483. csum_end <<= blocksize_bits;
  484. csum_end += key.offset;
  485. /* this csum ends before we start, we're done */
  486. if (csum_end <= bytenr)
  487. break;
  488. /* delete the entire item, it is inside our range */
  489. if (key.offset >= bytenr && csum_end <= end_byte) {
  490. ret = btrfs_del_item(trans, root, path);
  491. BUG_ON(ret);
  492. if (key.offset == bytenr)
  493. break;
  494. } else if (key.offset < bytenr && csum_end > end_byte) {
  495. unsigned long offset;
  496. unsigned long shift_len;
  497. unsigned long item_offset;
  498. /*
  499. * [ bytenr - len ]
  500. * [csum ]
  501. *
  502. * Our bytes are in the middle of the csum,
  503. * we need to split this item and insert a new one.
  504. *
  505. * But we can't drop the path because the
  506. * csum could change, get removed, extended etc.
  507. *
  508. * The trick here is the max size of a csum item leaves
  509. * enough room in the tree block for a single
  510. * item header. So, we split the item in place,
  511. * adding a new header pointing to the existing
  512. * bytes. Then we loop around again and we have
  513. * a nicely formed csum item that we can neatly
  514. * truncate.
  515. */
  516. offset = (bytenr - key.offset) >> blocksize_bits;
  517. offset *= csum_size;
  518. shift_len = (len >> blocksize_bits) * csum_size;
  519. item_offset = btrfs_item_ptr_offset(leaf,
  520. path->slots[0]);
  521. memset_extent_buffer(leaf, 0, item_offset + offset,
  522. shift_len);
  523. key.offset = bytenr;
  524. /*
  525. * btrfs_split_item returns -EAGAIN when the
  526. * item changed size or key
  527. */
  528. ret = btrfs_split_item(trans, root, path, &key, offset);
  529. BUG_ON(ret && ret != -EAGAIN);
  530. key.offset = end_byte - 1;
  531. } else {
  532. ret = truncate_one_csum(trans, root, path,
  533. &key, bytenr, len);
  534. BUG_ON(ret);
  535. if (key.offset < bytenr)
  536. break;
  537. }
  538. btrfs_release_path(root, path);
  539. }
  540. out:
  541. btrfs_free_path(path);
  542. return 0;
  543. }
  544. int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
  545. struct btrfs_root *root,
  546. struct btrfs_ordered_sum *sums)
  547. {
  548. u64 bytenr;
  549. int ret;
  550. struct btrfs_key file_key;
  551. struct btrfs_key found_key;
  552. u64 next_offset;
  553. u64 total_bytes = 0;
  554. int found_next;
  555. struct btrfs_path *path;
  556. struct btrfs_csum_item *item;
  557. struct btrfs_csum_item *item_end;
  558. struct extent_buffer *leaf = NULL;
  559. u64 csum_offset;
  560. struct btrfs_sector_sum *sector_sum;
  561. u32 nritems;
  562. u32 ins_size;
  563. char *eb_map;
  564. char *eb_token;
  565. unsigned long map_len;
  566. unsigned long map_start;
  567. u16 csum_size =
  568. btrfs_super_csum_size(&root->fs_info->super_copy);
  569. path = btrfs_alloc_path();
  570. BUG_ON(!path);
  571. sector_sum = sums->sums;
  572. again:
  573. next_offset = (u64)-1;
  574. found_next = 0;
  575. file_key.objectid = BTRFS_EXTENT_CSUM_OBJECTID;
  576. file_key.offset = sector_sum->bytenr;
  577. bytenr = sector_sum->bytenr;
  578. btrfs_set_key_type(&file_key, BTRFS_EXTENT_CSUM_KEY);
  579. item = btrfs_lookup_csum(trans, root, path, sector_sum->bytenr, 1);
  580. if (!IS_ERR(item)) {
  581. leaf = path->nodes[0];
  582. ret = 0;
  583. goto found;
  584. }
  585. ret = PTR_ERR(item);
  586. if (ret == -EFBIG) {
  587. u32 item_size;
  588. /* we found one, but it isn't big enough yet */
  589. leaf = path->nodes[0];
  590. item_size = btrfs_item_size_nr(leaf, path->slots[0]);
  591. if ((item_size / csum_size) >=
  592. MAX_CSUM_ITEMS(root, csum_size)) {
  593. /* already at max size, make a new one */
  594. goto insert;
  595. }
  596. } else {
  597. int slot = path->slots[0] + 1;
  598. /* we didn't find a csum item, insert one */
  599. nritems = btrfs_header_nritems(path->nodes[0]);
  600. if (path->slots[0] >= nritems - 1) {
  601. ret = btrfs_next_leaf(root, path);
  602. if (ret == 1)
  603. found_next = 1;
  604. if (ret != 0)
  605. goto insert;
  606. slot = 0;
  607. }
  608. btrfs_item_key_to_cpu(path->nodes[0], &found_key, slot);
  609. if (found_key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
  610. found_key.type != BTRFS_EXTENT_CSUM_KEY) {
  611. found_next = 1;
  612. goto insert;
  613. }
  614. next_offset = found_key.offset;
  615. found_next = 1;
  616. goto insert;
  617. }
  618. /*
  619. * at this point, we know the tree has an item, but it isn't big
  620. * enough yet to put our csum in. Grow it
  621. */
  622. btrfs_release_path(root, path);
  623. ret = btrfs_search_slot(trans, root, &file_key, path,
  624. csum_size, 1);
  625. if (ret < 0)
  626. goto fail_unlock;
  627. if (ret > 0) {
  628. if (path->slots[0] == 0)
  629. goto insert;
  630. path->slots[0]--;
  631. }
  632. leaf = path->nodes[0];
  633. btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
  634. csum_offset = (bytenr - found_key.offset) >>
  635. root->fs_info->sb->s_blocksize_bits;
  636. if (btrfs_key_type(&found_key) != BTRFS_EXTENT_CSUM_KEY ||
  637. found_key.objectid != BTRFS_EXTENT_CSUM_OBJECTID ||
  638. csum_offset >= MAX_CSUM_ITEMS(root, csum_size)) {
  639. goto insert;
  640. }
  641. if (csum_offset >= btrfs_item_size_nr(leaf, path->slots[0]) /
  642. csum_size) {
  643. u32 diff = (csum_offset + 1) * csum_size;
  644. /*
  645. * is the item big enough already? we dropped our lock
  646. * before and need to recheck
  647. */
  648. if (diff < btrfs_item_size_nr(leaf, path->slots[0]))
  649. goto csum;
  650. diff = diff - btrfs_item_size_nr(leaf, path->slots[0]);
  651. if (diff != csum_size)
  652. goto insert;
  653. ret = btrfs_extend_item(trans, root, path, diff);
  654. BUG_ON(ret);
  655. goto csum;
  656. }
  657. insert:
  658. btrfs_release_path(root, path);
  659. csum_offset = 0;
  660. if (found_next) {
  661. u64 tmp = total_bytes + root->sectorsize;
  662. u64 next_sector = sector_sum->bytenr;
  663. struct btrfs_sector_sum *next = sector_sum + 1;
  664. while (tmp < sums->len) {
  665. if (next_sector + root->sectorsize != next->bytenr)
  666. break;
  667. tmp += root->sectorsize;
  668. next_sector = next->bytenr;
  669. next++;
  670. }
  671. tmp = min(tmp, next_offset - file_key.offset);
  672. tmp >>= root->fs_info->sb->s_blocksize_bits;
  673. tmp = max((u64)1, tmp);
  674. tmp = min(tmp, (u64)MAX_CSUM_ITEMS(root, csum_size));
  675. ins_size = csum_size * tmp;
  676. } else {
  677. ins_size = csum_size;
  678. }
  679. ret = btrfs_insert_empty_item(trans, root, path, &file_key,
  680. ins_size);
  681. if (ret < 0)
  682. goto fail_unlock;
  683. if (ret != 0) {
  684. WARN_ON(1);
  685. goto fail_unlock;
  686. }
  687. csum:
  688. leaf = path->nodes[0];
  689. item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item);
  690. ret = 0;
  691. item = (struct btrfs_csum_item *)((unsigned char *)item +
  692. csum_offset * csum_size);
  693. found:
  694. item_end = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_csum_item);
  695. item_end = (struct btrfs_csum_item *)((unsigned char *)item_end +
  696. btrfs_item_size_nr(leaf, path->slots[0]));
  697. eb_token = NULL;
  698. cond_resched();
  699. next_sector:
  700. if (!eb_token ||
  701. (unsigned long)item + csum_size >= map_start + map_len) {
  702. int err;
  703. if (eb_token)
  704. unmap_extent_buffer(leaf, eb_token, KM_USER1);
  705. eb_token = NULL;
  706. err = map_private_extent_buffer(leaf, (unsigned long)item,
  707. csum_size,
  708. &eb_token, &eb_map,
  709. &map_start, &map_len, KM_USER1);
  710. if (err)
  711. eb_token = NULL;
  712. }
  713. if (eb_token) {
  714. memcpy(eb_token + ((unsigned long)item & (PAGE_CACHE_SIZE - 1)),
  715. &sector_sum->sum, csum_size);
  716. } else {
  717. write_extent_buffer(leaf, &sector_sum->sum,
  718. (unsigned long)item, csum_size);
  719. }
  720. total_bytes += root->sectorsize;
  721. sector_sum++;
  722. if (total_bytes < sums->len) {
  723. item = (struct btrfs_csum_item *)((char *)item +
  724. csum_size);
  725. if (item < item_end && bytenr + PAGE_CACHE_SIZE ==
  726. sector_sum->bytenr) {
  727. bytenr = sector_sum->bytenr;
  728. goto next_sector;
  729. }
  730. }
  731. if (eb_token) {
  732. unmap_extent_buffer(leaf, eb_token, KM_USER1);
  733. eb_token = NULL;
  734. }
  735. btrfs_mark_buffer_dirty(path->nodes[0]);
  736. cond_resched();
  737. if (total_bytes < sums->len) {
  738. btrfs_release_path(root, path);
  739. goto again;
  740. }
  741. out:
  742. btrfs_free_path(path);
  743. return ret;
  744. fail_unlock:
  745. goto out;
  746. }