162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * fs/hmdfs/hmdfs.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef HMDFS_H
962306a36Sopenharmony_ci#define HMDFS_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/fs.h>
1262306a36Sopenharmony_ci#include <linux/kfifo.h>
1362306a36Sopenharmony_ci#include <linux/kobject.h>
1462306a36Sopenharmony_ci#include <linux/kref.h>
1562306a36Sopenharmony_ci#include <linux/sched.h>
1662306a36Sopenharmony_ci#include <linux/version.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "comm/protocol.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#if KERNEL_VERSION(4, 15, 0) < LINUX_VERSION_CODE
2162306a36Sopenharmony_ci#define hmdfs_time_t	   timespec64
2262306a36Sopenharmony_ci#define hmdfs_time_compare timespec64_compare
2362306a36Sopenharmony_ci#define hmdfs_time_add	   timespec64_add
2462306a36Sopenharmony_ci#else
2562306a36Sopenharmony_ci#define hmdfs_time_t	   timespec
2662306a36Sopenharmony_ci#define hmdfs_time_compare timespec_compare
2762306a36Sopenharmony_ci#define hmdfs_time_add	   timespec_add
2862306a36Sopenharmony_ci#endif
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#define HMDFS_IOC 0xf2
3162306a36Sopenharmony_ci#define HMDFS_IOC_SET_SHARE_PATH _IOW(HMDFS_IOC, 1, struct hmdfs_share_control)
3262306a36Sopenharmony_ci#define HMDFS_IOC_GET_WRITEOPEN_CNT _IOR(HMDFS_IOC, 2, __u32)
3362306a36Sopenharmony_ci#define HMDFS_IOC_GET_DST_PATH _IOR(HMDFS_IOC, 3, __u32)
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define HMDFS_PAGE_SIZE	  4096
3762306a36Sopenharmony_ci#define HMDFS_PAGE_OFFSET 12
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/* max xattr value size, not include '\0' */
4062306a36Sopenharmony_ci#define HMDFS_XATTR_SIZE_MAX	4096
4162306a36Sopenharmony_ci/* max listxattr response size, include '\0' */
4262306a36Sopenharmony_ci#define HMDFS_LISTXATTR_SIZE_MAX 4096
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci// 20 digits +'\0', Converted from a u64 integer
4562306a36Sopenharmony_ci#define HMDFS_ACCOUNT_HASH_MAX_LEN 21
4662306a36Sopenharmony_ci#define CTRL_PATH_MAX_LEN	   21
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define HMDFS_SUPER_MAGIC 0x20200302
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define DEFAULT_WRITE_CACHE_TIMEOUT 30
5162306a36Sopenharmony_ci#define DEFAULT_SRV_REQ_MAX_ACTIVE 16
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define HMDFS_INODE_INVALID_FILE_ID	(1U << 31)
5462306a36Sopenharmony_ci#define HMDFS_FID_VER_BOOT_COOKIE_SHIFT	15
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* According to task_struct instead of workqueue_struct */
5762306a36Sopenharmony_ci#define HMDFS_WQ_NAME_LEN 16
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define HMDFS_DEF_WB_TIMEOUT_MS 60000
6062306a36Sopenharmony_ci#define HMDFS_MAX_WB_TIMEOUT_MS 900000
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#define HMDFS_READPAGES_NR_MAX	32
6362306a36Sopenharmony_ci#define HMDFS_READPAGES_NR_DEF	1024
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci#define HMDFS_CID_SIZE 64
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define DIR_MODE 0771
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cienum {
7062306a36Sopenharmony_ci	HMDFS_FEATURE_READPAGES		= 1ULL << 0,
7162306a36Sopenharmony_ci	HMDFS_FEATURE_READPAGES_OPEN	= 1ULL << 1,
7262306a36Sopenharmony_ci	HMDFS_ATOMIC_OPEN		= 1ULL << 2,
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistruct client_statistic;
7662306a36Sopenharmony_cistruct server_statistic;
7762306a36Sopenharmony_cistruct hmdfs_writeback;
7862306a36Sopenharmony_cistruct hmdfs_server_writeback;
7962306a36Sopenharmony_cistruct hmdfs_syncfs_info {
8062306a36Sopenharmony_ci	wait_queue_head_t wq;
8162306a36Sopenharmony_ci	atomic_t wait_count;
8262306a36Sopenharmony_ci	int remote_ret;
8362306a36Sopenharmony_ci	unsigned long long version;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	/* Protect version in concurrent operations */
8662306a36Sopenharmony_ci	spinlock_t v_lock;
8762306a36Sopenharmony_ci	/*
8862306a36Sopenharmony_ci	 * Serialize hmdfs_sync_fs() process:
8962306a36Sopenharmony_ci	 *  |<- pending_list ->|   exexuting    |<-  wait_list  ->|
9062306a36Sopenharmony_ci	 *   syncfs_1 syncfs_2     (syncfs_3)    syncfs_4 syncfs_5
9162306a36Sopenharmony_ci	 *
9262306a36Sopenharmony_ci	 * Abandon syncfs processes in pending_list after syncfs_3 finished;
9362306a36Sopenharmony_ci	 * Pick the last syncfs process in wait_list after syncfs_3 finished;
9462306a36Sopenharmony_ci	 */
9562306a36Sopenharmony_ci	bool is_executing;
9662306a36Sopenharmony_ci	/* syncfs process arriving after current exexcuting syncfs */
9762306a36Sopenharmony_ci	struct list_head wait_list;
9862306a36Sopenharmony_ci	/* syncfs process arriving before current exexcuting syncfs */
9962306a36Sopenharmony_ci	struct list_head pending_list;
10062306a36Sopenharmony_ci	spinlock_t list_lock;
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistruct hmdfs_share_table {
10462306a36Sopenharmony_ci	struct list_head item_list_head;
10562306a36Sopenharmony_ci	spinlock_t item_list_lock;
10662306a36Sopenharmony_ci	struct workqueue_struct *share_item_timeout_wq;
10762306a36Sopenharmony_ci	int item_cnt;
10862306a36Sopenharmony_ci	int max_cnt;
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistruct hmdfs_sb_info {
11262306a36Sopenharmony_ci	/* list for all registered superblocks */
11362306a36Sopenharmony_ci	struct list_head list;
11462306a36Sopenharmony_ci	struct mutex umount_mutex;
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci	struct kobject kobj;
11762306a36Sopenharmony_ci	struct completion s_kobj_unregister;
11862306a36Sopenharmony_ci	struct super_block *sb;
11962306a36Sopenharmony_ci	struct super_block *lower_sb;
12062306a36Sopenharmony_ci	/* from mount, which is root */
12162306a36Sopenharmony_ci	const struct cred *cred;
12262306a36Sopenharmony_ci	/* from update cmd, expected to be system */
12362306a36Sopenharmony_ci	const struct cred *system_cred;
12462306a36Sopenharmony_ci	struct {
12562306a36Sopenharmony_ci		struct mutex node_lock;
12662306a36Sopenharmony_ci		struct list_head node_list;
12762306a36Sopenharmony_ci		atomic_t conn_seq;
12862306a36Sopenharmony_ci		unsigned long recent_ol;
12962306a36Sopenharmony_ci	} connections;
13062306a36Sopenharmony_ci	char *local_dst;
13162306a36Sopenharmony_ci	char *real_dst;
13262306a36Sopenharmony_ci	char *local_src;
13362306a36Sopenharmony_ci	char *cache_dir;
13462306a36Sopenharmony_ci	char *cloud_dir;
13562306a36Sopenharmony_ci	/* seq number for hmdfs super block */
13662306a36Sopenharmony_ci	unsigned int seq;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	/*
13962306a36Sopenharmony_ci	 * This value indicate how long the pagecache stay valid(in seconds) in
14062306a36Sopenharmony_ci	 * client if metadate(except iversion) is equal to server. This
14162306a36Sopenharmony_ci	 * functionality is disabled if this value is 0.
14262306a36Sopenharmony_ci	 */
14362306a36Sopenharmony_ci	unsigned int write_cache_timeout;
14462306a36Sopenharmony_ci	unsigned int dcache_timeout;
14562306a36Sopenharmony_ci	unsigned int dcache_precision;
14662306a36Sopenharmony_ci	unsigned long dcache_threshold;
14762306a36Sopenharmony_ci	struct list_head client_cache;
14862306a36Sopenharmony_ci	struct list_head server_cache;
14962306a36Sopenharmony_ci	struct list_head to_delete;
15062306a36Sopenharmony_ci	struct mutex cache_list_lock;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	/* local operation time statistic */
15362306a36Sopenharmony_ci	struct server_statistic *s_server_statis;
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	/* client statistic */
15662306a36Sopenharmony_ci	struct client_statistic *s_client_statis;
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	/* TIMEOUT of each command */
15962306a36Sopenharmony_ci	struct kobject s_cmd_timeout_kobj;
16062306a36Sopenharmony_ci	struct completion s_timeout_kobj_unregister;
16162306a36Sopenharmony_ci	unsigned int s_cmd_timeout[F_SIZE];
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	/* For case sensitive */
16462306a36Sopenharmony_ci	bool s_case_sensitive;
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	/* For features supporting */
16762306a36Sopenharmony_ci	u64 s_features;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	/* number of pages to read */
17062306a36Sopenharmony_ci	unsigned int s_readpages_nr;
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci	/* For merge & device view */
17362306a36Sopenharmony_ci	unsigned int s_merge_switch;
17462306a36Sopenharmony_ci	/* For cloud disk*/
17562306a36Sopenharmony_ci	unsigned int s_cloud_disk_switch;
17662306a36Sopenharmony_ci	/* For writeback */
17762306a36Sopenharmony_ci	struct hmdfs_writeback *h_wb;
17862306a36Sopenharmony_ci	/* For server writeback */
17962306a36Sopenharmony_ci	struct hmdfs_server_writeback *h_swb;
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	/* syncfs info */
18262306a36Sopenharmony_ci	struct hmdfs_syncfs_info hsi;
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	/* To bridge the userspace utils */
18562306a36Sopenharmony_ci	struct kfifo notify_fifo;
18662306a36Sopenharmony_ci	spinlock_t notify_fifo_lock;
18762306a36Sopenharmony_ci	struct mutex cmd_handler_mutex;
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	/* For reboot detect */
19062306a36Sopenharmony_ci	uint64_t boot_cookie;
19162306a36Sopenharmony_ci	/* offline process */
19262306a36Sopenharmony_ci	unsigned int async_cb_delay;
19362306a36Sopenharmony_ci	/* For server handle requests */
19462306a36Sopenharmony_ci	unsigned int async_req_max_active;
19562306a36Sopenharmony_ci	/* stash dirty pages during offline */
19662306a36Sopenharmony_ci	bool s_offline_stash;
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci	/* Timeout (ms) to retry writing remote pages */
19962306a36Sopenharmony_ci	unsigned int wb_timeout_ms;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	struct path stash_work_dir;
20262306a36Sopenharmony_ci	/* dentry cache */
20362306a36Sopenharmony_ci	bool s_dentry_cache;
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	/* share table */
20662306a36Sopenharmony_ci	struct hmdfs_share_table share_table;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	/* msgs that are waiting for remote */
20962306a36Sopenharmony_ci	struct list_head async_readdir_msg_list;
21062306a36Sopenharmony_ci	/* protect async_readdir_msg_list */
21162306a36Sopenharmony_ci	spinlock_t async_readdir_msg_lock;
21262306a36Sopenharmony_ci	/* async readdir work that are queued but not finished */
21362306a36Sopenharmony_ci	struct list_head async_readdir_work_list;
21462306a36Sopenharmony_ci	/* protect async_readdir_work_list */
21562306a36Sopenharmony_ci	spinlock_t async_readdir_work_lock;
21662306a36Sopenharmony_ci	/* wait for async_readdir_work_list to be empty in umount */
21762306a36Sopenharmony_ci	wait_queue_head_t async_readdir_wq;
21862306a36Sopenharmony_ci	/* don't allow async readdir */
21962306a36Sopenharmony_ci	bool async_readdir_prohibit;
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	/* multi user */
22262306a36Sopenharmony_ci	unsigned int user_id;
22362306a36Sopenharmony_ci};
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_cistatic inline struct hmdfs_sb_info *hmdfs_sb(struct super_block *sb)
22662306a36Sopenharmony_ci{
22762306a36Sopenharmony_ci	return sb->s_fs_info;
22862306a36Sopenharmony_ci}
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_cistatic inline bool hmdfs_is_stash_enabled(const struct hmdfs_sb_info *sbi)
23162306a36Sopenharmony_ci{
23262306a36Sopenharmony_ci	return sbi->s_offline_stash;
23362306a36Sopenharmony_ci}
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_cistruct hmdfs_dst_info{
23662306a36Sopenharmony_ci	uint64_t local_path_len;
23762306a36Sopenharmony_ci	uint64_t local_path_pos;
23862306a36Sopenharmony_ci	uint64_t distributed_path_len;
23962306a36Sopenharmony_ci	uint64_t distributed_path_pos;
24062306a36Sopenharmony_ci	uint64_t bundle_name_len;
24162306a36Sopenharmony_ci	uint64_t bundle_name_pos;
24262306a36Sopenharmony_ci	uint64_t size;
24362306a36Sopenharmony_ci};
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_cistruct setattr_info {
24662306a36Sopenharmony_ci	loff_t size;
24762306a36Sopenharmony_ci	unsigned int valid;
24862306a36Sopenharmony_ci	umode_t mode;
24962306a36Sopenharmony_ci	kuid_t uid;
25062306a36Sopenharmony_ci	kgid_t gid;
25162306a36Sopenharmony_ci	long long atime;
25262306a36Sopenharmony_ci	long atime_nsec;
25362306a36Sopenharmony_ci	long long mtime;
25462306a36Sopenharmony_ci	long mtime_nsec;
25562306a36Sopenharmony_ci	long long ctime;
25662306a36Sopenharmony_ci	long ctime_nsec;
25762306a36Sopenharmony_ci};
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_cistruct hmdfs_file_info {
26062306a36Sopenharmony_ci	union {
26162306a36Sopenharmony_ci		struct {
26262306a36Sopenharmony_ci			struct rb_root root;
26362306a36Sopenharmony_ci			struct mutex comrade_list_lock;
26462306a36Sopenharmony_ci		};
26562306a36Sopenharmony_ci		struct {
26662306a36Sopenharmony_ci			struct file *lower_file;
26762306a36Sopenharmony_ci			int device_id;
26862306a36Sopenharmony_ci		};
26962306a36Sopenharmony_ci	};
27062306a36Sopenharmony_ci	struct list_head comrade_list;
27162306a36Sopenharmony_ci};
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_cistatic inline struct hmdfs_file_info *hmdfs_f(struct file *file)
27462306a36Sopenharmony_ci{
27562306a36Sopenharmony_ci	return file->private_data;
27662306a36Sopenharmony_ci}
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci// Almost all the source files want this, so...
27962306a36Sopenharmony_ci#include "inode.h"
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_ci/* locking helpers */
28262306a36Sopenharmony_cistatic inline struct dentry *lock_parent(struct dentry *dentry)
28362306a36Sopenharmony_ci{
28462306a36Sopenharmony_ci	struct dentry *dir = dget_parent(dentry);
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	inode_lock_nested(d_inode(dir), I_MUTEX_PARENT);
28762306a36Sopenharmony_ci	return dir;
28862306a36Sopenharmony_ci}
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_cistatic inline void unlock_dir(struct dentry *dir)
29162306a36Sopenharmony_ci{
29262306a36Sopenharmony_ci	inode_unlock(d_inode(dir));
29362306a36Sopenharmony_ci	dput(dir);
29462306a36Sopenharmony_ci}
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ciextern uint64_t path_hash(const char *path, int len, bool case_sense);
29762306a36Sopenharmony_ciextern int vfs_path_lookup(struct dentry *dentry, struct vfsmount *mnt,
29862306a36Sopenharmony_ci			   const char *name, unsigned int flags,
29962306a36Sopenharmony_ci			   struct path *path);
30062306a36Sopenharmony_ciextern ssize_t hmdfs_remote_listxattr(struct dentry *dentry, char *buffer,
30162306a36Sopenharmony_ci				      size_t size);
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ciint check_filename(const char *name, int len);
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ciint hmdfs_permission(struct mnt_idmap *idmap, struct inode *inode, int mask);
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ciint hmdfs_parse_options(struct hmdfs_sb_info *sbi, const char *data);
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci/* Refer to comments in hmdfs_request_work_fn() */
31062306a36Sopenharmony_ci#define HMDFS_SERVER_CTX_FLAGS (PF_KTHREAD | PF_WQ_WORKER | PF_NPROC_EXCEEDED)
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_cistatic inline bool is_current_hmdfs_server_ctx(void)
31362306a36Sopenharmony_ci{
31462306a36Sopenharmony_ci	return ((current->flags & HMDFS_SERVER_CTX_FLAGS) ==
31562306a36Sopenharmony_ci		HMDFS_SERVER_CTX_FLAGS);
31662306a36Sopenharmony_ci}
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ciextern uint64_t hmdfs_gen_boot_cookie(void);
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_cistatic inline bool str_n_case_eq(const char *s1, const char *s2, size_t len)
32162306a36Sopenharmony_ci{
32262306a36Sopenharmony_ci	return !strncasecmp(s1, s2, len);
32362306a36Sopenharmony_ci}
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_cistatic inline bool qstr_case_eq(const struct qstr *q1, const struct qstr *q2)
32662306a36Sopenharmony_ci{
32762306a36Sopenharmony_ci	return q1->len == q2->len && str_n_case_eq(q1->name, q2->name, q2->len);
32862306a36Sopenharmony_ci}
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cistatic inline bool qstr_eq(const struct qstr *q1, const struct qstr *q2)
33162306a36Sopenharmony_ci{
33262306a36Sopenharmony_ci	return q1->len == q2->len && !strncmp(q1->name, q2->name, q2->len);
33362306a36Sopenharmony_ci}
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci/*****************************************************************************
33662306a36Sopenharmony_ci * log print helpers
33762306a36Sopenharmony_ci *****************************************************************************/
33862306a36Sopenharmony_ci__printf(4, 5) void __hmdfs_log(const char *level, const bool ratelimited,
33962306a36Sopenharmony_ci				const char *function, const char *fmt, ...);
34062306a36Sopenharmony_ci#define hmdfs_err(fmt, ...)	\
34162306a36Sopenharmony_ci	__hmdfs_log(KERN_ERR, false, __func__, fmt, ##__VA_ARGS__)
34262306a36Sopenharmony_ci#define hmdfs_warning(fmt, ...) \
34362306a36Sopenharmony_ci	__hmdfs_log(KERN_WARNING, false, __func__, fmt, ##__VA_ARGS__)
34462306a36Sopenharmony_ci#define hmdfs_info(fmt, ...) \
34562306a36Sopenharmony_ci	__hmdfs_log(KERN_INFO, false, __func__, fmt, ##__VA_ARGS__)
34662306a36Sopenharmony_ci#define hmdfs_err_ratelimited(fmt, ...)	\
34762306a36Sopenharmony_ci	__hmdfs_log(KERN_ERR, true, __func__, fmt, ##__VA_ARGS__)
34862306a36Sopenharmony_ci#define hmdfs_warning_ratelimited(fmt, ...) \
34962306a36Sopenharmony_ci	__hmdfs_log(KERN_WARNING, true, __func__, fmt, ##__VA_ARGS__)
35062306a36Sopenharmony_ci#define hmdfs_info_ratelimited(fmt, ...) \
35162306a36Sopenharmony_ci	__hmdfs_log(KERN_INFO, true, __func__, fmt, ##__VA_ARGS__)
35262306a36Sopenharmony_ci#ifdef CONFIG_HMDFS_FS_DEBUG
35362306a36Sopenharmony_ci#define hmdfs_debug(fmt, ...) \
35462306a36Sopenharmony_ci	__hmdfs_log(KERN_DEBUG, false, __func__, fmt, ##__VA_ARGS__)
35562306a36Sopenharmony_ci#define hmdfs_debug_ratelimited(fmt, ...) \
35662306a36Sopenharmony_ci	__hmdfs_log(KERN_DEBUG, true, __func__, fmt, ##__VA_ARGS__)
35762306a36Sopenharmony_ci#else
35862306a36Sopenharmony_ci#define hmdfs_debug(fmt, ...)       ((void)0)
35962306a36Sopenharmony_ci#define hmdfs_debug_ratelimited(fmt, ...)       ((void)0)
36062306a36Sopenharmony_ci#endif
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci/*****************************************************************************
36362306a36Sopenharmony_ci * inode/file operations declartion
36462306a36Sopenharmony_ci *****************************************************************************/
36562306a36Sopenharmony_ciextern const struct inode_operations hmdfs_device_ops;
36662306a36Sopenharmony_ciextern const struct inode_operations hmdfs_root_ops;
36762306a36Sopenharmony_ciextern const struct file_operations hmdfs_root_fops;
36862306a36Sopenharmony_ciextern const struct file_operations hmdfs_device_fops;
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci#endif // HMDFS_H
371