xfs sysfs support
v2 cover xfs sysfs support
Hi all,
Here's v2 of sysfs support for XFS. The previous version is available here:
http://oss.sgi.com/archives/xfs/2014-06/msg00141.html
This version is rebased onto the latest for-next and further cleans up the code to use some abstractions for sysfs object maintenance and associated helpers. As noted in the v1 thread, I think the current doc patch already indicates that the sysfs attrs are not considered stable. Unless there is further feedback on that front, I'll leave that patch as is.
Brian
v2:
- Rebased to latest for-next (error negation, libxfs).
- Introduce xfs_kobj container for kobject and completion.
- Genericize kobject release function.
- Move snprintf() outside of iclog lock in log_head_lsn_show(). Clean up xlog handlers.
v1:
- Move sysfs infrastructure code to new source file, add helpers for object initialization, etc.
- Created an xfs_mount->xlog object heirarchy for attributes associated with the log.
- Renamed the reserve/write grant head attributes to '[reserve,write]_grant_head.'
- Use the 'cycle:block' or 'cycle:bytes' decimal format for attributes (rather than export encoded values).
- Included generic mountfs fix and doc.
Brian Foster (6):
xfs: fix a couple error sequence jumps in xfs_mountfs()
xfs: add a sysfs kset
xfs: add xfs_mount sysfs kobject
xfs: add xlog sysfs kobject and attribute handlers
xfs: add log attributes for log lsn and grant head data
xfs: document log sysfs attributes in testing ABI
Documentation/ABI/testing/sysfs-fs-xfs | 39 ++++++++ fs/xfs/Makefile | 1 + fs/xfs/xfs_linux.h | 11 +++ fs/xfs/xfs_log.c | 9 ++ fs/xfs/xfs_log_priv.h | 2 + fs/xfs/xfs_mount.c | 18 +++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_super.c | 12 ++- fs/xfs/xfs_sysfs.c | 165 +++++++++++++++++++++++++++++++++ fs/xfs/xfs_sysfs.h | 59 ++++++++++++ 10 files changed, 313 insertions(+), 4 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-fs-xfs create mode 100644 fs/xfs/xfs_sysfs.c create mode 100644 fs/xfs/xfs_sysfs.h
Signature · 6 lines
1.8.3.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 1/6 xfs: fix a couple error sequence jumps in xfs_mountfs()
xfs_mountfs() has a couple failure conditions that do not jump to the correct labels. Specifically:
- xfs_initialize_perag_data() failure does not deallocate the log even though it occurs after log initialization
- xfs_mount_reset_sbqflags() failure returns the error directly rather than jump to the error sequence
--- fs/xfs/xfs_mount.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/xfs/xfs_mount.c +2 -2
@@ -855,7 +855,7 @@ xfs_mountfs( !mp->m_sb.sb_inprogress) { error =xfs_initialize_perag_data (mp, sbp->sb_agcount);if (error) - goto out_fail_wait; + goto out_log_dealloc;; }/*
@@ -927,7 +927,7 @@ xfs_mountfs(xfs_notice (mp,"resetting quota flags" ); error =xfs_mount_reset_sbqflags (mp);if (error) -return error; + goto out_rtunmount; } }
Signature · 6 lines
1.8.3.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 2/6 xfs: add a sysfs kset
In reply to Brian FosterCreate a sysfs kset to contain all sub-objects associated with the XFS module. The kset is created and removed on module initialization and removal respectively. The kset uses fs_obj as a parent. This leads to the creation of a /sys/fs/xfs directory when the kset exists.
--- fs/xfs/xfs_super.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
fs/xfs/xfs_super.c +11 -1
@@ -61,6 +61,7 @@static const struct super_operations xfs_super_operations;static kmem_zone_t *xfs_ioend_zone;mempool_t *xfs_ioend_pool; +struct kset *xfs_kset;#define MNTOPT_LOGBUFS "logbufs"/* number of XFS log buffers */ #define MNTOPT_LOGBSIZE "logbsize"/* size of XFS log buffers */
@@ -1761,9 +1762,15 @@ init_xfs_fs(void)if (error) goto out_cleanup_procfs; + xfs_kset =kset_create_and_add ("xfs" ,NULL , fs_kobj); +if (!xfs_kset) { + error = -ENOMEM ; + goto out_sysctl_unregister;; + } + error =xfs_qm_init ();if (error) - goto out_sysctl_unregister; + goto out_kset_unregister; error =register_filesystem (&xfs_fs_type);if (error)
@@ -1772,6 +1779,8 @@ init_xfs_fs(void) out_qm_exit:xfs_qm_exit (); + out_kset_unregister: +kset_unregister (xfs_kset); out_sysctl_unregister:xfs_sysctl_unregister (); out_cleanup_procfs:
@@ -1793,6 +1802,7 @@ exit_xfs_fs(void) {xfs_qm_exit ();unregister_filesystem (&xfs_fs_type); +kset_unregister (xfs_kset);xfs_sysctl_unregister ();xfs_cleanup_procfs ();xfs_buf_terminate ();
Signature · 6 lines
1.8.3.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 3/6 xfs: add xfs_mount sysfs kobject
In reply to Brian FosterEmbed a base kobject into xfs_mount. This creates a kobject associated with each XFS mount and a subdirectory in sysfs with the name of the filesystem. The subdirectory lifecycle matches that of the mount. Also add the new xfs_sysfs.[c,h] source files with some XFS sysfs infrastructure to facilitate attribute creation.
Note that there are currently no attributes exported as part of the xfs_mount kobject. It exists solely to serve as a per-mount container for child objects.
--- fs/xfs/Makefile | 1 + fs/xfs/xfs_linux.h | 11 +++++++++++ fs/xfs/xfs_mount.c | 14 ++++++++++++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_sysfs.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sysfs.h | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 fs/xfs/xfs_sysfs.c create mode 100644 fs/xfs/xfs_sysfs.h
fs/xfs/Makefile +1 -0
@@ -86,6 +86,7 @@ xfs-y += xfs_aops.o \ xfs_mru_cache.o \ xfs_super.o \ xfs_symlink.o \ + xfs_sysfs.o \ xfs_trans.o \ xfs_xattr.o \ kmem.o \
fs/xfs/xfs_linux.h +11 -0
@@ -191,6 +191,17 @@ typedef __uint64_t __psunsigned_t;#define MAX (a,b) (max(a,b))#define howmany (x, y) (((x)+((y)-1))/(y)) +/* +* XFS wrapper structure for sysfs support. It depends on external data +* structures and is embedded in various internal data structures to implement +* the XFS sysfs object heirarchy. Define it here for broad access throughout +* the codebase. +*/ +struct xfs_kobj { +struct kobject kobject; +struct completion complete; +}; +/* Kernel uid/gid conversion. These are used to convert to/from the on disk * uid_t/gid_t types to the kuid_t/kgid_t types that the kernel uses internally. * The conversion here is type only, the value will remain the same since we
fs/xfs/xfs_mount.c +13 -1
@@ -42,6 +42,7 @@#include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_dinode.h" +#include "xfs_sysfs.h" #ifdef HAVE_PERCPU_SB
@@ -60,6 +61,8 @@ static DEFINE_MUTEX(xfs_uuid_table_mutex);static int xfs_uuid_table_size;static uuid_t *xfs_uuid_table; +extern struct kset *xfs_kset; +/* * See if the UUID is unique among mounted XFS filesystems. * Mount fails if UUID is nil or a FS with the same UUID is already mounted.
@@ -731,10 +734,15 @@ xfs_mountfs(xfs_set_maxicount (mp); - error =xfs_uuid_mount (mp); + mp->m_kobj.kobject.kset = xfs_kset; + error =xfs_sysfs_init (&mp->m_kobj, &xfs_mp_ktype,NULL , mp->m_fsname);if (error) goto out; + error =xfs_uuid_mount (mp); +if (error) + goto out_remove_sysfs; +/* * Set the minimum read and write sizes */
@@ -989,6 +997,8 @@ xfs_mountfs(xfs_da_unmount (mp); out_remove_uuid:xfs_uuid_unmount (mp); + out_remove_sysfs: +xfs_sysfs_del (&mp->m_kobj); out:return error; }
@@ -1071,6 +1081,8 @@ xfs_unmountfs(xfs_errortag_clearall (mp,0 );#endif xfs_free_perag (mp); + +xfs_sysfs_del (&mp->m_kobj); }int
fs/xfs/xfs_mount.h +1 -0
@@ -166,6 +166,7 @@ typedef struct xfs_mount {on the next remount,rw */ int64_t m_low_space[XFS_LOWSP_MAX ];/* low free space thresholds */ +struct xfs_kobj m_kobj;struct workqueue_struct *m_data_workqueue;struct workqueue_struct *m_unwritten_workqueue;
fs/xfs/xfs_sysfs.c new file +49 -0
49 lines not on this page · raw message
fs/xfs/xfs_sysfs.h new file +58 -0
58 lines not on this page · raw message
Signature · 6 lines
1.8.3.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH v2 3/6] xfs: add xfs_mount sysfs kobject
Quoted 11 lines · Brian Foster
Embed a base kobject into
xfs_mount. This creates a kobject associated with each XFS mount and a subdirectory in sysfs with the name of the filesystem. The subdirectory lifecycle matches that of the mount. Also add the new xfs_sysfs.[c,h] source files with some XFS sysfs infrastructure to facilitate attribute creation.Note that there are currently no attributes exported as part of the
xfs_mountkobject. It exists solely to serve as a per-mount container for child objects.Signed-off-by Brian Foster <[email protected]>
One minor thing I can clean up directly:
fs/xfs/xfs_sysfs.h line 41
Quoted 5 lines
fs/xfs/xfs_sysfs.h new file +5
-0+static inline int +xfs_sysfs_init( + struct xfs_kobj *kobj, + struct kobj_type *ktype, + struct xfs_kobj *p_kobj,
^^^^^^
parent_kobj would be better - that looks too much like hungarian notation... :)
Other than that,
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 4/6 xfs: add xlog sysfs kobject and attribute handlers
In reply to Brian FosterEmbed 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.
--- fs/xfs/xfs_log.c | 9 +++++++++ fs/xfs/xfs_log_priv.h | 2 ++ fs/xfs/xfs_sysfs.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sysfs.h | 1 + 4 files changed, 64 insertions(+)
fs/xfs/xfs_log.c +9 -0
@@ -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_kobj, &xfs_log_ktype, &mp->m_kobj, +"log" ); +if (error) + goto out_destroy_ail; +/* 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_kobj); +xlog_dealloc_log (mp->m_log); }
fs/xfs/xfs_log_priv.h +2 -0
@@ -405,6 +405,8 @@ struct xlog {struct xlog_grant_head l_reserve_head;struct xlog_grant_head l_write_head; +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 ];
fs/xfs/xfs_sysfs.c +52 -0
61 lines not on this page · raw message
fs/xfs/xfs_sysfs.h +1 -0
@@ -20,6 +20,7 @@#define __XFS_SYSFS_H__extern struct kobj_type xfs_mp_ktype;/* xfs_mount */ +extern struct kobj_type xfs_log_ktype;/* xlog */ static inline struct xfs_kobj *to_kobj (struct kobject *kobject)
Signature · 6 lines
1.8.3.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH v2 4/6] xfs: add xlog sysfs kobject and attribute handlers
Quoted 8 lines · Brian Foster
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.
Signed-off-by Brian Foster <[email protected]>
Looks fine.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 5/6 xfs: add log attributes for log lsn and grant head data
In reply to Brian FosterCreate log attributes to export the current runtime state of the log to sysfs. Note that the filesystem should be frozen for consistency across attributes.
The following per-mount attributes are created: log_head_lsn, log_tail_lsn, reserve_grant_head and write_grant_head. These represent the physical log head, tail and reserve and write grant heads respectively. Attribute values are exported in the following format:
"cycle:[block,byte]"
... where cycle represents the log cycle and [block,bytes] represents either the basic block or byte offset of the log, depending on the attribute. Log sequence number (LSN) values are encoded in basic blocks and grant heads are encoded in bytes. All values are in decimal format.
--- fs/xfs/xfs_sysfs.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+)
fs/xfs/xfs_sysfs.c +64 -0
@@ -53,7 +53,71 @@ struct kobj_type xfs_mp_ktype = {/* xlog */ +STATIC ssize_t +log_head_lsn_show ( +char *buf, +void *data) +{ +struct xlog *log = data; +int cycle; +int block; + +spin_lock (&log->l_icloglock); + cycle = log->l_curr_cycle; + block = log->l_curr_block; +spin_unlock (&log->l_icloglock); + +return snprintf (buf,PAGE_SIZE ,"%d:%d\n" , cycle, block); +} +XFS_SYSFS_ATTR_RO (log_head_lsn); + +STATIC ssize_t +log_tail_lsn_show ( +char *buf, +void *data) +{ +struct xlog *log = data; +int cycle; +int block; + +xlog_crack_atomic_lsn (&log->l_tail_lsn, &cycle, &block); +return snprintf (buf,PAGE_SIZE ,"%d:%d\n" , cycle, block); +} +XFS_SYSFS_ATTR_RO (log_tail_lsn); + +STATIC ssize_t +reserve_grant_head_show ( +char *buf, +void *data) +{ +struct xlog *log = data; +int cycle; +int bytes; + +xlog_crack_grant_head (&log->l_reserve_head.grant, &cycle, &bytes); +return snprintf (buf,PAGE_SIZE ,"%d:%d\n" , cycle, bytes); +} +XFS_SYSFS_ATTR_RO (reserve_grant_head); + +STATIC ssize_t +write_grant_head_show ( +char *buf, +void *data) +{ +struct xlog *log = data; +int cycle; +int bytes; + +xlog_crack_grant_head (&log->l_write_head.grant, &cycle, &bytes); +return snprintf (buf,PAGE_SIZE ,"%d:%d\n" , cycle, bytes); +} +XFS_SYSFS_ATTR_RO (write_grant_head); +static struct attribute *xfs_log_attrs[] = { +ATTR_LIST (log_head_lsn), +ATTR_LIST (log_tail_lsn), +ATTR_LIST (reserve_grant_head), +ATTR_LIST (write_grant_head),NULL , };
Signature · 6 lines
1.8.3.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
PATCH v2 6/6 xfs: document log sysfs attributes in testing ABI
In reply to Brian FosterCreate a sysfs-fs-xfs ABI documentation file for newly added sysfs attributes. This is created under the testing section.
--- Documentation/ABI/testing/sysfs-fs-xfs | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-fs-xfs
Documentation/ABI/testing/sysfs-fs-xfs new file +39 -0
@@ -0,0 +1,39 @@ +What: /sys/fs/xfs/<disk>/log/log_head_lsn +Date: June 2014 +KernelVersion: 3.16 +Contact: [email protected] +Description: + The log sequence number (LSN) of the current head of the + log. The LSN is exported in "cycle:basic block" format. +Users: xfstests + +What: /sys/fs/xfs/<disk>/log/log_tail_lsn +Date: June 2014 +KernelVersion: 3.16 +Contact: [email protected] +Description: + The log sequence number (LSN) of the current tail of the + log. The LSN is exported in "cycle:basic block" format. + +What: /sys/fs/xfs/<disk>/log/reserve_grant_head +Date: June 2014 +KernelVersion: 3.16 +Contact: [email protected] +Description: + The current state of the log reserve grant head. It + represents the total log reservation of all currently + outstanding transactions. The grant head is exported in + "cycle:bytes" format. +Users: xfstests + +What: /sys/fs/xfs/<disk>/log/write_grant_head +Date: June 2014 +KernelVersion: 3.16 +Contact: [email protected] +Description: + The current state of the log write grant head. It + represents the total log reservation of all currently + oustanding transactions, including regrants due to + rolling transactions. The grant head is exported in + "cycle:bytes" format. +Users: xfstests
Signature · 6 lines
1.8.3.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Re: [PATCH v2 6/6] xfs: document log sysfs attributes in testing ABI
Quoted 15 lines · Brian Foster
Create a sysfs-fs-xfs ABI documentation file for newly added sysfs attributes. This is created under the testing section.
Signed-off-by Brian Foster <[email protected]>--- Documentation/ABI/testing/sysfs-fs-xfs | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Documentation/ABI/testing/sysfs-fs-xfsDocumentation/ABI/testing/sysfs-fs-xfs new file +0
-0
Documentation/ABI/testing/sysfs-fs-xfs line 3
Quoted 3 lines
Documentation/ABI/testing/sysfs-fs-xfs new file +3
-0@@ -0,0 +1,39 @@ +What: /sys/fs/xfs/<disk>/log/log_head_lsn +Date: June 2014 +KernelVersion: 3.16
3.17, actually, but I can fix that up.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs