162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * fs/hmdfs/hmdfs_dentryfile.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef HMDFS_DENTRYFILE_H 962306a36Sopenharmony_ci#define HMDFS_DENTRYFILE_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "hmdfs.h" 1262306a36Sopenharmony_ci#include <linux/namei.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* use for escape from hmdfs file system, hmdfs hide follow names */ 1562306a36Sopenharmony_ci#define CURRENT_DIR "." 1662306a36Sopenharmony_ci#define PARENT_DIR ".." 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* local dentry cache data */ 1962306a36Sopenharmony_ci#define DENTRY_FILE_XATTR_NAME "user.hmdfs_cache" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define DENTRY_FILE_NAME_RETRY 10 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define MAX_BUCKET_LEVEL 63 2462306a36Sopenharmony_ci#define BUCKET_BLOCKS 2 2562306a36Sopenharmony_ci#define MAX_DIR_BUCKETS (1 << ((MAX_BUCKET_LEVEL / 2) - 1)) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define CONFLICTING_FILE_CONST_SUFFIX "_conflict_dev" 2862306a36Sopenharmony_ci#define CONFLICTING_FILE_SUFFIX "_conflict_dev%u" 2962306a36Sopenharmony_ci#define CONFLICTING_DIR_SUFFIX "_remote_directory" 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define POS_BIT_NUM 64 3262306a36Sopenharmony_ci#define DEV_ID_BIT_NUM 16 3362306a36Sopenharmony_ci#define GROUP_ID_BIT_NUM 39 3462306a36Sopenharmony_ci#define OFFSET_BIT_NUM 8 3562306a36Sopenharmony_ci#define OFFSET_BIT_MASK 0xFF 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define DEFAULT_DCACHE_TIMEOUT 30 3862306a36Sopenharmony_ci#define DEFAULT_DCACHE_PRECISION 10 3962306a36Sopenharmony_ci#define DEFAULT_DCACHE_THRESHOLD 1000 4062306a36Sopenharmony_ci#define HMDFS_STALE_REMOTE_ISIZE ULLONG_MAX 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/* Seconds per-week */ 4362306a36Sopenharmony_ci#define MAX_DCACHE_TIMEOUT 604800 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct hmdfs_iterate_callback { 4662306a36Sopenharmony_ci struct dir_context ctx; 4762306a36Sopenharmony_ci struct dir_context *caller; 4862306a36Sopenharmony_ci int result; 4962306a36Sopenharmony_ci struct rb_root *root; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* 5362306a36Sopenharmony_ci * 4096 = version(1) + bitmap(10) + reserved(5) 5462306a36Sopenharmony_ci * + nsl(80 * 43) + filename(80 * 8) 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci#define DENTRYGROUP_SIZE 4096 5762306a36Sopenharmony_ci#define DENTRY_NAME_LEN 8 5862306a36Sopenharmony_ci#define DENTRY_RESERVED_LENGTH 3 5962306a36Sopenharmony_ci#define DENTRY_PER_GROUP 80 6062306a36Sopenharmony_ci#define DENTRY_BITMAP_LENGTH 10 6162306a36Sopenharmony_ci#define DENTRY_GROUP_RESERVED 5 6262306a36Sopenharmony_ci#define DENTRYGROUP_HEADER 4096 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct hmdfs_dentry { 6562306a36Sopenharmony_ci __le32 hash; 6662306a36Sopenharmony_ci __le16 i_mode; 6762306a36Sopenharmony_ci __le16 namelen; 6862306a36Sopenharmony_ci __le64 i_size; 6962306a36Sopenharmony_ci /* modification time */ 7062306a36Sopenharmony_ci __le64 i_mtime; 7162306a36Sopenharmony_ci /* modification time in nano scale */ 7262306a36Sopenharmony_ci __le32 i_mtime_nsec; 7362306a36Sopenharmony_ci /* combination of inode number and generation */ 7462306a36Sopenharmony_ci __le64 i_ino; 7562306a36Sopenharmony_ci __le32 i_flag; 7662306a36Sopenharmony_ci /* reserved bytes for long term extend, total 43 bytes */ 7762306a36Sopenharmony_ci __u8 reserved[DENTRY_RESERVED_LENGTH]; 7862306a36Sopenharmony_ci} __packed; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/* 4K/51 Bytes = 80 dentries for per dentrygroup */ 8162306a36Sopenharmony_cistruct hmdfs_dentry_group { 8262306a36Sopenharmony_ci __u8 dentry_version; /* dentry version start from 1 */ 8362306a36Sopenharmony_ci __u8 bitmap[DENTRY_BITMAP_LENGTH]; 8462306a36Sopenharmony_ci struct hmdfs_dentry nsl[DENTRY_PER_GROUP]; 8562306a36Sopenharmony_ci __u8 filename[DENTRY_PER_GROUP][DENTRY_NAME_LEN]; 8662306a36Sopenharmony_ci __u8 reserved[DENTRY_GROUP_RESERVED]; 8762306a36Sopenharmony_ci} __packed; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/** 9062306a36Sopenharmony_ci * The content of 1st 4k block in dentryfile.dat. 9162306a36Sopenharmony_ci * Used for check whether the dcache can be used directly or 9262306a36Sopenharmony_ci * need to rebuild. 9362306a36Sopenharmony_ci * 9462306a36Sopenharmony_ci * Since the ctime has 10ms or less precision, if the dcache 9562306a36Sopenharmony_ci * rebuild at the same time of the dentry inode ctime, maybe 9662306a36Sopenharmony_ci * non-consistent in dcache. 9762306a36Sopenharmony_ci * eg: create 1.jpg 2.jpg 3.jpg 9862306a36Sopenharmony_ci * dcache rebuild may only has 1.jpg 2.jpg 9962306a36Sopenharmony_ci * So, we need use these time to verify the dcache. 10062306a36Sopenharmony_ci */ 10162306a36Sopenharmony_cistruct hmdfs_dcache_header { 10262306a36Sopenharmony_ci /* The time of dcache rebuild */ 10362306a36Sopenharmony_ci __le64 dcache_crtime; 10462306a36Sopenharmony_ci __le64 dcache_crtime_nsec; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci /* The directory inode ctime when dcache rebuild */ 10762306a36Sopenharmony_ci __le64 dentry_ctime; 10862306a36Sopenharmony_ci __le64 dentry_ctime_nsec; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci /* The dentry count */ 11162306a36Sopenharmony_ci __le64 num; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci /* The case sensitive */ 11462306a36Sopenharmony_ci __u8 case_sensitive; 11562306a36Sopenharmony_ci} __packed; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cistatic inline loff_t get_dentry_group_pos(unsigned int bidx) 11862306a36Sopenharmony_ci{ 11962306a36Sopenharmony_ci return ((loff_t)bidx) * DENTRYGROUP_SIZE + DENTRYGROUP_HEADER; 12062306a36Sopenharmony_ci} 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistatic inline unsigned int get_dentry_group_cnt(struct inode *inode) 12362306a36Sopenharmony_ci{ 12462306a36Sopenharmony_ci loff_t size = i_size_read(inode); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci return size >= DENTRYGROUP_HEADER ? 12762306a36Sopenharmony_ci (size - DENTRYGROUP_HEADER) / DENTRYGROUP_SIZE : 12862306a36Sopenharmony_ci 0; 12962306a36Sopenharmony_ci} 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci#define DENTRY_NAME_MAX_LEN (DENTRY_PER_GROUP * DENTRY_NAME_LEN) 13262306a36Sopenharmony_ci#define BITS_PER_BYTE 8 13362306a36Sopenharmony_ci#define HMDFS_SLOT_LEN_BITS 3 13462306a36Sopenharmony_ci#define get_dentry_slots(x) (((x) + BITS_PER_BYTE - 1) >> HMDFS_SLOT_LEN_BITS) 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#define INUNUMBER_START 10000000 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci#ifdef CONFIG_HMDFS_FS_PERMISSION 13962306a36Sopenharmony_ci#define DENTRY_FILE_PERM 0660 14062306a36Sopenharmony_ci#else 14162306a36Sopenharmony_ci#define DENTRY_FILE_PERM 0666 14262306a36Sopenharmony_ci#endif 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cistruct hmdfs_dcache_lookup_ctx { 14562306a36Sopenharmony_ci struct hmdfs_sb_info *sbi; 14662306a36Sopenharmony_ci const struct qstr *name; 14762306a36Sopenharmony_ci struct file *filp; 14862306a36Sopenharmony_ci __u32 hash; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci /* for case sensitive */ 15162306a36Sopenharmony_ci unsigned int bidx; 15262306a36Sopenharmony_ci struct hmdfs_dentry_group *page; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci /* for case insensitive */ 15562306a36Sopenharmony_ci struct hmdfs_dentry *insense_de; 15662306a36Sopenharmony_ci unsigned int insense_bidx; 15762306a36Sopenharmony_ci struct hmdfs_dentry_group *insense_page; 15862306a36Sopenharmony_ci}; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ciextern void hmdfs_init_dcache_lookup_ctx(struct hmdfs_dcache_lookup_ctx *ctx, 16162306a36Sopenharmony_ci struct hmdfs_sb_info *sbi, 16262306a36Sopenharmony_ci const struct qstr *qstr, 16362306a36Sopenharmony_ci struct file *filp); 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ciint create_dentry(struct dentry *child_dentry, struct inode *inode, 16662306a36Sopenharmony_ci struct file *file, struct hmdfs_sb_info *sbi); 16762306a36Sopenharmony_ciint read_dentry(struct hmdfs_sb_info *sbi, char *file_name, 16862306a36Sopenharmony_ci struct dir_context *ctx); 16962306a36Sopenharmony_cistruct hmdfs_dentry *hmdfs_find_dentry(struct dentry *child_dentry, 17062306a36Sopenharmony_ci struct hmdfs_dcache_lookup_ctx *ctx); 17162306a36Sopenharmony_civoid hmdfs_delete_dentry(struct dentry *d, struct file *filp); 17262306a36Sopenharmony_ciint hmdfs_rename_dentry(struct dentry *old_dentry, struct dentry *new_dentry, 17362306a36Sopenharmony_ci struct file *old_filp, struct file *new_filp); 17462306a36Sopenharmony_ciint get_inonumber(void); 17562306a36Sopenharmony_cistruct file *create_local_dentry_file_cache(struct hmdfs_sb_info *sbi); 17662306a36Sopenharmony_ciint update_inode_to_dentry(struct dentry *child_dentry, struct inode *inode); 17762306a36Sopenharmony_cistruct file *cache_file_persistent(struct hmdfs_peer *con, struct file *filp, 17862306a36Sopenharmony_ci const char *relative_path, bool server); 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci#define HMDFS_TYPE_COMMON 0 18162306a36Sopenharmony_ci#define HMDFS_TYPE_DOT 1 18262306a36Sopenharmony_ci#define HMDFS_TYPE_DENTRY 2 18362306a36Sopenharmony_ci#define HMDFS_TYPE_DENTRY_CACHE 3 18462306a36Sopenharmony_ciint hmdfs_file_type(const char *name); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ciloff_t hmdfs_set_pos(unsigned long dev_id, unsigned long group_id, 18762306a36Sopenharmony_ci unsigned long offset); 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistruct getdents_callback_real { 19062306a36Sopenharmony_ci struct dir_context ctx; 19162306a36Sopenharmony_ci struct path *parent_path; 19262306a36Sopenharmony_ci loff_t num; 19362306a36Sopenharmony_ci struct file *file; 19462306a36Sopenharmony_ci struct hmdfs_sb_info *sbi; 19562306a36Sopenharmony_ci const char *dir; 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cistruct file *hmdfs_server_rebuild_dents(struct hmdfs_sb_info *sbi, 19962306a36Sopenharmony_ci struct path *path, loff_t *num, 20062306a36Sopenharmony_ci const char *dir); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci#define DCACHE_LIFETIME 30 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistruct clearcache_item { 20562306a36Sopenharmony_ci uint64_t dev_id; 20662306a36Sopenharmony_ci struct file *filp; 20762306a36Sopenharmony_ci unsigned long time; 20862306a36Sopenharmony_ci struct list_head list; 20962306a36Sopenharmony_ci struct kref ref; 21062306a36Sopenharmony_ci struct hmdfs_dentry_info *d_info; 21162306a36Sopenharmony_ci}; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_civoid hmdfs_add_remote_cache_list(struct hmdfs_peer *con, const char *dir_path); 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_cistruct remotecache_item { 21662306a36Sopenharmony_ci struct hmdfs_peer *con; 21762306a36Sopenharmony_ci struct list_head list; 21862306a36Sopenharmony_ci __u8 drop_flag; 21962306a36Sopenharmony_ci}; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci#define HMDFS_CFN_CID_SIZE 65 22262306a36Sopenharmony_ci#define HMDFS_SERVER_CID "" 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_cistruct cache_file_node { 22562306a36Sopenharmony_ci struct list_head list; 22662306a36Sopenharmony_ci struct hmdfs_sb_info *sbi; 22762306a36Sopenharmony_ci char *relative_path; 22862306a36Sopenharmony_ci u8 cid[HMDFS_CFN_CID_SIZE]; 22962306a36Sopenharmony_ci refcount_t ref; 23062306a36Sopenharmony_ci bool server; 23162306a36Sopenharmony_ci struct file *filp; 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistruct cache_file_item { 23562306a36Sopenharmony_ci struct list_head list; 23662306a36Sopenharmony_ci const char *name; 23762306a36Sopenharmony_ci}; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cistruct cache_file_callback { 24062306a36Sopenharmony_ci struct dir_context ctx; 24162306a36Sopenharmony_ci const char *dirname; 24262306a36Sopenharmony_ci struct hmdfs_sb_info *sbi; 24362306a36Sopenharmony_ci bool server; 24462306a36Sopenharmony_ci struct list_head list; 24562306a36Sopenharmony_ci}; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ciint hmdfs_drop_remote_cache_dents(struct dentry *dentry); 24862306a36Sopenharmony_civoid hmdfs_send_drop_push(struct hmdfs_peer *con, const char *path); 24962306a36Sopenharmony_civoid hmdfs_mark_drop_flag(uint64_t device_id, struct dentry *dentry); 25062306a36Sopenharmony_civoid hmdfs_clear_drop_flag(struct dentry *dentry); 25162306a36Sopenharmony_civoid delete_in_cache_file(uint64_t dev_id, struct dentry *dentry); 25262306a36Sopenharmony_civoid create_in_cache_file(uint64_t dev_id, struct dentry *dentry); 25362306a36Sopenharmony_cistruct clearcache_item *hmdfs_find_cache_item(uint64_t dev_id, 25462306a36Sopenharmony_ci struct dentry *dentry); 25562306a36Sopenharmony_cibool hmdfs_cache_revalidate(unsigned long conn_time, uint64_t dev_id, 25662306a36Sopenharmony_ci struct dentry *dentry); 25762306a36Sopenharmony_civoid hmdfs_remove_cache_filp(struct hmdfs_peer *con, struct dentry *dentry); 25862306a36Sopenharmony_ciint hmdfs_add_cache_list(uint64_t dev_id, struct dentry *dentry, 25962306a36Sopenharmony_ci struct file *filp); 26062306a36Sopenharmony_ciint hmdfs_clear_cache_dents(struct dentry *dentry, bool remove_cache); 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ciint hmdfs_root_unlink(uint64_t device_id, struct path *root_path, 26362306a36Sopenharmony_ci const char *unlink_dir, const char *unlink_name); 26462306a36Sopenharmony_cistruct dentry *hmdfs_root_mkdir(uint64_t device_id, const char *local_dst_path, 26562306a36Sopenharmony_ci const char *mkdir_dir, const char *mkdir_name, 26662306a36Sopenharmony_ci umode_t mode); 26762306a36Sopenharmony_cistruct dentry *hmdfs_root_create(uint64_t device_id, const char *local_dst_path, 26862306a36Sopenharmony_ci const char *create_dir, 26962306a36Sopenharmony_ci const char *create_name, 27062306a36Sopenharmony_ci umode_t mode, bool want_excl); 27162306a36Sopenharmony_ciint hmdfs_root_rmdir(uint64_t device_id, struct path *root_path, 27262306a36Sopenharmony_ci const char *rmdir_dir, const char *rmdir_name); 27362306a36Sopenharmony_ciint hmdfs_root_rename(struct hmdfs_sb_info *sbi, uint64_t device_id, 27462306a36Sopenharmony_ci const char *oldpath, const char *oldname, 27562306a36Sopenharmony_ci const char *newpath, const char *newname, 27662306a36Sopenharmony_ci unsigned int flags); 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ciint hmdfs_get_path_in_sb(struct super_block *sb, const char *name, 27962306a36Sopenharmony_ci unsigned int flags, struct path *path); 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ciint hmdfs_wlock_file(struct file *filp, loff_t start, loff_t len); 28262306a36Sopenharmony_ciint hmdfs_rlock_file(struct file *filp, loff_t start, loff_t len); 28362306a36Sopenharmony_ciint hmdfs_unlock_file(struct file *filp, loff_t start, loff_t len); 28462306a36Sopenharmony_cilong cache_file_truncate(struct hmdfs_sb_info *sbi, const struct path *path, 28562306a36Sopenharmony_ci loff_t length); 28662306a36Sopenharmony_cissize_t cache_file_read(struct hmdfs_sb_info *sbi, struct file *filp, void *buf, 28762306a36Sopenharmony_ci size_t count, loff_t *pos); 28862306a36Sopenharmony_cissize_t cache_file_write(struct hmdfs_sb_info *sbi, struct file *filp, 28962306a36Sopenharmony_ci const void *buf, size_t count, loff_t *pos); 29062306a36Sopenharmony_ciint hmdfs_metainfo_read_nocred(struct file *filp, 29162306a36Sopenharmony_ci void *buffer, int size, int bidx); 29262306a36Sopenharmony_ciint hmdfs_metainfo_read(struct hmdfs_sb_info *sbi, struct file *filp, 29362306a36Sopenharmony_ci void *buffer, int buffersize, int bidx); 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_cibool get_remote_dentry_file(struct dentry *dentry, struct hmdfs_peer *con); 29662306a36Sopenharmony_civoid get_remote_dentry_file_sync(struct dentry *dentry, struct hmdfs_peer *con); 29762306a36Sopenharmony_ciint get_cloud_cache_file(struct dentry *dentry, struct hmdfs_sb_info *sbi); 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_civoid release_cache_item(struct kref *ref); 30062306a36Sopenharmony_civoid remove_cache_item(struct clearcache_item *item); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_civoid hmdfs_cfn_load(struct hmdfs_sb_info *sbi); 30362306a36Sopenharmony_civoid hmdfs_cfn_destroy(struct hmdfs_sb_info *sbi); 30462306a36Sopenharmony_cistruct cache_file_node *find_cfn(struct hmdfs_sb_info *sbi, const char *cid, 30562306a36Sopenharmony_ci const char *path, bool server); 30662306a36Sopenharmony_civoid release_cfn(struct cache_file_node *cfn); 30762306a36Sopenharmony_civoid destroy_cfn(struct hmdfs_sb_info *sbi); 30862306a36Sopenharmony_civoid remove_cfn(struct cache_file_node *cfn); 30962306a36Sopenharmony_ciint delete_dentry_file(struct file *filp); 31062306a36Sopenharmony_cistruct file *hmdfs_server_cache_revalidate(struct hmdfs_sb_info *sbi, 31162306a36Sopenharmony_ci const char *recvpath, 31262306a36Sopenharmony_ci struct path *path); 31362306a36Sopenharmony_ciint write_header(struct file *filp, struct hmdfs_dcache_header *header); 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cistatic inline struct list_head *get_list_head(struct hmdfs_sb_info *sbi, 31662306a36Sopenharmony_ci bool server) 31762306a36Sopenharmony_ci{ 31862306a36Sopenharmony_ci return ((server) ? &(sbi)->server_cache : &(sbi)->client_cache); 31962306a36Sopenharmony_ci} 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci/* 32262306a36Sopenharmony_ci * generate_u64_ino - generate a new 64 bit inode number 32362306a36Sopenharmony_ci * 32462306a36Sopenharmony_ci * @ino: origin 32 bit inode number 32562306a36Sopenharmony_ci * @generation: origin 32 bit inode generation 32662306a36Sopenharmony_ci * 32762306a36Sopenharmony_ci * We need both remote inode number and generation to ensure the uniqueness of 32862306a36Sopenharmony_ci * the local inode, thus we store inode->i_ino in lower 32 bits, and 32962306a36Sopenharmony_ci * inode->i_generation in higher 32 bits. 33062306a36Sopenharmony_ci */ 33162306a36Sopenharmony_cistatic inline uint64_t generate_u64_ino(unsigned long ino, 33262306a36Sopenharmony_ci unsigned int generation) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci return (uint64_t)ino | ((uint64_t)generation << 32); 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic inline bool cache_item_revalidate(unsigned long conn_time, 33862306a36Sopenharmony_ci unsigned long item_time, 33962306a36Sopenharmony_ci unsigned int timeout) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci return time_before_eq(jiffies, item_time + timeout * HZ) && 34262306a36Sopenharmony_ci time_before_eq(conn_time, item_time); 34362306a36Sopenharmony_ci} 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci__u32 hmdfs_dentry_hash(const struct qstr *qstr, bool case_sense); 34662306a36Sopenharmony_ci__u64 get_bucketaddr(unsigned int level, __u64 buckoffset); 34762306a36Sopenharmony_ci__u64 get_bucket_by_level(unsigned int level); 34862306a36Sopenharmony_ciunsigned int get_max_depth(struct file *filp); 34962306a36Sopenharmony_ci#endif 350