Re: freevxfs: hp-ux support. patchset 1-7/7 rev 2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Carlos,

Thanks for review. Will fix these things and send tomorrow morning
likely. Today just can't.

On Mon, 2016-05-30 at 13:19 +0200, Carlos Maiolino wrote:
> Hi Krzysztof,
> 
> This is more a style review than functionality itself (although I've added a few
> comments in this context too).
> 
> But, for now on, please:
> 	- Submit each patch in a single e-mail, it's much easier to review the
> 	  patches in a single context, than have 7 patches and 2k lines of
> 	  different contexts in a single e-mail.
> 	- Fix the kernel style and indentation problems.
> 
> If you need help regarding sending the patches in the right format to the list,
> let me know off-list, since, I don't believe the list is the right place to keep
> discussing how to properly send patches to the list and kernel coding style
> stuff.
> And people will be much happier reviewing properly formatted code, and different
> patches in single e-mails.
> 
> I've added some comments below
> 
> On Sat, May 28, 2016 at 09:40:27PM +0200, Krzysztof Błaszkowski wrote:
> > Hi Carlos,
> > 
> > Christoph told me that you can look at these patches I prepared.
> > 
> > The patchset has follwing changes since previous release:
> > - preprocesor expanded local macros,
> > - merged credits patches,
> > - struct inode placed inside local structure vxfs_vfs_inode.
> > 
> > Last change is the most complex and makes an impact on e.g.
> > read_fshead() and actually it is only one proper solution. A file system
> > must not use destroy_inode callback without alloc_inode. if it does
> > then inode structures will not be returned to fs/inode.c: inode_cachep.
> > 
> > From 56ac335ff74706be4c3e30925d2c8c47a19eab9e Mon Sep 17 00:00:00 2001
> > From: KB <kb@xxxxxxxxxxxxxxx>
> > Date: Sat, 28 May 2016 20:55:19 +0200
> > Subject: [PATCH 1/7] cpu endianess vs file system, two locations of the sb
> > 
> > 
> > Signed-off-by: KB <kb@xxxxxxxxxxxxxxx>
> > ---
> >  fs/freevxfs/vxfs.h        |   25 ++++++++++-
> >  fs/freevxfs/vxfs_bmap.c   |   24 ++++++----
> >  fs/freevxfs/vxfs_fshead.c |   25 ++++++++++-
> >  fs/freevxfs/vxfs_inode.c  |   57 +++++++++++++++++++++++-
> >  fs/freevxfs/vxfs_inode.h  |    8 ++--
> >  fs/freevxfs/vxfs_lookup.c |   15 +++++-
> >  fs/freevxfs/vxfs_olt.c    |   15 +++---
> >  fs/freevxfs/vxfs_super.c  |  108 +++++++++++++++++++++++++++++++++------------
> >  8 files changed, 221 insertions(+), 56 deletions(-)
> > 
> > diff --git a/fs/freevxfs/vxfs.h b/fs/freevxfs/vxfs.h
> > index c8a9265..5dc8949 100644
> > --- a/fs/freevxfs/vxfs.h
> > +++ b/fs/freevxfs/vxfs.h
> > @@ -152,7 +152,7 @@ struct vxfs_sb {
> >  	/*
> >  	 * Actually much more...
> >  	 */
> > -};
> > +} __packed;
> >  
> >  
> >  /*
> > @@ -168,9 +168,32 @@ struct vxfs_sb_info {
> >  	ino_t			vsi_fshino;	/* fileset header inode */
> >  	daddr_t			vsi_oltext;	/* OLT extent */
> >  	daddr_t			vsi_oltsize;	/* OLT size */
> > +	int byte_order;
> > +	int silent;
> 
> These definitions are still not aligned. What Christoph meant before, was
> indentation alignment.

I see, okay, so the text alignment, good enough. I dislike the old
alignment because it looks bad anyway can add a few tabs.


> 
> > +};
> > +
> > +enum {
> > +	BO_LE = 1,
> > +	BO_BE
> >  };
> >  
> >  
> > +static inline u32 fs32_to_cpu(int bo, u32 a)
> > +{
> > +	return (bo == BO_BE) ? be32_to_cpu(a) : le32_to_cpu(a);
> > +}
> > +
> > +static inline u16 fs16_to_cpu(int bo, u16 a)
> > +{
> > +	return (bo == BO_BE) ? be16_to_cpu(a) : le16_to_cpu(a);
> > +}
> > +
> > +static inline u64 fs64_to_cpu(int bo, u64 a)
> > +{
> > +	return (bo == BO_BE) ? be64_to_cpu(a) : le64_to_cpu(a);
> > +}
> > +
> > +
> >  /*
> >   * File modes.  File types above 0xf000 are vxfs internal only, they should
> >   * not be passed back to higher levels of the system.  vxfs file types must
> > diff --git a/fs/freevxfs/vxfs_bmap.c b/fs/freevxfs/vxfs_bmap.c
> > index f86fd3c..95afd98 100644
> > --- a/fs/freevxfs/vxfs_bmap.c
> > +++ b/fs/freevxfs/vxfs_bmap.c
> > @@ -92,7 +92,8 @@ vxfs_bmap_ext4(struct inode *ip, long bn)
> >  			goto fail_buf;
> >  
> >  		indir = (u32 *)buf->b_data;
> > -		bno = indir[(bn/indsize) % (indsize*bn)] + (bn%indsize);
> > +		bno = fs32_to_cpu(VXFS_SBI(sb)->byte_order,
> > +		    indir[(bn/indsize) % (indsize*bn)]) + (bn % indsize);
> >  
> >  		brelse(buf);
> >  		return bno;
> > @@ -130,6 +131,7 @@ vxfs_bmap_indir(struct inode *ip, long indir, int size, long block)
> >  	struct buffer_head		*bp = NULL;
> >  	daddr_t				pblock = 0;
> >  	int				i;
> > +	int bo = VXFS_SBI(ip->i_sb)->byte_order;
> >  
> Indentation please.

....


> 
> >  	for (i = 0; i < size * VXFS_TYPED_PER_BLOCK(ip->i_sb); i++) {
> >  		struct vxfs_typed	*typ;
> > @@ -142,24 +144,24 @@ vxfs_bmap_indir(struct inode *ip, long indir, int size, long block)
> >  
> >  		typ = ((struct vxfs_typed *)bp->b_data) +
> >  			(i % VXFS_TYPED_PER_BLOCK(ip->i_sb));
> > -		off = (typ->vt_hdr & VXFS_TYPED_OFFSETMASK);
> > +		off = fs64_to_cpu(bo, typ->vt_hdr) & VXFS_TYPED_OFFSETMASK;
> >  
> >  		if (block < off) {
> >  			brelse(bp);
> >  			continue;
> >  		}
> >  
> > -		switch ((u_int32_t)(typ->vt_hdr >> VXFS_TYPED_TYPESHIFT)) {
> > +		switch ((u_int32_t)(fs64_to_cpu(bo, typ->vt_hdr) >> VXFS_TYPED_TYPESHIFT)) {
> >  		case VXFS_TYPED_INDIRECT:
> > -			pblock = vxfs_bmap_indir(ip, typ->vt_block,
> > -					typ->vt_size, block - off);
> > +			pblock = vxfs_bmap_indir(ip, fs32_to_cpu(bo, typ->vt_block),
> > +					fs32_to_cpu(bo, typ->vt_size), block - off);
> >  			if (pblock == -2)
> >  				break;
> >  			goto out;
> >  		case VXFS_TYPED_DATA:
> > -			if ((block - off) >= typ->vt_size)
> > +			if ((block - off) >= fs32_to_cpu(bo, typ->vt_size))
> >  				break;
> > -			pblock = (typ->vt_block + block - off);
> > +			pblock = fs32_to_cpu(bo, typ->vt_block) + block - off;
> >  			goto out;
> >  		case VXFS_TYPED_INDIRECT_DEV4:
> >  		case VXFS_TYPED_DATA_DEV4: {
> > @@ -168,12 +170,14 @@ vxfs_bmap_indir(struct inode *ip, long indir, int size, long block)
> >  
> >  			printk(KERN_INFO "\n\nTYPED_DEV4 detected!\n");
> >  			printk(KERN_INFO "block: %Lu\tsize: %Ld\tdev: %d\n",
> > -			       (unsigned long long) typ4->vd4_block,
> > -			       (unsigned long long) typ4->vd4_size,
> > -			       typ4->vd4_dev);
> > +			       (unsigned long long) fs64_to_cpu(bo, typ4->vd4_block),
> > +			       (unsigned long long) fs64_to_cpu(bo, typ4->vd4_size),
> > +			       fs32_to_cpu(bo, typ4->vd4_dev));
> >  			goto fail;
> >  		}
> >  		default:
> > +			printk(KERN_ERR "%s:%d vt_hdr %llu\n", __func__, __LINE__,
> > +			    fs64_to_cpu(bo, typ->vt_hdr));
> >  			BUG();
> >  		}
> >  		brelse(bp);
> > diff --git a/fs/freevxfs/vxfs_fshead.c b/fs/freevxfs/vxfs_fshead.c
> > index c9a6a94..05cced0 100644
> > --- a/fs/freevxfs/vxfs_fshead.c
> > +++ b/fs/freevxfs/vxfs_fshead.c
> > @@ -60,6 +60,29 @@ vxfs_dumpfsh(struct vxfs_fsh *fhp)
> >  }
> >  #endif
> >  
> > +
> > +static inline void dbh2fhp(struct vxfs_fsh *fhp, void *_dbh, int bo)
> > +{
> > + struct vxfs_fsh *dbh = (struct vxfs_fsh *)_dbh;
> > +
> > + fhp->fsh_version = fs32_to_cpu(bo, dbh->fsh_version);
> > + fhp->fsh_fsindex = fs32_to_cpu(bo, dbh->fsh_fsindex);
> > + fhp->fsh_time = fs32_to_cpu(bo, dbh->fsh_time);
> > + fhp->fsh_utime = fs32_to_cpu(bo, dbh->fsh_utime);
> > + fhp->fsh_extop = fs32_to_cpu(bo, dbh->fsh_extop);
> > + fhp->fsh_ninodes = fs32_to_cpu(bo, dbh->fsh_ninodes);
> > + fhp->fsh_nau = fs32_to_cpu(bo, dbh->fsh_nau);
> > + fhp->fsh_old_ilesize = fs32_to_cpu(bo, dbh->fsh_old_ilesize);
> > + fhp->fsh_dflags = fs32_to_cpu(bo, dbh->fsh_dflags);
> > + fhp->fsh_quota = fs32_to_cpu(bo, dbh->fsh_quota);
> > + fhp->fsh_maxinode = fs32_to_cpu(bo, dbh->fsh_maxinode);
> > + fhp->fsh_iauino = fs32_to_cpu(bo, dbh->fsh_iauino);
> > + fhp->fsh_ilistino[0] = fs32_to_cpu(bo, dbh->fsh_ilistino[0]);
> > + fhp->fsh_ilistino[1] = fs32_to_cpu(bo, dbh->fsh_ilistino[1]);
> > + fhp->fsh_lctino = fs32_to_cpu(bo, dbh->fsh_lctino);
> > +}
> > +
> > +
> >  /**
> >   * vxfs_getfsh - read fileset header into memory
> >   * @ip:		the (fake) fileset header inode
> > @@ -83,7 +106,7 @@ vxfs_getfsh(struct inode *ip, int which)
> >  
> >  		if (!(fhp = kmalloc(sizeof(*fhp), GFP_KERNEL)))
> >  			goto out;
> > -		memcpy(fhp, bp->b_data, sizeof(*fhp));
> > +		dbh2fhp(fhp, bp->b_data, VXFS_SBI(ip->i_sb)->byte_order);
> >  
> >  		put_bh(bp);
> >  		return (fhp);
> > diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
> > index 363e3ae..86db3c2 100644
> > --- a/fs/freevxfs/vxfs_inode.c
> > +++ b/fs/freevxfs/vxfs_inode.c
> > @@ -67,6 +67,59 @@ vxfs_dumpi(struct vxfs_inode_info *vip, ino_t ino)
> >  }
> >  #endif
> >  
> > +static inline void dip2vip_cpy(struct vxfs_inode_info *vip, struct vxfs_dinode *dip, int bo)
> > +{
> > + int j;
> > +
> > + vip->vdi_mode = fs32_to_cpu(bo, dip->vdi_mode);
> > + vip->vdi_nlink = fs32_to_cpu(bo, dip->vdi_nlink);
> > + vip->vdi_uid = fs32_to_cpu(bo, dip->vdi_uid);
> > + vip->vdi_gid = fs32_to_cpu(bo, dip->vdi_gid);
> > + vip->vdi_size = fs64_to_cpu(bo, dip->vdi_size);
> > + vip->vdi_atime = fs32_to_cpu(bo, dip->vdi_atime);
> > + vip->vdi_autime = fs32_to_cpu(bo, dip->vdi_autime);
> > + vip->vdi_mtime = fs32_to_cpu(bo, dip->vdi_mtime);
> > + vip->vdi_mutime = fs32_to_cpu(bo, dip->vdi_mutime);
> > + vip->vdi_ctime = fs32_to_cpu(bo, dip->vdi_ctime);
> > + vip->vdi_cutime = fs32_to_cpu(bo, dip->vdi_cutime);
> > + vip->vdi_aflags = dip->vdi_aflags;
> > + vip->vdi_orgtype = dip->vdi_orgtype;
> > + vip->vdi_eopflags = fs16_to_cpu(bo, dip->vdi_eopflags);
> > + vip->vdi_eopdata = fs32_to_cpu(bo, dip->vdi_eopdata);
> > +
> > + vip->vdi_ftarea.i_regular.reserved = fs32_to_cpu(bo, dip->vdi_ftarea.i_regular.reserved);
> > + vip->vdi_ftarea.i_regular.fixextsize = fs32_to_cpu(bo, dip->vdi_ftarea.i_regular.fixextsize);
> > + vip->vdi_blocks = fs32_to_cpu(bo, dip->vdi_blocks);
> > + vip->vdi_gen = fs32_to_cpu(bo, dip->vdi_gen);
> > + vip->vdi_version = fs64_to_cpu(bo, dip->vdi_version);
> > +
> > + switch (dip->vdi_orgtype) {
> > + case VXFS_ORG_EXT4:
> > +  vip->vdi_org.ext4.ve4_spare = fs32_to_cpu(bo, dip->vdi_org.ext4.ve4_spare);
> > +  vip->vdi_org.ext4.ve4_indsize = fs32_to_cpu(bo, dip->vdi_org.ext4.ve4_indsize);
> > +  for (j = 0; j < 2; j++) {
> > +   vip->vdi_org.ext4.ve4_indir[j] = fs32_to_cpu(bo, dip->vdi_org.ext4.ve4_indir[j]);
> > +  }
> > +  for (j = 0; j < 10; j++) {
> > +   vip->vdi_org.ext4.ve4_direct[j].extent = fs32_to_cpu(bo, dip->vdi_org.ext4.ve4_direct[j].extent);
> > +   vip->vdi_org.ext4.ve4_direct[j].size = fs32_to_cpu(bo, dip->vdi_org.ext4.ve4_direct[j].size);
> > +  }
> > +  break;
> > + case VXFS_ORG_IMMED:
> > +  memcpy(&vip->vdi_org.immed, &dip->vdi_org.immed, sizeof(vip->vdi_org.immed));
> > +  break;
> > + case VXFS_ORG_TYPED:
> > +  for (j = 0; j < 6; j++) {
> > +   vip->vdi_org.typed[j].vt_hdr = fs64_to_cpu(bo, dip->vdi_org.typed[j].vt_hdr);
> > +   vip->vdi_org.typed[j].vt_block = fs32_to_cpu(bo, dip->vdi_org.typed[j].vt_block);
> > +   vip->vdi_org.typed[j].vt_size = fs32_to_cpu(bo, dip->vdi_org.typed[j].vt_size);
> > +  }
> > +  break;
> > + };
> 
> Please, indent this switch statement, follow the 80columns rule (i.e. lines
> should not have more than 80columns).
> 

okay, these were just warnings. speed limits on highways are supposed to
limit a speed and there are ones who think about them as suggestions to
not drive slower than .. I enjoy more the latter case.

> > +
> > + vip->vdi_iattrino = fs32_to_cpu(bo, dip->vdi_iattrino);
> > +}
> > +
> >  
> >  /**
> >   * vxfs_blkiget - find inode based on extent #
> > @@ -101,7 +154,7 @@ vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
> >  		if (!(vip = kmem_cache_alloc(vxfs_inode_cachep, GFP_KERNEL)))
> >  			goto fail;
> >  		dip = (struct vxfs_dinode *)(bp->b_data + offset);
> > -		memcpy(vip, dip, sizeof(*vip));
> > +		dip2vip_cpy(vip, dip, VXFS_SBI(sbp)->byte_order);
> >  #ifdef DIAGNOSTIC
> >  		vxfs_dumpi(vip, ino);
> >  #endif
> > @@ -143,7 +196,7 @@ __vxfs_iget(ino_t ino, struct inode *ilistp)
> >  		if (!(vip = kmem_cache_alloc(vxfs_inode_cachep, GFP_KERNEL)))
> >  			goto fail;
> >  		dip = (struct vxfs_dinode *)(kaddr + offset);
> > -		memcpy(vip, dip, sizeof(*vip));
> > +		dip2vip_cpy(vip, dip, VXFS_SBI(ilistp->i_sb)->byte_order);
> >  #ifdef DIAGNOSTIC
> >  		vxfs_dumpi(vip, ino);
> >  #endif
> > diff --git a/fs/freevxfs/vxfs_inode.h b/fs/freevxfs/vxfs_inode.h
> > index 240aeb1..9a2c376 100644
> > --- a/fs/freevxfs/vxfs_inode.h
> > +++ b/fs/freevxfs/vxfs_inode.h
> > @@ -77,13 +77,13 @@ struct vxfs_ext4 {
> >  		vx_daddr_t	extent;			/* Extent number */
> >  		int32_t		size;			/* Size of extent */
> >  	} ve4_direct[VXFS_NDADDR];
> > -};
> > +} __packed;
> >  
> >  struct vxfs_typed {
> >  	u_int64_t	vt_hdr;		/* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
> >  	vx_daddr_t	vt_block;	/* Extent block */
> >  	int32_t		vt_size;	/* Size in blocks */
> > -};
> > +} __packed;
> >  
> >  struct vxfs_typed_dev4 {
> >  	u_int64_t	vd4_hdr;	/* Header, 0xTTOOOOOOOOOOOOOO; T=type,O=offs */
> > @@ -91,7 +91,7 @@ struct vxfs_typed_dev4 {
> >  	u_int64_t	vd4_size;	/* Size in blocks */
> >  	int32_t		vd4_dev;	/* Device ID */
> >  	u_int32_t	__pad1;
> > -};
> > +} __packed;
> >  
> >  /*
> >   * The inode as contained on the physical device.
> > @@ -134,7 +134,7 @@ struct vxfs_dinode {
> >  		struct vxfs_typed	typed[VXFS_NTYPED];
> >  	} vdi_org;
> >  	u_int32_t	vdi_iattrino;
> > -};
> > +} __packed;
> >  
> >  #define vdi_rdev	vdi_ftarea.rdev
> >  #define vdi_dotdot	vdi_ftarea.dotdot
> > diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c
> > index 99c7f0a..cea158a 100644
> > --- a/fs/freevxfs/vxfs_lookup.c
> > +++ b/fs/freevxfs/vxfs_lookup.c
> > @@ -96,6 +96,15 @@ vxfs_next_entry(struct vxfs_direct *de)
> >  	return ((struct vxfs_direct *)((char*)de + de->d_reclen));
> >  }
> >  
> > +/*
> > + * VXFS_dirblk_ovh is the overhead of a specific dirblock.
> > + */
> > +static inline u_long VXFS_dirblk_ovh(struct vxfs_dirblk *dbp, int bo)
> > +{
> > +	return (sizeof(short) * fs16_to_cpu(bo, dbp->d_nhash)) + 4;
> > +}
> > +
> > +
> >  /**
> >   * vxfs_find_entry - find a mathing directory entry for a dentry
> >   * @ip:		directory inode
> > @@ -242,6 +251,8 @@ vxfs_readdir(struct file *fp, struct dir_context *ctx)
> >  	u_long			bsize = sbp->s_blocksize;
> >  	u_long			page, npages, block, pblocks, nblocks, offset;
> >  	loff_t			pos;
> > +	int bo = VXFS_SBI(sbp)->byte_order;
> > +
> Indentation.

need to think about some clever sed syntax .. 


> 
> >  
> >  	if (ctx->pos == 0) {
> >  		if (!dir_emit_dot(fp, ctx))
> > @@ -297,8 +308,8 @@ vxfs_readdir(struct file *fp, struct dir_context *ctx)
> >  
> >  				offset = (char *)de - kaddr;
> >  				ctx->pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2;
> > -				if (!dir_emit(ctx, de->d_name, de->d_namelen,
> > -					de->d_ino, DT_UNKNOWN)) {
> > +				if (!dir_emit(ctx, de->d_name, fs16_to_cpu(bo, de->d_namelen),
> > +					fs32_to_cpu(bo, de->d_ino), DT_UNKNOWN)) {
> >  					vxfs_put_page(pp);
> >  					return 0;
> >  				}
> > diff --git a/fs/freevxfs/vxfs_olt.c b/fs/freevxfs/vxfs_olt.c
> > index 0495008..6b50188 100644
> > --- a/fs/freevxfs/vxfs_olt.c
> > +++ b/fs/freevxfs/vxfs_olt.c
> > @@ -43,14 +43,14 @@ static inline void
> >  vxfs_get_fshead(struct vxfs_oltfshead *fshp, struct vxfs_sb_info *infp)
> >  {
> >  	BUG_ON(infp->vsi_fshino);
> > -	infp->vsi_fshino = fshp->olt_fsino[0];
> > +	infp->vsi_fshino = fs32_to_cpu(infp->byte_order, fshp->olt_fsino[0]);
> >  }
> >  
> >  static inline void
> >  vxfs_get_ilist(struct vxfs_oltilist *ilistp, struct vxfs_sb_info *infp)
> >  {
> >  	BUG_ON(infp->vsi_iext);
> > -	infp->vsi_iext = ilistp->olt_iext[0]; 
> > +	infp->vsi_iext = fs32_to_cpu(infp->byte_order, ilistp->olt_iext[0]);
> >  }
> >  
> >  static inline u_long
> > @@ -80,6 +80,7 @@ vxfs_read_olt(struct super_block *sbp, u_long bsize)
> >  	struct buffer_head	*bp;
> >  	struct vxfs_olt		*op;
> >  	char			*oaddr, *eaddr;
> > +	int bo = infp->byte_order;
> >  
> >  
> >  	bp = sb_bread(sbp, vxfs_oblock(sbp, infp->vsi_oltext, bsize));
> > @@ -87,7 +88,7 @@ vxfs_read_olt(struct super_block *sbp, u_long bsize)
> >  		goto fail;
> >  
> >  	op = (struct vxfs_olt *)bp->b_data;
> > -	if (op->olt_magic != VXFS_OLT_MAGIC) {
> > +	if (fs32_to_cpu(bo, op->olt_magic) != VXFS_OLT_MAGIC) {
> >  		printk(KERN_NOTICE "vxfs: ivalid olt magic number\n");
> >  		goto fail;
> >  	}
> > @@ -102,14 +103,14 @@ vxfs_read_olt(struct super_block *sbp, u_long bsize)
> >  		goto fail;
> >  	}
> >  
> > -	oaddr = bp->b_data + op->olt_size;
> > +	oaddr = bp->b_data + fs32_to_cpu(bo, op->olt_size);
> >  	eaddr = bp->b_data + (infp->vsi_oltsize * sbp->s_blocksize);
> >  
> >  	while (oaddr < eaddr) {
> >  		struct vxfs_oltcommon	*ocp =
> >  			(struct vxfs_oltcommon *)oaddr;
> >  		
> > -		switch (ocp->olt_type) {
> > +		switch (fs32_to_cpu(bo, ocp->olt_type)) {
> >  		case VXFS_OLT_FSHEAD:
> >  			vxfs_get_fshead((struct vxfs_oltfshead *)oaddr, infp);
> >  			break;
> > @@ -118,11 +119,11 @@ vxfs_read_olt(struct super_block *sbp, u_long bsize)
> >  			break;
> >  		}
> >  
> > -		oaddr += ocp->olt_size;
> > +		oaddr += fs32_to_cpu(bo, ocp->olt_size);
> >  	}
> >  
> >  	brelse(bp);
> > -	return 0;
> > +	return (infp->vsi_fshino && infp->vsi_iext) ? 0 : -EINVAL;
> >  
> >  fail:
> >  	brelse(bp);
> > diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c
> > index 7ca8c75..6a69eb0 100644
> > --- a/fs/freevxfs/vxfs_super.c
> > +++ b/fs/freevxfs/vxfs_super.c
> > @@ -109,14 +109,15 @@ static int
> >  vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp)
> >  {
> >  	struct vxfs_sb_info		*infp = VXFS_SBI(dentry->d_sb);
> > +	struct vxfs_sb *raw_sb = infp->vsi_raw;
> >  
> >  	bufp->f_type = VXFS_SUPER_MAGIC;
> >  	bufp->f_bsize = dentry->d_sb->s_blocksize;
> > -	bufp->f_blocks = infp->vsi_raw->vs_dsize;
> > -	bufp->f_bfree = infp->vsi_raw->vs_free;
> > +	bufp->f_blocks = fs32_to_cpu(infp->byte_order, raw_sb->vs_dsize);
> > +	bufp->f_bfree = fs32_to_cpu(infp->byte_order, raw_sb->vs_free);
> >  	bufp->f_bavail = 0;
> >  	bufp->f_files = 0;
> > -	bufp->f_ffree = infp->vsi_raw->vs_ifree;
> > +	bufp->f_ffree = fs32_to_cpu(infp->byte_order, raw_sb->vs_ifree);
> >  	bufp->f_namelen = VXFS_NAMELEN;
> >  
> >  	return 0;
> > @@ -129,6 +130,53 @@ static int vxfs_remount(struct super_block *sb, int *flags, char *data)
> >  	return 0;
> >  }
> >  
> > +
> > +static int vxfs_try_sb_magic(struct super_block *sbp, int blk, u32 magic)
> > +{
> > +	struct buffer_head *bp;
> > +	struct vxfs_sb *rsbp;
> > +	struct vxfs_sb_info *infp = VXFS_SBI(sbp);
> > +	int rc = -ENOMEM;
> > +
> > +	bp = sb_bread(sbp, blk);
> > +	do {
> > +		if (!bp || !buffer_mapped(bp)) {
> > +			if (!infp->silent) {
> > +				printk(KERN_WARNING "vxfs: unable to read"
> > +				    " disk superblock at %d\n", blk);
> > +			}
> > +			break;
> > +		}
> > +
> > +		rc = -EINVAL;
> > +		rsbp = (struct vxfs_sb *)bp->b_data;
> > +		if (rsbp->vs_magic != magic) {
> > +			if (!infp->silent)
> > +				printk(KERN_NOTICE "vxfs: WRONG superblock magic %08x at +%d\n",
> > +					rsbp->vs_magic, blk);
> 
> 				Please, avoid +80 columns, you did it in the
> 				printk above, no reason to not do it here too.

indeed I did. however checkpatch complained again and that was that the
string was split. Daft, isn't it?

Need to know checkpatch ....ed warnings rules.

> 
> > +			break;
> > +		}
> > +
> > +		rc = 0;
> > +		infp->vsi_raw = rsbp;
> > +		infp->vsi_bp = bp;
> > +	} while (0);
> 
> 	I'm not the best person to give a review here, but, I wouldn't use a
> 	do.while(0), but instead, goto error_X: statements and assign the error
> 	codes according to the conditional results, instead of re-assigning the
> 	error code if the previous code wasn't correct.

	some people hate gotos.

> 	But again, a POV of another person will be better.
> 
> > +
> > +	if (rc) {
> > +		infp->vsi_raw = NULL;
> > +		infp->vsi_bp = NULL;
> > +		brelse(bp);
> > +	}
> > +
> > +	return rc;
> > +}
> > +
> > +
> > +static const char * const vxfs_subtypes[] = {
> > +	"SCO",
> > +	"HP-UX(be)"
> > +};
> > +
> >  /**
> >   * vxfs_read_super - read superblock into memory and initialize filesystem
> >   * @sbp:		VFS superblock (to fill)
> > @@ -149,10 +197,10 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent)
> >  {
> >  	struct vxfs_sb_info	*infp;
> >  	struct vxfs_sb		*rsbp;
> > -	struct buffer_head	*bp = NULL;
> >  	u_long			bsize;
> >  	struct inode *root;
> >  	int ret = -EINVAL;
> > +	u32 j;
> >  
> Indentation, goo opportunity to fix the another non-indented fields too.

i will hate this word shortly soon.

> 
> >  	sbp->s_flags |= MS_RDONLY;
> >  
> > @@ -162,48 +210,50 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent)
> >  		return -ENOMEM;
> >  	}
> >  
> > +	infp->silent = silent;
> >  	bsize = sb_min_blocksize(sbp, BLOCK_SIZE);
> >  	if (!bsize) {
> >  		printk(KERN_WARNING "vxfs: unable to set blocksize\n");
> >  		goto out;
> >  	}
> >  
> > -	bp = sb_bread(sbp, 1);
> > -	if (!bp || !buffer_mapped(bp)) {
> > -		if (!silent) {
> > -			printk(KERN_WARNING
> > -				"vxfs: unable to read disk superblock\n");
> > +	sbp->s_fs_info = infp;
> > +	do {
> > +		if (!vxfs_try_sb_magic(sbp, 1, cpu_to_le32(VXFS_SUPER_MAGIC))) {
> > +			infp->byte_order = BO_LE; /* SCO */
> > +			sbp->s_subtype = kstrdup(vxfs_subtypes[0], GFP_KERNEL);
> > +			break;
> > +		}
> > +
> > +		if (!vxfs_try_sb_magic(sbp, 8, cpu_to_be32(VXFS_SUPER_MAGIC))) {
> > +			infp->byte_order = BO_BE; /* HP-UX pa-risc likely */
> > +			sbp->s_subtype = kstrdup(vxfs_subtypes[1], GFP_KERNEL);
> > +			break;
> >  		}
> > -		goto out;
> > -	}
> >  
> > -	rsbp = (struct vxfs_sb *)bp->b_data;
> > -	if (rsbp->vs_magic != VXFS_SUPER_MAGIC) {
> > -		if (!silent)
> > -			printk(KERN_NOTICE "vxfs: WRONG superblock magic\n");
> >  		goto out;
> > -	}
> > +	} while (0);
> >  
> > -	if ((rsbp->vs_version < 2 || rsbp->vs_version > 4) && !silent) {
> > -		printk(KERN_NOTICE "vxfs: unsupported VxFS version (%d)\n",
> > -		       rsbp->vs_version);
> > +	rsbp = infp->vsi_raw;
> > +	j = fs32_to_cpu(infp->byte_order, rsbp->vs_version);
> > +	if ((j < 2 || j > 4) && !silent) {
> > +		printk(KERN_NOTICE "vxfs: unsupported VxFS version (%d)\n", j);
> >  		goto out;
> >  	}
> >  
> >  #ifdef DIAGNOSTIC
> > -	printk(KERN_DEBUG "vxfs: supported VxFS version (%d)\n", rsbp->vs_version);
> > -	printk(KERN_DEBUG "vxfs: blocksize: %d\n", rsbp->vs_bsize);
> > +	printk(KERN_DEBUG "vxfs: supported VxFS version (%d)\n", j);
> > +	printk(KERN_DEBUG "vxfs: blocksize: %d\n",
> > +	    fs32_to_cpu(infp->byte_order, rsbp->vs_bsize));
> >  #endif
> >  
> > -	sbp->s_magic = rsbp->vs_magic;
> > -	sbp->s_fs_info = infp;
> > +	sbp->s_magic = fs32_to_cpu(infp->byte_order, rsbp->vs_magic);
> >  
> > -	infp->vsi_raw = rsbp;
> > -	infp->vsi_bp = bp;
> > -	infp->vsi_oltext = rsbp->vs_oltext[0];
> > -	infp->vsi_oltsize = rsbp->vs_oltsize;
> > +	infp->vsi_oltext = fs32_to_cpu(infp->byte_order, rsbp->vs_oltext[0]);
> > +	infp->vsi_oltsize = fs32_to_cpu(infp->byte_order, rsbp->vs_oltsize);
> >  
> > -	if (!sb_set_blocksize(sbp, rsbp->vs_bsize)) {
> > +	j = fs32_to_cpu(infp->byte_order, rsbp->vs_bsize);
> > +	if (!sb_set_blocksize(sbp, j)) {
> >  		printk(KERN_WARNING "vxfs: unable to set final block size\n");
> >  		goto out;
> >  	}
> > @@ -237,7 +287,7 @@ out_free_ilist:
> >  	vxfs_put_fake_inode(infp->vsi_ilist);
> >  	vxfs_put_fake_inode(infp->vsi_stilist);
> >  out:
> > -	brelse(bp);
> > +	brelse(infp->vsi_bp);
> >  	kfree(infp);
> >  	return ret;
> >  }
> > -- 
> > 1.7.3.4
> > 
> > From 0d0c7ed061edd846bd032fe1073d61169299a435 Mon Sep 17 00:00:00 2001
> > From: KB <kb@xxxxxxxxxxxxxxx>
> > Date: Sat, 28 May 2016 20:55:19 +0200
> > Subject: [PATCH 2/7] missing kfree and kfree on kmem_cache obj
> 
> Missing kfree and kfree?
> 
> "Missing to kfree objects" sounds better IMHO

maybe. I meant kfree as function = noun.
as you wish. 

original message should be read like this: (missing kfree) && (kfree on
object allocated by kmem_cache_alloc() )


> > 
> > 
> > Signed-off-by: KB <kb@xxxxxxxxxxxxxxx>
> > ---
> >  fs/freevxfs/vxfs_extern.h |    1 +
> >  fs/freevxfs/vxfs_fshead.c |    8 +++++---
> >  fs/freevxfs/vxfs_inode.c  |    5 +++++
> >  3 files changed, 11 insertions(+), 3 deletions(-)
> > 
> > diff --git a/fs/freevxfs/vxfs_extern.h b/fs/freevxfs/vxfs_extern.h
> > index 881aa3d..0a3ff86 100644
> > --- a/fs/freevxfs/vxfs_extern.h
> > +++ b/fs/freevxfs/vxfs_extern.h
> > @@ -64,6 +64,7 @@ extern struct vxfs_inode_info *	vxfs_blkiget(struct super_block *, u_long, ino_t
> >  extern struct vxfs_inode_info *	vxfs_stiget(struct super_block *, ino_t);
> >  extern struct inode *		vxfs_iget(struct super_block *, ino_t);
> >  extern void			vxfs_evict_inode(struct inode *);
> > +extern void vxfs_inode_info_free(struct vxfs_inode_info *vip);
> 
> Indentation
> 
> >  
> >  /* vxfs_lookup.c */
> >  extern const struct inode_operations	vxfs_dir_inode_ops;
> > diff --git a/fs/freevxfs/vxfs_fshead.c b/fs/freevxfs/vxfs_fshead.c
> > index 05cced0..c4c6a86 100644
> > --- a/fs/freevxfs/vxfs_fshead.c
> > +++ b/fs/freevxfs/vxfs_fshead.c
> > @@ -183,7 +183,7 @@ vxfs_read_fshead(struct super_block *sbp)
> >  	infp->vsi_stilist = vxfs_get_fake_inode(sbp, tip);
> >  	if (!infp->vsi_stilist) {
> >  		printk(KERN_ERR "vxfs: unable to get structural list inode\n");
> > -		kfree(tip);
> > +		vxfs_inode_info_free(tip);
> >  		goto out_free_pfp;
> >  	}
> >  	if (!VXFS_ISILT(VXFS_INO(infp->vsi_stilist))) {
> > @@ -198,7 +198,7 @@ vxfs_read_fshead(struct super_block *sbp)
> >  	infp->vsi_ilist = vxfs_get_fake_inode(sbp, tip);
> >  	if (!infp->vsi_ilist) {
> >  		printk(KERN_ERR "vxfs: unable to get inode list inode\n");
> > -		kfree(tip);
> > +		vxfs_inode_info_free(tip);
> >  		goto out_iput_stilist;
> >  	}
> >  	if (!VXFS_ISILT(VXFS_INO(infp->vsi_ilist))) {
> > @@ -206,6 +206,8 @@ vxfs_read_fshead(struct super_block *sbp)
> >  				VXFS_INO(infp->vsi_ilist)->vii_mode & VXFS_TYPE_MASK);
> >  		goto out_iput_ilist;
> >  	}
> > +	kfree(pfp);
> > +	kfree(sfp);
> >  
> >  	return 0;
> >  
> > @@ -221,6 +223,6 @@ vxfs_read_fshead(struct super_block *sbp)
> >  	iput(infp->vsi_fship);
> >  	return -EINVAL;
> >   out_free_fship:
> > - 	kfree(vip);
> > +	vxfs_inode_info_free(vip);
> >  	return -EINVAL;
> >  }
> > diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
> > index 86db3c2..9590f79 100644
> > --- a/fs/freevxfs/vxfs_inode.c
> > +++ b/fs/freevxfs/vxfs_inode.c
> > @@ -411,3 +411,8 @@ vxfs_evict_inode(struct inode *ip)
> >  	clear_inode(ip);
> >  	call_rcu(&ip->i_rcu, vxfs_i_callback);
> >  }
> > +
> > +void vxfs_inode_info_free(struct vxfs_inode_info *vip)
> > +{
> > +	kmem_cache_free(vxfs_inode_cachep, vip);
> > +}
> > -- 
> > 1.7.3.4
> > 
> > From c595f46ad63d71ac26dfc3ef23d87e372ac85426 Mon Sep 17 00:00:00 2001
> > From: KB <kb@xxxxxxxxxxxxxxx>
> > Date: Sat, 28 May 2016 20:55:19 +0200
> > Subject: [PATCH 3/7] super_operations.destroy_inode
> > 
> > 
> > Signed-off-by: KB <kb@xxxxxxxxxxxxxxx>
> > ---
> >  fs/freevxfs/vxfs_extern.h |    1 +
> >  fs/freevxfs/vxfs_inode.c  |   16 ++++++++++++----
> >  fs/freevxfs/vxfs_super.c  |    1 +
> >  3 files changed, 14 insertions(+), 4 deletions(-)
> > 
> > diff --git a/fs/freevxfs/vxfs_extern.h b/fs/freevxfs/vxfs_extern.h
> > index 0a3ff86..4d8298b 100644
> > --- a/fs/freevxfs/vxfs_extern.h
> > +++ b/fs/freevxfs/vxfs_extern.h
> > @@ -65,6 +65,7 @@ extern struct vxfs_inode_info *	vxfs_stiget(struct super_block *, ino_t);
> >  extern struct inode *		vxfs_iget(struct super_block *, ino_t);
> >  extern void			vxfs_evict_inode(struct inode *);
> >  extern void vxfs_inode_info_free(struct vxfs_inode_info *vip);
> > +extern void vxfs_destroy_inode(struct inode *ip);
> >  
> >  /* vxfs_lookup.c */
> >  extern const struct inode_operations	vxfs_dir_inode_ops;
> > diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
> > index 9590f79..f91a50c 100644
> > --- a/fs/freevxfs/vxfs_inode.c
> > +++ b/fs/freevxfs/vxfs_inode.c
> > @@ -393,7 +393,15 @@ vxfs_iget(struct super_block *sbp, ino_t ino)
> >  static void vxfs_i_callback(struct rcu_head *head)
> >  {
> >  	struct inode *inode = container_of(head, struct inode, i_rcu);
> > -	kmem_cache_free(vxfs_inode_cachep, inode->i_private);
> > +	void *priv = inode->i_private;
> > +
> > +	inode->i_private = NULL;
> > +	kmem_cache_free(vxfs_inode_cachep, priv);
> > +}
> > +
> > +void vxfs_destroy_inode(struct inode *ip)
> > +{
> > +	call_rcu(&ip->i_rcu, vxfs_i_callback);
> >  }
> >  
> >  /**
> > @@ -401,17 +409,17 @@ static void vxfs_i_callback(struct rcu_head *head)
> >   * @ip:		inode to discard.
> >   *
> >   * Description:
> > - *  vxfs_evict_inode() is called on the final iput and frees the private
> > - *  inode area.
> > + *  vxfs_evict_inode() is called on the final iput
> >   */
> >  void
> >  vxfs_evict_inode(struct inode *ip)
> >  {
> >  	truncate_inode_pages_final(&ip->i_data);
> > +	invalidate_inode_buffers(ip);
> >  	clear_inode(ip);
> > -	call_rcu(&ip->i_rcu, vxfs_i_callback);
> >  }
> >  
> > +
> >  void vxfs_inode_info_free(struct vxfs_inode_info *vip)
> >  {
> >  	kmem_cache_free(vxfs_inode_cachep, vip);
> > diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c
> > index 6a69eb0..500087a 100644
> > --- a/fs/freevxfs/vxfs_super.c
> > +++ b/fs/freevxfs/vxfs_super.c
> > @@ -59,6 +59,7 @@ static int		vxfs_statfs(struct dentry *, struct kstatfs *);
> >  static int		vxfs_remount(struct super_block *, int *, char *);
> >  
> >  static const struct super_operations vxfs_super_ops = {
> > +	.destroy_inode = vxfs_destroy_inode,
> 
> Indentation
> 
> >  	.evict_inode =		vxfs_evict_inode,
> >  	.put_super =		vxfs_put_super,
> >  	.statfs =		vxfs_statfs,
> > -- 
> > 1.7.3.4
> > 
> > From b02ffccdff5ca82922bf09cdcf1a9ea4471bbb62 Mon Sep 17 00:00:00 2001
> > From: KB <kb@xxxxxxxxxxxxxxx>
> > Date: Sat, 28 May 2016 20:55:19 +0200
> > Subject: [PATCH 4/7] refactoring of vxfs_readdir() and _find_entry()
> > 
> > 
> > Signed-off-by: KB <kb@xxxxxxxxxxxxxxx>
> > ---
> >  fs/freevxfs/vxfs_lookup.c |  267 +++++++++++++++++++++------------------------
> >  1 files changed, 124 insertions(+), 143 deletions(-)
> > 
> > diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c
> > index cea158a..8eacb27 100644
> > --- a/fs/freevxfs/vxfs_lookup.c
> > +++ b/fs/freevxfs/vxfs_lookup.c
> > @@ -61,48 +61,6 @@ const struct file_operations vxfs_dir_operations = {
> >  	.iterate =		vxfs_readdir,
> >  };
> >  
> > - 
> > -static inline u_long
> > -dir_pages(struct inode *inode)
> > -{
> > -	return (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
> > -}
> > - 
> > -static inline u_long
> > -dir_blocks(struct inode *ip)
> > -{
> > -	u_long			bsize = ip->i_sb->s_blocksize;
> > -	return (ip->i_size + bsize - 1) & ~(bsize - 1);
> > -}
> > -
> > -/*
> > - * NOTE! unlike strncmp, vxfs_match returns 1 for success, 0 for failure.
> > - *
> > - * len <= VXFS_NAMELEN and de != NULL are guaranteed by caller.
> > - */
> > -static inline int
> > -vxfs_match(int len, const char * const name, struct vxfs_direct *de)
> > -{
> > -	if (len != de->d_namelen)
> > -		return 0;
> > -	if (!de->d_ino)
> > -		return 0;
> > -	return !memcmp(name, de->d_name, len);
> > -}
> > -
> > -static inline struct vxfs_direct *
> > -vxfs_next_entry(struct vxfs_direct *de)
> > -{
> > -	return ((struct vxfs_direct *)((char*)de + de->d_reclen));
> > -}
> > -
> > -/*
> > - * VXFS_dirblk_ovh is the overhead of a specific dirblock.
> > - */
> > -static inline u_long VXFS_dirblk_ovh(struct vxfs_dirblk *dbp, int bo)
> > -{
> > -	return (sizeof(short) * fs16_to_cpu(bo, dbp->d_nhash)) + 4;
> > -}
> >  
> >  
> >  /**
> > @@ -122,50 +80,65 @@ static inline u_long VXFS_dirblk_ovh(struct vxfs_dirblk *dbp, int bo)
> >  static struct vxfs_direct *
> >  vxfs_find_entry(struct inode *ip, struct dentry *dp, struct page **ppp)
> >  {
> > -	u_long				npages, page, nblocks, pblocks, block;
> > -	u_long				bsize = ip->i_sb->s_blocksize;
> > -	const char			*name = dp->d_name.name;
> > -	int				namelen = dp->d_name.len;
> > -
> > -	npages = dir_pages(ip);
> > -	nblocks = dir_blocks(ip);
> > -	pblocks = VXFS_BLOCK_PER_PAGE(ip->i_sb);
> > -	
> > -	for (page = 0; page < npages; page++) {
> > -		caddr_t			kaddr;
> > -		struct page		*pp;
> > -
> > -		pp = vxfs_get_page(ip->i_mapping, page);
> > -		if (IS_ERR(pp))
> > -			continue;
> > -		kaddr = (caddr_t)page_address(pp);
> > -
> > -		for (block = 0; block <= nblocks && block <= pblocks; block++) {
> > -			caddr_t			baddr, limit;
> > -			struct vxfs_dirblk	*dbp;
> > -			struct vxfs_direct	*de;
> > -
> > -			baddr = kaddr + (block * bsize);
> > -			limit = baddr + bsize - VXFS_DIRLEN(1);
> > -			
> > -			dbp = (struct vxfs_dirblk *)baddr;
> > -			de = (struct vxfs_direct *)(baddr + VXFS_DIRBLKOV(dbp));
> > -
> > -			for (; (caddr_t)de <= limit; de = vxfs_next_entry(de)) {
> > -				if (!de->d_reclen)
> > -					break;
> > -				if (!de->d_ino)
> > -					continue;
> > -				if (vxfs_match(namelen, name, de)) {
> > -					*ppp = pp;
> > -					return (de);
> > -				}
> > +	u_long bsize = ip->i_sb->s_blocksize;
> > +	const char *name = dp->d_name.name;
> > +	int namelen = dp->d_name.len;
> > +	loff_t limit = VXFS_DIRROUND(ip->i_size);
> > +	struct vxfs_direct *de_exit = NULL;
> > +	loff_t pos = 0;
> > +	int bo = VXFS_SBI(ip->i_sb)->byte_order;
> 
> Indentation
> > +
> > +	while (pos < limit) {
> > +		struct page *pp;
> > +		char *kaddr;
> > +		int pg_ofs = pos & ~PAGE_CACHE_MASK;
> > +
> > +		pp = vxfs_get_page(ip->i_mapping, pos >> PAGE_CACHE_SHIFT);
> > +		if (IS_ERR(pp)) {
> > +			return NULL;
> > +		}
> 
> 		Kernel coding style states to not use braces with single-line if
> 		conditionals.

okay. have seen this warning already.


> 
> > +		kaddr = (char *)page_address(pp);
> > +
> > +		while (pg_ofs < PAGE_SIZE && pos < limit) {
> > +			struct vxfs_direct *de;
> > +
> > +			if ((pos & (bsize - 1)) < 4) {
> > +				struct vxfs_dirblk *dbp =
> > +				    (struct vxfs_dirblk *)(kaddr + (pos & ~PAGE_CACHE_MASK));
> > +				int overhead = (sizeof(short) * fs16_to_cpu(bo, dbp->d_nhash)) + 4;
> > +
> > +				pos += overhead;
> > +				pg_ofs += overhead;
> > +			}
> > +			de = (struct vxfs_direct *)(kaddr + pg_ofs);
> > +
> > +			if (!de->d_reclen) {
> > +				pos += bsize - 1;
> > +				pos &= ~(bsize - 1);
> > +				break;
> > +			}
> > +
> > +			pg_ofs += fs16_to_cpu(bo, de->d_reclen);
> > +			pos += fs16_to_cpu(bo, de->d_reclen);
> > +			if (!de->d_ino) {
> > +				continue;
> > +			}
> > +
> > +			if (namelen != fs16_to_cpu(bo, de->d_namelen))
> > +				continue;
> > +			if (!memcmp(name, de->d_name, namelen)) {
> > +				*ppp = pp;
> > +				de_exit = de;
> > +				break;
> >  			}
> >  		}
> > -		vxfs_put_page(pp);
> > +		if (!de_exit)
> > +			vxfs_put_page(pp);
> > +		else
> > +			break;
> >  	}
> >  
> > -	return NULL;
> > +	return de_exit;
> >  }
> >  
> >  /**
> > @@ -185,15 +158,17 @@ vxfs_inode_by_name(struct inode *dip, struct dentry *dp)
> >  {
> >  	struct vxfs_direct		*de;
> >  	struct page			*pp;
> > -	ino_t				ino = 0;
> > +	ino_t ino = 0;
> >  
> >  	de = vxfs_find_entry(dip, dp, &pp);
> >  	if (de) {
> > -		ino = de->d_ino;
> > +		int bo = VXFS_SBI(dip->i_sb)->byte_order;
> > +
> > +		ino = fs32_to_cpu(bo, de->d_ino);
> >  		kunmap(pp);
> >  		page_cache_release(pp);
> >  	}
> > -	
> > +
> >  	return (ino);
> >  }
> >  
> > @@ -225,8 +200,8 @@ vxfs_lookup(struct inode *dip, struct dentry *dp, unsigned int flags)
> >  		ip = vxfs_iget(dip->i_sb, ino);
> >  		if (IS_ERR(ip))
> >  			return ERR_CAST(ip);
> > +		d_add(dp, ip);
> >  	}
> > -	d_add(dp, ip);
> >  	return NULL;
> >  }
> >  
> > @@ -249,76 +224,82 @@ vxfs_readdir(struct file *fp, struct dir_context *ctx)
> >  	struct inode		*ip = file_inode(fp);
> >  	struct super_block	*sbp = ip->i_sb;
> >  	u_long			bsize = sbp->s_blocksize;
> > -	u_long			page, npages, block, pblocks, nblocks, offset;
> > -	loff_t			pos;
> > +	loff_t			pos, limit;
> >  	int bo = VXFS_SBI(sbp)->byte_order;
> >  
> > -
> >  	if (ctx->pos == 0) {
> >  		if (!dir_emit_dot(fp, ctx))
> > -			return 0;
> > -		ctx->pos = 1;
> > +			goto out;
> > +		ctx->pos++;
> >  	}
> >  	if (ctx->pos == 1) {
> >  		if (!dir_emit(ctx, "..", 2, VXFS_INO(ip)->vii_dotdot, DT_DIR))
> > -			return 0;
> > -		ctx->pos = 2;
> > +			goto out;
> > +		ctx->pos++;
> > +	}
> > +
> > +	limit = VXFS_DIRROUND(ip->i_size);
> > +	if (ctx->pos > limit) {
> > +#if 0
> > +		ctx->pos = 0;
> > +#endif
> > +		goto out;
> >  	}
> > -	pos = ctx->pos - 2;
> > -	
> > -	if (pos > VXFS_DIRROUND(ip->i_size))
> > -		return 0;
> > -
> > -	npages = dir_pages(ip);
> > -	nblocks = dir_blocks(ip);
> > -	pblocks = VXFS_BLOCK_PER_PAGE(sbp);
> > -
> > -	page = pos >> PAGE_CACHE_SHIFT;
> > -	offset = pos & ~PAGE_CACHE_MASK;
> > -	block = (u_long)(pos >> sbp->s_blocksize_bits) % pblocks;
> > -
> > -	for (; page < npages; page++, block = 0) {
> > -		char			*kaddr;
> > -		struct page		*pp;
> > -
> > -		pp = vxfs_get_page(ip->i_mapping, page);
> > -		if (IS_ERR(pp))
> > -			continue;
> > +
> > +	pos = ctx->pos & ~3L;
> > +
> > +	while (pos < limit) {
> > +		struct page *pp;
> > +		char *kaddr;
> > +		int pg_ofs = pos & ~PAGE_CACHE_MASK;
> > +		int rc = 0;
> > +
> > +		pp = vxfs_get_page(ip->i_mapping, pos >> PAGE_CACHE_SHIFT);
> > +		if (IS_ERR(pp)) {
> > +			return -ENOMEM;
> > +		}
> >  		kaddr = (char *)page_address(pp);
> >  
> > -		for (; block <= nblocks && block <= pblocks; block++) {
> > -			char			*baddr, *limit;
> > -			struct vxfs_dirblk	*dbp;
> > -			struct vxfs_direct	*de;
> > -
> > -			baddr = kaddr + (block * bsize);
> > -			limit = baddr + bsize - VXFS_DIRLEN(1);
> > -	
> > -			dbp = (struct vxfs_dirblk *)baddr;
> > -			de = (struct vxfs_direct *)
> > -				(offset ?
> > -				 (kaddr + offset) :
> > -				 (baddr + VXFS_DIRBLKOV(dbp)));
> > -
> > -			for (; (char *)de <= limit; de = vxfs_next_entry(de)) {
> > -				if (!de->d_reclen)
> > -					break;
> > -				if (!de->d_ino)
> > -					continue;
> > -
> > -				offset = (char *)de - kaddr;
> > -				ctx->pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2;
> > -				if (!dir_emit(ctx, de->d_name, fs16_to_cpu(bo, de->d_namelen),
> > -					fs32_to_cpu(bo, de->d_ino), DT_UNKNOWN)) {
> > -					vxfs_put_page(pp);
> > -					return 0;
> > -				}
> > +		while (pg_ofs < PAGE_SIZE && pos < limit) {
> > +			struct vxfs_direct *de;
> > +
> > +			if ((pos & (bsize - 1)) < 4) {
> > +				struct vxfs_dirblk *dbp =
> > +				    (struct vxfs_dirblk *)(kaddr + (pos & ~PAGE_CACHE_MASK));
> > +				int overhead = (sizeof(short) * fs16_to_cpu(bo, dbp->d_nhash)) + 4;
> > +
> > +				pos += overhead;
> > +				pg_ofs += overhead;
> > +			}
> > +			de = (struct vxfs_direct *)(kaddr + pg_ofs);
> > +
> > +			if (!de->d_reclen) {
> > +				pos += bsize - 1;
> > +				pos &= ~(bsize - 1);
> > +				break;
> > +			}
> > +
> > +			pg_ofs += fs16_to_cpu(bo, de->d_reclen);
> > +			pos += fs16_to_cpu(bo, de->d_reclen);
> > +			if (!de->d_ino) {
> > +				continue;
> > +			}
> > +
> > +			rc = dir_emit(ctx, de->d_name, fs16_to_cpu(bo, de->d_namelen),
> > +				fs32_to_cpu(bo, de->d_ino), DT_UNKNOWN);
> > +			if (!rc) {
> > +				/* the dir entry was not submitted, so fix pos. */
> > +				pos -= fs16_to_cpu(bo, de->d_reclen);
> > +				break;
> >  			}
> > -			offset = 0;
> >  		}
> >  		vxfs_put_page(pp);
> > -		offset = 0;
> > +		if (!rc)
> > +			break;
> >  	}
> > -	ctx->pos = ((page << PAGE_CACHE_SHIFT) | offset) + 2;
> > +
> > +	ctx->pos = pos | 2;
> > +
> > +out:
> >  	return 0;
> >  }
> > -- 
> > 1.7.3.4
> > 
> > From eceb47a770b80d7f46a089f6a1744d66f0601e77 Mon Sep 17 00:00:00 2001
> > From: KB <kb@xxxxxxxxxxxxxxx>
> > Date: Sat, 28 May 2016 20:55:19 +0200
> > Subject: [PATCH 5/7] static inode_cachep
> > 
> > 
> > Signed-off-by: KB <kb@xxxxxxxxxxxxxxx>
> > ---
> >  fs/freevxfs/vxfs_extern.h |    4 +++-
> >  fs/freevxfs/vxfs_inode.c  |   24 +++++++++++++++++++++++-
> >  fs/freevxfs/vxfs_super.c  |   26 ++++++++++----------------
> >  3 files changed, 36 insertions(+), 18 deletions(-)
> > 
> > diff --git a/fs/freevxfs/vxfs_extern.h b/fs/freevxfs/vxfs_extern.h
> > index 4d8298b..cc43fd0 100644
> > --- a/fs/freevxfs/vxfs_extern.h
> > +++ b/fs/freevxfs/vxfs_extern.h
> > @@ -55,7 +55,6 @@ extern const struct inode_operations vxfs_immed_symlink_iops;
> >  
> >  /* vxfs_inode.c */
> >  extern const struct address_space_operations vxfs_immed_aops;
> > -extern struct kmem_cache	*vxfs_inode_cachep;
> >  extern void			vxfs_dumpi(struct vxfs_inode_info *, ino_t);
> >  extern struct inode *		vxfs_get_fake_inode(struct super_block *,
> >  					struct vxfs_inode_info *);
> > @@ -66,6 +65,9 @@ extern struct inode *		vxfs_iget(struct super_block *, ino_t);
> >  extern void			vxfs_evict_inode(struct inode *);
> >  extern void vxfs_inode_info_free(struct vxfs_inode_info *vip);
> >  extern void vxfs_destroy_inode(struct inode *ip);
> > +extern int vxfs_ii_cache_init(void);
> > +extern void vxfs_ii_cache_destroy(void);
> > +
> >  
> >  /* vxfs_lookup.c */
> >  extern const struct inode_operations	vxfs_dir_inode_ops;
> > diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
> > index f91a50c..1e20823 100644
> > --- a/fs/freevxfs/vxfs_inode.c
> > +++ b/fs/freevxfs/vxfs_inode.c
> > @@ -41,7 +41,7 @@
> >  #include "vxfs_extern.h"
> >  
> >  
> > -struct kmem_cache		*vxfs_inode_cachep;
> > +static struct kmem_cache *vxfs_inode_cachep;
> >  
> >  
> >  #ifdef DIAGNOSTIC
> > @@ -424,3 +424,25 @@ void vxfs_inode_info_free(struct vxfs_inode_info *vip)
> >  {
> >  	kmem_cache_free(vxfs_inode_cachep, vip);
> >  }
> > +
> > +
> > +int vxfs_ii_cache_init(void)
> > +{
> > +	vxfs_inode_cachep = kmem_cache_create("vxfs_inode",
> > +		sizeof(struct vxfs_inode_info), 0,
> > +		SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD, NULL);
> > +
> > +	return vxfs_inode_cachep ? 0 : -ENOMEM;
> > +}
> > +
> > +
> > +void vxfs_ii_cache_destroy(void)
> > +{
> > +	/*
> > +	 * Make sure all delayed rcu free inodes are flushed before we
> > +	 * destroy cache.
> > +	 */
> > +	rcu_barrier();
> > +	kmem_cache_destroy(vxfs_inode_cachep);
> > +}
> > +
> > diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c
> > index 500087a..9525818 100644
> > --- a/fs/freevxfs/vxfs_super.c
> > +++ b/fs/freevxfs/vxfs_super.c
> > @@ -315,29 +315,23 @@ MODULE_ALIAS("vxfs");
> >  static int __init
> >  vxfs_init(void)
> >  {
> > -	int rv;
> > +	int rc = vxfs_ii_cache_init();
> >  
> > -	vxfs_inode_cachep = kmem_cache_create("vxfs_inode",
> > -			sizeof(struct vxfs_inode_info), 0,
> > -			SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD, NULL);
> > -	if (!vxfs_inode_cachep)
> > -		return -ENOMEM;
> > -	rv = register_filesystem(&vxfs_fs_type);
> > -	if (rv < 0)
> > -		kmem_cache_destroy(vxfs_inode_cachep);
> > -	return rv;
> > +	if (!rc) {
> > +		rc = register_filesystem(&vxfs_fs_type);
> > +		if (rc < 0)
> > +			vxfs_ii_cache_destroy();
> > +	}
> > +	printk(KERN_DEBUG "%s: **** %s %s rc %d\n", __func__, __DATE__, __TIME__, rc);
> > +
> > +	return rc;
> >  }
> >  
> >  static void __exit
> >  vxfs_cleanup(void)
> >  {
> >  	unregister_filesystem(&vxfs_fs_type);
> > -	/*
> > -	 * Make sure all delayed rcu free inodes are flushed before we
> > -	 * destroy cache.
> > -	 */
> > -	rcu_barrier();
> > -	kmem_cache_destroy(vxfs_inode_cachep);
> > +	vxfs_ii_cache_destroy();
> >  }
> >  
> >  module_init(vxfs_init);
> > -- 
> > 1.7.3.4
> > 
> > From 2915ed2c92dd349203070eea8970fd4fb62ba5b4 Mon Sep 17 00:00:00 2001
> > From: KB <kb@xxxxxxxxxxxxxxx>
> > Date: Sat, 28 May 2016 20:55:19 +0200
> > Subject: [PATCH 6/7] struct inode embedded in vxfs_vfs_inode
> > 
> > struct vxfs_vfs_inode is allocated from vxfs_inode_cachep
> > and vfs inode is initialized by inode_constructor().
> > sb->s_op must be set before read_fshead() otherwise 
> > 3 inodes will be allocated from common inode_cachep.
> > 
> > 
> > Signed-off-by: KB <kb@xxxxxxxxxxxxxxx>
> > ---
> >  fs/freevxfs/vxfs.h        |    8 ---
> >  fs/freevxfs/vxfs_bmap.c   |    5 +-
> >  fs/freevxfs/vxfs_extern.h |   15 +++---
> >  fs/freevxfs/vxfs_fshead.c |   48 +++++++----------
> >  fs/freevxfs/vxfs_inode.c  |  130 ++++++++++++++++++++-------------------------
> >  fs/freevxfs/vxfs_inode.h  |   20 +++++++-
> >  fs/freevxfs/vxfs_super.c  |   16 +++---
> >  7 files changed, 114 insertions(+), 128 deletions(-)
> > 
> > diff --git a/fs/freevxfs/vxfs.h b/fs/freevxfs/vxfs.h
> > index 5dc8949..8124a10 100644
> > --- a/fs/freevxfs/vxfs.h
> > +++ b/fs/freevxfs/vxfs.h
> > @@ -38,7 +38,6 @@
> >   */
> >  #include <linux/types.h>
> >  
> > -
> >  /*
> >   * Data types for use with the VxFS ondisk format.
> >   */
> > @@ -270,13 +269,6 @@ enum {
> >  #define VXFS_ISIMMED(ip)	VXFS_IS_ORG((ip), VXFS_ORG_IMMED)
> >  #define VXFS_ISTYPED(ip)	VXFS_IS_ORG((ip), VXFS_ORG_TYPED)
> >  
> > -
> > -/*
> > - * Get filesystem private data from VFS inode.
> > - */
> > -#define VXFS_INO(ip) \
> > -	((struct vxfs_inode_info *)(ip)->i_private)
> > -
> >  /*
> >   * Get filesystem private data from VFS superblock.
> >   */
> > diff --git a/fs/freevxfs/vxfs_bmap.c b/fs/freevxfs/vxfs_bmap.c
> > index 95afd98..e39aea4 100644
> > --- a/fs/freevxfs/vxfs_bmap.c
> > +++ b/fs/freevxfs/vxfs_bmap.c
> > @@ -97,8 +97,9 @@ vxfs_bmap_ext4(struct inode *ip, long bn)
> >  
> >  		brelse(buf);
> >  		return bno;
> > -	} else
> > -		printk(KERN_WARNING "no matching indir?");
> > +	} else {
> > +		printk(KERN_WARNING "%s:%d no matching indir?\n", __func__, __LINE__);
> > +	}
> >  
> >  	return 0;
> >  
> > diff --git a/fs/freevxfs/vxfs_extern.h b/fs/freevxfs/vxfs_extern.h
> > index cc43fd0..9648735 100644
> > --- a/fs/freevxfs/vxfs_extern.h
> > +++ b/fs/freevxfs/vxfs_extern.h
> > @@ -56,17 +56,16 @@ extern const struct inode_operations vxfs_immed_symlink_iops;
> >  /* vxfs_inode.c */
> >  extern const struct address_space_operations vxfs_immed_aops;
> >  extern void			vxfs_dumpi(struct vxfs_inode_info *, ino_t);
> > -extern struct inode *		vxfs_get_fake_inode(struct super_block *,
> > -					struct vxfs_inode_info *);
> > -extern void			vxfs_put_fake_inode(struct inode *);
> > -extern struct vxfs_inode_info *	vxfs_blkiget(struct super_block *, u_long, ino_t);
> > -extern struct vxfs_inode_info *	vxfs_stiget(struct super_block *, ino_t);
> > -extern struct inode *		vxfs_iget(struct super_block *, ino_t);
> > -extern void			vxfs_evict_inode(struct inode *);
> > -extern void vxfs_inode_info_free(struct vxfs_inode_info *vip);
> > +
> > +extern struct inode *vxfs_blkiget(struct super_block *, u_long, ino_t);
> > +extern struct inode *vxfs_stiget(struct super_block *, ino_t);
> > +extern struct inode *vxfs_iget(struct super_block *, ino_t);
> > +extern void vxfs_evict_inode(struct inode *);
> > +
> >  extern void vxfs_destroy_inode(struct inode *ip);
> >  extern int vxfs_ii_cache_init(void);
> >  extern void vxfs_ii_cache_destroy(void);
> > +extern struct inode *vxfs_inode_alloc(struct super_block *sb);
> >  
> >  
> >  /* vxfs_lookup.c */
> > diff --git a/fs/freevxfs/vxfs_fshead.c b/fs/freevxfs/vxfs_fshead.c
> > index c4c6a86..b24cb8c 100644
> > --- a/fs/freevxfs/vxfs_fshead.c
> > +++ b/fs/freevxfs/vxfs_fshead.c
> > @@ -131,31 +131,26 @@ vxfs_read_fshead(struct super_block *sbp)
> >  {
> >  	struct vxfs_sb_info		*infp = VXFS_SBI(sbp);
> >  	struct vxfs_fsh			*pfp, *sfp;
> > -	struct vxfs_inode_info		*vip, *tip;
> > +	struct inode *ip1;
> > +	struct inode *ip2;
> 
> Indentation.
> 
> >  
> > -	vip = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino);
> > -	if (!vip) {
> > +	infp->vsi_fship = ip1 = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino);
> > +	if (IS_ERR(ip1)) {
> >  		printk(KERN_ERR "vxfs: unable to read fsh inode\n");
> >  		return -EINVAL;
> >  	}
> > -	if (!VXFS_ISFSH(vip)) {
> > +
> > +	if (!VXFS_ISFSH(VXFS_INO(ip1))) {
> >  		printk(KERN_ERR "vxfs: fsh list inode is of wrong type (%x)\n",
> > -				vip->vii_mode & VXFS_TYPE_MASK); 
> > +				VXFS_INO(ip1)->vii_mode & VXFS_TYPE_MASK);
> >  		goto out_free_fship;
> >  	}
> >  
> > -
> >  #ifdef DIAGNOSTIC
> >  	printk("vxfs: fsh inode dump:\n");
> > -	vxfs_dumpi(vip, infp->vsi_fshino);
> > +	vxfs_dumpi(VXFS_INO(ip1), infp->vsi_fshino);
> >  #endif
> >  
> > -	infp->vsi_fship = vxfs_get_fake_inode(sbp, vip);
> > -	if (!infp->vsi_fship) {
> > -		printk(KERN_ERR "vxfs: unable to get fsh inode\n");
> > -		goto out_free_fship;
> > -	}
> > -
> >  	sfp = vxfs_getfsh(infp->vsi_fship, 0);
> >  	if (!sfp) {
> >  		printk(KERN_ERR "vxfs: unable to get structural fsh\n");
> > @@ -176,31 +171,25 @@ vxfs_read_fshead(struct super_block *sbp)
> >  	vxfs_dumpfsh(pfp);
> >  #endif
> >  
> > -	tip = vxfs_blkiget(sbp, infp->vsi_iext, sfp->fsh_ilistino[0]);
> > -	if (!tip)
> > -		goto out_free_pfp;
> > +	infp->vsi_stilist =
> > +		ip2 = vxfs_blkiget(sbp, infp->vsi_iext, sfp->fsh_ilistino[0]);
> >  
> > -	infp->vsi_stilist = vxfs_get_fake_inode(sbp, tip);
> > -	if (!infp->vsi_stilist) {
> > -		printk(KERN_ERR "vxfs: unable to get structural list inode\n");
> > -		vxfs_inode_info_free(tip);
> > +	if (IS_ERR(ip2)) {
> >  		goto out_free_pfp;
> >  	}
> > +
> >  	if (!VXFS_ISILT(VXFS_INO(infp->vsi_stilist))) {
> >  		printk(KERN_ERR "vxfs: structural list inode is of wrong type (%x)\n",
> >  				VXFS_INO(infp->vsi_stilist)->vii_mode & VXFS_TYPE_MASK); 
> >  		goto out_iput_stilist;
> >  	}
> >  
> > -	tip = vxfs_stiget(sbp, pfp->fsh_ilistino[0]);
> > -	if (!tip)
> > -		goto out_iput_stilist;
> > -	infp->vsi_ilist = vxfs_get_fake_inode(sbp, tip);
> > -	if (!infp->vsi_ilist) {
> > +	infp->vsi_ilist = ip2 = vxfs_stiget(sbp, pfp->fsh_ilistino[0]);
> > +	if (IS_ERR(ip2)) {
> >  		printk(KERN_ERR "vxfs: unable to get inode list inode\n");
> > -		vxfs_inode_info_free(tip);
> >  		goto out_iput_stilist;
> >  	}
> > +
> >  	if (!VXFS_ISILT(VXFS_INO(infp->vsi_ilist))) {
> >  		printk(KERN_ERR "vxfs: inode list inode is of wrong type (%x)\n",
> >  				VXFS_INO(infp->vsi_ilist)->vii_mode & VXFS_TYPE_MASK);
> > @@ -220,9 +209,10 @@ vxfs_read_fshead(struct super_block *sbp)
> >   out_free_sfp:
> >   	kfree(sfp);
> >   out_iput_fship:
> > -	iput(infp->vsi_fship);
> > -	return -EINVAL;
> >   out_free_fship:
> > -	vxfs_inode_info_free(vip);
> > +	iput(infp->vsi_fship);
> > +	infp->vsi_stilist = NULL;
> > +	infp->vsi_ilist = NULL;
> > +	infp->vsi_fship = NULL;
> >  	return -EINVAL;
> >  }
> > diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
> > index 1e20823..ee0ca04 100644
> > --- a/fs/freevxfs/vxfs_inode.c
> > +++ b/fs/freevxfs/vxfs_inode.c
> > @@ -42,6 +42,7 @@
> >  
> >  
> >  static struct kmem_cache *vxfs_inode_cachep;
> > +static void vxfs_iinit(struct inode *ip, struct vxfs_inode_info *vip);
> >  
> >  
> >  #ifdef DIAGNOSTIC
> > @@ -137,35 +138,41 @@ static inline void dip2vip_cpy(struct vxfs_inode_info *vip, struct vxfs_dinode *
> >   *  buffercache.  This function should not be used outside the
> >   *  read_super() method, otherwise the data may be incoherent.
> >   */
> > -struct vxfs_inode_info *
> > +struct inode *
> >  vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
> >  {
> >  	struct buffer_head		*bp;
> >  	u_long				block, offset;
> > +	struct inode *ip;
> >  
> >  	block = extent + ((ino * VXFS_ISIZE) / sbp->s_blocksize);
> >  	offset = ((ino % (sbp->s_blocksize / VXFS_ISIZE)) * VXFS_ISIZE);
> > +
> > +	ip = new_inode(sbp);
> > +	if (!ip)
> > +		return ERR_PTR(-ENOMEM);
> > +
> >  	bp = sb_bread(sbp, block);
> > +	ip->i_ino = get_next_ino();
> > +	ip->i_mapping->a_ops = &vxfs_aops;
> >  
> >  	if (bp && buffer_mapped(bp)) {
> > -		struct vxfs_inode_info	*vip;
> > -		struct vxfs_dinode	*dip;
> > +		struct vxfs_inode_info	*vip = VXFS_INO(ip);
> > +		struct vxfs_dinode	*dip = (struct vxfs_dinode *)(bp->b_data + offset);
> >  
> > -		if (!(vip = kmem_cache_alloc(vxfs_inode_cachep, GFP_KERNEL)))
> > -			goto fail;
> > -		dip = (struct vxfs_dinode *)(bp->b_data + offset);
> >  		dip2vip_cpy(vip, dip, VXFS_SBI(sbp)->byte_order);
> > +		vxfs_iinit(ip, vip);
> >  #ifdef DIAGNOSTIC
> >  		vxfs_dumpi(vip, ino);
> >  #endif
> > -		brelse(bp);
> > -		return (vip);
> > +	} else {
> > +		printk(KERN_WARNING "vxfs: unable to read block %ld\n", block);
> > +		iput(ip);
> > +		ip = NULL;
> >  	}
> > -
> > -fail:
> > -	printk(KERN_WARNING "vxfs: unable to read block %ld\n", block);
> >  	brelse(bp);
> > -	return NULL;
> > +
> > +	return ip;
> >  }
> >  
> >  /**
> > @@ -180,21 +187,18 @@ fail:
> >   *  Returns the matching VxFS inode on success, else an error code.
> >   */
> >  static struct vxfs_inode_info *
> > -__vxfs_iget(ino_t ino, struct inode *ilistp)
> > +__vxfs_iget(struct inode *ip, struct inode *ilistp, ino_t ino)
> >  {
> > -	struct page			*pp;
> > -	u_long				offset;
> > +	struct page	*pp;
> Indentation


and i hate the "Indentation" word...

I will use "indent -kr -l 120 more switches" on everything so everything
will look the same way.

Thanks

> 
> > +	u_long offset = (ino % (PAGE_SIZE / VXFS_ISIZE)) * VXFS_ISIZE;
> >  
> > -	offset = (ino % (PAGE_SIZE / VXFS_ISIZE)) * VXFS_ISIZE;
> >  	pp = vxfs_get_page(ilistp->i_mapping, ino * VXFS_ISIZE / PAGE_SIZE);
> >  
> >  	if (!IS_ERR(pp)) {
> > -		struct vxfs_inode_info	*vip;
> > +		struct vxfs_inode_info	*vip = VXFS_INO(ip);
> >  		struct vxfs_dinode	*dip;
> >  		caddr_t			kaddr = (char *)page_address(pp);
> >  
> > -		if (!(vip = kmem_cache_alloc(vxfs_inode_cachep, GFP_KERNEL)))
> > -			goto fail;
> >  		dip = (struct vxfs_dinode *)(kaddr + offset);
> >  		dip2vip_cpy(vip, dip, VXFS_SBI(ilistp->i_sb)->byte_order);
> >  #ifdef DIAGNOSTIC
> > @@ -206,11 +210,6 @@ __vxfs_iget(ino_t ino, struct inode *ilistp)
> >  
> >  	printk(KERN_WARNING "vxfs: error on page %p\n", pp);
> >  	return ERR_CAST(pp);
> > -
> > -fail:
> > -	printk(KERN_WARNING "vxfs: unable to read inode %ld\n", (unsigned long)ino);
> > -	vxfs_put_page(pp);
> > -	return ERR_PTR(-ENOMEM);
> >  }
> >  
> >  /**
> > @@ -223,13 +222,24 @@ fail:
> >   *  the structural inode list.
> >   *  Returns the matching VxFS inode on success, else a NULL pointer.
> >   */
> > -struct vxfs_inode_info *
> > +struct inode *
> >  vxfs_stiget(struct super_block *sbp, ino_t ino)
> >  {
> > -	struct vxfs_inode_info *vip;
> > +	struct inode *ip = new_inode(sbp);
> > +	struct vxfs_inode_info *ii;
> >  
> > -	vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_stilist);
> > -	return IS_ERR(vip) ? NULL : vip;
> > +	if (!ip)
> > +		return NULL;
> > +
> > +	ip->i_ino = get_next_ino();
> > +	ip->i_mapping->a_ops = &vxfs_aops;
> > +	ii = __vxfs_iget(ip, VXFS_SBI(sbp)->vsi_stilist, ino);
> > +	if (IS_ERR(ii)) {
> > +		iput(ip);
> > +	} else {
> > +		vxfs_iinit(ip, ii);
> > +	}
> > +	return IS_ERR(ii) ? NULL : ip;
> >  }
> >  
> >  /**
> > @@ -297,41 +307,6 @@ vxfs_iinit(struct inode *ip, struct vxfs_inode_info *vip)
> >  	
> >  }
> >  
> > -/**
> > - * vxfs_get_fake_inode - get fake inode structure
> > - * @sbp:		filesystem superblock
> > - * @vip:		fspriv inode
> > - *
> > - * Description:
> > - *  vxfs_fake_inode gets a fake inode (not in the inode hash) for a
> > - *  superblock, vxfs_inode pair.
> > - *  Returns the filled VFS inode.
> > - */
> > -struct inode *
> > -vxfs_get_fake_inode(struct super_block *sbp, struct vxfs_inode_info *vip)
> > -{
> > -	struct inode			*ip = NULL;
> > -
> > -	if ((ip = new_inode(sbp))) {
> > -		ip->i_ino = get_next_ino();
> > -		vxfs_iinit(ip, vip);
> > -		ip->i_mapping->a_ops = &vxfs_aops;
> > -	}
> > -	return (ip);
> > -}
> > -
> > -/**
> > - * vxfs_put_fake_inode - free faked inode
> > - * *ip:			VFS inode
> > - *
> > - * Description:
> > - *  vxfs_put_fake_inode frees all data associated with @ip.
> > - */
> > -void
> > -vxfs_put_fake_inode(struct inode *ip)
> > -{
> > -	iput(ip);
> > -}
> >  
> >  /**
> >   * vxfs_iget - get an inode
> > @@ -355,7 +330,7 @@ vxfs_iget(struct super_block *sbp, ino_t ino)
> >  	if (!(ip->i_state & I_NEW))
> >  		return ip;
> >  
> > -	vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_ilist);
> > +	vip = __vxfs_iget(ip, VXFS_SBI(sbp)->vsi_ilist, ino);
> >  	if (IS_ERR(vip)) {
> >  		iget_failed(ip);
> >  		return ERR_CAST(vip);
> > @@ -393,10 +368,9 @@ vxfs_iget(struct super_block *sbp, ino_t ino)
> >  static void vxfs_i_callback(struct rcu_head *head)
> >  {
> >  	struct inode *inode = container_of(head, struct inode, i_rcu);
> > -	void *priv = inode->i_private;
> > +	struct vxfs_vfs_inode *i = container_of(inode, struct vxfs_vfs_inode, ino);
> >  
> > -	inode->i_private = NULL;
> > -	kmem_cache_free(vxfs_inode_cachep, priv);
> > +	kmem_cache_free(vxfs_inode_cachep, i);
> >  }
> >  
> >  void vxfs_destroy_inode(struct inode *ip)
> > @@ -405,11 +379,11 @@ void vxfs_destroy_inode(struct inode *ip)
> >  }
> >  
> >  /**
> > - * vxfs_evict_inode - remove inode from main memory
> > + * vxfs_evict_inode - commit inode buffers if needed, may delete on-disk inode.
> >   * @ip:		inode to discard.
> >   *
> >   * Description:
> > - *  vxfs_evict_inode() is called on the final iput
> > + *  vxfs_evict_inode() may be called on the final iput.
> >   */
> >  void
> >  vxfs_evict_inode(struct inode *ip)
> > @@ -420,17 +394,27 @@ vxfs_evict_inode(struct inode *ip)
> >  }
> >  
> >  
> > -void vxfs_inode_info_free(struct vxfs_inode_info *vip)
> > +
> > +
> > +struct inode *vxfs_inode_alloc(struct super_block *sb)
> >  {
> > -	kmem_cache_free(vxfs_inode_cachep, vip);
> > +	struct vxfs_vfs_inode *i = kmem_cache_alloc(vxfs_inode_cachep, GFP_KERNEL);
> > +
> > +	return i ? &i->ino : NULL;
> >  }
> >  
> > +static void vxfs_inode_constructor(void *ptr)
> > +{
> > +	struct vxfs_vfs_inode *i = (struct vxfs_vfs_inode *) ptr;
> > +
> > +	inode_init_once(&i->ino);
> > +}
> >  
> >  int vxfs_ii_cache_init(void)
> >  {
> >  	vxfs_inode_cachep = kmem_cache_create("vxfs_inode",
> > -		sizeof(struct vxfs_inode_info), 0,
> > -		SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD, NULL);
> > +		sizeof(struct vxfs_vfs_inode), 0,
> > +		SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD, vxfs_inode_constructor);
> >  
> >  	return vxfs_inode_cachep ? 0 : -ENOMEM;
> >  }
> > diff --git a/fs/freevxfs/vxfs_inode.h b/fs/freevxfs/vxfs_inode.h
> > index 9a2c376..bba04a8 100644
> > --- a/fs/freevxfs/vxfs_inode.h
> > +++ b/fs/freevxfs/vxfs_inode.h
> > @@ -37,7 +37,6 @@
> >   * inodes of the Veritas Filesystem.
> >   */
> >  
> > -
> >  #define VXFS_ISIZE		0x100		/* Inode size */
> >  
> >  #define VXFS_NDADDR		10		/* Number of direct addrs in inode */
> > @@ -154,6 +153,16 @@ struct vxfs_dinode {
> >   */
> >  #define vxfs_inode_info	vxfs_dinode
> >  
> > +struct vxfs_vfs_inode {
> > +	struct inode ino;
> > +	struct vxfs_inode_info cpufs_ino;
> > +	/*
> > +	 * the cpufs_ino contains copy of on-disk inode but
> > +	 * it is cpu-endian formatted and it might be not aligned
> > +	 */
> > +};
> > +
> > +
> >  #define vii_mode	vdi_mode
> >  #define vii_uid		vdi_uid
> >  #define vii_gid		vdi_gid
> > @@ -177,4 +186,13 @@ struct vxfs_dinode {
> >  #define vii_ext4	vdi_org.ext4
> >  #define vii_typed	vdi_org.typed
> >  
> > +/*
> > + * Get filesystem private data from VFS inode.
> > + */
> > +static inline struct vxfs_inode_info *VXFS_INO(struct inode *i)
> > +{
> > +	return &(container_of(i, struct vxfs_vfs_inode, ino))->cpufs_ino;
> > +}
> > +
> > +
> >  #endif /* _VXFS_INODE_H_ */
> > diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c
> > index 9525818..7bd76ab 100644
> > --- a/fs/freevxfs/vxfs_super.c
> > +++ b/fs/freevxfs/vxfs_super.c
> > @@ -59,6 +59,7 @@ static int		vxfs_statfs(struct dentry *, struct kstatfs *);
> >  static int		vxfs_remount(struct super_block *, int *, char *);
> >  
> >  static const struct super_operations vxfs_super_ops = {
> > +	.alloc_inode = vxfs_inode_alloc,
> >  	.destroy_inode = vxfs_destroy_inode,
> >  	.evict_inode =		vxfs_evict_inode,
> >  	.put_super =		vxfs_put_super,
> 
> Please indent everything here
> > @@ -80,9 +81,9 @@ vxfs_put_super(struct super_block *sbp)
> >  {
> >  	struct vxfs_sb_info	*infp = VXFS_SBI(sbp);
> >  
> > -	vxfs_put_fake_inode(infp->vsi_fship);
> > -	vxfs_put_fake_inode(infp->vsi_ilist);
> > -	vxfs_put_fake_inode(infp->vsi_stilist);
> > +	iput(infp->vsi_fship);
> > +	iput(infp->vsi_ilist);
> > +	iput(infp->vsi_stilist);
> >  
> >  	brelse(infp->vsi_bp);
> >  	kfree(infp);
> > @@ -259,17 +260,18 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent)
> >  		goto out;
> >  	}
> >  
> > +
> >  	if (vxfs_read_olt(sbp, bsize)) {
> >  		printk(KERN_WARNING "vxfs: unable to read olt\n");
> >  		goto out;
> >  	}
> >  
> > +	sbp->s_op = &vxfs_super_ops;
> >  	if (vxfs_read_fshead(sbp)) {
> >  		printk(KERN_WARNING "vxfs: unable to read fshead\n");
> >  		goto out;
> >  	}
> >  
> > -	sbp->s_op = &vxfs_super_ops;
> >  	root = vxfs_iget(sbp, VXFS_ROOT_INO);
> >  	if (IS_ERR(root)) {
> >  		ret = PTR_ERR(root);
> > @@ -284,9 +286,9 @@ static int vxfs_fill_super(struct super_block *sbp, void *dp, int silent)
> >  	return 0;
> >  	
> >  out_free_ilist:
> > -	vxfs_put_fake_inode(infp->vsi_fship);
> > -	vxfs_put_fake_inode(infp->vsi_ilist);
> > -	vxfs_put_fake_inode(infp->vsi_stilist);
> > +	iput(infp->vsi_fship);
> > +	iput(infp->vsi_ilist);
> > +	iput(infp->vsi_stilist);
> >  out:
> >  	brelse(infp->vsi_bp);
> >  	kfree(infp);
> > -- 
> > 1.7.3.4
> > 
> > From ce7bce806419c15f7dad3c9a20b59318566c79ef Mon Sep 17 00:00:00 2001
> > From: KB <kb@xxxxxxxxxxxxxxx>
> > Date: Sat, 28 May 2016 20:55:19 +0200
> > Subject: [PATCH 7/7] the credits
> > 
> > 
> > Signed-off-by: KB <kb@xxxxxxxxxxxxxxx>
> > ---
> >  fs/freevxfs/Kconfig       |   10 +++++++++-
> >  fs/freevxfs/vxfs.h        |    3 +++
> >  fs/freevxfs/vxfs_fshead.c |    4 ++++
> >  fs/freevxfs/vxfs_inode.c  |    4 ++++
> >  fs/freevxfs/vxfs_lookup.c |    4 ++++
> >  fs/freevxfs/vxfs_super.c  |    6 +++++-
> >  6 files changed, 29 insertions(+), 2 deletions(-)
> > 
> > diff --git a/fs/freevxfs/Kconfig b/fs/freevxfs/Kconfig
> > index 8dc1cd5..a4c9075 100644
> > --- a/fs/freevxfs/Kconfig
> > +++ b/fs/freevxfs/Kconfig
> > @@ -5,12 +5,20 @@ config VXFS_FS
> >  	  FreeVxFS is a file system driver that support the VERITAS VxFS(TM)
> >  	  file system format.  VERITAS VxFS(TM) is the standard file system
> >  	  of SCO UnixWare (and possibly others) and optionally available
> > -	  for Sunsoft Solaris, HP-UX and many other operating systems.
> > +	  for Sunsoft Solaris, HP-UX and many other operating systems. However
> > +	  these particular OS implementations of vxfs may differ in on-disk
> > +	  data endianess and/or superblock offset. The vxfs module has been 
> > +	  tested with SCO UnixWare and HP-UX B.10.20 (pa-risc 1.1 arch.)
> >  	  Currently only readonly access is supported.
> >  
> >  	  NOTE: the file system type as used by mount(1), mount(2) and
> >  	  fstab(5) is 'vxfs' as it describes the file system format, not
> >  	  the actual driver.
> >  
> > +	  There is a userspace utility for HP-UX logical volumes which makes 
> > +	  creating HP-UX logical volumes easy from HP-UX disk block device file 
> > +	  or regular file with image of the disk. See:
> > +	         https://sourceforge.net/projects/linux-vxfs/
> > +
> >  	  To compile this as a module, choose M here: the module will be
> >  	  called freevxfs.  If unsure, say N.
> > diff --git a/fs/freevxfs/vxfs.h b/fs/freevxfs/vxfs.h
> > index 8124a10..54a1d02 100644
> > --- a/fs/freevxfs/vxfs.h
> > +++ b/fs/freevxfs/vxfs.h
> > @@ -2,6 +2,9 @@
> >   * Copyright (c) 2000-2001 Christoph Hellwig.
> >   * All rights reserved.
> >   *
> > + * (c) 2016 Krzysztof Blaszkowski
> > + *       Many bug fixes, improvements & tests with HP-UX B.10.20 (pa-risc)
> > + *
> >   * Redistribution and use in source and binary forms, with or without
> >   * modification, are permitted provided that the following conditions
> >   * are met:
> > diff --git a/fs/freevxfs/vxfs_fshead.c b/fs/freevxfs/vxfs_fshead.c
> > index b24cb8c..2fc5280 100644
> > --- a/fs/freevxfs/vxfs_fshead.c
> > +++ b/fs/freevxfs/vxfs_fshead.c
> > @@ -2,6 +2,10 @@
> >   * Copyright (c) 2000-2001 Christoph Hellwig.
> >   * All rights reserved.
> >   *
> > + *
> > + * (c) 2016 Krzysztof Blaszkowski
> > + *       Many bug fixes, improvements & tests with HP-UX B.10.20 (pa-risc)
> > + *
> >   * Redistribution and use in source and binary forms, with or without
> >   * modification, are permitted provided that the following conditions
> >   * are met:
> > diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
> > index ee0ca04..4d84f5d 100644
> > --- a/fs/freevxfs/vxfs_inode.c
> > +++ b/fs/freevxfs/vxfs_inode.c
> > @@ -2,6 +2,10 @@
> >   * Copyright (c) 2000-2001 Christoph Hellwig.
> >   * All rights reserved.
> >   *
> > + *
> > + * (c) 2016 Krzysztof Blaszkowski
> > + *       Many bug fixes, improvements & tests with HP-UX B.10.20 (pa-risc)
> > + *
> >   * Redistribution and use in source and binary forms, with or without
> >   * modification, are permitted provided that the following conditions
> >   * are met:
> > diff --git a/fs/freevxfs/vxfs_lookup.c b/fs/freevxfs/vxfs_lookup.c
> > index 8eacb27..173aeea 100644
> > --- a/fs/freevxfs/vxfs_lookup.c
> > +++ b/fs/freevxfs/vxfs_lookup.c
> > @@ -2,6 +2,10 @@
> >   * Copyright (c) 2000-2001 Christoph Hellwig.
> >   * All rights reserved.
> >   *
> > + *
> > + * (c) 2016 Krzysztof Blaszkowski
> > + *       Many bug fixes, improvements & tests with HP-UX B.10.20 (pa-risc)
> > + *
> >   * Redistribution and use in source and binary forms, with or without
> >   * modification, are permitted provided that the following conditions
> >   * are met:
> > diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c
> > index 7bd76ab..964d402 100644
> > --- a/fs/freevxfs/vxfs_super.c
> > +++ b/fs/freevxfs/vxfs_super.c
> > @@ -2,6 +2,10 @@
> >   * Copyright (c) 2000-2001 Christoph Hellwig.
> >   * All rights reserved.
> >   *
> > + *
> > + * (c) 2016 Krzysztof Blaszkowski
> > + *       Many bug fixes, improvements & tests with HP-UX B.10.20 (pa-risc)
> > + *
> >   * Redistribution and use in source and binary forms, with or without
> >   * modification, are permitted provided that the following conditions
> >   * are met:
> > @@ -48,7 +52,7 @@
> >  #include "vxfs_inode.h"
> >  
> >  
> > -MODULE_AUTHOR("Christoph Hellwig");
> > +MODULE_AUTHOR("Christoph Hellwig, Krzysztof Blaszkowski");
> 
> Afaict MODULE_AUTHOR is supposed to only contain the original author, and not
> collect all developers who actually worked on the modules, if that was the case,
> we would have modules with thousands of names in the MODULE_AUTHOR macro, but
> well, I'm not the best person to say if it's right or not :)
> 
> >  MODULE_DESCRIPTION("Veritas Filesystem (VxFS) driver");
> >  MODULE_LICENSE("Dual BSD/GPL");
> >  
> > -- 
> > 1.7.3.4
> > 
> > 
> > 
> > On Thu, 2016-05-26 at 16:45 +0200, Krzysztof Błaszkowski wrote:
> > > Hi,
> > > 
> > > So then let it roll. 
> > > 
> > > Thanks
> > > 
> > > >From 3d3b4e1ed5df014ae191e0566ff86a17d7d9ac05 Mon Sep 17 00:00:00
> > > 2001
> > > From: KB <kb@xxxxxxxxxxxxxxx> 
> > -- 
> > Krzysztof Blaszkowski
> > 
> 

-- 
Krzysztof Blaszkowski

--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux