#include "bcachefs.h"
#include "btree_key_cache.h"
#include "btree_update.h"
#include "errcode.h"
#include "error.h"
#include "fs.h"
#include "snapshot.h"
#include "subvolume.h"
#include <linux/random.h>
static int bch2_subvolume_delete(struct btree_trans *, u32);
static struct bpos subvolume_children_pos(struct bkey_s_c k)
{ … }
static int check_subvol(struct btree_trans *trans,
struct btree_iter *iter,
struct bkey_s_c k)
{ … }
int bch2_check_subvols(struct bch_fs *c)
{ … }
static int check_subvol_child(struct btree_trans *trans,
struct btree_iter *child_iter,
struct bkey_s_c child_k)
{ … }
int bch2_check_subvol_children(struct bch_fs *c)
{ … }
int bch2_subvolume_invalid(struct bch_fs *c, struct bkey_s_c k,
enum bch_validate_flags flags, struct printbuf *err)
{ … }
void bch2_subvolume_to_text(struct printbuf *out, struct bch_fs *c,
struct bkey_s_c k)
{ … }
static int subvolume_children_mod(struct btree_trans *trans, struct bpos pos, bool set)
{ … }
int bch2_subvolume_trigger(struct btree_trans *trans,
enum btree_id btree_id, unsigned level,
struct bkey_s_c old, struct bkey_s new,
enum btree_iter_update_trigger_flags flags)
{ … }
int bch2_subvol_has_children(struct btree_trans *trans, u32 subvol)
{ … }
static __always_inline int
bch2_subvolume_get_inlined(struct btree_trans *trans, unsigned subvol,
bool inconsistent_if_not_found,
int iter_flags,
struct bch_subvolume *s)
{ … }
int bch2_subvolume_get(struct btree_trans *trans, unsigned subvol,
bool inconsistent_if_not_found,
int iter_flags,
struct bch_subvolume *s)
{ … }
int bch2_subvol_is_ro_trans(struct btree_trans *trans, u32 subvol)
{ … }
int bch2_subvol_is_ro(struct bch_fs *c, u32 subvol)
{ … }
int bch2_snapshot_get_subvol(struct btree_trans *trans, u32 snapshot,
struct bch_subvolume *subvol)
{ … }
int bch2_subvolume_get_snapshot(struct btree_trans *trans, u32 subvolid,
u32 *snapid)
{ … }
static int bch2_subvolume_reparent(struct btree_trans *trans,
struct btree_iter *iter,
struct bkey_s_c k,
u32 old_parent, u32 new_parent)
{ … }
static int bch2_subvolumes_reparent(struct btree_trans *trans, u32 subvolid_to_delete)
{ … }
static int __bch2_subvolume_delete(struct btree_trans *trans, u32 subvolid)
{ … }
static int bch2_subvolume_delete(struct btree_trans *trans, u32 subvolid)
{ … }
static void bch2_subvolume_wait_for_pagecache_and_delete(struct work_struct *work)
{ … }
struct subvolume_unlink_hook { … };
static int bch2_subvolume_wait_for_pagecache_and_delete_hook(struct btree_trans *trans,
struct btree_trans_commit_hook *_h)
{ … }
int bch2_subvolume_unlink(struct btree_trans *trans, u32 subvolid)
{ … }
int bch2_subvolume_create(struct btree_trans *trans, u64 inode,
u32 parent_subvolid,
u32 src_subvolid,
u32 *new_subvolid,
u32 *new_snapshotid,
bool ro)
{ … }
int bch2_initialize_subvolumes(struct bch_fs *c)
{ … }
static int __bch2_fs_upgrade_for_subvolumes(struct btree_trans *trans)
{ … }
int bch2_fs_upgrade_for_subvolumes(struct bch_fs *c)
{ … }
int bch2_fs_subvolumes_init(struct bch_fs *c)
{ … }