xref: /linux/fs/btrfs/orphan.c (revision 41e0d49104dbff888ef6446ea46842fde66c0a76)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2008 Red Hat.  All rights reserved.
4  */
5 
6 #include "ctree.h"
7 #include "disk-io.h"
8 #include "orphan.h"
9 
10 int btrfs_insert_orphan_item(struct btrfs_trans_handle *trans,
11 			     struct btrfs_root *root, u64 offset)
12 {
13 	struct btrfs_path *path;
14 	struct btrfs_key key;
15 	int ret = 0;
16 
17 	key.objectid = BTRFS_ORPHAN_OBJECTID;
18 	key.type = BTRFS_ORPHAN_ITEM_KEY;
19 	key.offset = offset;
20 
21 	path = btrfs_alloc_path();
22 	if (!path)
23 		return -ENOMEM;
24 
25 	ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
26 
27 	btrfs_free_path(path);
28 	return ret;
29 }
30 
31 int btrfs_del_orphan_item(struct btrfs_trans_handle *trans,
32 			  struct btrfs_root *root, u64 offset)
33 {
34 	struct btrfs_path *path;
35 	struct btrfs_key key;
36 	int ret = 0;
37 
38 	key.objectid = BTRFS_ORPHAN_OBJECTID;
39 	key.type = BTRFS_ORPHAN_ITEM_KEY;
40 	key.offset = offset;
41 
42 	path = btrfs_alloc_path();
43 	if (!path)
44 		return -ENOMEM;
45 
46 	ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
47 	if (ret < 0)
48 		goto out;
49 	if (ret) { /* JDM: Really? */
50 		ret = -ENOENT;
51 		goto out;
52 	}
53 
54 	ret = btrfs_del_item(trans, root, path);
55 
56 out:
57 	btrfs_free_path(path);
58 	return ret;
59 }
60