[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