cluster-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
* [Cluster-devel] [GFS2 PATCH] gfs2: move function foreach_leaf to gfs2_dir_exhash_dealloc
@ 2011-03-22 17:56 Bob Peterson
  2011-03-23  9:38 ` Steven Whitehouse
  0 siblings, 1 reply; 2+ messages in thread
From: Bob Peterson @ 2011-03-22 17:56 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Hi,

gfs2: move function foreach_leaf to gfs2_dir_exhash_dealloc

The previous patches made function gfs2_dir_exhash_dealloc do nothing
but call function foreach_leaf.  This patch simplifies the code by
moving the entire function foreach_leaf into gfs2_dir_exhash_dealloc.

Regards,

Bob Peterson
Red Hat File Systems

Signed-off-by: Bob Peterson <rpeterso@redhat.com> 
--
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
index 4a925a7..13e7faa 100644
--- a/fs/gfs2/dir.c
+++ b/fs/gfs2/dir.c
@@ -85,10 +85,6 @@ struct qstr gfs2_qdotdot __read_mostly;
 typedef int (*gfs2_dscan_t)(const struct gfs2_dirent *dent,
 			    const struct qstr *name, void *opaque);
 
-static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len,
-			u64 leaf_no, struct buffer_head *leaf_bh,
-			int last_dealloc);
-
 int gfs2_dir_get_new_buffer(struct gfs2_inode *ip, u64 block,
 			    struct buffer_head **bhp)
 {
@@ -1769,81 +1765,6 @@ int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
 }
 
 /**
- * foreach_leaf - call a function for each leaf in a directory
- * @dip: the directory
- *
- * Returns: errno
- */
-
-static int foreach_leaf(struct gfs2_inode *dip)
-{
-	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
-	struct buffer_head *bh;
-	struct gfs2_leaf *leaf;
-	u32 hsize, len;
-	u32 ht_offset, lp_offset, ht_offset_cur = -1;
-	u32 index = 0, next_index;
-	__be64 *lp;
-	u64 leaf_no;
-	int error = 0, last;
-
-	hsize = 1 << dip->i_depth;
-	if (hsize * sizeof(u64) != i_size_read(&dip->i_inode)) {
-		gfs2_consist_inode(dip);
-		return -EIO;
-	}
-
-	lp = kmalloc(sdp->sd_hash_bsize, GFP_NOFS);
-	if (!lp)
-		return -ENOMEM;
-
-	while (index < hsize) {
-		lp_offset = index & (sdp->sd_hash_ptrs - 1);
-		ht_offset = index - lp_offset;
-
-		if (ht_offset_cur != ht_offset) {
-			error = gfs2_dir_read_data(dip, (char *)lp,
-						ht_offset * sizeof(__be64),
-						sdp->sd_hash_bsize, 1);
-			if (error != sdp->sd_hash_bsize) {
-				if (error >= 0)
-					error = -EIO;
-				goto out;
-			}
-			ht_offset_cur = ht_offset;
-		}
-
-		leaf_no = be64_to_cpu(lp[lp_offset]);
-		if (leaf_no) {
-			error = get_leaf(dip, leaf_no, &bh);
-			if (error)
-				goto out;
-			leaf = (struct gfs2_leaf *)bh->b_data;
-			len = 1 << (dip->i_depth - be16_to_cpu(leaf->lf_depth));
-			next_index = (index & ~(len - 1)) + len;
-			last = ((next_index >= hsize) ? 1 : 0);
-			error = leaf_dealloc(dip, index, len, leaf_no, bh,
-					     last);
-			brelse(bh);
-			if (error)
-				goto out;
-			index = next_index;
-		} else
-			index++;
-	}
-
-	if (index != hsize) {
-		gfs2_consist_inode(dip);
-		error = -EIO;
-	}
-
-out:
-	kfree(lp);
-
-	return error;
-}
-
-/**
  * leaf_dealloc - Deallocate a directory leaf
  * @dip: the directory
  * @index: the hash table offset in the directory
@@ -1988,8 +1909,71 @@ out:
 
 int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip)
 {
-	/* Dealloc on-disk leaves to FREEMETA state */
-	return foreach_leaf(dip);
+	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
+	struct buffer_head *bh;
+	struct gfs2_leaf *leaf;
+	u32 hsize, len;
+	u32 ht_offset, lp_offset, ht_offset_cur = -1;
+	u32 index = 0, next_index;
+	__be64 *lp;
+	u64 leaf_no;
+	int error = 0, last;
+
+	hsize = 1 << dip->i_depth;
+	if (hsize * sizeof(u64) != i_size_read(&dip->i_inode)) {
+		gfs2_consist_inode(dip);
+		return -EIO;
+	}
+
+	lp = kmalloc(sdp->sd_hash_bsize, GFP_NOFS);
+	if (!lp)
+		return -ENOMEM;
+
+	while (index < hsize) {
+		lp_offset = index & (sdp->sd_hash_ptrs - 1);
+		ht_offset = index - lp_offset;
+
+		if (ht_offset_cur != ht_offset) {
+			error = gfs2_dir_read_data(dip, (char *)lp,
+						ht_offset * sizeof(__be64),
+						sdp->sd_hash_bsize, 1);
+			if (error != sdp->sd_hash_bsize) {
+				if (error >= 0)
+					error = -EIO;
+				goto out;
+			}
+			ht_offset_cur = ht_offset;
+		}
+
+		leaf_no = be64_to_cpu(lp[lp_offset]);
+		if (leaf_no) {
+			error = get_leaf(dip, leaf_no, &bh);
+			if (error)
+				goto out;
+			leaf = (struct gfs2_leaf *)bh->b_data;
+			len = 1 << (dip->i_depth - be16_to_cpu(leaf->lf_depth));
+
+			next_index = (index & ~(len - 1)) + len;
+			last = ((next_index >= hsize) ? 1 : 0);
+			error = leaf_dealloc(dip, index, len, leaf_no, bh,
+					     last);
+			brelse(bh);
+			if (error)
+				goto out;
+			index = next_index;
+		} else
+			index++;
+	}
+
+	if (index != hsize) {
+		gfs2_consist_inode(dip);
+		error = -EIO;
+	}
+
+out:
+	kfree(lp);
+
+	return error;
 }
 
 /**



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [Cluster-devel] [GFS2 PATCH] gfs2: move function foreach_leaf to gfs2_dir_exhash_dealloc
  2011-03-22 17:56 [Cluster-devel] [GFS2 PATCH] gfs2: move function foreach_leaf to gfs2_dir_exhash_dealloc Bob Peterson
@ 2011-03-23  9:38 ` Steven Whitehouse
  0 siblings, 0 replies; 2+ messages in thread
