diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs.h linux/fs/freevxfs/vxfs.h --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs.h Mon May 21 21:31:06 2001 +++ linux/fs/freevxfs/vxfs.h Wed Jan 2 22:04:05 2002 @@ -30,7 +30,7 @@ #ifndef _VXFS_SUPER_H_ #define _VXFS_SUPER_H_ -#ident "$Id: vxfs.h 1.11 2001/05/21 15:40:28 hch Exp hch $" +#ident "$Id: vxfs.h 1.12 2001/12/28 19:48:03 hch Exp $" /* * Veritas filesystem driver - superblock structure. @@ -39,6 +39,7 @@ * superblocks of the Veritas Filesystem. */ #include +#include "vxfs_kcompat.h" /* diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_bmap.c linux/fs/freevxfs/vxfs_bmap.c --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_bmap.c Sat Dec 22 20:06:59 2001 +++ linux/fs/freevxfs/vxfs_bmap.c Wed Jan 2 22:04:05 2002 @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ -#ident "$Id: vxfs_bmap.c,v 1.23 2001/07/05 19:48:03 hch Exp hch $" +#ident "$Id: vxfs_bmap.c,v 1.25 2002/01/02 23:36:55 hch Exp hch $" /* * Veritas filesystem driver - filesystem to disk block mapping. @@ -64,49 +64,47 @@ * The physical block number on success, else Zero. */ static daddr_t -vxfs_bmap_ext4(struct inode *ip, long iblock) +vxfs_bmap_ext4(struct inode *ip, long bn) { - struct vxfs_inode_info *vip = VXFS_INO(ip); - struct super_block *sbp = ip->i_sb; - kdev_t dev = ip->i_dev; - u_long bsize = sbp->s_blocksize; - long size = 0; - int i; + struct super_block *sb = ip->i_sb; + struct vxfs_inode_info *vip = VXFS_INO(ip); + unsigned long bsize = sb->s_blocksize; + u32 indsize = vip->vii_ext4.ve4_indsize; + int i; - for (i = 0; i < VXFS_NDADDR; i++) { - struct direct *dp = vip->vii_ext4.ve4_direct + i; - -#ifdef DIAGNOSTIC - printk(KERN_DEBUG "iblock: %ld, %d (size: %lu)\n", iblock, i, size); - printk(KERN_DEBUG "dp->extent: %d, dp->size: %d\n", dp->extent, dp->size); -#endif + if (indsize > sb->s_blocksize) + goto fail_size; - if (iblock >= size && iblock < (size + dp->size)) - return ((iblock - size) + dp->extent); - size += dp->size; + for (i = 0; i < VXFS_NDADDR; i++) { + struct direct *d = vip->vii_ext4.ve4_direct + i; + if (bn >= 0 && bn < d->size) + return (bn + d->extent); + bn -= d->size; } - iblock -= size; + if ((bn / (indsize * indsize * bsize / 4)) == 0) { + struct buffer_head *buf; + daddr_t bno; + u32 *indir; + + buf = sb_bread(sb, vip->vii_ext4.ve4_indir[0]); + if (!buf || !buffer_mapped(buf)) + goto fail_buf; - if (!(iblock / (vip->vii_ext4.ve4_indsize * vip->vii_ext4.ve4_indsize * bsize >> 2))) { - struct buffer_head *bp; - daddr_t pblock; - - /* - * XXX: is the second indir only used for - * double indirect extents? - */ - bp = bread(dev, vip->vii_ext4.ve4_indir[0], - bsize * ((vip->vii_ext4.ve4_indsize) / bsize) + 1); - pblock = *(bp->b_data + ((iblock / vip->vii_ext4.ve4_indsize) % - (vip->vii_ext4.ve4_indsize * bsize))); + indir = (u32 *)buf->b_data; + bno = indir[(bn/indsize) % (indsize*bn)] + (bn%indsize); - brelse(bp); - return (pblock + (iblock % vip->vii_ext4.ve4_indsize)); + brelse(buf); + return bno; } else printk(KERN_WARNING "no matching indir?"); return 0; + +fail_size: + printk("vxfs: indirect extent to big!\n"); +fail_buf: + return 0; } /** diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_extern.h linux/fs/freevxfs/vxfs_extern.h --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_extern.h Sun Sep 2 19:34:36 2001 +++ linux/fs/freevxfs/vxfs_extern.h Wed Jan 2 22:04:05 2002 @@ -30,7 +30,7 @@ #ifndef _VXFS_EXTERN_H_ #define _VXFS_EXTERN_H_ -#ident "$Id: vxfs_extern.h,v 1.21 2001/08/07 16:13:30 hch Exp hch $" +#ident "$Id: vxfs_extern.h,v 1.22 2001/12/28 20:50:47 hch Exp hch $" /* * Veritas filesystem driver - external prototypes. @@ -71,7 +71,7 @@ extern int vxfs_read_olt(struct super_block *, u_long); /* vxfs_subr.c */ -extern struct page * vxfs_get_page(struct inode *, u_long); +extern struct page * vxfs_get_page(struct address_space *, u_long); extern __inline__ void vxfs_put_page(struct page *); extern struct buffer_head * vxfs_bread(struct inode *, int); diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_fshead.c linux/fs/freevxfs/vxfs_fshead.c --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_fshead.c Sun Sep 2 19:34:36 2001 +++ linux/fs/freevxfs/vxfs_fshead.c Wed Jan 2 22:04:05 2002 @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ -#ident "$Id: vxfs_fshead.c,v 1.19 2001/08/07 16:14:10 hch Exp hch $" +#ident "$Id: vxfs_fshead.c,v 1.20 2002/01/02 22:02:12 hch Exp hch $" /* * Veritas filesystem driver - fileset header routines. @@ -81,9 +81,9 @@ if (buffer_mapped(bp)) { struct vxfs_fsh *fhp; - if (!(fhp = kmalloc(sizeof(struct vxfs_fsh), SLAB_KERNEL))) + if (!(fhp = kmalloc(sizeof(*fhp), SLAB_KERNEL))) return NULL; - memcpy(fhp, bp->b_data, sizeof(struct vxfs_fsh)); + memcpy(fhp, bp->b_data, sizeof(*fhp)); brelse(bp); return (fhp); diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_inode.c linux/fs/freevxfs/vxfs_inode.c --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_inode.c Wed Jan 2 21:47:01 2002 +++ linux/fs/freevxfs/vxfs_inode.c Wed Jan 2 22:04:05 2002 @@ -27,15 +27,15 @@ * SUCH DAMAGE. */ -#ident "$Id: vxfs_inode.c,v 1.37 2001/08/07 16:13:30 hch Exp hch $" +#ident "$Id: vxfs_inode.c,v 1.42 2002/01/02 23:51:36 hch Exp hch $" /* * Veritas filesystem driver - inode routines. */ #include +#include #include #include -#include #include "vxfs.h" #include "vxfs_inode.h" @@ -48,6 +48,7 @@ extern struct inode_operations vxfs_immed_symlink_iops; static struct file_operations vxfs_file_operations = { + .open = generic_file_open, .llseek = generic_file_llseek, .read = generic_file_read, .mmap = generic_file_mmap, @@ -114,7 +115,7 @@ if (!(vip = kmem_cache_alloc(vxfs_inode_cachep, SLAB_KERNEL))) goto fail; dip = (struct vxfs_dinode *)(bp->b_data + offset); - memcpy(vip, dip, sizeof(struct vxfs_inode_info)); + memcpy(vip, dip, sizeof(*vip)); #ifdef DIAGNOSTIC vxfs_dumpi(vip, ino); #endif @@ -146,7 +147,7 @@ u_long offset; offset = (ino % (PAGE_SIZE / VXFS_ISIZE)) * VXFS_ISIZE; - pp = vxfs_get_page(ilistp, ino * VXFS_ISIZE / PAGE_SIZE); + pp = vxfs_get_page(ilistp->i_mapping, ino * VXFS_ISIZE / PAGE_SIZE); if (!IS_ERR(pp)) { struct vxfs_inode_info *vip; @@ -156,7 +157,7 @@ if (!(vip = kmem_cache_alloc(vxfs_inode_cachep, SLAB_KERNEL))) goto fail; dip = (struct vxfs_dinode *)(kaddr + offset); - memcpy(vip, dip, sizeof(struct vxfs_inode_info)); + memcpy(vip, dip, sizeof(*vip)); #ifdef DIAGNOSTIC vxfs_dumpi(vip, ino); #endif diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_kcompat.h linux/fs/freevxfs/vxfs_kcompat.h --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_kcompat.h Thu Jan 1 01:00:00 1970 +++ linux/fs/freevxfs/vxfs_kcompat.h Wed Jan 2 22:04:05 2002 @@ -0,0 +1,49 @@ +#ifndef _VXFS_KCOMPAT_H +#define _VXFS_KCOMPAT_H + +#include + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) + +#include + +typedef long sector_t; + +/* From include/linux/fs.h (Linux 2.5.2-pre3) */ +static inline struct buffer_head * sb_bread(struct super_block *sb, int block) +{ + return bread(sb->s_dev, block, sb->s_blocksize); +} + +/* Dito. */ +static inline void map_bh(struct buffer_head *bh, struct super_block *sb, int block) +{ + bh->b_state |= 1 << BH_Mapped; + bh->b_dev = sb->s_dev; + bh->b_blocknr = block; +} + +/* From fs/block_dev.c (Linux 2.5.2-pre2) */ +static inline int sb_set_blocksize(struct super_block *sb, int size) +{ + int bits; + if (set_blocksize(sb->s_dev, size) < 0) + return 0; + sb->s_blocksize = size; + for (bits = 9, size >>= 9; size >>= 1; bits++) + ; + sb->s_blocksize_bits = bits; + return sb->s_blocksize; +} + +/* Dito. */ +static inline int sb_min_blocksize(struct super_block *sb, int size) +{ + int minsize = get_hardsect_size(sb->s_dev); + if (size < minsize) + size = minsize; + return sb_set_blocksize(sb, size); +} + +#endif /* Kernel 2.4 */ +#endif /* _VXFS_KCOMPAT_H */ diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_lookup.c linux/fs/freevxfs/vxfs_lookup.c --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_lookup.c Thu Jun 28 02:10:55 2001 +++ linux/fs/freevxfs/vxfs_lookup.c Wed Jan 2 22:04:05 2002 @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ -#ident "$Id: vxfs_lookup.c,v 1.19 2001/05/30 19:50:20 hch Exp hch $" +#ident "$Id: vxfs_lookup.c,v 1.21 2002/01/02 22:00:13 hch Exp hch $" /* * Veritas filesystem driver - lookup and other directory related code. @@ -126,7 +126,7 @@ caddr_t kaddr; struct page *pp; - pp = vxfs_get_page(ip, page); + pp = vxfs_get_page(ip->i_mapping, page); if (IS_ERR(pp)) continue; kaddr = (caddr_t)page_address(pp); @@ -273,7 +273,7 @@ caddr_t kaddr; struct page *pp; - pp = vxfs_get_page(ip, page); + pp = vxfs_get_page(ip->i_mapping, page); if (IS_ERR(pp)) continue; kaddr = (caddr_t)page_address(pp); @@ -318,6 +318,5 @@ done: fp->f_pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2; out: - fp->f_version = ip->i_version; return 0; } diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_olt.c linux/fs/freevxfs/vxfs_olt.c --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_olt.c Sun Sep 2 19:34:36 2001 +++ linux/fs/freevxfs/vxfs_olt.c Wed Jan 2 22:04:05 2002 @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ -#ident "$Id: vxfs_olt.c,v 1.9 2001/08/07 16:14:45 hch Exp hch $" +#ident "$Id: vxfs_olt.c,v 1.10 2002/01/02 23:03:58 hch Exp hch $" /* * Veritas filesystem driver - object location table support. @@ -85,8 +85,7 @@ char *oaddr, *eaddr; - bp = bread(sbp->s_dev, - vxfs_oblock(sbp, infp->vsi_oltext, bsize), bsize); + bp = sb_bread(sbp, vxfs_oblock(sbp, infp->vsi_oltext, bsize)); if (!bp || !bp->b_data) goto fail; @@ -96,6 +95,16 @@ goto fail; } + /* + * It is in theory possible that vsi_oltsize is > 1. + * I've not seen any such filesystem yet and I'm lazy.. --hch + */ + if (infp->vsi_oltsize > 1) { + printk(KERN_NOTICE "vxfs: oltsize > 1 detected.\n"); + printk(KERN_NOTICE "vxfs: please notify hch@caldera.de\n"); + goto fail; + } + oaddr = (char *)bp->b_data + op->olt_size; eaddr = (char *)bp->b_data + (infp->vsi_oltsize * sbp->s_blocksize); diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_subr.c linux/fs/freevxfs/vxfs_subr.c --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_subr.c Wed Jan 2 21:47:01 2002 +++ linux/fs/freevxfs/vxfs_subr.c Wed Jan 2 22:04:05 2002 @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ -#ident "$Id: vxfs_subr.c,v 1.5 2001/04/26 22:49:51 hch Exp hch $" +#ident "$Id: vxfs_subr.c,v 1.8 2001/12/28 20:50:47 hch Exp hch $" /* * Veritas filesystem driver - shared subroutines. @@ -37,6 +37,7 @@ #include #include +#include "vxfs_kcompat.h" #include "vxfs_extern.h" @@ -62,9 +63,8 @@ * The wanted page on success, else a NULL pointer. */ struct page * -vxfs_get_page(struct inode *ip, u_long n) +vxfs_get_page(struct address_space *mapping, u_long n) { - struct address_space * mapping = ip->i_mapping; struct page * pp; pp = read_cache_page(mapping, n, diff -uNr -Xdontdiff /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_super.c linux/fs/freevxfs/vxfs_super.c --- /build/hch/master/linux-2.5.2-pre6/fs/freevxfs/vxfs_super.c Thu Oct 11 18:43:38 2001 +++ linux/fs/freevxfs/vxfs_super.c Wed Jan 2 22:04:05 2002 @@ -27,7 +27,7 @@ * SUCH DAMAGE. */ -#ident "$Id: vxfs_super.c,v 1.26 2001/08/07 16:13:30 hch Exp hch $" +#ident "$Id: vxfs_super.c,v 1.29 2002/01/02 22:02:12 hch Exp hch $" /* * Veritas filesystem driver - superblock related routines. @@ -62,19 +62,6 @@ .statfs = vxfs_statfs, }; -static __inline__ u_long -vxfs_validate_bsize(kdev_t dev) -{ - u_long bsize; - - bsize = get_hardsect_size(dev); - if (bsize < BLOCK_SIZE) - bsize = BLOCK_SIZE; - - set_blocksize(dev, bsize); - return (bsize); -} - /** * vxfs_put_super - free superblock resources * @sbp: VFS superblock. @@ -153,21 +140,24 @@ { struct vxfs_sb_info *infp; struct vxfs_sb *rsbp; - struct buffer_head *bp; + struct buffer_head *bp = NULL; u_long bsize; - kdev_t dev = sbp->s_dev; - infp = kmalloc(sizeof(struct vxfs_sb_info), GFP_KERNEL); + infp = kmalloc(sizeof(*infp), GFP_KERNEL); if (!infp) { printk(KERN_WARNING "vxfs: unable to allocate incore superblock\n"); return NULL; } - memset(infp, 0, sizeof(struct vxfs_sb_info)); + memset(infp, 0, sizeof(*infp)); - bsize = vxfs_validate_bsize(dev); + bsize = sb_min_blocksize(sbp, BLOCK_SIZE); + if (!bsize) { + printk(KERN_WARNING "vxfs: unable to set blocksize\n"); + goto out; + } - bp = bread(dev, 1, bsize); - if (!bp) { + bp = sb_bread(sbp, 1); + if (!bp || !buffer_mapped(bp)) { if (!silent) { printk(KERN_WARNING "vxfs: unable to read disk superblock\n"); @@ -194,31 +184,15 @@ #endif sbp->s_magic = rsbp->vs_magic; - sbp->s_blocksize = rsbp->vs_bsize; sbp->u.generic_sbp = (void *)infp; infp->vsi_raw = rsbp; infp->vsi_bp = bp; infp->vsi_oltext = rsbp->vs_oltext[0]; infp->vsi_oltsize = rsbp->vs_oltsize; - - switch (rsbp->vs_bsize) { - case 1024: - sbp->s_blocksize_bits = 10; - break; - case 2048: - sbp->s_blocksize_bits = 11; - break; - case 4096: - sbp->s_blocksize_bits = 12; - break; - default: - if (!silent) { - printk(KERN_WARNING - "vxfs: unsupported blocksise: %d\n", - rsbp->vs_bsize); - } + if (!sb_set_blocksize(sbp, rsbp->vs_bsize)) { + printk(KERN_WARNING "vxfs: unable to set final block size\n"); goto out; }