1 /* 2 * Copyright (C) 2008 Red Hat. 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 19 #include "ctree.h" 20 #include "disk-io.h" 21 22 int btrfs_insert_orphan_item(struct btrfs_trans_handle *trans, 23 struct btrfs_root *root, u64 offset) 24 { 25 struct btrfs_path *path; 26 struct btrfs_key key; 27 int ret = 0; 28 29 key.objectid = BTRFS_ORPHAN_OBJECTID; 30 btrfs_set_key_type(&key, BTRFS_ORPHAN_ITEM_KEY); 31 key.offset = offset; 32 33 path = btrfs_alloc_path(); 34 if (!path) 35 return -ENOMEM; 36 37 ret = btrfs_insert_empty_item(trans, root, path, &key, 0); 38 39 btrfs_free_path(path); 40 return ret; 41 } 42 43 int btrfs_del_orphan_item(struct btrfs_trans_handle *trans, 44 struct btrfs_root *root, u64 offset) 45 { 46 struct btrfs_path *path; 47 struct btrfs_key key; 48 int ret = 0; 49 50 key.objectid = BTRFS_ORPHAN_OBJECTID; 51 btrfs_set_key_type(&key, BTRFS_ORPHAN_ITEM_KEY); 52 key.offset = offset; 53 54 path = btrfs_alloc_path(); 55 if (!path) 56 return -ENOMEM; 57 58 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); 59 if (ret < 0) 60 goto out; 61 if (ret) { /* JDM: Really? */ 62 ret = -ENOENT; 63 goto out; 64 } 65 66 ret = btrfs_del_item(trans, root, path); 67 68 out: 69 btrfs_free_path(path); 70 return ret; 71 } 72 73 int btrfs_find_orphan_item(struct btrfs_root *root, u64 offset) 74 { 75 struct btrfs_path *path; 76 struct btrfs_key key; 77 int ret; 78 79 key.objectid = BTRFS_ORPHAN_OBJECTID; 80 key.type = BTRFS_ORPHAN_ITEM_KEY; 81 key.offset = offset; 82 83 path = btrfs_alloc_path(); 84 if (!path) 85 return -ENOMEM; 86 87 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); 88 89 btrfs_free_path(path); 90 return ret; 91 } 92