^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 - fileset header routines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/buffer_head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #include "vxfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include "vxfs_inode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #include "vxfs_extern.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include "vxfs_fshead.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #ifdef DIAGNOSTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) vxfs_dumpfsh(struct vxfs_fsh *fhp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) printk("\n\ndumping fileset header:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) printk("----------------------------\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) printk("version: %u\n", fhp->fsh_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) printk("fsindex: %u\n", fhp->fsh_fsindex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) printk("iauino: %u\tninodes:%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) fhp->fsh_iauino, fhp->fsh_ninodes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) printk("maxinode: %u\tlctino: %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) fhp->fsh_maxinode, fhp->fsh_lctino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) printk("nau: %u\n", fhp->fsh_nau);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) printk("ilistino[0]: %u\tilistino[1]: %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) fhp->fsh_ilistino[0], fhp->fsh_ilistino[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * vxfs_getfsh - read fileset header into memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * @ip: the (fake) fileset header inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * @which: 0 for the structural, 1 for the primary fsh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * vxfs_getfsh reads either the structural or primary fileset header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * described by @ip into memory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * The fileset header structure on success, else Zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) static struct vxfs_fsh *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) vxfs_getfsh(struct inode *ip, int which)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) struct buffer_head *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) bp = vxfs_bread(ip, which);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) if (bp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) struct vxfs_fsh *fhp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (!(fhp = kmalloc(sizeof(*fhp), GFP_KERNEL)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) memcpy(fhp, bp->b_data, sizeof(*fhp));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) put_bh(bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) return (fhp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) brelse(bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * vxfs_read_fshead - read the fileset headers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * @sbp: superblock to which the fileset belongs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * vxfs_read_fshead will fill the inode and structural inode list in @sb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) * Returns:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * Zero on success, else a negative error code (-EINVAL).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) vxfs_read_fshead(struct super_block *sbp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct vxfs_sb_info *infp = VXFS_SBI(sbp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct vxfs_fsh *pfp, *sfp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) struct vxfs_inode_info *vip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) infp->vsi_fship = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) if (!infp->vsi_fship) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) printk(KERN_ERR "vxfs: unable to read fsh inode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) vip = VXFS_INO(infp->vsi_fship);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) if (!VXFS_ISFSH(vip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) printk(KERN_ERR "vxfs: fsh list inode is of wrong type (%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) vip->vii_mode & VXFS_TYPE_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) goto out_iput_fship;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #ifdef DIAGNOSTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) printk("vxfs: fsh inode dump:\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) vxfs_dumpi(vip, infp->vsi_fshino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) sfp = vxfs_getfsh(infp->vsi_fship, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if (!sfp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) printk(KERN_ERR "vxfs: unable to get structural fsh\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) goto out_iput_fship;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #ifdef DIAGNOSTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) vxfs_dumpfsh(sfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) pfp = vxfs_getfsh(infp->vsi_fship, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) if (!pfp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) printk(KERN_ERR "vxfs: unable to get primary fsh\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) goto out_free_sfp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #ifdef DIAGNOSTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) vxfs_dumpfsh(pfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) infp->vsi_stilist = vxfs_blkiget(sbp, infp->vsi_iext,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) fs32_to_cpu(infp, sfp->fsh_ilistino[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) if (!infp->vsi_stilist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) printk(KERN_ERR "vxfs: unable to get structural list inode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) goto out_free_pfp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) if (!VXFS_ISILT(VXFS_INO(infp->vsi_stilist))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) printk(KERN_ERR "vxfs: structural list inode is of wrong type (%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) VXFS_INO(infp->vsi_stilist)->vii_mode & VXFS_TYPE_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) goto out_iput_stilist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) infp->vsi_ilist = vxfs_stiget(sbp, fs32_to_cpu(infp, pfp->fsh_ilistino[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) if (!infp->vsi_ilist) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) printk(KERN_ERR "vxfs: unable to get inode list inode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) goto out_iput_stilist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) if (!VXFS_ISILT(VXFS_INO(infp->vsi_ilist))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) printk(KERN_ERR "vxfs: inode list inode is of wrong type (%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) VXFS_INO(infp->vsi_ilist)->vii_mode & VXFS_TYPE_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) goto out_iput_ilist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) kfree(pfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) kfree(sfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) out_iput_ilist:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) iput(infp->vsi_ilist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) out_iput_stilist:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) iput(infp->vsi_stilist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) out_free_pfp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) kfree(pfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) out_free_sfp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) kfree(sfp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) out_iput_fship:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) iput(infp->vsi_fship);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) }