cluster-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
From: Steven Whitehouse <swhiteho@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [gfs2-utils PATCH 24/47] fsck.gfs2: Rework the "undo" functions
Date: Thu, 16 May 2013 14:27:34 +0100	[thread overview]
Message-ID: <1368710854.2680.28.camel@menhir> (raw)
In-Reply-To: <143016273297ab30fb85274ea801de7df7fd8726.1368548305.git.rpeterso@redhat.com>

Hi,

This sounds to me like we are doing things in the wrong order. We
shouldn't need to undo things that have been done, otherwise we'll just
land up in a tangle,

Steve.

On Tue, 2013-05-14 at 11:21 -0500, Bob Peterson wrote:
> In pass1, it traverses the metadata free, processing each dinode and
> marking which blocks are used by that dinode. If a dinode is found
> to have unrecoverable errors, it does a bunch of work to "undo" the
> things it did. This is especially important for the processing of
> duplicate block references. Suppose dinode X references block 1234.
> Later in pass1, suppose a different dinode, Y, also references block
> 1234. This is flagged as a duplicate block reference. Still later,
> suppose pass1 determines dinode Y is bad. Now it has to undo the
> work it did. It needs to properly unmark the data and metadata
> blocks it marked as no longer "free" so that valid references that
> follow aren't flagged as duplicate references. At the same time,
> it needs to unflag block 1234 as a duplicate reference as well, so
> that dinode X's original reference is still considered valid.
> 
> Before this patch, fsck.gfs2 was trying to traverse the entire
> metadata tree for the bad dinode, trying to "undo" the designations.
> That becomes a huge problem if the damage was discovered in the
> middle of the metadata, in which case it may never have flagged any
> of the data blocks as "in use as data" in its blockmap. The result
> of "undoing" the designations sometimes resulted in blocks improperly
> being marked as "free" when they were, in fact, referenced by other
> valid dinodes.
> 
> For example, suppose corrupt dinode Y references metadata blocks
> 1234, 1235, and 1236. Now suppose a serious problem is found as part
> of its processing of block 1234, and so it stopped its metadata tree
> traversal there. Metadata blocks 1235 and 1236 are still listed as
> metadata for the bad dinode, but if we traverse the entire tree,
> those two blocks may be improperly processed. If another dinode
> actually uses blocks 1235 or 1236, the improper "undo" processing
> of those two blocks can screw up the valid references.
> 
> This patch reworks the "undo" functions so that the "undo" functions
> don't get called on the entire metadata and data of the defective
> dinode. Instead, only the metadata and data blocks queued onto the
> metadata list are processed. This should ensure that the "undo"
> functions only operate on blocks that were processed in the first
> place.
> 
> rhbz#902920
> ---
>  gfs2/fsck/metawalk.c | 109 ++++++++++++++++++++++----------
>  gfs2/fsck/metawalk.h |   4 ++
>  gfs2/fsck/pass1.c    | 172 ++++++++++++++++-----------------------------------
>  3 files changed, 135 insertions(+), 150 deletions(-)
> 
> diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c
> index d1b12f1..b9d9f89 100644
> --- a/gfs2/fsck/metawalk.c
> +++ b/gfs2/fsck/metawalk.c
> @@ -1259,7 +1259,7 @@ static int build_and_check_metalist(struct gfs2_inode *ip, osi_list_t *mlp,
>  				if (err < 0) {
>  					stack;
>  					error = err;
> -					goto fail;
> +					return error;
>  				}
>  				if (err > 0) {
>  					if (!error)
> @@ -1278,14 +1278,11 @@ static int build_and_check_metalist(struct gfs2_inode *ip, osi_list_t *mlp,
>  				}
>  				if (!nbh)
>  					nbh = bread(ip->i_sbd, block);
> -				osi_list_add(&nbh->b_altlist, cur_list);
> +				osi_list_add_prev(&nbh->b_altlist, cur_list);
>  			} /* for all data on the indirect block */
>  		} /* for blocks at that height */
>  	} /* for height */
> -	return error;
> -fail:
> -	free_metalist(ip, mlp);
> -	return error;
> +	return 0;
>  }
>  
>  /**
> @@ -1331,6 +1328,27 @@ static int check_data(struct gfs2_inode *ip, struct metawalk_fxns *pass,
>  	return error;
>  }
>  
> +static int undo_check_data(struct gfs2_inode *ip, struct metawalk_fxns *pass,
> +			   uint64_t *ptr_start, char *ptr_end)
> +{
> +	int rc = 0;
> +	uint64_t block, *ptr;
> +
> +	/* If there isn't much pointer corruption check the pointers */
> +	for (ptr = ptr_start ; (char *)ptr < ptr_end && !fsck_abort; ptr++) {
> +		if (!*ptr)
> +			continue;
> +
> +		if (skip_this_pass || fsck_abort)
> +			return 1;
> +		block =  be64_to_cpu(*ptr);
> +		rc = pass->undo_check_data(ip, block, pass->private);
> +		if (rc < 0)
> +			return rc;
> +	}
> +	return 0;
> +}
> +
>  static int hdr_size(struct gfs2_buffer_head *bh, int height)
>  {
>  	if (height > 1) {
> @@ -1363,6 +1381,7 @@ int check_metatree(struct gfs2_inode *ip, struct metawalk_fxns *pass)
>  	int  i, head_size;
>  	uint64_t blks_checked = 0;
>  	int error, rc;
> +	int metadata_clean = 0;
>  
>  	if (!height && !is_dir(&ip->i_di, ip->i_sbd->gfs1))
>  		return 0;
> @@ -1374,35 +1393,21 @@ int check_metatree(struct gfs2_inode *ip, struct metawalk_fxns *pass)
>  	error = build_and_check_metalist(ip, &metalist[0], pass);
>  	if (error) {
>  		stack;
> -		free_metalist(ip, &metalist[0]);
> -		return error;
> +		goto undo_metalist;
>  	}
>  
> +	metadata_clean = 1;
>  	/* For directories, we've already checked the "data" blocks which
>  	 * comprise the directory hash table, so we perform the directory
>  	 * checks and exit. */
>          if (is_dir(&ip->i_di, ip->i_sbd->gfs1)) {
> -		free_metalist(ip, &metalist[0]);
>  		if (!(ip->i_di.di_flags & GFS2_DIF_EXHASH))
> -			return 0;
> +			goto out;
>  		/* check validity of leaf blocks and leaf chains */
>  		error = check_leaf_blks(ip, pass);
> -		return error;
> -	}
> -
> -	/* Free the metalist buffers from heights we don't need to check.
> -	   For the rest we'll free as we check them to save time.
> -	   metalist[0] will only have the dinode bh, so we can skip it. */
> -	for (i = 1; i < height - 1; i++) {
> -		list = &metalist[i];
> -		while (!osi_list_empty(list)) {
> -			bh = osi_list_entry(list->next,
> -					    struct gfs2_buffer_head, b_altlist);
> -			if (bh == ip->i_bh)
> -				osi_list_del(&bh->b_altlist);
> -			else
> -				brelse(bh);
> -		}
> +		if (error)
> +			goto undo_metalist;
> +		goto out;
>  	}
>  
>  	/* check data blocks */
> @@ -1435,14 +1440,12 @@ int check_metatree(struct gfs2_inode *ip, struct metawalk_fxns *pass)
>  		else
>  			rc = 0;
>  
> -		if (rc && (!error || rc < 0))
> +		if (rc && (!error || rc < 0)) {
>  			error = rc;
> +			break;
> +		}
>  		if (pass->big_file_msg && ip->i_di.di_blocks > COMFORTABLE_BLKS)
>  			pass->big_file_msg(ip, blks_checked);
> -		if (bh == ip->i_bh)
> -			osi_list_del(&bh->b_altlist);
> -		else
> -			brelse(bh);
>  	}
>  	if (pass->big_file_msg && ip->i_di.di_blocks > COMFORTABLE_BLKS) {
>  		log_notice( _("\rLarge file at %lld (0x%llx) - 100 percent "
> @@ -1452,6 +1455,50 @@ int check_metatree(struct gfs2_inode *ip, struct metawalk_fxns *pass)
>  			    (unsigned long long)ip->i_di.di_num.no_addr);
>  		fflush(stdout);
>  	}
> +undo_metalist:
> +	if (!error)
> +		goto out;
> +	log_err( _("Error: inode %llu (0x%llx) had unrecoverable errors.\n"),
> +		 (unsigned long long)ip->i_di.di_num.no_addr,
> +		 (unsigned long long)ip->i_di.di_num.no_addr);
> +	if (!query( _("Remove the invalid inode? (y/n) "))) {
> +		free_metalist(ip, &metalist[0]);
> +		log_err(_("Invalid inode not deleted.\n"));
> +		return error;
> +	}
> +	for (i = 0; pass->undo_check_meta && i < height; i++) {
> +		while (!osi_list_empty(&metalist[i])) {
> +			list = &metalist[i];
> +			bh = osi_list_entry(list->next,
> +					    struct gfs2_buffer_head,
> +					    b_altlist);
> +			log_err(_("Undoing metadata work for block %llu "
> +				  "(0x%llx)\n"),
> +				(unsigned long long)bh->b_blocknr,
> +				(unsigned long long)bh->b_blocknr);
> +			if (i)
> +				rc = pass->undo_check_meta(ip, bh->b_blocknr,
> +							   i, pass->private);
> +			else
> +				rc = 0;
> +			if (metadata_clean && rc == 0 && i == height - 1) {
> +				head_size = hdr_size(bh, height);
> +				if (head_size)
> +					undo_check_data(ip, pass, (uint64_t *)
> +					      (bh->b_data + head_size),
> +					      (bh->b_data + ip->i_sbd->bsize));
> +			}
> +			if (bh == ip->i_bh)
> +				osi_list_del(&bh->b_altlist);
> +			else
> +				brelse(bh);
> +		}
> +	}
> +	/* Set the dinode as "bad" so it gets deleted */
> +	fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
> +			  _("corrupt"), gfs2_block_free);
> +	log_err(_("The corrupt inode was invalidated.\n"));
> +out:
>  	free_metalist(ip, &metalist[0]);
>  	return error;
>  }
> diff --git a/gfs2/fsck/metawalk.h b/gfs2/fsck/metawalk.h
> index 486c6eb..f5e71e1 100644
> --- a/gfs2/fsck/metawalk.h
> +++ b/gfs2/fsck/metawalk.h
> @@ -108,6 +108,10 @@ struct metawalk_fxns {
>  	int (*repair_leaf) (struct gfs2_inode *ip, uint64_t *leaf_no,
>  			    int lindex, int ref_count, const char *msg,
>  			    void *private);
> +	int (*undo_check_meta) (struct gfs2_inode *ip, uint64_t block,
> +				int h, void *private);
> +	int (*undo_check_data) (struct gfs2_inode *ip, uint64_t block,
> +				void *private);
>  };
>  
>  #endif /* _METAWALK_H */
> diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c
> index 04e5289..a88895f 100644
> --- a/gfs2/fsck/pass1.c
> +++ b/gfs2/fsck/pass1.c
> @@ -39,8 +39,7 @@ static int check_leaf(struct gfs2_inode *ip, uint64_t block, void *private);
>  static int check_metalist(struct gfs2_inode *ip, uint64_t block,
>  			  struct gfs2_buffer_head **bh, int h, void *private);
>  static int undo_check_metalist(struct gfs2_inode *ip, uint64_t block,
> -			       struct gfs2_buffer_head **bh, int h,
> -			       void *private);
> +			       int h, void *private);
>  static int check_data(struct gfs2_inode *ip, uint64_t block, void *private);
>  static int undo_check_data(struct gfs2_inode *ip, uint64_t block,
>  			   void *private);
> @@ -104,12 +103,8 @@ struct metawalk_fxns pass1_fxns = {
>  	.finish_eattr_indir = finish_eattr_indir,
>  	.big_file_msg = big_file_comfort,
>  	.repair_leaf = pass1_repair_leaf,
> -};
> -
> -struct metawalk_fxns undo_fxns = {
> -	.private = NULL,
> -	.check_metalist = undo_check_metalist,
> -	.check_data = undo_check_data,
> +	.undo_check_meta = undo_check_metalist,
> +	.undo_check_data = undo_check_data,
>  };
>  
>  struct metawalk_fxns invalidate_fxns = {
> @@ -326,53 +321,67 @@ static int check_metalist(struct gfs2_inode *ip, uint64_t block,
>  	return 0;
>  }
>  
> -static int undo_check_metalist(struct gfs2_inode *ip, uint64_t block,
> -			       struct gfs2_buffer_head **bh, int h,
> -			       void *private)
> +/* undo_reference - undo previously processed data or metadata
> + * We've treated the metadata for this dinode as good so far, but not we
> + * realize it's bad. So we need to undo what we've done.
> + *
> + * Returns: 0 - We need to process the block as metadata. In other words,
> + *              we need to undo any blocks it refers to.
> + *          1 - We can't process the block as metadata.
> + */
> +
> +static int undo_reference(struct gfs2_inode *ip, uint64_t block, int meta,
> +			  void *private)
>  {
> -	int found_dup = 0, iblk_type;
> -	struct gfs2_buffer_head *nbh;
>  	struct block_count *bc = (struct block_count *)private;
> -
> -	*bh = NULL;
> +	struct duptree *dt;
> +	struct inode_with_dups *id;
>  
>  	if (!valid_block(ip->i_sbd, block)) { /* blk outside of FS */
>  		fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
>  				  _("bad block referencing"), gfs2_block_free);
>  		return 1;
>  	}
> -	if (is_dir(&ip->i_di, ip->i_sbd->gfs1) && h == ip->i_di.di_height)
> -		iblk_type = GFS2_METATYPE_JD;
> -	else
> -		iblk_type = GFS2_METATYPE_IN;
>  
> -	found_dup = find_remove_dup(ip, block, _("Metadata"));
> -	nbh = bread(ip->i_sbd, block);
> +	if (meta)
> +		bc->indir_count--;
> +	dt = dupfind(block);
> +	if (dt) {
> +		/* remove all duplicate reference structures from this inode */
> +		do {
> +			id = find_dup_ref_inode(dt, ip);
> +			if (!id)
> +				break;
>  
> -	if (gfs2_check_meta(nbh, iblk_type)) {
> -		if (!found_dup) {
> -			fsck_blockmap_set(ip, block, _("bad indirect"),
> -					  gfs2_block_free);
> -			brelse(nbh);
> +			dup_listent_delete(id);
> +		} while (id);
> +
> +		if (dt->refs) {
> +			log_err(_("Block %llu (0x%llx) is still referenced "
> +				  "from another inode; not freeing.\n"),
> +				(unsigned long long)block,
> +				(unsigned long long)block);
>  			return 1;
>  		}
> -		brelse(nbh);
> -		nbh = NULL;
> -	} else /* blk check ok */
> -		*bh = nbh;
> -
> -	bc->indir_count--;
> -	if (found_dup) {
> -		if (nbh)
> -			brelse(nbh);
> -		*bh = NULL;
> -		return 1; /* don't process the metadata again */
> -	} else
> -		fsck_blockmap_set(ip, block, _("bad indirect"),
> -				  gfs2_block_free);
> +	}
> +	fsck_blockmap_set(ip, block,
> +			  meta ? _("bad indirect") : _("referenced data"),
> +			  gfs2_block_free);
>  	return 0;
>  }
>  
> +static int undo_check_metalist(struct gfs2_inode *ip, uint64_t block,
> +			       int h, void *private)
> +{
> +	return undo_reference(ip, block, 1, private);
> +}
> +
> +static int undo_check_data(struct gfs2_inode *ip, uint64_t block,
> +			   void *private)
> +{
> +	return undo_reference(ip, block, 0, private);
> +}
> +
>  static int check_data(struct gfs2_inode *ip, uint64_t block, void *private)
>  {
>  	uint8_t q;
> @@ -438,71 +447,9 @@ static int check_data(struct gfs2_inode *ip, uint64_t block, void *private)
>  	return 0;
>  }
>  
> -static int undo_check_data(struct gfs2_inode *ip, uint64_t block,
> -			   void *private)
> -{
> -	struct block_count *bc = (struct block_count *) private;
> -
> -	if (!valid_block(ip->i_sbd, block)) {
> -		/* Mark the owner of this block with the bad_block
> -		 * designator so we know to check it for out of range
> -		 * blocks later */
> -		fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
> -				  _("bad (invalid or out of range) data"),
> -				  gfs2_block_free);
> -		return 1;
> -	}
> -	bc->data_count--;
> -	return free_block_if_notdup(ip, block, _("data"));
> -}
> -
>  static int remove_inode_eattr(struct gfs2_inode *ip, struct block_count *bc)
>  {
> -	struct duptree *dt;
> -	struct inode_with_dups *id;
> -	osi_list_t *ref;
> -	int moved = 0;
> -
> -	/* If it's a duplicate reference to the block, we need to check
> -	   if the reference is on the valid or invalid inodes list.
> -	   If it's on the valid inode's list, move it to the invalid
> -	   inodes list.  The reason is simple: This inode, although
> -	   valid, has an now-invalid reference, so we should not give
> -	   this reference preferential treatment over others. */
> -	dt = dupfind(ip->i_di.di_eattr);
> -	if (dt) {
> -		osi_list_foreach(ref, &dt->ref_inode_list) {
> -			id = osi_list_entry(ref, struct inode_with_dups, list);
> -			if (id->block_no == ip->i_di.di_num.no_addr) {
> -				log_debug( _("Moving inode %lld (0x%llx)'s "
> -					     "duplicate reference to %lld "
> -					     "(0x%llx) from the valid to the "
> -					     "invalid reference list.\n"),
> -					   (unsigned long long)
> -					   ip->i_di.di_num.no_addr,
> -					   (unsigned long long)
> -					   ip->i_di.di_num.no_addr,
> -					   (unsigned long long)
> -					   ip->i_di.di_eattr,
> -					   (unsigned long long)
> -					   ip->i_di.di_eattr);
> -				/* Move from the normal to the invalid list */
> -				osi_list_del(&id->list);
> -				osi_list_add_prev(&id->list,
> -						  &dt->ref_invinode_list);
> -				moved = 1;
> -				break;
> -			}
> -		}
> -		if (!moved)
> -			log_debug( _("Duplicate reference to %lld "
> -				     "(0x%llx) not moved.\n"),
> -				   (unsigned long long)ip->i_di.di_eattr,
> -				   (unsigned long long)ip->i_di.di_eattr);
> -	} else {
> -		delete_block(ip, ip->i_di.di_eattr, NULL,
> -			     "extended attribute", NULL);
> -	}
> +	undo_reference(ip, ip->i_di.di_eattr, 0, bc);
>  	ip->i_di.di_eattr = 0;
>  	bc->ea_count = 0;
>  	ip->i_di.di_blocks = 1 + bc->indir_count + bc->data_count;
> @@ -1080,23 +1027,10 @@ static int handle_ip(struct gfs2_sbd *sdp, struct gfs2_inode *ip)
>  	if (lf_dip && lf_dip->i_di.di_blocks != lf_blks)
>  		reprocess_inode(lf_dip, "lost+found");
>  
> -	if (fsck_abort || error < 0)
> +	/* We there was an error, we return 0 because we want fsck to continue
> +	   and analyze the other dinodes as well. */
> +	if (fsck_abort || error != 0)
>  		return 0;
> -	if (error > 0) {
> -		log_err( _("Error: inode %llu (0x%llx) has unrecoverable "
> -			   "errors; invalidating.\n"),
> -			 (unsigned long long)ip->i_di.di_num.no_addr,
> -			 (unsigned long long)ip->i_di.di_num.no_addr);
> -		undo_fxns.private = &bc;
> -		check_metatree(ip, &undo_fxns);
> -		/* If we undo the metadata accounting, including metadatas
> -		   duplicate block status, we need to make sure later passes
> -		   don't try to free up the metadata referenced by this inode.
> -		   Therefore we mark the inode as free space. */
> -		fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
> -				  _("corrupt"), gfs2_block_free);
> -		return 0;
> -	}
>  
>  	error = check_inode_eattr(ip, &pass1_fxns);
>  




  reply	other threads:[~2013-05-16 13:27 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-14 16:21 [Cluster-devel] [gfs2-utils PATCH 01/47] libgfs2: externalize dir_split_leaf Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 02/47] libgfs2: allow dir_split_leaf to receive a leaf buffer Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 03/47] libgfs2: let dir_split_leaf receive a "broken" lindex Bob Peterson
