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 <[email protected]> 
> --
> 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;
>  }
>  
>  /**
> 


Reply via email to