2019-05-24 13:04:05 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2021-05-07 04:06:44 +03:00
/*
2005-12-16 01:29:43 +03:00
* item . c - library routines for handling generic config items
*
* Based on kobject :
2014-06-05 03:05:57 +04:00
* kobject is Copyright ( c ) 2002 - 2003 Patrick Mochel
2005-12-16 01:29:43 +03:00
*
* configfs Copyright ( C ) 2005 Oracle . All rights reserved .
*
2020-04-28 00:17:21 +03:00
* Please see the file Documentation / filesystems / configfs . rst for
2005-12-16 01:29:43 +03:00
* critical information about using the config_item interface .
*/
# include <linux/string.h>
# include <linux/module.h>
# include <linux/stat.h>
# include <linux/slab.h>
# include <linux/configfs.h>
2014-06-05 03:05:57 +04:00
static inline struct config_item * to_item ( struct list_head * entry )
2005-12-16 01:29:43 +03:00
{
2014-06-05 03:05:57 +04:00
return container_of ( entry , struct config_item , ci_entry ) ;
2005-12-16 01:29:43 +03:00
}
/* Evil kernel */
static void config_item_release ( struct kref * kref ) ;
/**
* config_item_init - initialize item .
* @ item : item in question .
*/
2015-06-25 02:54:51 +03:00
static void config_item_init ( struct config_item * item )
2005-12-16 01:29:43 +03:00
{
kref_init ( & item - > ci_kref ) ;
INIT_LIST_HEAD ( & item - > ci_entry ) ;
}
/**
* config_item_set_name - Set the name of an item
* @ item : item .
2014-06-05 03:05:57 +04:00
* @ fmt : The vsnprintf ( ) ' s format string .
2005-12-16 01:29:43 +03:00
*
* If strlen ( name ) > = CONFIGFS_ITEM_NAME_LEN , then use a
* dynamically allocated string that @ item - > ci_name points to .
* Otherwise , use the static @ item - > ci_namebuf array .
*/
2014-06-05 03:05:57 +04:00
int config_item_set_name ( struct config_item * item , const char * fmt , . . . )
2005-12-16 01:29:43 +03:00
{
int limit = CONFIGFS_ITEM_NAME_LEN ;
int need ;
va_list args ;
2014-06-05 03:05:57 +04:00
char * name ;
2005-12-16 01:29:43 +03:00
/*
* First , try the static array
*/
2014-06-05 03:05:57 +04:00
va_start ( args , fmt ) ;
need = vsnprintf ( item - > ci_namebuf , limit , fmt , args ) ;
2005-12-16 01:29:43 +03:00
va_end ( args ) ;
if ( need < limit )
name = item - > ci_namebuf ;
else {
2014-06-05 03:05:57 +04:00
va_start ( args , fmt ) ;
2018-06-16 01:20:42 +03:00
name = kvasprintf ( GFP_KERNEL , fmt , args ) ;
2005-12-16 01:29:43 +03:00
va_end ( args ) ;
2018-06-16 01:20:42 +03:00
if ( ! name )
return - EFAULT ;
2005-12-16 01:29:43 +03:00
}
/* Free the old name, if necessary. */
if ( item - > ci_name & & item - > ci_name ! = item - > ci_namebuf )
kfree ( item - > ci_name ) ;
/* Now, set the new name */
item - > ci_name = name ;
2018-06-16 01:20:42 +03:00
return 0 ;
2005-12-16 01:29:43 +03:00
}
EXPORT_SYMBOL ( config_item_set_name ) ;
void config_item_init_type_name ( struct config_item * item ,
const char * name ,
2017-10-16 18:18:40 +03:00
const struct config_item_type * type )
2005-12-16 01:29:43 +03:00
{
2015-07-18 02:23:45 +03:00
config_item_set_name ( item , " %s " , name ) ;
2005-12-16 01:29:43 +03:00
item - > ci_type = type ;
config_item_init ( item ) ;
}
EXPORT_SYMBOL ( config_item_init_type_name ) ;
void config_group_init_type_name ( struct config_group * group , const char * name ,
2017-10-16 18:18:40 +03:00
const struct config_item_type * type )
2005-12-16 01:29:43 +03:00
{
2015-07-18 02:23:45 +03:00
config_item_set_name ( & group - > cg_item , " %s " , name ) ;
2005-12-16 01:29:43 +03:00
group - > cg_item . ci_type = type ;
config_group_init ( group ) ;
}
EXPORT_SYMBOL ( config_group_init_type_name ) ;
2014-06-05 03:05:57 +04:00
struct config_item * config_item_get ( struct config_item * item )
2005-12-16 01:29:43 +03:00
{
if ( item )
kref_get ( & item - > ci_kref ) ;
return item ;
}
2014-06-05 03:05:57 +04:00
EXPORT_SYMBOL ( config_item_get ) ;
2005-12-16 01:29:43 +03:00
2017-02-10 04:28:50 +03:00
struct config_item * config_item_get_unless_zero ( struct config_item * item )
{
if ( item & & kref_get_unless_zero ( & item - > ci_kref ) )
return item ;
return NULL ;
}
EXPORT_SYMBOL ( config_item_get_unless_zero ) ;
2014-06-05 03:05:57 +04:00
static void config_item_cleanup ( struct config_item * item )
2005-12-16 01:29:43 +03:00
{
2017-10-16 18:18:40 +03:00
const struct config_item_type * t = item - > ci_type ;
2014-06-05 03:05:57 +04:00
struct config_group * s = item - > ci_group ;
struct config_item * parent = item - > ci_parent ;
2005-12-16 01:29:43 +03:00
2014-06-05 03:05:57 +04:00
pr_debug ( " config_item %s: cleaning up \n " , config_item_name ( item ) ) ;
2005-12-16 01:29:43 +03:00
if ( item - > ci_name ! = item - > ci_namebuf )
kfree ( item - > ci_name ) ;
item - > ci_name = NULL ;
if ( t & & t - > ct_item_ops & & t - > ct_item_ops - > release )
t - > ct_item_ops - > release ( item ) ;
if ( s )
config_group_put ( s ) ;
if ( parent )
config_item_put ( parent ) ;
}
static void config_item_release ( struct kref * kref )
{
config_item_cleanup ( container_of ( kref , struct config_item , ci_kref ) ) ;
}
/**
* config_item_put - decrement refcount for item .
* @ item : item .
*
* Decrement the refcount , and if 0 , call config_item_cleanup ( ) .
*/
2014-06-05 03:05:57 +04:00
void config_item_put ( struct config_item * item )
2005-12-16 01:29:43 +03:00
{
if ( item )
kref_put ( & item - > ci_kref , config_item_release ) ;
}
2014-06-05 03:05:57 +04:00
EXPORT_SYMBOL ( config_item_put ) ;
2005-12-16 01:29:43 +03:00
/**
* config_group_init - initialize a group for use
2014-06-05 03:05:57 +04:00
* @ group : config_group
2005-12-16 01:29:43 +03:00
*/
void config_group_init ( struct config_group * group )
{
config_item_init ( & group - > cg_item ) ;
INIT_LIST_HEAD ( & group - > cg_children ) ;
2016-02-26 13:02:14 +03:00
INIT_LIST_HEAD ( & group - > default_groups ) ;
2005-12-16 01:29:43 +03:00
}
2014-06-05 03:05:57 +04:00
EXPORT_SYMBOL ( config_group_init ) ;
2005-12-16 01:29:43 +03:00
/**
[PATCH] configfs+dlm: Rename config_group_find_obj and state semantics clearly
Configfs being based upon sysfs code, config_group_find_obj() is probably
so named because of the similar kset_find_obj() in sysfs. However,
"kobject"s in sysfs become "config_item"s in configfs, so let's call it
config_group_find_item() instead, for sake of uniformity, and make
corresponding change in the users of this function.
BTW a crucial difference between kset_find_obj and config_group_find_item
is in locking expectations. kset_find_obj does its locking by itself, but
config_group_find_item expects the *caller* to do the locking. The reason
for this: kset's have their own locks, config_group's don't but instead
rely on the subsystem mutex. And, subsystem needn't necessarily be around
when config_group_find_item() is called.
So let's state these locking semantics explicitly, and rectify the comment,
otherwise bugs could continue to occur in future, as they did in the past
(refer commit d82b8191e238 in gfs2-2.6-fixes.git).
[ I also took the opportunity to fix some bad whitespace and
double-empty lines. --Joel ]
[ Conflict in fs/dlm/config.c with commit
3168b0780d06ace875696f8a648d04d6089654e5 manually resolved. --Mark ]
Signed-off-by: Satyam Sharma <ssatyam@cse.iitk.ac.in>
Cc: David Teigland <teigland@redhat.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
2007-07-04 15:07:16 +04:00
* config_group_find_item - search for item in group .
2005-12-16 01:29:43 +03:00
* @ group : group we ' re looking in .
* @ name : item ' s name .
*
[PATCH] configfs+dlm: Rename config_group_find_obj and state semantics clearly
Configfs being based upon sysfs code, config_group_find_obj() is probably
so named because of the similar kset_find_obj() in sysfs. However,
"kobject"s in sysfs become "config_item"s in configfs, so let's call it
config_group_find_item() instead, for sake of uniformity, and make
corresponding change in the users of this function.
BTW a crucial difference between kset_find_obj and config_group_find_item
is in locking expectations. kset_find_obj does its locking by itself, but
config_group_find_item expects the *caller* to do the locking. The reason
for this: kset's have their own locks, config_group's don't but instead
rely on the subsystem mutex. And, subsystem needn't necessarily be around
when config_group_find_item() is called.
So let's state these locking semantics explicitly, and rectify the comment,
otherwise bugs could continue to occur in future, as they did in the past
(refer commit d82b8191e238 in gfs2-2.6-fixes.git).
[ I also took the opportunity to fix some bad whitespace and
double-empty lines. --Joel ]
[ Conflict in fs/dlm/config.c with commit
3168b0780d06ace875696f8a648d04d6089654e5 manually resolved. --Mark ]
Signed-off-by: Satyam Sharma <ssatyam@cse.iitk.ac.in>
Cc: David Teigland <teigland@redhat.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
2007-07-04 15:07:16 +04:00
* Iterate over @ group - > cg_list , looking for a matching config_item .
* If matching item is found take a reference and return the item .
* Caller must have locked group via @ group - > cg_subsys - > su_mtx .
2005-12-16 01:29:43 +03:00
*/
[PATCH] configfs+dlm: Rename config_group_find_obj and state semantics clearly
Configfs being based upon sysfs code, config_group_find_obj() is probably
so named because of the similar kset_find_obj() in sysfs. However,
"kobject"s in sysfs become "config_item"s in configfs, so let's call it
config_group_find_item() instead, for sake of uniformity, and make
corresponding change in the users of this function.
BTW a crucial difference between kset_find_obj and config_group_find_item
is in locking expectations. kset_find_obj does its locking by itself, but
config_group_find_item expects the *caller* to do the locking. The reason
for this: kset's have their own locks, config_group's don't but instead
rely on the subsystem mutex. And, subsystem needn't necessarily be around
when config_group_find_item() is called.
So let's state these locking semantics explicitly, and rectify the comment,
otherwise bugs could continue to occur in future, as they did in the past
(refer commit d82b8191e238 in gfs2-2.6-fixes.git).
[ I also took the opportunity to fix some bad whitespace and
double-empty lines. --Joel ]
[ Conflict in fs/dlm/config.c with commit
3168b0780d06ace875696f8a648d04d6089654e5 manually resolved. --Mark ]
Signed-off-by: Satyam Sharma <ssatyam@cse.iitk.ac.in>
Cc: David Teigland <teigland@redhat.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
2007-07-04 15:07:16 +04:00
struct config_item * config_group_find_item ( struct config_group * group ,
const char * name )
2005-12-16 01:29:43 +03:00
{
2014-06-05 03:05:57 +04:00
struct list_head * entry ;
struct config_item * ret = NULL ;
2005-12-16 01:29:43 +03:00
2014-06-05 03:05:57 +04:00
list_for_each ( entry , & group - > cg_children ) {
struct config_item * item = to_item ( entry ) ;
2005-12-16 01:29:43 +03:00
if ( config_item_name ( item ) & &
[PATCH] configfs+dlm: Rename config_group_find_obj and state semantics clearly
Configfs being based upon sysfs code, config_group_find_obj() is probably
so named because of the similar kset_find_obj() in sysfs. However,
"kobject"s in sysfs become "config_item"s in configfs, so let's call it
config_group_find_item() instead, for sake of uniformity, and make
corresponding change in the users of this function.
BTW a crucial difference between kset_find_obj and config_group_find_item
is in locking expectations. kset_find_obj does its locking by itself, but
config_group_find_item expects the *caller* to do the locking. The reason
for this: kset's have their own locks, config_group's don't but instead
rely on the subsystem mutex. And, subsystem needn't necessarily be around
when config_group_find_item() is called.
So let's state these locking semantics explicitly, and rectify the comment,
otherwise bugs could continue to occur in future, as they did in the past
(refer commit d82b8191e238 in gfs2-2.6-fixes.git).
[ I also took the opportunity to fix some bad whitespace and
double-empty lines. --Joel ]
[ Conflict in fs/dlm/config.c with commit
3168b0780d06ace875696f8a648d04d6089654e5 manually resolved. --Mark ]
Signed-off-by: Satyam Sharma <ssatyam@cse.iitk.ac.in>
Cc: David Teigland <teigland@redhat.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
2007-07-04 15:07:16 +04:00
! strcmp ( config_item_name ( item ) , name ) ) {
2005-12-16 01:29:43 +03:00
ret = config_item_get ( item ) ;
break ;
}
}
return ret ;
}
[PATCH] configfs+dlm: Rename config_group_find_obj and state semantics clearly
Configfs being based upon sysfs code, config_group_find_obj() is probably
so named because of the similar kset_find_obj() in sysfs. However,
"kobject"s in sysfs become "config_item"s in configfs, so let's call it
config_group_find_item() instead, for sake of uniformity, and make
corresponding change in the users of this function.
BTW a crucial difference between kset_find_obj and config_group_find_item
is in locking expectations. kset_find_obj does its locking by itself, but
config_group_find_item expects the *caller* to do the locking. The reason
for this: kset's have their own locks, config_group's don't but instead
rely on the subsystem mutex. And, subsystem needn't necessarily be around
when config_group_find_item() is called.
So let's state these locking semantics explicitly, and rectify the comment,
otherwise bugs could continue to occur in future, as they did in the past
(refer commit d82b8191e238 in gfs2-2.6-fixes.git).
[ I also took the opportunity to fix some bad whitespace and
double-empty lines. --Joel ]
[ Conflict in fs/dlm/config.c with commit
3168b0780d06ace875696f8a648d04d6089654e5 manually resolved. --Mark ]
Signed-off-by: Satyam Sharma <ssatyam@cse.iitk.ac.in>
Cc: David Teigland <teigland@redhat.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
2007-07-04 15:07:16 +04:00
EXPORT_SYMBOL ( config_group_find_item ) ;