nfs_xdr.h revision 516a6af641bb50c608329a5bd751acd0d65cc4ab
1#ifndef _LINUX_NFS_XDR_H 2#define _LINUX_NFS_XDR_H 3 4#include <linux/sunrpc/xprt.h> 5#include <linux/nfsacl.h> 6 7struct nfs4_fsid { 8 __u64 major; 9 __u64 minor; 10}; 11 12struct nfs_fattr { 13 unsigned short valid; /* which fields are valid */ 14 __u64 pre_size; /* pre_op_attr.size */ 15 struct timespec pre_mtime; /* pre_op_attr.mtime */ 16 struct timespec pre_ctime; /* pre_op_attr.ctime */ 17 enum nfs_ftype type; /* always use NFSv2 types */ 18 __u32 mode; 19 __u32 nlink; 20 __u32 uid; 21 __u32 gid; 22 __u64 size; 23 union { 24 struct { 25 __u32 blocksize; 26 __u32 blocks; 27 } nfs2; 28 struct { 29 __u64 used; 30 } nfs3; 31 } du; 32 dev_t rdev; 33 union { 34 __u64 nfs3; /* also nfs2 */ 35 struct nfs4_fsid nfs4; 36 } fsid_u; 37 __u64 fileid; 38 struct timespec atime; 39 struct timespec mtime; 40 struct timespec ctime; 41 __u32 bitmap[2]; /* NFSv4 returned attribute bitmap */ 42 __u64 change_attr; /* NFSv4 change attribute */ 43 __u64 pre_change_attr;/* pre-op NFSv4 change attribute */ 44 unsigned long time_start; 45}; 46 47#define NFS_ATTR_WCC 0x0001 /* pre-op WCC data */ 48#define NFS_ATTR_FATTR 0x0002 /* post-op attributes */ 49#define NFS_ATTR_FATTR_V3 0x0004 /* NFSv3 attributes */ 50#define NFS_ATTR_FATTR_V4 0x0008 51#define NFS_ATTR_PRE_CHANGE 0x0010 52 53/* 54 * Info on the file system 55 */ 56struct nfs_fsinfo { 57 struct nfs_fattr *fattr; /* Post-op attributes */ 58 __u32 rtmax; /* max. read transfer size */ 59 __u32 rtpref; /* pref. read transfer size */ 60 __u32 rtmult; /* reads should be multiple of this */ 61 __u32 wtmax; /* max. write transfer size */ 62 __u32 wtpref; /* pref. write transfer size */ 63 __u32 wtmult; /* writes should be multiple of this */ 64 __u32 dtpref; /* pref. readdir transfer size */ 65 __u64 maxfilesize; 66 __u32 lease_time; /* in seconds */ 67}; 68 69struct nfs_fsstat { 70 struct nfs_fattr *fattr; /* Post-op attributes */ 71 __u64 tbytes; /* total size in bytes */ 72 __u64 fbytes; /* # of free bytes */ 73 __u64 abytes; /* # of bytes available to user */ 74 __u64 tfiles; /* # of files */ 75 __u64 ffiles; /* # of free files */ 76 __u64 afiles; /* # of files available to user */ 77}; 78 79struct nfs2_fsstat { 80 __u32 tsize; /* Server transfer size */ 81 __u32 bsize; /* Filesystem block size */ 82 __u32 blocks; /* No. of "bsize" blocks on filesystem */ 83 __u32 bfree; /* No. of free "bsize" blocks */ 84 __u32 bavail; /* No. of available "bsize" blocks */ 85}; 86 87struct nfs_pathconf { 88 struct nfs_fattr *fattr; /* Post-op attributes */ 89 __u32 max_link; /* max # of hard links */ 90 __u32 max_namelen; /* max name length */ 91}; 92 93struct nfs4_change_info { 94 u32 atomic; 95 u64 before; 96 u64 after; 97}; 98 99struct nfs_seqid; 100/* 101 * Arguments to the open call. 102 */ 103struct nfs_openargs { 104 const struct nfs_fh * fh; 105 struct nfs_seqid * seqid; 106 int open_flags; 107 __u64 clientid; 108 __u32 id; 109 union { 110 struct iattr * attrs; /* UNCHECKED, GUARDED */ 111 nfs4_verifier verifier; /* EXCLUSIVE */ 112 nfs4_stateid delegation; /* CLAIM_DELEGATE_CUR */ 113 int delegation_type; /* CLAIM_PREVIOUS */ 114 } u; 115 const struct qstr * name; 116 const struct nfs_server *server; /* Needed for ID mapping */ 117 const u32 * bitmask; 118 __u32 claim; 119}; 120 121struct nfs_openres { 122 nfs4_stateid stateid; 123 struct nfs_fh fh; 124 struct nfs4_change_info cinfo; 125 __u32 rflags; 126 struct nfs_fattr * f_attr; 127 struct nfs_fattr * dir_attr; 128 const struct nfs_server *server; 129 int delegation_type; 130 nfs4_stateid delegation; 131 __u32 do_recall; 132 __u64 maxsize; 133}; 134 135/* 136 * Arguments to the open_confirm call. 137 */ 138struct nfs_open_confirmargs { 139 const struct nfs_fh * fh; 140 nfs4_stateid stateid; 141 struct nfs_seqid * seqid; 142}; 143 144struct nfs_open_confirmres { 145 nfs4_stateid stateid; 146}; 147 148/* 149 * Arguments to the close call. 150 */ 151struct nfs_closeargs { 152 struct nfs_fh * fh; 153 nfs4_stateid * stateid; 154 struct nfs_seqid * seqid; 155 int open_flags; 156 const u32 * bitmask; 157}; 158 159struct nfs_closeres { 160 nfs4_stateid stateid; 161 struct nfs_fattr * fattr; 162 const struct nfs_server *server; 163}; 164/* 165 * * Arguments to the lock,lockt, and locku call. 166 * */ 167struct nfs_lowner { 168 __u64 clientid; 169 u32 id; 170}; 171 172struct nfs_lock_opargs { 173 struct nfs_seqid * lock_seqid; 174 nfs4_stateid * lock_stateid; 175 struct nfs_seqid * open_seqid; 176 nfs4_stateid * open_stateid; 177 struct nfs_lowner lock_owner; 178 __u32 reclaim; 179 __u32 new_lock_owner; 180}; 181 182struct nfs_locku_opargs { 183 struct nfs_seqid * seqid; 184 nfs4_stateid * stateid; 185}; 186 187struct nfs_lockargs { 188 struct nfs_fh * fh; 189 __u32 type; 190 __u64 offset; 191 __u64 length; 192 union { 193 struct nfs_lock_opargs *lock; /* LOCK */ 194 struct nfs_lowner *lockt; /* LOCKT */ 195 struct nfs_locku_opargs *locku; /* LOCKU */ 196 } u; 197}; 198 199struct nfs_lock_denied { 200 __u64 offset; 201 __u64 length; 202 __u32 type; 203 struct nfs_lowner owner; 204}; 205 206struct nfs_lockres { 207 union { 208 nfs4_stateid stateid;/* LOCK success, LOCKU */ 209 struct nfs_lock_denied denied; /* LOCK failed, LOCKT success */ 210 } u; 211 const struct nfs_server * server; 212}; 213 214struct nfs4_delegreturnargs { 215 const struct nfs_fh *fhandle; 216 const nfs4_stateid *stateid; 217}; 218 219/* 220 * Arguments to the read call. 221 */ 222 223#define NFS_READ_MAXIOV (9U) 224#if (NFS_READ_MAXIOV > (MAX_IOVEC -2)) 225#error "NFS_READ_MAXIOV is too large" 226#endif 227 228struct nfs_readargs { 229 struct nfs_fh * fh; 230 struct nfs_open_context *context; 231 __u64 offset; 232 __u32 count; 233 unsigned int pgbase; 234 struct page ** pages; 235}; 236 237struct nfs_readres { 238 struct nfs_fattr * fattr; 239 __u32 count; 240 int eof; 241}; 242 243/* 244 * Arguments to the write call. 245 */ 246#define NFS_WRITE_MAXIOV (9U) 247#if (NFS_WRITE_MAXIOV > (MAX_IOVEC -2)) 248#error "NFS_WRITE_MAXIOV is too large" 249#endif 250 251struct nfs_writeargs { 252 struct nfs_fh * fh; 253 struct nfs_open_context *context; 254 __u64 offset; 255 __u32 count; 256 enum nfs3_stable_how stable; 257 unsigned int pgbase; 258 struct page ** pages; 259}; 260 261struct nfs_writeverf { 262 enum nfs3_stable_how committed; 263 __u32 verifier[2]; 264}; 265 266struct nfs_writeres { 267 struct nfs_fattr * fattr; 268 struct nfs_writeverf * verf; 269 __u32 count; 270}; 271 272/* 273 * Argument struct for decode_entry function 274 */ 275struct nfs_entry { 276 __u64 ino; 277 __u64 cookie, 278 prev_cookie; 279 const char * name; 280 unsigned int len; 281 int eof; 282 struct nfs_fh * fh; 283 struct nfs_fattr * fattr; 284}; 285 286/* 287 * The following types are for NFSv2 only. 288 */ 289struct nfs_sattrargs { 290 struct nfs_fh * fh; 291 struct iattr * sattr; 292}; 293 294struct nfs_diropargs { 295 struct nfs_fh * fh; 296 const char * name; 297 unsigned int len; 298}; 299 300struct nfs_createargs { 301 struct nfs_fh * fh; 302 const char * name; 303 unsigned int len; 304 struct iattr * sattr; 305}; 306 307struct nfs_renameargs { 308 struct nfs_fh * fromfh; 309 const char * fromname; 310 unsigned int fromlen; 311 struct nfs_fh * tofh; 312 const char * toname; 313 unsigned int tolen; 314}; 315 316struct nfs_setattrargs { 317 struct nfs_fh * fh; 318 nfs4_stateid stateid; 319 struct iattr * iap; 320 const struct nfs_server * server; /* Needed for name mapping */ 321 const u32 * bitmask; 322}; 323 324struct nfs_setaclargs { 325 struct nfs_fh * fh; 326 size_t acl_len; 327 unsigned int acl_pgbase; 328 struct page ** acl_pages; 329}; 330 331struct nfs_getaclargs { 332 struct nfs_fh * fh; 333 size_t acl_len; 334 unsigned int acl_pgbase; 335 struct page ** acl_pages; 336}; 337 338struct nfs_setattrres { 339 struct nfs_fattr * fattr; 340 const struct nfs_server * server; 341}; 342 343struct nfs_linkargs { 344 struct nfs_fh * fromfh; 345 struct nfs_fh * tofh; 346 const char * toname; 347 unsigned int tolen; 348}; 349 350struct nfs_symlinkargs { 351 struct nfs_fh * fromfh; 352 const char * fromname; 353 unsigned int fromlen; 354 const char * topath; 355 unsigned int tolen; 356 struct iattr * sattr; 357}; 358 359struct nfs_readdirargs { 360 struct nfs_fh * fh; 361 __u32 cookie; 362 unsigned int count; 363 struct page ** pages; 364}; 365 366struct nfs3_getaclargs { 367 struct nfs_fh * fh; 368 int mask; 369 struct page ** pages; 370}; 371 372struct nfs3_setaclargs { 373 struct inode * inode; 374 int mask; 375 struct posix_acl * acl_access; 376 struct posix_acl * acl_default; 377 struct page ** pages; 378}; 379 380struct nfs_diropok { 381 struct nfs_fh * fh; 382 struct nfs_fattr * fattr; 383}; 384 385struct nfs_readlinkargs { 386 struct nfs_fh * fh; 387 unsigned int pgbase; 388 unsigned int pglen; 389 struct page ** pages; 390}; 391 392struct nfs3_sattrargs { 393 struct nfs_fh * fh; 394 struct iattr * sattr; 395 unsigned int guard; 396 struct timespec guardtime; 397}; 398 399struct nfs3_diropargs { 400 struct nfs_fh * fh; 401 const char * name; 402 unsigned int len; 403}; 404 405struct nfs3_accessargs { 406 struct nfs_fh * fh; 407 __u32 access; 408}; 409 410struct nfs3_createargs { 411 struct nfs_fh * fh; 412 const char * name; 413 unsigned int len; 414 struct iattr * sattr; 415 enum nfs3_createmode createmode; 416 __u32 verifier[2]; 417}; 418 419struct nfs3_mkdirargs { 420 struct nfs_fh * fh; 421 const char * name; 422 unsigned int len; 423 struct iattr * sattr; 424}; 425 426struct nfs3_symlinkargs { 427 struct nfs_fh * fromfh; 428 const char * fromname; 429 unsigned int fromlen; 430 const char * topath; 431 unsigned int tolen; 432 struct iattr * sattr; 433}; 434 435struct nfs3_mknodargs { 436 struct nfs_fh * fh; 437 const char * name; 438 unsigned int len; 439 enum nfs3_ftype type; 440 struct iattr * sattr; 441 dev_t rdev; 442}; 443 444struct nfs3_renameargs { 445 struct nfs_fh * fromfh; 446 const char * fromname; 447 unsigned int fromlen; 448 struct nfs_fh * tofh; 449 const char * toname; 450 unsigned int tolen; 451}; 452 453struct nfs3_linkargs { 454 struct nfs_fh * fromfh; 455 struct nfs_fh * tofh; 456 const char * toname; 457 unsigned int tolen; 458}; 459 460struct nfs3_readdirargs { 461 struct nfs_fh * fh; 462 __u64 cookie; 463 __u32 verf[2]; 464 int plus; 465 unsigned int count; 466 struct page ** pages; 467}; 468 469struct nfs3_diropres { 470 struct nfs_fattr * dir_attr; 471 struct nfs_fh * fh; 472 struct nfs_fattr * fattr; 473}; 474 475struct nfs3_accessres { 476 struct nfs_fattr * fattr; 477 __u32 access; 478}; 479 480struct nfs3_readlinkargs { 481 struct nfs_fh * fh; 482 unsigned int pgbase; 483 unsigned int pglen; 484 struct page ** pages; 485}; 486 487struct nfs3_renameres { 488 struct nfs_fattr * fromattr; 489 struct nfs_fattr * toattr; 490}; 491 492struct nfs3_linkres { 493 struct nfs_fattr * dir_attr; 494 struct nfs_fattr * fattr; 495}; 496 497struct nfs3_readdirres { 498 struct nfs_fattr * dir_attr; 499 __u32 * verf; 500 int plus; 501}; 502 503struct nfs3_getaclres { 504 struct nfs_fattr * fattr; 505 int mask; 506 unsigned int acl_access_count; 507 unsigned int acl_default_count; 508 struct posix_acl * acl_access; 509 struct posix_acl * acl_default; 510}; 511 512#ifdef CONFIG_NFS_V4 513 514typedef u64 clientid4; 515 516struct nfs4_accessargs { 517 const struct nfs_fh * fh; 518 u32 access; 519}; 520 521struct nfs4_accessres { 522 u32 supported; 523 u32 access; 524}; 525 526struct nfs4_create_arg { 527 u32 ftype; 528 union { 529 struct qstr * symlink; /* NF4LNK */ 530 struct { 531 u32 specdata1; 532 u32 specdata2; 533 } device; /* NF4BLK, NF4CHR */ 534 } u; 535 const struct qstr * name; 536 const struct nfs_server * server; 537 const struct iattr * attrs; 538 const struct nfs_fh * dir_fh; 539 const u32 * bitmask; 540}; 541 542struct nfs4_create_res { 543 const struct nfs_server * server; 544 struct nfs_fh * fh; 545 struct nfs_fattr * fattr; 546 struct nfs4_change_info dir_cinfo; 547 struct nfs_fattr * dir_fattr; 548}; 549 550struct nfs4_fsinfo_arg { 551 const struct nfs_fh * fh; 552 const u32 * bitmask; 553}; 554 555struct nfs4_getattr_arg { 556 const struct nfs_fh * fh; 557 const u32 * bitmask; 558}; 559 560struct nfs4_getattr_res { 561 const struct nfs_server * server; 562 struct nfs_fattr * fattr; 563}; 564 565struct nfs4_link_arg { 566 const struct nfs_fh * fh; 567 const struct nfs_fh * dir_fh; 568 const struct qstr * name; 569}; 570 571struct nfs4_lookup_arg { 572 const struct nfs_fh * dir_fh; 573 const struct qstr * name; 574 const u32 * bitmask; 575}; 576 577struct nfs4_lookup_res { 578 const struct nfs_server * server; 579 struct nfs_fattr * fattr; 580 struct nfs_fh * fh; 581}; 582 583struct nfs4_lookup_root_arg { 584 const u32 * bitmask; 585}; 586 587struct nfs4_pathconf_arg { 588 const struct nfs_fh * fh; 589 const u32 * bitmask; 590}; 591 592struct nfs4_readdir_arg { 593 const struct nfs_fh * fh; 594 u64 cookie; 595 nfs4_verifier verifier; 596 u32 count; 597 struct page ** pages; /* zero-copy data */ 598 unsigned int pgbase; /* zero-copy data */ 599 const u32 * bitmask; 600}; 601 602struct nfs4_readdir_res { 603 nfs4_verifier verifier; 604 unsigned int pgbase; 605}; 606 607struct nfs4_readlink { 608 const struct nfs_fh * fh; 609 unsigned int pgbase; 610 unsigned int pglen; /* zero-copy data */ 611 struct page ** pages; /* zero-copy data */ 612}; 613 614struct nfs4_remove_arg { 615 const struct nfs_fh * fh; 616 const struct qstr * name; 617}; 618 619struct nfs4_rename_arg { 620 const struct nfs_fh * old_dir; 621 const struct nfs_fh * new_dir; 622 const struct qstr * old_name; 623 const struct qstr * new_name; 624}; 625 626struct nfs4_rename_res { 627 struct nfs4_change_info old_cinfo; 628 struct nfs4_change_info new_cinfo; 629}; 630 631struct nfs4_setclientid { 632 const nfs4_verifier * sc_verifier; /* request */ 633 unsigned int sc_name_len; 634 char sc_name[32]; /* request */ 635 u32 sc_prog; /* request */ 636 unsigned int sc_netid_len; 637 char sc_netid[4]; /* request */ 638 unsigned int sc_uaddr_len; 639 char sc_uaddr[24]; /* request */ 640 u32 sc_cb_ident; /* request */ 641}; 642 643struct nfs4_statfs_arg { 644 const struct nfs_fh * fh; 645 const u32 * bitmask; 646}; 647 648struct nfs4_server_caps_res { 649 u32 attr_bitmask[2]; 650 u32 acl_bitmask; 651 u32 has_links; 652 u32 has_symlinks; 653}; 654 655#endif /* CONFIG_NFS_V4 */ 656 657struct nfs_page; 658 659struct nfs_read_data { 660 int flags; 661 struct rpc_task task; 662 struct inode *inode; 663 struct rpc_cred *cred; 664 struct nfs_fattr fattr; /* fattr storage */ 665 struct list_head pages; /* Coalesced read requests */ 666 struct nfs_page *req; /* multi ops per nfs_page */ 667 struct page *pagevec[NFS_READ_MAXIOV]; 668 struct nfs_readargs args; 669 struct nfs_readres res; 670#ifdef CONFIG_NFS_V4 671 unsigned long timestamp; /* For lease renewal */ 672#endif 673 void (*complete) (struct nfs_read_data *, int); 674}; 675 676struct nfs_write_data { 677 int flags; 678 struct rpc_task task; 679 struct inode *inode; 680 struct rpc_cred *cred; 681 struct nfs_fattr fattr; 682 struct nfs_writeverf verf; 683 struct list_head pages; /* Coalesced requests we wish to flush */ 684 struct nfs_page *req; /* multi ops per nfs_page */ 685 struct page *pagevec[NFS_WRITE_MAXIOV]; 686 struct nfs_writeargs args; /* argument struct */ 687 struct nfs_writeres res; /* result struct */ 688#ifdef CONFIG_NFS_V4 689 unsigned long timestamp; /* For lease renewal */ 690#endif 691 void (*complete) (struct nfs_write_data *, int); 692}; 693 694struct nfs_access_entry; 695 696/* 697 * RPC procedure vector for NFSv2/NFSv3 demuxing 698 */ 699struct nfs_rpc_ops { 700 int version; /* Protocol version */ 701 struct dentry_operations *dentry_ops; 702 struct inode_operations *dir_inode_ops; 703 struct inode_operations *file_inode_ops; 704 705 int (*getroot) (struct nfs_server *, struct nfs_fh *, 706 struct nfs_fsinfo *); 707 int (*getattr) (struct nfs_server *, struct nfs_fh *, 708 struct nfs_fattr *); 709 int (*setattr) (struct dentry *, struct nfs_fattr *, 710 struct iattr *); 711 int (*lookup) (struct inode *, struct qstr *, 712 struct nfs_fh *, struct nfs_fattr *); 713 int (*access) (struct inode *, struct nfs_access_entry *); 714 int (*readlink)(struct inode *, struct page *, unsigned int, 715 unsigned int); 716 int (*read) (struct nfs_read_data *); 717 int (*write) (struct nfs_write_data *); 718 int (*commit) (struct nfs_write_data *); 719 int (*create) (struct inode *, struct dentry *, 720 struct iattr *, int, struct nameidata *); 721 int (*remove) (struct inode *, struct qstr *); 722 int (*unlink_setup) (struct rpc_message *, 723 struct dentry *, struct qstr *); 724 int (*unlink_done) (struct dentry *, struct rpc_task *); 725 int (*rename) (struct inode *, struct qstr *, 726 struct inode *, struct qstr *); 727 int (*link) (struct inode *, struct inode *, struct qstr *); 728 int (*symlink) (struct inode *, struct qstr *, struct qstr *, 729 struct iattr *, struct nfs_fh *, 730 struct nfs_fattr *); 731 int (*mkdir) (struct inode *, struct dentry *, struct iattr *); 732 int (*rmdir) (struct inode *, struct qstr *); 733 int (*readdir) (struct dentry *, struct rpc_cred *, 734 u64, struct page *, unsigned int, int); 735 int (*mknod) (struct inode *, struct dentry *, struct iattr *, 736 dev_t); 737 int (*statfs) (struct nfs_server *, struct nfs_fh *, 738 struct nfs_fsstat *); 739 int (*fsinfo) (struct nfs_server *, struct nfs_fh *, 740 struct nfs_fsinfo *); 741 int (*pathconf) (struct nfs_server *, struct nfs_fh *, 742 struct nfs_pathconf *); 743 u32 * (*decode_dirent)(u32 *, struct nfs_entry *, int plus); 744 void (*read_setup) (struct nfs_read_data *); 745 void (*write_setup) (struct nfs_write_data *, int how); 746 void (*commit_setup) (struct nfs_write_data *, int how); 747 int (*file_open) (struct inode *, struct file *); 748 int (*file_release) (struct inode *, struct file *); 749 int (*lock)(struct file *, int, struct file_lock *); 750 void (*clear_acl_cache)(struct inode *); 751}; 752 753/* 754 * NFS_CALL(getattr, inode, (fattr)); 755 * into 756 * NFS_PROTO(inode)->getattr(fattr); 757 */ 758#define NFS_CALL(op, inode, args) NFS_PROTO(inode)->op args 759 760/* 761 * Function vectors etc. for the NFS client 762 */ 763extern struct nfs_rpc_ops nfs_v2_clientops; 764extern struct nfs_rpc_ops nfs_v3_clientops; 765extern struct nfs_rpc_ops nfs_v4_clientops; 766extern struct rpc_version nfs_version2; 767extern struct rpc_version nfs_version3; 768extern struct rpc_version nfs_version4; 769 770extern struct rpc_version nfsacl_version3; 771extern struct rpc_program nfsacl_program; 772 773#endif 774