nfs_xdr.h revision 02a913a73b52071e93f4b76db3e86138d19efffd
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 timestamp; 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 const struct nfs_server *server; 128 int delegation_type; 129 nfs4_stateid delegation; 130 __u32 do_recall; 131 __u64 maxsize; 132}; 133 134/* 135 * Arguments to the open_confirm call. 136 */ 137struct nfs_open_confirmargs { 138 const struct nfs_fh * fh; 139 nfs4_stateid stateid; 140 struct nfs_seqid * seqid; 141}; 142 143struct nfs_open_confirmres { 144 nfs4_stateid stateid; 145}; 146 147/* 148 * Arguments to the close call. 149 */ 150struct nfs_closeargs { 151 struct nfs_fh * fh; 152 nfs4_stateid * stateid; 153 struct nfs_seqid * seqid; 154 int open_flags; 155}; 156 157struct nfs_closeres { 158 nfs4_stateid stateid; 159}; 160/* 161 * * Arguments to the lock,lockt, and locku call. 162 * */ 163struct nfs_lowner { 164 __u64 clientid; 165 u32 id; 166}; 167 168struct nfs_lock_opargs { 169 struct nfs_seqid * lock_seqid; 170 nfs4_stateid * lock_stateid; 171 struct nfs_seqid * open_seqid; 172 nfs4_stateid * open_stateid; 173 struct nfs_lowner lock_owner; 174 __u32 reclaim; 175 __u32 new_lock_owner; 176}; 177 178struct nfs_locku_opargs { 179 struct nfs_seqid * seqid; 180 nfs4_stateid * stateid; 181}; 182 183struct nfs_lockargs { 184 struct nfs_fh * fh; 185 __u32 type; 186 __u64 offset; 187 __u64 length; 188 union { 189 struct nfs_lock_opargs *lock; /* LOCK */ 190 struct nfs_lowner *lockt; /* LOCKT */ 191 struct nfs_locku_opargs *locku; /* LOCKU */ 192 } u; 193}; 194 195struct nfs_lock_denied { 196 __u64 offset; 197 __u64 length; 198 __u32 type; 199 struct nfs_lowner owner; 200}; 201 202struct nfs_lockres { 203 union { 204 nfs4_stateid stateid;/* LOCK success, LOCKU */ 205 struct nfs_lock_denied denied; /* LOCK failed, LOCKT success */ 206 } u; 207 const struct nfs_server * server; 208}; 209 210struct nfs4_delegreturnargs { 211 const struct nfs_fh *fhandle; 212 const nfs4_stateid *stateid; 213}; 214 215/* 216 * Arguments to the read call. 217 */ 218 219#define NFS_READ_MAXIOV (9U) 220#if (NFS_READ_MAXIOV > (MAX_IOVEC -2)) 221#error "NFS_READ_MAXIOV is too large" 222#endif 223 224struct nfs_readargs { 225 struct nfs_fh * fh; 226 struct nfs_open_context *context; 227 __u64 offset; 228 __u32 count; 229 unsigned int pgbase; 230 struct page ** pages; 231}; 232 233struct nfs_readres { 234 struct nfs_fattr * fattr; 235 __u32 count; 236 int eof; 237}; 238 239/* 240 * Arguments to the write call. 241 */ 242#define NFS_WRITE_MAXIOV (9U) 243#if (NFS_WRITE_MAXIOV > (MAX_IOVEC -2)) 244#error "NFS_WRITE_MAXIOV is too large" 245#endif 246 247struct nfs_writeargs { 248 struct nfs_fh * fh; 249 struct nfs_open_context *context; 250 __u64 offset; 251 __u32 count; 252 enum nfs3_stable_how stable; 253 unsigned int pgbase; 254 struct page ** pages; 255}; 256 257struct nfs_writeverf { 258 enum nfs3_stable_how committed; 259 __u32 verifier[2]; 260}; 261 262struct nfs_writeres { 263 struct nfs_fattr * fattr; 264 struct nfs_writeverf * verf; 265 __u32 count; 266}; 267 268/* 269 * Argument struct for decode_entry function 270 */ 271struct nfs_entry { 272 __u64 ino; 273 __u64 cookie, 274 prev_cookie; 275 const char * name; 276 unsigned int len; 277 int eof; 278 struct nfs_fh * fh; 279 struct nfs_fattr * fattr; 280}; 281 282/* 283 * The following types are for NFSv2 only. 284 */ 285struct nfs_sattrargs { 286 struct nfs_fh * fh; 287 struct iattr * sattr; 288}; 289 290struct nfs_diropargs { 291 struct nfs_fh * fh; 292 const char * name; 293 unsigned int len; 294}; 295 296struct nfs_createargs { 297 struct nfs_fh * fh; 298 const char * name; 299 unsigned int len; 300 struct iattr * sattr; 301}; 302 303struct nfs_renameargs { 304 struct nfs_fh * fromfh; 305 const char * fromname; 306 unsigned int fromlen; 307 struct nfs_fh * tofh; 308 const char * toname; 309 unsigned int tolen; 310}; 311 312struct nfs_setattrargs { 313 struct nfs_fh * fh; 314 nfs4_stateid stateid; 315 struct iattr * iap; 316 const struct nfs_server * server; /* Needed for name mapping */ 317 const u32 * bitmask; 318}; 319 320struct nfs_setaclargs { 321 struct nfs_fh * fh; 322 size_t acl_len; 323 unsigned int acl_pgbase; 324 struct page ** acl_pages; 325}; 326 327struct nfs_getaclargs { 328 struct nfs_fh * fh; 329 size_t acl_len; 330 unsigned int acl_pgbase; 331 struct page ** acl_pages; 332}; 333 334struct nfs_setattrres { 335 struct nfs_fattr * fattr; 336 const struct nfs_server * server; 337}; 338 339struct nfs_linkargs { 340 struct nfs_fh * fromfh; 341 struct nfs_fh * tofh; 342 const char * toname; 343 unsigned int tolen; 344}; 345 346struct nfs_symlinkargs { 347 struct nfs_fh * fromfh; 348 const char * fromname; 349 unsigned int fromlen; 350 const char * topath; 351 unsigned int tolen; 352 struct iattr * sattr; 353}; 354 355struct nfs_readdirargs { 356 struct nfs_fh * fh; 357 __u32 cookie; 358 unsigned int count; 359 struct page ** pages; 360}; 361 362struct nfs3_getaclargs { 363 struct nfs_fh * fh; 364 int mask; 365 struct page ** pages; 366}; 367 368struct nfs3_setaclargs { 369 struct inode * inode; 370 int mask; 371 struct posix_acl * acl_access; 372 struct posix_acl * acl_default; 373 struct page ** pages; 374}; 375 376struct nfs_diropok { 377 struct nfs_fh * fh; 378 struct nfs_fattr * fattr; 379}; 380 381struct nfs_readlinkargs { 382 struct nfs_fh * fh; 383 unsigned int pgbase; 384 unsigned int pglen; 385 struct page ** pages; 386}; 387 388struct nfs3_sattrargs { 389 struct nfs_fh * fh; 390 struct iattr * sattr; 391 unsigned int guard; 392 struct timespec guardtime; 393}; 394 395struct nfs3_diropargs { 396 struct nfs_fh * fh; 397 const char * name; 398 unsigned int len; 399}; 400 401struct nfs3_accessargs { 402 struct nfs_fh * fh; 403 __u32 access; 404}; 405 406struct nfs3_createargs { 407 struct nfs_fh * fh; 408 const char * name; 409 unsigned int len; 410 struct iattr * sattr; 411 enum nfs3_createmode createmode; 412 __u32 verifier[2]; 413}; 414 415struct nfs3_mkdirargs { 416 struct nfs_fh * fh; 417 const char * name; 418 unsigned int len; 419 struct iattr * sattr; 420}; 421 422struct nfs3_symlinkargs { 423 struct nfs_fh * fromfh; 424 const char * fromname; 425 unsigned int fromlen; 426 const char * topath; 427 unsigned int tolen; 428 struct iattr * sattr; 429}; 430 431struct nfs3_mknodargs { 432 struct nfs_fh * fh; 433 const char * name; 434 unsigned int len; 435 enum nfs3_ftype type; 436 struct iattr * sattr; 437 dev_t rdev; 438}; 439 440struct nfs3_renameargs { 441 struct nfs_fh * fromfh; 442 const char * fromname; 443 unsigned int fromlen; 444 struct nfs_fh * tofh; 445 const char * toname; 446 unsigned int tolen; 447}; 448 449struct nfs3_linkargs { 450 struct nfs_fh * fromfh; 451 struct nfs_fh * tofh; 452 const char * toname; 453 unsigned int tolen; 454}; 455 456struct nfs3_readdirargs { 457 struct nfs_fh * fh; 458 __u64 cookie; 459 __u32 verf[2]; 460 int plus; 461 unsigned int count; 462 struct page ** pages; 463}; 464 465struct nfs3_diropres { 466 struct nfs_fattr * dir_attr; 467 struct nfs_fh * fh; 468 struct nfs_fattr * fattr; 469}; 470 471struct nfs3_accessres { 472 struct nfs_fattr * fattr; 473 __u32 access; 474}; 475 476struct nfs3_readlinkargs { 477 struct nfs_fh * fh; 478 unsigned int pgbase; 479 unsigned int pglen; 480 struct page ** pages; 481}; 482 483struct nfs3_renameres { 484 struct nfs_fattr * fromattr; 485 struct nfs_fattr * toattr; 486}; 487 488struct nfs3_linkres { 489 struct nfs_fattr * dir_attr; 490 struct nfs_fattr * fattr; 491}; 492 493struct nfs3_readdirres { 494 struct nfs_fattr * dir_attr; 495 __u32 * verf; 496 int plus; 497}; 498 499struct nfs3_getaclres { 500 struct nfs_fattr * fattr; 501 int mask; 502 unsigned int acl_access_count; 503 unsigned int acl_default_count; 504 struct posix_acl * acl_access; 505 struct posix_acl * acl_default; 506}; 507 508#ifdef CONFIG_NFS_V4 509 510typedef u64 clientid4; 511 512struct nfs4_accessargs { 513 const struct nfs_fh * fh; 514 u32 access; 515}; 516 517struct nfs4_accessres { 518 u32 supported; 519 u32 access; 520}; 521 522struct nfs4_create_arg { 523 u32 ftype; 524 union { 525 struct qstr * symlink; /* NF4LNK */ 526 struct { 527 u32 specdata1; 528 u32 specdata2; 529 } device; /* NF4BLK, NF4CHR */ 530 } u; 531 const struct qstr * name; 532 const struct nfs_server * server; 533 const struct iattr * attrs; 534 const struct nfs_fh * dir_fh; 535 const u32 * bitmask; 536}; 537 538struct nfs4_create_res { 539 const struct nfs_server * server; 540 struct nfs_fh * fh; 541 struct nfs_fattr * fattr; 542 struct nfs4_change_info dir_cinfo; 543}; 544 545struct nfs4_fsinfo_arg { 546 const struct nfs_fh * fh; 547 const u32 * bitmask; 548}; 549 550struct nfs4_getattr_arg { 551 const struct nfs_fh * fh; 552 const u32 * bitmask; 553}; 554 555struct nfs4_getattr_res { 556 const struct nfs_server * server; 557 struct nfs_fattr * fattr; 558}; 559 560struct nfs4_link_arg { 561 const struct nfs_fh * fh; 562 const struct nfs_fh * dir_fh; 563 const struct qstr * name; 564}; 565 566struct nfs4_lookup_arg { 567 const struct nfs_fh * dir_fh; 568 const struct qstr * name; 569 const u32 * bitmask; 570}; 571 572struct nfs4_lookup_res { 573 const struct nfs_server * server; 574 struct nfs_fattr * fattr; 575 struct nfs_fh * fh; 576}; 577 578struct nfs4_lookup_root_arg { 579 const u32 * bitmask; 580}; 581 582struct nfs4_pathconf_arg { 583 const struct nfs_fh * fh; 584 const u32 * bitmask; 585}; 586 587struct nfs4_readdir_arg { 588 const struct nfs_fh * fh; 589 u64 cookie; 590 nfs4_verifier verifier; 591 u32 count; 592 struct page ** pages; /* zero-copy data */ 593 unsigned int pgbase; /* zero-copy data */ 594 const u32 * bitmask; 595}; 596 597struct nfs4_readdir_res { 598 nfs4_verifier verifier; 599 unsigned int pgbase; 600}; 601 602struct nfs4_readlink { 603 const struct nfs_fh * fh; 604 unsigned int pgbase; 605 unsigned int pglen; /* zero-copy data */ 606 struct page ** pages; /* zero-copy data */ 607}; 608 609struct nfs4_remove_arg { 610 const struct nfs_fh * fh; 611 const struct qstr * name; 612}; 613 614struct nfs4_rename_arg { 615 const struct nfs_fh * old_dir; 616 const struct nfs_fh * new_dir; 617 const struct qstr * old_name; 618 const struct qstr * new_name; 619}; 620 621struct nfs4_rename_res { 622 struct nfs4_change_info old_cinfo; 623 struct nfs4_change_info new_cinfo; 624}; 625 626struct nfs4_setclientid { 627 const nfs4_verifier * sc_verifier; /* request */ 628 unsigned int sc_name_len; 629 char sc_name[32]; /* request */ 630 u32 sc_prog; /* request */ 631 unsigned int sc_netid_len; 632 char sc_netid[4]; /* request */ 633 unsigned int sc_uaddr_len; 634 char sc_uaddr[24]; /* request */ 635 u32 sc_cb_ident; /* request */ 636}; 637 638struct nfs4_statfs_arg { 639 const struct nfs_fh * fh; 640 const u32 * bitmask; 641}; 642 643struct nfs4_server_caps_res { 644 u32 attr_bitmask[2]; 645 u32 acl_bitmask; 646 u32 has_links; 647 u32 has_symlinks; 648}; 649 650#endif /* CONFIG_NFS_V4 */ 651 652struct nfs_page; 653 654struct nfs_read_data { 655 int flags; 656 struct rpc_task task; 657 struct inode *inode; 658 struct rpc_cred *cred; 659 struct nfs_fattr fattr; /* fattr storage */ 660 struct list_head pages; /* Coalesced read requests */ 661 struct nfs_page *req; /* multi ops per nfs_page */ 662 struct page *pagevec[NFS_READ_MAXIOV]; 663 struct nfs_readargs args; 664 struct nfs_readres res; 665#ifdef CONFIG_NFS_V4 666 unsigned long timestamp; /* For lease renewal */ 667#endif 668 void (*complete) (struct nfs_read_data *, int); 669}; 670 671struct nfs_write_data { 672 int flags; 673 struct rpc_task task; 674 struct inode *inode; 675 struct rpc_cred *cred; 676 struct nfs_fattr fattr; 677 struct nfs_writeverf verf; 678 struct list_head pages; /* Coalesced requests we wish to flush */ 679 struct nfs_page *req; /* multi ops per nfs_page */ 680 struct page *pagevec[NFS_WRITE_MAXIOV]; 681 struct nfs_writeargs args; /* argument struct */ 682 struct nfs_writeres res; /* result struct */ 683#ifdef CONFIG_NFS_V4 684 unsigned long timestamp; /* For lease renewal */ 685#endif 686 void (*complete) (struct nfs_write_data *, int); 687}; 688 689struct nfs_access_entry; 690 691/* 692 * RPC procedure vector for NFSv2/NFSv3 demuxing 693 */ 694struct nfs_rpc_ops { 695 int version; /* Protocol version */ 696 struct dentry_operations *dentry_ops; 697 struct inode_operations *dir_inode_ops; 698 struct inode_operations *file_inode_ops; 699 700 int (*getroot) (struct nfs_server *, struct nfs_fh *, 701 struct nfs_fsinfo *); 702 int (*getattr) (struct nfs_server *, struct nfs_fh *, 703 struct nfs_fattr *); 704 int (*setattr) (struct dentry *, struct nfs_fattr *, 705 struct iattr *); 706 int (*lookup) (struct inode *, struct qstr *, 707 struct nfs_fh *, struct nfs_fattr *); 708 int (*access) (struct inode *, struct nfs_access_entry *); 709 int (*readlink)(struct inode *, struct page *, unsigned int, 710 unsigned int); 711 int (*read) (struct nfs_read_data *); 712 int (*write) (struct nfs_write_data *); 713 int (*commit) (struct nfs_write_data *); 714 int (*create) (struct inode *, struct dentry *, 715 struct iattr *, int, struct nameidata *); 716 int (*remove) (struct inode *, struct qstr *); 717 int (*unlink_setup) (struct rpc_message *, 718 struct dentry *, struct qstr *); 719 int (*unlink_done) (struct dentry *, struct rpc_task *); 720 int (*rename) (struct inode *, struct qstr *, 721 struct inode *, struct qstr *); 722 int (*link) (struct inode *, struct inode *, struct qstr *); 723 int (*symlink) (struct inode *, struct qstr *, struct qstr *, 724 struct iattr *, struct nfs_fh *, 725 struct nfs_fattr *); 726 int (*mkdir) (struct inode *, struct dentry *, struct iattr *); 727 int (*rmdir) (struct inode *, struct qstr *); 728 int (*readdir) (struct dentry *, struct rpc_cred *, 729 u64, struct page *, unsigned int, int); 730 int (*mknod) (struct inode *, struct dentry *, struct iattr *, 731 dev_t); 732 int (*statfs) (struct nfs_server *, struct nfs_fh *, 733 struct nfs_fsstat *); 734 int (*fsinfo) (struct nfs_server *, struct nfs_fh *, 735 struct nfs_fsinfo *); 736 int (*pathconf) (struct nfs_server *, struct nfs_fh *, 737 struct nfs_pathconf *); 738 u32 * (*decode_dirent)(u32 *, struct nfs_entry *, int plus); 739 void (*read_setup) (struct nfs_read_data *); 740 void (*write_setup) (struct nfs_write_data *, int how); 741 void (*commit_setup) (struct nfs_write_data *, int how); 742 int (*file_open) (struct inode *, struct file *); 743 int (*file_release) (struct inode *, struct file *); 744 int (*lock)(struct file *, int, struct file_lock *); 745 void (*clear_acl_cache)(struct inode *); 746}; 747 748/* 749 * NFS_CALL(getattr, inode, (fattr)); 750 * into 751 * NFS_PROTO(inode)->getattr(fattr); 752 */ 753#define NFS_CALL(op, inode, args) NFS_PROTO(inode)->op args 754 755/* 756 * Function vectors etc. for the NFS client 757 */ 758extern struct nfs_rpc_ops nfs_v2_clientops; 759extern struct nfs_rpc_ops nfs_v3_clientops; 760extern struct nfs_rpc_ops nfs_v4_clientops; 761extern struct rpc_version nfs_version2; 762extern struct rpc_version nfs_version3; 763extern struct rpc_version nfs_version4; 764 765extern struct rpc_version nfsacl_version3; 766extern struct rpc_program nfsacl_program; 767 768#endif 769