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