linux/include/linux/nfsd/xdr4.h
<<
>>
Prefs
   1/*
   2 *  include/linux/nfsd/xdr4.h
   3 *
   4 *  Server-side types for NFSv4.
   5 *
   6 *  Copyright (c) 2002 The Regents of the University of Michigan.
   7 *  All rights reserved.
   8 *
   9 *  Kendrick Smith <kmsmith@umich.edu>
  10 *  Andy Adamson   <andros@umich.edu>
  11 *
  12 *  Redistribution and use in source and binary forms, with or without
  13 *  modification, are permitted provided that the following conditions
  14 *  are met:
  15 *
  16 *  1. Redistributions of source code must retain the above copyright
  17 *     notice, this list of conditions and the following disclaimer.
  18 *  2. Redistributions in binary form must reproduce the above copyright
  19 *     notice, this list of conditions and the following disclaimer in the
  20 *     documentation and/or other materials provided with the distribution.
  21 *  3. Neither the name of the University nor the names of its
  22 *     contributors may be used to endorse or promote products derived
  23 *     from this software without specific prior written permission.
  24 *
  25 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  26 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  27 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  28 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  30 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  31 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  32 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  33 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  34 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  35 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36 *
  37 */
  38
  39#ifndef _LINUX_NFSD_XDR4_H
  40#define _LINUX_NFSD_XDR4_H
  41
  42#include <linux/nfs4.h>
  43
  44#define NFSD4_MAX_TAGLEN        128
  45#define XDR_LEN(n)                     (((n) + 3) & ~3)
  46
  47struct nfsd4_compound_state {
  48        struct svc_fh           current_fh;
  49        struct svc_fh           save_fh;
  50        struct nfs4_stateowner  *replay_owner;
  51        /* For sessions DRC */
  52        struct nfsd4_session    *session;
  53        struct nfsd4_slot       *slot;
  54        __be32                  *datap;
  55        size_t                  iovlen;
  56        u32                     minorversion;
  57        u32                     status;
  58};
  59
  60static inline bool nfsd4_has_session(struct nfsd4_compound_state *cs)
  61{
  62        return cs->slot != NULL;
  63}
  64
  65struct nfsd4_change_info {
  66        u32             atomic;
  67        bool            change_supported;
  68        u32             before_ctime_sec;
  69        u32             before_ctime_nsec;
  70        u64             before_change;
  71        u32             after_ctime_sec;
  72        u32             after_ctime_nsec;
  73        u64             after_change;
  74};
  75
  76struct nfsd4_access {
  77        u32             ac_req_access;      /* request */
  78        u32             ac_supported;       /* response */
  79        u32             ac_resp_access;     /* response */
  80};
  81
  82struct nfsd4_close {
  83        u32             cl_seqid;           /* request */
  84        stateid_t       cl_stateid;         /* request+response */
  85        struct nfs4_stateowner * cl_stateowner; /* response */
  86};
  87
  88struct nfsd4_commit {
  89        u64             co_offset;          /* request */
  90        u32             co_count;           /* request */
  91        nfs4_verifier   co_verf;            /* response */
  92};
  93
  94struct nfsd4_create {
  95        u32             cr_namelen;         /* request */
  96        char *          cr_name;            /* request */
  97        u32             cr_type;            /* request */
  98        union {                             /* request */
  99                struct {
 100                        u32 namelen;
 101                        char *name;
 102                } link;   /* NF4LNK */
 103                struct {
 104                        u32 specdata1;
 105                        u32 specdata2;
 106                } dev;    /* NF4BLK, NF4CHR */
 107        } u;
 108        u32             cr_bmval[3];        /* request */
 109        struct iattr    cr_iattr;           /* request */
 110        struct nfsd4_change_info  cr_cinfo; /* response */
 111        struct nfs4_acl *cr_acl;
 112};
 113#define cr_linklen      u.link.namelen
 114#define cr_linkname     u.link.name
 115#define cr_specdata1    u.dev.specdata1
 116#define cr_specdata2    u.dev.specdata2
 117
 118struct nfsd4_delegreturn {
 119        stateid_t       dr_stateid;
 120};
 121
 122struct nfsd4_getattr {
 123        u32             ga_bmval[3];        /* request */
 124        struct svc_fh   *ga_fhp;            /* response */
 125};
 126
 127struct nfsd4_link {
 128        u32             li_namelen;         /* request */
 129        char *          li_name;            /* request */
 130        struct nfsd4_change_info  li_cinfo; /* response */
 131};
 132
 133struct nfsd4_lock_denied {
 134        clientid_t      ld_clientid;
 135        struct nfs4_stateowner   *ld_sop;
 136        u64             ld_start;
 137        u64             ld_length;
 138        u32             ld_type;
 139};
 140
 141struct nfsd4_lock {
 142        /* request */
 143        u32             lk_type;
 144        u32             lk_reclaim;         /* boolean */
 145        u64             lk_offset;
 146        u64             lk_length;
 147        u32             lk_is_new;
 148        union {
 149                struct {
 150                        u32             open_seqid;
 151                        stateid_t       open_stateid;
 152                        u32             lock_seqid;
 153                        clientid_t      clientid;
 154                        struct xdr_netobj owner;
 155                } new;
 156                struct {
 157                        stateid_t       lock_stateid;
 158                        u32             lock_seqid;
 159                } old;
 160        } v;
 161
 162        /* response */
 163        union {
 164                struct {
 165                        stateid_t               stateid;
 166                } ok;
 167                struct nfsd4_lock_denied        denied;
 168        } u;
 169        /* The lk_replay_owner is the open owner in the open_to_lock_owner
 170         * case and the lock owner otherwise: */
 171        struct nfs4_stateowner *lk_replay_owner;
 172};
 173#define lk_new_open_seqid       v.new.open_seqid
 174#define lk_new_open_stateid     v.new.open_stateid
 175#define lk_new_lock_seqid       v.new.lock_seqid
 176#define lk_new_clientid         v.new.clientid
 177#define lk_new_owner            v.new.owner
 178#define lk_old_lock_stateid     v.old.lock_stateid
 179#define lk_old_lock_seqid       v.old.lock_seqid
 180
 181#define lk_rflags       u.ok.rflags
 182#define lk_resp_stateid u.ok.stateid
 183#define lk_denied       u.denied
 184
 185
 186struct nfsd4_lockt {
 187        u32                             lt_type;
 188        clientid_t                      lt_clientid;
 189        struct xdr_netobj               lt_owner;
 190        u64                             lt_offset;
 191        u64                             lt_length;
 192        struct nfs4_stateowner *        lt_stateowner;
 193        struct nfsd4_lock_denied        lt_denied;
 194};
 195
 196 
 197struct nfsd4_locku {
 198        u32             lu_type;
 199        u32             lu_seqid;
 200        stateid_t       lu_stateid;
 201        u64             lu_offset;
 202        u64             lu_length;
 203        struct nfs4_stateowner  *lu_stateowner;
 204};
 205
 206
 207struct nfsd4_lookup {
 208        u32             lo_len;             /* request */
 209        char *          lo_name;            /* request */
 210};
 211
 212struct nfsd4_putfh {
 213        u32             pf_fhlen;           /* request */
 214        char            *pf_fhval;          /* request */
 215};
 216
 217struct nfsd4_open {
 218        u32             op_claim_type;      /* request */
 219        struct xdr_netobj op_fname;         /* request - everything but CLAIM_PREV */
 220        u32             op_delegate_type;   /* request - CLAIM_PREV only */
 221        stateid_t       op_delegate_stateid; /* request - response */
 222        u32             op_create;          /* request */
 223        u32             op_createmode;      /* request */
 224        u32             op_bmval[3];        /* request */
 225        struct iattr    iattr;              /* UNCHECKED4, GUARDED4, EXCLUSIVE4_1 */
 226        nfs4_verifier   verf;               /* EXCLUSIVE4 */
 227        clientid_t      op_clientid;        /* request */
 228        struct xdr_netobj op_owner;           /* request */
 229        u32             op_seqid;           /* request */
 230        u32             op_share_access;    /* request */
 231        u32             op_share_deny;      /* request */
 232        stateid_t       op_stateid;         /* response */
 233        u32             op_recall;          /* recall */
 234        struct nfsd4_change_info  op_cinfo; /* response */
 235        u32             op_rflags;          /* response */
 236        int             op_truncate;        /* used during processing */
 237        struct nfs4_stateowner *op_stateowner; /* used during processing */
 238        struct nfs4_acl *op_acl;
 239};
 240#define op_iattr        iattr
 241#define op_verf         verf
 242
 243struct nfsd4_open_confirm {
 244        stateid_t       oc_req_stateid          /* request */;
 245        u32             oc_seqid                /* request */;
 246        stateid_t       oc_resp_stateid         /* response */;
 247        struct nfs4_stateowner * oc_stateowner; /* response */
 248};
 249
 250struct nfsd4_open_downgrade {
 251        stateid_t       od_stateid;
 252        u32             od_seqid;
 253        u32             od_share_access;
 254        u32             od_share_deny;
 255        struct nfs4_stateowner *od_stateowner;
 256};
 257
 258
 259struct nfsd4_read {
 260        stateid_t       rd_stateid;         /* request */
 261        u64             rd_offset;          /* request */
 262        u32             rd_length;          /* request */
 263        int             rd_vlen;
 264        struct file     *rd_filp;
 265        
 266        struct svc_rqst *rd_rqstp;          /* response */
 267        struct svc_fh * rd_fhp;             /* response */
 268};
 269
 270struct nfsd4_readdir {
 271        u64             rd_cookie;          /* request */
 272        nfs4_verifier   rd_verf;            /* request */
 273        u32             rd_dircount;        /* request */
 274        u32             rd_maxcount;        /* request */
 275        u32             rd_bmval[3];        /* request */
 276        struct svc_rqst *rd_rqstp;          /* response */
 277        struct svc_fh * rd_fhp;             /* response */
 278
 279        struct readdir_cd       common;
 280        __be32 *                buffer;
 281        int                     buflen;
 282        __be32 *                offset;
 283};
 284
 285struct nfsd4_release_lockowner {
 286        clientid_t        rl_clientid;
 287        struct xdr_netobj rl_owner;
 288};
 289struct nfsd4_readlink {
 290        struct svc_rqst *rl_rqstp;          /* request */
 291        struct svc_fh * rl_fhp;             /* request */
 292};
 293
 294struct nfsd4_remove {
 295        u32             rm_namelen;         /* request */
 296        char *          rm_name;            /* request */
 297        struct nfsd4_change_info  rm_cinfo; /* response */
 298};
 299
 300struct nfsd4_rename {
 301        u32             rn_snamelen;        /* request */
 302        char *          rn_sname;           /* request */
 303        u32             rn_tnamelen;        /* request */
 304        char *          rn_tname;           /* request */
 305        struct nfsd4_change_info  rn_sinfo; /* response */
 306        struct nfsd4_change_info  rn_tinfo; /* response */
 307};
 308
 309struct nfsd4_secinfo {
 310        u32 si_namelen;                                 /* request */
 311        char *si_name;                                  /* request */
 312        struct svc_export *si_exp;                      /* response */
 313};
 314
 315struct nfsd4_setattr {
 316        stateid_t       sa_stateid;         /* request */
 317        u32             sa_bmval[3];        /* request */
 318        struct iattr    sa_iattr;           /* request */
 319        struct nfs4_acl *sa_acl;
 320};
 321
 322struct nfsd4_setclientid {
 323        nfs4_verifier   se_verf;            /* request */
 324        u32             se_namelen;         /* request */
 325        char *          se_name;            /* request */
 326        u32             se_callback_prog;   /* request */
 327        u32             se_callback_netid_len;  /* request */
 328        char *          se_callback_netid_val;  /* request */
 329        u32             se_callback_addr_len;   /* request */
 330        char *          se_callback_addr_val;   /* request */
 331        u32             se_callback_ident;  /* request */
 332        clientid_t      se_clientid;        /* response */
 333        nfs4_verifier   se_confirm;         /* response */
 334};
 335
 336struct nfsd4_setclientid_confirm {
 337        clientid_t      sc_clientid;
 338        nfs4_verifier   sc_confirm;
 339};
 340
 341/* also used for NVERIFY */
 342struct nfsd4_verify {
 343        u32             ve_bmval[3];        /* request */
 344        u32             ve_attrlen;         /* request */
 345        char *          ve_attrval;         /* request */
 346};
 347
 348struct nfsd4_write {
 349        stateid_t       wr_stateid;         /* request */
 350        u64             wr_offset;          /* request */
 351        u32             wr_stable_how;      /* request */
 352        u32             wr_buflen;          /* request */
 353        int             wr_vlen;
 354
 355        u32             wr_bytes_written;   /* response */
 356        u32             wr_how_written;     /* response */
 357        nfs4_verifier   wr_verifier;        /* response */
 358};
 359
 360struct nfsd4_exchange_id {
 361        nfs4_verifier   verifier;
 362        struct xdr_netobj clname;
 363        u32             flags;
 364        clientid_t      clientid;
 365        u32             seqid;
 366        int             spa_how;
 367};
 368
 369struct nfsd4_sequence {
 370        struct nfs4_sessionid   sessionid;              /* request/response */
 371        u32                     seqid;                  /* request/response */
 372        u32                     slotid;                 /* request/response */
 373        u32                     maxslots;               /* request/response */
 374        u32                     cachethis;              /* request */
 375#if 0
 376        u32                     target_maxslots;        /* response */
 377        u32                     status_flags;           /* response */
 378#endif /* not yet */
 379};
 380
 381struct nfsd4_destroy_session {
 382        struct nfs4_sessionid   sessionid;
 383};
 384
 385struct nfsd4_op {
 386        int                                     opnum;
 387        __be32                                  status;
 388        union {
 389                struct nfsd4_access             access;
 390                struct nfsd4_close              close;
 391                struct nfsd4_commit             commit;
 392                struct nfsd4_create             create;
 393                struct nfsd4_delegreturn        delegreturn;
 394                struct nfsd4_getattr            getattr;
 395                struct svc_fh *                 getfh;
 396                struct nfsd4_link               link;
 397                struct nfsd4_lock               lock;
 398                struct nfsd4_lockt              lockt;
 399                struct nfsd4_locku              locku;
 400                struct nfsd4_lookup             lookup;
 401                struct nfsd4_verify             nverify;
 402                struct nfsd4_open               open;
 403                struct nfsd4_open_confirm       open_confirm;
 404                struct nfsd4_open_downgrade     open_downgrade;
 405                struct nfsd4_putfh              putfh;
 406                struct nfsd4_read               read;
 407                struct nfsd4_readdir            readdir;
 408                struct nfsd4_readlink           readlink;
 409                struct nfsd4_remove             remove;
 410                struct nfsd4_rename             rename;
 411                clientid_t                      renew;
 412                struct nfsd4_secinfo            secinfo;
 413                struct nfsd4_setattr            setattr;
 414                struct nfsd4_setclientid        setclientid;
 415                struct nfsd4_setclientid_confirm setclientid_confirm;
 416                struct nfsd4_verify             verify;
 417                struct nfsd4_write              write;
 418                struct nfsd4_release_lockowner  release_lockowner;
 419
 420                /* NFSv4.1 */
 421                struct nfsd4_exchange_id        exchange_id;
 422                struct nfsd4_create_session     create_session;
 423                struct nfsd4_destroy_session    destroy_session;
 424                struct nfsd4_sequence           sequence;
 425        } u;
 426        struct nfs4_replay *                    replay;
 427};
 428
 429struct nfsd4_compoundargs {
 430        /* scratch variables for XDR decode */
 431        __be32 *                        p;
 432        __be32 *                        end;
 433        struct page **                  pagelist;
 434        int                             pagelen;
 435        __be32                          tmp[8];
 436        __be32 *                        tmpp;
 437        struct tmpbuf {
 438                struct tmpbuf *next;
 439                void (*release)(const void *);
 440                void *buf;
 441        }                               *to_free;
 442
 443        struct svc_rqst                 *rqstp;
 444
 445        u32                             taglen;
 446        char *                          tag;
 447        u32                             minorversion;
 448        u32                             opcnt;
 449        struct nfsd4_op                 *ops;
 450        struct nfsd4_op                 iops[8];
 451};
 452
 453struct nfsd4_compoundres {
 454        /* scratch variables for XDR encode */
 455        __be32 *                        p;
 456        __be32 *                        end;
 457        struct xdr_buf *                xbuf;
 458        struct svc_rqst *               rqstp;
 459
 460        u32                             taglen;
 461        char *                          tag;
 462        u32                             opcnt;
 463        __be32 *                        tagp; /* tag, opcount encode location */
 464        struct nfsd4_compound_state     cstate;
 465};
 466
 467static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp)
 468{
 469        struct nfsd4_compoundargs *args = resp->rqstp->rq_argp;
 470        return resp->opcnt == 1 && args->ops[0].opnum == OP_SEQUENCE;
 471}
 472
 473static inline bool nfsd4_not_cached(struct nfsd4_compoundres *resp)
 474{
 475        return !resp->cstate.slot->sl_cachethis || nfsd4_is_solo_sequence(resp);
 476}
 477
 478#define NFS4_SVC_XDRSIZE                sizeof(struct nfsd4_compoundargs)
 479
 480static inline void
 481set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp)
 482{
 483        BUG_ON(!fhp->fh_pre_saved || !fhp->fh_post_saved);
 484        cinfo->atomic = 1;
 485        cinfo->change_supported = IS_I_VERSION(fhp->fh_dentry->d_inode);
 486        if (cinfo->change_supported) {
 487                cinfo->before_change = fhp->fh_pre_change;
 488                cinfo->after_change = fhp->fh_post_change;
 489        } else {
 490                cinfo->before_ctime_sec = fhp->fh_pre_ctime.tv_sec;
 491                cinfo->before_ctime_nsec = fhp->fh_pre_ctime.tv_nsec;
 492                cinfo->after_ctime_sec = fhp->fh_post_attr.ctime.tv_sec;
 493                cinfo->after_ctime_nsec = fhp->fh_post_attr.ctime.tv_nsec;
 494        }
 495}
 496
 497int nfs4svc_encode_voidres(struct svc_rqst *, __be32 *, void *);
 498int nfs4svc_decode_compoundargs(struct svc_rqst *, __be32 *,
 499                struct nfsd4_compoundargs *);
 500int nfs4svc_encode_compoundres(struct svc_rqst *, __be32 *,
 501                struct nfsd4_compoundres *);
 502void nfsd4_encode_operation(struct nfsd4_compoundres *, struct nfsd4_op *);
 503void nfsd4_encode_replay(struct nfsd4_compoundres *resp, struct nfsd4_op *op);
 504__be32 nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
 505                       struct dentry *dentry, __be32 *buffer, int *countp,
 506                       u32 *bmval, struct svc_rqst *, int ignore_crossmnt);
 507extern __be32 nfsd4_setclientid(struct svc_rqst *rqstp,
 508                struct nfsd4_compound_state *,
 509                struct nfsd4_setclientid *setclid);
 510extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
 511                struct nfsd4_compound_state *,
 512                struct nfsd4_setclientid_confirm *setclientid_confirm);
 513extern void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp);
 514extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
 515                struct nfsd4_sequence *seq);
 516extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp,
 517                struct nfsd4_compound_state *,
 518struct nfsd4_exchange_id *);
 519                extern __be32 nfsd4_create_session(struct svc_rqst *,
 520                struct nfsd4_compound_state *,
 521                struct nfsd4_create_session *);
 522extern __be32 nfsd4_sequence(struct svc_rqst *,
 523                struct nfsd4_compound_state *,
 524                struct nfsd4_sequence *);
 525extern __be32 nfsd4_destroy_session(struct svc_rqst *,
 526                struct nfsd4_compound_state *,
 527                struct nfsd4_destroy_session *);
 528extern __be32 nfsd4_process_open1(struct nfsd4_compound_state *,
 529                struct nfsd4_open *open);
 530extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp,
 531                struct svc_fh *current_fh, struct nfsd4_open *open);
 532extern __be32 nfsd4_open_confirm(struct svc_rqst *rqstp,
 533                struct nfsd4_compound_state *, struct nfsd4_open_confirm *oc);
 534extern __be32 nfsd4_close(struct svc_rqst *rqstp,
 535                struct nfsd4_compound_state *,
 536                struct nfsd4_close *close);
 537extern __be32 nfsd4_open_downgrade(struct svc_rqst *rqstp,
 538                struct nfsd4_compound_state *,
 539                struct nfsd4_open_downgrade *od);
 540extern __be32 nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *,
 541                struct nfsd4_lock *lock);
 542extern __be32 nfsd4_lockt(struct svc_rqst *rqstp,
 543                struct nfsd4_compound_state *,
 544                struct nfsd4_lockt *lockt);
 545extern __be32 nfsd4_locku(struct svc_rqst *rqstp,
 546                struct nfsd4_compound_state *,
 547                struct nfsd4_locku *locku);
 548extern __be32
 549nfsd4_release_lockowner(struct svc_rqst *rqstp,
 550                struct nfsd4_compound_state *,
 551                struct nfsd4_release_lockowner *rlockowner);
 552extern void nfsd4_release_compoundargs(struct nfsd4_compoundargs *);
 553extern __be32 nfsd4_delegreturn(struct svc_rqst *rqstp,
 554                struct nfsd4_compound_state *, struct nfsd4_delegreturn *dr);
 555extern __be32 nfsd4_renew(struct svc_rqst *rqstp,
 556                          struct nfsd4_compound_state *, clientid_t *clid);
 557#endif
 558
 559/*
 560 * Local variables:
 561 *  c-basic-offset: 8
 562 * End:
 563 */
 564