From: Steven Whitehouse @ 2011-03-23  9:38 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Hi,

Ah, I see. I should have read this patch before replying to the
first :-) This patch set looks very good. I'll push them into -nmw just
as soon as -rc1 is out,

Steve.

On Tue, 2011-03-22 at 13:56 -0400, Bob Peterson wrote:
> Hi,
> 
> gfs2: move function foreach_leaf to gfs2_dir_exhash_dealloc
> 
> The previous patches made function gfs2_dir_exhash_dealloc do nothing
> but call function foreach_leaf.  This patch simplifies the code by
> moving the entire function foreach_leaf into gfs2_dir_exhash_dealloc.
> 
> Regards,
> 
> Bob Peterson
> Red Hat File Systems
> 
> Signed-off-by: Bob Peterson <rpeterso@redhat.com> 
> --
> diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
> index 4a925a7..13e7faa 100644
> --- a/fs/gfs2/dir.c
> +++ b/fs/gfs2/dir.c
> @@ -85,10 +85,6 @@ struct qstr gfs2_qdotdot __read_mostly;
>  typedef int (*gfs2_dscan_t)(const struct gfs2_dirent *dent,
>  			    const struct qstr *name, void *opaque);
>  
> -static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len,
> -			u64 leaf_no, struct buffer_head *leaf_bh,
> -			int last_dealloc);
> -
>  int gfs2_dir_get_new_buffer(struct gfs2_inode *ip, u64 block,
>  			    struct buffer_head **bhp)
>  {
> @@ -1769,81 +1765,6 @@ int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
>  }
>  
>  /**
> - * foreach_leaf - call a function for each leaf in a directory
> - * @dip: the directory
> - *
> - * Returns: errno
> - */
> -
> -static int foreach_leaf(struct gfs2_inode *dip)
> -{
> -	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
> -	struct buffer_head *bh;
> -	struct gfs2_leaf *leaf;
> -	u32 hsize, len;
> -	u32 ht_offset, lp_offset, ht_offset_cur = -1;
> -	u32 index = 0, next_index;
> -	__be64 *lp;
> -	u64 leaf_no;
> -	int error = 0, last;
> -
> -	hsize = 1 << dip->i_depth;
> -	if (hsize * sizeof(u64) != i_size_read(&dip->i_inode)) {
> -		gfs2_consist_inode(dip);
> -		return -EIO;
> -	}
> -
> -	lp = kmalloc(sdp->sd_hash_bsize, GFP_NOFS);
> -	if (!lp)
> -		return -ENOMEM;
> -
> -	while (index < hsize) {
> -		lp_offset = index & (sdp->sd_hash_ptrs - 1);
> -		ht_offset = index - lp_offset;
> -
> -		if (ht_offset_cur != ht_offset) {
> -			error = gfs2_dir_read_data(dip, (char *)lp,
> -						ht_offset * sizeof(__be64),
> -						sdp->sd_hash_bsize, 1);
> -			if (error != sdp->sd_hash_bsize) {
> -				if (error >= 0)
> -					error = -EIO;
> -				goto out;
> -			}
> -			ht_offset_cur = ht_offset;
> -		}
> -
> -		leaf_no = be64_to_cpu(lp[lp_offset]);
> -		if (leaf_no) {
> -			error = get_leaf(dip, leaf_no, &bh);
> -			if (error)
> -				goto out;
> -			leaf = (struct gfs2_leaf *)bh->b_data;
> -			len = 1 << (dip->i_depth - be16_to_cpu(leaf->lf_depth));
> -			next_index = (index & ~(len - 1)) + len;
> -			last = ((next_index >= hsize) ? 1 : 0);
> -			error = leaf_dealloc(dip, index, len, leaf_no, bh,
> -					     last);
> -			brelse(bh);
> -			if (error)
> -				goto out;
> -			index = next_index;
> -		} else
> -			index++;
> -	}
> -
> -	if (index != hsize) {
> -		gfs2_consist_inode(dip);
> -		error = -EIO;
> -	}
> -
> -out:
> -	kfree(lp);
> -
> -	return error;
> -}
> -
> -/**
>   * leaf_dealloc - Deallocate a directory leaf
>   * @dip: the directory
>   * @index: the hash table offset in the directory
> @@ -1988,8 +1909,71 @@ out:
>  
>  int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip)
>  {
> -	/* Dealloc on-disk leaves to FREEMETA state */
> -	return foreach_leaf(dip);
> +	struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
> +	struct buffer_head *bh;
> +	struct gfs2_leaf *leaf;
> +	u32 hsize, len;
> +	u32 ht_offset, lp_offset, ht_offset_cur = -1;
> +	u32 index = 0, next_index;
> +	__be64 *lp;
> +	u64 leaf_no;
> +	int error = 0, last;
> +
> +	hsize = 1 << dip->i_depth;
> +	if (hsize * sizeof(u64) != i_size_read(&dip->i_inode)) {
> +		gfs2_consist_inode(dip);
> +		return -EIO;
> +	}
> +
> +	lp = kmalloc(sdp->sd_hash_bsize, GFP_NOFS);
> +	if (!lp)
> +		return -ENOMEM;
> +
> +	while (index < hsize) {
> +		lp_offset = index & (sdp->sd_hash_ptrs - 1);
> +		ht_offset = index - lp_offset;
> +
> +		if (ht_offset_cur != ht_offset) {
> +			error = gfs2_dir_read_data(dip, (char *)lp,
> +						ht_offset * sizeof(__be64),
> +						sdp->sd_hash_bsize, 1);
> +			if (error != sdp->sd_hash_bsize) {
> +				if (error >= 0)
> +					error = -EIO;
> +				goto out;
> +			}
> +			ht_offset_cur = ht_offset;
> +		}
> +
> +		leaf_no = be64_to_cpu(lp[lp_offset]);
> +		if (leaf_no) {
> +			error = get_leaf(dip, leaf_no, &bh);
> +			if (error)
> +				goto out;
> +			leaf = (struct gfs2_leaf *)bh->b_data;
> +			len = 1 << (dip->i_depth - be16_to_cpu(leaf->lf_depth));
> +
> +			next_index = (index & ~(len - 1)) + len;
> +			last = ((next_index >= hsize) ? 1 : 0);
> +			error = leaf_dealloc(dip, index, len, leaf_no, bh,
> +					     last);
> +			brelse(bh);
> +			if (error)
> +				goto out;
> +			index = next_index;
> +		} else
> +			index++;
> +	}
> +
> +	if (index != hsize) {
> +		gfs2_consist_inode(dip);
> +		error = -EIO;
> +	}
> +
> +out:
> +	kfree(lp);
> +
> +	return error;
>  }
>  
>  /**
> 




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-03-23  9:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-22 17:56 [Cluster-devel] [GFS2 PATCH] gfs2: move function foreach_leaf to gfs2_dir_exhash_dealloc Bob Peterson
2011-03-23  9:38 ` Steven Whitehouse

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).