2005-04-17 02:20:36 +04:00
/*
* Hodge - podge collection of knfsd - related stuff .
* I will sort this out later .
*
* Copyright ( C ) 1995 - 1997 Olaf Kirch < okir @ monad . swb . de >
*/
# ifndef LINUX_NFSD_NFSD_H
# define LINUX_NFSD_NFSD_H
# include <linux/types.h>
# include <linux/mount.h>
2011-08-19 19:38:52 +04:00
# include <linux/nfs.h>
# include <linux/nfs2.h>
# include <linux/nfs3.h>
# include <linux/nfs4.h>
2014-05-06 21:37:13 +04:00
# include <linux/sunrpc/svc.h>
2011-08-19 19:38:52 +04:00
# include <linux/sunrpc/msg_prot.h>
2005-04-17 02:20:36 +04:00
# include <linux/nfsd/debug.h>
# include <linux/nfsd/stats.h>
2011-08-19 19:38:52 +04:00
2014-05-06 21:37:14 +04:00
# include "export.h"
2005-04-17 02:20:36 +04:00
/*
* nfsd version
*/
2013-05-02 21:18:57 +04:00
# define NFSD_SUPPORTED_MINOR_VERSION 2
2011-08-19 19:38:52 +04:00
/*
* Maximum blocksizes supported by daemon under various circumstances .
*/
# define NFSSVC_MAXBLKSIZE RPCSVC_MAXPAYLOAD
/* NFSv2 is limited by the protocol specification, see RFC 1094 */
# define NFSSVC_MAXBLKSIZE_V2 (8*1024)
/*
* Largest number of bytes we need to allocate for an NFS
* call or reply . Used to control buffer sizes . We use
* the length of v3 WRITE , READDIR and READDIR replies
* which are an RPC header , up to 26 XDR units of reply
* data , and some page data .
*
* Note that accuracy here doesn ' t matter too much as the
* size is rounded up to a page size when allocating space .
*/
# define NFSD_BUFSIZE ((RPC_MAX_HEADER_WITH_AUTH+26)*XDR_UNIT + NFSSVC_MAXBLKSIZE)
2005-04-17 02:20:36 +04:00
struct readdir_cd {
2006-10-20 10:28:56 +04:00
__be32 err ; /* 0, nfserr, or nfserr_eof */
2005-04-17 02:20:36 +04:00
} ;
2009-11-05 02:12:35 +03:00
2005-04-17 02:20:36 +04:00
extern struct svc_program nfsd_program ;
extern struct svc_version nfsd_version2 , nfsd_version3 ,
nfsd_version4 ;
2008-06-10 16:40:35 +04:00
extern struct mutex nfsd_mutex ;
2009-06-24 23:37:45 +04:00
extern spinlock_t nfsd_drc_lock ;
2013-02-23 04:35:47 +04:00
extern unsigned long nfsd_drc_max_mem ;
extern unsigned long nfsd_drc_mem_used ;
2008-02-20 23:49:00 +03:00
2009-09-23 03:43:43 +04:00
extern const struct seq_operations nfs_exports_op ;
2008-02-20 23:49:00 +03:00
2005-04-17 02:20:36 +04:00
/*
* Function prototypes .
*/
2012-12-10 13:19:25 +04:00
int nfsd_svc ( int nrservs , struct net * net ) ;
2006-10-20 10:29:02 +04:00
int nfsd_dispatch ( struct svc_rqst * rqstp , __be32 * statp ) ;
2005-04-17 02:20:36 +04:00
2012-12-06 15:23:24 +04:00
int nfsd_nrthreads ( struct net * ) ;
int nfsd_nrpools ( struct net * ) ;
int nfsd_get_nrthreads ( int n , int * , struct net * ) ;
2012-12-10 13:19:30 +04:00
int nfsd_set_nrthreads ( int n , int * , struct net * ) ;
2012-06-13 00:06:29 +04:00
int nfsd_pool_stats_open ( struct inode * , struct file * ) ;
int nfsd_pool_stats_release ( struct inode * , struct file * ) ;
2008-02-20 23:49:00 +03:00
2012-12-06 15:23:24 +04:00
void nfsd_destroy ( struct net * net ) ;
2012-07-03 16:46:41 +04:00
2005-06-22 21:16:26 +04:00
# if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
# ifdef CONFIG_NFSD_V2_ACL
extern struct svc_version nfsd_acl_version2 ;
# else
# define nfsd_acl_version2 NULL
# endif
# ifdef CONFIG_NFSD_V3_ACL
extern struct svc_version nfsd_acl_version3 ;
# else
# define nfsd_acl_version3 NULL
# endif
# endif
2006-10-02 13:17:46 +04:00
enum vers_op { NFSD_SET , NFSD_CLEAR , NFSD_TEST , NFSD_AVAIL } ;
int nfsd_vers ( int vers , enum vers_op change ) ;
2009-04-03 09:28:59 +04:00
int nfsd_minorversion ( u32 minorversion , enum vers_op change ) ;
2006-10-02 13:17:46 +04:00
void nfsd_reset_versions ( void ) ;
2012-12-10 13:19:20 +04:00
int nfsd_create_serv ( struct net * net ) ;
2006-10-02 13:17:46 +04:00
2006-10-04 13:15:48 +04:00
extern int nfsd_max_blksize ;
2005-04-17 02:20:36 +04:00
2009-09-09 23:06:05 +04:00
static inline int nfsd_v4client ( struct svc_rqst * rq )
{
return rq - > rq_prog = = NFS_PROGRAM & & rq - > rq_vers = = 4 ;
}
2005-04-17 02:20:36 +04:00
/*
* NFSv4 State
*/
# ifdef CONFIG_NFSD_V4
2013-02-23 04:35:47 +04:00
extern unsigned long max_delegations ;
2011-11-01 23:24:59 +04:00
void nfs4_state_init ( void ) ;
int nfsd4_init_slabs ( void ) ;
2007-08-01 23:30:59 +04:00
void nfsd4_free_slabs ( void ) ;
2009-09-15 23:56:50 +04:00
int nfs4_state_start ( void ) ;
2012-11-26 16:22:18 +04:00
int nfs4_state_start_net ( struct net * net ) ;
2005-04-17 02:20:36 +04:00
void nfs4_state_shutdown ( void ) ;
2012-11-26 16:22:18 +04:00
void nfs4_state_shutdown_net ( struct net * net ) ;
2005-04-17 02:20:36 +04:00
void nfs4_reset_lease ( time_t leasetime ) ;
2005-06-24 09:04:32 +04:00
int nfs4_reset_recoverydir ( char * recdir ) ;
2012-07-27 23:49:26 +04:00
char * nfs4_recoverydir ( void ) ;
2005-04-17 02:20:36 +04:00
# else
2011-11-01 23:24:59 +04:00
static inline void nfs4_state_init ( void ) { }
static inline int nfsd4_init_slabs ( void ) { return 0 ; }
2007-08-01 23:30:59 +04:00
static inline void nfsd4_free_slabs ( void ) { }
2009-09-17 11:03:06 +04:00
static inline int nfs4_state_start ( void ) { return 0 ; }
2012-11-26 16:22:18 +04:00
static inline int nfs4_state_start_net ( struct net * net ) { return 0 ; }
2007-08-01 23:30:59 +04:00
static inline void nfs4_state_shutdown ( void ) { }
2012-11-26 16:22:18 +04:00
static inline void nfs4_state_shutdown_net ( struct net * net ) { }
2007-08-01 23:30:59 +04:00
static inline void nfs4_reset_lease ( time_t leasetime ) { }
static inline int nfs4_reset_recoverydir ( char * recdir ) { return 0 ; }
2012-07-27 23:49:26 +04:00
static inline char * nfs4_recoverydir ( void ) { return NULL ; }
2005-04-17 02:20:36 +04:00
# endif
/*
* lockd binding
*/
void nfsd_lockd_init ( void ) ;
void nfsd_lockd_shutdown ( void ) ;
/*
* These macros provide pre - xdr ' ed values for faster operation .
*/
2009-02-12 04:16:58 +03:00
# define nfs_ok cpu_to_be32(NFS_OK)
# define nfserr_perm cpu_to_be32(NFSERR_PERM)
# define nfserr_noent cpu_to_be32(NFSERR_NOENT)
# define nfserr_io cpu_to_be32(NFSERR_IO)
# define nfserr_nxio cpu_to_be32(NFSERR_NXIO)
# define nfserr_eagain cpu_to_be32(NFSERR_EAGAIN)
# define nfserr_acces cpu_to_be32(NFSERR_ACCES)
# define nfserr_exist cpu_to_be32(NFSERR_EXIST)
# define nfserr_xdev cpu_to_be32(NFSERR_XDEV)
# define nfserr_nodev cpu_to_be32(NFSERR_NODEV)
# define nfserr_notdir cpu_to_be32(NFSERR_NOTDIR)
# define nfserr_isdir cpu_to_be32(NFSERR_ISDIR)
# define nfserr_inval cpu_to_be32(NFSERR_INVAL)
# define nfserr_fbig cpu_to_be32(NFSERR_FBIG)
# define nfserr_nospc cpu_to_be32(NFSERR_NOSPC)
# define nfserr_rofs cpu_to_be32(NFSERR_ROFS)
# define nfserr_mlink cpu_to_be32(NFSERR_MLINK)
# define nfserr_opnotsupp cpu_to_be32(NFSERR_OPNOTSUPP)
# define nfserr_nametoolong cpu_to_be32(NFSERR_NAMETOOLONG)
# define nfserr_notempty cpu_to_be32(NFSERR_NOTEMPTY)
# define nfserr_dquot cpu_to_be32(NFSERR_DQUOT)
# define nfserr_stale cpu_to_be32(NFSERR_STALE)
# define nfserr_remote cpu_to_be32(NFSERR_REMOTE)
# define nfserr_wflush cpu_to_be32(NFSERR_WFLUSH)
# define nfserr_badhandle cpu_to_be32(NFSERR_BADHANDLE)
# define nfserr_notsync cpu_to_be32(NFSERR_NOT_SYNC)
# define nfserr_badcookie cpu_to_be32(NFSERR_BAD_COOKIE)
# define nfserr_notsupp cpu_to_be32(NFSERR_NOTSUPP)
# define nfserr_toosmall cpu_to_be32(NFSERR_TOOSMALL)
# define nfserr_serverfault cpu_to_be32(NFSERR_SERVERFAULT)
# define nfserr_badtype cpu_to_be32(NFSERR_BADTYPE)
# define nfserr_jukebox cpu_to_be32(NFSERR_JUKEBOX)
# define nfserr_denied cpu_to_be32(NFSERR_DENIED)
# define nfserr_deadlock cpu_to_be32(NFSERR_DEADLOCK)
# define nfserr_expired cpu_to_be32(NFSERR_EXPIRED)
# define nfserr_bad_cookie cpu_to_be32(NFSERR_BAD_COOKIE)
# define nfserr_same cpu_to_be32(NFSERR_SAME)
# define nfserr_clid_inuse cpu_to_be32(NFSERR_CLID_INUSE)
# define nfserr_stale_clientid cpu_to_be32(NFSERR_STALE_CLIENTID)
# define nfserr_resource cpu_to_be32(NFSERR_RESOURCE)
# define nfserr_moved cpu_to_be32(NFSERR_MOVED)
# define nfserr_nofilehandle cpu_to_be32(NFSERR_NOFILEHANDLE)
# define nfserr_minor_vers_mismatch cpu_to_be32(NFSERR_MINOR_VERS_MISMATCH)
# define nfserr_share_denied cpu_to_be32(NFSERR_SHARE_DENIED)
# define nfserr_stale_stateid cpu_to_be32(NFSERR_STALE_STATEID)
# define nfserr_old_stateid cpu_to_be32(NFSERR_OLD_STATEID)
# define nfserr_bad_stateid cpu_to_be32(NFSERR_BAD_STATEID)
# define nfserr_bad_seqid cpu_to_be32(NFSERR_BAD_SEQID)
# define nfserr_symlink cpu_to_be32(NFSERR_SYMLINK)
# define nfserr_not_same cpu_to_be32(NFSERR_NOT_SAME)
2010-07-08 19:02:09 +04:00
# define nfserr_lock_range cpu_to_be32(NFSERR_LOCK_RANGE)
2009-02-12 04:16:58 +03:00
# define nfserr_restorefh cpu_to_be32(NFSERR_RESTOREFH)
# define nfserr_attrnotsupp cpu_to_be32(NFSERR_ATTRNOTSUPP)
# define nfserr_bad_xdr cpu_to_be32(NFSERR_BAD_XDR)
# define nfserr_openmode cpu_to_be32(NFSERR_OPENMODE)
2011-01-05 02:02:15 +03:00
# define nfserr_badowner cpu_to_be32(NFSERR_BADOWNER)
2009-02-12 04:16:58 +03:00
# define nfserr_locks_held cpu_to_be32(NFSERR_LOCKS_HELD)
# define nfserr_op_illegal cpu_to_be32(NFSERR_OP_ILLEGAL)
# define nfserr_grace cpu_to_be32(NFSERR_GRACE)
# define nfserr_no_grace cpu_to_be32(NFSERR_NO_GRACE)
# define nfserr_reclaim_bad cpu_to_be32(NFSERR_RECLAIM_BAD)
# define nfserr_badname cpu_to_be32(NFSERR_BADNAME)
# define nfserr_cb_path_down cpu_to_be32(NFSERR_CB_PATH_DOWN)
# define nfserr_locked cpu_to_be32(NFSERR_LOCKED)
# define nfserr_wrongsec cpu_to_be32(NFSERR_WRONGSEC)
2009-04-03 09:27:40 +04:00
# define nfserr_badiomode cpu_to_be32(NFS4ERR_BADIOMODE)
# define nfserr_badlayout cpu_to_be32(NFS4ERR_BADLAYOUT)
# define nfserr_bad_session_digest cpu_to_be32(NFS4ERR_BAD_SESSION_DIGEST)
# define nfserr_badsession cpu_to_be32(NFS4ERR_BADSESSION)
# define nfserr_badslot cpu_to_be32(NFS4ERR_BADSLOT)
# define nfserr_complete_already cpu_to_be32(NFS4ERR_COMPLETE_ALREADY)
# define nfserr_conn_not_bound_to_session cpu_to_be32(NFS4ERR_CONN_NOT_BOUND_TO_SESSION)
# define nfserr_deleg_already_wanted cpu_to_be32(NFS4ERR_DELEG_ALREADY_WANTED)
# define nfserr_back_chan_busy cpu_to_be32(NFS4ERR_BACK_CHAN_BUSY)
# define nfserr_layouttrylater cpu_to_be32(NFS4ERR_LAYOUTTRYLATER)
# define nfserr_layoutunavailable cpu_to_be32(NFS4ERR_LAYOUTUNAVAILABLE)
# define nfserr_nomatching_layout cpu_to_be32(NFS4ERR_NOMATCHING_LAYOUT)
# define nfserr_recallconflict cpu_to_be32(NFS4ERR_RECALLCONFLICT)
# define nfserr_unknown_layouttype cpu_to_be32(NFS4ERR_UNKNOWN_LAYOUTTYPE)
# define nfserr_seq_misordered cpu_to_be32(NFS4ERR_SEQ_MISORDERED)
# define nfserr_sequence_pos cpu_to_be32(NFS4ERR_SEQUENCE_POS)
# define nfserr_req_too_big cpu_to_be32(NFS4ERR_REQ_TOO_BIG)
# define nfserr_rep_too_big cpu_to_be32(NFS4ERR_REP_TOO_BIG)
# define nfserr_rep_too_big_to_cache cpu_to_be32(NFS4ERR_REP_TOO_BIG_TO_CACHE)
# define nfserr_retry_uncached_rep cpu_to_be32(NFS4ERR_RETRY_UNCACHED_REP)
# define nfserr_unsafe_compound cpu_to_be32(NFS4ERR_UNSAFE_COMPOUND)
# define nfserr_too_many_ops cpu_to_be32(NFS4ERR_TOO_MANY_OPS)
# define nfserr_op_not_in_session cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION)
# define nfserr_hash_alg_unsupp cpu_to_be32(NFS4ERR_HASH_ALG_UNSUPP)
# define nfserr_clientid_busy cpu_to_be32(NFS4ERR_CLIENTID_BUSY)
# define nfserr_pnfs_io_hole cpu_to_be32(NFS4ERR_PNFS_IO_HOLE)
# define nfserr_seq_false_retry cpu_to_be32(NFS4ERR_SEQ_FALSE_RETRY)
# define nfserr_bad_high_slot cpu_to_be32(NFS4ERR_BAD_HIGH_SLOT)
# define nfserr_deadsession cpu_to_be32(NFS4ERR_DEADSESSION)
# define nfserr_encr_alg_unsupp cpu_to_be32(NFS4ERR_ENCR_ALG_UNSUPP)
# define nfserr_pnfs_no_layout cpu_to_be32(NFS4ERR_PNFS_NO_LAYOUT)
# define nfserr_not_only_op cpu_to_be32(NFS4ERR_NOT_ONLY_OP)
# define nfserr_wrong_cred cpu_to_be32(NFS4ERR_WRONG_CRED)
# define nfserr_wrong_type cpu_to_be32(NFS4ERR_WRONG_TYPE)
# define nfserr_dirdeleg_unavail cpu_to_be32(NFS4ERR_DIRDELEG_UNAVAIL)
# define nfserr_reject_deleg cpu_to_be32(NFS4ERR_REJECT_DELEG)
# define nfserr_returnconflict cpu_to_be32(NFS4ERR_RETURNCONFLICT)
# define nfserr_deleg_revoked cpu_to_be32(NFS4ERR_DELEG_REVOKED)
2013-05-02 21:18:55 +04:00
# define nfserr_partner_notsupp cpu_to_be32(NFS4ERR_PARTNER_NOTSUPP)
# define nfserr_partner_no_auth cpu_to_be32(NFS4ERR_PARTNER_NO_AUTH)
# define nfserr_metadata_notsupp cpu_to_be32(NFS4ERR_METADATA_NOTSUPP)
# define nfserr_offload_denied cpu_to_be32(NFS4ERR_OFFLOAD_DENIED)
# define nfserr_wrong_lfs cpu_to_be32(NFS4ERR_WRONG_LFS)
# define nfserr_badlabel cpu_to_be32(NFS4ERR_BADLABEL)
2005-04-17 02:20:36 +04:00
/* error codes for internal use */
/* if a request fails due to kmalloc failure, it gets dropped.
* Client should resend eventually
*/
2009-02-12 04:16:58 +03:00
# define nfserr_dropit cpu_to_be32(30000)
2005-04-17 02:20:36 +04:00
/* end-of-file indicator in readdir */
2009-02-12 04:16:58 +03:00
# define nfserr_eof cpu_to_be32(30001)
2009-04-03 09:27:40 +04:00
/* replay detected */
# define nfserr_replay_me cpu_to_be32(11001)
/* nfs41 replay detected */
# define nfserr_replay_cache cpu_to_be32(11002)
2005-04-17 02:20:36 +04:00
/* Check for dir entries '.' and '..' */
# define isdotent(n, l) (l < 3 && n[0] == '.' && (l == 1 || n[1] == '.'))
# ifdef CONFIG_NFSD_V4
/* before processing a COMPOUND operation, we have to check that there
* is enough space in the buffer for XDR encode to succeed . otherwise ,
* we might process an operation with side effects , and be unable to
* tell the client that the operation succeeded .
*
2006-12-13 11:35:20 +03:00
* COMPOUND_SLACK_SPACE - this is the minimum bytes of buffer space
2005-04-17 02:20:36 +04:00
* needed to encode an " ordinary " _successful_ operation . ( GETATTR ,
* READ , READDIR , and READLINK have their own buffer checks . ) if we
* fall below this level , we fail the next operation with NFS4ERR_RESOURCE .
*
2006-12-13 11:35:20 +03:00
* COMPOUND_ERR_SLACK_SPACE - this is the minimum bytes of buffer space
2005-04-17 02:20:36 +04:00
* needed to encode an operation which has failed with NFS4ERR_RESOURCE .
* care is taken to ensure that we never fall below this level for any
* reason .
*/
# define COMPOUND_SLACK_SPACE 140 /* OP_GETFH */
2014-02-04 01:38:47 +04:00
# define COMPOUND_ERR_SLACK_SPACE 16 /* OP_SETATTR */
2005-04-17 02:20:36 +04:00
2010-10-12 00:49:44 +04:00
# define NFSD_LAUNDROMAT_MINTIMEOUT 1 /* seconds */
2005-04-17 02:20:36 +04:00
/*
* The following attributes are currently not supported by the NFSv4 server :
* ARCHIVE ( deprecated anyway )
* HIDDEN ( unlikely to be supported any time soon )
* MIMETYPE ( unlikely to be supported any time soon )
* QUOTA_ * ( will be supported in a forthcoming patch )
* SYSTEM ( unlikely to be supported any time soon )
* TIME_BACKUP ( unlikely to be supported any time soon )
* TIME_CREATE ( unlikely to be supported any time soon )
*/
2009-04-03 09:29:11 +04:00
# define NFSD4_SUPPORTED_ATTRS_WORD0 \
2005-04-17 02:20:36 +04:00
( FATTR4_WORD0_SUPPORTED_ATTRS | FATTR4_WORD0_TYPE | FATTR4_WORD0_FH_EXPIRE_TYPE \
| FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_LINK_SUPPORT \
| FATTR4_WORD0_SYMLINK_SUPPORT | FATTR4_WORD0_NAMED_ATTR | FATTR4_WORD0_FSID \
| FATTR4_WORD0_UNIQUE_HANDLES | FATTR4_WORD0_LEASE_TIME | FATTR4_WORD0_RDATTR_ERROR \
| FATTR4_WORD0_ACLSUPPORT | FATTR4_WORD0_CANSETTIME | FATTR4_WORD0_CASE_INSENSITIVE \
| FATTR4_WORD0_CASE_PRESERVING | FATTR4_WORD0_CHOWN_RESTRICTED \
| FATTR4_WORD0_FILEHANDLE | FATTR4_WORD0_FILEID | FATTR4_WORD0_FILES_AVAIL \
2006-10-04 13:16:19 +04:00
| FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_FS_LOCATIONS | FATTR4_WORD0_HOMOGENEOUS \
2005-04-17 02:20:36 +04:00
| FATTR4_WORD0_MAXFILESIZE | FATTR4_WORD0_MAXLINK | FATTR4_WORD0_MAXNAME \
| FATTR4_WORD0_MAXREAD | FATTR4_WORD0_MAXWRITE | FATTR4_WORD0_ACL )
2009-04-03 09:29:11 +04:00
# define NFSD4_SUPPORTED_ATTRS_WORD1 \
2005-04-17 02:20:36 +04:00
( FATTR4_WORD1_MODE | FATTR4_WORD1_NO_TRUNC | FATTR4_WORD1_NUMLINKS \
| FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP | FATTR4_WORD1_RAWDEV \
| FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL \
| FATTR4_WORD1_SPACE_USED | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_ACCESS_SET \
| FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA \
| FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID )
2009-04-03 09:29:11 +04:00
# define NFSD4_SUPPORTED_ATTRS_WORD2 0
# define NFSD4_1_SUPPORTED_ATTRS_WORD0 \
NFSD4_SUPPORTED_ATTRS_WORD0
# define NFSD4_1_SUPPORTED_ATTRS_WORD1 \
NFSD4_SUPPORTED_ATTRS_WORD1
# define NFSD4_1_SUPPORTED_ATTRS_WORD2 \
2009-04-03 09:29:14 +04:00
( NFSD4_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SUPPATTR_EXCLCREAT )
2009-04-03 09:29:11 +04:00
2013-05-02 21:19:10 +04:00
# ifdef CONFIG_NFSD_V4_SECURITY_LABEL
# define NFSD4_2_SUPPORTED_ATTRS_WORD2 \
( NFSD4_1_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SECURITY_LABEL )
# else
# define NFSD4_2_SUPPORTED_ATTRS_WORD2 0
# endif
2009-04-03 09:29:11 +04:00
static inline u32 nfsd_suppattrs0 ( u32 minorversion )
{
return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD0
: NFSD4_SUPPORTED_ATTRS_WORD0 ;
}
static inline u32 nfsd_suppattrs1 ( u32 minorversion )
{
return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD1
: NFSD4_SUPPORTED_ATTRS_WORD1 ;
}
static inline u32 nfsd_suppattrs2 ( u32 minorversion )
{
2013-05-02 21:19:10 +04:00
switch ( minorversion ) {
default : return NFSD4_2_SUPPORTED_ATTRS_WORD2 ;
case 1 : return NFSD4_1_SUPPORTED_ATTRS_WORD2 ;
case 0 : return NFSD4_SUPPORTED_ATTRS_WORD2 ;
}
2009-04-03 09:29:11 +04:00
}
2005-04-17 02:20:36 +04:00
/* These will return ERR_INVAL if specified in GETATTR or READDIR. */
2011-11-01 22:18:28 +04:00
# define NFSD_WRITEONLY_ATTRS_WORD1 \
( FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET )
2005-04-17 02:20:36 +04:00
/* These are the only attrs allowed in CREATE/OPEN/SETATTR. */
2011-11-01 22:18:28 +04:00
# define NFSD_WRITEABLE_ATTRS_WORD0 \
( FATTR4_WORD0_SIZE | FATTR4_WORD0_ACL )
# define NFSD_WRITEABLE_ATTRS_WORD1 \
( FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP \
| FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET )
2013-05-02 21:19:10 +04:00
# ifdef CONFIG_NFSD_V4_SECURITY_LABEL
# define NFSD_WRITEABLE_ATTRS_WORD2 FATTR4_WORD2_SECURITY_LABEL
# else
2009-04-03 09:29:11 +04:00
# define NFSD_WRITEABLE_ATTRS_WORD2 0
2013-05-02 21:19:10 +04:00
# endif
2005-04-17 02:20:36 +04:00
2009-04-03 09:29:14 +04:00
# define NFSD_SUPPATTR_EXCLCREAT_WORD0 \
NFSD_WRITEABLE_ATTRS_WORD0
/*
* we currently store the exclusive create verifier in the v_ { a , m } time
* attributes so the client can ' t set these at create time using EXCLUSIVE4_1
*/
# define NFSD_SUPPATTR_EXCLCREAT_WORD1 \
( NFSD_WRITEABLE_ATTRS_WORD1 & \
~ ( FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET ) )
# define NFSD_SUPPATTR_EXCLCREAT_WORD2 \
NFSD_WRITEABLE_ATTRS_WORD2
2011-09-13 03:37:26 +04:00
extern int nfsd4_is_junction ( struct dentry * dentry ) ;
2012-03-29 15:52:49 +04:00
extern int register_cld_notifier ( void ) ;
extern void unregister_cld_notifier ( void ) ;
# else /* CONFIG_NFSD_V4 */
2011-09-13 03:37:26 +04:00
static inline int nfsd4_is_junction ( struct dentry * dentry )
{
return 0 ;
}
2012-03-29 15:52:49 +04:00
# define register_cld_notifier() 0
# define unregister_cld_notifier() do { } while(0)
2005-04-17 02:20:36 +04:00
# endif /* CONFIG_NFSD_V4 */
# endif /* LINUX_NFSD_NFSD_H */