📄 nfs4xdr.c
字号:
/* * fs/nfs/nfs4xdr.c * * Client-side XDR for NFSv4. * * Copyright (c) 2002 The Regents of the University of Michigan. * All rights reserved. * * Kendrick Smith <kmsmith@umich.edu> * Andy Adamson <andros@umich.edu> * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include <linux/param.h>#include <linux/time.h>#include <linux/mm.h>#include <linux/slab.h>#include <linux/utsname.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/in.h>#include <linux/pagemap.h>#include <linux/proc_fs.h>#include <linux/kdev_t.h>#include <linux/sunrpc/clnt.h>#include <linux/nfs.h>#include <linux/nfs4.h>#include <linux/nfs_fs.h>#include <linux/nfs_idmap.h>#include "nfs4_fs.h"#define NFSDBG_FACILITY NFSDBG_XDR/* Mapping from NFS error code to "errno" error code. */#define errno_NFSERR_IO EIOstatic int nfs4_stat_to_errno(int);/* NFSv4 COMPOUND tags are only wanted for debugging purposes */#ifdef DEBUG#define NFS4_MAXTAGLEN 20#else#define NFS4_MAXTAGLEN 0#endif/* lock,open owner id: * we currently use size 2 (u64) out of (NFS4_OPAQUE_LIMIT >> 2) */#define open_owner_id_maxsz (1 + 4)#define lock_owner_id_maxsz (1 + 4)#define decode_lockowner_maxsz (1 + XDR_QUADLEN(IDMAP_NAMESZ))#define compound_encode_hdr_maxsz (3 + (NFS4_MAXTAGLEN >> 2))#define compound_decode_hdr_maxsz (3 + (NFS4_MAXTAGLEN >> 2))#define op_encode_hdr_maxsz (1)#define op_decode_hdr_maxsz (2)#define encode_stateid_maxsz (XDR_QUADLEN(NFS4_STATEID_SIZE))#define decode_stateid_maxsz (XDR_QUADLEN(NFS4_STATEID_SIZE))#define encode_verifier_maxsz (XDR_QUADLEN(NFS4_VERIFIER_SIZE))#define decode_verifier_maxsz (XDR_QUADLEN(NFS4_VERIFIER_SIZE))#define encode_putfh_maxsz (op_encode_hdr_maxsz + 1 + \ (NFS4_FHSIZE >> 2))#define decode_putfh_maxsz (op_decode_hdr_maxsz)#define encode_putrootfh_maxsz (op_encode_hdr_maxsz)#define decode_putrootfh_maxsz (op_decode_hdr_maxsz)#define encode_getfh_maxsz (op_encode_hdr_maxsz)#define decode_getfh_maxsz (op_decode_hdr_maxsz + 1 + \ ((3+NFS4_FHSIZE) >> 2))#define nfs4_fattr_bitmap_maxsz 3#define encode_getattr_maxsz (op_encode_hdr_maxsz + nfs4_fattr_bitmap_maxsz)#define nfs4_name_maxsz (1 + ((3 + NFS4_MAXNAMLEN) >> 2))#define nfs4_path_maxsz (1 + ((3 + NFS4_MAXPATHLEN) >> 2))#define nfs4_owner_maxsz (1 + XDR_QUADLEN(IDMAP_NAMESZ))#define nfs4_group_maxsz (1 + XDR_QUADLEN(IDMAP_NAMESZ))/* This is based on getfattr, which uses the most attributes: */#define nfs4_fattr_value_maxsz (1 + (1 + 2 + 2 + 4 + 2 + 1 + 1 + 2 + 2 + \ 3 + 3 + 3 + nfs4_owner_maxsz + nfs4_group_maxsz))#define nfs4_fattr_maxsz (nfs4_fattr_bitmap_maxsz + \ nfs4_fattr_value_maxsz)#define decode_getattr_maxsz (op_decode_hdr_maxsz + nfs4_fattr_maxsz)#define encode_attrs_maxsz (nfs4_fattr_bitmap_maxsz + \ 1 + 2 + 1 + \ nfs4_owner_maxsz + \ nfs4_group_maxsz + \ 4 + 4)#define encode_savefh_maxsz (op_encode_hdr_maxsz)#define decode_savefh_maxsz (op_decode_hdr_maxsz)#define encode_restorefh_maxsz (op_encode_hdr_maxsz)#define decode_restorefh_maxsz (op_decode_hdr_maxsz)#define encode_fsinfo_maxsz (op_encode_hdr_maxsz + 2)#define decode_fsinfo_maxsz (op_decode_hdr_maxsz + 11)#define encode_renew_maxsz (op_encode_hdr_maxsz + 3)#define decode_renew_maxsz (op_decode_hdr_maxsz)#define encode_setclientid_maxsz \ (op_encode_hdr_maxsz + \ 4 /*server->ip_addr*/ + \ 1 /*Netid*/ + \ 6 /*uaddr*/ + \ 6 + (NFS4_VERIFIER_SIZE >> 2))#define decode_setclientid_maxsz \ (op_decode_hdr_maxsz + \ 2 + \ 1024) /* large value for CLID_INUSE */#define encode_setclientid_confirm_maxsz \ (op_encode_hdr_maxsz + \ 3 + (NFS4_VERIFIER_SIZE >> 2))#define decode_setclientid_confirm_maxsz \ (op_decode_hdr_maxsz)#define encode_lookup_maxsz (op_encode_hdr_maxsz + nfs4_name_maxsz)#define decode_lookup_maxsz (op_decode_hdr_maxsz)#define encode_share_access_maxsz \ (2)#define encode_createmode_maxsz (1 + encode_attrs_maxsz)#define encode_opentype_maxsz (1 + encode_createmode_maxsz)#define encode_claim_null_maxsz (1 + nfs4_name_maxsz)#define encode_open_maxsz (op_encode_hdr_maxsz + \ 2 + encode_share_access_maxsz + 2 + \ open_owner_id_maxsz + \ encode_opentype_maxsz + \ encode_claim_null_maxsz)#define decode_ace_maxsz (3 + nfs4_owner_maxsz)#define decode_delegation_maxsz (1 + decode_stateid_maxsz + 1 + \ decode_ace_maxsz)#define decode_change_info_maxsz (5)#define decode_open_maxsz (op_decode_hdr_maxsz + \ decode_stateid_maxsz + \ decode_change_info_maxsz + 1 + \ nfs4_fattr_bitmap_maxsz + \ decode_delegation_maxsz)#define encode_open_confirm_maxsz \ (op_encode_hdr_maxsz + \ encode_stateid_maxsz + 1)#define decode_open_confirm_maxsz \ (op_decode_hdr_maxsz + \ decode_stateid_maxsz)#define encode_open_downgrade_maxsz \ (op_encode_hdr_maxsz + \ encode_stateid_maxsz + 1 + \ encode_share_access_maxsz)#define decode_open_downgrade_maxsz \ (op_decode_hdr_maxsz + \ decode_stateid_maxsz)#define encode_close_maxsz (op_encode_hdr_maxsz + \ 1 + encode_stateid_maxsz)#define decode_close_maxsz (op_decode_hdr_maxsz + \ decode_stateid_maxsz)#define encode_setattr_maxsz (op_encode_hdr_maxsz + \ encode_stateid_maxsz + \ encode_attrs_maxsz)#define decode_setattr_maxsz (op_decode_hdr_maxsz + \ nfs4_fattr_bitmap_maxsz)#define encode_read_maxsz (op_encode_hdr_maxsz + \ encode_stateid_maxsz + 3)#define decode_read_maxsz (op_decode_hdr_maxsz + 2)#define encode_readdir_maxsz (op_encode_hdr_maxsz + \ 2 + encode_verifier_maxsz + 5)#define decode_readdir_maxsz (op_decode_hdr_maxsz + \ decode_verifier_maxsz)#define encode_readlink_maxsz (op_encode_hdr_maxsz)#define decode_readlink_maxsz (op_decode_hdr_maxsz + 1)#define encode_write_maxsz (op_encode_hdr_maxsz + \ encode_stateid_maxsz + 4)#define decode_write_maxsz (op_decode_hdr_maxsz + \ 2 + decode_verifier_maxsz)#define encode_commit_maxsz (op_encode_hdr_maxsz + 3)#define decode_commit_maxsz (op_decode_hdr_maxsz + \ decode_verifier_maxsz)#define encode_remove_maxsz (op_encode_hdr_maxsz + \ nfs4_name_maxsz)#define encode_rename_maxsz (op_encode_hdr_maxsz + \ 2 * nfs4_name_maxsz)#define decode_rename_maxsz (op_decode_hdr_maxsz + 5 + 5)#define encode_link_maxsz (op_encode_hdr_maxsz + \ nfs4_name_maxsz)#define decode_link_maxsz (op_decode_hdr_maxsz + 5)#define encode_lock_maxsz (op_encode_hdr_maxsz + \ 7 + \ 1 + encode_stateid_maxsz + 8)#define decode_lock_denied_maxsz \ (8 + decode_lockowner_maxsz)#define decode_lock_maxsz (op_decode_hdr_maxsz + \ decode_lock_denied_maxsz)#define encode_lockt_maxsz (op_encode_hdr_maxsz + 12)#define decode_lockt_maxsz (op_decode_hdr_maxsz + \ decode_lock_denied_maxsz)#define encode_locku_maxsz (op_encode_hdr_maxsz + 3 + \ encode_stateid_maxsz + \ 4)#define decode_locku_maxsz (op_decode_hdr_maxsz + \ decode_stateid_maxsz)#define encode_access_maxsz (op_encode_hdr_maxsz + 1)#define decode_access_maxsz (op_decode_hdr_maxsz + 2)#define encode_symlink_maxsz (op_encode_hdr_maxsz + \ 1 + nfs4_name_maxsz + \ 1 + \ nfs4_fattr_maxsz)#define decode_symlink_maxsz (op_decode_hdr_maxsz + 8)#define encode_create_maxsz (op_encode_hdr_maxsz + \ 1 + 2 + nfs4_name_maxsz + \ encode_attrs_maxsz)#define decode_create_maxsz (op_decode_hdr_maxsz + \ decode_change_info_maxsz + \ nfs4_fattr_bitmap_maxsz)#define encode_statfs_maxsz (encode_getattr_maxsz)#define decode_statfs_maxsz (decode_getattr_maxsz)#define encode_delegreturn_maxsz (op_encode_hdr_maxsz + 4)#define decode_delegreturn_maxsz (op_decode_hdr_maxsz)#define encode_getacl_maxsz (encode_getattr_maxsz)#define decode_getacl_maxsz (op_decode_hdr_maxsz + \ nfs4_fattr_bitmap_maxsz + 1)#define encode_setacl_maxsz (op_encode_hdr_maxsz + \ encode_stateid_maxsz + 3)#define decode_setacl_maxsz (decode_setattr_maxsz)#define encode_fs_locations_maxsz \ (encode_getattr_maxsz)#define decode_fs_locations_maxsz \ (0)#define NFS4_enc_compound_sz (1024) /* XXX: large enough? */#define NFS4_dec_compound_sz (1024) /* XXX: large enough? */#define NFS4_enc_read_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_read_maxsz)#define NFS4_dec_read_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_read_maxsz)#define NFS4_enc_readlink_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_readlink_maxsz)#define NFS4_dec_readlink_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_readlink_maxsz)#define NFS4_enc_readdir_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_readdir_maxsz)#define NFS4_dec_readdir_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_readdir_maxsz)#define NFS4_enc_write_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_write_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_write_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_write_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_commit_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_commit_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_commit_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_commit_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_open_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_savefh_maxsz + \ encode_open_maxsz + \ encode_getfh_maxsz + \ encode_getattr_maxsz + \ encode_restorefh_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_open_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_savefh_maxsz + \ decode_open_maxsz + \ decode_getfh_maxsz + \ decode_getattr_maxsz + \ decode_restorefh_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_open_confirm_sz \ (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_open_confirm_maxsz)#define NFS4_dec_open_confirm_sz \ (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_open_confirm_maxsz)#define NFS4_enc_open_noattr_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_open_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_open_noattr_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_open_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_open_downgrade_sz \ (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_open_downgrade_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_open_downgrade_sz \ (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_open_downgrade_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_close_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_close_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_close_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_close_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_setattr_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_setattr_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_setattr_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_setattr_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_fsinfo_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_fsinfo_maxsz)#define NFS4_dec_fsinfo_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_fsinfo_maxsz)#define NFS4_enc_renew_sz (compound_encode_hdr_maxsz + \ encode_renew_maxsz)#define NFS4_dec_renew_sz (compound_decode_hdr_maxsz + \ decode_renew_maxsz)#define NFS4_enc_setclientid_sz (compound_encode_hdr_maxsz + \ encode_setclientid_maxsz)#define NFS4_dec_setclientid_sz (compound_decode_hdr_maxsz + \ decode_setclientid_maxsz)#define NFS4_enc_setclientid_confirm_sz \ (compound_encode_hdr_maxsz + \ encode_setclientid_confirm_maxsz + \ encode_putrootfh_maxsz + \ encode_fsinfo_maxsz)#define NFS4_dec_setclientid_confirm_sz \ (compound_decode_hdr_maxsz + \ decode_setclientid_confirm_maxsz + \ decode_putrootfh_maxsz + \ decode_fsinfo_maxsz)#define NFS4_enc_lock_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_lock_maxsz)#define NFS4_dec_lock_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_lock_maxsz)#define NFS4_enc_lockt_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_lockt_maxsz)#define NFS4_dec_lockt_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_lockt_maxsz)#define NFS4_enc_locku_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_locku_maxsz)#define NFS4_dec_locku_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_locku_maxsz)#define NFS4_enc_access_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_access_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_access_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_access_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_getattr_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_getattr_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_lookup_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_lookup_maxsz + \ encode_getattr_maxsz + \ encode_getfh_maxsz)#define NFS4_dec_lookup_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_lookup_maxsz + \ decode_getattr_maxsz + \ decode_getfh_maxsz)#define NFS4_enc_lookup_root_sz (compound_encode_hdr_maxsz + \ encode_putrootfh_maxsz + \ encode_getattr_maxsz + \ encode_getfh_maxsz)#define NFS4_dec_lookup_root_sz (compound_decode_hdr_maxsz + \ decode_putrootfh_maxsz + \ decode_getattr_maxsz + \ decode_getfh_maxsz)#define NFS4_enc_remove_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_remove_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_remove_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ op_decode_hdr_maxsz + 5 + \ decode_getattr_maxsz)#define NFS4_enc_rename_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_savefh_maxsz + \ encode_putfh_maxsz + \ encode_rename_maxsz + \ encode_getattr_maxsz + \ encode_restorefh_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_rename_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_savefh_maxsz + \ decode_putfh_maxsz + \ decode_rename_maxsz + \ decode_getattr_maxsz + \ decode_restorefh_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_link_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_savefh_maxsz + \ encode_putfh_maxsz + \ encode_link_maxsz + \ decode_getattr_maxsz + \ encode_restorefh_maxsz + \ decode_getattr_maxsz)#define NFS4_dec_link_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_savefh_maxsz + \ decode_putfh_maxsz + \ decode_link_maxsz + \ decode_getattr_maxsz + \ decode_restorefh_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_symlink_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_symlink_maxsz + \ encode_getattr_maxsz + \ encode_getfh_maxsz)#define NFS4_dec_symlink_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_symlink_maxsz + \ decode_getattr_maxsz + \ decode_getfh_maxsz)#define NFS4_enc_create_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_savefh_maxsz + \ encode_create_maxsz + \ encode_getfh_maxsz + \ encode_getattr_maxsz + \ encode_restorefh_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_create_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_savefh_maxsz + \ decode_create_maxsz + \ decode_getfh_maxsz + \ decode_getattr_maxsz + \ decode_restorefh_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_pathconf_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_pathconf_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_statfs_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_statfs_maxsz)#define NFS4_dec_statfs_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_statfs_maxsz)#define NFS4_enc_server_caps_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_server_caps_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_getattr_maxsz)#define NFS4_enc_delegreturn_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_delegreturn_maxsz + \ encode_getattr_maxsz)#define NFS4_dec_delegreturn_sz (compound_decode_hdr_maxsz + \ decode_delegreturn_maxsz + \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -