linux/include/linux/nfsd/nfsd.h
<<
>>
Prefs
   1/*
   2 * linux/include/linux/nfsd/nfsd.h
   3 *
   4 * Hodge-podge collection of knfsd-related stuff.
   5 * I will sort this out later.
   6 *
   7 * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de>
   8 */
   9
  10#ifndef LINUX_NFSD_NFSD_H
  11#define LINUX_NFSD_NFSD_H
  12
  13#include <linux/types.h>
  14#include <linux/unistd.h>
  15#include <linux/fs.h>
  16#include <linux/posix_acl.h>
  17#include <linux/mount.h>
  18
  19#include <linux/nfsd/debug.h>
  20#include <linux/nfsd/nfsfh.h>
  21#include <linux/nfsd/export.h>
  22#include <linux/nfsd/stats.h>
  23/*
  24 * nfsd version
  25 */
  26#define NFSD_SUPPORTED_MINOR_VERSION    1
  27
  28/*
  29 * Flags for nfsd_permission
  30 */
  31#define NFSD_MAY_NOP            0
  32#define NFSD_MAY_EXEC           1 /* == MAY_EXEC */
  33#define NFSD_MAY_WRITE          2 /* == MAY_WRITE */
  34#define NFSD_MAY_READ           4 /* == MAY_READ */
  35#define NFSD_MAY_SATTR          8
  36#define NFSD_MAY_TRUNC          16
  37#define NFSD_MAY_LOCK           32
  38#define NFSD_MAY_OWNER_OVERRIDE 64
  39#define NFSD_MAY_LOCAL_ACCESS   128 /* IRIX doing local access check on device special file*/
  40#define NFSD_MAY_BYPASS_GSS_ON_ROOT 256
  41
  42#define NFSD_MAY_CREATE         (NFSD_MAY_EXEC|NFSD_MAY_WRITE)
  43#define NFSD_MAY_REMOVE         (NFSD_MAY_EXEC|NFSD_MAY_WRITE|NFSD_MAY_TRUNC)
  44
  45/*
  46 * Callback function for readdir
  47 */
  48struct readdir_cd {
  49        __be32                  err;    /* 0, nfserr, or nfserr_eof */
  50};
  51typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int);
  52
  53extern struct svc_program       nfsd_program;
  54extern struct svc_version       nfsd_version2, nfsd_version3,
  55                                nfsd_version4;
  56extern u32                      nfsd_supported_minorversion;
  57extern struct mutex             nfsd_mutex;
  58extern struct svc_serv          *nfsd_serv;
  59extern spinlock_t               nfsd_drc_lock;
  60extern unsigned int             nfsd_drc_max_mem;
  61extern unsigned int             nfsd_drc_mem_used;
  62
  63extern const struct seq_operations nfs_exports_op;
  64
  65/*
  66 * Function prototypes.
  67 */
  68int             nfsd_svc(unsigned short port, int nrservs);
  69int             nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp);
  70
  71int             nfsd_nrthreads(void);
  72int             nfsd_nrpools(void);
  73int             nfsd_get_nrthreads(int n, int *);
  74int             nfsd_set_nrthreads(int n, int *);
  75
  76/* nfsd/vfs.c */
  77int             fh_lock_parent(struct svc_fh *, struct dentry *);
  78int             nfsd_racache_init(int);
  79void            nfsd_racache_shutdown(void);
  80int             nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp,
  81                                struct svc_export **expp);
  82__be32          nfsd_lookup(struct svc_rqst *, struct svc_fh *,
  83                                const char *, unsigned int, struct svc_fh *);
  84__be32           nfsd_lookup_dentry(struct svc_rqst *, struct svc_fh *,
  85                                const char *, unsigned int,
  86                                struct svc_export **, struct dentry **);
  87__be32          nfsd_setattr(struct svc_rqst *, struct svc_fh *,
  88                                struct iattr *, int, time_t);
  89#ifdef CONFIG_NFSD_V4
  90__be32          nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *,
  91                    struct nfs4_acl *);
  92int             nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, struct nfs4_acl **);
  93#endif /* CONFIG_NFSD_V4 */
  94__be32          nfsd_create(struct svc_rqst *, struct svc_fh *,
  95                                char *name, int len, struct iattr *attrs,
  96                                int type, dev_t rdev, struct svc_fh *res);
  97#ifdef CONFIG_NFSD_V3
  98__be32          nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *, u32 *);
  99__be32          nfsd_create_v3(struct svc_rqst *, struct svc_fh *,
 100                                char *name, int len, struct iattr *attrs,
 101                                struct svc_fh *res, int createmode,
 102                                u32 *verifier, int *truncp, int *created);
 103__be32          nfsd_commit(struct svc_rqst *, struct svc_fh *,
 104                                loff_t, unsigned long);
 105#endif /* CONFIG_NFSD_V3 */
 106__be32          nfsd_open(struct svc_rqst *, struct svc_fh *, int,
 107                                int, struct file **);
 108void            nfsd_close(struct file *);
 109__be32          nfsd_read(struct svc_rqst *, struct svc_fh *, struct file *,
 110                                loff_t, struct kvec *, int, unsigned long *);
 111__be32          nfsd_write(struct svc_rqst *, struct svc_fh *,struct file *,
 112                                loff_t, struct kvec *,int, unsigned long *, int *);
 113__be32          nfsd_readlink(struct svc_rqst *, struct svc_fh *,
 114                                char *, int *);
 115__be32          nfsd_symlink(struct svc_rqst *, struct svc_fh *,
 116                                char *name, int len, char *path, int plen,
 117                                struct svc_fh *res, struct iattr *);
 118__be32          nfsd_link(struct svc_rqst *, struct svc_fh *,
 119                                char *, int, struct svc_fh *);
 120__be32          nfsd_rename(struct svc_rqst *,
 121                                struct svc_fh *, char *, int,
 122                                struct svc_fh *, char *, int);
 123__be32          nfsd_remove(struct svc_rqst *,
 124                                struct svc_fh *, char *, int);
 125__be32          nfsd_unlink(struct svc_rqst *, struct svc_fh *, int type,
 126                                char *name, int len);
 127int             nfsd_truncate(struct svc_rqst *, struct svc_fh *,
 128                                unsigned long size);
 129__be32          nfsd_readdir(struct svc_rqst *, struct svc_fh *,
 130                             loff_t *, struct readdir_cd *, filldir_t);
 131__be32          nfsd_statfs(struct svc_rqst *, struct svc_fh *,
 132                                struct kstatfs *, int access);
 133
 134int             nfsd_notify_change(struct inode *, struct iattr *);
 135__be32          nfsd_permission(struct svc_rqst *, struct svc_export *,
 136                                struct dentry *, int);
 137int             nfsd_sync_dir(struct dentry *dp);
 138
 139#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
 140#ifdef CONFIG_NFSD_V2_ACL
 141extern struct svc_version nfsd_acl_version2;
 142#else
 143#define nfsd_acl_version2 NULL
 144#endif
 145#ifdef CONFIG_NFSD_V3_ACL
 146extern struct svc_version nfsd_acl_version3;
 147#else
 148#define nfsd_acl_version3 NULL
 149#endif
 150struct posix_acl *nfsd_get_posix_acl(struct svc_fh *, int);
 151int nfsd_set_posix_acl(struct svc_fh *, int, struct posix_acl *);
 152#endif
 153
 154enum vers_op {NFSD_SET, NFSD_CLEAR, NFSD_TEST, NFSD_AVAIL };
 155int nfsd_vers(int vers, enum vers_op change);
 156int nfsd_minorversion(u32 minorversion, enum vers_op change);
 157void nfsd_reset_versions(void);
 158int nfsd_create_serv(void);
 159
 160extern int nfsd_max_blksize;
 161
 162/* 
 163 * NFSv4 State
 164 */
 165#ifdef CONFIG_NFSD_V4
 166extern unsigned int max_delegations;
 167int nfs4_state_init(void);
 168void nfsd4_free_slabs(void);
 169int nfs4_state_start(void);
 170void nfs4_state_shutdown(void);
 171time_t nfs4_lease_time(void);
 172void nfs4_reset_lease(time_t leasetime);
 173int nfs4_reset_recoverydir(char *recdir);
 174#else
 175static inline int nfs4_state_init(void) { return 0; }
 176static inline void nfsd4_free_slabs(void) { }
 177static inline int nfs4_state_start(void) { return 0; }
 178static inline void nfs4_state_shutdown(void) { }
 179static inline time_t nfs4_lease_time(void) { return 0; }
 180static inline void nfs4_reset_lease(time_t leasetime) { }
 181static inline int nfs4_reset_recoverydir(char *recdir) { return 0; }
 182#endif
 183
 184/*
 185 * lockd binding
 186 */
 187void            nfsd_lockd_init(void);
 188void            nfsd_lockd_shutdown(void);
 189
 190
 191/*
 192 * These macros provide pre-xdr'ed values for faster operation.
 193 */
 194#define nfs_ok                  cpu_to_be32(NFS_OK)
 195#define nfserr_perm             cpu_to_be32(NFSERR_PERM)
 196#define nfserr_noent            cpu_to_be32(NFSERR_NOENT)
 197#define nfserr_io               cpu_to_be32(NFSERR_IO)
 198#define nfserr_nxio             cpu_to_be32(NFSERR_NXIO)
 199#define nfserr_eagain           cpu_to_be32(NFSERR_EAGAIN)
 200#define nfserr_acces            cpu_to_be32(NFSERR_ACCES)
 201#define nfserr_exist            cpu_to_be32(NFSERR_EXIST)
 202#define nfserr_xdev             cpu_to_be32(NFSERR_XDEV)
 203#define nfserr_nodev            cpu_to_be32(NFSERR_NODEV)
 204#define nfserr_notdir           cpu_to_be32(NFSERR_NOTDIR)
 205#define nfserr_isdir            cpu_to_be32(NFSERR_ISDIR)
 206#define nfserr_inval            cpu_to_be32(NFSERR_INVAL)
 207#define nfserr_fbig             cpu_to_be32(NFSERR_FBIG)
 208#define nfserr_nospc            cpu_to_be32(NFSERR_NOSPC)
 209#define nfserr_rofs             cpu_to_be32(NFSERR_ROFS)
 210#define nfserr_mlink            cpu_to_be32(NFSERR_MLINK)
 211#define nfserr_opnotsupp        cpu_to_be32(NFSERR_OPNOTSUPP)
 212#define nfserr_nametoolong      cpu_to_be32(NFSERR_NAMETOOLONG)
 213#define nfserr_notempty         cpu_to_be32(NFSERR_NOTEMPTY)
 214#define nfserr_dquot            cpu_to_be32(NFSERR_DQUOT)
 215#define nfserr_stale            cpu_to_be32(NFSERR_STALE)
 216#define nfserr_remote           cpu_to_be32(NFSERR_REMOTE)
 217#define nfserr_wflush           cpu_to_be32(NFSERR_WFLUSH)
 218#define nfserr_badhandle        cpu_to_be32(NFSERR_BADHANDLE)
 219#define nfserr_notsync          cpu_to_be32(NFSERR_NOT_SYNC)
 220#define nfserr_badcookie        cpu_to_be32(NFSERR_BAD_COOKIE)
 221#define nfserr_notsupp          cpu_to_be32(NFSERR_NOTSUPP)
 222#define nfserr_toosmall         cpu_to_be32(NFSERR_TOOSMALL)
 223#define nfserr_serverfault      cpu_to_be32(NFSERR_SERVERFAULT)
 224#define nfserr_badtype          cpu_to_be32(NFSERR_BADTYPE)
 225#define nfserr_jukebox          cpu_to_be32(NFSERR_JUKEBOX)
 226#define nfserr_denied           cpu_to_be32(NFSERR_DENIED)
 227#define nfserr_deadlock         cpu_to_be32(NFSERR_DEADLOCK)
 228#define nfserr_expired          cpu_to_be32(NFSERR_EXPIRED)
 229#define nfserr_bad_cookie       cpu_to_be32(NFSERR_BAD_COOKIE)
 230#define nfserr_same             cpu_to_be32(NFSERR_SAME)
 231#define nfserr_clid_inuse       cpu_to_be32(NFSERR_CLID_INUSE)
 232#define nfserr_stale_clientid   cpu_to_be32(NFSERR_STALE_CLIENTID)
 233#define nfserr_resource         cpu_to_be32(NFSERR_RESOURCE)
 234#define nfserr_moved            cpu_to_be32(NFSERR_MOVED)
 235#define nfserr_nofilehandle     cpu_to_be32(NFSERR_NOFILEHANDLE)
 236#define nfserr_minor_vers_mismatch      cpu_to_be32(NFSERR_MINOR_VERS_MISMATCH)
 237#define nfserr_share_denied     cpu_to_be32(NFSERR_SHARE_DENIED)
 238#define nfserr_stale_stateid    cpu_to_be32(NFSERR_STALE_STATEID)
 239#define nfserr_old_stateid      cpu_to_be32(NFSERR_OLD_STATEID)
 240#define nfserr_bad_stateid      cpu_to_be32(NFSERR_BAD_STATEID)
 241#define nfserr_bad_seqid        cpu_to_be32(NFSERR_BAD_SEQID)
 242#define nfserr_symlink          cpu_to_be32(NFSERR_SYMLINK)
 243#define nfserr_not_same         cpu_to_be32(NFSERR_NOT_SAME)
 244#define nfserr_restorefh        cpu_to_be32(NFSERR_RESTOREFH)
 245#define nfserr_attrnotsupp      cpu_to_be32(NFSERR_ATTRNOTSUPP)
 246#define nfserr_bad_xdr          cpu_to_be32(NFSERR_BAD_XDR)
 247#define nfserr_openmode         cpu_to_be32(NFSERR_OPENMODE)
 248#define nfserr_locks_held       cpu_to_be32(NFSERR_LOCKS_HELD)
 249#define nfserr_op_illegal       cpu_to_be32(NFSERR_OP_ILLEGAL)
 250#define nfserr_grace            cpu_to_be32(NFSERR_GRACE)
 251#define nfserr_no_grace         cpu_to_be32(NFSERR_NO_GRACE)
 252#define nfserr_reclaim_bad      cpu_to_be32(NFSERR_RECLAIM_BAD)
 253#define nfserr_badname          cpu_to_be32(NFSERR_BADNAME)
 254#define nfserr_cb_path_down     cpu_to_be32(NFSERR_CB_PATH_DOWN)
 255#define nfserr_locked           cpu_to_be32(NFSERR_LOCKED)
 256#define nfserr_wrongsec         cpu_to_be32(NFSERR_WRONGSEC)
 257#define nfserr_badiomode                cpu_to_be32(NFS4ERR_BADIOMODE)
 258#define nfserr_badlayout                cpu_to_be32(NFS4ERR_BADLAYOUT)
 259#define nfserr_bad_session_digest       cpu_to_be32(NFS4ERR_BAD_SESSION_DIGEST)
 260#define nfserr_badsession               cpu_to_be32(NFS4ERR_BADSESSION)
 261#define nfserr_badslot                  cpu_to_be32(NFS4ERR_BADSLOT)
 262#define nfserr_complete_already         cpu_to_be32(NFS4ERR_COMPLETE_ALREADY)
 263#define nfserr_conn_not_bound_to_session cpu_to_be32(NFS4ERR_CONN_NOT_BOUND_TO_SESSION)
 264#define nfserr_deleg_already_wanted     cpu_to_be32(NFS4ERR_DELEG_ALREADY_WANTED)
 265#define nfserr_back_chan_busy           cpu_to_be32(NFS4ERR_BACK_CHAN_BUSY)
 266#define nfserr_layouttrylater           cpu_to_be32(NFS4ERR_LAYOUTTRYLATER)
 267#define nfserr_layoutunavailable        cpu_to_be32(NFS4ERR_LAYOUTUNAVAILABLE)
 268#define nfserr_nomatching_layout        cpu_to_be32(NFS4ERR_NOMATCHING_LAYOUT)
 269#define nfserr_recallconflict           cpu_to_be32(NFS4ERR_RECALLCONFLICT)
 270#define nfserr_unknown_layouttype       cpu_to_be32(NFS4ERR_UNKNOWN_LAYOUTTYPE)
 271#define nfserr_seq_misordered           cpu_to_be32(NFS4ERR_SEQ_MISORDERED)
 272#define nfserr_sequence_pos             cpu_to_be32(NFS4ERR_SEQUENCE_POS)
 273#define nfserr_req_too_big              cpu_to_be32(NFS4ERR_REQ_TOO_BIG)
 274#define nfserr_rep_too_big              cpu_to_be32(NFS4ERR_REP_TOO_BIG)
 275#define nfserr_rep_too_big_to_cache     cpu_to_be32(NFS4ERR_REP_TOO_BIG_TO_CACHE)
 276#define nfserr_retry_uncached_rep       cpu_to_be32(NFS4ERR_RETRY_UNCACHED_REP)
 277#define nfserr_unsafe_compound          cpu_to_be32(NFS4ERR_UNSAFE_COMPOUND)
 278#define nfserr_too_many_ops             cpu_to_be32(NFS4ERR_TOO_MANY_OPS)
 279#define nfserr_op_not_in_session        cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION)
 280#define nfserr_hash_alg_unsupp          cpu_to_be32(NFS4ERR_HASH_ALG_UNSUPP)
 281#define nfserr_clientid_busy            cpu_to_be32(NFS4ERR_CLIENTID_BUSY)
 282#define nfserr_pnfs_io_hole             cpu_to_be32(NFS4ERR_PNFS_IO_HOLE)
 283#define nfserr_seq_false_retry          cpu_to_be32(NFS4ERR_SEQ_FALSE_RETRY)
 284#define nfserr_bad_high_slot            cpu_to_be32(NFS4ERR_BAD_HIGH_SLOT)
 285#define nfserr_deadsession              cpu_to_be32(NFS4ERR_DEADSESSION)
 286#define nfserr_encr_alg_unsupp          cpu_to_be32(NFS4ERR_ENCR_ALG_UNSUPP)
 287#define nfserr_pnfs_no_layout           cpu_to_be32(NFS4ERR_PNFS_NO_LAYOUT)
 288#define nfserr_not_only_op              cpu_to_be32(NFS4ERR_NOT_ONLY_OP)
 289#define nfserr_wrong_cred               cpu_to_be32(NFS4ERR_WRONG_CRED)
 290#define nfserr_wrong_type               cpu_to_be32(NFS4ERR_WRONG_TYPE)
 291#define nfserr_dirdeleg_unavail         cpu_to_be32(NFS4ERR_DIRDELEG_UNAVAIL)
 292#define nfserr_reject_deleg             cpu_to_be32(NFS4ERR_REJECT_DELEG)
 293#define nfserr_returnconflict           cpu_to_be32(NFS4ERR_RETURNCONFLICT)
 294#define nfserr_deleg_revoked            cpu_to_be32(NFS4ERR_DELEG_REVOKED)
 295
 296/* error codes for internal use */
 297/* if a request fails due to kmalloc failure, it gets dropped.
 298 *  Client should resend eventually
 299 */
 300#define nfserr_dropit           cpu_to_be32(30000)
 301/* end-of-file indicator in readdir */
 302#define nfserr_eof              cpu_to_be32(30001)
 303/* replay detected */
 304#define nfserr_replay_me        cpu_to_be32(11001)
 305/* nfs41 replay detected */
 306#define nfserr_replay_cache     cpu_to_be32(11002)
 307
 308/* Check for dir entries '.' and '..' */
 309#define isdotent(n, l)  (l < 3 && n[0] == '.' && (l == 1 || n[1] == '.'))
 310
 311/*
 312 * Time of server startup
 313 */
 314extern struct timeval   nfssvc_boot;
 315
 316#ifdef CONFIG_NFSD_V4
 317
 318/* before processing a COMPOUND operation, we have to check that there
 319 * is enough space in the buffer for XDR encode to succeed.  otherwise,
 320 * we might process an operation with side effects, and be unable to
 321 * tell the client that the operation succeeded.
 322 *
 323 * COMPOUND_SLACK_SPACE - this is the minimum bytes of buffer space
 324 * needed to encode an "ordinary" _successful_ operation.  (GETATTR,
 325 * READ, READDIR, and READLINK have their own buffer checks.)  if we
 326 * fall below this level, we fail the next operation with NFS4ERR_RESOURCE.
 327 *
 328 * COMPOUND_ERR_SLACK_SPACE - this is the minimum bytes of buffer space
 329 * needed to encode an operation which has failed with NFS4ERR_RESOURCE.
 330 * care is taken to ensure that we never fall below this level for any
 331 * reason.
 332 */
 333#define COMPOUND_SLACK_SPACE            140    /* OP_GETFH */
 334#define COMPOUND_ERR_SLACK_SPACE        12     /* OP_SETATTR */
 335
 336#define NFSD_LEASE_TIME                 (nfs4_lease_time())
 337#define NFSD_LAUNDROMAT_MINTIMEOUT      10   /* seconds */
 338
 339/*
 340 * The following attributes are currently not supported by the NFSv4 server:
 341 *    ARCHIVE       (deprecated anyway)
 342 *    HIDDEN        (unlikely to be supported any time soon)
 343 *    MIMETYPE      (unlikely to be supported any time soon)
 344 *    QUOTA_*       (will be supported in a forthcoming patch)
 345 *    SYSTEM        (unlikely to be supported any time soon)
 346 *    TIME_BACKUP   (unlikely to be supported any time soon)
 347 *    TIME_CREATE   (unlikely to be supported any time soon)
 348 */
 349#define NFSD4_SUPPORTED_ATTRS_WORD0                                                         \
 350(FATTR4_WORD0_SUPPORTED_ATTRS   | FATTR4_WORD0_TYPE         | FATTR4_WORD0_FH_EXPIRE_TYPE   \
 351 | FATTR4_WORD0_CHANGE          | FATTR4_WORD0_SIZE         | FATTR4_WORD0_LINK_SUPPORT     \
 352 | FATTR4_WORD0_SYMLINK_SUPPORT | FATTR4_WORD0_NAMED_ATTR   | FATTR4_WORD0_FSID             \
 353 | FATTR4_WORD0_UNIQUE_HANDLES  | FATTR4_WORD0_LEASE_TIME   | FATTR4_WORD0_RDATTR_ERROR     \
 354 | FATTR4_WORD0_ACLSUPPORT      | FATTR4_WORD0_CANSETTIME   | FATTR4_WORD0_CASE_INSENSITIVE \
 355 | FATTR4_WORD0_CASE_PRESERVING | FATTR4_WORD0_CHOWN_RESTRICTED                             \
 356 | FATTR4_WORD0_FILEHANDLE      | FATTR4_WORD0_FILEID       | FATTR4_WORD0_FILES_AVAIL      \
 357 | FATTR4_WORD0_FILES_FREE      | FATTR4_WORD0_FILES_TOTAL  | FATTR4_WORD0_FS_LOCATIONS | FATTR4_WORD0_HOMOGENEOUS      \
 358 | FATTR4_WORD0_MAXFILESIZE     | FATTR4_WORD0_MAXLINK      | FATTR4_WORD0_MAXNAME          \
 359 | FATTR4_WORD0_MAXREAD         | FATTR4_WORD0_MAXWRITE     | FATTR4_WORD0_ACL)
 360
 361#define NFSD4_SUPPORTED_ATTRS_WORD1                                                         \
 362(FATTR4_WORD1_MODE              | FATTR4_WORD1_NO_TRUNC     | FATTR4_WORD1_NUMLINKS         \
 363 | FATTR4_WORD1_OWNER           | FATTR4_WORD1_OWNER_GROUP  | FATTR4_WORD1_RAWDEV           \
 364 | FATTR4_WORD1_SPACE_AVAIL     | FATTR4_WORD1_SPACE_FREE   | FATTR4_WORD1_SPACE_TOTAL      \
 365 | FATTR4_WORD1_SPACE_USED      | FATTR4_WORD1_TIME_ACCESS  | FATTR4_WORD1_TIME_ACCESS_SET  \
 366 | FATTR4_WORD1_TIME_DELTA   | FATTR4_WORD1_TIME_METADATA    \
 367 | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
 368
 369#define NFSD4_SUPPORTED_ATTRS_WORD2 0
 370
 371#define NFSD4_1_SUPPORTED_ATTRS_WORD0 \
 372        NFSD4_SUPPORTED_ATTRS_WORD0
 373
 374#define NFSD4_1_SUPPORTED_ATTRS_WORD1 \
 375        NFSD4_SUPPORTED_ATTRS_WORD1
 376
 377#define NFSD4_1_SUPPORTED_ATTRS_WORD2 \
 378        (NFSD4_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SUPPATTR_EXCLCREAT)
 379
 380static inline u32 nfsd_suppattrs0(u32 minorversion)
 381{
 382        return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD0
 383                            : NFSD4_SUPPORTED_ATTRS_WORD0;
 384}
 385
 386static inline u32 nfsd_suppattrs1(u32 minorversion)
 387{
 388        return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD1
 389                            : NFSD4_SUPPORTED_ATTRS_WORD1;
 390}
 391
 392static inline u32 nfsd_suppattrs2(u32 minorversion)
 393{
 394        return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD2
 395                            : NFSD4_SUPPORTED_ATTRS_WORD2;
 396}
 397
 398/* These will return ERR_INVAL if specified in GETATTR or READDIR. */
 399#define NFSD_WRITEONLY_ATTRS_WORD1                                                          \
 400(FATTR4_WORD1_TIME_ACCESS_SET   | FATTR4_WORD1_TIME_MODIFY_SET)
 401
 402/* These are the only attrs allowed in CREATE/OPEN/SETATTR. */
 403#define NFSD_WRITEABLE_ATTRS_WORD0                                                          \
 404(FATTR4_WORD0_SIZE              | FATTR4_WORD0_ACL                                         )
 405#define NFSD_WRITEABLE_ATTRS_WORD1                                                          \
 406(FATTR4_WORD1_MODE              | FATTR4_WORD1_OWNER         | FATTR4_WORD1_OWNER_GROUP     \
 407 | FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET)
 408#define NFSD_WRITEABLE_ATTRS_WORD2 0
 409
 410#define NFSD_SUPPATTR_EXCLCREAT_WORD0 \
 411        NFSD_WRITEABLE_ATTRS_WORD0
 412/*
 413 * we currently store the exclusive create verifier in the v_{a,m}time
 414 * attributes so the client can't set these at create time using EXCLUSIVE4_1
 415 */
 416#define NFSD_SUPPATTR_EXCLCREAT_WORD1 \
 417        (NFSD_WRITEABLE_ATTRS_WORD1 & \
 418         ~(FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET))
 419#define NFSD_SUPPATTR_EXCLCREAT_WORD2 \
 420        NFSD_WRITEABLE_ATTRS_WORD2
 421
 422#endif /* CONFIG_NFSD_V4 */
 423
 424#endif /* LINUX_NFSD_NFSD_H */
 425