1224266Sadrian// SPDX-License-Identifier: GPL-2.0
2224266Sadrian/*
3224266Sadrian * Copyright (c) 2022-2024 Oracle.
4224266Sadrian * All Rights Reserved.
5224266Sadrian */
6224266Sadrian#ifndef	__XFS_PARENT_H__
7224266Sadrian#define	__XFS_PARENT_H__
8224266Sadrian
9224266Sadrian/* Metadata validators */
10224266Sadrianbool xfs_parent_namecheck(unsigned int attr_flags, const void *name,
11224266Sadrian		size_t length);
12224266Sadrianbool xfs_parent_valuecheck(struct xfs_mount *mp, const void *value,
13224266Sadrian		size_t valuelen);
14224266Sadrian
15224266Sadrianxfs_dahash_t xfs_parent_hashval(struct xfs_mount *mp, const uint8_t *name,
16224266Sadrian		int namelen, xfs_ino_t parent_ino);
17224266Sadrianxfs_dahash_t xfs_parent_hashattr(struct xfs_mount *mp, const uint8_t *name,
18224266Sadrian		int namelen, const void *value, int valuelen);
19224266Sadrian
20224266Sadrian/* Initializes a xfs_parent_rec to be stored as an attribute name. */
21224266Sadrianstatic inline void
22224266Sadrianxfs_parent_rec_init(
23224266Sadrian	struct xfs_parent_rec	*rec,
24224266Sadrian	xfs_ino_t		ino,
25224266Sadrian	uint32_t		gen)
26224266Sadrian{
27224266Sadrian	rec->p_ino = cpu_to_be64(ino);
28224266Sadrian	rec->p_gen = cpu_to_be32(gen);
29224266Sadrian}
30224266Sadrian
31224266Sadrian/* Initializes a xfs_parent_rec to be stored as an attribute name. */
32224266Sadrianstatic inline void
33224266Sadrianxfs_inode_to_parent_rec(
34224266Sadrian	struct xfs_parent_rec	*rec,
35224266Sadrian	const struct xfs_inode	*dp)
36224266Sadrian{
37224266Sadrian	xfs_parent_rec_init(rec, dp->i_ino, VFS_IC(dp)->i_generation);
38224266Sadrian}
39224266Sadrian
40224266Sadrianextern struct kmem_cache	*xfs_parent_args_cache;
41224266Sadrian
42224266Sadrian/*
43224266Sadrian * Parent pointer information needed to pass around the deferred xattr update
44224266Sadrian * machinery.
45224266Sadrian */
46224266Sadrianstruct xfs_parent_args {
47224266Sadrian	struct xfs_parent_rec	rec;
48224266Sadrian	struct xfs_parent_rec	new_rec;
49224266Sadrian	struct xfs_da_args	args;
50224266Sadrian};
51224266Sadrian
52224266Sadrian/*
53224266Sadrian * Start a parent pointer update by allocating the context object we need to
54224266Sadrian * perform a parent pointer update.
55224266Sadrian */
56224266Sadrianstatic inline int
57224266Sadrianxfs_parent_start(
58224266Sadrian	struct xfs_mount	*mp,
59224266Sadrian	struct xfs_parent_args	**ppargsp)
60224266Sadrian{
61224266Sadrian	if (!xfs_has_parent(mp)) {
62224266Sadrian		*ppargsp = NULL;
63224266Sadrian		return 0;
64224266Sadrian	}
65224266Sadrian
66224266Sadrian	*ppargsp = kmem_cache_zalloc(xfs_parent_args_cache, GFP_KERNEL);
67224266Sadrian	if (!*ppargsp)
68224266Sadrian		return -ENOMEM;
69224266Sadrian	return 0;
70224266Sadrian}
71224266Sadrian
72224266Sadrian/* Finish a parent pointer update by freeing the context object. */
73224266Sadrianstatic inline void
74224266Sadrianxfs_parent_finish(
75224266Sadrian	struct xfs_mount	*mp,
76224266Sadrian	struct xfs_parent_args	*ppargs)
77224266Sadrian{
78224266Sadrian	if (ppargs)
79224266Sadrian		kmem_cache_free(xfs_parent_args_cache, ppargs);
80224266Sadrian}
81224266Sadrian
82224266Sadrianint xfs_parent_addname(struct xfs_trans *tp, struct xfs_parent_args *ppargs,
83224266Sadrian		struct xfs_inode *dp, const struct xfs_name *parent_name,
84224266Sadrian		struct xfs_inode *child);
85224266Sadrianint xfs_parent_removename(struct xfs_trans *tp, struct xfs_parent_args *ppargs,
86224266Sadrian		struct xfs_inode *dp, const struct xfs_name *parent_name,
87224266Sadrian		struct xfs_inode *child);
88224266Sadrianint xfs_parent_replacename(struct xfs_trans *tp,
89224266Sadrian		struct xfs_parent_args *ppargs,
90224266Sadrian		struct xfs_inode *old_dp, const struct xfs_name *old_name,
91224266Sadrian		struct xfs_inode *new_dp, const struct xfs_name *new_name,
92224266Sadrian		struct xfs_inode *child);
93224266Sadrian
94224266Sadrianint xfs_parent_from_attr(struct xfs_mount *mp, unsigned int attr_flags,
95224266Sadrian		const unsigned char *name, unsigned int namelen,
96224266Sadrian		const void *value, unsigned int valuelen,
97224266Sadrian		xfs_ino_t *parent_ino, uint32_t *parent_gen);
98224266Sadrian
99224266Sadrian/* Repair functions */
100224266Sadrianint xfs_parent_lookup(struct xfs_trans *tp, struct xfs_inode *ip,
101224266Sadrian		const struct xfs_name *name, struct xfs_parent_rec *pptr,
102224266Sadrian		struct xfs_da_args *scratch);
103224266Sadrianint xfs_parent_set(struct xfs_inode *ip, xfs_ino_t owner,
104231710Sadrian		const struct xfs_name *name, struct xfs_parent_rec *pptr,
105231710Sadrian		struct xfs_da_args *scratch);
106224266Sadrianint xfs_parent_unset(struct xfs_inode *ip, xfs_ino_t owner,
107224266Sadrian		const struct xfs_name *name, struct xfs_parent_rec *pptr,
108224266Sadrian		struct xfs_da_args *scratch);
109224266Sadrian
110224266Sadrian#endif /* __XFS_PARENT_H__ */
111224266Sadrian