11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Copyright (c) 2000-2001 Christoph Hellwig. 31cce1701SKrzysztof Błaszkowski * Copyright (c) 2016 Krzysztof Blaszkowski 41da177e4SLinus Torvalds * All rights reserved. 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Redistribution and use in source and binary forms, with or without 71da177e4SLinus Torvalds * modification, are permitted provided that the following conditions 81da177e4SLinus Torvalds * are met: 91da177e4SLinus Torvalds * 1. Redistributions of source code must retain the above copyright 101da177e4SLinus Torvalds * notice, this list of conditions, and the following disclaimer, 111da177e4SLinus Torvalds * without modification. 121da177e4SLinus Torvalds * 2. The name of the author may not be used to endorse or promote products 131da177e4SLinus Torvalds * derived from this software without specific prior written permission. 141da177e4SLinus Torvalds * 151da177e4SLinus Torvalds * Alternatively, this software may be distributed under the terms of the 161da177e4SLinus Torvalds * GNU General Public License ("GPL"). 171da177e4SLinus Torvalds * 181da177e4SLinus Torvalds * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 191da177e4SLinus Torvalds * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 201da177e4SLinus Torvalds * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 211da177e4SLinus Torvalds * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 221da177e4SLinus Torvalds * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 231da177e4SLinus Torvalds * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 241da177e4SLinus Torvalds * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 251da177e4SLinus Torvalds * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 261da177e4SLinus Torvalds * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 271da177e4SLinus Torvalds * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 281da177e4SLinus Torvalds * SUCH DAMAGE. 291da177e4SLinus Torvalds */ 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds /* 321da177e4SLinus Torvalds * Veritas filesystem driver - superblock related routines. 331da177e4SLinus Torvalds */ 341da177e4SLinus Torvalds #include <linux/init.h> 351da177e4SLinus Torvalds #include <linux/module.h> 361da177e4SLinus Torvalds 371da177e4SLinus Torvalds #include <linux/blkdev.h> 381da177e4SLinus Torvalds #include <linux/fs.h> 391da177e4SLinus Torvalds #include <linux/buffer_head.h> 401da177e4SLinus Torvalds #include <linux/kernel.h> 411da177e4SLinus Torvalds #include <linux/slab.h> 421da177e4SLinus Torvalds #include <linux/stat.h> 431da177e4SLinus Torvalds #include <linux/vfs.h> 44726c3342SDavid Howells #include <linux/mount.h> 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds #include "vxfs.h" 471da177e4SLinus Torvalds #include "vxfs_extern.h" 481da177e4SLinus Torvalds #include "vxfs_dir.h" 491da177e4SLinus Torvalds #include "vxfs_inode.h" 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds 521cce1701SKrzysztof Błaszkowski MODULE_AUTHOR("Christoph Hellwig, Krzysztof Blaszkowski"); 531da177e4SLinus Torvalds MODULE_DESCRIPTION("Veritas Filesystem (VxFS) driver"); 541da177e4SLinus Torvalds MODULE_LICENSE("Dual BSD/GPL"); 551da177e4SLinus Torvalds 562f137e31SChristoph Hellwig static struct kmem_cache *vxfs_inode_cachep; 572f137e31SChristoph Hellwig 581da177e4SLinus Torvalds /** 591da177e4SLinus Torvalds * vxfs_put_super - free superblock resources 601da177e4SLinus Torvalds * @sbp: VFS superblock. 611da177e4SLinus Torvalds * 621da177e4SLinus Torvalds * Description: 631da177e4SLinus Torvalds * vxfs_put_super frees all resources allocated for @sbp 641da177e4SLinus Torvalds * after the last instance of the filesystem is unmounted. 651da177e4SLinus Torvalds */ 661da177e4SLinus Torvalds 671da177e4SLinus Torvalds static void 681da177e4SLinus Torvalds vxfs_put_super(struct super_block *sbp) 691da177e4SLinus Torvalds { 701da177e4SLinus Torvalds struct vxfs_sb_info *infp = VXFS_SBI(sbp); 711da177e4SLinus Torvalds 720e481d3cSKrzysztof Błaszkowski iput(infp->vsi_fship); 730e481d3cSKrzysztof Błaszkowski iput(infp->vsi_ilist); 740e481d3cSKrzysztof Błaszkowski iput(infp->vsi_stilist); 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds brelse(infp->vsi_bp); 771da177e4SLinus Torvalds kfree(infp); 781da177e4SLinus Torvalds } 791da177e4SLinus Torvalds 801da177e4SLinus Torvalds /** 811da177e4SLinus Torvalds * vxfs_statfs - get filesystem information 82726c3342SDavid Howells * @dentry: VFS dentry to locate superblock 831da177e4SLinus Torvalds * @bufp: output buffer 841da177e4SLinus Torvalds * 851da177e4SLinus Torvalds * Description: 861da177e4SLinus Torvalds * vxfs_statfs fills the statfs buffer @bufp with information 87726c3342SDavid Howells * about the filesystem described by @dentry. 881da177e4SLinus Torvalds * 891da177e4SLinus Torvalds * Returns: 901da177e4SLinus Torvalds * Zero. 911da177e4SLinus Torvalds * 921da177e4SLinus Torvalds * Locking: 931da177e4SLinus Torvalds * No locks held. 941da177e4SLinus Torvalds * 951da177e4SLinus Torvalds * Notes: 961da177e4SLinus Torvalds * This is everything but complete... 971da177e4SLinus Torvalds */ 981da177e4SLinus Torvalds static int 99726c3342SDavid Howells vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp) 1001da177e4SLinus Torvalds { 101726c3342SDavid Howells struct vxfs_sb_info *infp = VXFS_SBI(dentry->d_sb); 1020d83f7fcSKrzysztof Błaszkowski struct vxfs_sb *raw_sb = infp->vsi_raw; 1031da177e4SLinus Torvalds 1041da177e4SLinus Torvalds bufp->f_type = VXFS_SUPER_MAGIC; 105726c3342SDavid Howells bufp->f_bsize = dentry->d_sb->s_blocksize; 1060d83f7fcSKrzysztof Błaszkowski bufp->f_blocks = fs32_to_cpu(infp, raw_sb->vs_dsize); 1070d83f7fcSKrzysztof Błaszkowski bufp->f_bfree = fs32_to_cpu(infp, raw_sb->vs_free); 1081da177e4SLinus Torvalds bufp->f_bavail = 0; 1091da177e4SLinus Torvalds bufp->f_files = 0; 1100d83f7fcSKrzysztof Błaszkowski bufp->f_ffree = fs32_to_cpu(infp, raw_sb->vs_ifree); 1111da177e4SLinus Torvalds bufp->f_namelen = VXFS_NAMELEN; 1121da177e4SLinus Torvalds 1131da177e4SLinus Torvalds return 0; 1141da177e4SLinus Torvalds } 1151da177e4SLinus Torvalds 1161da177e4SLinus Torvalds static int vxfs_remount(struct super_block *sb, int *flags, char *data) 1171da177e4SLinus Torvalds { 11802b9984dSTheodore Ts'o sync_filesystem(sb); 1191751e8a6SLinus Torvalds *flags |= SB_RDONLY; 1201da177e4SLinus Torvalds return 0; 1211da177e4SLinus Torvalds } 1221da177e4SLinus Torvalds 1232f137e31SChristoph Hellwig static struct inode *vxfs_alloc_inode(struct super_block *sb) 1242f137e31SChristoph Hellwig { 1252f137e31SChristoph Hellwig struct vxfs_inode_info *vi; 1262f137e31SChristoph Hellwig 1272f137e31SChristoph Hellwig vi = kmem_cache_alloc(vxfs_inode_cachep, GFP_KERNEL); 1282f137e31SChristoph Hellwig if (!vi) 1292f137e31SChristoph Hellwig return NULL; 130f2fe2fa1SKrzysztof Błaszkowski inode_init_once(&vi->vfs_inode); 1312f137e31SChristoph Hellwig return &vi->vfs_inode; 1322f137e31SChristoph Hellwig } 1332f137e31SChristoph Hellwig 134*9f179271SAl Viro static void vxfs_free_inode(struct inode *inode) 1352f137e31SChristoph Hellwig { 1362f137e31SChristoph Hellwig kmem_cache_free(vxfs_inode_cachep, VXFS_INO(inode)); 1372f137e31SChristoph Hellwig } 1382f137e31SChristoph Hellwig 139f2bf2c70SChristoph Hellwig static const struct super_operations vxfs_super_ops = { 1402f137e31SChristoph Hellwig .alloc_inode = vxfs_alloc_inode, 141*9f179271SAl Viro .free_inode = vxfs_free_inode, 142f2bf2c70SChristoph Hellwig .evict_inode = vxfs_evict_inode, 143f2bf2c70SChristoph Hellwig .put_super = vxfs_put_super, 144f2bf2c70SChristoph Hellwig .statfs = vxfs_statfs, 145f2bf2c70SChristoph Hellwig .remount_fs = vxfs_remount, 146f2bf2c70SChristoph Hellwig }; 1470d83f7fcSKrzysztof Błaszkowski 1480d83f7fcSKrzysztof Błaszkowski static int vxfs_try_sb_magic(struct super_block *sbp, int silent, 1490d83f7fcSKrzysztof Błaszkowski unsigned blk, __fs32 magic) 1500d83f7fcSKrzysztof Błaszkowski { 1510d83f7fcSKrzysztof Błaszkowski struct buffer_head *bp; 1520d83f7fcSKrzysztof Błaszkowski struct vxfs_sb *rsbp; 1530d83f7fcSKrzysztof Błaszkowski struct vxfs_sb_info *infp = VXFS_SBI(sbp); 1540d83f7fcSKrzysztof Błaszkowski int rc = -ENOMEM; 1550d83f7fcSKrzysztof Błaszkowski 1560d83f7fcSKrzysztof Błaszkowski bp = sb_bread(sbp, blk); 1570d83f7fcSKrzysztof Błaszkowski do { 1580d83f7fcSKrzysztof Błaszkowski if (!bp || !buffer_mapped(bp)) { 1590d83f7fcSKrzysztof Błaszkowski if (!silent) { 1600d83f7fcSKrzysztof Błaszkowski printk(KERN_WARNING 1610d83f7fcSKrzysztof Błaszkowski "vxfs: unable to read disk superblock at %u\n", 1620d83f7fcSKrzysztof Błaszkowski blk); 1630d83f7fcSKrzysztof Błaszkowski } 1640d83f7fcSKrzysztof Błaszkowski break; 1650d83f7fcSKrzysztof Błaszkowski } 1660d83f7fcSKrzysztof Błaszkowski 1670d83f7fcSKrzysztof Błaszkowski rc = -EINVAL; 1680d83f7fcSKrzysztof Błaszkowski rsbp = (struct vxfs_sb *)bp->b_data; 1690d83f7fcSKrzysztof Błaszkowski if (rsbp->vs_magic != magic) { 1700d83f7fcSKrzysztof Błaszkowski if (!silent) 1710d83f7fcSKrzysztof Błaszkowski printk(KERN_NOTICE 1720d83f7fcSKrzysztof Błaszkowski "vxfs: WRONG superblock magic %08x at %u\n", 1730d83f7fcSKrzysztof Błaszkowski rsbp->vs_magic, blk); 1740d83f7fcSKrzysztof Błaszkowski break; 1750d83f7fcSKrzysztof Błaszkowski } 1760d83f7fcSKrzysztof Błaszkowski 1770d83f7fcSKrzysztof Błaszkowski rc = 0; 1780d83f7fcSKrzysztof Błaszkowski infp->vsi_raw = rsbp; 1790d83f7fcSKrzysztof Błaszkowski infp->vsi_bp = bp; 1800d83f7fcSKrzysztof Błaszkowski } while (0); 1810d83f7fcSKrzysztof Błaszkowski 1820d83f7fcSKrzysztof Błaszkowski if (rc) { 1830d83f7fcSKrzysztof Błaszkowski infp->vsi_raw = NULL; 1840d83f7fcSKrzysztof Błaszkowski infp->vsi_bp = NULL; 1850d83f7fcSKrzysztof Błaszkowski brelse(bp); 1860d83f7fcSKrzysztof Błaszkowski } 1870d83f7fcSKrzysztof Błaszkowski 1880d83f7fcSKrzysztof Błaszkowski return rc; 1890d83f7fcSKrzysztof Błaszkowski } 1900d83f7fcSKrzysztof Błaszkowski 1911da177e4SLinus Torvalds /** 192421f91d2SUwe Kleine-König * vxfs_read_super - read superblock into memory and initialize filesystem 1931da177e4SLinus Torvalds * @sbp: VFS superblock (to fill) 1941da177e4SLinus Torvalds * @dp: fs private mount data 1951da177e4SLinus Torvalds * @silent: do not complain loudly when sth is wrong 1961da177e4SLinus Torvalds * 1971da177e4SLinus Torvalds * Description: 1981da177e4SLinus Torvalds * We are called on the first mount of a filesystem to read the 1991da177e4SLinus Torvalds * superblock into memory and do some basic setup. 2001da177e4SLinus Torvalds * 2011da177e4SLinus Torvalds * Returns: 2021da177e4SLinus Torvalds * The superblock on success, else %NULL. 2031da177e4SLinus Torvalds * 2041da177e4SLinus Torvalds * Locking: 205db719222SJan Blunck * We are under @sbp->s_lock. 2061da177e4SLinus Torvalds */ 2071da177e4SLinus Torvalds static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent) 2081da177e4SLinus Torvalds { 2091da177e4SLinus Torvalds struct vxfs_sb_info *infp; 2101da177e4SLinus Torvalds struct vxfs_sb *rsbp; 2111da177e4SLinus Torvalds u_long bsize; 2121da177e4SLinus Torvalds struct inode *root; 213d0b07948SDavid Howells int ret = -EINVAL; 2140d83f7fcSKrzysztof Błaszkowski u32 j; 2151da177e4SLinus Torvalds 2161751e8a6SLinus Torvalds sbp->s_flags |= SB_RDONLY; 2171da177e4SLinus Torvalds 218e915fc49SPekka Enberg infp = kzalloc(sizeof(*infp), GFP_KERNEL); 2191da177e4SLinus Torvalds if (!infp) { 2201da177e4SLinus Torvalds printk(KERN_WARNING "vxfs: unable to allocate incore superblock\n"); 2211da177e4SLinus Torvalds return -ENOMEM; 2221da177e4SLinus Torvalds } 2231da177e4SLinus Torvalds 2241da177e4SLinus Torvalds bsize = sb_min_blocksize(sbp, BLOCK_SIZE); 2251da177e4SLinus Torvalds if (!bsize) { 2261da177e4SLinus Torvalds printk(KERN_WARNING "vxfs: unable to set blocksize\n"); 2271da177e4SLinus Torvalds goto out; 2281da177e4SLinus Torvalds } 2291da177e4SLinus Torvalds 2302f137e31SChristoph Hellwig sbp->s_op = &vxfs_super_ops; 2310d83f7fcSKrzysztof Błaszkowski sbp->s_fs_info = infp; 2321da177e4SLinus Torvalds 2330d83f7fcSKrzysztof Błaszkowski if (!vxfs_try_sb_magic(sbp, silent, 1, 2340d83f7fcSKrzysztof Błaszkowski (__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) { 2350d83f7fcSKrzysztof Błaszkowski /* Unixware, x86 */ 2360d83f7fcSKrzysztof Błaszkowski infp->byte_order = VXFS_BO_LE; 2370d83f7fcSKrzysztof Błaszkowski } else if (!vxfs_try_sb_magic(sbp, silent, 8, 2380d83f7fcSKrzysztof Błaszkowski (__force __fs32)cpu_to_be32(VXFS_SUPER_MAGIC))) { 2390d83f7fcSKrzysztof Błaszkowski /* HP-UX, parisc */ 2400d83f7fcSKrzysztof Błaszkowski infp->byte_order = VXFS_BO_BE; 2410d83f7fcSKrzysztof Błaszkowski } else { 2421da177e4SLinus Torvalds if (!silent) 2430d83f7fcSKrzysztof Błaszkowski printk(KERN_NOTICE "vxfs: can't find superblock.\n"); 2441da177e4SLinus Torvalds goto out; 2451da177e4SLinus Torvalds } 2461da177e4SLinus Torvalds 2470d83f7fcSKrzysztof Błaszkowski rsbp = infp->vsi_raw; 2480d83f7fcSKrzysztof Błaszkowski j = fs32_to_cpu(infp, rsbp->vs_version); 2490d83f7fcSKrzysztof Błaszkowski if ((j < 2 || j > 4) && !silent) { 2500d83f7fcSKrzysztof Błaszkowski printk(KERN_NOTICE "vxfs: unsupported VxFS version (%d)\n", j); 2511da177e4SLinus Torvalds goto out; 2521da177e4SLinus Torvalds } 2531da177e4SLinus Torvalds 2541da177e4SLinus Torvalds #ifdef DIAGNOSTIC 2550d83f7fcSKrzysztof Błaszkowski printk(KERN_DEBUG "vxfs: supported VxFS version (%d)\n", j); 2560d83f7fcSKrzysztof Błaszkowski printk(KERN_DEBUG "vxfs: blocksize: %d\n", 2570d83f7fcSKrzysztof Błaszkowski fs32_to_cpu(infp, rsbp->vs_bsize)); 2581da177e4SLinus Torvalds #endif 2591da177e4SLinus Torvalds 2600d83f7fcSKrzysztof Błaszkowski sbp->s_magic = fs32_to_cpu(infp, rsbp->vs_magic); 2611da177e4SLinus Torvalds 2620d83f7fcSKrzysztof Błaszkowski infp->vsi_oltext = fs32_to_cpu(infp, rsbp->vs_oltext[0]); 2630d83f7fcSKrzysztof Błaszkowski infp->vsi_oltsize = fs32_to_cpu(infp, rsbp->vs_oltsize); 2641da177e4SLinus Torvalds 2650d83f7fcSKrzysztof Błaszkowski j = fs32_to_cpu(infp, rsbp->vs_bsize); 2660d83f7fcSKrzysztof Błaszkowski if (!sb_set_blocksize(sbp, j)) { 2671da177e4SLinus Torvalds printk(KERN_WARNING "vxfs: unable to set final block size\n"); 2681da177e4SLinus Torvalds goto out; 2691da177e4SLinus Torvalds } 2701da177e4SLinus Torvalds 2711da177e4SLinus Torvalds if (vxfs_read_olt(sbp, bsize)) { 2721da177e4SLinus Torvalds printk(KERN_WARNING "vxfs: unable to read olt\n"); 2731da177e4SLinus Torvalds goto out; 2741da177e4SLinus Torvalds } 2751da177e4SLinus Torvalds 2761da177e4SLinus Torvalds if (vxfs_read_fshead(sbp)) { 2771da177e4SLinus Torvalds printk(KERN_WARNING "vxfs: unable to read fshead\n"); 2781da177e4SLinus Torvalds goto out; 2791da177e4SLinus Torvalds } 2801da177e4SLinus Torvalds 281d0b07948SDavid Howells root = vxfs_iget(sbp, VXFS_ROOT_INO); 282d0b07948SDavid Howells if (IS_ERR(root)) { 283d0b07948SDavid Howells ret = PTR_ERR(root); 284d0b07948SDavid Howells goto out; 285d0b07948SDavid Howells } 28648fde701SAl Viro sbp->s_root = d_make_root(root); 2871da177e4SLinus Torvalds if (!sbp->s_root) { 2881da177e4SLinus Torvalds printk(KERN_WARNING "vxfs: unable to get root dentry.\n"); 2891da177e4SLinus Torvalds goto out_free_ilist; 2901da177e4SLinus Torvalds } 2911da177e4SLinus Torvalds 2921da177e4SLinus Torvalds return 0; 2931da177e4SLinus Torvalds 2941da177e4SLinus Torvalds out_free_ilist: 2950e481d3cSKrzysztof Błaszkowski iput(infp->vsi_fship); 2960e481d3cSKrzysztof Błaszkowski iput(infp->vsi_ilist); 2970e481d3cSKrzysztof Błaszkowski iput(infp->vsi_stilist); 2981da177e4SLinus Torvalds out: 2990d83f7fcSKrzysztof Błaszkowski brelse(infp->vsi_bp); 3001da177e4SLinus Torvalds kfree(infp); 301d0b07948SDavid Howells return ret; 3021da177e4SLinus Torvalds } 3031da177e4SLinus Torvalds 3041da177e4SLinus Torvalds /* 3051da177e4SLinus Torvalds * The usual module blurb. 3061da177e4SLinus Torvalds */ 307152a0836SAl Viro static struct dentry *vxfs_mount(struct file_system_type *fs_type, 308152a0836SAl Viro int flags, const char *dev_name, void *data) 3091da177e4SLinus Torvalds { 310152a0836SAl Viro return mount_bdev(fs_type, flags, dev_name, data, vxfs_fill_super); 3111da177e4SLinus Torvalds } 3121da177e4SLinus Torvalds 3131da177e4SLinus Torvalds static struct file_system_type vxfs_fs_type = { 3141da177e4SLinus Torvalds .owner = THIS_MODULE, 3151da177e4SLinus Torvalds .name = "vxfs", 316152a0836SAl Viro .mount = vxfs_mount, 3171da177e4SLinus Torvalds .kill_sb = kill_block_super, 3181da177e4SLinus Torvalds .fs_flags = FS_REQUIRES_DEV, 3191da177e4SLinus Torvalds }; 3207f78e035SEric W. Biederman MODULE_ALIAS_FS("vxfs"); /* makes mount -t vxfs autoload the module */ 321fa7614ddSEric W. Biederman MODULE_ALIAS("vxfs"); 3221da177e4SLinus Torvalds 3231da177e4SLinus Torvalds static int __init 3241da177e4SLinus Torvalds vxfs_init(void) 3251da177e4SLinus Torvalds { 326a4376e13SAlexey Dobriyan int rv; 327a4376e13SAlexey Dobriyan 328e9a0561bSDavid Windsor vxfs_inode_cachep = kmem_cache_create_usercopy("vxfs_inode", 3291da177e4SLinus Torvalds sizeof(struct vxfs_inode_info), 0, 330e9a0561bSDavid Windsor SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD, 331e9a0561bSDavid Windsor offsetof(struct vxfs_inode_info, vii_immed.vi_immed), 332e9a0561bSDavid Windsor sizeof_field(struct vxfs_inode_info, 333e9a0561bSDavid Windsor vii_immed.vi_immed), 334e9a0561bSDavid Windsor NULL); 335a4376e13SAlexey Dobriyan if (!vxfs_inode_cachep) 3361da177e4SLinus Torvalds return -ENOMEM; 337a4376e13SAlexey Dobriyan rv = register_filesystem(&vxfs_fs_type); 338a4376e13SAlexey Dobriyan if (rv < 0) 339a4376e13SAlexey Dobriyan kmem_cache_destroy(vxfs_inode_cachep); 340a4376e13SAlexey Dobriyan return rv; 3411da177e4SLinus Torvalds } 3421da177e4SLinus Torvalds 3431da177e4SLinus Torvalds static void __exit 3441da177e4SLinus Torvalds vxfs_cleanup(void) 3451da177e4SLinus Torvalds { 3461da177e4SLinus Torvalds unregister_filesystem(&vxfs_fs_type); 3478c0a8537SKirill A. Shutemov /* 3488c0a8537SKirill A. Shutemov * Make sure all delayed rcu free inodes are flushed before we 3498c0a8537SKirill A. Shutemov * destroy cache. 3508c0a8537SKirill A. Shutemov */ 3518c0a8537SKirill A. Shutemov rcu_barrier(); 3521da177e4SLinus Torvalds kmem_cache_destroy(vxfs_inode_cachep); 3531da177e4SLinus Torvalds } 3541da177e4SLinus Torvalds 3551da177e4SLinus Torvalds module_init(vxfs_init); 3561da177e4SLinus Torvalds module_exit(vxfs_cleanup); 357