All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Brian Foster <bfoster@redhat.com>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH 4/6] xfs: add xlog sysfs kobject and attribute handlers
Date: Thu, 26 Jun 2014 14:47:19 +1000	[thread overview]
Message-ID: <20140626044719.GX4453@dastard> (raw)
In-Reply-To: <1402060414-22075-5-git-send-email-bfoster@redhat.com>

On Fri, Jun 06, 2014 at 09:13:32AM -0400, Brian Foster wrote:
> Embed a kobject into the xfs log data structure (xlog). This creates a
> 'log' subdirectory for every XFS mount instance in sysfs. The lifecycle
> of the log kobject is tied to the lifecycle of the log.
> 
> Also define a set of generic attribute handlers associated with the log
> kobject in preparation for the addition of attributes.

The code works fine, but....
> 
> Signed-off-by: Brian Foster <bfoster@redhat.com>
> ---
>  fs/xfs/xfs_log.c      |  9 +++++++++
>  fs/xfs/xfs_log_priv.h |  3 +++
>  fs/xfs/xfs_sysfs.c    | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  fs/xfs/xfs_sysfs.h    |  1 +
>  4 files changed, 66 insertions(+)
> 
> diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
> index 292308d..8eb10d5 100644
> --- a/fs/xfs/xfs_log.c
> +++ b/fs/xfs/xfs_log.c
> @@ -34,6 +34,7 @@
>  #include "xfs_trace.h"
>  #include "xfs_fsops.h"
>  #include "xfs_cksum.h"
> +#include "xfs_sysfs.h"
>  
>  kmem_zone_t	*xfs_log_ticket_zone;
>  
> @@ -707,6 +708,11 @@ xfs_log_mount(
>  		}
>  	}
>  
> +	error = xfs_sysfs_init(&mp->m_log->l_kobject, &xfs_log_ktype,
> +			&mp->m_log->l_kobject_complete, &mp->m_kobject, "log");
> +	if (error)
> +		goto out_destroy_ail;

... that's, ummm, rather verbose.  At minimum, a local log variable,
but I suspect that if the pattern of "all sysfs dirs have a kobject
and a completion" and they are always used together that maybe
we should have a:

struct xfs_kobj {
	struct kobject		kobj;
	struct completion	complete;
};

And we pass them around instead. that would make this:

	error = xfs_sysfs_init(&log->l_kobj, &xfs_log_ktype,
			       &mp->m_kobj, "log");

which is much easier to read....

