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