[Cluster-devel] [GFS2 Patch] GFS2: fsck.gfs2 finds unlinked inodes on full file systems

Steven Whitehouse swhiteho at redhat.com
Thu Jan 5 10:39:37 UTC 2012


Hi,

This doesn't compile....

  CC [M]  fs/gfs2/inode.o
fs/gfs2/inode.c: In function ‘gfs2_create_inode’:
fs/gfs2/inode.c:741:2: error: implicit declaration of function
‘gfs2_dinode_dealloc’
make[2]: *** [fs/gfs2/inode.o] Error 1
make[1]: *** [fs/gfs2] Error 2
make: *** [fs] Error 2


Steve.

On Wed, 2012-01-04 at 09:06 -0500, Bob Peterson wrote:
> Hi,
> 
> This patch fixes a problem whereby GFS2 does not properly clean
> up partially created files when the file system becomes too full.
> 
> Regards,
> 
> Bob Peterson
> Red Hat File Systems
> 
> Signed-off-by: Bob Peterson <rpeterso at redhat.com>
> --
> GFS2: fsck.gfs2 finds unlinked inodes on full file systems
> 
> In some cases, when a GFS2 file system was nearly full, GFS2
> was able to allocate a block for a new file's dinode but not
> a second block for linking that new dinode to a directory.
> In these cases, GFS2 was not properly deallocating the partially-
> created file. Thus, subsequent runs of fsck.gfs2 found unlinked
> files. This patch adds a an extra cleanup path to the dinode
> create function to properly deallocate the partially-created file.
> 
> diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
> index cb81898..bc81c9d 100644
> --- a/fs/gfs2/inode.c
> +++ b/fs/gfs2/inode.c
> @@ -708,19 +708,19 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
>  
>  	error = gfs2_inode_refresh(GFS2_I(inode));
>  	if (error)
> -		goto fail_gunlock2;
> +		goto fail_dealloc;
>  
>  	error = gfs2_acl_create(dip, inode);
>  	if (error)
> -		goto fail_gunlock2;
> +		goto fail_dealloc;
>  
>  	error = gfs2_security_init(dip, GFS2_I(inode), name);
>  	if (error)
> -		goto fail_gunlock2;
> +		goto fail_dealloc;
>  
>  	error = link_dinode(dip, name, GFS2_I(inode));
>  	if (error)
> -		goto fail_gunlock2;
> +		goto fail_dealloc;
>  
>  	if (bh)
>  		brelse(bh);
> @@ -737,6 +737,8 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
>  	d_instantiate(dentry, inode);
>  	return 0;
>  
> +fail_dealloc:
> +	gfs2_dinode_dealloc(GFS2_I(inode));
>  fail_gunlock2:
>  	gfs2_glock_dq_uninit(ghs + 1);
>  fail_gunlock:
> 





More information about the Cluster-devel mailing list