> +
>  	/* Normal transactions can now occur */
>  	mp->m_log->l_flags &= ~XLOG_ACTIVE_RECOVERY;
>  
> @@ -947,6 +953,9 @@ xfs_log_unmount(
>  	xfs_log_quiesce(mp);
>  
>  	xfs_trans_ail_destroy(mp);
> +
> +	xfs_sysfs_del(&mp->m_log->l_kobject, &mp->m_log->l_kobject_complete);

And that would become:

	xfs_sysfs_del(&log->l_kobj);

> +
>  	xlog_dealloc_log(mp->m_log);
>  }
>  
> diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h
> index 9bc403a..ce1eee2 100644
> --- a/fs/xfs/xfs_log_priv.h
> +++ b/fs/xfs/xfs_log_priv.h
> @@ -405,6 +405,9 @@ struct xlog {
>  	struct xlog_grant_head	l_reserve_head;
>  	struct xlog_grant_head	l_write_head;
>  
> +	struct kobject		l_kobject;
> +	struct completion	l_kobject_complete;

	struct xfs_kobj		l_kobj;

> +
>  	/* The following field are used for debugging; need to hold icloglock */
>  #ifdef DEBUG
>  	char			*l_iclog_bak[XLOG_MAX_ICLOGS];
> diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c
> index 41365fe..f837527 100644
> --- a/fs/xfs/xfs_sysfs.c
> +++ b/fs/xfs/xfs_sysfs.c
> @@ -54,3 +54,56 @@ xfs_mp_release(struct kobject *kobj)
>  struct kobj_type xfs_mp_ktype = {
>  	.release = xfs_mp_release,
>  };
> +
> +/* xlog */
> +
> +static struct attribute *xfs_log_attrs[] = {
> +	NULL,
> +};
> +
> +STATIC ssize_t
> +xfs_log_show(
> +	struct kobject		*kobj,
> +	struct attribute	*attr,
> +	char			*buf)
> +{
> +	struct xlog *log = container_of(kobj, struct xlog, l_kobject);

> +	struct xfs_sysfs_attr *xfs_attr = container_of(attr,
> +		struct xfs_sysfs_attr, attr);
> +
> +	return xfs_attr->show ? xfs_attr->show(buf, log) : 0;

I think this could be made much less verbose:

static inline struct xlog *
to_xlog(struct kobject *kobj)
{
	return container_of(...)
}

static inline struct xfs_sysfs_attr *
to_attr(struct attribute *attr)
{
	return container_of(...)
}

so this becomes:

{
	struct xlog		*log = to_xlog(kobj);
	struct xfs_sysfs_attr	*attr = to_attr(kattr);

	return attr->show ? attr->show(buf, log) : 0;
}


> +}
> +
> +STATIC ssize_t
> +xfs_log_store(
> +	struct kobject		*kobj,
> +	struct attribute	*attr,
> +	const char		*buf,
> +	size_t			count)
> +{
> +	struct xlog *log = container_of(kobj, struct xlog, l_kobject);
> +	struct xfs_sysfs_attr *xfs_attr = container_of(attr,
> +		struct xfs_sysfs_attr, attr);
> +
> +	return xfs_attr->store ? xfs_attr->store(buf, count, log) : 0;
> +}
> +
> +static struct sysfs_ops xfs_log_ops = {
> +	.show = xfs_log_show,
> +	.store = xfs_log_store,
> +};
> +
> +STATIC void
> +xfs_log_release(struct kobject *kobj)
> +{
> +	struct xlog *log = container_of(kobj, struct xlog, l_kobject);
> +
> +	complete(&log->l_kobject_complete);
> +}

If the release funtion is common with other types, then the xfs_kobj
structure is perfect for this use - it will prevent a heap of
duplicated release functions...

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  reply	other threads:[~2014-06-26  4:47 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-06 13:13 [PATCH 0/6] xfs sysfs support Brian Foster
2014-06-06 13:13 ` [PATCH 1/6] xfs: fix a couple error sequence jumps in xfs_mountfs() Brian Foster
2014-06-26  4:10   ` Dave Chinner
2014-06-06 13:13 ` [PATCH 2/6] xfs: add a sysfs kset Brian Foster
2014-06-26  4:13   ` Dave Chinner
2014-06-06 13:13 ` [PATCH 3/6] xfs: add xfs_mount sysfs kobject Brian Foster
2014-06-26  4:29   ` Dave Chinner
2014-06-06 13:13 ` [PATCH 4/6] xfs: add xlog sysfs kobject and attribute handlers Brian Foster
2014-06-26  4:47   ` Dave Chinner [this message]
2014-06-26 12:28     ` Brian Foster
2014-06-26 13:41       ` Brian Foster
2014-06-06 13:13 ` [PATCH 5/6] xfs: add log attributes for log lsn and grant head data Brian Foster
2014-06-26  4:52   ` Dave Chinner
2014-06-26 12:29     ` Brian Foster
2014-06-06 13:13 ` [PATCH 6/6] xfs: document log sysfs attributes in testing ABI Brian Foster
2014-06-26  5:03   ` Dave Chinner
2014-06-26 12:30     ` Brian Foster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140626044719.GX4453@dastard \
    --to=david@fromorbit.com \
    --cc=bfoster@redhat.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.