162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * fs/hmdfs/hmdfs_client.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef HMDFS_CLIENT_H
962306a36Sopenharmony_ci#define HMDFS_CLIENT_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "comm/transport.h"
1262306a36Sopenharmony_ci#include "hmdfs_dentryfile.h"
1362306a36Sopenharmony_ci#include "hmdfs_device_view.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct hmdfs_open_ret {
1662306a36Sopenharmony_ci	struct hmdfs_fid fid;
1762306a36Sopenharmony_ci	__u64 file_size;
1862306a36Sopenharmony_ci	__u64 ino;
1962306a36Sopenharmony_ci	struct hmdfs_time_t remote_ctime;
2062306a36Sopenharmony_ci	struct hmdfs_time_t stable_ctime;
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct hmdfs_writepage_context {
2462306a36Sopenharmony_ci	struct hmdfs_fid fid;
2562306a36Sopenharmony_ci	uint32_t count;
2662306a36Sopenharmony_ci	bool sync_all;
2762306a36Sopenharmony_ci	bool rsem_held;
2862306a36Sopenharmony_ci	unsigned long timeout;
2962306a36Sopenharmony_ci	struct task_struct *caller;
3062306a36Sopenharmony_ci	struct page *page;
3162306a36Sopenharmony_ci	struct delayed_work retry_dwork;
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciint hmdfs_client_start_readdir(struct hmdfs_peer *con, struct file *filp,
3562306a36Sopenharmony_ci			       const char *path, int path_len,
3662306a36Sopenharmony_ci			       struct hmdfs_dcache_header *header);
3762306a36Sopenharmony_ciint hmdfs_client_start_mkdir(struct hmdfs_peer *con,
3862306a36Sopenharmony_ci			     const char *path, const char *name,
3962306a36Sopenharmony_ci			     umode_t mode, struct hmdfs_lookup_ret *mkdir_ret);
4062306a36Sopenharmony_ciint hmdfs_client_start_create(struct hmdfs_peer *con,
4162306a36Sopenharmony_ci			      const char *path, const char *name,
4262306a36Sopenharmony_ci			      umode_t mode, bool want_excl,
4362306a36Sopenharmony_ci			      struct hmdfs_lookup_ret *create_ret);
4462306a36Sopenharmony_ciint hmdfs_client_start_rmdir(struct hmdfs_peer *con, const char *path,
4562306a36Sopenharmony_ci			     const char *name);
4662306a36Sopenharmony_ciint hmdfs_client_start_unlink(struct hmdfs_peer *con, const char *path,
4762306a36Sopenharmony_ci			      const char *name);
4862306a36Sopenharmony_ciint hmdfs_client_start_rename(struct hmdfs_peer *con, const char *old_path,
4962306a36Sopenharmony_ci			      const char *old_name, const char *new_path,
5062306a36Sopenharmony_ci			      const char *new_name, unsigned int flags);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic inline bool hmdfs_is_offline_err(int err)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	/*
5562306a36Sopenharmony_ci	 * writepage() will get -EBADF if peer is online
5662306a36Sopenharmony_ci	 * again during offline stash, and -EBADF also
5762306a36Sopenharmony_ci	 * needs redo.
5862306a36Sopenharmony_ci	 */
5962306a36Sopenharmony_ci	return (err == -EAGAIN || err == -ESHUTDOWN || err == -EBADF);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline bool hmdfs_is_offline_or_timeout_err(int err)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	return hmdfs_is_offline_err(err) || err == -ETIME;
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic inline bool hmdfs_need_redirty_page(const struct hmdfs_inode_info *info,
6862306a36Sopenharmony_ci					   int err)
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	/*
7162306a36Sopenharmony_ci	 * 1. stash is enabled
7262306a36Sopenharmony_ci	 * 2. offline related error
7362306a36Sopenharmony_ci	 * 3. no restore
7462306a36Sopenharmony_ci	 */
7562306a36Sopenharmony_ci	return hmdfs_is_stash_enabled(info->conn->sbi) &&
7662306a36Sopenharmony_ci	       hmdfs_is_offline_err(err) &&
7762306a36Sopenharmony_ci	       READ_ONCE(info->stash_status) != HMDFS_REMOTE_INODE_RESTORING;
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_cibool hmdfs_usr_sig_pending(struct task_struct *p);
8162306a36Sopenharmony_civoid hmdfs_writepage_cb(struct hmdfs_peer *peer, const struct hmdfs_req *req,
8262306a36Sopenharmony_ci			const struct hmdfs_resp *resp);
8362306a36Sopenharmony_ciint hmdfs_client_writepage(struct hmdfs_peer *con,
8462306a36Sopenharmony_ci			   struct hmdfs_writepage_context *param);
8562306a36Sopenharmony_ciint hmdfs_remote_do_writepage(struct hmdfs_peer *con,
8662306a36Sopenharmony_ci			      struct hmdfs_writepage_context *ctx);
8762306a36Sopenharmony_civoid hmdfs_remote_writepage_retry(struct work_struct *work);
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_civoid hmdfs_client_writepage_done(struct hmdfs_inode_info *info,
9062306a36Sopenharmony_ci				 struct hmdfs_writepage_context *ctx);
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ciint hmdfs_send_open(struct hmdfs_peer *con, const char *send_buf,
9362306a36Sopenharmony_ci		    __u8 file_type, struct hmdfs_open_ret *open_ret);
9462306a36Sopenharmony_civoid hmdfs_send_close(struct hmdfs_peer *con, const struct hmdfs_fid *fid);
9562306a36Sopenharmony_ciint hmdfs_send_fsync(struct hmdfs_peer *con, const struct hmdfs_fid *fid,
9662306a36Sopenharmony_ci		     __s64 start, __s64 end, __s32 datasync);
9762306a36Sopenharmony_ciint hmdfs_client_readpage(struct hmdfs_peer *con, const struct hmdfs_fid *fid,
9862306a36Sopenharmony_ci			  struct page *page);
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ciint hmdfs_send_setattr(struct hmdfs_peer *con, const char *send_buf,
10162306a36Sopenharmony_ci		       struct setattr_info *attr_info);
10262306a36Sopenharmony_ciint hmdfs_send_getattr(struct hmdfs_peer *con, const char *send_buf,
10362306a36Sopenharmony_ci		       unsigned int lookup_flags,
10462306a36Sopenharmony_ci		       struct hmdfs_getattr_ret *getattr_result);
10562306a36Sopenharmony_ciint hmdfs_send_statfs(struct hmdfs_peer *con, const char *path,
10662306a36Sopenharmony_ci		      struct kstatfs *buf);
10762306a36Sopenharmony_civoid hmdfs_client_recv_readpage(struct hmdfs_head_cmd *head, int err,
10862306a36Sopenharmony_ci				struct hmdfs_async_work *async_work);
10962306a36Sopenharmony_ciint hmdfs_send_syncfs(struct hmdfs_peer *con, int syncfs_timeout);
11062306a36Sopenharmony_ciint hmdfs_send_getxattr(struct hmdfs_peer *con, const char *send_buf,
11162306a36Sopenharmony_ci			const char *name, void *value, size_t size);
11262306a36Sopenharmony_ciint hmdfs_send_setxattr(struct hmdfs_peer *con, const char *send_buf,
11362306a36Sopenharmony_ci			const char *name, const void *val,
11462306a36Sopenharmony_ci			size_t size, int flags);
11562306a36Sopenharmony_cissize_t hmdfs_send_listxattr(struct hmdfs_peer *con, const char *send_buf,
11662306a36Sopenharmony_ci			     char *list, size_t size);
11762306a36Sopenharmony_civoid hmdfs_recv_syncfs_cb(struct hmdfs_peer *peer, const struct hmdfs_req *req,
11862306a36Sopenharmony_ci			  const struct hmdfs_resp *resp);
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_civoid __init hmdfs_client_add_node_evt_cb(void);
12162306a36Sopenharmony_ci#endif
122