diff options
| author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-01-23 17:24:26 +0000 | 
|---|---|---|
| committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-01-24 23:45:32 +0000 | 
| commit | bdd92c9ad287e03a2ec52f5a89c470cd5caae1c2 (patch) | |
| tree | 38d863507e900fb2ccac4c22fcf8934271c051b5 /fs/gfs2/inode.c | |
| parent | a37f2f87edc1b6e5932becf6e51535d36b690f2a (diff) | |
| parent | 8e934dbf264418afe4d1dff34ce074ecc14280db (diff) | |
| download | olio-linux-3.10-bdd92c9ad287e03a2ec52f5a89c470cd5caae1c2.tar.xz olio-linux-3.10-bdd92c9ad287e03a2ec52f5a89c470cd5caae1c2.zip  | |
Merge branch 'drm-intel-fixes' into drm-intel-next
Merge important suspend and resume regression fixes and resolve the
small conflict.
Conflicts:
	drivers/gpu/drm/i915/i915_dma.c
Diffstat (limited to 'fs/gfs2/inode.c')
| -rw-r--r-- | fs/gfs2/inode.c | 72 | 
1 files changed, 22 insertions, 50 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 2232b3c780b..7aa7d4f8984 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -74,16 +74,14 @@ static struct inode *gfs2_iget(struct super_block *sb, u64 no_addr)  }  /** - * GFS2 lookup code fills in vfs inode contents based on info obtained - * from directory entry inside gfs2_inode_lookup(). This has caused issues - * with NFS code path since its get_dentry routine doesn't have the relevant - * directory entry when gfs2_inode_lookup() is invoked. Part of the code - * segment inside gfs2_inode_lookup code needs to get moved around. + * gfs2_set_iop - Sets inode operations + * @inode: The inode with correct i_mode filled in   * - * Clears I_NEW as well. - **/ + * GFS2 lookup code fills in vfs inode contents based on info obtained + * from directory entry inside gfs2_inode_lookup(). + */ -void gfs2_set_iop(struct inode *inode) +static void gfs2_set_iop(struct inode *inode)  {  	struct gfs2_sbd *sdp = GFS2_SB(inode);  	umode_t mode = inode->i_mode; @@ -106,8 +104,6 @@ void gfs2_set_iop(struct inode *inode)  		inode->i_op = &gfs2_file_iops;  		init_special_inode(inode, inode->i_mode, inode->i_rdev);  	} - -	unlock_new_inode(inode);  }  /** @@ -119,10 +115,8 @@ void gfs2_set_iop(struct inode *inode)   * Returns: A VFS inode, or an error   */ -struct inode *gfs2_inode_lookup(struct super_block *sb, -				unsigned int type, -				u64 no_addr, -				u64 no_formal_ino) +struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type, +				u64 no_addr, u64 no_formal_ino)  {  	struct inode *inode;  	struct gfs2_inode *ip; @@ -152,51 +146,37 @@ struct inode *gfs2_inode_lookup(struct super_block *sb,  		error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);  		if (unlikely(error))  			goto fail_iopen; -		ip->i_iopen_gh.gh_gl->gl_object = ip; +		ip->i_iopen_gh.gh_gl->gl_object = ip;  		gfs2_glock_put(io_gl);  		io_gl = NULL; -		if ((type == DT_UNKNOWN) && (no_formal_ino == 0)) -			goto gfs2_nfsbypass; - -		inode->i_mode = DT2IF(type); - -		/* -		 * We must read the inode in order to work out its type in -		 * this case. Note that this doesn't happen often as we normally -		 * know the type beforehand. This code path only occurs during -		 * unlinked inode recovery (where it is safe to do this glock, -		 * which is not true in the general case). -		 */  		if (type == DT_UNKNOWN) { -			struct gfs2_holder gh; -			error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); -			if (unlikely(error)) -				goto fail_glock; -			/* Inode is now uptodate */ -			gfs2_glock_dq_uninit(&gh); +			/* Inode glock must be locked already */ +			error = gfs2_inode_refresh(GFS2_I(inode)); +			if (error) +				goto fail_refresh; +		} else { +			inode->i_mode = DT2IF(type);  		}  		gfs2_set_iop(inode); +		unlock_new_inode(inode);  	} -gfs2_nfsbypass:  	return inode; -fail_glock: -	gfs2_glock_dq(&ip->i_iopen_gh); + +fail_refresh: +	ip->i_iopen_gh.gh_gl->gl_object = NULL; +	gfs2_glock_dq_uninit(&ip->i_iopen_gh);  fail_iopen:  	if (io_gl)  		gfs2_glock_put(io_gl);  fail_put: -	if (inode->i_state & I_NEW) -		ip->i_gl->gl_object = NULL; +	ip->i_gl->gl_object = NULL;  	gfs2_glock_put(ip->i_gl);  fail: -	if (inode->i_state & I_NEW) -		iget_failed(inode); -	else -		iput(inode); +	iget_failed(inode);  	return ERR_PTR(error);  } @@ -221,14 +201,6 @@ struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr,  	if (IS_ERR(inode))  		goto fail; -	error = gfs2_inode_refresh(GFS2_I(inode)); -	if (error) -		goto fail_iput; - -	/* Pick up the works we bypass in gfs2_inode_lookup */ -	if (inode->i_state & I_NEW)  -		gfs2_set_iop(inode); -  	/* Two extra checks for NFS only */  	if (no_formal_ino) {  		error = -ESTALE;  |