2015-07-17 17:38:14 +03:00
/*
* Documentation / ABI / stable / orangefs - sysfs :
*
* What : / sys / fs / orangefs / perf_counter_reset
* Date : June 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* echo a 0 or a 1 into perf_counter_reset to
* reset all the counters in
* / sys / fs / orangefs / perf_counters
* except ones with PINT_PERF_PRESERVE set .
*
*
* What : / sys / fs / orangefs / perf_counters / . . .
* Date : Jun 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* Counters and settings for various caches .
* Read only .
*
*
* What : / sys / fs / orangefs / perf_time_interval_secs
* Date : Jun 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* Length of perf counter intervals in
* seconds .
*
*
* What : / sys / fs / orangefs / perf_history_size
* Date : Jun 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* The perf_counters cache statistics have N , or
* perf_history_size , samples . The default is
* one .
*
* Every perf_time_interval_secs the ( first )
* samples are reset .
*
* If N is greater than one , the " current " set
* of samples is reset , and the samples from the
* other N - 1 intervals remain available .
*
*
* What : / sys / fs / orangefs / op_timeout_secs
* Date : Jun 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* Service operation timeout in seconds .
*
*
* What : / sys / fs / orangefs / slot_timeout_secs
* Date : Jun 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* " Slot " timeout in seconds . A " slot "
* is an indexed buffer in the shared
* memory segment used for communication
* between the kernel module and userspace .
* Slots are requested and waited for ,
* the wait times out after slot_timeout_secs .
*
2016-07-25 20:58:24 +03:00
* What : / sys / fs / orangefs / dcache_timeout_msecs
* Date : Jul 2016
* Contact : Martin Brandenburg < martin @ omnibond . com >
* Description :
* Time lookup is valid in milliseconds .
*
* What : / sys / fs / orangefs / getattr_timeout_msecs
* Date : Jul 2016
* Contact : Martin Brandenburg < martin @ omnibond . com >
* Description :
* Time getattr is valid in milliseconds .
2015-07-17 17:38:14 +03:00
*
2016-08-03 20:47:28 +03:00
* What : / sys / fs / orangefs / readahead_count
* Date : Aug 2016
* Contact : Martin Brandenburg < martin @ omnibond . com >
* Description :
* Readahead cache buffer count .
*
* What : / sys / fs / orangefs / readahead_size
* Date : Aug 2016
* Contact : Martin Brandenburg < martin @ omnibond . com >
* Description :
* Readahead cache buffer size .
*
* What : / sys / fs / orangefs / readahead_count_size
* Date : Aug 2016
* Contact : Martin Brandenburg < martin @ omnibond . com >
* Description :
* Readahead cache buffer count and size .
*
2017-01-26 18:25:30 +03:00
* What : / sys / fs / orangefs / readahead_readcnt
* Date : Jan 2017
* Contact : Martin Brandenburg < martin @ omnibond . com >
* Description :
* Number of buffers ( in multiples of readahead_size )
* which can be read ahead for a single file at once .
*
2015-07-17 17:38:14 +03:00
* What : / sys / fs / orangefs / acache / . . .
* Date : Jun 2015
2016-07-25 20:58:24 +03:00
* Contact : Martin Brandenburg < martin @ omnibond . com >
2015-07-17 17:38:14 +03:00
* Description :
* Attribute cache configurable settings .
*
*
* What : / sys / fs / orangefs / ncache / . . .
* Date : Jun 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* Name cache configurable settings .
*
*
* What : / sys / fs / orangefs / capcache / . . .
* Date : Jun 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* Capability cache configurable settings .
*
*
* What : / sys / fs / orangefs / ccache / . . .
* Date : Jun 2015
* Contact : Mike Marshall < hubcap @ omnibond . com >
* Description :
* Credential cache configurable settings .
*
*/
# include <linux/fs.h>
# include <linux/kobject.h>
# include <linux/string.h>
# include <linux/sysfs.h>
# include <linux/module.h>
# include <linux/init.h>
# include "protocol.h"
2015-12-04 20:56:14 +03:00
# include "orangefs-kernel.h"
# include "orangefs-sysfs.h"
2015-07-17 17:38:14 +03:00
# define ORANGEFS_KOBJ_ID "orangefs"
# define ACACHE_KOBJ_ID "acache"
# define CAPCACHE_KOBJ_ID "capcache"
# define CCACHE_KOBJ_ID "ccache"
# define NCACHE_KOBJ_ID "ncache"
# define PC_KOBJ_ID "pc"
# define STATS_KOBJ_ID "stats"
2016-08-15 22:11:32 +03:00
/*
* Every item calls orangefs_attr_show and orangefs_attr_store through
* orangefs_sysfs_ops . They look at the orangefs_attributes further below to
* call one of sysfs_int_show , sysfs_int_store , sysfs_service_op_show , or
* sysfs_service_op_store .
*/
2015-07-17 17:38:14 +03:00
struct orangefs_attribute {
struct attribute attr ;
2016-08-15 21:51:31 +03:00
ssize_t ( * show ) ( struct kobject * kobj ,
2015-07-17 17:38:14 +03:00
struct orangefs_attribute * attr ,
char * buf ) ;
2016-08-15 21:51:31 +03:00
ssize_t ( * store ) ( struct kobject * kobj ,
2015-07-17 17:38:14 +03:00
struct orangefs_attribute * attr ,
const char * buf ,
size_t count ) ;
} ;
static ssize_t orangefs_attr_show ( struct kobject * kobj ,
struct attribute * attr ,
char * buf )
{
struct orangefs_attribute * attribute ;
attribute = container_of ( attr , struct orangefs_attribute , attr ) ;
2016-08-15 22:01:30 +03:00
if ( ! attribute - > show )
return - EIO ;
return attribute - > show ( kobj , attribute , buf ) ;
2015-07-17 17:38:14 +03:00
}
static ssize_t orangefs_attr_store ( struct kobject * kobj ,
struct attribute * attr ,
const char * buf ,
size_t len )
{
struct orangefs_attribute * attribute ;
2016-08-15 22:01:30 +03:00
if ( ! strcmp ( kobj - > name , PC_KOBJ_ID ) | |
! strcmp ( kobj - > name , STATS_KOBJ_ID ) )
return - EPERM ;
2015-07-17 17:38:14 +03:00
attribute = container_of ( attr , struct orangefs_attribute , attr ) ;
2016-08-15 22:01:30 +03:00
if ( ! attribute - > store )
return - EIO ;
return attribute - > store ( kobj , attribute , buf , len ) ;
2015-07-17 17:38:14 +03:00
}
static const struct sysfs_ops orangefs_sysfs_ops = {
. show = orangefs_attr_show ,
. store = orangefs_attr_store ,
} ;
2016-08-15 21:51:31 +03:00
static ssize_t sysfs_int_show ( struct kobject * kobj ,
struct orangefs_attribute * attr , char * buf )
2015-07-17 17:38:14 +03:00
{
int rc = - EIO ;
2016-08-15 21:51:31 +03:00
gossip_debug ( GOSSIP_SYSFS_DEBUG , " sysfs_int_show: id:%s: \n " ,
kobj - > name ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( kobj - > name , ORANGEFS_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " op_timeout_secs " ) ) {
2015-07-17 17:38:14 +03:00
rc = scnprintf ( buf ,
PAGE_SIZE ,
" %d \n " ,
op_timeout_secs ) ;
goto out ;
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" slot_timeout_secs " ) ) {
rc = scnprintf ( buf ,
PAGE_SIZE ,
" %d \n " ,
slot_timeout_secs ) ;
goto out ;
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2016-07-25 20:58:24 +03:00
" dcache_timeout_msecs " ) ) {
rc = scnprintf ( buf ,
PAGE_SIZE ,
" %d \n " ,
2016-08-16 18:38:14 +03:00
orangefs_dcache_timeout_msecs ) ;
2016-07-25 20:58:24 +03:00
goto out ;
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2016-07-25 20:58:24 +03:00
" getattr_timeout_msecs " ) ) {
rc = scnprintf ( buf ,
PAGE_SIZE ,
" %d \n " ,
2016-08-16 18:38:14 +03:00
orangefs_getattr_timeout_msecs ) ;
2016-07-25 20:58:24 +03:00
goto out ;
2015-07-17 17:38:14 +03:00
} else {
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , STATS_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " reads " ) ) {
2015-07-17 17:38:14 +03:00
rc = scnprintf ( buf ,
PAGE_SIZE ,
" %lu \n " ,
2016-08-15 22:33:42 +03:00
orangefs_stats . reads ) ;
2015-07-17 17:38:14 +03:00
goto out ;
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " writes " ) ) {
2015-07-17 17:38:14 +03:00
rc = scnprintf ( buf ,
PAGE_SIZE ,
" %lu \n " ,
2016-08-15 22:33:42 +03:00
orangefs_stats . writes ) ;
2015-07-17 17:38:14 +03:00
goto out ;
} else {
goto out ;
}
}
out :
return rc ;
}
2016-08-15 21:51:31 +03:00
static ssize_t sysfs_int_store ( struct kobject * kobj ,
struct orangefs_attribute * attr , const char * buf , size_t count )
2015-07-17 17:38:14 +03:00
{
int rc = 0 ;
gossip_debug ( GOSSIP_SYSFS_DEBUG ,
2016-08-15 21:51:31 +03:00
" sysfs_int_store: start attr->attr.name:%s: buf:%s: \n " ,
2015-07-17 17:38:14 +03:00
attr - > attr . name , buf ) ;
if ( ! strcmp ( attr - > attr . name , " op_timeout_secs " ) ) {
rc = kstrtoint ( buf , 0 , & op_timeout_secs ) ;
goto out ;
} else if ( ! strcmp ( attr - > attr . name , " slot_timeout_secs " ) ) {
rc = kstrtoint ( buf , 0 , & slot_timeout_secs ) ;
goto out ;
2016-07-25 20:58:24 +03:00
} else if ( ! strcmp ( attr - > attr . name , " dcache_timeout_msecs " ) ) {
2016-08-16 18:38:14 +03:00
rc = kstrtoint ( buf , 0 , & orangefs_dcache_timeout_msecs ) ;
2016-07-25 20:58:24 +03:00
goto out ;
} else if ( ! strcmp ( attr - > attr . name , " getattr_timeout_msecs " ) ) {
2016-08-16 18:38:14 +03:00
rc = kstrtoint ( buf , 0 , & orangefs_getattr_timeout_msecs ) ;
2016-07-25 20:58:24 +03:00
goto out ;
2015-07-17 17:38:14 +03:00
} else {
goto out ;
}
out :
if ( rc )
rc = - EINVAL ;
else
rc = count ;
return rc ;
}
/*
* obtain attribute values from userspace with a service operation .
*/
2016-08-15 21:51:31 +03:00
static ssize_t sysfs_service_op_show ( struct kobject * kobj ,
struct orangefs_attribute * attr , char * buf )
2015-07-17 17:38:14 +03:00
{
2015-11-24 23:12:14 +03:00
struct orangefs_kernel_op_s * new_op = NULL ;
2015-07-17 17:38:14 +03:00
int rc = 0 ;
char * ser_op_type = NULL ;
__u32 op_alloc_type ;
gossip_debug ( GOSSIP_SYSFS_DEBUG ,
" sysfs_service_op_show: id:%s: \n " ,
2016-08-15 21:51:31 +03:00
kobj - > name ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( strcmp ( kobj - > name , PC_KOBJ_ID ) )
2015-11-24 23:12:14 +03:00
op_alloc_type = ORANGEFS_VFS_OP_PARAM ;
2015-07-17 17:38:14 +03:00
else
2015-11-24 23:12:14 +03:00
op_alloc_type = ORANGEFS_VFS_OP_PERF_COUNT ;
2015-07-17 17:38:14 +03:00
new_op = op_alloc ( op_alloc_type ) ;
2016-01-23 03:47:47 +03:00
if ( ! new_op )
return - ENOMEM ;
2015-07-17 17:38:14 +03:00
/* Can't do a service_operation if the client is not running... */
rc = is_daemon_in_service ( ) ;
if ( rc ) {
pr_info ( " %s: Client not running :%d: \n " ,
__func__ ,
is_daemon_in_service ( ) ) ;
goto out ;
}
2016-08-15 21:51:31 +03:00
if ( strcmp ( kobj - > name , PC_KOBJ_ID ) )
2015-11-24 23:12:14 +03:00
new_op - > upcall . req . param . type = ORANGEFS_PARAM_REQUEST_GET ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( kobj - > name , ORANGEFS_KOBJ_ID ) ) {
2016-08-12 23:12:09 +03:00
/* Drop unsupported requests first. */
if ( ! ( orangefs_features & ORANGEFS_FEATURE_READAHEAD ) & &
2016-09-28 21:50:46 +03:00
( ! strcmp ( attr - > attr . name , " readahead_count " ) | |
! strcmp ( attr - > attr . name , " readahead_size " ) | |
2017-01-26 18:25:30 +03:00
! strcmp ( attr - > attr . name , " readahead_count_size " ) | |
! strcmp ( attr - > attr . name , " readahead_readcnt " ) ) ) {
2016-08-12 23:12:09 +03:00
rc = - EINVAL ;
goto out ;
}
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " perf_history_size " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_PERF_HISTORY_SIZE ;
2016-08-15 21:51:31 +03:00
else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" perf_time_interval_secs " ) )
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_PERF_TIME_INTERVAL_SECS ;
2016-08-15 21:51:31 +03:00
else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" perf_counter_reset " ) )
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_PERF_RESET ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
else if ( ! strcmp ( attr - > attr . name ,
2016-08-03 20:47:28 +03:00
" readahead_count " ) )
new_op - > upcall . req . param . op =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT ;
2016-08-15 21:51:31 +03:00
else if ( ! strcmp ( attr - > attr . name ,
2016-08-03 20:47:28 +03:00
" readahead_size " ) )
new_op - > upcall . req . param . op =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_SIZE ;
2016-08-15 21:51:31 +03:00
else if ( ! strcmp ( attr - > attr . name ,
2016-08-03 20:47:28 +03:00
" readahead_count_size " ) )
new_op - > upcall . req . param . op =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE ;
2017-01-26 18:25:30 +03:00
else if ( ! strcmp ( attr - > attr . name ,
" readahead_readcnt " ) )
new_op - > upcall . req . param . op =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_READCNT ;
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , ACACHE_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " timeout_msecs " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_ACACHE_TIMEOUT_MSECS ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " hard_limit " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_ACACHE_HARD_LIMIT ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " soft_limit " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_ACACHE_SOFT_LIMIT ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " reclaim_percentage " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_ACACHE_RECLAIM_PERCENTAGE ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , CAPCACHE_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " timeout_secs " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_TIMEOUT_SECS ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " hard_limit " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_HARD_LIMIT ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " soft_limit " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_SOFT_LIMIT ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " reclaim_percentage " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_RECLAIM_PERCENTAGE ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , CCACHE_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " timeout_secs " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CCACHE_TIMEOUT_SECS ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " hard_limit " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CCACHE_HARD_LIMIT ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " soft_limit " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CCACHE_SOFT_LIMIT ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " reclaim_percentage " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CCACHE_RECLAIM_PERCENTAGE ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , NCACHE_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " timeout_msecs " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_NCACHE_TIMEOUT_MSECS ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " hard_limit " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_NCACHE_HARD_LIMIT ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " soft_limit " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_NCACHE_SOFT_LIMIT ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " reclaim_percentage " ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_NCACHE_RECLAIM_PERCENTAGE ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , PC_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , ACACHE_KOBJ_ID ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . perf_count . type =
2015-11-24 23:12:14 +03:00
ORANGEFS_PERF_COUNT_REQUEST_ACACHE ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , CAPCACHE_KOBJ_ID ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . perf_count . type =
2015-11-24 23:12:14 +03:00
ORANGEFS_PERF_COUNT_REQUEST_CAPCACHE ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , NCACHE_KOBJ_ID ) )
2015-07-17 17:38:14 +03:00
new_op - > upcall . req . perf_count . type =
2015-11-24 23:12:14 +03:00
ORANGEFS_PERF_COUNT_REQUEST_NCACHE ;
2015-07-17 17:38:14 +03:00
} else {
gossip_err ( " sysfs_service_op_show: unknown kobj_id:%s: \n " ,
2016-08-15 21:51:31 +03:00
kobj - > name ) ;
2015-07-17 17:38:14 +03:00
rc = - EINVAL ;
goto out ;
}
2016-08-15 21:51:31 +03:00
if ( strcmp ( kobj - > name , PC_KOBJ_ID ) )
2015-11-24 23:12:14 +03:00
ser_op_type = " orangefs_param " ;
2015-07-17 17:38:14 +03:00
else
2015-11-24 23:12:14 +03:00
ser_op_type = " orangefs_perf_count " ;
2015-07-17 17:38:14 +03:00
/*
* The service_operation will return an errno return code on
* error , and zero on success .
*/
2015-11-24 23:12:14 +03:00
rc = service_operation ( new_op , ser_op_type , ORANGEFS_OP_INTERRUPTIBLE ) ;
2015-07-17 17:38:14 +03:00
out :
if ( ! rc ) {
2016-08-15 21:51:31 +03:00
if ( strcmp ( kobj - > name , PC_KOBJ_ID ) ) {
2016-08-03 20:47:28 +03:00
if ( new_op - > upcall . req . param . op = =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE ) {
rc = scnprintf ( buf , PAGE_SIZE , " %d %d \n " ,
( int ) new_op - > downcall . resp . param . u .
value32 [ 0 ] ,
( int ) new_op - > downcall . resp . param . u .
value32 [ 1 ] ) ;
} else {
rc = scnprintf ( buf , PAGE_SIZE , " %d \n " ,
( int ) new_op - > downcall . resp . param . u . value64 ) ;
}
2015-07-17 17:38:14 +03:00
} else {
rc = scnprintf (
buf ,
PAGE_SIZE ,
" %s " ,
new_op - > downcall . resp . perf_count . buffer ) ;
}
}
2016-01-23 03:47:47 +03:00
op_release ( new_op ) ;
2015-07-17 17:38:14 +03:00
return rc ;
}
/*
* pass attribute values back to userspace with a service operation .
*
* We have to do a memory allocation , an sscanf and a service operation .
* And we have to evaluate what the user entered , to make sure the
* value is within the range supported by the attribute . So , there ' s
* a lot of return code checking and mapping going on here .
*
* We want to return 1 if we think everything went OK , and
* EINVAL if not .
*/
2016-08-15 21:51:31 +03:00
static ssize_t sysfs_service_op_store ( struct kobject * kobj ,
struct orangefs_attribute * attr , const char * buf , size_t count )
2015-07-17 17:38:14 +03:00
{
2015-11-24 23:12:14 +03:00
struct orangefs_kernel_op_s * new_op = NULL ;
2015-07-17 17:38:14 +03:00
int val = 0 ;
int rc = 0 ;
gossip_debug ( GOSSIP_SYSFS_DEBUG ,
" sysfs_service_op_store: id:%s: \n " ,
2016-08-15 21:51:31 +03:00
kobj - > name ) ;
2015-07-17 17:38:14 +03:00
2015-11-24 23:12:14 +03:00
new_op = op_alloc ( ORANGEFS_VFS_OP_PARAM ) ;
2016-01-23 03:47:47 +03:00
if ( ! new_op )
return - EINVAL ; /* sic */
2015-07-17 17:38:14 +03:00
/* Can't do a service_operation if the client is not running... */
rc = is_daemon_in_service ( ) ;
if ( rc ) {
pr_info ( " %s: Client not running :%d: \n " ,
__func__ ,
is_daemon_in_service ( ) ) ;
goto out ;
}
/*
2016-08-03 20:47:28 +03:00
* The value we want to send back to userspace is in buf , unless this
* there are two parameters , which is specially handled below .
2015-07-17 17:38:14 +03:00
*/
2016-08-15 21:51:31 +03:00
if ( strcmp ( kobj - > name , ORANGEFS_KOBJ_ID ) | |
strcmp ( attr - > attr . name , " readahead_count_size " ) ) {
2016-08-03 20:47:28 +03:00
rc = kstrtoint ( buf , 0 , & val ) ;
if ( rc )
goto out ;
}
new_op - > upcall . req . param . type = ORANGEFS_PARAM_REQUEST_SET ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( kobj - > name , ORANGEFS_KOBJ_ID ) ) {
2016-08-12 23:12:09 +03:00
/* Drop unsupported requests first. */
if ( ! ( orangefs_features & ORANGEFS_FEATURE_READAHEAD ) & &
2016-09-28 21:50:46 +03:00
( ! strcmp ( attr - > attr . name , " readahead_count " ) | |
! strcmp ( attr - > attr . name , " readahead_size " ) | |
2017-01-26 18:25:30 +03:00
! strcmp ( attr - > attr . name , " readahead_count_size " ) | |
! strcmp ( attr - > attr . name , " readahead_readcnt " ) ) ) {
2016-08-12 23:12:09 +03:00
rc = - EINVAL ;
goto out ;
}
2015-07-17 17:38:14 +03:00
2016-08-15 21:51:31 +03:00
if ( ! strcmp ( attr - > attr . name , " perf_history_size " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > 0 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_PERF_HISTORY_SIZE ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" perf_time_interval_secs " ) ) {
if ( val > 0 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_PERF_TIME_INTERVAL_SECS ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" perf_counter_reset " ) ) {
if ( ( val = = 0 ) | | ( val = = 1 ) ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_PERF_RESET ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2016-08-03 20:47:28 +03:00
" readahead_count " ) ) {
if ( ( val > = 0 ) ) {
new_op - > upcall . req . param . op =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT ;
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2016-08-03 20:47:28 +03:00
" readahead_size " ) ) {
if ( ( val > = 0 ) ) {
new_op - > upcall . req . param . op =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_SIZE ;
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2016-08-03 20:47:28 +03:00
" readahead_count_size " ) ) {
int val1 , val2 ;
rc = sscanf ( buf , " %d %d " , & val1 , & val2 ) ;
if ( rc < 2 ) {
rc = 0 ;
goto out ;
}
if ( ( val1 > = 0 ) & & ( val2 > = 0 ) ) {
new_op - > upcall . req . param . op =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_COUNT_SIZE ;
} else {
rc = 0 ;
goto out ;
}
new_op - > upcall . req . param . u . value32 [ 0 ] = val1 ;
new_op - > upcall . req . param . u . value32 [ 1 ] = val2 ;
goto value_set ;
2017-01-26 18:25:30 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
" readahead_readcnt " ) ) {
if ( ( val > = 0 ) ) {
new_op - > upcall . req . param . op =
ORANGEFS_PARAM_REQUEST_OP_READAHEAD_READCNT ;
} else {
rc = 0 ;
goto out ;
}
2015-07-17 17:38:14 +03:00
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , ACACHE_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " hard_limit " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_ACACHE_HARD_LIMIT ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " soft_limit " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_ACACHE_SOFT_LIMIT ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" reclaim_percentage " ) ) {
if ( ( val > - 1 ) & & ( val < 101 ) ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_ACACHE_RECLAIM_PERCENTAGE ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " timeout_msecs " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_ACACHE_TIMEOUT_MSECS ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , CAPCACHE_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " hard_limit " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_HARD_LIMIT ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " soft_limit " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_SOFT_LIMIT ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" reclaim_percentage " ) ) {
if ( ( val > - 1 ) & & ( val < 101 ) ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_RECLAIM_PERCENTAGE ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " timeout_secs " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CAPCACHE_TIMEOUT_SECS ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , CCACHE_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " hard_limit " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CCACHE_HARD_LIMIT ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " soft_limit " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CCACHE_SOFT_LIMIT ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" reclaim_percentage " ) ) {
if ( ( val > - 1 ) & & ( val < 101 ) ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CCACHE_RECLAIM_PERCENTAGE ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " timeout_secs " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_CCACHE_TIMEOUT_SECS ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( kobj - > name , NCACHE_KOBJ_ID ) ) {
if ( ! strcmp ( attr - > attr . name , " hard_limit " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_NCACHE_HARD_LIMIT ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " soft_limit " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_NCACHE_SOFT_LIMIT ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name ,
2015-07-17 17:38:14 +03:00
" reclaim_percentage " ) ) {
if ( ( val > - 1 ) & & ( val < 101 ) ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_NCACHE_RECLAIM_PERCENTAGE ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
2016-08-15 21:51:31 +03:00
} else if ( ! strcmp ( attr - > attr . name , " timeout_msecs " ) ) {
2015-07-17 17:38:14 +03:00
if ( val > - 1 ) {
new_op - > upcall . req . param . op =
2015-11-24 23:12:14 +03:00
ORANGEFS_PARAM_REQUEST_OP_NCACHE_TIMEOUT_MSECS ;
2015-07-17 17:38:14 +03:00
} else {
rc = 0 ;
goto out ;
}
}
} else {
gossip_err ( " sysfs_service_op_store: unknown kobj_id:%s: \n " ,
2016-08-15 21:51:31 +03:00
kobj - > name ) ;
2015-07-17 17:38:14 +03:00
rc = - EINVAL ;
goto out ;
}
2016-08-02 23:33:34 +03:00
new_op - > upcall . req . param . u . value64 = val ;
2016-08-03 20:47:28 +03:00
value_set :
2015-07-17 17:38:14 +03:00
/*
* The service_operation will return a errno return code on
* error , and zero on success .
*/
2015-11-24 23:12:14 +03:00
rc = service_operation ( new_op , " orangefs_param " , ORANGEFS_OP_INTERRUPTIBLE ) ;
2015-07-17 17:38:14 +03:00
if ( rc < 0 ) {
gossip_err ( " sysfs_service_op_store: service op returned:%d: \n " ,
rc ) ;
rc = 0 ;
} else {
2016-08-15 21:51:31 +03:00
rc = count ;
2015-07-17 17:38:14 +03:00
}
out :
2016-01-23 03:47:47 +03:00
op_release ( new_op ) ;
2015-07-17 17:38:14 +03:00
2016-01-23 03:47:47 +03:00
if ( rc = = - ENOMEM | | rc = = 0 )
2015-07-17 17:38:14 +03:00
rc = - EINVAL ;
return rc ;
}
static struct orangefs_attribute op_timeout_secs_attribute =
2016-08-15 21:51:31 +03:00
__ATTR ( op_timeout_secs , 0664 , sysfs_int_show , sysfs_int_store ) ;
2015-07-17 17:38:14 +03:00
static struct orangefs_attribute slot_timeout_secs_attribute =
2016-08-15 21:51:31 +03:00
__ATTR ( slot_timeout_secs , 0664 , sysfs_int_show , sysfs_int_store ) ;
2015-07-17 17:38:14 +03:00
2016-07-25 20:58:24 +03:00
static struct orangefs_attribute dcache_timeout_msecs_attribute =
2016-08-15 21:51:31 +03:00
__ATTR ( dcache_timeout_msecs , 0664 , sysfs_int_show , sysfs_int_store ) ;
2016-07-25 20:58:24 +03:00
static struct orangefs_attribute getattr_timeout_msecs_attribute =
2016-08-15 21:51:31 +03:00
__ATTR ( getattr_timeout_msecs , 0664 , sysfs_int_show , sysfs_int_store ) ;
2016-07-25 20:58:24 +03:00
2016-08-03 20:47:28 +03:00
static struct orangefs_attribute readahead_count_attribute =
2016-08-15 21:51:31 +03:00
__ATTR ( readahead_count , 0664 , sysfs_service_op_show ,
sysfs_service_op_store ) ;
2016-08-03 20:47:28 +03:00
static struct orangefs_attribute readahead_size_attribute =
2016-08-15 21:51:31 +03:00
__ATTR ( readahead_size , 0664 , sysfs_service_op_show ,
sysfs_service_op_store ) ;
2016-08-03 20:47:28 +03:00
static struct orangefs_attribute readahead_count_size_attribute =
2016-08-15 21:51:31 +03:00
__ATTR ( readahead_count_size , 0664 , sysfs_service_op_show ,
sysfs_service_op_store ) ;
2016-08-03 20:47:28 +03:00
2017-01-26 18:25:30 +03:00
static struct orangefs_attribute readahead_readcnt_attribute =
__ATTR ( readahead_readcnt , 0664 , sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
static struct orangefs_attribute perf_counter_reset_attribute =
__ATTR ( perf_counter_reset ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
static struct orangefs_attribute perf_history_size_attribute =
__ATTR ( perf_history_size ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
static struct orangefs_attribute perf_time_interval_secs_attribute =
__ATTR ( perf_time_interval_secs ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
static struct attribute * orangefs_default_attrs [ ] = {
& op_timeout_secs_attribute . attr ,
& slot_timeout_secs_attribute . attr ,
2016-07-25 20:58:24 +03:00
& dcache_timeout_msecs_attribute . attr ,
& getattr_timeout_msecs_attribute . attr ,
2016-08-03 20:47:28 +03:00
& readahead_count_attribute . attr ,
& readahead_size_attribute . attr ,
& readahead_count_size_attribute . attr ,
2017-01-26 18:25:30 +03:00
& readahead_readcnt_attribute . attr ,
2015-07-17 17:38:14 +03:00
& perf_counter_reset_attribute . attr ,
& perf_history_size_attribute . attr ,
& perf_time_interval_secs_attribute . attr ,
NULL ,
} ;
static struct kobj_type orangefs_ktype = {
. sysfs_ops = & orangefs_sysfs_ops ,
. default_attrs = orangefs_default_attrs ,
} ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute acache_hard_limit_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( hard_limit ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute acache_reclaim_percent_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( reclaim_percentage ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute acache_soft_limit_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( soft_limit ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute acache_timeout_msecs_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( timeout_msecs ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
static struct attribute * acache_orangefs_default_attrs [ ] = {
& acache_hard_limit_attribute . attr ,
& acache_reclaim_percent_attribute . attr ,
& acache_soft_limit_attribute . attr ,
& acache_timeout_msecs_attribute . attr ,
NULL ,
} ;
static struct kobj_type acache_orangefs_ktype = {
2016-08-15 22:01:30 +03:00
. sysfs_ops = & orangefs_sysfs_ops ,
2015-07-17 17:38:14 +03:00
. default_attrs = acache_orangefs_default_attrs ,
} ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute capcache_hard_limit_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( hard_limit ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute capcache_reclaim_percent_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( reclaim_percentage ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute capcache_soft_limit_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( soft_limit ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute capcache_timeout_secs_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( timeout_secs ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
static struct attribute * capcache_orangefs_default_attrs [ ] = {
& capcache_hard_limit_attribute . attr ,
& capcache_reclaim_percent_attribute . attr ,
& capcache_soft_limit_attribute . attr ,
& capcache_timeout_secs_attribute . attr ,
NULL ,
} ;
static struct kobj_type capcache_orangefs_ktype = {
2016-08-15 22:01:30 +03:00
. sysfs_ops = & orangefs_sysfs_ops ,
2015-07-17 17:38:14 +03:00
. default_attrs = capcache_orangefs_default_attrs ,
} ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute ccache_hard_limit_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( hard_limit ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute ccache_reclaim_percent_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( reclaim_percentage ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute ccache_soft_limit_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( soft_limit ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute ccache_timeout_secs_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( timeout_secs ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
static struct attribute * ccache_orangefs_default_attrs [ ] = {
& ccache_hard_limit_attribute . attr ,
& ccache_reclaim_percent_attribute . attr ,
& ccache_soft_limit_attribute . attr ,
& ccache_timeout_secs_attribute . attr ,
NULL ,
} ;
static struct kobj_type ccache_orangefs_ktype = {
2016-08-15 22:01:30 +03:00
. sysfs_ops = & orangefs_sysfs_ops ,
2015-07-17 17:38:14 +03:00
. default_attrs = ccache_orangefs_default_attrs ,
} ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute ncache_hard_limit_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( hard_limit ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute ncache_reclaim_percent_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( reclaim_percentage ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute ncache_soft_limit_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( soft_limit ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute ncache_timeout_msecs_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( timeout_msecs ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
sysfs_service_op_store ) ;
2015-07-17 17:38:14 +03:00
static struct attribute * ncache_orangefs_default_attrs [ ] = {
& ncache_hard_limit_attribute . attr ,
& ncache_reclaim_percent_attribute . attr ,
& ncache_soft_limit_attribute . attr ,
& ncache_timeout_msecs_attribute . attr ,
NULL ,
} ;
static struct kobj_type ncache_orangefs_ktype = {
2016-08-15 22:01:30 +03:00
. sysfs_ops = & orangefs_sysfs_ops ,
2015-07-17 17:38:14 +03:00
. default_attrs = ncache_orangefs_default_attrs ,
} ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute pc_acache_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( acache ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
2015-07-17 17:38:14 +03:00
NULL ) ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute pc_capcache_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( capcache ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
2015-07-17 17:38:14 +03:00
NULL ) ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute pc_ncache_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( ncache ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_service_op_show ,
2015-07-17 17:38:14 +03:00
NULL ) ;
static struct attribute * pc_orangefs_default_attrs [ ] = {
& pc_acache_attribute . attr ,
& pc_capcache_attribute . attr ,
& pc_ncache_attribute . attr ,
NULL ,
} ;
static struct kobj_type pc_orangefs_ktype = {
2016-08-15 22:01:30 +03:00
. sysfs_ops = & orangefs_sysfs_ops ,
2015-07-17 17:38:14 +03:00
. default_attrs = pc_orangefs_default_attrs ,
} ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute stats_reads_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( reads ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_int_show ,
2015-07-17 17:38:14 +03:00
NULL ) ;
2016-08-15 21:02:39 +03:00
static struct orangefs_attribute stats_writes_attribute =
2015-07-17 17:38:14 +03:00
__ATTR ( writes ,
0664 ,
2016-08-15 21:51:31 +03:00
sysfs_int_show ,
2015-07-17 17:38:14 +03:00
NULL ) ;
static struct attribute * stats_orangefs_default_attrs [ ] = {
& stats_reads_attribute . attr ,
& stats_writes_attribute . attr ,
NULL ,
} ;
static struct kobj_type stats_orangefs_ktype = {
2016-08-15 22:01:30 +03:00
. sysfs_ops = & orangefs_sysfs_ops ,
2015-07-17 17:38:14 +03:00
. default_attrs = stats_orangefs_default_attrs ,
} ;
2016-08-15 20:28:51 +03:00
static struct kobject * orangefs_obj ;
static struct kobject * acache_orangefs_obj ;
static struct kobject * capcache_orangefs_obj ;
static struct kobject * ccache_orangefs_obj ;
static struct kobject * ncache_orangefs_obj ;
static struct kobject * pc_orangefs_obj ;
static struct kobject * stats_orangefs_obj ;
2015-07-17 17:38:14 +03:00
int orangefs_sysfs_init ( void )
{
2016-03-14 22:30:39 +03:00
int rc = - EINVAL ;
2015-07-17 17:38:14 +03:00
gossip_debug ( GOSSIP_SYSFS_DEBUG , " orangefs_sysfs_init: start \n " ) ;
/* create /sys/fs/orangefs. */
orangefs_obj = kzalloc ( sizeof ( * orangefs_obj ) , GFP_KERNEL ) ;
2016-03-14 22:30:39 +03:00
if ( ! orangefs_obj )
2015-07-17 17:38:14 +03:00
goto out ;
2016-08-15 20:28:51 +03:00
rc = kobject_init_and_add ( orangefs_obj ,
2015-07-17 17:38:14 +03:00
& orangefs_ktype ,
fs_kobj ,
ORANGEFS_KOBJ_ID ) ;
2016-03-14 22:30:39 +03:00
if ( rc )
goto ofs_obj_bail ;
2015-07-17 17:38:14 +03:00
2016-08-15 20:28:51 +03:00
kobject_uevent ( orangefs_obj , KOBJ_ADD ) ;
2015-07-17 17:38:14 +03:00
/* create /sys/fs/orangefs/acache. */
acache_orangefs_obj = kzalloc ( sizeof ( * acache_orangefs_obj ) , GFP_KERNEL ) ;
if ( ! acache_orangefs_obj ) {
rc = - EINVAL ;
2016-03-14 22:30:39 +03:00
goto ofs_obj_bail ;
2015-07-17 17:38:14 +03:00
}
2016-08-15 20:28:51 +03:00
rc = kobject_init_and_add ( acache_orangefs_obj ,
2015-07-17 17:38:14 +03:00
& acache_orangefs_ktype ,
2016-08-15 20:28:51 +03:00
orangefs_obj ,
2015-07-17 17:38:14 +03:00
ACACHE_KOBJ_ID ) ;
2016-03-14 22:30:39 +03:00
if ( rc )
goto acache_obj_bail ;
2015-07-17 17:38:14 +03:00
2016-08-15 20:28:51 +03:00
kobject_uevent ( acache_orangefs_obj , KOBJ_ADD ) ;
2015-07-17 17:38:14 +03:00
/* create /sys/fs/orangefs/capcache. */
capcache_orangefs_obj =
kzalloc ( sizeof ( * capcache_orangefs_obj ) , GFP_KERNEL ) ;
if ( ! capcache_orangefs_obj ) {
rc = - EINVAL ;
2016-03-14 22:30:39 +03:00
goto acache_obj_bail ;
2015-07-17 17:38:14 +03:00
}
2016-08-15 20:28:51 +03:00
rc = kobject_init_and_add ( capcache_orangefs_obj ,
2015-07-17 17:38:14 +03:00
& capcache_orangefs_ktype ,
2016-08-15 20:28:51 +03:00
orangefs_obj ,
2015-07-17 17:38:14 +03:00
CAPCACHE_KOBJ_ID ) ;
2016-03-14 22:30:39 +03:00
if ( rc )
goto capcache_obj_bail ;
2015-07-17 17:38:14 +03:00
2016-08-15 20:28:51 +03:00
kobject_uevent ( capcache_orangefs_obj , KOBJ_ADD ) ;
2015-07-17 17:38:14 +03:00
/* create /sys/fs/orangefs/ccache. */
ccache_orangefs_obj =
kzalloc ( sizeof ( * ccache_orangefs_obj ) , GFP_KERNEL ) ;
if ( ! ccache_orangefs_obj ) {
rc = - EINVAL ;
2016-03-14 22:30:39 +03:00
goto capcache_obj_bail ;
2015-07-17 17:38:14 +03:00
}
2016-08-15 20:28:51 +03:00
rc = kobject_init_and_add ( ccache_orangefs_obj ,
2015-07-17 17:38:14 +03:00
& ccache_orangefs_ktype ,
2016-08-15 20:28:51 +03:00
orangefs_obj ,
2015-07-17 17:38:14 +03:00
CCACHE_KOBJ_ID ) ;
2016-03-14 22:30:39 +03:00
if ( rc )
goto ccache_obj_bail ;
2015-07-17 17:38:14 +03:00
2016-08-15 20:28:51 +03:00
kobject_uevent ( ccache_orangefs_obj , KOBJ_ADD ) ;
2015-07-17 17:38:14 +03:00
/* create /sys/fs/orangefs/ncache. */
ncache_orangefs_obj = kzalloc ( sizeof ( * ncache_orangefs_obj ) , GFP_KERNEL ) ;
if ( ! ncache_orangefs_obj ) {
rc = - EINVAL ;
2016-03-14 22:30:39 +03:00
goto ccache_obj_bail ;
2015-07-17 17:38:14 +03:00
}
2016-08-15 20:28:51 +03:00
rc = kobject_init_and_add ( ncache_orangefs_obj ,
2015-07-17 17:38:14 +03:00
& ncache_orangefs_ktype ,
2016-08-15 20:28:51 +03:00
orangefs_obj ,
2015-07-17 17:38:14 +03:00
NCACHE_KOBJ_ID ) ;
2016-03-14 22:30:39 +03:00
if ( rc )
goto ncache_obj_bail ;
2015-07-17 17:38:14 +03:00
2016-08-15 20:28:51 +03:00
kobject_uevent ( ncache_orangefs_obj , KOBJ_ADD ) ;
2015-07-17 17:38:14 +03:00
/* create /sys/fs/orangefs/perf_counters. */
pc_orangefs_obj = kzalloc ( sizeof ( * pc_orangefs_obj ) , GFP_KERNEL ) ;
if ( ! pc_orangefs_obj ) {
rc = - EINVAL ;
2016-03-14 22:30:39 +03:00
goto ncache_obj_bail ;
2015-07-17 17:38:14 +03:00
}
2016-08-15 20:28:51 +03:00
rc = kobject_init_and_add ( pc_orangefs_obj ,
2015-07-17 17:38:14 +03:00
& pc_orangefs_ktype ,
2016-08-15 20:28:51 +03:00
orangefs_obj ,
2015-07-17 17:38:14 +03:00
" perf_counters " ) ;
2016-03-14 22:30:39 +03:00
if ( rc )
goto pc_obj_bail ;
2015-07-17 17:38:14 +03:00
2016-08-15 20:28:51 +03:00
kobject_uevent ( pc_orangefs_obj , KOBJ_ADD ) ;
2015-07-17 17:38:14 +03:00
/* create /sys/fs/orangefs/stats. */
stats_orangefs_obj = kzalloc ( sizeof ( * stats_orangefs_obj ) , GFP_KERNEL ) ;
if ( ! stats_orangefs_obj ) {
rc = - EINVAL ;
2016-03-14 22:30:39 +03:00
goto pc_obj_bail ;
2015-07-17 17:38:14 +03:00
}
2016-08-15 20:28:51 +03:00
rc = kobject_init_and_add ( stats_orangefs_obj ,
2015-07-17 17:38:14 +03:00
& stats_orangefs_ktype ,
2016-08-15 20:28:51 +03:00
orangefs_obj ,
2015-07-17 17:38:14 +03:00
STATS_KOBJ_ID ) ;
2016-03-14 22:30:39 +03:00
if ( rc )
goto stats_obj_bail ;
2015-07-17 17:38:14 +03:00
2016-08-15 20:28:51 +03:00
kobject_uevent ( stats_orangefs_obj , KOBJ_ADD ) ;
2016-03-14 22:30:39 +03:00
goto out ;
stats_obj_bail :
2016-08-15 20:28:51 +03:00
kobject_put ( stats_orangefs_obj ) ;
2016-03-14 22:30:39 +03:00
pc_obj_bail :
2016-08-15 20:28:51 +03:00
kobject_put ( pc_orangefs_obj ) ;
2016-03-14 22:30:39 +03:00
ncache_obj_bail :
2016-08-15 20:28:51 +03:00
kobject_put ( ncache_orangefs_obj ) ;
2016-03-14 22:30:39 +03:00
ccache_obj_bail :
2016-08-15 20:28:51 +03:00
kobject_put ( ccache_orangefs_obj ) ;
2016-03-14 22:30:39 +03:00
capcache_obj_bail :
2016-08-15 20:28:51 +03:00
kobject_put ( capcache_orangefs_obj ) ;
2016-03-14 22:30:39 +03:00
acache_obj_bail :
2016-08-15 20:28:51 +03:00
kobject_put ( acache_orangefs_obj ) ;
2016-03-14 22:30:39 +03:00
ofs_obj_bail :
2016-08-15 20:28:51 +03:00
kobject_put ( orangefs_obj ) ;
2015-07-17 17:38:14 +03:00
out :
return rc ;
}
void orangefs_sysfs_exit ( void )
{
gossip_debug ( GOSSIP_SYSFS_DEBUG , " orangefs_sysfs_exit: start \n " ) ;
2016-08-15 20:28:51 +03:00
kobject_put ( acache_orangefs_obj ) ;
kobject_put ( capcache_orangefs_obj ) ;
kobject_put ( ccache_orangefs_obj ) ;
kobject_put ( ncache_orangefs_obj ) ;
kobject_put ( pc_orangefs_obj ) ;
kobject_put ( stats_orangefs_obj ) ;
kobject_put ( orangefs_obj ) ;
2015-07-17 17:38:14 +03:00
}