18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/fs/9p/vfs_super.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * This file contians superblock ops for 9P2000. It is intended that 68c2ecf20Sopenharmony_ci * you mount this file system on directories. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com> 98c2ecf20Sopenharmony_ci * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov> 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/kernel.h> 138c2ecf20Sopenharmony_ci#include <linux/module.h> 148c2ecf20Sopenharmony_ci#include <linux/errno.h> 158c2ecf20Sopenharmony_ci#include <linux/fs.h> 168c2ecf20Sopenharmony_ci#include <linux/file.h> 178c2ecf20Sopenharmony_ci#include <linux/stat.h> 188c2ecf20Sopenharmony_ci#include <linux/string.h> 198c2ecf20Sopenharmony_ci#include <linux/inet.h> 208c2ecf20Sopenharmony_ci#include <linux/pagemap.h> 218c2ecf20Sopenharmony_ci#include <linux/mount.h> 228c2ecf20Sopenharmony_ci#include <linux/idr.h> 238c2ecf20Sopenharmony_ci#include <linux/sched.h> 248c2ecf20Sopenharmony_ci#include <linux/slab.h> 258c2ecf20Sopenharmony_ci#include <linux/statfs.h> 268c2ecf20Sopenharmony_ci#include <linux/magic.h> 278c2ecf20Sopenharmony_ci#include <net/9p/9p.h> 288c2ecf20Sopenharmony_ci#include <net/9p/client.h> 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#include "v9fs.h" 318c2ecf20Sopenharmony_ci#include "v9fs_vfs.h" 328c2ecf20Sopenharmony_ci#include "fid.h" 338c2ecf20Sopenharmony_ci#include "xattr.h" 348c2ecf20Sopenharmony_ci#include "acl.h" 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci/** 398c2ecf20Sopenharmony_ci * v9fs_set_super - set the superblock 408c2ecf20Sopenharmony_ci * @s: super block 418c2ecf20Sopenharmony_ci * @data: file system specific data 428c2ecf20Sopenharmony_ci * 438c2ecf20Sopenharmony_ci */ 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic int v9fs_set_super(struct super_block *s, void *data) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci s->s_fs_info = data; 488c2ecf20Sopenharmony_ci return set_anon_super(s, data); 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci/** 528c2ecf20Sopenharmony_ci * v9fs_fill_super - populate superblock with info 538c2ecf20Sopenharmony_ci * @sb: superblock 548c2ecf20Sopenharmony_ci * @v9ses: session information 558c2ecf20Sopenharmony_ci * @flags: flags propagated from v9fs_mount() 568c2ecf20Sopenharmony_ci * 578c2ecf20Sopenharmony_ci */ 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistatic int 608c2ecf20Sopenharmony_civ9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, 618c2ecf20Sopenharmony_ci int flags) 628c2ecf20Sopenharmony_ci{ 638c2ecf20Sopenharmony_ci int ret; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci sb->s_maxbytes = MAX_LFS_FILESIZE; 668c2ecf20Sopenharmony_ci sb->s_blocksize_bits = fls(v9ses->maxdata - 1); 678c2ecf20Sopenharmony_ci sb->s_blocksize = 1 << sb->s_blocksize_bits; 688c2ecf20Sopenharmony_ci sb->s_magic = V9FS_MAGIC; 698c2ecf20Sopenharmony_ci if (v9fs_proto_dotl(v9ses)) { 708c2ecf20Sopenharmony_ci sb->s_op = &v9fs_super_ops_dotl; 718c2ecf20Sopenharmony_ci sb->s_xattr = v9fs_xattr_handlers; 728c2ecf20Sopenharmony_ci } else { 738c2ecf20Sopenharmony_ci sb->s_op = &v9fs_super_ops; 748c2ecf20Sopenharmony_ci sb->s_time_max = U32_MAX; 758c2ecf20Sopenharmony_ci } 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci sb->s_time_min = 0; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci ret = super_setup_bdi(sb); 808c2ecf20Sopenharmony_ci if (ret) 818c2ecf20Sopenharmony_ci return ret; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci if (!v9ses->cache) { 848c2ecf20Sopenharmony_ci sb->s_bdi->ra_pages = 0; 858c2ecf20Sopenharmony_ci sb->s_bdi->io_pages = 0; 868c2ecf20Sopenharmony_ci } 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci sb->s_flags |= SB_ACTIVE | SB_DIRSYNC; 898c2ecf20Sopenharmony_ci if (!v9ses->cache) 908c2ecf20Sopenharmony_ci sb->s_flags |= SB_SYNCHRONOUS; 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci#ifdef CONFIG_9P_FS_POSIX_ACL 938c2ecf20Sopenharmony_ci if ((v9ses->flags & V9FS_ACL_MASK) == V9FS_POSIX_ACL) 948c2ecf20Sopenharmony_ci sb->s_flags |= SB_POSIXACL; 958c2ecf20Sopenharmony_ci#endif 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci return 0; 988c2ecf20Sopenharmony_ci} 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci/** 1018c2ecf20Sopenharmony_ci * v9fs_mount - mount a superblock 1028c2ecf20Sopenharmony_ci * @fs_type: file system type 1038c2ecf20Sopenharmony_ci * @flags: mount flags 1048c2ecf20Sopenharmony_ci * @dev_name: device name that was mounted 1058c2ecf20Sopenharmony_ci * @data: mount options 1068c2ecf20Sopenharmony_ci * 1078c2ecf20Sopenharmony_ci */ 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_cistatic struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, 1108c2ecf20Sopenharmony_ci const char *dev_name, void *data) 1118c2ecf20Sopenharmony_ci{ 1128c2ecf20Sopenharmony_ci struct super_block *sb = NULL; 1138c2ecf20Sopenharmony_ci struct inode *inode = NULL; 1148c2ecf20Sopenharmony_ci struct dentry *root = NULL; 1158c2ecf20Sopenharmony_ci struct v9fs_session_info *v9ses = NULL; 1168c2ecf20Sopenharmony_ci umode_t mode = S_IRWXUGO | S_ISVTX; 1178c2ecf20Sopenharmony_ci struct p9_fid *fid; 1188c2ecf20Sopenharmony_ci int retval = 0; 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci p9_debug(P9_DEBUG_VFS, "\n"); 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci v9ses = kzalloc(sizeof(struct v9fs_session_info), GFP_KERNEL); 1238c2ecf20Sopenharmony_ci if (!v9ses) 1248c2ecf20Sopenharmony_ci return ERR_PTR(-ENOMEM); 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci fid = v9fs_session_init(v9ses, dev_name, data); 1278c2ecf20Sopenharmony_ci if (IS_ERR(fid)) { 1288c2ecf20Sopenharmony_ci retval = PTR_ERR(fid); 1298c2ecf20Sopenharmony_ci goto free_session; 1308c2ecf20Sopenharmony_ci } 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci sb = sget(fs_type, NULL, v9fs_set_super, flags, v9ses); 1338c2ecf20Sopenharmony_ci if (IS_ERR(sb)) { 1348c2ecf20Sopenharmony_ci retval = PTR_ERR(sb); 1358c2ecf20Sopenharmony_ci goto clunk_fid; 1368c2ecf20Sopenharmony_ci } 1378c2ecf20Sopenharmony_ci retval = v9fs_fill_super(sb, v9ses, flags); 1388c2ecf20Sopenharmony_ci if (retval) 1398c2ecf20Sopenharmony_ci goto release_sb; 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) 1428c2ecf20Sopenharmony_ci sb->s_d_op = &v9fs_cached_dentry_operations; 1438c2ecf20Sopenharmony_ci else 1448c2ecf20Sopenharmony_ci sb->s_d_op = &v9fs_dentry_operations; 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci inode = v9fs_get_inode(sb, S_IFDIR | mode, 0); 1478c2ecf20Sopenharmony_ci if (IS_ERR(inode)) { 1488c2ecf20Sopenharmony_ci retval = PTR_ERR(inode); 1498c2ecf20Sopenharmony_ci goto release_sb; 1508c2ecf20Sopenharmony_ci } 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci root = d_make_root(inode); 1538c2ecf20Sopenharmony_ci if (!root) { 1548c2ecf20Sopenharmony_ci retval = -ENOMEM; 1558c2ecf20Sopenharmony_ci goto release_sb; 1568c2ecf20Sopenharmony_ci } 1578c2ecf20Sopenharmony_ci sb->s_root = root; 1588c2ecf20Sopenharmony_ci if (v9fs_proto_dotl(v9ses)) { 1598c2ecf20Sopenharmony_ci struct p9_stat_dotl *st = NULL; 1608c2ecf20Sopenharmony_ci st = p9_client_getattr_dotl(fid, P9_STATS_BASIC); 1618c2ecf20Sopenharmony_ci if (IS_ERR(st)) { 1628c2ecf20Sopenharmony_ci retval = PTR_ERR(st); 1638c2ecf20Sopenharmony_ci goto release_sb; 1648c2ecf20Sopenharmony_ci } 1658c2ecf20Sopenharmony_ci d_inode(root)->i_ino = v9fs_qid2ino(&st->qid); 1668c2ecf20Sopenharmony_ci v9fs_stat2inode_dotl(st, d_inode(root), 0); 1678c2ecf20Sopenharmony_ci kfree(st); 1688c2ecf20Sopenharmony_ci } else { 1698c2ecf20Sopenharmony_ci struct p9_wstat *st = NULL; 1708c2ecf20Sopenharmony_ci st = p9_client_stat(fid); 1718c2ecf20Sopenharmony_ci if (IS_ERR(st)) { 1728c2ecf20Sopenharmony_ci retval = PTR_ERR(st); 1738c2ecf20Sopenharmony_ci goto release_sb; 1748c2ecf20Sopenharmony_ci } 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci d_inode(root)->i_ino = v9fs_qid2ino(&st->qid); 1778c2ecf20Sopenharmony_ci v9fs_stat2inode(st, d_inode(root), sb, 0); 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci p9stat_free(st); 1808c2ecf20Sopenharmony_ci kfree(st); 1818c2ecf20Sopenharmony_ci } 1828c2ecf20Sopenharmony_ci retval = v9fs_get_acl(inode, fid); 1838c2ecf20Sopenharmony_ci if (retval) 1848c2ecf20Sopenharmony_ci goto release_sb; 1858c2ecf20Sopenharmony_ci v9fs_fid_add(root, fid); 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci p9_debug(P9_DEBUG_VFS, " simple set mount, return 0\n"); 1888c2ecf20Sopenharmony_ci return dget(sb->s_root); 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ciclunk_fid: 1918c2ecf20Sopenharmony_ci p9_client_clunk(fid); 1928c2ecf20Sopenharmony_ci v9fs_session_close(v9ses); 1938c2ecf20Sopenharmony_cifree_session: 1948c2ecf20Sopenharmony_ci kfree(v9ses); 1958c2ecf20Sopenharmony_ci return ERR_PTR(retval); 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_cirelease_sb: 1988c2ecf20Sopenharmony_ci /* 1998c2ecf20Sopenharmony_ci * we will do the session_close and root dentry release 2008c2ecf20Sopenharmony_ci * in the below call. But we need to clunk fid, because we haven't 2018c2ecf20Sopenharmony_ci * attached the fid to dentry so it won't get clunked 2028c2ecf20Sopenharmony_ci * automatically. 2038c2ecf20Sopenharmony_ci */ 2048c2ecf20Sopenharmony_ci p9_client_clunk(fid); 2058c2ecf20Sopenharmony_ci deactivate_locked_super(sb); 2068c2ecf20Sopenharmony_ci return ERR_PTR(retval); 2078c2ecf20Sopenharmony_ci} 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci/** 2108c2ecf20Sopenharmony_ci * v9fs_kill_super - Kill Superblock 2118c2ecf20Sopenharmony_ci * @s: superblock 2128c2ecf20Sopenharmony_ci * 2138c2ecf20Sopenharmony_ci */ 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_cistatic void v9fs_kill_super(struct super_block *s) 2168c2ecf20Sopenharmony_ci{ 2178c2ecf20Sopenharmony_ci struct v9fs_session_info *v9ses = s->s_fs_info; 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci p9_debug(P9_DEBUG_VFS, " %p\n", s); 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci kill_anon_super(s); 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci v9fs_session_cancel(v9ses); 2248c2ecf20Sopenharmony_ci v9fs_session_close(v9ses); 2258c2ecf20Sopenharmony_ci kfree(v9ses); 2268c2ecf20Sopenharmony_ci s->s_fs_info = NULL; 2278c2ecf20Sopenharmony_ci p9_debug(P9_DEBUG_VFS, "exiting kill_super\n"); 2288c2ecf20Sopenharmony_ci} 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_cistatic void 2318c2ecf20Sopenharmony_civ9fs_umount_begin(struct super_block *sb) 2328c2ecf20Sopenharmony_ci{ 2338c2ecf20Sopenharmony_ci struct v9fs_session_info *v9ses; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci v9ses = sb->s_fs_info; 2368c2ecf20Sopenharmony_ci v9fs_session_begin_cancel(v9ses); 2378c2ecf20Sopenharmony_ci} 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistatic int v9fs_statfs(struct dentry *dentry, struct kstatfs *buf) 2408c2ecf20Sopenharmony_ci{ 2418c2ecf20Sopenharmony_ci struct v9fs_session_info *v9ses; 2428c2ecf20Sopenharmony_ci struct p9_fid *fid; 2438c2ecf20Sopenharmony_ci struct p9_rstatfs rs; 2448c2ecf20Sopenharmony_ci int res; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci fid = v9fs_fid_lookup(dentry); 2478c2ecf20Sopenharmony_ci if (IS_ERR(fid)) { 2488c2ecf20Sopenharmony_ci res = PTR_ERR(fid); 2498c2ecf20Sopenharmony_ci goto done; 2508c2ecf20Sopenharmony_ci } 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci v9ses = v9fs_dentry2v9ses(dentry); 2538c2ecf20Sopenharmony_ci if (v9fs_proto_dotl(v9ses)) { 2548c2ecf20Sopenharmony_ci res = p9_client_statfs(fid, &rs); 2558c2ecf20Sopenharmony_ci if (res == 0) { 2568c2ecf20Sopenharmony_ci buf->f_type = rs.type; 2578c2ecf20Sopenharmony_ci buf->f_bsize = rs.bsize; 2588c2ecf20Sopenharmony_ci buf->f_blocks = rs.blocks; 2598c2ecf20Sopenharmony_ci buf->f_bfree = rs.bfree; 2608c2ecf20Sopenharmony_ci buf->f_bavail = rs.bavail; 2618c2ecf20Sopenharmony_ci buf->f_files = rs.files; 2628c2ecf20Sopenharmony_ci buf->f_ffree = rs.ffree; 2638c2ecf20Sopenharmony_ci buf->f_fsid = u64_to_fsid(rs.fsid); 2648c2ecf20Sopenharmony_ci buf->f_namelen = rs.namelen; 2658c2ecf20Sopenharmony_ci } 2668c2ecf20Sopenharmony_ci if (res != -ENOSYS) 2678c2ecf20Sopenharmony_ci goto done; 2688c2ecf20Sopenharmony_ci } 2698c2ecf20Sopenharmony_ci res = simple_statfs(dentry, buf); 2708c2ecf20Sopenharmony_cidone: 2718c2ecf20Sopenharmony_ci return res; 2728c2ecf20Sopenharmony_ci} 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_cistatic int v9fs_drop_inode(struct inode *inode) 2758c2ecf20Sopenharmony_ci{ 2768c2ecf20Sopenharmony_ci struct v9fs_session_info *v9ses; 2778c2ecf20Sopenharmony_ci v9ses = v9fs_inode2v9ses(inode); 2788c2ecf20Sopenharmony_ci if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) 2798c2ecf20Sopenharmony_ci return generic_drop_inode(inode); 2808c2ecf20Sopenharmony_ci /* 2818c2ecf20Sopenharmony_ci * in case of non cached mode always drop the 2828c2ecf20Sopenharmony_ci * the inode because we want the inode attribute 2838c2ecf20Sopenharmony_ci * to always match that on the server. 2848c2ecf20Sopenharmony_ci */ 2858c2ecf20Sopenharmony_ci return 1; 2868c2ecf20Sopenharmony_ci} 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_cistatic int v9fs_write_inode(struct inode *inode, 2898c2ecf20Sopenharmony_ci struct writeback_control *wbc) 2908c2ecf20Sopenharmony_ci{ 2918c2ecf20Sopenharmony_ci int ret; 2928c2ecf20Sopenharmony_ci struct p9_wstat wstat; 2938c2ecf20Sopenharmony_ci struct v9fs_inode *v9inode; 2948c2ecf20Sopenharmony_ci /* 2958c2ecf20Sopenharmony_ci * send an fsync request to server irrespective of 2968c2ecf20Sopenharmony_ci * wbc->sync_mode. 2978c2ecf20Sopenharmony_ci */ 2988c2ecf20Sopenharmony_ci p9_debug(P9_DEBUG_VFS, "%s: inode %p\n", __func__, inode); 2998c2ecf20Sopenharmony_ci v9inode = V9FS_I(inode); 3008c2ecf20Sopenharmony_ci if (!v9inode->writeback_fid) 3018c2ecf20Sopenharmony_ci return 0; 3028c2ecf20Sopenharmony_ci v9fs_blank_wstat(&wstat); 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci ret = p9_client_wstat(v9inode->writeback_fid, &wstat); 3058c2ecf20Sopenharmony_ci if (ret < 0) { 3068c2ecf20Sopenharmony_ci __mark_inode_dirty(inode, I_DIRTY_DATASYNC); 3078c2ecf20Sopenharmony_ci return ret; 3088c2ecf20Sopenharmony_ci } 3098c2ecf20Sopenharmony_ci return 0; 3108c2ecf20Sopenharmony_ci} 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_cistatic int v9fs_write_inode_dotl(struct inode *inode, 3138c2ecf20Sopenharmony_ci struct writeback_control *wbc) 3148c2ecf20Sopenharmony_ci{ 3158c2ecf20Sopenharmony_ci int ret; 3168c2ecf20Sopenharmony_ci struct v9fs_inode *v9inode; 3178c2ecf20Sopenharmony_ci /* 3188c2ecf20Sopenharmony_ci * send an fsync request to server irrespective of 3198c2ecf20Sopenharmony_ci * wbc->sync_mode. 3208c2ecf20Sopenharmony_ci */ 3218c2ecf20Sopenharmony_ci v9inode = V9FS_I(inode); 3228c2ecf20Sopenharmony_ci p9_debug(P9_DEBUG_VFS, "%s: inode %p, writeback_fid %p\n", 3238c2ecf20Sopenharmony_ci __func__, inode, v9inode->writeback_fid); 3248c2ecf20Sopenharmony_ci if (!v9inode->writeback_fid) 3258c2ecf20Sopenharmony_ci return 0; 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ci ret = p9_client_fsync(v9inode->writeback_fid, 0); 3288c2ecf20Sopenharmony_ci if (ret < 0) { 3298c2ecf20Sopenharmony_ci __mark_inode_dirty(inode, I_DIRTY_DATASYNC); 3308c2ecf20Sopenharmony_ci return ret; 3318c2ecf20Sopenharmony_ci } 3328c2ecf20Sopenharmony_ci return 0; 3338c2ecf20Sopenharmony_ci} 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_cistatic const struct super_operations v9fs_super_ops = { 3368c2ecf20Sopenharmony_ci .alloc_inode = v9fs_alloc_inode, 3378c2ecf20Sopenharmony_ci .free_inode = v9fs_free_inode, 3388c2ecf20Sopenharmony_ci .statfs = simple_statfs, 3398c2ecf20Sopenharmony_ci .evict_inode = v9fs_evict_inode, 3408c2ecf20Sopenharmony_ci .show_options = v9fs_show_options, 3418c2ecf20Sopenharmony_ci .umount_begin = v9fs_umount_begin, 3428c2ecf20Sopenharmony_ci .write_inode = v9fs_write_inode, 3438c2ecf20Sopenharmony_ci}; 3448c2ecf20Sopenharmony_ci 3458c2ecf20Sopenharmony_cistatic const struct super_operations v9fs_super_ops_dotl = { 3468c2ecf20Sopenharmony_ci .alloc_inode = v9fs_alloc_inode, 3478c2ecf20Sopenharmony_ci .free_inode = v9fs_free_inode, 3488c2ecf20Sopenharmony_ci .statfs = v9fs_statfs, 3498c2ecf20Sopenharmony_ci .drop_inode = v9fs_drop_inode, 3508c2ecf20Sopenharmony_ci .evict_inode = v9fs_evict_inode, 3518c2ecf20Sopenharmony_ci .show_options = v9fs_show_options, 3528c2ecf20Sopenharmony_ci .umount_begin = v9fs_umount_begin, 3538c2ecf20Sopenharmony_ci .write_inode = v9fs_write_inode_dotl, 3548c2ecf20Sopenharmony_ci}; 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_cistruct file_system_type v9fs_fs_type = { 3578c2ecf20Sopenharmony_ci .name = "9p", 3588c2ecf20Sopenharmony_ci .mount = v9fs_mount, 3598c2ecf20Sopenharmony_ci .kill_sb = v9fs_kill_super, 3608c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 3618c2ecf20Sopenharmony_ci .fs_flags = FS_RENAME_DOES_D_MOVE, 3628c2ecf20Sopenharmony_ci}; 3638c2ecf20Sopenharmony_ciMODULE_ALIAS_FS("9p"); 364