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