Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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);