^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) * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * modification, are permitted provided that the following conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * 1. Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * notice, this list of conditions, and the following disclaimer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * without modification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * 2. The name of the author may not be used to endorse or promote products
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * derived from this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * Alternatively, this software may be distributed under the terms of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * GNU General Public License ("GPL").
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) */
^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) * Veritas filesystem driver - object location table support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <linux/buffer_head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include "vxfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #include "vxfs_olt.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include "vxfs_extern.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) vxfs_get_fshead(struct vxfs_oltfshead *fshp, struct vxfs_sb_info *infp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) BUG_ON(infp->vsi_fshino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) infp->vsi_fshino = fs32_to_cpu(infp, fshp->olt_fsino[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) static inline void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) vxfs_get_ilist(struct vxfs_oltilist *ilistp, struct vxfs_sb_info *infp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) BUG_ON(infp->vsi_iext);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) infp->vsi_iext = fs32_to_cpu(infp, ilistp->olt_iext[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static inline u_long
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) vxfs_oblock(struct super_block *sbp, daddr_t block, u_long bsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) BUG_ON(sbp->s_blocksize % bsize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) return (block * (sbp->s_blocksize / bsize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^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_read_olt - read olt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * @sbp: superblock of the filesystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * @bsize: blocksize of the filesystem
^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_read_olt reads the olt of the filesystem described by @sbp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * into main memory and does some basic setup.
^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) * Zero on success, else a negative error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) vxfs_read_olt(struct super_block *sbp, u_long bsize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) struct vxfs_sb_info *infp = VXFS_SBI(sbp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct buffer_head *bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) struct vxfs_olt *op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) char *oaddr, *eaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) bp = sb_bread(sbp, vxfs_oblock(sbp, infp->vsi_oltext, bsize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (!bp || !bp->b_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) op = (struct vxfs_olt *)bp->b_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (fs32_to_cpu(infp, op->olt_magic) != VXFS_OLT_MAGIC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) printk(KERN_NOTICE "vxfs: ivalid olt magic number\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * It is in theory possible that vsi_oltsize is > 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * I've not seen any such filesystem yet and I'm lazy.. --hch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (infp->vsi_oltsize > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) printk(KERN_NOTICE "vxfs: oltsize > 1 detected.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) printk(KERN_NOTICE "vxfs: please notify hch@infradead.org\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) goto fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) oaddr = bp->b_data + fs32_to_cpu(infp, op->olt_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) eaddr = bp->b_data + (infp->vsi_oltsize * sbp->s_blocksize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) while (oaddr < eaddr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) struct vxfs_oltcommon *ocp =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) (struct vxfs_oltcommon *)oaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) switch (fs32_to_cpu(infp, ocp->olt_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) case VXFS_OLT_FSHEAD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) vxfs_get_fshead((struct vxfs_oltfshead *)oaddr, infp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) case VXFS_OLT_ILIST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) vxfs_get_ilist((struct vxfs_oltilist *)oaddr, infp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) break;
^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) oaddr += fs32_to_cpu(infp, ocp->olt_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) brelse(bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) return (infp->vsi_fshino && infp->vsi_iext) ? 0 : -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) brelse(bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) }