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