FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Cluster Development

 
 
LinkBack Thread Tools
 
Old 03-22-2011, 04:56 PM
Bob Peterson
 
Default gfs2: move function foreach_leaf to gfs2_dir_exhash_dealloc

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;
}

/**
 
Old 03-23-2011, 08:38 AM
Steven Whitehouse
 
Default gfs2: move function foreach_leaf to gfs2_dir_exhash_dealloc

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;
> }
>
> /**
>
 

Thread Tools




All times are GMT. The time now is 04:03 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org