Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 58541
b: refs/heads/master
c: 6c53267
h: refs/heads/master
i:
  58539: 41b6683
v: v3
  • Loading branch information
Robert Peterson authored and Steven Whitehouse committed Jul 9, 2007
1 parent b1e0f50 commit 3aaa3d6
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 50 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7ae8fa8451dfb3879ecbc04f2760a707dc65b988
refs/heads/master: 6c53267f05dc6689ff662efeec426d25d2c0ab84
3 changes: 2 additions & 1 deletion trunk/fs/gfs2/ops_address.c
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,8 @@ static void adjust_fs_space(struct inode *inode)
else
new_free = 0;
spin_unlock(&sdp->sd_statfs_spin);
fs_warn(sdp, "File system extended by %llu blocks.\n", new_free);
fs_warn(sdp, "File system extended by %llu blocks.\n",
(unsigned long long)new_free);
gfs2_statfs_change(sdp, new_free, new_free, 0);
}

Expand Down
139 changes: 91 additions & 48 deletions trunk/fs/gfs2/rgrp.c
Original file line number Diff line number Diff line change
Expand Up @@ -463,28 +463,74 @@ u64 gfs2_ri_total(struct gfs2_sbd *sdp)
}

/**
* gfs2_ri_update - Pull in a new resource index from the disk
* read_rindex_entry - Pull in a new resource index entry from the disk
* @gl: The glock covering the rindex inode
*
* Returns: 0 on success, error code otherwise
*/

static int read_rindex_entry(struct gfs2_inode *ip,
struct file_ra_state *ra_state)
{
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
loff_t pos = sdp->sd_rgrps * sizeof(struct gfs2_rindex);
char buf[sizeof(struct gfs2_rindex)];
int error;
struct gfs2_rgrpd *rgd;

error = gfs2_internal_read(ip, ra_state, buf, &pos,
sizeof(struct gfs2_rindex));
if (!error)
return 0;
if (error != sizeof(struct gfs2_rindex)) {
if (error > 0)
error = -EIO;
return error;
}

rgd = kzalloc(sizeof(struct gfs2_rgrpd), GFP_NOFS);
error = -ENOMEM;
if (!rgd)
return error;

mutex_init(&rgd->rd_mutex);
lops_init_le(&rgd->rd_le, &gfs2_rg_lops);
rgd->rd_sbd = sdp;

list_add_tail(&rgd->rd_list, &sdp->sd_rindex_list);
list_add_tail(&rgd->rd_list_mru, &sdp->sd_rindex_mru_list);

gfs2_rindex_in(&rgd->rd_ri, buf);
error = compute_bitstructs(rgd);
if (error)
return error;

error = gfs2_glock_get(sdp, rgd->rd_ri.ri_addr,
&gfs2_rgrp_glops, CREATE, &rgd->rd_gl);
if (error)
return error;

rgd->rd_gl->gl_object = rgd;
rgd->rd_rg_vn = rgd->rd_gl->gl_vn - 1;
return error;
}

/**
* gfs2_ri_update - Pull in a new resource index from the disk
* @ip: pointer to the rindex inode
*
* Returns: 0 on successful update, error code otherwise
*/

static int gfs2_ri_update(struct gfs2_inode *ip)
{
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
struct inode *inode = &ip->i_inode;
struct gfs2_rgrpd *rgd;
char buf[sizeof(struct gfs2_rindex)];
struct file_ra_state ra_state;
u64 junk = ip->i_di.di_size;
int error;

/* If someone is holding the rindex file with a glock, they must
be updating it, in which case we may have partial entries.
In this case, we ignore the partials. */
if (!gfs2_glock_is_held_excl(ip->i_gl) &&
!gfs2_glock_is_held_shrd(ip->i_gl) &&
do_div(junk, sizeof(struct gfs2_rindex))) {
if (do_div(junk, sizeof(struct gfs2_rindex))) {
gfs2_consist_inode(ip);
return -EIO;
}
Expand All @@ -493,52 +539,49 @@ static int gfs2_ri_update(struct gfs2_inode *ip)

file_ra_state_init(&ra_state, inode->i_mapping);
for (sdp->sd_rgrps = 0;; sdp->sd_rgrps++) {
loff_t pos = sdp->sd_rgrps * sizeof(struct gfs2_rindex);

if (pos + sizeof(struct gfs2_rindex) >= ip->i_di.di_size)
break;
error = gfs2_internal_read(ip, &ra_state, buf, &pos,
sizeof(struct gfs2_rindex));
if (!error)
break;
if (error != sizeof(struct gfs2_rindex)) {
if (error > 0)
error = -EIO;
goto fail;
error = read_rindex_entry(ip, &ra_state);
if (error) {
clear_rgrpdi(sdp);
return error;
}
}

rgd = kzalloc(sizeof(struct gfs2_rgrpd), GFP_NOFS);
error = -ENOMEM;
if (!rgd)
goto fail;

mutex_init(&rgd->rd_mutex);
lops_init_le(&rgd->rd_le, &gfs2_rg_lops);
rgd->rd_sbd = sdp;

list_add_tail(&rgd->rd_list, &sdp->sd_rindex_list);
list_add_tail(&rgd->rd_list_mru, &sdp->sd_rindex_mru_list);

gfs2_rindex_in(&rgd->rd_ri, buf);
error = compute_bitstructs(rgd);
if (error)
goto fail;
sdp->sd_rindex_vn = ip->i_gl->gl_vn;
return 0;
}

error = gfs2_glock_get(sdp, rgd->rd_ri.ri_addr,
&gfs2_rgrp_glops, CREATE, &rgd->rd_gl);
if (error)
goto fail;
/**
* 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;
int error;

rgd->rd_gl->gl_object = rgd;
rgd->rd_rg_vn = rgd->rd_gl->gl_vn - 1;
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) >
ip->i_di.di_size)
break;
error = read_rindex_entry(ip, &ra_state);
if (error) {
clear_rgrpdi(sdp);
return error;
}
}

sdp->sd_rindex_vn = ip->i_gl->gl_vn;
return 0;

fail:
clear_rgrpdi(sdp);
return error;
}

/**
Expand Down Expand Up @@ -1028,7 +1071,7 @@ int gfs2_inplace_reserve_i(struct gfs2_inode *ip, char *file, unsigned int line)
if (ip != GFS2_I(sdp->sd_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(ip);
error = gfs2_ri_update_special(ip);

if (error)
return error;
Expand Down

0 comments on commit 3aaa3d6

Please sign in to comment.