[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