1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * fs/hmdfs/hmdfs_client.h
4 *
5 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
6 */
7
8 #ifndef HMDFS_CLIENT_H
9 #define HMDFS_CLIENT_H
10
11 #include "comm/transport.h"
12 #include "hmdfs_dentryfile.h"
13 #include "hmdfs_device_view.h"
14
15 struct hmdfs_open_ret {
16 struct hmdfs_fid fid;
17 __u64 file_size;
18 __u64 ino;
19 struct hmdfs_time_t remote_ctime;
20 struct hmdfs_time_t stable_ctime;
21 };
22
23 struct hmdfs_writepage_context {
24 struct hmdfs_fid fid;
25 uint32_t count;
26 bool sync_all;
27 bool rsem_held;
28 unsigned long timeout;
29 struct task_struct *caller;
30 struct page *page;
31 struct delayed_work retry_dwork;
32 };
33
34 int hmdfs_client_start_readdir(struct hmdfs_peer *con, struct file *filp,
35 const char *path, int path_len,
36 struct hmdfs_dcache_header *header);
37 int hmdfs_client_start_mkdir(struct hmdfs_peer *con,
38 const char *path, const char *name,
39 umode_t mode, struct hmdfs_lookup_ret *mkdir_ret);
40 int hmdfs_client_start_create(struct hmdfs_peer *con,
41 const char *path, const char *name,
42 umode_t mode, bool want_excl,
43 struct hmdfs_lookup_ret *create_ret);
44 int hmdfs_client_start_rmdir(struct hmdfs_peer *con, const char *path,
45 const char *name);
46 int hmdfs_client_start_unlink(struct hmdfs_peer *con, const char *path,
47 const char *name);
48 int hmdfs_client_start_rename(struct hmdfs_peer *con, const char *old_path,
49 const char *old_name, const char *new_path,
50 const char *new_name, unsigned int flags);
51
hmdfs_is_offline_err(int err)52 static inline bool hmdfs_is_offline_err(int err)
53 {
54 /*
55 * writepage() will get -EBADF if peer is online
56 * again during offline stash, and -EBADF also
57 * needs redo.
58 */
59 return (err == -EAGAIN || err == -ESHUTDOWN || err == -EBADF);
60 }
61
hmdfs_is_offline_or_timeout_err(int err)62 static inline bool hmdfs_is_offline_or_timeout_err(int err)
63 {
64 return hmdfs_is_offline_err(err) || err == -ETIME;
65 }
66
hmdfs_need_redirty_page(const struct hmdfs_inode_info * info,int err)67 static inline bool hmdfs_need_redirty_page(const struct hmdfs_inode_info *info,
68 int err)
69 {
70 /*
71 * 1. stash is enabled
72 * 2. offline related error
73 * 3. no restore
74 */
75 return hmdfs_is_stash_enabled(info->conn->sbi) &&
76 hmdfs_is_offline_err(err) &&
77 READ_ONCE(info->stash_status) != HMDFS_REMOTE_INODE_RESTORING;
78 }
79
80 bool hmdfs_usr_sig_pending(struct task_struct *p);
81 void hmdfs_writepage_cb(struct hmdfs_peer *peer, const struct hmdfs_req *req,
82 const struct hmdfs_resp *resp);
83 int hmdfs_client_writepage(struct hmdfs_peer *con,
84 struct hmdfs_writepage_context *param);
85 int hmdfs_remote_do_writepage(struct hmdfs_peer *con,
86 struct hmdfs_writepage_context *ctx);
87 void hmdfs_remote_writepage_retry(struct work_struct *work);
88
89 void hmdfs_client_writepage_done(struct hmdfs_inode_info *info,
90 struct hmdfs_writepage_context *ctx);
91
92 int hmdfs_send_open(struct hmdfs_peer *con, const char *send_buf,
93 __u8 file_type, struct hmdfs_open_ret *open_ret);
94 void hmdfs_send_close(struct hmdfs_peer *con, const struct hmdfs_fid *fid);
95 int hmdfs_send_fsync(struct hmdfs_peer *con, const struct hmdfs_fid *fid,
96 __s64 start, __s64 end, __s32 datasync);
97 int hmdfs_client_readpage(struct hmdfs_peer *con, const struct hmdfs_fid *fid,
98 struct page *page);
99
100 int hmdfs_send_setattr(struct hmdfs_peer *con, const char *send_buf,
101 struct setattr_info *attr_info);
102 int hmdfs_send_getattr(struct hmdfs_peer *con, const char *send_buf,
103 unsigned int lookup_flags,
104 struct hmdfs_getattr_ret *getattr_result);
105 int hmdfs_send_statfs(struct hmdfs_peer *con, const char *path,
106 struct kstatfs *buf);
107 void hmdfs_client_recv_readpage(struct hmdfs_head_cmd *head, int err,
108 struct hmdfs_async_work *async_work);
109 int hmdfs_send_syncfs(struct hmdfs_peer *con, int syncfs_timeout);
110 int hmdfs_send_getxattr(struct hmdfs_peer *con, const char *send_buf,
111 const char *name, void *value, size_t size);
112 int hmdfs_send_setxattr(struct hmdfs_peer *con, const char *send_buf,
113 const char *name, const void *val,
114 size_t size, int flags);
115 ssize_t hmdfs_send_listxattr(struct hmdfs_peer *con, const char *send_buf,
116 char *list, size_t size);
117 void hmdfs_recv_syncfs_cb(struct hmdfs_peer *peer, const struct hmdfs_req *req,
118 const struct hmdfs_resp *resp);
119
120 void __init hmdfs_client_add_node_evt_cb(void);
121 #endif
122