26MOS_RPC_USERFS_CLIENT(fs_client)
33template<
typename... TPrint>
38 auto stream =
dInfo2<userfs> <<
"calling '" << fs->
name <<
"' (rpc_server '" << _userfs->rpc_server_name <<
"'): ";
39 ((stream << print), ...);
141 const int result = fs_client_readdir(ufs->
rpc_server, &req, &resp);
142 profile_leave(ev,
"userfs.'%s'.readdir", userfs->rpc_server_name);
148 mWarn <<
"userfs_iop_iterate_dir: failed to readdir " <<
name <<
": " << result;
173 .name = (
char *)
name.c_str(),
178 const int result = fs_client_lookup(fs->
rpc_server, &req, &resp);
179 profile_leave(ev,
"userfs.'%s'.lookup", ufs->rpc_server_name);
185 mWarn <<
"userfs_iop_lookup: failed to lookup " <<
name <<
": " << result;
210 .name = (
char *)
name.c_str(),
216 const int result = fs_client_make_dir(fs->
rpc_server, &req, &resp);
217 profile_leave(pp,
"userfs.'%s'.make_dir", userfs->rpc_server_name);
223 mWarn <<
"userfs_iop_mkdir: failed to mkdir " <<
name <<
": " << result;
264 .name = (
char *)
name.c_str(),
271 const int result = fs_client_create_file(fs->
rpc_server, &req, &resp);
272 profile_leave(pp,
"userfs.'%s'.create_file", userfs->rpc_server_name);
278 mWarn <<
"userfs_iop_newfile: failed to create file " <<
name <<
": " << result;
308 const int result = fs_client_readlink(fs->
rpc_server, &req, &resp);
309 profile_leave(pp,
"userfs.'%s'.readlink", userfs->rpc_server_name);
315 mWarn <<
"userfs_iop_readlink: failed to readlink " <<
name <<
": " << result;
380 .dentry = { .inode_id = dentry->
inode->
ino, .name = (
char *)
name.c_str() },
385 const int result = fs_client_unlink(fs->
rpc_server, &req, &resp);
386 profile_leave(pp,
"userfs.'%s'.unlink", userfs->rpc_server_name);
392 mWarn <<
"userfs_iop_unlink: failed to unlink " <<
name <<
": " << result;
450 const int result = fs_client_get_page(fs->
rpc_server, &req, &resp);
451 profile_leave(pp,
"userfs.'%s'.getpage", userfs->rpc_server_name);
457 mWarn <<
"userfs_inode_cache_fill_cache: failed to getpage: " << result;
471 mWarn <<
"userfs_inode_cache_fill_cache: failed to allocate page";
496 const int result = fs_client_put_page(fs->
rpc_server, &req, &resp);
497 profile_leave(pp,
"userfs.'%s'.putpage", userfs->rpc_server_name);
504 mWarn <<
"userfs_inode_cache_flush_page: failed to putpage: " << result;
534 const int result = fs_client_sync_inode(fs->
rpc_server, &req, &resp);
535 profile_leave(pp,
"userfs.'%s'.sync_inode", userfs->rpc_server_name);
539 mWarn <<
"userfs_sync_inode: failed to sync inode " << inode->
ino <<
": " << result;
563 .device = (
char *) device,
564 .options = (
char *) options,
570 const int result = fs_client_mount(userfs->
rpc_server, &req, &resp);
577 mWarn <<
"userfs_fsop_mount: failed to mount " << fs->
name <<
": " << result;
const Char * c_str() const
#define mosrpc_fs_create_file_response_fields
#define mosrpc_fs_readlink_response_fields
#define mosrpc_fs_putpage_response_fields
#define mosrpc_fs_putpage_request_fields
#define mosrpc_fs_unlink_response_fields
#define mosrpc_fs_mount_response_fields
#define mosrpc_fs_getpage_response_fields
#define mosrpc_fs_lookup_response_fields
#define mosrpc_fs_make_dir_response_fields
#define mosrpc_fs_readdir_response_fields
void dentry_attach(dentry_t *d, inode_t *inode)
Attach an inode to a dentry.
#define phyframe_va(frame)
phyframe_t * mm_get_free_page(void)
#define pmm_ref_one(thing)
inode_t * inode_create(superblock_t *sb, u64 ino, file_type_t type)
static vmap_global_mstat_t stat[_MEM_MAX_TYPES]
T * create(Args &&...args)
#define PB_BYTES_ARRAY_T_ALLOCSIZE(n)
void pb_release(const pb_msgdesc_t *fields, void *dest_struct)
static void * memcpy(void *s1, const void *s2, size_t n)
static size_t strlen(const char *s)
#define profile_leave(p,...)
MOSAPI rpc_server_stub_t * rpc_client_create(const char *server_name)
Create a new RPC client stub for the given server.
const pb_msgdesc_t *const fields
AutoCleanup(const pb_msgdesc_t *fields, void *data)
superblock_t * superblock
const inode_cache_ops_t * ops
superblock_t * superblock
const file_ops_t * file_ops
mosrpc_fs_inode_info i_info
mosrpc_fs_inode_ref i_ref
mosrpc_fs_inode_info i_info
mosrpc_fs_inode_ref i_ref
mosrpc_fs_inode_info i_info
mosrpc_fs_inode_ref i_ref
mosrpc_fs_inode_info root_info
mosrpc_fs_inode_ref root_ref
struct _mosrpc_fs_pb_dirent * entries
mosrpc_fs_inode_info i_info
mosrpc_fs_inode_ref i_ref
const superblock_ops_t * ops
mos::string rpc_server_name
The name of the RPC server.
rpc_server_stub_t * rpc_server
The RPC server stub, if connected.
#define container_of(ptr, type, member)
long userfs_inode_cache_flush_page(inode_cache_t *cache, uint64_t pgoff, phyframe_t *page)
static bool userfs_iop_symlink(inode_t *dir, dentry_t *dentry, const char *symname)
static bool userfs_iop_rename(inode_t *old_dir, dentry_t *old_dentry, inode_t *new_dir, dentry_t *new_dentry)
const superblock_ops_t userfs_sb_ops
void userfs_ensure_connected(userfs_t *userfs)
Ensure that the userfs is connected to the server.
userfs_t * userfs_get(filesystem_t *fs, TPrint... print)
mosrpc_fs_inode_info * i_to_pb_full(const inode_t *i, mosrpc_fs_inode_info *pbi)
Convert a kernel inode to a protobuf inode.
const inode_ops_t userfs_iops
mosrpc_fs_inode_ref i_to_pb_ref(const inode_t *i)
static bool userfs_iop_mkdir(inode_t *dir, dentry_t *dentry, file_perm_t perm)
static bool userfs_iop_rmdir(inode_t *dir, dentry_t *dentry)
static size_t userfs_iop_readlink(dentry_t *dentry, char *buffer, size_t buflen)
static bool userfs_iop_mknode(inode_t *dir, dentry_t *dentry, file_type_t type, file_perm_t perm, dev_t dev)
const inode_cache_ops_t userfs_inode_cache_ops
long userfs_sync_inode(inode_t *inode)
const file_ops_t userfs_fops
static void userfs_iop_iterate_dir(dentry_t *dentry, vfs_listdir_state_t *state, dentry_iterator_op add_record)
static bool userfs_fop_open(inode_t *inode, FsBaseFile *file, bool created)
static PtrResult< phyframe_t > userfs_inode_cache_fill_cache(inode_cache_t *cache, uint64_t pgoff)
static bool userfs_iop_unlink(inode_t *dir, dentry_t *dentry)
static bool userfs_iop_newfile(inode_t *dir, dentry_t *dentry, file_type_t type, file_perm_t perm)
static bool userfs_iop_lookup(inode_t *dir, dentry_t *dentry)
PtrResult< dentry_t > userfs_fsop_mount(filesystem_t *fs, const char *device, const char *options)
inode_t * i_from_pbfull(const mosrpc_fs_inode_info *stat, superblock_t *sb, void *private_data)
Convert a protobuf inode to a kernel inode.
static bool userfs_iop_hardlink(dentry_t *d, inode_t *i, dentry_t *new_d)
mos::string dentry_name(const dentry_t *dentry)
void dentry_iterator_op(vfs_listdir_state_t *state, u64 ino, mos::string_view name, file_type_t type)
dentry_t * dentry_get_from_parent(superblock_t *sb, dentry_t *parent, mos::string_view name)
Create a new dentry with the given name and parent.
bool simple_page_write_begin(inode_cache_t *icache, off_t offset, size_t size, phyframe_t **page, void **private_)
ssize_t vfs_generic_read(const FsBaseFile *file, void *buf, size_t size, off_t offset)
void simple_page_write_end(inode_cache_t *icache, off_t offset, size_t size, phyframe_t *page, void *private_)
ssize_t vfs_generic_write(const FsBaseFile *file, const void *buf, size_t size, off_t offset)