From: Steven Whitehouse <swhiteho@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH 03/15] GFS2: Improve error handling in inode allocation
Date: Thu, 10 Sep 2009 12:27:55 +0100 [thread overview]
Message-ID: <1252582087-10007-4-git-send-email-swhiteho@redhat.com> (raw)
In-Reply-To: <1252582087-10007-3-git-send-email-swhiteho@redhat.com>
A little while back, block allocation was given some improved
error handling which meant that -EIO was returned in the case
of there being a problem in the resource group data. In addition
a message is printed explaning what went wrong and how to fix it.
This extends that error handling so that it also covers inode
allocation too.
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
---
fs/gfs2/inode.c | 2 +-
fs/gfs2/rgrp.c | 36 +++++++++++++++++++++++++-----------
fs/gfs2/rgrp.h | 2 +-
3 files changed, 27 insertions(+), 13 deletions(-)
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 2f94bd7..f9b4fe8 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -731,7 +731,7 @@ static int alloc_dinode(struct gfs2_inode *dip, u64 *no_addr, u64 *generation)
if (error)
goto out_ipreserv;
- *no_addr = gfs2_alloc_di(dip, generation);
+ error = gfs2_alloc_di(dip, no_addr, generation);
gfs2_trans_end(sdp);
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index fba7957..3d0193a 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -1459,6 +1459,16 @@ int gfs2_rgrp_dump(struct seq_file *seq, const struct gfs2_glock *gl)
return 0;
}
+static void gfs2_rgrp_error(struct gfs2_rgrpd *rgd)
+{
+ struct gfs2_sbd *sdp = rgd->rd_sbd;
+ fs_warn(sdp, "rgrp %llu has an error, marking it readonly until umount\n",
+ (unsigned long long)rgd->rd_addr);
+ fs_warn(sdp, "umount on all nodes and run fsck.gfs2 to fix the error\n");
+ gfs2_rgrp_dump(NULL, rgd->rd_gl);
+ rgd->rd_flags |= GFS2_RDF_ERROR;
+}
+
/**
* gfs2_alloc_block - Allocate one or more blocks
* @ip: the inode to allocate the block for
@@ -1520,22 +1530,20 @@ int gfs2_alloc_block(struct gfs2_inode *ip, u64 *bn, unsigned int *n)
return 0;
rgrp_error:
- fs_warn(sdp, "rgrp %llu has an error, marking it readonly until umount\n",
- (unsigned long long)rgd->rd_addr);
- fs_warn(sdp, "umount on all nodes and run fsck.gfs2 to fix the error\n");
- gfs2_rgrp_dump(NULL, rgd->rd_gl);
- rgd->rd_flags |= GFS2_RDF_ERROR;
+ gfs2_rgrp_error(rgd);
return -EIO;
}
/**
* gfs2_alloc_di - Allocate a dinode
* @dip: the directory that the inode is going in
+ * @bn: the block number which is allocated
+ * @generation: the generation number of the inode
*
- * Returns: the block allocated
+ * Returns: 0 on success or error
*/
-u64 gfs2_alloc_di(struct gfs2_inode *dip, u64 *generation)
+int gfs2_alloc_di(struct gfs2_inode *dip, u64 *bn, u64 *generation)
{
struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
struct gfs2_alloc *al = dip->i_alloc;
@@ -1546,12 +1554,13 @@ u64 gfs2_alloc_di(struct gfs2_inode *dip, u64 *generation)
blk = rgblk_search(rgd, rgd->rd_last_alloc,
GFS2_BLKST_FREE, GFS2_BLKST_DINODE, &n);
- BUG_ON(blk == BFITNOENT);
- rgd->rd_last_alloc = blk;
+ /* Since all blocks are reserved in advance, this shouldn't happen */
+ if (blk == BFITNOENT)
+ goto rgrp_error;
+ rgd->rd_last_alloc = blk;
block = rgd->rd_data0 + blk;
-
gfs2_assert_withdraw(sdp, rgd->rd_free);
rgd->rd_free--;
rgd->rd_dinodes++;
@@ -1568,7 +1577,12 @@ u64 gfs2_alloc_di(struct gfs2_inode *dip, u64 *generation)
rgd->rd_free_clone--;
spin_unlock(&sdp->sd_rindex_spin);
trace_gfs2_block_alloc(dip, block, 1, GFS2_BLKST_DINODE);
- return block;
+ *bn = block;
+ return 0;
+
+rgrp_error:
+ gfs2_rgrp_error(rgd);
+ return -EIO;
}
/**
diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h
index 1e76ff0..a8dedd7 100644
--- a/fs/gfs2/rgrp.h
+++ b/fs/gfs2/rgrp.h
@@ -47,7 +47,7 @@ extern void gfs2_inplace_release(struct gfs2_inode *ip);
extern unsigned char gfs2_get_block_type(struct gfs2_rgrpd *rgd, u64 block);
extern int gfs2_alloc_block(struct gfs2_inode *ip, u64 *bn, unsigned int *n);
-extern u64 gfs2_alloc_di(struct gfs2_inode *ip, u64 *generation);
+extern int gfs2_alloc_di(struct gfs2_inode *ip, u64 *bn, u64 *generation);
extern void gfs2_free_data(struct gfs2_inode *ip, u64 bstart, u32 blen);
extern void gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen);
--
1.6.2.5
next prev parent reply other threads:[~2009-09-10 11:27 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-10 11:27 [Cluster-devel] GFS2: Pre-pull patch posting Steven Whitehouse
2009-09-10 11:27 ` [Cluster-devel] [PATCH 01/15] GFS2: Add online uevent to GFS2 Steven Whitehouse
2009-09-10 11:27 ` [Cluster-devel] [PATCH 02/15] GFS2: Add some more info to uevents Steven Whitehouse
2009-09-10 11:27 ` Steven Whitehouse [this message]
2009-09-10 11:27 ` [Cluster-devel] [PATCH 04/15] GFS2: Replace assertion with proper error handling Steven Whitehouse
2009-09-10 11:27 ` [Cluster-devel] [PATCH 05/15] GFS2: Add sysfs link to device Steven Whitehouse
2009-09-10 11:27 ` [Cluster-devel] [PATCH 06/15] GFS2: Add a document explaining GFS2's uevents Steven Whitehouse
2009-09-10 11:27 ` [Cluster-devel] [PATCH 07/15] GFS2: free disk inode which is deleted by remote node -V2 Steven Whitehouse
2009-09-10 11:28 ` [Cluster-devel] [PATCH 08/15] GFS2: jumping to wrong label? Steven Whitehouse
2009-09-10 11:28 ` [Cluster-devel] [PATCH 09/15] GFS2: Add "-o errors=panic|withdraw" mount options Steven Whitehouse
2009-09-10 11:28 ` [Cluster-devel] [PATCH 10/15] GFS2: Add explanation of extended attr on-disk format Steven Whitehouse
2009-09-10 11:28 ` [Cluster-devel] [PATCH 11/15] GFS2: Clean up of extended attribute support Steven Whitehouse
2009-09-10 11:28 ` [Cluster-devel] [PATCH 12/15] GFS2: Rename eattr.[ch] as xattr.[ch] Steven Whitehouse
2009-09-10 11:28 ` [Cluster-devel] [PATCH 13/15] GFS2: Remove no_formal_ino generating code Steven Whitehouse
2009-09-10 11:28 ` [Cluster-devel] [PATCH 14/15] GFS2: Be extra careful about deallocating inodes Steven Whitehouse
2009-09-10 11:28 ` [Cluster-devel] [PATCH 15/15] GFS2: Remove unused sysfs file Steven Whitehouse
[not found] ` <1252593990.30578.180.camel@desktop>
2009-09-14 7:57 ` [Cluster-devel] Re: GFS2: Pre-pull patch posting 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=1252582087-10007-4-git-send-email-swhiteho@redhat.com \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).