From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Teigland Date: Fri, 4 May 2007 14:37:14 -0500 Subject: [Cluster-devel] [PATCH] GFS2: kernel changes to support new gfs2_grow command (Try 3) In-Reply-To: <46394174.2030709@redhat.com> References: <46394174.2030709@redhat.com> Message-ID: <20070504193714.GB13775@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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