[Cluster-devel] [gfs2 patch v2] gfs2: Dump nrpages for inodes and their glocks

Andreas Gruenbacher agruenba at redhat.com
Mon Dec 10 21:51:22 UTC 2018


On Fri, 7 Dec 2018 at 20:51, Bob Peterson <rpeterso at redhat.com> wrote:
>
> Hi,
>
> This is my latest version of this patch, revised with Andreas's
> suggestions:
> (1) I got dropped const from the go_dump functions to allow for
>     additional locking without going through hoops.
> (2) I got rid of the nrpages for the metadata.
> (3) I reverted to previous i_size_read behavior.
> (4) I added locking for just the nrpages value.
>
> Regards,
>
> Bob Peterson
> Red Hat File Systems
> ---
> This patch is based on an idea from Steve Whitehouse. The idea is
> to dump the number of pages for inodes in the glock dumps.
> The additional locking required me to drop const from quite a few
> places.
>
> Signed-off-by: Bob Peterson <rpeterso at redhat.com>
> ---
>  fs/gfs2/glock.c  |  2 +-
>  fs/gfs2/glock.h  |  2 +-
>  fs/gfs2/glops.c  | 16 ++++++++++++----
>  fs/gfs2/incore.h |  2 +-
>  fs/gfs2/rgrp.c   |  2 +-
>  fs/gfs2/rgrp.h   |  2 +-
>  6 files changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
> index 05431324b262..b92740edc416 100644
> --- a/fs/gfs2/glock.c
> +++ b/fs/gfs2/glock.c
> @@ -1777,7 +1777,7 @@ static const char *gflags2str(char *buf, const struct gfs2_glock *gl)
>   *
>   */
>
> -void gfs2_dump_glock(struct seq_file *seq, const struct gfs2_glock *gl)
> +void gfs2_dump_glock(struct seq_file *seq, struct gfs2_glock *gl)
>  {
>         const struct gfs2_glock_operations *glops = gl->gl_ops;
>         unsigned long long dtime;
> diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h
> index 5e12220cc0c2..8949bf28b249 100644
> --- a/fs/gfs2/glock.h
> +++ b/fs/gfs2/glock.h
> @@ -202,7 +202,7 @@ extern int gfs2_glock_nq_num(struct gfs2_sbd *sdp, u64 number,
>                              struct gfs2_holder *gh);
>  extern int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs);
>  extern void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs);
> -extern void gfs2_dump_glock(struct seq_file *seq, const struct gfs2_glock *gl);
> +extern void gfs2_dump_glock(struct seq_file *seq, struct gfs2_glock *gl);
>  #define GLOCK_BUG_ON(gl,x) do { if (unlikely(x)) { gfs2_dump_glock(NULL, gl); BUG(); } } while(0)
>  extern __printf(2, 3)
>  void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...);
> diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
> index f79ef9525e33..f15b4c57c4bd 100644
> --- a/fs/gfs2/glops.c
> +++ b/fs/gfs2/glops.c
> @@ -467,17 +467,25 @@ static int inode_go_lock(struct gfs2_holder *gh)
>   *
>   */
>
> -static void inode_go_dump(struct seq_file *seq, const struct gfs2_glock *gl)
> +static void inode_go_dump(struct seq_file *seq, struct gfs2_glock *gl)
>  {
> -       const struct gfs2_inode *ip = gl->gl_object;
> +       struct gfs2_inode *ip = gl->gl_object;
> +       struct inode *inode = &ip->i_inode;
> +       unsigned long nrpages;
> +
>         if (ip == NULL)
>                 return;
> -       gfs2_print_dbg(seq, " I: n:%llu/%llu t:%u f:0x%02lx d:0x%08x s:%llu\n",
> +
> +       xa_lock_irq(&inode->i_data.i_pages);
> +       nrpages = inode->i_data.nrpages;
> +       xa_unlock_irq(&inode->i_data.i_pages);
> +
> +       gfs2_print_dbg(seq, " I: n:%llu/%llu t:%u f:0x%02lx d:0x%08x s:%llu p:%lu\n",
>                   (unsigned long long)ip->i_no_formal_ino,
>                   (unsigned long long)ip->i_no_addr,
>                   IF2DT(ip->i_inode.i_mode), ip->i_flags,
>                   (unsigned int)ip->i_diskflags,
> -                 (unsigned long long)i_size_read(&ip->i_inode));
> +                 (unsigned long long)i_size_read(inode), nrpages);
>  }
>
>  /**
> diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
> index 663759abe60d..e10e0b0a7cd5 100644
> --- a/fs/gfs2/incore.h
> +++ b/fs/gfs2/incore.h
> @@ -243,7 +243,7 @@ struct gfs2_glock_operations {
>         int (*go_demote_ok) (const struct gfs2_glock *gl);
>         int (*go_lock) (struct gfs2_holder *gh);
>         void (*go_unlock) (struct gfs2_holder *gh);
> -       void (*go_dump)(struct seq_file *seq, const struct gfs2_glock *gl);
> +       void (*go_dump)(struct seq_file *seq, struct gfs2_glock *gl);
>         void (*go_callback)(struct gfs2_glock *gl, bool remote);
>         const int go_type;
>         const unsigned long go_flags;
> diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
> index b08a530433ad..17a8d3b43990 100644
> --- a/fs/gfs2/rgrp.c
> +++ b/fs/gfs2/rgrp.c
> @@ -2256,7 +2256,7 @@ static void rgblk_free(struct gfs2_sbd *sdp, struct gfs2_rgrpd *rgd,
>   *
>   */
>
> -void gfs2_rgrp_dump(struct seq_file *seq, const struct gfs2_glock *gl)
> +void gfs2_rgrp_dump(struct seq_file *seq, struct gfs2_glock *gl)
>  {
>         struct gfs2_rgrpd *rgd = gl->gl_object;
>         struct gfs2_blkreserv *trs;
> diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h
> index b596c3d17988..499079a9dbbe 100644
> --- a/fs/gfs2/rgrp.h
> +++ b/fs/gfs2/rgrp.h
> @@ -72,7 +72,7 @@ extern void gfs2_rlist_add(struct gfs2_inode *ip, struct gfs2_rgrp_list *rlist,
>  extern void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist);
>  extern void gfs2_rlist_free(struct gfs2_rgrp_list *rlist);
>  extern u64 gfs2_ri_total(struct gfs2_sbd *sdp);
> -extern void gfs2_rgrp_dump(struct seq_file *seq, const struct gfs2_glock *gl);
> +extern void gfs2_rgrp_dump(struct seq_file *seq, struct gfs2_glock *gl);
>  extern int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset,
>                                    struct buffer_head *bh,
>                                    const struct gfs2_bitmap *bi, unsigned minlen, u64 *ptrimmed);

This looks okay as far as I can see.

Thanks,
Andreas




More information about the Cluster-devel mailing list