X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=inode-map.c;h=9000e69b8d6fa5931840a6d793ced91baeb10a81;hb=9005b603d7230a92d0623cb8d8078a8845739fca;hp=330b3626247fabeb1380c331c41d8dab5214a766;hpb=1b4ca380ed92eac7b8897c812e21ca92ccc346c4;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/inode-map.c b/inode-map.c index 330b362..9000e69 100644 --- a/inode-map.c +++ b/inode-map.c @@ -1,10 +1,25 @@ -#include -#include -#include "kerncompat.h" -#include "radix-tree.h" +/* + * Copyright (C) 2007 Oracle. All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + */ + #include "ctree.h" #include "disk-io.h" #include "transaction.h" +#include "internal.h" /* * walks the btree of allocated inodes and find a hole. @@ -13,40 +28,41 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans, struct btrfs_root *root, u64 dirid, u64 *objectid) { - struct btrfs_path path; + struct btrfs_path *path; struct btrfs_key key; int ret; - u64 hole_size = 0; int slot = 0; - u64 last_ino; + u64 last_ino = 0; int start_found; - struct btrfs_leaf *l; + struct extent_buffer *l; struct btrfs_key search_key; u64 search_start = dirid; - if (root->fs_info->last_inode_alloc_dirid == dirid) - search_start = root->fs_info->last_inode_alloc; + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; - if (search_start < BTRFS_FIRST_FREE_OBJECTID) - search_start = BTRFS_FIRST_FREE_OBJECTID; + search_start = root->last_inode_alloc; + search_start = max((unsigned long long)search_start, + BTRFS_FIRST_FREE_OBJECTID); search_key.objectid = search_start; - search_key.flags = 0; search_key.offset = 0; + search_key.type = 0; - btrfs_init_path(&path); + btrfs_init_path(path); start_found = 0; - ret = btrfs_search_slot(trans, root, &search_key, &path, 0, 0); + ret = btrfs_search_slot(trans, root, &search_key, path, 0, 0); if (ret < 0) goto error; - if (path.slots[0] > 0) - path.slots[0]--; + if (path->slots[0] > 0) + path->slots[0]--; while (1) { - l = &path.nodes[0]->leaf; - slot = path.slots[0]; - if (slot >= btrfs_header_nritems(&l->header)) { - ret = btrfs_next_leaf(root, &path); + l = path->nodes[0]; + slot = path->slots[0]; + if (slot >= btrfs_header_nritems(l)) { + ret = btrfs_next_leaf(root, path); if (ret == 0) continue; if (ret < 0) @@ -60,13 +76,12 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans, last_ino : search_start; goto found; } - btrfs_disk_key_to_cpu(&key, &l->items[slot].key); + btrfs_item_key_to_cpu(l, &key, slot); if (key.objectid >= search_start) { if (start_found) { if (last_ino < search_start) last_ino = search_start; - hole_size = key.objectid - last_ino; - if (hole_size > 0) { + if (key.objectid > last_ino) { *objectid = last_ino; goto found; } @@ -74,16 +89,15 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans, } start_found = 1; last_ino = key.objectid + 1; - path.slots[0]++; + path->slots[0]++; } // FIXME -ENOSPC found: - root->fs_info->last_inode_alloc = *objectid; - root->fs_info->last_inode_alloc_dirid = dirid; - btrfs_release_path(root, &path); + root->last_inode_alloc = *objectid; + btrfs_free_path(path); BUG_ON(*objectid < search_start); return 0; error: - btrfs_release_path(root, &path); + btrfs_free_path(path); return ret; }