From: Steven Whitehouse <swhiteho@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [GFS2 Patch] GFS2: fsck.gfs2 finds unlinked inodes on full file systems
Date: Thu, 05 Jan 2012 15:32:17 +0000 [thread overview]
Message-ID: <1325777537.2690.36.camel@menhir> (raw)
In-Reply-To: <cb906015-c1b7-4b92-bf19-b1f5806602e0@zmail16.collab.prod.int.phx2.redhat.com>
Hi,
On Thu, 2012-01-05 at 09:57 -0500, Bob Peterson wrote:
> ----- Original Message -----
> | 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
>
> My apologies. I didn't catch the fact that the function had moved
> to super.c and become static. Here's a replacement that compiles.
> Unless you want me to move the function back to inode.c since it's
> not static anymore?
>
> Regards,
>
> Bob Peterson
> Red Hat File Systems
> --
> commit 99259e30d3cc49cee5c55be9ca5ab76e772ad22f
> Author: Bob Peterson <rpeterso@redhat.com>
> Date: Wed Jan 4 08:57:11 2012 -0600
>
> 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:
> diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
> index 69eb568..0b00f2f 100644
> --- a/fs/gfs2/super.c
> +++ b/fs/gfs2/super.c
> @@ -1396,7 +1396,7 @@ static void gfs2_final_release_pages(struct gfs2_inode *ip)
> }
> }
>
> -static int gfs2_dinode_dealloc(struct gfs2_inode *ip)
> +int gfs2_dinode_dealloc(struct gfs2_inode *ip)
> {
> struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
> struct gfs2_qadata *qa;
> diff --git a/fs/gfs2/super.h b/fs/gfs2/super.h
> index a046468..bb0029b 100644
> --- a/fs/gfs2/super.h
> +++ b/fs/gfs2/super.h
> @@ -48,6 +48,7 @@ extern int gfs2_statfs_sync(struct super_block *sb, int type);
>
> extern int gfs2_freeze_fs(struct gfs2_sbd *sdp);
> extern void gfs2_unfreeze_fs(struct gfs2_sbd *sdp);
> +extern int gfs2_dinode_dealloc(struct gfs2_inode *ip);
>
> extern struct file_system_type gfs2_fs_type;
> extern struct file_system_type gfs2meta_fs_type;
One further thought... since the struct inode exists by the stage we hit
those error cases, it should be deallocated when it gets iput() in the
error case. So I wonder why thats not happened... perhaps i_nlink is not
zero at that time?
Steve.
next prev parent reply other threads:[~2012-01-05 15:32 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <5d3809ab-68d1-429d-9c89-24467729eaf8@zmail16.collab.prod.int.phx2.redhat.com>
2012-01-04 14:06 ` [Cluster-devel] [GFS2 Patch] GFS2: fsck.gfs2 finds unlinked inodes on full file systems Bob Peterson
2012-01-05 10:39 ` Steven Whitehouse
2012-01-05 14:57 ` Bob Peterson
2012-01-05 15:32 ` Steven Whitehouse [this message]
2012-01-05 19:53 ` Bob Peterson
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=1325777537.2690.36.camel@menhir \
--to=swhiteho@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.