xref: /kernel/linux/linux-5.10/fs/btrfs/orphan.c (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2008 Red Hat.  All rights reserved.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include "ctree.h"
78c2ecf20Sopenharmony_ci#include "disk-io.h"
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ciint btrfs_insert_orphan_item(struct btrfs_trans_handle *trans,
108c2ecf20Sopenharmony_ci			     struct btrfs_root *root, u64 offset)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	struct btrfs_path *path;
138c2ecf20Sopenharmony_ci	struct btrfs_key key;
148c2ecf20Sopenharmony_ci	int ret = 0;
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci	key.objectid = BTRFS_ORPHAN_OBJECTID;
178c2ecf20Sopenharmony_ci	key.type = BTRFS_ORPHAN_ITEM_KEY;
188c2ecf20Sopenharmony_ci	key.offset = offset;
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	path = btrfs_alloc_path();
218c2ecf20Sopenharmony_ci	if (!path)
228c2ecf20Sopenharmony_ci		return -ENOMEM;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	btrfs_free_path(path);
278c2ecf20Sopenharmony_ci	return ret;
288c2ecf20Sopenharmony_ci}
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ciint btrfs_del_orphan_item(struct btrfs_trans_handle *trans,
318c2ecf20Sopenharmony_ci			  struct btrfs_root *root, u64 offset)
328c2ecf20Sopenharmony_ci{
338c2ecf20Sopenharmony_ci	struct btrfs_path *path;
348c2ecf20Sopenharmony_ci	struct btrfs_key key;
358c2ecf20Sopenharmony_ci	int ret = 0;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	key.objectid = BTRFS_ORPHAN_OBJECTID;
388c2ecf20Sopenharmony_ci	key.type = BTRFS_ORPHAN_ITEM_KEY;
398c2ecf20Sopenharmony_ci	key.offset = offset;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	path = btrfs_alloc_path();
428c2ecf20Sopenharmony_ci	if (!path)
438c2ecf20Sopenharmony_ci		return -ENOMEM;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
468c2ecf20Sopenharmony_ci	if (ret < 0)
478c2ecf20Sopenharmony_ci		goto out;
488c2ecf20Sopenharmony_ci	if (ret) { /* JDM: Really? */
498c2ecf20Sopenharmony_ci		ret = -ENOENT;
508c2ecf20Sopenharmony_ci		goto out;
518c2ecf20Sopenharmony_ci	}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	ret = btrfs_del_item(trans, root, path);
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ciout:
568c2ecf20Sopenharmony_ci	btrfs_free_path(path);
578c2ecf20Sopenharmony_ci	return ret;
588c2ecf20Sopenharmony_ci}
59