1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2022-2024 Oracle.
4 * All Rights Reserved.
5 */
6#ifndef	__XFS_PARENT_H__
7#define	__XFS_PARENT_H__
8
9/* Metadata validators */
10bool xfs_parent_namecheck(unsigned int attr_flags, const void *name,
11		size_t length);
12bool xfs_parent_valuecheck(struct xfs_mount *mp, const void *value,
13		size_t valuelen);
14
15xfs_dahash_t xfs_parent_hashval(struct xfs_mount *mp, const uint8_t *name,
16		int namelen, xfs_ino_t parent_ino);
17xfs_dahash_t xfs_parent_hashattr(struct xfs_mount *mp, const uint8_t *name,
18		int namelen, const void *value, int valuelen);
19
20/* Initializes a xfs_parent_rec to be stored as an attribute name. */
21static inline void
22xfs_parent_rec_init(
23	struct xfs_parent_rec	*rec,
24	xfs_ino_t		ino,
25	uint32_t		gen)
26{
27	rec->p_ino = cpu_to_be64(ino);
28	rec->p_gen = cpu_to_be32(gen);
29}
30
31/* Initializes a xfs_parent_rec to be stored as an attribute name. */
32static inline void
33xfs_inode_to_parent_rec(
34	struct xfs_parent_rec	*rec,
35	const struct xfs_inode	*dp)
36{
37	xfs_parent_rec_init(rec, dp->i_ino, VFS_IC(dp)->i_generation);
38}
39
40extern struct kmem_cache	*xfs_parent_args_cache;
41
42/*
43 * Parent pointer information needed to pass around the deferred xattr update
44 * machinery.
45 */
46struct xfs_parent_args {
47	struct xfs_parent_rec	rec;
48	struct xfs_parent_rec	new_rec;
49	struct xfs_da_args	args;
50};
51
52/*
53 * Start a parent pointer update by allocating the context object we need to
54 * perform a parent pointer update.
55 */
56static inline int
57xfs_parent_start(
58	struct xfs_mount	*mp,
59	struct xfs_parent_args	**ppargsp)
60{
61	if (!xfs_has_parent(mp)) {
62		*ppargsp = NULL;
63		return 0;
64	}
65
66	*ppargsp = kmem_cache_zalloc(xfs_parent_args_cache, GFP_KERNEL);
67	if (!*ppargsp)
68		return -ENOMEM;
69	return 0;
70}
71
72/* Finish a parent pointer update by freeing the context object. */
73static inline void
74xfs_parent_finish(
75	struct xfs_mount	*mp,
76	struct xfs_parent_args	*ppargs)
77{
78	if (ppargs)
79		kmem_cache_free(xfs_parent_args_cache, ppargs);
80}
81
82int xfs_parent_addname(struct xfs_trans *tp, struct xfs_parent_args *ppargs,
83		struct xfs_inode *dp, const struct xfs_name *parent_name,
84		struct xfs_inode *child);
85int xfs_parent_removename(struct xfs_trans *tp, struct xfs_parent_args *ppargs,
86		struct xfs_inode *dp, const struct xfs_name *parent_name,
87		struct xfs_inode *child);
88int xfs_parent_replacename(struct xfs_trans *tp,
89		struct xfs_parent_args *ppargs,
90		struct xfs_inode *old_dp, const struct xfs_name *old_name,
91		struct xfs_inode *new_dp, const struct xfs_name *new_name,
92		struct xfs_inode *child);
93
94int xfs_parent_from_attr(struct xfs_mount *mp, unsigned int attr_flags,
95		const unsigned char *name, unsigned int namelen,
96		const void *value, unsigned int valuelen,
97		xfs_ino_t *parent_ino, uint32_t *parent_gen);
98
99/* Repair functions */
100int xfs_parent_lookup(struct xfs_trans *tp, struct xfs_inode *ip,
101		const struct xfs_name *name, struct xfs_parent_rec *pptr,
102		struct xfs_da_args *scratch);
103int xfs_parent_set(struct xfs_inode *ip, xfs_ino_t owner,
104		const struct xfs_name *name, struct xfs_parent_rec *pptr,
105		struct xfs_da_args *scratch);
106int xfs_parent_unset(struct xfs_inode *ip, xfs_ino_t owner,
107		const struct xfs_name *name, struct xfs_parent_rec *pptr,
108		struct xfs_da_args *scratch);
109
110#endif /* __XFS_PARENT_H__ */
111