aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/ops_address.c
diff options
context:
space:
mode:
authorRobert Peterson <rpeterso@redhat.com>2007-05-09 10:37:57 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2007-07-09 03:22:12 -0400
commit7ae8fa8451dfb3879ecbc04f2760a707dc65b988 (patch)
tree568b3b6b8a1b39d0e4177d81d2e8262cbafa4fa4 /fs/gfs2/ops_address.c
parent3168b0780d06ace875696f8a648d04d6089654e5 (diff)
[GFS2] kernel changes to support new gfs2_grow command
This is another revision of my gfs2 kernel patch that allows gfs2_grow to function properly. Steve Whitehouse expressed some concerns about the previous patch and I restructured it based on his comments. The previous patch was doing the statfs_change at file close time, under its own transaction. The current patch does the statfs_change inside the gfs2_commit_write function, which keeps it under the umbrella of the inode transaction. I can't call ri_update to re-read the rindex file during the transaction because the transaction may have outstanding unwritten buffers attached to the rgrps that would be otherwise blown away. So instead, I created a new function, gfs2_ri_total, that will re-read the rindex file just to total the file system space for the sake of the statfs_change. The ri_update will happen later, when gfs2 realizes the version number has changed, as it happened before my patch. Since the statfs_change is happening at write_commit time and there may be multiple writes to the rindex file for one grow operation. So one consequence of this restructuring is that instead of getting one kernel message to indicate the change, you may see several. For example, before when you did a gfs2_grow, you'd get a single message like: GFS2: File system extended by 247876 blocks (968MB) Now you get something like: GFS2: File system extended by 207896 blocks (812MB) GFS2: File system extended by 39980 blocks (156MB) This version has also been successfully run against the hours-long "gfs2_fsck_hellfire" test that does several gfs2_grow and gfs2_fsck while interjecting file system damage. It does this repeatedly under a variety Resource Group conditions. Signed-off-By: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/ops_address.c')
-rw-r--r--fs/gfs2/ops_address.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
index 30c15622174f..846c0ff75cff 100644
--- a/fs/gfs2/ops_address.c
+++ b/fs/gfs2/ops_address.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 3 * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
4 * 4 *
5 * This copyrighted material is made available to anyone wishing to use, 5 * This copyrighted material is made available to anyone wishing to use,
6 * modify, copy, or redistribute it subject to the terms and conditions 6 * modify, copy, or redistribute it subject to the terms and conditions
@@ -450,6 +450,30 @@ out_uninit:
450} 450}
451 451
452/** 452/**
453 * adjust_fs_space - Adjusts the free space available due to gfs2_grow
454 * @inode: the rindex inode
455 */
456static void adjust_fs_space(struct inode *inode)
457{
458 struct gfs2_sbd *sdp = inode->i_sb->s_fs_info;
459 struct gfs2_statfs_change_host *m_sc = &sdp->sd_statfs_master;
460 struct gfs2_statfs_change_host *l_sc = &sdp->sd_statfs_local;
461 u64 fs_total, new_free;
462
463 /* Total up the file system space, according to the latest rindex. */
464 fs_total = gfs2_ri_total(sdp);
465
466 spin_lock(&sdp->sd_statfs_spin);
467 if (fs_total > (m_sc->sc_total + l_sc->sc_total))
468 new_free = fs_total - (m_sc->sc_total + l_sc->sc_total);
469 else
470 new_free = 0;
471 spin_unlock(&sdp->sd_statfs_spin);
472 fs_warn(sdp, "File system extended by %llu blocks.\n", new_free);
473 gfs2_statfs_change(sdp, new_free, new_free, 0);
474}
475
476/**
453 * gfs2_commit_write - Commit write to a file 477 * gfs2_commit_write - Commit write to a file
454 * @file: The file to write to 478 * @file: The file to write to
455 * @page: The page containing the data 479 * @page: The page containing the data
@@ -511,6 +535,9 @@ static int gfs2_commit_write(struct file *file, struct page *page,
511 di->di_size = cpu_to_be64(inode->i_size); 535 di->di_size = cpu_to_be64(inode->i_size);
512 } 536 }
513 537
538 if (inode == sdp->sd_rindex)
539 adjust_fs_space(inode);
540
514 brelse(dibh); 541 brelse(dibh);
515 gfs2_trans_end(sdp); 542 gfs2_trans_end(sdp);
516 if (al->al_requested) { 543 if (al->al_requested) {