2013-11-24 18:54:58 +04:00
/*
* fs / kernfs / inode . c - kernfs inode implementation
*
* Copyright ( c ) 2001 - 3 Patrick Mochel
* Copyright ( c ) 2007 SUSE Linux Products GmbH
* Copyright ( c ) 2007 , 2013 Tejun Heo < tj @ kernel . org >
*
* This file is released under the GPLv2 .
*/
2013-11-28 23:54:32 +04:00
# include <linux/pagemap.h>
# include <linux/backing-dev.h>
# include <linux/capability.h>
# include <linux/errno.h>
# include <linux/slab.h>
# include <linux/xattr.h>
# include <linux/security.h>
# include "kernfs-internal.h"
2013-12-11 23:11:57 +04:00
static const struct address_space_operations kernfs_aops = {
2013-11-28 23:54:32 +04:00
. readpage = simple_readpage ,
. write_begin = simple_write_begin ,
. write_end = simple_write_end ,
} ;
2013-12-11 23:11:57 +04:00
static const struct inode_operations kernfs_iops = {
2013-12-11 23:11:58 +04:00
. permission = kernfs_iop_permission ,
. setattr = kernfs_iop_setattr ,
. getattr = kernfs_iop_getattr ,
. setxattr = kernfs_iop_setxattr ,
. removexattr = kernfs_iop_removexattr ,
. getxattr = kernfs_iop_getxattr ,
. listxattr = kernfs_iop_listxattr ,
2013-11-28 23:54:32 +04:00
} ;
2013-12-11 23:11:55 +04:00
static struct kernfs_iattrs * kernfs_iattrs ( struct kernfs_node * kn )
2013-11-28 23:54:32 +04:00
{
2014-04-03 00:40:52 +04:00
static DEFINE_MUTEX ( iattr_mutex ) ;
struct kernfs_iattrs * ret ;
2013-11-28 23:54:32 +04:00
struct iattr * iattrs ;
2014-04-03 00:40:52 +04:00
mutex_lock ( & iattr_mutex ) ;
2013-12-11 23:11:54 +04:00
if ( kn - > iattr )
2014-04-03 00:40:52 +04:00
goto out_unlock ;
2013-11-24 02:40:01 +04:00
2013-12-11 23:11:55 +04:00
kn - > iattr = kzalloc ( sizeof ( struct kernfs_iattrs ) , GFP_KERNEL ) ;
2013-12-11 23:11:54 +04:00
if ( ! kn - > iattr )
2014-04-03 00:40:52 +04:00
goto out_unlock ;
2013-12-11 23:11:54 +04:00
iattrs = & kn - > iattr - > ia_iattr ;
2013-11-28 23:54:32 +04:00
/* assign default attributes */
2013-12-11 23:11:54 +04:00
iattrs - > ia_mode = kn - > mode ;
2013-11-28 23:54:32 +04:00
iattrs - > ia_uid = GLOBAL_ROOT_UID ;
iattrs - > ia_gid = GLOBAL_ROOT_GID ;
iattrs - > ia_atime = iattrs - > ia_mtime = iattrs - > ia_ctime = CURRENT_TIME ;
2013-12-11 23:11:54 +04:00
simple_xattrs_init ( & kn - > iattr - > xattrs ) ;
2014-04-03 00:40:52 +04:00
out_unlock :
ret = kn - > iattr ;
mutex_unlock ( & iattr_mutex ) ;
return ret ;
2013-11-28 23:54:32 +04:00
}
2013-12-11 23:11:53 +04:00
static int __kernfs_setattr ( struct kernfs_node * kn , const struct iattr * iattr )
2013-11-28 23:54:32 +04:00
{
2013-12-11 23:11:55 +04:00
struct kernfs_iattrs * attrs ;
2013-11-28 23:54:32 +04:00
struct iattr * iattrs ;
unsigned int ia_valid = iattr - > ia_valid ;
2013-12-11 23:11:55 +04:00
attrs = kernfs_iattrs ( kn ) ;
2013-11-24 02:40:01 +04:00
if ( ! attrs )
return - ENOMEM ;
2013-11-28 23:54:32 +04:00
2013-11-24 02:40:01 +04:00
iattrs = & attrs - > ia_iattr ;
2013-11-28 23:54:32 +04:00
if ( ia_valid & ATTR_UID )
iattrs - > ia_uid = iattr - > ia_uid ;
if ( ia_valid & ATTR_GID )
iattrs - > ia_gid = iattr - > ia_gid ;
if ( ia_valid & ATTR_ATIME )
iattrs - > ia_atime = iattr - > ia_atime ;
if ( ia_valid & ATTR_MTIME )
iattrs - > ia_mtime = iattr - > ia_mtime ;
if ( ia_valid & ATTR_CTIME )
iattrs - > ia_ctime = iattr - > ia_ctime ;
if ( ia_valid & ATTR_MODE ) {
umode_t mode = iattr - > ia_mode ;
2013-12-11 23:11:54 +04:00
iattrs - > ia_mode = kn - > mode = mode ;
2013-11-28 23:54:32 +04:00
}
return 0 ;
}
/**
* kernfs_setattr - set iattr on a node
2013-12-11 23:11:53 +04:00
* @ kn : target node
2013-11-28 23:54:32 +04:00
* @ iattr : iattr to set
*
* Returns 0 on success , - errno on failure .
*/
2013-12-11 23:11:53 +04:00
int kernfs_setattr ( struct kernfs_node * kn , const struct iattr * iattr )
2013-11-28 23:54:32 +04:00
{
int ret ;
2013-12-11 23:11:57 +04:00
mutex_lock ( & kernfs_mutex ) ;
2013-12-11 23:11:53 +04:00
ret = __kernfs_setattr ( kn , iattr ) ;
2013-12-11 23:11:57 +04:00
mutex_unlock ( & kernfs_mutex ) ;
2013-11-28 23:54:32 +04:00
return ret ;
}
2013-12-11 23:11:58 +04:00
int kernfs_iop_setattr ( struct dentry * dentry , struct iattr * iattr )
2013-11-28 23:54:32 +04:00
{
2015-03-18 01:25:59 +03:00
struct inode * inode = d_inode ( dentry ) ;
2013-12-11 23:11:53 +04:00
struct kernfs_node * kn = dentry - > d_fsdata ;
2013-11-28 23:54:32 +04:00
int error ;
2013-12-11 23:11:53 +04:00
if ( ! kn )
2013-11-28 23:54:32 +04:00
return - EINVAL ;
2013-12-11 23:11:57 +04:00
mutex_lock ( & kernfs_mutex ) ;
2013-11-28 23:54:32 +04:00
error = inode_change_ok ( inode , iattr ) ;
if ( error )
goto out ;
2013-12-11 23:11:53 +04:00
error = __kernfs_setattr ( kn , iattr ) ;
2013-11-28 23:54:32 +04:00
if ( error )
goto out ;
/* this ignores size changes */
setattr_copy ( inode , iattr ) ;
out :
2013-12-11 23:11:57 +04:00
mutex_unlock ( & kernfs_mutex ) ;
2013-11-28 23:54:32 +04:00
return error ;
}
2013-12-11 23:11:58 +04:00
static int kernfs_node_setsecdata ( struct kernfs_node * kn , void * * secdata ,
u32 * secdata_len )
2013-11-28 23:54:32 +04:00
{
2013-12-11 23:11:55 +04:00
struct kernfs_iattrs * attrs ;
2013-11-28 23:54:32 +04:00
void * old_secdata ;
size_t old_secdata_len ;
2013-12-11 23:11:55 +04:00
attrs = kernfs_iattrs ( kn ) ;
2013-11-24 02:40:01 +04:00
if ( ! attrs )
return - ENOMEM ;
2013-11-28 23:54:32 +04:00
2013-11-24 02:40:01 +04:00
old_secdata = attrs - > ia_secdata ;
old_secdata_len = attrs - > ia_secdata_len ;
2013-11-28 23:54:32 +04:00
2013-11-24 02:40:01 +04:00
attrs - > ia_secdata = * secdata ;
attrs - > ia_secdata_len = * secdata_len ;
2013-11-28 23:54:32 +04:00
* secdata = old_secdata ;
* secdata_len = old_secdata_len ;
return 0 ;
}
2013-12-11 23:11:58 +04:00
int kernfs_iop_setxattr ( struct dentry * dentry , const char * name ,
const void * value , size_t size , int flags )
2013-11-28 23:54:32 +04:00
{
2013-12-11 23:11:53 +04:00
struct kernfs_node * kn = dentry - > d_fsdata ;
2013-12-11 23:11:55 +04:00
struct kernfs_iattrs * attrs ;
2013-11-28 23:54:32 +04:00
void * secdata ;
int error ;
u32 secdata_len = 0 ;
2013-12-11 23:11:55 +04:00
attrs = kernfs_iattrs ( kn ) ;
2013-11-24 02:40:02 +04:00
if ( ! attrs )
return - ENOMEM ;
2013-11-28 23:54:32 +04:00
if ( ! strncmp ( name , XATTR_SECURITY_PREFIX , XATTR_SECURITY_PREFIX_LEN ) ) {
const char * suffix = name + XATTR_SECURITY_PREFIX_LEN ;
2015-03-18 01:25:59 +03:00
error = security_inode_setsecurity ( d_inode ( dentry ) , suffix ,
2013-11-28 23:54:32 +04:00
value , size , flags ) ;
if ( error )
2013-11-24 02:40:02 +04:00
return error ;
2015-03-18 01:25:59 +03:00
error = security_inode_getsecctx ( d_inode ( dentry ) ,
2013-11-28 23:54:32 +04:00
& secdata , & secdata_len ) ;
if ( error )
2013-11-24 02:40:02 +04:00
return error ;
2013-11-28 23:54:32 +04:00
2013-12-11 23:11:57 +04:00
mutex_lock ( & kernfs_mutex ) ;
2013-12-11 23:11:58 +04:00
error = kernfs_node_setsecdata ( kn , & secdata , & secdata_len ) ;
2013-12-11 23:11:57 +04:00
mutex_unlock ( & kernfs_mutex ) ;
2013-11-28 23:54:32 +04:00
if ( secdata )
security_release_secctx ( secdata , secdata_len ) ;
2013-11-24 02:40:02 +04:00
return error ;
} else if ( ! strncmp ( name , XATTR_TRUSTED_PREFIX , XATTR_TRUSTED_PREFIX_LEN ) ) {
return simple_xattr_set ( & attrs - > xattrs , name , value , size ,
flags ) ;
}
return - EINVAL ;
}
2013-12-11 23:11:58 +04:00
int kernfs_iop_removexattr ( struct dentry * dentry , const char * name )
2013-11-24 02:40:02 +04:00
{
2013-12-11 23:11:53 +04:00
struct kernfs_node * kn = dentry - > d_fsdata ;
2013-12-11 23:11:55 +04:00
struct kernfs_iattrs * attrs ;
2013-11-24 02:40:02 +04:00
2013-12-11 23:11:55 +04:00
attrs = kernfs_iattrs ( kn ) ;
2013-11-24 02:40:02 +04:00
if ( ! attrs )
return - ENOMEM ;
return simple_xattr_remove ( & attrs - > xattrs , name ) ;
}
2013-12-11 23:11:58 +04:00
ssize_t kernfs_iop_getxattr ( struct dentry * dentry , const char * name , void * buf ,
size_t size )
2013-11-24 02:40:02 +04:00
{
2013-12-11 23:11:53 +04:00
struct kernfs_node * kn = dentry - > d_fsdata ;
2013-12-11 23:11:55 +04:00
struct kernfs_iattrs * attrs ;
2013-11-24 02:40:02 +04:00
2013-12-11 23:11:55 +04:00
attrs = kernfs_iattrs ( kn ) ;
2013-11-24 02:40:02 +04:00
if ( ! attrs )
return - ENOMEM ;
return simple_xattr_get ( & attrs - > xattrs , name , buf , size ) ;
}
2013-12-11 23:11:58 +04:00
ssize_t kernfs_iop_listxattr ( struct dentry * dentry , char * buf , size_t size )
2013-11-24 02:40:02 +04:00
{
2013-12-11 23:11:53 +04:00
struct kernfs_node * kn = dentry - > d_fsdata ;
2013-12-11 23:11:55 +04:00
struct kernfs_iattrs * attrs ;
2013-11-24 02:40:02 +04:00
2013-12-11 23:11:55 +04:00
attrs = kernfs_iattrs ( kn ) ;
2013-11-24 02:40:02 +04:00
if ( ! attrs )
return - ENOMEM ;
return simple_xattr_list ( & attrs - > xattrs , buf , size ) ;
2013-11-28 23:54:32 +04:00
}
static inline void set_default_inode_attr ( struct inode * inode , umode_t mode )
{
inode - > i_mode = mode ;
inode - > i_atime = inode - > i_mtime = inode - > i_ctime = CURRENT_TIME ;
}
static inline void set_inode_attr ( struct inode * inode , struct iattr * iattr )
{
inode - > i_uid = iattr - > ia_uid ;
inode - > i_gid = iattr - > ia_gid ;
inode - > i_atime = iattr - > ia_atime ;
inode - > i_mtime = iattr - > ia_mtime ;
inode - > i_ctime = iattr - > ia_ctime ;
}
2013-12-11 23:11:58 +04:00
static void kernfs_refresh_inode ( struct kernfs_node * kn , struct inode * inode )
2013-11-28 23:54:32 +04:00
{
2013-12-11 23:11:55 +04:00
struct kernfs_iattrs * attrs = kn - > iattr ;
2013-11-28 23:54:32 +04:00
2013-12-11 23:11:54 +04:00
inode - > i_mode = kn - > mode ;
2013-11-24 02:40:01 +04:00
if ( attrs ) {
2013-12-11 23:11:53 +04:00
/*
* kernfs_node has non - default attributes get them from
* persistent copy in kernfs_node .
2013-11-28 23:54:32 +04:00
*/
2013-11-24 02:40:01 +04:00
set_inode_attr ( inode , & attrs - > ia_iattr ) ;
security_inode_notifysecctx ( inode , attrs - > ia_secdata ,
attrs - > ia_secdata_len ) ;
2013-11-28 23:54:32 +04:00
}
2013-12-11 23:11:56 +04:00
if ( kernfs_type ( kn ) = = KERNFS_DIR )
2013-12-11 23:11:54 +04:00
set_nlink ( inode , kn - > dir . subdirs + 2 ) ;
2013-11-28 23:54:32 +04:00
}
2013-12-11 23:11:58 +04:00
int kernfs_iop_getattr ( struct vfsmount * mnt , struct dentry * dentry ,
struct kstat * stat )
2013-11-28 23:54:32 +04:00
{
2013-12-11 23:11:53 +04:00
struct kernfs_node * kn = dentry - > d_fsdata ;
2015-03-18 01:25:59 +03:00
struct inode * inode = d_inode ( dentry ) ;
2013-11-28 23:54:32 +04:00
2013-12-11 23:11:57 +04:00
mutex_lock ( & kernfs_mutex ) ;
2013-12-11 23:11:58 +04:00
kernfs_refresh_inode ( kn , inode ) ;
2013-12-11 23:11:57 +04:00
mutex_unlock ( & kernfs_mutex ) ;
2013-11-28 23:54:32 +04:00
generic_fillattr ( inode , stat ) ;
return 0 ;
}
2013-12-11 23:11:58 +04:00
static void kernfs_init_inode ( struct kernfs_node * kn , struct inode * inode )
2013-11-28 23:54:32 +04:00
{
2013-12-11 23:11:53 +04:00
kernfs_get ( kn ) ;
inode - > i_private = kn ;
2013-12-11 23:11:57 +04:00
inode - > i_mapping - > a_ops = & kernfs_aops ;
inode - > i_op = & kernfs_iops ;
2013-11-28 23:54:32 +04:00
2013-12-11 23:11:54 +04:00
set_default_inode_attr ( inode , kn - > mode ) ;
2013-12-11 23:11:58 +04:00
kernfs_refresh_inode ( kn , inode ) ;
2013-11-28 23:54:32 +04:00
/* initialize inode according to type */
2013-12-11 23:11:56 +04:00
switch ( kernfs_type ( kn ) ) {
case KERNFS_DIR :
2013-12-11 23:11:57 +04:00
inode - > i_op = & kernfs_dir_iops ;
inode - > i_fop = & kernfs_dir_fops ;
2015-05-14 00:09:29 +03:00
if ( kn - > flags & KERNFS_EMPTY_DIR )
make_empty_dir_inode ( inode ) ;
2013-11-28 23:54:32 +04:00
break ;
2013-12-11 23:11:56 +04:00
case KERNFS_FILE :
2013-12-11 23:11:54 +04:00
inode - > i_size = kn - > attr . size ;
2013-12-11 23:11:57 +04:00
inode - > i_fop = & kernfs_file_fops ;
2013-11-28 23:54:32 +04:00
break ;
2013-12-11 23:11:56 +04:00
case KERNFS_LINK :
2013-12-11 23:11:57 +04:00
inode - > i_op = & kernfs_symlink_iops ;
2013-11-28 23:54:32 +04:00
break ;
default :
BUG ( ) ;
}
unlock_new_inode ( inode ) ;
}
/**
2013-12-11 23:11:58 +04:00
* kernfs_get_inode - get inode for kernfs_node
2013-11-28 23:54:32 +04:00
* @ sb : super block
2013-12-11 23:11:53 +04:00
* @ kn : kernfs_node to allocate inode for
2013-11-28 23:54:32 +04:00
*
2013-12-11 23:11:53 +04:00
* Get inode for @ kn . If such inode doesn ' t exist , a new inode is
* allocated and basics are initialized . New inode is returned
* locked .
2013-11-28 23:54:32 +04:00
*
* LOCKING :
* Kernel thread context ( may sleep ) .
*
* RETURNS :
* Pointer to allocated inode on success , NULL on failure .
*/
2013-12-11 23:11:58 +04:00
struct inode * kernfs_get_inode ( struct super_block * sb , struct kernfs_node * kn )
2013-11-28 23:54:32 +04:00
{
struct inode * inode ;
2013-12-11 23:11:54 +04:00
inode = iget_locked ( sb , kn - > ino ) ;
2013-11-28 23:54:32 +04:00
if ( inode & & ( inode - > i_state & I_NEW ) )
2013-12-11 23:11:58 +04:00
kernfs_init_inode ( kn , inode ) ;
2013-11-28 23:54:32 +04:00
return inode ;
}
/*
2013-12-11 23:11:58 +04:00
* The kernfs_node serves as both an inode and a directory entry for
* kernfs . To prevent the kernfs inode numbers from being freed
* prematurely we take a reference to kernfs_node from the kernfs inode . A
2013-11-28 23:54:32 +04:00
* super_operations . evict_inode ( ) implementation is needed to drop that
* reference upon inode destruction .
*/
2013-12-11 23:11:58 +04:00
void kernfs_evict_inode ( struct inode * inode )
2013-11-28 23:54:32 +04:00
{
2013-12-11 23:11:53 +04:00
struct kernfs_node * kn = inode - > i_private ;
2013-11-28 23:54:32 +04:00
2014-04-04 01:47:49 +04:00
truncate_inode_pages_final ( & inode - > i_data ) ;
2013-11-28 23:54:32 +04:00
clear_inode ( inode ) ;
2013-12-11 23:11:53 +04:00
kernfs_put ( kn ) ;
2013-11-28 23:54:32 +04:00
}
2013-12-11 23:11:58 +04:00
int kernfs_iop_permission ( struct inode * inode , int mask )
2013-11-28 23:54:32 +04:00
{
2013-12-11 23:11:53 +04:00
struct kernfs_node * kn ;
2013-11-28 23:54:32 +04:00
if ( mask & MAY_NOT_BLOCK )
return - ECHILD ;
2013-12-11 23:11:53 +04:00
kn = inode - > i_private ;
2013-11-28 23:54:32 +04:00
2013-12-11 23:11:57 +04:00
mutex_lock ( & kernfs_mutex ) ;
2013-12-11 23:11:58 +04:00
kernfs_refresh_inode ( kn , inode ) ;
2013-12-11 23:11:57 +04:00
mutex_unlock ( & kernfs_mutex ) ;
2013-11-28 23:54:32 +04:00
return generic_permission ( inode , mask ) ;
}