LCOV - code coverage report
Current view: top level - fs/nfs - internal.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 93 0.0 %
Date: 2022-04-01 14:17:54 Functions: 0 6 0.0 %
Branches: 0 231 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : /*
       3                 :            :  * NFS internal definitions
       4                 :            :  */
       5                 :            : 
       6                 :            : #include "nfs4_fs.h"
       7                 :            : #include <linux/fs_context.h>
       8                 :            : #include <linux/security.h>
       9                 :            : #include <linux/crc32.h>
      10                 :            : #include <linux/sunrpc/addr.h>
      11                 :            : #include <linux/nfs_page.h>
      12                 :            : #include <linux/wait_bit.h>
      13                 :            : 
      14                 :            : #define NFS_SB_MASK (SB_RDONLY|SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS)
      15                 :            : 
      16                 :            : extern const struct export_operations nfs_export_ops;
      17                 :            : 
      18                 :            : struct nfs_string;
      19                 :            : struct nfs_pageio_descriptor;
      20                 :            : 
      21                 :          0 : static inline void nfs_attr_check_mountpoint(struct super_block *parent, struct nfs_fattr *fattr)
      22                 :            : {
      23         [ #  # ]:          0 :         if (!nfs_fsid_equal(&NFS_SB(parent)->fsid, &fattr->fsid))
      24                 :          0 :                 fattr->valid |= NFS_ATTR_FATTR_MOUNTPOINT;
      25                 :            : }
      26                 :            : 
      27                 :          0 : static inline int nfs_attr_use_mounted_on_fileid(struct nfs_fattr *fattr)
      28                 :            : {
      29         [ #  # ]:          0 :         if (((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) == 0) ||
      30         [ #  # ]:          0 :             (((fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) &&
      31                 :            :              ((fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) == 0)))
      32         [ #  # ]:          0 :                 return 0;
      33                 :            :         return 1;
      34                 :            : }
      35                 :            : 
      36                 :          0 : static inline bool nfs_lookup_is_soft_revalidate(const struct dentry *dentry)
      37                 :            : {
      38         [ #  # ]:          0 :         if (!(NFS_SB(dentry->d_sb)->flags & NFS_MOUNT_SOFTREVAL))
      39                 :            :                 return false;
      40   [ #  #  #  # ]:          0 :         if (!d_is_positive(dentry) || !NFS_FH(d_inode(dentry))->size)
      41                 :            :                 return false;
      42                 :            :         return true;
      43                 :            : }
      44                 :            : 
      45                 :            : /*
      46                 :            :  * Note: RFC 1813 doesn't limit the number of auth flavors that
      47                 :            :  * a server can return, so make something up.
      48                 :            :  */
      49                 :            : #define NFS_MAX_SECFLAVORS      (12)
      50                 :            : 
      51                 :            : /*
      52                 :            :  * Value used if the user did not specify a port value.
      53                 :            :  */
      54                 :            : #define NFS_UNSPEC_PORT         (-1)
      55                 :            : 
      56                 :            : #define NFS_UNSPEC_RETRANS      (UINT_MAX)
      57                 :            : #define NFS_UNSPEC_TIMEO        (UINT_MAX)
      58                 :            : 
      59                 :            : /*
      60                 :            :  * Maximum number of pages that readdir can use for creating
      61                 :            :  * a vmapped array of pages.
      62                 :            :  */
      63                 :            : #define NFS_MAX_READDIR_PAGES 8
      64                 :            : 
      65                 :            : struct nfs_client_initdata {
      66                 :            :         unsigned long init_flags;
      67                 :            :         const char *hostname;                   /* Hostname of the server */
      68                 :            :         const struct sockaddr *addr;            /* Address of the server */
      69                 :            :         const char *nodename;                   /* Hostname of the client */
      70                 :            :         const char *ip_addr;                    /* IP address of the client */
      71                 :            :         size_t addrlen;
      72                 :            :         struct nfs_subversion *nfs_mod;
      73                 :            :         int proto;
      74                 :            :         u32 minorversion;
      75                 :            :         unsigned int nconnect;
      76                 :            :         struct net *net;
      77                 :            :         const struct rpc_timeout *timeparms;
      78                 :            :         const struct cred *cred;
      79                 :            : };
      80                 :            : 
      81                 :            : /*
      82                 :            :  * In-kernel mount arguments
      83                 :            :  */
      84                 :            : struct nfs_fs_context {
      85                 :            :         bool                    internal;
      86                 :            :         bool                    skip_reconfig_option_check;
      87                 :            :         bool                    need_mount;
      88                 :            :         bool                    sloppy;
      89                 :            :         unsigned int            flags;          /* NFS{,4}_MOUNT_* flags */
      90                 :            :         unsigned int            rsize, wsize;
      91                 :            :         unsigned int            timeo, retrans;
      92                 :            :         unsigned int            acregmin, acregmax;
      93                 :            :         unsigned int            acdirmin, acdirmax;
      94                 :            :         unsigned int            namlen;
      95                 :            :         unsigned int            options;
      96                 :            :         unsigned int            bsize;
      97                 :            :         struct nfs_auth_info    auth_info;
      98                 :            :         rpc_authflavor_t        selected_flavor;
      99                 :            :         char                    *client_address;
     100                 :            :         unsigned int            version;
     101                 :            :         unsigned int            minorversion;
     102                 :            :         char                    *fscache_uniq;
     103                 :            :         unsigned short          protofamily;
     104                 :            :         unsigned short          mountfamily;
     105                 :            : 
     106                 :            :         struct {
     107                 :            :                 union {
     108                 :            :                         struct sockaddr address;
     109                 :            :                         struct sockaddr_storage _address;
     110                 :            :                 };
     111                 :            :                 size_t                  addrlen;
     112                 :            :                 char                    *hostname;
     113                 :            :                 u32                     version;
     114                 :            :                 int                     port;
     115                 :            :                 unsigned short          protocol;
     116                 :            :         } mount_server;
     117                 :            : 
     118                 :            :         struct {
     119                 :            :                 union {
     120                 :            :                         struct sockaddr address;
     121                 :            :                         struct sockaddr_storage _address;
     122                 :            :                 };
     123                 :            :                 size_t                  addrlen;
     124                 :            :                 char                    *hostname;
     125                 :            :                 char                    *export_path;
     126                 :            :                 int                     port;
     127                 :            :                 unsigned short          protocol;
     128                 :            :                 unsigned short          nconnect;
     129                 :            :                 unsigned short          export_path_len;
     130                 :            :         } nfs_server;
     131                 :            : 
     132                 :            :         struct nfs_fh           *mntfh;
     133                 :            :         struct nfs_server       *server;
     134                 :            :         struct nfs_subversion   *nfs_mod;
     135                 :            : 
     136                 :            :         /* Information for a cloned mount. */
     137                 :            :         struct nfs_clone_mount {
     138                 :            :                 struct super_block      *sb;
     139                 :            :                 struct dentry           *dentry;
     140                 :            :                 struct nfs_fattr        *fattr;
     141                 :            :                 unsigned int            inherited_bsize;
     142                 :            :         } clone_data;
     143                 :            : };
     144                 :            : 
     145                 :            : #define nfs_errorf(fc, fmt, ...) errorf(fc, fmt, ## __VA_ARGS__)
     146                 :            : #define nfs_invalf(fc, fmt, ...) invalf(fc, fmt, ## __VA_ARGS__)
     147                 :            : #define nfs_warnf(fc, fmt, ...) warnf(fc, fmt, ## __VA_ARGS__)
     148                 :            : 
     149                 :          0 : static inline struct nfs_fs_context *nfs_fc2context(const struct fs_context *fc)
     150                 :            : {
     151   [ #  #  #  #  :          0 :         return fc->fs_private;
          #  #  #  #  #  
                      # ]
     152                 :            : }
     153                 :            : 
     154                 :            : /* mount_clnt.c */
     155                 :            : struct nfs_mount_request {
     156                 :            :         struct sockaddr         *sap;
     157                 :            :         size_t                  salen;
     158                 :            :         char                    *hostname;
     159                 :            :         char                    *dirpath;
     160                 :            :         u32                     version;
     161                 :            :         unsigned short          protocol;
     162                 :            :         struct nfs_fh           *fh;
     163                 :            :         int                     noresvport;
     164                 :            :         unsigned int            *auth_flav_len;
     165                 :            :         rpc_authflavor_t        *auth_flavs;
     166                 :            :         struct net              *net;
     167                 :            : };
     168                 :            : 
     169                 :            : extern int nfs_mount(struct nfs_mount_request *info);
     170                 :            : extern void nfs_umount(const struct nfs_mount_request *info);
     171                 :            : 
     172                 :            : /* client.c */
     173                 :            : extern const struct rpc_program nfs_program;
     174                 :            : extern void nfs_clients_init(struct net *net);
     175                 :            : extern void nfs_clients_exit(struct net *net);
     176                 :            : extern struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *);
     177                 :            : int nfs_create_rpc_client(struct nfs_client *, const struct nfs_client_initdata *, rpc_authflavor_t);
     178                 :            : struct nfs_client *nfs_get_client(const struct nfs_client_initdata *);
     179                 :            : int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *, struct nfs_fattr *);
     180                 :            : void nfs_server_insert_lists(struct nfs_server *);
     181                 :            : void nfs_server_remove_lists(struct nfs_server *);
     182                 :            : void nfs_init_timeout_values(struct rpc_timeout *to, int proto, int timeo, int retrans);
     183                 :            : int nfs_init_server_rpcclient(struct nfs_server *, const struct rpc_timeout *t,
     184                 :            :                 rpc_authflavor_t);
     185                 :            : struct nfs_server *nfs_alloc_server(void);
     186                 :            : void nfs_server_copy_userdata(struct nfs_server *, struct nfs_server *);
     187                 :            : 
     188                 :            : extern void nfs_put_client(struct nfs_client *);
     189                 :            : extern void nfs_free_client(struct nfs_client *);
     190                 :            : extern struct nfs_client *nfs4_find_client_ident(struct net *, int);
     191                 :            : extern struct nfs_client *
     192                 :            : nfs4_find_client_sessionid(struct net *, const struct sockaddr *,
     193                 :            :                                 struct nfs4_sessionid *, u32);
     194                 :            : extern struct nfs_server *nfs_create_server(struct fs_context *);
     195                 :            : extern struct nfs_server *nfs4_create_server(struct fs_context *);
     196                 :            : extern struct nfs_server *nfs4_create_referral_server(struct fs_context *);
     197                 :            : extern int nfs4_update_server(struct nfs_server *server, const char *hostname,
     198                 :            :                                         struct sockaddr *sap, size_t salen,
     199                 :            :                                         struct net *net);
     200                 :            : extern void nfs_free_server(struct nfs_server *server);
     201                 :            : extern struct nfs_server *nfs_clone_server(struct nfs_server *,
     202                 :            :                                            struct nfs_fh *,
     203                 :            :                                            struct nfs_fattr *,
     204                 :            :                                            rpc_authflavor_t);
     205                 :            : extern bool nfs_client_init_is_complete(const struct nfs_client *clp);
     206                 :            : extern int nfs_client_init_status(const struct nfs_client *clp);
     207                 :            : extern int nfs_wait_client_init_complete(const struct nfs_client *clp);
     208                 :            : extern void nfs_mark_client_ready(struct nfs_client *clp, int state);
     209                 :            : extern struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
     210                 :            :                                              const struct sockaddr *ds_addr,
     211                 :            :                                              int ds_addrlen, int ds_proto,
     212                 :            :                                              unsigned int ds_timeo,
     213                 :            :                                              unsigned int ds_retrans,
     214                 :            :                                              u32 minor_version);
     215                 :            : extern struct rpc_clnt *nfs4_find_or_create_ds_client(struct nfs_client *,
     216                 :            :                                                 struct inode *);
     217                 :            : extern struct nfs_client *nfs3_set_ds_client(struct nfs_server *mds_srv,
     218                 :            :                         const struct sockaddr *ds_addr, int ds_addrlen,
     219                 :            :                         int ds_proto, unsigned int ds_timeo,
     220                 :            :                         unsigned int ds_retrans);
     221                 :            : #ifdef CONFIG_PROC_FS
     222                 :            : extern int __init nfs_fs_proc_init(void);
     223                 :            : extern void nfs_fs_proc_exit(void);
     224                 :            : extern int nfs_fs_proc_net_init(struct net *net);
     225                 :            : extern void nfs_fs_proc_net_exit(struct net *net);
     226                 :            : #else
     227                 :            : static inline int nfs_fs_proc_net_init(struct net *net)
     228                 :            : {
     229                 :            :         return 0;
     230                 :            : }
     231                 :            : static inline void nfs_fs_proc_net_exit(struct net *net)
     232                 :            : {
     233                 :            : }
     234                 :            : static inline int nfs_fs_proc_init(void)
     235                 :            : {
     236                 :            :         return 0;
     237                 :            : }
     238                 :            : static inline void nfs_fs_proc_exit(void)
     239                 :            : {
     240                 :            : }
     241                 :            : #endif
     242                 :            : 
     243                 :            : /* callback_xdr.c */
     244                 :            : extern const struct svc_version nfs4_callback_version1;
     245                 :            : extern const struct svc_version nfs4_callback_version4;
     246                 :            : 
     247                 :            : /* fs_context.c */
     248                 :            : extern struct file_system_type nfs_fs_type;
     249                 :            : 
     250                 :            : /* pagelist.c */
     251                 :            : extern int __init nfs_init_nfspagecache(void);
     252                 :            : extern void nfs_destroy_nfspagecache(void);
     253                 :            : extern int __init nfs_init_readpagecache(void);
     254                 :            : extern void nfs_destroy_readpagecache(void);
     255                 :            : extern int __init nfs_init_writepagecache(void);
     256                 :            : extern void nfs_destroy_writepagecache(void);
     257                 :            : 
     258                 :            : extern int __init nfs_init_directcache(void);
     259                 :            : extern void nfs_destroy_directcache(void);
     260                 :            : extern void nfs_pgheader_init(struct nfs_pageio_descriptor *desc,
     261                 :            :                               struct nfs_pgio_header *hdr,
     262                 :            :                               void (*release)(struct nfs_pgio_header *hdr));
     263                 :            : void nfs_set_pgio_error(struct nfs_pgio_header *hdr, int error, loff_t pos);
     264                 :            : int nfs_iocounter_wait(struct nfs_lock_context *l_ctx);
     265                 :            : 
     266                 :            : extern const struct nfs_pageio_ops nfs_pgio_rw_ops;
     267                 :            : struct nfs_pgio_header *nfs_pgio_header_alloc(const struct nfs_rw_ops *);
     268                 :            : void nfs_pgio_header_free(struct nfs_pgio_header *);
     269                 :            : int nfs_generic_pgio(struct nfs_pageio_descriptor *, struct nfs_pgio_header *);
     270                 :            : int nfs_initiate_pgio(struct rpc_clnt *clnt, struct nfs_pgio_header *hdr,
     271                 :            :                       const struct cred *cred, const struct nfs_rpc_ops *rpc_ops,
     272                 :            :                       const struct rpc_call_ops *call_ops, int how, int flags);
     273                 :            : void nfs_free_request(struct nfs_page *req);
     274                 :            : struct nfs_pgio_mirror *
     275                 :            : nfs_pgio_current_mirror(struct nfs_pageio_descriptor *desc);
     276                 :            : 
     277                 :          0 : static inline bool nfs_pgio_has_mirroring(struct nfs_pageio_descriptor *desc)
     278                 :            : {
     279   [ #  #  #  #  :          0 :         WARN_ON_ONCE(desc->pg_mirror_count < 1);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     280   [ #  #  #  #  :          0 :         return desc->pg_mirror_count > 1;
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     281                 :            : }
     282                 :            : 
     283                 :          0 : static inline bool nfs_match_open_context(const struct nfs_open_context *ctx1,
     284                 :            :                 const struct nfs_open_context *ctx2)
     285                 :            : {
     286   [ #  #  #  #  :          0 :         return cred_fscmp(ctx1->cred, ctx2->cred) == 0 && ctx1->state == ctx2->state;
                   #  # ]
     287                 :            : }
     288                 :            : 
     289                 :            : /* nfs2xdr.c */
     290                 :            : extern const struct rpc_procinfo nfs_procedures[];
     291                 :            : extern int nfs2_decode_dirent(struct xdr_stream *,
     292                 :            :                                 struct nfs_entry *, bool);
     293                 :            : 
     294                 :            : /* nfs3xdr.c */
     295                 :            : extern const struct rpc_procinfo nfs3_procedures[];
     296                 :            : extern int nfs3_decode_dirent(struct xdr_stream *,
     297                 :            :                                 struct nfs_entry *, bool);
     298                 :            : 
     299                 :            : /* nfs4xdr.c */
     300                 :            : #if IS_ENABLED(CONFIG_NFS_V4)
     301                 :            : extern int nfs4_decode_dirent(struct xdr_stream *,
     302                 :            :                                 struct nfs_entry *, bool);
     303                 :            : #endif
     304                 :            : #ifdef CONFIG_NFS_V4_1
     305                 :            : extern const u32 nfs41_maxread_overhead;
     306                 :            : extern const u32 nfs41_maxwrite_overhead;
     307                 :            : extern const u32 nfs41_maxgetdevinfo_overhead;
     308                 :            : #endif
     309                 :            : 
     310                 :            : /* nfs4proc.c */
     311                 :            : #if IS_ENABLED(CONFIG_NFS_V4)
     312                 :            : extern const struct rpc_procinfo nfs4_procedures[];
     313                 :            : #endif
     314                 :            : 
     315                 :            : #ifdef CONFIG_NFS_V4_SECURITY_LABEL
     316                 :            : extern struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags);
     317                 :            : static inline struct nfs4_label *
     318                 :            : nfs4_label_copy(struct nfs4_label *dst, struct nfs4_label *src)
     319                 :            : {
     320                 :            :         if (!dst || !src)
     321                 :            :                 return NULL;
     322                 :            : 
     323                 :            :         if (src->len > NFS4_MAXLABELLEN)
     324                 :            :                 return NULL;
     325                 :            : 
     326                 :            :         dst->lfs = src->lfs;
     327                 :            :         dst->pi = src->pi;
     328                 :            :         dst->len = src->len;
     329                 :            :         memcpy(dst->label, src->label, src->len);
     330                 :            : 
     331                 :            :         return dst;
     332                 :            : }
     333                 :            : static inline void nfs4_label_free(struct nfs4_label *label)
     334                 :            : {
     335                 :            :         if (label) {
     336                 :            :                 kfree(label->label);
     337                 :            :                 kfree(label);
     338                 :            :         }
     339                 :            :         return;
     340                 :            : }
     341                 :            : 
     342                 :            : static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
     343                 :            : {
     344                 :            :         if (nfs_server_capable(&nfsi->vfs_inode, NFS_CAP_SECURITY_LABEL))
     345                 :            :                 nfsi->cache_validity |= NFS_INO_INVALID_LABEL;
     346                 :            : }
     347                 :            : #else
     348         [ #  # ]:          0 : static inline struct nfs4_label *nfs4_label_alloc(struct nfs_server *server, gfp_t flags) { return NULL; }
     349                 :          0 : static inline void nfs4_label_free(void *label) {}
     350                 :          0 : static inline void nfs_zap_label_cache_locked(struct nfs_inode *nfsi)
     351                 :            : {
     352                 :          0 : }
     353                 :            : static inline struct nfs4_label *
     354                 :          0 : nfs4_label_copy(struct nfs4_label *dst, struct nfs4_label *src)
     355                 :            : {
     356         [ #  # ]:          0 :         return NULL;
     357                 :            : }
     358                 :            : #endif /* CONFIG_NFS_V4_SECURITY_LABEL */
     359                 :            : 
     360                 :            : /* proc.c */
     361                 :            : void nfs_close_context(struct nfs_open_context *ctx, int is_sync);
     362                 :            : extern struct nfs_client *nfs_init_client(struct nfs_client *clp,
     363                 :            :                            const struct nfs_client_initdata *);
     364                 :            : 
     365                 :            : /* dir.c */
     366                 :            : extern void nfs_advise_use_readdirplus(struct inode *dir);
     367                 :            : extern void nfs_force_use_readdirplus(struct inode *dir);
     368                 :            : extern unsigned long nfs_access_cache_count(struct shrinker *shrink,
     369                 :            :                                             struct shrink_control *sc);
     370                 :            : extern unsigned long nfs_access_cache_scan(struct shrinker *shrink,
     371                 :            :                                            struct shrink_control *sc);
     372                 :            : struct dentry *nfs_lookup(struct inode *, struct dentry *, unsigned int);
     373                 :            : int nfs_create(struct inode *, struct dentry *, umode_t, bool);
     374                 :            : int nfs_mkdir(struct inode *, struct dentry *, umode_t);
     375                 :            : int nfs_rmdir(struct inode *, struct dentry *);
     376                 :            : int nfs_unlink(struct inode *, struct dentry *);
     377                 :            : int nfs_symlink(struct inode *, struct dentry *, const char *);
     378                 :            : int nfs_link(struct dentry *, struct inode *, struct dentry *);
     379                 :            : int nfs_mknod(struct inode *, struct dentry *, umode_t, dev_t);
     380                 :            : int nfs_rename(struct inode *, struct dentry *,
     381                 :            :                struct inode *, struct dentry *, unsigned int);
     382                 :            : 
     383                 :            : /* file.c */
     384                 :            : int nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync);
     385                 :            : loff_t nfs_file_llseek(struct file *, loff_t, int);
     386                 :            : ssize_t nfs_file_read(struct kiocb *, struct iov_iter *);
     387                 :            : int nfs_file_mmap(struct file *, struct vm_area_struct *);
     388                 :            : ssize_t nfs_file_write(struct kiocb *, struct iov_iter *);
     389                 :            : int nfs_file_release(struct inode *, struct file *);
     390                 :            : int nfs_lock(struct file *, int, struct file_lock *);
     391                 :            : int nfs_flock(struct file *, int, struct file_lock *);
     392                 :            : int nfs_check_flags(int);
     393                 :            : 
     394                 :            : /* inode.c */
     395                 :            : extern struct workqueue_struct *nfsiod_workqueue;
     396                 :            : extern struct inode *nfs_alloc_inode(struct super_block *sb);
     397                 :            : extern void nfs_free_inode(struct inode *);
     398                 :            : extern int nfs_write_inode(struct inode *, struct writeback_control *);
     399                 :            : extern int nfs_drop_inode(struct inode *);
     400                 :            : extern void nfs_clear_inode(struct inode *);
     401                 :            : extern void nfs_evict_inode(struct inode *);
     402                 :            : void nfs_zap_acl_cache(struct inode *inode);
     403                 :            : extern bool nfs_check_cache_invalid(struct inode *, unsigned long);
     404                 :            : extern int nfs_wait_bit_killable(struct wait_bit_key *key, int mode);
     405                 :            : extern int nfs_wait_atomic_killable(atomic_t *p, unsigned int mode);
     406                 :            : 
     407                 :            : /* super.c */
     408                 :            : extern const struct super_operations nfs_sops;
     409                 :            : bool nfs_auth_info_match(const struct nfs_auth_info *, rpc_authflavor_t);
     410                 :            : int nfs_try_get_tree(struct fs_context *);
     411                 :            : int nfs_get_tree_common(struct fs_context *);
     412                 :            : void nfs_kill_super(struct super_block *);
     413                 :            : 
     414                 :            : extern struct rpc_stat nfs_rpcstat;
     415                 :            : 
     416                 :            : extern int __init register_nfs_fs(void);
     417                 :            : extern void __exit unregister_nfs_fs(void);
     418                 :            : extern bool nfs_sb_active(struct super_block *sb);
     419                 :            : extern void nfs_sb_deactive(struct super_block *sb);
     420                 :            : 
     421                 :            : /* io.c */
     422                 :            : extern void nfs_start_io_read(struct inode *inode);
     423                 :            : extern void nfs_end_io_read(struct inode *inode);
     424                 :            : extern void nfs_start_io_write(struct inode *inode);
     425                 :            : extern void nfs_end_io_write(struct inode *inode);
     426                 :            : extern void nfs_start_io_direct(struct inode *inode);
     427                 :            : extern void nfs_end_io_direct(struct inode *inode);
     428                 :            : 
     429                 :          0 : static inline bool nfs_file_io_is_buffered(struct nfs_inode *nfsi)
     430                 :            : {
     431                 :          0 :         return test_bit(NFS_INO_ODIRECT, &nfsi->flags) == 0;
     432                 :            : }
     433                 :            : 
     434                 :            : /* namespace.c */
     435                 :            : #define NFS_PATH_CANONICAL 1
     436                 :            : extern char *nfs_path(char **p, struct dentry *dentry,
     437                 :            :                       char *buffer, ssize_t buflen, unsigned flags);
     438                 :            : extern struct vfsmount *nfs_d_automount(struct path *path);
     439                 :            : int nfs_submount(struct fs_context *, struct nfs_server *);
     440                 :            : int nfs_do_submount(struct fs_context *);
     441                 :            : 
     442                 :            : /* getroot.c */
     443                 :            : extern int nfs_get_root(struct super_block *s, struct fs_context *fc);
     444                 :            : #if IS_ENABLED(CONFIG_NFS_V4)
     445                 :            : extern int nfs4_get_rootfh(struct nfs_server *server, struct nfs_fh *mntfh, bool);
     446                 :            : #endif
     447                 :            : 
     448                 :            : struct nfs_pgio_completion_ops;
     449                 :            : /* read.c */
     450                 :            : extern void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
     451                 :            :                         struct inode *inode, bool force_mds,
     452                 :            :                         const struct nfs_pgio_completion_ops *compl_ops);
     453                 :            : extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
     454                 :            : extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
     455                 :            : 
     456                 :            : /* super.c */
     457                 :            : void nfs_umount_begin(struct super_block *);
     458                 :            : int  nfs_statfs(struct dentry *, struct kstatfs *);
     459                 :            : int  nfs_show_options(struct seq_file *, struct dentry *);
     460                 :            : int  nfs_show_devname(struct seq_file *, struct dentry *);
     461                 :            : int  nfs_show_path(struct seq_file *, struct dentry *);
     462                 :            : int  nfs_show_stats(struct seq_file *, struct dentry *);
     463                 :            : int  nfs_reconfigure(struct fs_context *);
     464                 :            : 
     465                 :            : /* write.c */
     466                 :            : extern void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
     467                 :            :                         struct inode *inode, int ioflags, bool force_mds,
     468                 :            :                         const struct nfs_pgio_completion_ops *compl_ops);
     469                 :            : extern void nfs_pageio_reset_write_mds(struct nfs_pageio_descriptor *pgio);
     470                 :            : extern void nfs_commit_free(struct nfs_commit_data *p);
     471                 :            : extern void nfs_write_prepare(struct rpc_task *task, void *calldata);
     472                 :            : extern void nfs_commit_prepare(struct rpc_task *task, void *calldata);
     473                 :            : extern int nfs_initiate_commit(struct rpc_clnt *clnt,
     474                 :            :                                struct nfs_commit_data *data,
     475                 :            :                                const struct nfs_rpc_ops *nfs_ops,
     476                 :            :                                const struct rpc_call_ops *call_ops,
     477                 :            :                                int how, int flags);
     478                 :            : extern void nfs_init_commit(struct nfs_commit_data *data,
     479                 :            :                             struct list_head *head,
     480                 :            :                             struct pnfs_layout_segment *lseg,
     481                 :            :                             struct nfs_commit_info *cinfo);
     482                 :            : int nfs_scan_commit_list(struct list_head *src, struct list_head *dst,
     483                 :            :                          struct nfs_commit_info *cinfo, int max);
     484                 :            : unsigned long nfs_reqs_to_commit(struct nfs_commit_info *);
     485                 :            : int nfs_scan_commit(struct inode *inode, struct list_head *dst,
     486                 :            :                     struct nfs_commit_info *cinfo);
     487                 :            : void nfs_mark_request_commit(struct nfs_page *req,
     488                 :            :                              struct pnfs_layout_segment *lseg,
     489                 :            :                              struct nfs_commit_info *cinfo,
     490                 :            :                              u32 ds_commit_idx);
     491                 :            : int nfs_write_need_commit(struct nfs_pgio_header *);
     492                 :            : void nfs_writeback_update_inode(struct nfs_pgio_header *hdr);
     493                 :            : int nfs_generic_commit_list(struct inode *inode, struct list_head *head,
     494                 :            :                             int how, struct nfs_commit_info *cinfo);
     495                 :            : void nfs_retry_commit(struct list_head *page_list,
     496                 :            :                       struct pnfs_layout_segment *lseg,
     497                 :            :                       struct nfs_commit_info *cinfo,
     498                 :            :                       u32 ds_commit_idx);
     499                 :            : void nfs_commitdata_release(struct nfs_commit_data *data);
     500                 :            : void nfs_request_add_commit_list(struct nfs_page *req,
     501                 :            :                                  struct nfs_commit_info *cinfo);
     502                 :            : void nfs_request_add_commit_list_locked(struct nfs_page *req,
     503                 :            :                 struct list_head *dst,
     504                 :            :                 struct nfs_commit_info *cinfo);
     505                 :            : void nfs_request_remove_commit_list(struct nfs_page *req,
     506                 :            :                                     struct nfs_commit_info *cinfo);
     507                 :            : void nfs_init_cinfo(struct nfs_commit_info *cinfo,
     508                 :            :                     struct inode *inode,
     509                 :            :                     struct nfs_direct_req *dreq);
     510                 :            : int nfs_key_timeout_notify(struct file *filp, struct inode *inode);
     511                 :            : bool nfs_ctx_key_to_expire(struct nfs_open_context *ctx, struct inode *inode);
     512                 :            : void nfs_pageio_stop_mirroring(struct nfs_pageio_descriptor *pgio);
     513                 :            : 
     514                 :            : int nfs_filemap_write_and_wait_range(struct address_space *mapping,
     515                 :            :                 loff_t lstart, loff_t lend);
     516                 :            : 
     517                 :            : #ifdef CONFIG_NFS_V4_1
     518                 :            : static inline
     519                 :            : void nfs_clear_pnfs_ds_commit_verifiers(struct pnfs_ds_commit_info *cinfo)
     520                 :            : {
     521                 :            :         int i;
     522                 :            : 
     523                 :            :         for (i = 0; i < cinfo->nbuckets; i++)
     524                 :            :                 cinfo->buckets[i].direct_verf.committed = NFS_INVALID_STABLE_HOW;
     525                 :            : }
     526                 :            : #else
     527                 :            : static inline
     528                 :          0 : void nfs_clear_pnfs_ds_commit_verifiers(struct pnfs_ds_commit_info *cinfo)
     529                 :            : {
     530                 :          0 : }
     531                 :            : #endif
     532                 :            : 
     533                 :            : #ifdef CONFIG_MIGRATION
     534                 :            : extern int nfs_migrate_page(struct address_space *,
     535                 :            :                 struct page *, struct page *, enum migrate_mode);
     536                 :            : #endif
     537                 :            : 
     538                 :            : static inline int
     539                 :          0 : nfs_write_verifier_cmp(const struct nfs_write_verifier *v1,
     540                 :            :                 const struct nfs_write_verifier *v2)
     541                 :            : {
     542         [ #  # ]:          0 :         return memcmp(v1->data, v2->data, sizeof(v1->data));
     543                 :            : }
     544                 :            : 
     545                 :            : /* unlink.c */
     546                 :            : extern struct rpc_task *
     547                 :            : nfs_async_rename(struct inode *old_dir, struct inode *new_dir,
     548                 :            :                  struct dentry *old_dentry, struct dentry *new_dentry,
     549                 :            :                  void (*complete)(struct rpc_task *, struct nfs_renamedata *));
     550                 :            : extern int nfs_sillyrename(struct inode *dir, struct dentry *dentry);
     551                 :            : 
     552                 :            : /* direct.c */
     553                 :            : void nfs_init_cinfo_from_dreq(struct nfs_commit_info *cinfo,
     554                 :            :                               struct nfs_direct_req *dreq);
     555                 :            : extern ssize_t nfs_dreq_bytes_left(struct nfs_direct_req *dreq);
     556                 :            : 
     557                 :            : /* nfs4proc.c */
     558                 :            : extern struct nfs_client *nfs4_init_client(struct nfs_client *clp,
     559                 :            :                             const struct nfs_client_initdata *);
     560                 :            : extern int nfs40_walk_client_list(struct nfs_client *clp,
     561                 :            :                                 struct nfs_client **result,
     562                 :            :                                 const struct cred *cred);
     563                 :            : extern int nfs41_walk_client_list(struct nfs_client *clp,
     564                 :            :                                 struct nfs_client **result,
     565                 :            :                                 const struct cred *cred);
     566                 :            : extern void nfs4_test_session_trunk(struct rpc_clnt *clnt,
     567                 :            :                                 struct rpc_xprt *xprt,
     568                 :            :                                 void *data);
     569                 :            : 
     570                 :          0 : static inline struct inode *nfs_igrab_and_active(struct inode *inode)
     571                 :            : {
     572                 :          0 :         inode = igrab(inode);
     573   [ #  #  #  # ]:          0 :         if (inode != NULL && !nfs_sb_active(inode->i_sb)) {
     574                 :          0 :                 iput(inode);
     575                 :          0 :                 inode = NULL;
     576                 :            :         }
     577                 :          0 :         return inode;
     578                 :            : }
     579                 :            : 
     580                 :          0 : static inline void nfs_iput_and_deactive(struct inode *inode)
     581                 :            : {
     582         [ #  # ]:          0 :         if (inode != NULL) {
     583                 :          0 :                 struct super_block *sb = inode->i_sb;
     584                 :            : 
     585                 :          0 :                 iput(inode);
     586                 :          0 :                 nfs_sb_deactive(sb);
     587                 :            :         }
     588                 :          0 : }
     589                 :            : 
     590                 :            : /*
     591                 :            :  * Determine the device name as a string
     592                 :            :  */
     593                 :          0 : static inline char *nfs_devname(struct dentry *dentry,
     594                 :            :                                 char *buffer, ssize_t buflen)
     595                 :            : {
     596                 :          0 :         char *dummy;
     597                 :          0 :         return nfs_path(&dummy, dentry, buffer, buflen, NFS_PATH_CANONICAL);
     598                 :            : }
     599                 :            : 
     600                 :            : /*
     601                 :            :  * Determine the actual block size (and log2 thereof)
     602                 :            :  */
     603                 :            : static inline
     604                 :          0 : unsigned long nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp)
     605                 :            : {
     606                 :            :         /* make sure blocksize is a power of two */
     607   [ #  #  #  #  :          0 :         if ((bsize & (bsize - 1)) || nrbitsp) {
                   #  # ]
     608                 :            :                 unsigned char   nrbits;
     609                 :            : 
     610   [ #  #  #  #  :          0 :                 for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--)
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     611                 :          0 :                         ;
     612                 :          0 :                 bsize = 1 << nrbits;
     613   [ #  #  #  # ]:          0 :                 if (nrbitsp)
     614                 :          0 :                         *nrbitsp = nrbits;
     615                 :            :         }
     616                 :            : 
     617   [ #  #  #  #  :          0 :         return bsize;
                   #  # ]
     618                 :            : }
     619                 :            : 
     620                 :            : /*
     621                 :            :  * Calculate the number of 512byte blocks used.
     622                 :            :  */
     623                 :          0 : static inline blkcnt_t nfs_calc_block_size(u64 tsize)
     624                 :            : {
     625                 :          0 :         blkcnt_t used = (tsize + 511) >> 9;
     626                 :          0 :         return (used > ULONG_MAX) ? ULONG_MAX : used;
     627                 :            : }
     628                 :            : 
     629                 :            : /*
     630                 :            :  * Compute and set NFS server blocksize
     631                 :            :  */
     632                 :            : static inline
     633                 :          0 : unsigned long nfs_block_size(unsigned long bsize, unsigned char *nrbitsp)
     634                 :            : {
     635   [ #  #  #  #  :          0 :         if (bsize < NFS_MIN_FILE_IO_SIZE)
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     636                 :            :                 bsize = NFS_DEF_FILE_IO_SIZE;
     637                 :          0 :         else if (bsize >= NFS_MAX_FILE_IO_SIZE)
     638                 :            :                 bsize = NFS_MAX_FILE_IO_SIZE;
     639                 :            : 
     640   [ #  #  #  #  :          0 :         return nfs_block_bits(bsize, nrbitsp);
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
     641                 :            : }
     642                 :            : 
     643                 :            : /*
     644                 :            :  * Determine the maximum file size for a superblock
     645                 :            :  */
     646                 :            : static inline
     647                 :          0 : void nfs_super_set_maxbytes(struct super_block *sb, __u64 maxfilesize)
     648                 :            : {
     649                 :          0 :         sb->s_maxbytes = (loff_t)maxfilesize;
     650         [ #  # ]:          0 :         if (sb->s_maxbytes > MAX_LFS_FILESIZE || sb->s_maxbytes <= 0)
     651                 :          0 :                 sb->s_maxbytes = MAX_LFS_FILESIZE;
     652                 :            : }
     653                 :            : 
     654                 :            : /*
     655                 :            :  * Record the page as unstable and mark its inode as dirty.
     656                 :            :  */
     657                 :            : static inline
     658                 :            : void nfs_mark_page_unstable(struct page *page, struct nfs_commit_info *cinfo)
     659                 :            : {
     660                 :            :         if (!cinfo->dreq) {
     661                 :            :                 struct inode *inode = page_file_mapping(page)->host;
     662                 :            : 
     663                 :            :                 inc_node_page_state(page, NR_UNSTABLE_NFS);
     664                 :            :                 inc_wb_stat(&inode_to_bdi(inode)->wb, WB_RECLAIMABLE);
     665                 :            :                 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
     666                 :            :         }
     667                 :            : }
     668                 :            : 
     669                 :            : /*
     670                 :            :  * Determine the number of bytes of data the page contains
     671                 :            :  */
     672                 :            : static inline
     673                 :          0 : unsigned int nfs_page_length(struct page *page)
     674                 :            : {
     675         [ #  # ]:          0 :         loff_t i_size = i_size_read(page_file_mapping(page)->host);
     676                 :            : 
     677         [ #  # ]:          0 :         if (i_size > 0) {
     678                 :          0 :                 pgoff_t index = page_index(page);
     679                 :          0 :                 pgoff_t end_index = (i_size - 1) >> PAGE_SHIFT;
     680         [ #  # ]:          0 :                 if (index < end_index)
     681                 :            :                         return PAGE_SIZE;
     682         [ #  # ]:          0 :                 if (index == end_index)
     683                 :          0 :                         return ((i_size - 1) & ~PAGE_MASK) + 1;
     684                 :            :         }
     685                 :            :         return 0;
     686                 :            : }
     687                 :            : 
     688                 :            : /*
     689                 :            :  * Convert a umode to a dirent->d_type
     690                 :            :  */
     691                 :            : static inline
     692                 :          0 : unsigned char nfs_umode_to_dtype(umode_t mode)
     693                 :            : {
     694                 :          0 :         return (mode >> 12) & 15;
     695                 :            : }
     696                 :            : 
     697                 :            : /*
     698                 :            :  * Determine the number of pages in an array of length 'len' and
     699                 :            :  * with a base offset of 'base'
     700                 :            :  */
     701                 :            : static inline
     702                 :          0 : unsigned int nfs_page_array_len(unsigned int base, size_t len)
     703                 :            : {
     704                 :          0 :         return ((unsigned long)len + (unsigned long)base +
     705         [ #  # ]:          0 :                 PAGE_SIZE - 1) >> PAGE_SHIFT;
     706                 :            : }
     707                 :            : 
     708                 :            : /*
     709                 :            :  * Convert a struct timespec64 into a 64-bit change attribute
     710                 :            :  *
     711                 :            :  * This does approximately the same thing as timespec64_to_ns(),
     712                 :            :  * but for calculation efficiency, we multiply the seconds by
     713                 :            :  * 1024*1024*1024.
     714                 :            :  */
     715                 :            : static inline
     716                 :          0 : u64 nfs_timespec_to_change_attr(const struct timespec64 *ts)
     717                 :            : {
     718                 :          0 :         return ((u64)ts->tv_sec << 30) + ts->tv_nsec;
     719                 :            : }
     720                 :            : 
     721                 :            : #ifdef CONFIG_CRC32
     722                 :            : /**
     723                 :            :  * nfs_fhandle_hash - calculate the crc32 hash for the filehandle
     724                 :            :  * @fh - pointer to filehandle
     725                 :            :  *
     726                 :            :  * returns a crc32 hash for the filehandle that is compatible with
     727                 :            :  * the one displayed by "wireshark".
     728                 :            :  */
     729                 :          0 : static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh)
     730                 :            : {
     731   [ #  #  #  #  :          0 :         return ~crc32_le(0xFFFFFFFF, &fh->data[0], fh->size);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                      # ]
     732                 :            : }
     733                 :          0 : static inline u32 nfs_stateid_hash(const nfs4_stateid *stateid)
     734                 :            : {
     735   [ #  #  #  # ]:          0 :         return ~crc32_le(0xFFFFFFFF, &stateid->other[0],
     736                 :            :                                 NFS4_STATEID_OTHER_SIZE);
     737                 :            : }
     738                 :            : #else
     739                 :            : static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh)
     740                 :            : {
     741                 :            :         return 0;
     742                 :            : }
     743                 :            : static inline u32 nfs_stateid_hash(nfs4_stateid *stateid)
     744                 :            : {
     745                 :            :         return 0;
     746                 :            : }
     747                 :            : #endif
     748                 :            : 
     749                 :          0 : static inline bool nfs_error_is_fatal(int err)
     750                 :            : {
     751         [ #  # ]:          0 :         switch (err) {
     752                 :            :         case -ERESTARTSYS:
     753                 :            :         case -EINTR:
     754                 :            :         case -EACCES:
     755                 :            :         case -EDQUOT:
     756                 :            :         case -EFBIG:
     757                 :            :         case -EIO:
     758                 :            :         case -ENOSPC:
     759                 :            :         case -EROFS:
     760                 :            :         case -ESTALE:
     761                 :            :         case -E2BIG:
     762                 :            :         case -ENOMEM:
     763                 :            :         case -ETIMEDOUT:
     764                 :            :                 return true;
     765                 :          0 :         default:
     766                 :          0 :                 return false;
     767                 :            :         }
     768                 :            : }
     769                 :            : 
     770                 :          0 : static inline bool nfs_error_is_fatal_on_server(int err)
     771                 :            : {
     772         [ #  # ]:          0 :         switch (err) {
     773                 :            :         case 0:
     774                 :            :         case -ERESTARTSYS:
     775                 :            :         case -EINTR:
     776                 :            :                 return false;
     777                 :            :         }
     778                 :          0 :         return nfs_error_is_fatal(err);
     779                 :            : }
     780                 :            : 
     781                 :            : /*
     782                 :            :  * Select between a default port value and a user-specified port value.
     783                 :            :  * If a zero value is set, then autobind will be used.
     784                 :            :  */
     785                 :          0 : static inline void nfs_set_port(struct sockaddr *sap, int *port,
     786                 :            :                                 const unsigned short default_port)
     787                 :            : {
     788         [ #  # ]:          0 :         if (*port == NFS_UNSPEC_PORT)
     789                 :          0 :                 *port = default_port;
     790                 :            : 
     791      [ #  #  # ]:          0 :         rpc_set_port(sap, *port);
     792                 :            : }

Generated by: LCOV version 1.14