⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nfs4xdr.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* *  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 + -