[Cluster-devel] [PATCH] GFS2: kernel changes to support new gfs2_grow command (Try 3)
David Teigland
teigland at redhat.com
Fri May 4 19:37:14 UTC 2007
On Wed, May 02, 2007 at 08:57:08PM -0500, Robert Peterson wrote:
> * gfs2_ri_update - Pull in a new resource index from the disk
> * @gl: The glock covering the rindex inode
> *
> @@ -447,7 +479,12 @@ static int gfs2_ri_update(struct gfs2_inode *ip)
> u64 junk = ip->i_di.di_size;
> int error;
>
> - if (do_div(junk, sizeof(struct gfs2_rindex))) {
> + /* 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))) {
> gfs2_consist_inode(ip);
> return -EIO;
> }
So the use of glock_is_held _is_ part of an assertion, not part of an
algorithm which I was worried about before. We should only ever get to
this spot with a shared glock, right? (rindex_hold takes it). So a plain
old assertion that the glock is shared at the beginning would be ok, but
this particular check doesn't make sense to me.
> @@ -457,6 +494,9 @@ 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;
Why is this needed now if it wasn't before?
> error = gfs2_internal_read(ip, &ra_state, buf, &pos,
> sizeof(struct gfs2_rindex));
> if (!error)
Dave
More information about the Cluster-devel
mailing list