2009-11-05 02:12:35 +03:00
/*
* Copyright ( C ) 1995 - 1997 Olaf Kirch < okir @ monad . swb . de >
*/
# ifndef LINUX_NFSD_VFS_H
# define LINUX_NFSD_VFS_H
2009-12-05 03:36:06 +03:00
# include "nfsfh.h"
2013-01-24 11:18:08 +04:00
# include "nfsd.h"
2009-12-05 03:36:06 +03:00
2009-11-05 02:12:35 +03:00
/*
* Flags for nfsd_permission
*/
2011-08-25 22:23:39 +04:00
# define NFSD_MAY_NOP 0
# define NFSD_MAY_EXEC 0x001 /* == MAY_EXEC */
# define NFSD_MAY_WRITE 0x002 /* == MAY_WRITE */
# define NFSD_MAY_READ 0x004 /* == MAY_READ */
# define NFSD_MAY_SATTR 0x008
# define NFSD_MAY_TRUNC 0x010
# define NFSD_MAY_LOCK 0x020
# define NFSD_MAY_MASK 0x03f
2011-04-10 18:35:12 +04:00
/* extra hints to permission and open routines: */
2011-08-25 22:23:39 +04:00
# define NFSD_MAY_OWNER_OVERRIDE 0x040
# define NFSD_MAY_LOCAL_ACCESS 0x080 /* for device special files */
# define NFSD_MAY_BYPASS_GSS_ON_ROOT 0x100
# define NFSD_MAY_NOT_BREAK_LEASE 0x200
# define NFSD_MAY_BYPASS_GSS 0x400
# define NFSD_MAY_READ_IF_EXEC 0x800
2009-11-05 02:12:35 +03:00
2012-03-19 06:44:50 +04:00
# define NFSD_MAY_64BIT_COOKIE 0x1000 /* 64 bit readdir cookies for >= NFSv3 */
2009-11-05 02:12:35 +03:00
# define NFSD_MAY_CREATE (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
# define NFSD_MAY_REMOVE (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
/*
* Callback function for readdir
*/
2014-10-30 19:37:34 +03:00
typedef int ( * nfsd_filldir_t ) ( void * , const char * , int , loff_t , u64 , unsigned ) ;
2009-11-05 02:12:35 +03:00
/* nfsd/vfs.c */
int nfsd_racache_init ( int ) ;
void nfsd_racache_shutdown ( void ) ;
int nfsd_cross_mnt ( struct svc_rqst * rqstp , struct dentry * * dpp ,
struct svc_export * * expp ) ;
__be32 nfsd_lookup ( struct svc_rqst * , struct svc_fh * ,
const char * , unsigned int , struct svc_fh * ) ;
__be32 nfsd_lookup_dentry ( struct svc_rqst * , struct svc_fh * ,
const char * , unsigned int ,
struct svc_export * * , struct dentry * * ) ;
__be32 nfsd_setattr ( struct svc_rqst * , struct svc_fh * ,
struct iattr * , int , time_t ) ;
2009-10-26 04:43:01 +03:00
int nfsd_mountpoint ( struct dentry * , struct svc_export * ) ;
2009-11-05 02:12:35 +03:00
# ifdef CONFIG_NFSD_V4
2013-05-02 21:19:10 +04:00
__be32 nfsd4_set_nfs4_label ( struct svc_rqst * , struct svc_fh * ,
struct xdr_netobj * ) ;
2014-11-07 22:44:26 +03:00
__be32 nfsd4_vfs_fallocate ( struct svc_rqst * , struct svc_fh * ,
struct file * , loff_t , loff_t , int ) ;
2015-12-03 14:59:52 +03:00
__be32 nfsd4_clone_file_range ( struct file * , u64 , struct file * ,
u64 , u64 ) ;
2009-11-05 02:12:35 +03:00
# endif /* CONFIG_NFSD_V4 */
__be32 nfsd_create ( struct svc_rqst * , struct svc_fh * ,
char * name , int len , struct iattr * attrs ,
int type , dev_t rdev , struct svc_fh * res ) ;
# ifdef CONFIG_NFSD_V3
__be32 nfsd_access ( struct svc_rqst * , struct svc_fh * , u32 * , u32 * ) ;
2011-04-20 13:06:25 +04:00
__be32 do_nfsd_create ( struct svc_rqst * , struct svc_fh * ,
2009-11-05 02:12:35 +03:00
char * name , int len , struct iattr * attrs ,
struct svc_fh * res , int createmode ,
2011-10-13 19:37:11 +04:00
u32 * verifier , bool * truncp , bool * created ) ;
2009-11-05 02:12:35 +03:00
__be32 nfsd_commit ( struct svc_rqst * , struct svc_fh * ,
loff_t , unsigned long ) ;
# endif /* CONFIG_NFSD_V3 */
2011-07-26 11:30:54 +04:00
__be32 nfsd_open ( struct svc_rqst * , struct svc_fh * , umode_t ,
2009-11-05 02:12:35 +03:00
int , struct file * * ) ;
2014-03-19 01:01:51 +04:00
struct raparms ;
2014-06-17 15:44:13 +04:00
__be32 nfsd_splice_read ( struct svc_rqst * ,
2014-03-19 01:01:51 +04:00
struct file * , loff_t , unsigned long * ) ;
2014-06-17 15:44:13 +04:00
__be32 nfsd_readv ( struct file * , loff_t , struct kvec * , int ,
2014-03-19 01:01:51 +04:00
unsigned long * ) ;
2010-07-30 19:33:32 +04:00
__be32 nfsd_read ( struct svc_rqst * , struct svc_fh * ,
loff_t , struct kvec * , int , unsigned long * ) ;
2009-11-05 02:12:35 +03:00
__be32 nfsd_write ( struct svc_rqst * , struct svc_fh * , struct file * ,
loff_t , struct kvec * , int , unsigned long * , int * ) ;
2015-06-18 17:45:00 +03:00
__be32 nfsd_vfs_write ( struct svc_rqst * rqstp , struct svc_fh * fhp ,
struct file * file , loff_t offset ,
struct kvec * vec , int vlen , unsigned long * cnt ,
int * stablep ) ;
2009-11-05 02:12:35 +03:00
__be32 nfsd_readlink ( struct svc_rqst * , struct svc_fh * ,
char * , int * ) ;
__be32 nfsd_symlink ( struct svc_rqst * , struct svc_fh * ,
2014-06-20 19:52:21 +04:00
char * name , int len , char * path ,
2014-07-01 13:48:02 +04:00
struct svc_fh * res ) ;
2009-11-05 02:12:35 +03:00
__be32 nfsd_link ( struct svc_rqst * , struct svc_fh * ,
char * , int , struct svc_fh * ) ;
__be32 nfsd_rename ( struct svc_rqst * ,
struct svc_fh * , char * , int ,
struct svc_fh * , char * , int ) ;
__be32 nfsd_unlink ( struct svc_rqst * , struct svc_fh * , int type ,
char * name , int len ) ;
__be32 nfsd_readdir ( struct svc_rqst * , struct svc_fh * ,
2014-10-30 19:37:34 +03:00
loff_t * , struct readdir_cd * , nfsd_filldir_t ) ;
2009-11-05 02:12:35 +03:00
__be32 nfsd_statfs ( struct svc_rqst * , struct svc_fh * ,
struct kstatfs * , int access ) ;
__be32 nfsd_permission ( struct svc_rqst * , struct svc_export * ,
struct dentry * , int ) ;
2015-06-18 17:44:58 +03:00
struct raparms * nfsd_init_raparms ( struct file * file ) ;
void nfsd_put_raparams ( struct file * file , struct raparms * ra ) ;
2011-11-23 21:03:18 +04:00
static inline int fh_want_write ( struct svc_fh * fh )
{
2012-06-12 18:20:33 +04:00
int ret = mnt_want_write ( fh - > fh_export - > ex_path . mnt ) ;
if ( ! ret )
2015-09-17 15:28:39 +03:00
fh - > fh_want_write = true ;
2012-06-12 18:20:33 +04:00
return ret ;
2011-11-23 21:03:18 +04:00
}
static inline void fh_drop_write ( struct svc_fh * fh )
{
2012-06-12 18:20:33 +04:00
if ( fh - > fh_want_write ) {
2015-09-17 15:28:39 +03:00
fh - > fh_want_write = false ;
2012-06-12 18:20:33 +04:00
mnt_drop_write ( fh - > fh_export - > ex_path . mnt ) ;
}
2011-11-23 21:03:18 +04:00
}
2013-01-24 11:18:08 +04:00
static inline __be32 fh_getattr ( struct svc_fh * fh , struct kstat * stat )
{
struct path p = { . mnt = fh - > fh_export - > ex_path . mnt ,
. dentry = fh - > fh_dentry } ;
return nfserrno ( vfs_getattr ( & p , stat ) ) ;
}
2015-07-30 16:55:02 +03:00
static inline int nfsd_create_is_exclusive ( int createmode )
{
return createmode = = NFS3_CREATE_EXCLUSIVE
| | createmode = = NFS4_CREATE_EXCLUSIVE4_1 ;
}
2009-11-05 02:12:35 +03:00
# endif /* LINUX_NFSD_VFS_H */