^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Copyright (c) 2000-2001 Christoph Hellwig.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2016 Krzysztof Blaszkowski
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * modification, are permitted provided that the following conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * 1. Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * notice, this list of conditions, and the following disclaimer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * without modification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * 2. The name of the author may not be used to endorse or promote products
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * derived from this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Alternatively, this software may be distributed under the terms of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * GNU General Public License ("GPL").
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * Veritas filesystem driver - superblock related routines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <linux/buffer_head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include <linux/stat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include <linux/vfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #include <linux/mount.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include "vxfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #include "vxfs_extern.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include "vxfs_dir.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include "vxfs_inode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) MODULE_AUTHOR("Christoph Hellwig, Krzysztof Blaszkowski");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) MODULE_DESCRIPTION("Veritas Filesystem (VxFS) driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) MODULE_LICENSE("Dual BSD/GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static struct kmem_cache *vxfs_inode_cachep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * vxfs_put_super - free superblock resources
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * @sbp: VFS superblock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * vxfs_put_super frees all resources allocated for @sbp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * after the last instance of the filesystem is unmounted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) vxfs_put_super(struct super_block *sbp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) struct vxfs_sb_info *infp = VXFS_SBI(sbp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) iput(infp->vsi_fship);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) iput(infp->vsi_ilist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) iput(infp->vsi_stilist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) brelse(infp->vsi_bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) kfree(infp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * vxfs_statfs - get filesystem information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * @dentry: VFS dentry to locate superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * @bufp: output buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * vxfs_statfs fills the statfs buffer @bufp with information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * about the filesystem described by @dentry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) * Zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * No locks held.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * Notes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * This is everything but complete...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) struct vxfs_sb_info *infp = VXFS_SBI(dentry->d_sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct vxfs_sb *raw_sb = infp->vsi_raw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) bufp->f_type = VXFS_SUPER_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) bufp->f_bsize = dentry->d_sb->s_blocksize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) bufp->f_blocks = fs32_to_cpu(infp, raw_sb->vs_dsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) bufp->f_bfree = fs32_to_cpu(infp, raw_sb->vs_free);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) bufp->f_bavail = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) bufp->f_files = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) bufp->f_ffree = fs32_to_cpu(infp, raw_sb->vs_ifree);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) bufp->f_namelen = VXFS_NAMELEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static int vxfs_remount(struct super_block *sb, int *flags, char *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) sync_filesystem(sb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) *flags |= SB_RDONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static struct inode *vxfs_alloc_inode(struct super_block *sb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct vxfs_inode_info *vi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) vi = kmem_cache_alloc(vxfs_inode_cachep, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) if (!vi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) inode_init_once(&vi->vfs_inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) return &vi->vfs_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) static void vxfs_free_inode(struct inode *inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) kmem_cache_free(vxfs_inode_cachep, VXFS_INO(inode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static const struct super_operations vxfs_super_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) .alloc_inode = vxfs_alloc_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .free_inode = vxfs_free_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .evict_inode = vxfs_evict_inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .put_super = vxfs_put_super,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) .statfs = vxfs_statfs,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .remount_fs = vxfs_remount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) static int vxfs_try_sb_magic(struct super_block *sbp, int silent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) unsigned blk, __fs32 magic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) struct buffer_head *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) struct vxfs_sb *rsbp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) struct vxfs_sb_info *infp = VXFS_SBI(sbp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) int rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) bp = sb_bread(sbp, blk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (!bp || !buffer_mapped(bp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) if (!silent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) printk(KERN_WARNING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) "vxfs: unable to read disk superblock at %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) blk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) rsbp = (struct vxfs_sb *)bp->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) if (rsbp->vs_magic != magic) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (!silent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) printk(KERN_NOTICE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) "vxfs: WRONG superblock magic %08x at %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) rsbp->vs_magic, blk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) infp->vsi_raw = rsbp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) infp->vsi_bp = bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) } while (0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) infp->vsi_raw = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) infp->vsi_bp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) brelse(bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * vxfs_read_super - read superblock into memory and initialize filesystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * @sbp: VFS superblock (to fill)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * @dp: fs private mount data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * @silent: do not complain loudly when sth is wrong
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) * We are called on the first mount of a filesystem to read the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) * superblock into memory and do some basic setup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) * The superblock on success, else %NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) * We are under @sbp->s_lock.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) struct vxfs_sb_info *infp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) struct vxfs_sb *rsbp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) u_long bsize;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) struct inode *root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) int ret = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) u32 j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) sbp->s_flags |= SB_RDONLY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) infp = kzalloc(sizeof(*infp), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) if (!infp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) printk(KERN_WARNING "vxfs: unable to allocate incore superblock\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) bsize = sb_min_blocksize(sbp, BLOCK_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) if (!bsize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) printk(KERN_WARNING "vxfs: unable to set blocksize\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) sbp->s_op = &vxfs_super_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) sbp->s_fs_info = infp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) sbp->s_time_min = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) sbp->s_time_max = U32_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) if (!vxfs_try_sb_magic(sbp, silent, 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) (__force __fs32)cpu_to_le32(VXFS_SUPER_MAGIC))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* Unixware, x86 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) infp->byte_order = VXFS_BO_LE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) } else if (!vxfs_try_sb_magic(sbp, silent, 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) (__force __fs32)cpu_to_be32(VXFS_SUPER_MAGIC))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) /* HP-UX, parisc */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) infp->byte_order = VXFS_BO_BE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (!silent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) printk(KERN_NOTICE "vxfs: can't find superblock.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) rsbp = infp->vsi_raw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) j = fs32_to_cpu(infp, rsbp->vs_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) if ((j < 2 || j > 4) && !silent) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) printk(KERN_NOTICE "vxfs: unsupported VxFS version (%d)\n", j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #ifdef DIAGNOSTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) printk(KERN_DEBUG "vxfs: supported VxFS version (%d)\n", j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) printk(KERN_DEBUG "vxfs: blocksize: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) fs32_to_cpu(infp, rsbp->vs_bsize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) sbp->s_magic = fs32_to_cpu(infp, rsbp->vs_magic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) infp->vsi_oltext = fs32_to_cpu(infp, rsbp->vs_oltext[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) infp->vsi_oltsize = fs32_to_cpu(infp, rsbp->vs_oltsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) j = fs32_to_cpu(infp, rsbp->vs_bsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (!sb_set_blocksize(sbp, j)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) printk(KERN_WARNING "vxfs: unable to set final block size\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) if (vxfs_read_olt(sbp, bsize)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) printk(KERN_WARNING "vxfs: unable to read olt\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) if (vxfs_read_fshead(sbp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) printk(KERN_WARNING "vxfs: unable to read fshead\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) root = vxfs_iget(sbp, VXFS_ROOT_INO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (IS_ERR(root)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) ret = PTR_ERR(root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) sbp->s_root = d_make_root(root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) if (!sbp->s_root) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) printk(KERN_WARNING "vxfs: unable to get root dentry.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) goto out_free_ilist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) out_free_ilist:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) iput(infp->vsi_fship);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) iput(infp->vsi_ilist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) iput(infp->vsi_stilist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) brelse(infp->vsi_bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) kfree(infp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * The usual module blurb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) static struct dentry *vxfs_mount(struct file_system_type *fs_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) int flags, const char *dev_name, void *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) return mount_bdev(fs_type, flags, dev_name, data, vxfs_fill_super);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) static struct file_system_type vxfs_fs_type = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) .name = "vxfs",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) .mount = vxfs_mount,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) .kill_sb = kill_block_super,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) .fs_flags = FS_REQUIRES_DEV,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) MODULE_ALIAS_FS("vxfs"); /* makes mount -t vxfs autoload the module */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) MODULE_ALIAS("vxfs");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) vxfs_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) vxfs_inode_cachep = kmem_cache_create_usercopy("vxfs_inode",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) sizeof(struct vxfs_inode_info), 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) offsetof(struct vxfs_inode_info, vii_immed.vi_immed),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) sizeof_field(struct vxfs_inode_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) vii_immed.vi_immed),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) if (!vxfs_inode_cachep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) rv = register_filesystem(&vxfs_fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) kmem_cache_destroy(vxfs_inode_cachep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) static void __exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) vxfs_cleanup(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) unregister_filesystem(&vxfs_fs_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) * Make sure all delayed rcu free inodes are flushed before we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) * destroy cache.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) rcu_barrier();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) kmem_cache_destroy(vxfs_inode_cachep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) module_init(vxfs_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) module_exit(vxfs_cleanup);