2013-11-28 23:54:31 +04:00
/*
* fs / kernfs / kernfs - internal . h - kernfs internal header file
*
* Copyright ( c ) 2001 - 3 Patrick Mochel
* Copyright ( c ) 2007 SUSE Linux Products GmbH
* Copyright ( c ) 2007 , 2013 Tejun Heo < teheo @ suse . de >
*
* This file is released under the GPLv2 .
*/
# ifndef __KERNFS_INTERNAL_H
# define __KERNFS_INTERNAL_H
# include <linux/lockdep.h>
# include <linux/fs.h>
2013-11-28 23:54:33 +04:00
# include <linux/mutex.h>
2013-11-24 02:40:02 +04:00
# include <linux/xattr.h>
2013-11-28 23:54:31 +04:00
# include <linux/kernfs.h>
2013-12-11 23:11:55 +04:00
struct kernfs_iattrs {
2013-11-24 02:40:01 +04:00
struct iattr ia_iattr ;
void * ia_secdata ;
u32 ia_secdata_len ;
2013-11-24 02:40:02 +04:00
struct simple_xattrs xattrs ;
2013-11-28 23:54:31 +04:00
} ;
2014-01-14 02:36:03 +04:00
# define KN_DEACTIVATED_BIAS INT_MIN
2013-11-28 23:54:31 +04:00
2013-12-11 23:11:56 +04:00
/* KERNFS_TYPE_MASK and types are defined in include/linux/kernfs.h */
2013-11-28 23:54:31 +04:00
2013-11-28 23:54:40 +04:00
/**
2013-12-11 23:11:53 +04:00
* kernfs_root - find out the kernfs_root a kernfs_node belongs to
* @ kn : kernfs_node of interest
2013-11-28 23:54:40 +04:00
*
2013-12-11 23:11:53 +04:00
* Return the kernfs_root @ kn belongs to .
2013-11-28 23:54:40 +04:00
*/
2013-12-11 23:11:53 +04:00
static inline struct kernfs_root * kernfs_root ( struct kernfs_node * kn )
2013-11-28 23:54:40 +04:00
{
/* if parent exists, it's always a dir; otherwise, @sd is a dir */
2013-12-11 23:11:54 +04:00
if ( kn - > parent )
kn = kn - > parent ;
return kn - > dir . root ;
2013-11-28 23:54:40 +04:00
}
2014-01-14 02:20:56 +04:00
/*
* Context structure to be used while adding / removing nodes .
*/
struct kernfs_addrm_cxt {
struct kernfs_node * removed ;
} ;
2013-11-28 23:54:44 +04:00
/*
* mount . c
*/
2013-12-11 23:11:55 +04:00
struct kernfs_super_info {
2013-11-28 23:54:44 +04:00
/*
* The root associated with this super_block . Each super_block is
* identified by the root and ns it ' s associated with .
*/
struct kernfs_root * root ;
/*
2013-12-11 23:11:53 +04:00
* Each sb is associated with one namespace tag , currently the
2013-12-11 23:11:55 +04:00
* network namespace of the task which mounted this kernfs
* instance . If multiple tags become necessary , make the following
* an array and compare kernfs_node tag against every entry .
2013-11-28 23:54:44 +04:00
*/
const void * ns ;
} ;
2013-12-11 23:11:55 +04:00
# define kernfs_info(SB) ((struct kernfs_super_info *)(SB->s_fs_info))
2013-11-28 23:54:44 +04:00
2013-12-11 23:11:57 +04:00
extern struct kmem_cache * kernfs_node_cache ;
2013-11-28 23:54:44 +04:00
2013-11-28 23:54:32 +04:00
/*
* inode . c
*/
2013-12-11 23:11:58 +04:00
struct inode * kernfs_get_inode ( struct super_block * sb , struct kernfs_node * kn ) ;
void kernfs_evict_inode ( struct inode * inode ) ;
int kernfs_iop_permission ( struct inode * inode , int mask ) ;
int kernfs_iop_setattr ( struct dentry * dentry , struct iattr * iattr ) ;
int kernfs_iop_getattr ( struct vfsmount * mnt , struct dentry * dentry ,
struct kstat * stat ) ;
int kernfs_iop_setxattr ( struct dentry * dentry , const char * name , const void * value ,
size_t size , int flags ) ;
int kernfs_iop_removexattr ( struct dentry * dentry , const char * name ) ;
ssize_t kernfs_iop_getxattr ( struct dentry * dentry , const char * name , void * buf ,
size_t size ) ;
ssize_t kernfs_iop_listxattr ( struct dentry * dentry , char * buf , size_t size ) ;
void kernfs_inode_init ( void ) ;
2013-11-28 23:54:32 +04:00
2013-11-28 23:54:33 +04:00
/*
* dir . c
*/
2013-12-11 23:11:57 +04:00
extern struct mutex kernfs_mutex ;
extern const struct dentry_operations kernfs_dops ;
extern const struct file_operations kernfs_dir_fops ;
extern const struct inode_operations kernfs_dir_iops ;
2013-11-28 23:54:33 +04:00
2013-12-11 23:11:58 +04:00
struct kernfs_node * kernfs_get_active ( struct kernfs_node * kn ) ;
void kernfs_put_active ( struct kernfs_node * kn ) ;
2014-01-14 02:20:56 +04:00
void kernfs_addrm_start ( struct kernfs_addrm_cxt * acxt ) ;
int kernfs_add_one ( struct kernfs_addrm_cxt * acxt , struct kernfs_node * kn ,
struct kernfs_node * parent ) ;
void kernfs_addrm_finish ( struct kernfs_addrm_cxt * acxt ) ;
2013-12-11 23:11:58 +04:00
struct kernfs_node * kernfs_new_node ( struct kernfs_root * root , const char * name ,
2013-12-12 01:02:57 +04:00
umode_t mode , unsigned flags ) ;
2013-11-28 23:54:33 +04:00
2013-11-28 23:54:34 +04:00
/*
* file . c
*/
2013-12-11 23:11:57 +04:00
extern const struct file_operations kernfs_file_fops ;
2013-11-28 23:54:34 +04:00
2014-01-14 02:27:16 +04:00
void kernfs_unmap_bin_file ( struct kernfs_node * kn ) ;
2013-11-28 23:54:34 +04:00
2013-11-28 23:54:35 +04:00
/*
* symlink . c
*/
2013-12-11 23:11:57 +04:00
extern const struct inode_operations kernfs_symlink_iops ;
2013-11-28 23:54:35 +04:00
2013-11-28 23:54:31 +04:00
# endif /* __KERNFS_INTERNAL_H */