^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* -*- mode: c; c-basic-offset: 8; -*-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * vim: noexpandtab sw=8 ts=8 sts=0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * dir.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Function prototypes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Copyright (C) 2002, 2004 Oracle. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifndef OCFS2_DIR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define OCFS2_DIR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) struct ocfs2_dx_hinfo {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) u32 major_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) u32 minor_hash;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) struct ocfs2_dir_lookup_result {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct buffer_head *dl_leaf_bh; /* Unindexed leaf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct ocfs2_dir_entry *dl_entry; /* Target dirent in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * unindexed leaf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct buffer_head *dl_dx_root_bh; /* Root of indexed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct buffer_head *dl_dx_leaf_bh; /* Indexed leaf block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct ocfs2_dx_entry *dl_dx_entry; /* Target dx_entry in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * indexed leaf */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct ocfs2_dx_hinfo dl_hinfo; /* Name hash results */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct buffer_head *dl_prev_leaf_bh;/* Previous entry in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * dir free space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * list. NULL if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * previous entry is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * dx root block. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) void ocfs2_free_dir_lookup_result(struct ocfs2_dir_lookup_result *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) int ocfs2_find_entry(const char *name, int namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct ocfs2_dir_lookup_result *lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) int ocfs2_delete_entry(handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct ocfs2_dir_lookup_result *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int __ocfs2_add_entry(handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) const char *name, int namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct inode *inode, u64 blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct buffer_head *parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct ocfs2_dir_lookup_result *lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) static inline int ocfs2_add_entry(handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct dentry *dentry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct inode *inode, u64 blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct buffer_head *parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct ocfs2_dir_lookup_result *lookup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) return __ocfs2_add_entry(handle, d_inode(dentry->d_parent),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) dentry->d_name.name, dentry->d_name.len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) inode, blkno, parent_fe_bh, lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) int ocfs2_update_entry(struct inode *dir, handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct ocfs2_dir_lookup_result *res,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct inode *new_entry_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int ocfs2_check_dir_for_entry(struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int namelen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) int ocfs2_empty_dir(struct inode *inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) int ocfs2_find_files_on_disk(const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) int namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) u64 *blkno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct ocfs2_dir_lookup_result *res);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) int ocfs2_lookup_ino_from_name(struct inode *dir, const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) int namelen, u64 *blkno);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) int ocfs2_readdir(struct file *file, struct dir_context *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) int ocfs2_dir_foreach(struct inode *inode, struct dir_context *ctx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) int ocfs2_prepare_dir_for_insert(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) struct inode *dir,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct buffer_head *parent_fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) int namelen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct ocfs2_dir_lookup_result *lookup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct ocfs2_alloc_context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) int ocfs2_fill_new_dir(struct ocfs2_super *osb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) handle_t *handle,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) struct inode *parent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct buffer_head *fe_bh,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct ocfs2_alloc_context *data_ac,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) struct ocfs2_alloc_context *meta_ac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) int ocfs2_dx_dir_truncate(struct inode *dir, struct buffer_head *di_bh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) struct ocfs2_dir_block_trailer *ocfs2_dir_trailer_from_size(int blocksize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #endif /* OCFS2_DIR_H */