14fcd4de0SKent Overstreet /* SPDX-License-Identifier: GPL-2.0 */ 24fcd4de0SKent Overstreet #ifndef _BCACHEFS_NAMEI_H 34fcd4de0SKent Overstreet #define _BCACHEFS_NAMEI_H 44fcd4de0SKent Overstreet 54fcd4de0SKent Overstreet #include "dirent.h" 64fcd4de0SKent Overstreet 74fcd4de0SKent Overstreet struct posix_acl; 84fcd4de0SKent Overstreet 94fcd4de0SKent Overstreet #define BCH_CREATE_TMPFILE (1U << 0) 104fcd4de0SKent Overstreet #define BCH_CREATE_SUBVOL (1U << 1) 114fcd4de0SKent Overstreet #define BCH_CREATE_SNAPSHOT (1U << 2) 124fcd4de0SKent Overstreet #define BCH_CREATE_SNAPSHOT_RO (1U << 3) 134fcd4de0SKent Overstreet 144fcd4de0SKent Overstreet int bch2_create_trans(struct btree_trans *, subvol_inum, 154fcd4de0SKent Overstreet struct bch_inode_unpacked *, 164fcd4de0SKent Overstreet struct bch_inode_unpacked *, 174fcd4de0SKent Overstreet const struct qstr *, 184fcd4de0SKent Overstreet uid_t, gid_t, umode_t, dev_t, 194fcd4de0SKent Overstreet struct posix_acl *, 204fcd4de0SKent Overstreet struct posix_acl *, 214fcd4de0SKent Overstreet subvol_inum, unsigned); 224fcd4de0SKent Overstreet 234fcd4de0SKent Overstreet int bch2_link_trans(struct btree_trans *, 244fcd4de0SKent Overstreet subvol_inum, struct bch_inode_unpacked *, 254fcd4de0SKent Overstreet subvol_inum, struct bch_inode_unpacked *, 264fcd4de0SKent Overstreet const struct qstr *); 274fcd4de0SKent Overstreet 284fcd4de0SKent Overstreet int bch2_unlink_trans(struct btree_trans *, subvol_inum, 294fcd4de0SKent Overstreet struct bch_inode_unpacked *, 304fcd4de0SKent Overstreet struct bch_inode_unpacked *, 314fcd4de0SKent Overstreet const struct qstr *, bool); 324fcd4de0SKent Overstreet 334fcd4de0SKent Overstreet int bch2_rename_trans(struct btree_trans *, 344fcd4de0SKent Overstreet subvol_inum, struct bch_inode_unpacked *, 354fcd4de0SKent Overstreet subvol_inum, struct bch_inode_unpacked *, 364fcd4de0SKent Overstreet struct bch_inode_unpacked *, 374fcd4de0SKent Overstreet struct bch_inode_unpacked *, 384fcd4de0SKent Overstreet const struct qstr *, 394fcd4de0SKent Overstreet const struct qstr *, 404fcd4de0SKent Overstreet enum bch_rename_mode); 414fcd4de0SKent Overstreet 424fcd4de0SKent Overstreet bool bch2_reinherit_attrs(struct bch_inode_unpacked *, 434fcd4de0SKent Overstreet struct bch_inode_unpacked *); 444fcd4de0SKent Overstreet 454fcd4de0SKent Overstreet int bch2_inum_to_path(struct btree_trans *, subvol_inum, struct printbuf *); 464fcd4de0SKent Overstreet 47*9b0d00a3SKent Overstreet int __bch2_check_dirent_target(struct btree_trans *, 48758ea4ffSKent Overstreet struct btree_iter *, 49758ea4ffSKent Overstreet struct bkey_s_c_dirent, 50*9b0d00a3SKent Overstreet struct bch_inode_unpacked *, bool); 51*9b0d00a3SKent Overstreet 52*9b0d00a3SKent Overstreet static inline bool inode_points_to_dirent(struct bch_inode_unpacked *inode, 53*9b0d00a3SKent Overstreet struct bkey_s_c_dirent d) 54*9b0d00a3SKent Overstreet { 55*9b0d00a3SKent Overstreet return inode->bi_dir == d.k->p.inode && 56*9b0d00a3SKent Overstreet inode->bi_dir_offset == d.k->p.offset; 57*9b0d00a3SKent Overstreet } 58*9b0d00a3SKent Overstreet 59*9b0d00a3SKent Overstreet static inline int bch2_check_dirent_target(struct btree_trans *trans, 60*9b0d00a3SKent Overstreet struct btree_iter *dirent_iter, 61*9b0d00a3SKent Overstreet struct bkey_s_c_dirent d, 62*9b0d00a3SKent Overstreet struct bch_inode_unpacked *target, 63*9b0d00a3SKent Overstreet bool in_fsck) 64*9b0d00a3SKent Overstreet { 65*9b0d00a3SKent Overstreet if (likely(inode_points_to_dirent(target, d) && 66*9b0d00a3SKent Overstreet d.v->d_type == inode_d_type(target))) 67*9b0d00a3SKent Overstreet return 0; 68*9b0d00a3SKent Overstreet 69*9b0d00a3SKent Overstreet return __bch2_check_dirent_target(trans, dirent_iter, d, target, in_fsck); 70*9b0d00a3SKent Overstreet } 71758ea4ffSKent Overstreet 724fcd4de0SKent Overstreet #endif /* _BCACHEFS_NAMEI_H */ 73