fs/affs: use ERR_CAST
[safe/jmp/linux-2.6] / fs / btrfs / file-item.c
index b11abfa..54a2550 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #include <linux/bio.h>
+#include <linux/slab.h>
 #include <linux/pagemap.h>
 #include <linux/highmem.h>
 #include "ctree.h"
 #define MAX_CSUM_ITEMS(r, size) ((((BTRFS_LEAF_DATA_SIZE(r) - \
                                   sizeof(struct btrfs_item) * 2) / \
                                  size) - 1))
+
+#define MAX_ORDERED_SUM_BYTES(r) ((PAGE_SIZE - \
+                                  sizeof(struct btrfs_ordered_sum)) / \
+                                  sizeof(struct btrfs_sector_sum) * \
+                                  (r)->sectorsize - (r)->sectorsize)
+
 int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
                             struct btrfs_root *root,
                             u64 objectid, u64 pos,
@@ -46,6 +53,7 @@ int btrfs_insert_file_extent(struct btrfs_trans_handle *trans,
        file_key.offset = pos;
        btrfs_set_key_type(&file_key, BTRFS_EXTENT_DATA_KEY);
 
+       path->leave_spinning = 1;
        ret = btrfs_insert_empty_item(trans, root, path, &file_key,
                                      sizeof(*item));
        if (ret < 0)
@@ -259,8 +267,7 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
        key.offset = start;
        key.type = BTRFS_EXTENT_CSUM_KEY;
 
-       ret = btrfs_search_slot(NULL, root->fs_info->csum_root,
-                               &key, path, 0, 0);
+       ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
        if (ret < 0)
                goto fail;
        if (ret > 0 && path->slots[0] > 0) {
@@ -279,7 +286,7 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
        while (start <= end) {
                leaf = path->nodes[0];
                if (path->slots[0] >= btrfs_header_nritems(leaf)) {
-                       ret = btrfs_next_leaf(root->fs_info->csum_root, path);
+                       ret = btrfs_next_leaf(root, path);
                        if (ret < 0)
                                goto fail;
                        if (ret > 0)
@@ -306,33 +313,38 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
                        continue;
                }
 
-               size = min(csum_end, end + 1) - start;
-               sums = kzalloc(btrfs_ordered_sum_size(root, size), GFP_NOFS);
-               BUG_ON(!sums);
+               csum_end = min(csum_end, end + 1);
+               item = btrfs_item_ptr(path->nodes[0], path->slots[0],
+                                     struct btrfs_csum_item);
+               while (start < csum_end) {
+                       size = min_t(size_t, csum_end - start,
+                                       MAX_ORDERED_SUM_BYTES(root));
+                       sums = kzalloc(btrfs_ordered_sum_size(root, size),
+                                       GFP_NOFS);
+                       BUG_ON(!sums);
 
-               sector_sum = sums->sums;
-               sums->bytenr = start;
-               sums->len = size;
+                       sector_sum = sums->sums;
+                       sums->bytenr = start;
+                       sums->len = size;
 
-               offset = (start - key.offset) >>
-                        root->fs_info->sb->s_blocksize_bits;
-               offset *= csum_size;
+                       offset = (start - key.offset) >>
+                               root->fs_info->sb->s_blocksize_bits;
+                       offset *= csum_size;
 
-               item = btrfs_item_ptr(path->nodes[0], path->slots[0],
-                                     struct btrfs_csum_item);
-               while (size > 0) {
-                       read_extent_buffer(path->nodes[0], &sector_sum->sum,
-                                          ((unsigned long)item) + offset,
-                                          csum_size);
-                       sector_sum->bytenr = start;
-
-                       size -= root->sectorsize;
-                       start += root->sectorsize;
-                       offset += csum_size;
-                       sector_sum++;
+                       while (size > 0) {
+                               read_extent_buffer(path->nodes[0],
+                                               &sector_sum->sum,
+                                               ((unsigned long)item) +
+                                               offset, csum_size);
+                               sector_sum->bytenr = start;
+
+                               size -= root->sectorsize;
+                               start += root->sectorsize;
+                               offset += csum_size;
+                               sector_sum++;
+                       }
+                       list_add_tail(&sums->list, list);
                }
-               list_add_tail(&sums->list, list);
-
                path->slots[0]++;
        }
        ret = 0;
@@ -513,6 +525,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans,
                key.offset = end_byte - 1;
                key.type = BTRFS_EXTENT_CSUM_KEY;
 
+               path->leave_spinning = 1;
                ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
                if (ret > 0) {
                        if (path->slots[0] == 0)
@@ -747,8 +760,10 @@ insert:
        } else {
                ins_size = csum_size;
        }
+       path->leave_spinning = 1;
        ret = btrfs_insert_empty_item(trans, root, path, &file_key,
                                      ins_size);
+       path->leave_spinning = 0;
        if (ret < 0)
                goto fail_unlock;
        if (ret != 0) {
@@ -766,7 +781,6 @@ found:
        item_end = (struct btrfs_csum_item *)((unsigned char *)item_end +
                                      btrfs_item_size_nr(leaf, path->slots[0]));
        eb_token = NULL;
-       cond_resched();
 next_sector:
 
        if (!eb_token ||
@@ -807,9 +821,9 @@ next_sector:
                eb_token = NULL;
        }
        btrfs_mark_buffer_dirty(path->nodes[0]);
-       cond_resched();
        if (total_bytes < sums->len) {
                btrfs_release_path(root, path);
+               cond_resched();
                goto again;
        }
 out: