All of lore.kernel.org
 help / color / mirror / Atom feed
From: S. Wendy Cheng <wcheng@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [GFS2 PATCH 2/3] Obtaining no_formal_ino from directory entry
Date: Wed, 27 Jun 2007 01:25:09 -0400	[thread overview]
Message-ID: <4681F4B5.9060604@redhat.com> (raw)
In-Reply-To: <4681F257.5080100@redhat.com>

Grr... there is a typo ... If we all agree with DT_WHT type, will 
re-submit the patch early tomorrow morning.. maybe we should hop on 
#sistina irc around 9:30 am EST to speed up the discussion ? Need to get 
this done and tested out (on RHEL 5.1) by noon tomorrow..

Kicked off the new kernel build now. G'night !

-- Wendy

> Steven Whitehouse wrote:
>
>> Hi,
>>
>> On Mon, 2007-06-25 at 21:14 -0400, S. Wendy Cheng wrote:
>>  
>>
>>> GFS2 lookup code doesn't ask for inode shared glock. This implies 
>>> during in-memory inode creation for existing file, GFS2 will not 
>>> disk-read in the inode contents. This leaves no_formal_ino 
>>> un-initialized during lookup time. The un-initialized no_formal_ino 
>>> is subsequently encoded into file handle. Clients will get ESTALE 
>>> error whenever it tries to access these files.
>>>
>>> -- Wendy
>>>
>>>   
>>
>>
>> Generally this looks good. Please don't add back the _host structure
>> though - just add an extra no_formal_ino argument to the lookup function
>> which is a u64,
>>  
>>
>
> The gfs2_inode_lookup() parameter set would be too long. How about 
> this ... we will never use DT_WHT (bit 14) anyway so let's define:
>
> struct inode *gfs2_inode_lookup(struct super_block *sb,
>                                unsigned type,   // if invoked from 
> gfs2_get_dentry by NFSD
>                                                          // type would 
> be DT_WHT.
>                                u64 no_addr,
>                                u64 no_formal_ino);
>
> Then we would save one parameter in patch #3 that will use DT_WHT as 
> nfsbypass param ? Patch enclosed.
>
> -- Wendy
>
>
>
>------------------------------------------------------------------------
>
> Signed-off-by: S. Wendy Cheng <wcheng@redhat.com>
>
> dir.c        |    7 ++++---
> inode.c      |   12 +++++++++---
> inode.h      |    3 ++-
> ops_export.c |    4 +++-
> ops_fstype.c |    2 +-
> rgrp.c       |   11 ++++++-----
> 6 files changed, 25 insertions(+), 14 deletions(-)
>
>--- gfs2-nfs1/fs/gfs2/inode.h	2007-06-22 22:11:42.000000000 -0400
>+++ gfs2-nfs2/fs/gfs2/inode.h	2007-06-27 00:17:41.000000000 -0400
>@@ -47,7 +47,8 @@ static inline void gfs2_inum_out(const s
> 
> 
> void gfs2_inode_attr_in(struct gfs2_inode *ip);
>-struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned type);
>+struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, 
>+				u64 no_addr, u64 no_formal_ino);
> struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr);
> 
> int gfs2_inode_refresh(struct gfs2_inode *ip);
>--- gfs2-nfs1/fs/gfs2/inode.c	2007-06-22 22:11:42.000000000 -0400
>+++ gfs2-nfs2/fs/gfs2/inode.c	2007-06-27 00:23:05.000000000 -0400
>@@ -86,9 +86,12 @@ static struct inode *gfs2_iget(struct su
>  * Returns: A VFS inode, or an error
>  */
> 
>-struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned int type)
>+struct inode *gfs2_inode_lookup(struct super_block *sb, 
>+				unsigned int type,
>+				u64 no_addr,
>+				u64 no_formal_ino)
> {
>-	struct inode *inode = gfs2_iget(sb, no_addr);
>+	struct inode *inode = gfs2_iget(sb, ino->no_addr);
> 	struct gfs2_inode *ip = GFS2_I(inode);
> 	struct gfs2_glock *io_gl;
> 	int error;
>@@ -100,6 +103,7 @@ struct inode *gfs2_inode_lookup(struct s
> 		struct gfs2_sbd *sdp = GFS2_SB(inode);
> 		umode_t mode;
> 		inode->i_private = ip;
>+		ip->i_no_formal_ino = no_formal_ino;
> 
> 		error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
> 		if (unlikely(error))
>@@ -915,7 +919,9 @@ struct inode *gfs2_createi(struct gfs2_h
> 	if (error)
> 		goto fail_gunlock2;
> 
>-	inode = gfs2_inode_lookup(dir->i_sb, inum.no_addr, IF2DT(mode));
>+	inode = gfs2_inode_lookup(dir->i_sb, IF2DT(mode),
>+					inum.no_addr,
>+					inum.no_formal_ino);
> 	if (IS_ERR(inode))
> 		goto fail_gunlock2;
> 
>--- gfs2-nfs1/fs/gfs2/dir.c	2007-06-22 22:11:42.000000000 -0400
>+++ gfs2-nfs2/fs/gfs2/dir.c	2007-06-27 00:19:22.000000000 -0400
>@@ -1498,9 +1498,10 @@ struct inode *gfs2_dir_search(struct ino
> 	if (dent) {
> 		if (IS_ERR(dent))
> 			return ERR_PTR(PTR_ERR(dent));
>-		inode = gfs2_inode_lookup(dir->i_sb,
>-					  be64_to_cpu(dent->de_inum.no_addr),
>-					  be16_to_cpu(dent->de_type));
>+		inode = gfs2_inode_lookup(dir->i_sb, 
>+				be16_to_cpu(dent->de_type),
>+				be64_to_cpu(dent->de_inum.no_addr),
>+				be64_to_cpu(dent->de_inum.no_formal_ino);
> 		brelse(bh);
> 		return inode;
> 	}
>--- gfs2-nfs1/fs/gfs2/ops_export.c	2007-06-22 22:11:42.000000000 -0400
>+++ gfs2-nfs2/fs/gfs2/ops_export.c	2007-06-27 00:24:38.000000000 -0400
>@@ -245,7 +245,9 @@ static struct dentry *gfs2_get_dentry(st
> 	gfs2_glock_dq_uninit(&rgd_gh);
> 	gfs2_glock_dq_uninit(&ri_gh);
> 
>-	inode = gfs2_inode_lookup(sb, inum->no_addr, fh_obj->imode);
>+	inode = gfs2_inode_lookup(sb, fh_obj->imode,
>+					inum->no_addr,
>+					inum->no_formal_ino);
> 	if (!inode)
> 		goto fail;
> 	if (IS_ERR(inode)) {
>--- gfs2-nfs1/fs/gfs2/ops_fstype.c	2007-06-22 22:11:42.000000000 -0400
>+++ gfs2-nfs2/fs/gfs2/ops_fstype.c	2007-06-27 00:30:22.000000000 -0400
>@@ -236,7 +236,7 @@ fail:
> static inline struct inode *gfs2_lookup_root(struct super_block *sb,
> 					     u64 no_addr)
> {
>-	return gfs2_inode_lookup(sb, no_addr, DT_DIR);
>+	return gfs2_inode_lookup(sb, DT_DIR, no_addr, 0);
> }
> 
> static int init_sb(struct gfs2_sbd *sdp, int silent, int undo)
>--- gfs2-nfs1/fs/gfs2/rgrp.c	2007-06-22 22:11:42.000000000 -0400
>+++ gfs2-nfs2/fs/gfs2/rgrp.c	2007-06-27 00:31:44.000000000 -0400
>@@ -861,18 +861,19 @@ static struct inode *try_rgrp_unlink(str
> {
> 	struct inode *inode;
> 	u32 goal = 0;
>-	u64 ino;
>+	u64 no_addr;
> 
> 	for(;;) {
> 		goal = rgblk_search(rgd, goal, GFS2_BLKST_UNLINKED,
> 				    GFS2_BLKST_UNLINKED);
> 		if (goal == 0)
> 			return 0;
>-		ino = goal + rgd->rd_data0;
>-		if (ino <= *last_unlinked)
>+		no_addr = goal + rgd->rd_data0;
>+		if (no_addr <= *last_unlinked)
> 			continue;
>-		*last_unlinked = ino;
>-		inode = gfs2_inode_lookup(rgd->rd_sbd->sd_vfs, ino, DT_UNKNOWN);
>+		*last_unlinked = ino.no_addr;
>+		inode = gfs2_inode_lookup(rgd->rd_sbd->sd_vfs, DT_UNKNOWN,
>+					no_addr, 0);
> 		if (!IS_ERR(inode))
> 			return inode;
> 	}
>  
>



  reply	other threads:[~2007-06-27  5:25 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-06-26  1:14 [Cluster-devel] [GFS2 PATCH 1/3] Obtaining no_formal_ino from directory entry S. Wendy Cheng
2007-06-26  1:18 ` [Cluster-devel] [GFS2 PATCH 2/3] " S. Wendy Cheng
2007-06-27  3:02 ` [Cluster-devel] [GFS2 PATCH 1/3] " Steven Whitehouse
2007-06-27  5:15   ` [Cluster-devel] [GFS2 PATCH 2/3] " S. Wendy Cheng
2007-06-27  5:25     ` S. Wendy Cheng [this message]
2007-06-27 13:13     ` Steven Whitehouse
2007-06-27 21:07       ` Wendy Cheng
2007-06-27 22:49         ` Steven Whitehouse

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4681F4B5.9060604@redhat.com \
    --to=wcheng@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.