From: Steven Whitehouse <swhiteho@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH 10/15] GFS2: reread rindex when necessary to grow rindex
Date: Fri, 17 Dec 2010 12:24:16 +0000 [thread overview]
Message-ID: <1292588661-14350-11-git-send-email-swhiteho@redhat.com> (raw)
In-Reply-To: <1292588661-14350-1-git-send-email-swhiteho@redhat.com>
From: Benjamin Marzinski <bmarzins@redhat.com>
When GFS2 grew the filesystem, it was never rereading the rindex file during
the grow. This is necessary for large grows when the filesystem is almost full,
and GFS2 needs to use some of the space allocated earlier in the grow to
complete it. Now, if GFS2 fails to reserve the necessary space and the rindex
file is not uptodate, it rereads it. Also, the only difference between
gfs2_ri_update() and gfs2_ri_update_special() was that gfs2_ri_update_special()
didn't clear out the existing resource groups, since you knew that it was only
called when there were no resource groups. Attempting to clear out the
resource groups when there are none takes almost no time, and rarely happens,
so I simply removed gfs2_ri_update_special().
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 33c8407..6375b38 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -614,46 +614,6 @@ static int gfs2_ri_update(struct gfs2_inode *ip)
}
/**
- * gfs2_ri_update_special - Pull in a new resource index from the disk
- *
- * This is a special version that's safe to call from gfs2_inplace_reserve_i.
- * In this case we know that we don't have any resource groups in memory yet.
- *
- * @ip: pointer to the rindex inode
- *
- * Returns: 0 on successful update, error code otherwise
- */
-static int gfs2_ri_update_special(struct gfs2_inode *ip)
-{
- struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
- struct inode *inode = &ip->i_inode;
- struct file_ra_state ra_state;
- struct gfs2_rgrpd *rgd;
- unsigned int max_data = 0;
- int error;
-
- file_ra_state_init(&ra_state, inode->i_mapping);
- for (sdp->sd_rgrps = 0;; sdp->sd_rgrps++) {
- /* Ignore partials */
- if ((sdp->sd_rgrps + 1) * sizeof(struct gfs2_rindex) >
- i_size_read(inode))
- break;
- error = read_rindex_entry(ip, &ra_state);
- if (error) {
- clear_rgrpdi(sdp);
- return error;
- }
- }
- list_for_each_entry(rgd, &sdp->sd_rindex_list, rd_list)
- if (rgd->rd_data > max_data)
- max_data = rgd->rd_data;
- sdp->sd_max_rg_data = max_data;
-
- sdp->sd_rindex_uptodate = 1;
- return 0;
-}
-
-/**
* gfs2_rindex_hold - Grab a lock on the rindex
* @sdp: The GFS2 superblock
* @ri_gh: the glock holder
@@ -1226,16 +1186,25 @@ int gfs2_inplace_reserve_i(struct gfs2_inode *ip, int hold_rindex,
error = gfs2_rindex_hold(sdp, &al->al_ri_gh);
else if (!sdp->sd_rgrps) /* We may not have the rindex read
in, so: */
- error = gfs2_ri_update_special(ip);
+ error = gfs2_ri_update(ip);
if (error)
return error;
}
+try_again:
do {
error = get_local_rgrp(ip, &last_unlinked);
/* If there is no space, flushing the log may release some */
- if (error)
+ if (error) {
+ if (ip == GFS2_I(sdp->sd_rindex) &&
+ !sdp->sd_rindex_uptodate) {
+ error = gfs2_ri_update(ip);
+ if (error)
+ return error;
+ goto try_again;
+ }
gfs2_log_flush(sdp, NULL);
+ }
} while (error && tries++ < 3);
if (error) {
--
1.7.3.3
next prev parent reply other threads:[~2010-12-17 12:24 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-17 12:24 [Cluster-devel] GFS2: Pre-pull patch posting (-nmw) Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 01/15] GFS2: Change two WQ_RESCUERs into WQ_MEM_RECLAIM Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 02/15] GFS2: fs/gfs2/glock.c: Convert sprintf_symbol to %pS Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 03/15] GFS2: Remove unreachable calls to vmtruncate Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 04/15] GFS2: Clean up duplicated setattr code Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 05/15] GFS2: fs/gfs2/glock.c: Use printf extension %pV Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 06/15] GFS2: fs/gfs2/glock.h: Add __attribute__((format(printf, 2, 3)) to gfs2_print_dbg Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 07/15] GFS2: Allow gfs2 to update quota usage values through the quotactl interface Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 08/15] GFS2: Clean up of gdlm_lock function Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 09/15] GFS2: Remove duplicate #defines from glock.h Steven Whitehouse
2010-12-17 12:24 ` Steven Whitehouse [this message]
2010-12-17 12:24 ` [Cluster-devel] [PATCH 11/15] GFS2: fix recursive locking during rindex truncates Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 12/15] GFS2: Fix uninitialised error value in previous patch Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 13/15] GFS2: Merge glock state fields into a bitfield Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 14/15] GFS2: fsck.gfs2 reported statfs error after gfs2_grow Steven Whitehouse
2010-12-17 12:24 ` [Cluster-devel] [PATCH 15/15] GFS2: Don't flush delete workqueue when releasing the transaction lock 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=1292588661-14350-11-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).