mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	xfs: add xfs_mount sysfs kobject
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_mount kobject. It exists solely to serve as a per-mount container for child objects. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
		
							parent
							
								
									3d8712265c
								
							
						
					
					
						commit
						a31b1d3d89
					
				
					 6 changed files with 133 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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 \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										49
									
								
								fs/xfs/xfs_sysfs.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								fs/xfs/xfs_sysfs.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2014 Red Hat, Inc.
 | 
			
		||||
 * All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it would be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write the Free Software Foundation,
 | 
			
		||||
 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "xfs.h"
 | 
			
		||||
#include "xfs_sysfs.h"
 | 
			
		||||
 | 
			
		||||
struct xfs_sysfs_attr {
 | 
			
		||||
	struct attribute attr;
 | 
			
		||||
	ssize_t (*show)(char *buf, void *data);
 | 
			
		||||
	ssize_t (*store)(const char *buf, size_t count, void *data);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static inline struct xfs_sysfs_attr *
 | 
			
		||||
to_attr(struct attribute *attr)
 | 
			
		||||
{
 | 
			
		||||
	return container_of(attr, struct xfs_sysfs_attr, attr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define XFS_SYSFS_ATTR_RW(name) \
 | 
			
		||||
	static struct xfs_sysfs_attr xfs_sysfs_attr_##name = __ATTR_RW(name)
 | 
			
		||||
#define XFS_SYSFS_ATTR_RO(name) \
 | 
			
		||||
	static struct xfs_sysfs_attr xfs_sysfs_attr_##name = __ATTR_RO(name)
 | 
			
		||||
 | 
			
		||||
#define ATTR_LIST(name) &xfs_sysfs_attr_##name.attr
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * xfs_mount kobject. This currently has no attributes and thus no need for show
 | 
			
		||||
 * and store helpers. The mp kobject serves as the per-mount parent object that
 | 
			
		||||
 * is identified by the fsname under sysfs.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
struct kobj_type xfs_mp_ktype = {
 | 
			
		||||
	.release = xfs_sysfs_release,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										58
									
								
								fs/xfs/xfs_sysfs.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								fs/xfs/xfs_sysfs.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,58 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (c) 2014 Red Hat, Inc.
 | 
			
		||||
 * All Rights Reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License as
 | 
			
		||||
 * published by the Free Software Foundation.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it would be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write the Free Software Foundation,
 | 
			
		||||
 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __XFS_SYSFS_H__
 | 
			
		||||
#define __XFS_SYSFS_H__
 | 
			
		||||
 | 
			
		||||
extern struct kobj_type xfs_mp_ktype;	/* xfs_mount */
 | 
			
		||||
 | 
			
		||||
static inline struct xfs_kobj *
 | 
			
		||||
to_kobj(struct kobject *kobject)
 | 
			
		||||
{
 | 
			
		||||
	return container_of(kobject, struct xfs_kobj, kobject);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
xfs_sysfs_release(struct kobject *kobject)
 | 
			
		||||
{
 | 
			
		||||
	struct xfs_kobj *kobj = to_kobj(kobject);
 | 
			
		||||
	complete(&kobj->complete);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xfs_sysfs_init(
 | 
			
		||||
	struct xfs_kobj		*kobj,
 | 
			
		||||
	struct kobj_type	*ktype,
 | 
			
		||||
	struct xfs_kobj		*parent_kobj,
 | 
			
		||||
	const char		*name)
 | 
			
		||||
{
 | 
			
		||||
	init_completion(&kobj->complete);
 | 
			
		||||
	return kobject_init_and_add(&kobj->kobject, ktype,
 | 
			
		||||
				    &parent_kobj->kobject, "%s", name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
xfs_sysfs_del(
 | 
			
		||||
	struct xfs_kobj	*kobj)
 | 
			
		||||
{
 | 
			
		||||
	kobject_del(&kobj->kobject);
 | 
			
		||||
	kobject_put(&kobj->kobject);
 | 
			
		||||
	wait_for_completion(&kobj->complete);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif	/* __XFS_SYSFS_H__ */
 | 
			
		||||
		Loading…
	
		Reference in a new issue