2013-05-15 16:01   ` Steven Whitehouse
2013-05-20 16:02     ` Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 04/47] fsck.gfs2: Move function find_free_blk to util.c Bob Peterson
2013-05-15 16:04   ` Steven Whitehouse
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 05/47] fsck.gfs2: Split out function to make sure lost+found exists Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 06/47] fsck.gfs2: Check for formal inode mismatch when adding to lost+found Bob Peterson
2013-05-15 16:08   ` Steven Whitehouse
2013-05-17 12:47     ` Bob Peterson
2013-05-17 12:55       ` Steven Whitehouse
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 07/47] fsck.gfs2: shorten some debug messages in lost+found Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 08/47] fsck.gfs2: Move basic directory entry checks to separate function Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 09/47] fsck.gfs2: Add formal inode check to basic dirent checks Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 10/47] fsck.gfs2: Add new function to check dir hash tables Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 11/47] fsck.gfs2: Special case '..' when processing bad formal inode number Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 12/47] fsck.gfs2: Move function to read directory hash table to util.c Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 13/47] fsck.gfs2: Misc cleanups Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 14/47] fsck.gfs2: Verify dirent hash values correspond to proper leaf block Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 15/47] fsck.gfs2: re-read hash table if directory height or depth changes Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 16/47] fsck.gfs2: fix leaf blocks, don't try to patch the hash table Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 17/47] fsck.gfs2: check leaf depth when validating leaf blocks Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 18/47] fsck.gfs2: small cleanups Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 19/47] fsck.gfs2: reprocess inodes when blocks are added Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 20/47] fsck.gfs2: Remove redundant leaf depth check Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 21/47] fsck.gfs2: link dinodes that only have extended attribute problems Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 22/47] fsck.gfs2: Add clarifying message to duplicate processing Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 23/47] fsck.gfs2: separate function to calculate metadata block header size Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 24/47] fsck.gfs2: Rework the "undo" functions Bob Peterson
2013-05-16 13:27   ` Steven Whitehouse [this message]
2013-05-16 13:49     ` Bob Peterson
2013-05-16 14:02       ` Steven Whitehouse
2013-05-16 15:02         ` Bob Peterson
2013-05-16 15:24           ` Steven Whitehouse
2013-05-20 13:08             ` Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 25/47] fsck.gfs2: Check for interrupt when resolving duplicates Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 26/47] fsck.gfs2: Consistent naming of struct duptree variables Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 27/47] fsck.gfs2: Keep proper counts when duplicates are found Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 28/47] fsck.gfs2: print metadata block reference on data errors Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 29/47] fsck.gfs2: print block count values when fixing them Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 30/47] fsck.gfs2: Do not invalidate metablocks of dinodes with invalid mode Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 31/47] fsck.gfs2: Log when unrecoverable data block errors are encountered Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 32/47] fsck.gfs2: don't remove buffers from the list when errors are found Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 33/47] fsck.gfs2: Don't flag GFS1 non-dinode blocks as duplicates Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 34/47] fsck.gfs2: externalize check_leaf Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 35/47] fsck.gfs2: pass2: check leaf blocks when fixing hash table Bob Peterson
2013-05-14 16:21 ` [Cluster-devel] [gfs2-utils PATCH 36/47] fsck.gfs2: standardize check_metatree return codes Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 37/47] fsck.gfs2: don't invalidate files with duplicate data block refs Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 38/47] fsck.gfs2: check for duplicate first references Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 39/47] fsck.gfs2: When flagging a duplicate reference, show valid or invalid Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 40/47] fsck.gfs2: major duplicate reference reform Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 41/47] fsck.gfs2: Remove all bad eattr blocks Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 42/47] fsck.gfs2: Remove unused variable Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 43/47] fsck.gfs2: double-check transitions from dinode to data Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 44/47] fsck.gfs2: Stop "undo" process when error data block is reached Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 45/47] fsck.gfs2: Don't allocate leaf blocks in pass1 Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 46/47] fsck.gfs2: take hash table start boundaries into account Bob Peterson
2013-05-14 16:22 ` [Cluster-devel] [gfs2-utils PATCH 47/47] fsck.gfs2: delete all duplicates from unrecoverable damaged dinodes Bob Peterson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1368710854.2680.28.camel@menhir \
    --to=swhiteho@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).