linux/fs/nfs/internal.h
<<
>>
Prefs
   1/*
   2 * NFS internal definitions
   3 */
   4
   5#include "nfs4_fs.h"
   6#include <linux/mount.h>
   7#include <linux/security.h>
   8
   9#define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS)
  10
  11struct nfs_string;
  12
  13/* Maximum number of readahead requests
  14 * FIXME: this should really be a sysctl so that users may tune it to suit
  15 *        their needs. People that do NFS over a slow network, might for
  16 *        instance want to reduce it to something closer to 1 for improved
  17 *        interactive response.
  18 */
  19#define NFS_MAX_READAHEAD       (RPC_DEF_SLOT_TABLE - 1)
  20
  21/*
  22 * Determine if sessions are in use.
  23 */
  24static inline int nfs4_has_session(const struct nfs_client *clp)
  25{
  26#ifdef CONFIG_NFS_V4_1
  27        if (clp->cl_session)
  28                return 1;
  29#endif /* CONFIG_NFS_V4_1 */
  30        return 0;
  31}
  32
  33struct nfs_clone_mount {
  34        const struct super_block *sb;
  35        const struct dentry *dentry;
  36        struct nfs_fh *fh;
  37        struct nfs_fattr *fattr;
  38        char *hostname;
  39        char *mnt_path;
  40        struct sockaddr *addr;
  41        size_t addrlen;
  42        rpc_authflavor_t authflavor;
  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/*
  57 * In-kernel mount arguments
  58 */
  59struct nfs_parsed_mount_data {
  60        int                     flags;
  61        int                     rsize, wsize;
  62        int                     timeo, retrans;
  63        int                     acregmin, acregmax,
  64                                acdirmin, acdirmax;
  65        int                     namlen;
  66        unsigned int            options;
  67        unsigned int            bsize;
  68        unsigned int            auth_flavor_len;
  69        rpc_authflavor_t        auth_flavors[1];
  70        char                    *client_address;
  71        unsigned int            version;
  72        unsigned int            minorversion;
  73        char                    *fscache_uniq;
  74
  75        struct {
  76                struct sockaddr_storage address;
  77                size_t                  addrlen;
  78                char                    *hostname;
  79                u32                     version;
  80                int                     port;
  81                unsigned short          protocol;
  82        } mount_server;
  83
  84        struct {
  85                struct sockaddr_storage address;
  86                size_t                  addrlen;
  87                char                    *hostname;
  88                char                    *export_path;
  89                int                     port;
  90                unsigned short          protocol;
  91        } nfs_server;
  92
  93        struct security_mnt_opts lsm_opts;
  94};
  95
  96/* mount_clnt.c */
  97struct nfs_mount_request {
  98        struct sockaddr         *sap;
  99        size_t                  salen;
 100        char                    *hostname;
 101        char                    *dirpath;
 102        u32                     version;
 103        unsigned short          protocol;
 104        struct nfs_fh           *fh;
 105        int                     noresvport;
 106        unsigned int            *auth_flav_len;
 107        rpc_authflavor_t        *auth_flavs;
 108};
 109
 110extern int nfs_mount(struct nfs_mount_request *info);
 111extern void nfs_umount(const struct nfs_mount_request *info);
 112
 113/* client.c */
 114extern struct rpc_program nfs_program;
 115
 116extern void nfs_put_client(struct nfs_client *);
 117extern struct nfs_client *nfs_find_client(const struct sockaddr *, u32);
 118extern struct nfs_client *nfs_find_client_next(struct nfs_client *);
 119extern struct nfs_server *nfs_create_server(
 120                                        const struct nfs_parsed_mount_data *,
 121                                        struct nfs_fh *);
 122extern struct nfs_server *nfs4_create_server(
 123                                        const struct nfs_parsed_mount_data *,
 124                                        struct nfs_fh *);
 125extern struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *,
 126                                                      struct nfs_fh *);
 127extern void nfs_free_server(struct nfs_server *server);
 128extern struct nfs_server *nfs_clone_server(struct nfs_server *,
 129                                           struct nfs_fh *,
 130                                           struct nfs_fattr *);
 131extern void nfs_mark_client_ready(struct nfs_client *clp, int state);
 132extern int nfs4_check_client_ready(struct nfs_client *clp);
 133#ifdef CONFIG_PROC_FS
 134extern int __init nfs_fs_proc_init(void);
 135extern void nfs_fs_proc_exit(void);
 136#else
 137static inline int nfs_fs_proc_init(void)
 138{
 139        return 0;
 140}
 141static inline void nfs_fs_proc_exit(void)
 142{
 143}
 144#endif
 145
 146/* nfs4namespace.c */
 147#ifdef CONFIG_NFS_V4
 148extern struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry);
 149#else
 150static inline
 151struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry)
 152{
 153        return ERR_PTR(-ENOENT);
 154}
 155#endif
 156
 157/* callback_xdr.c */
 158extern struct svc_version nfs4_callback_version1;
 159
 160/* pagelist.c */
 161extern int __init nfs_init_nfspagecache(void);
 162extern void nfs_destroy_nfspagecache(void);
 163extern int __init nfs_init_readpagecache(void);
 164extern void nfs_destroy_readpagecache(void);
 165extern int __init nfs_init_writepagecache(void);
 166extern void nfs_destroy_writepagecache(void);
 167
 168extern int __init nfs_init_directcache(void);
 169extern void nfs_destroy_directcache(void);
 170
 171/* nfs2xdr.c */
 172extern int nfs_stat_to_errno(int);
 173extern struct rpc_procinfo nfs_procedures[];
 174extern __be32 * nfs_decode_dirent(__be32 *, struct nfs_entry *, int);
 175
 176/* nfs3xdr.c */
 177extern struct rpc_procinfo nfs3_procedures[];
 178extern __be32 *nfs3_decode_dirent(__be32 *, struct nfs_entry *, int);
 179
 180/* nfs4proc.c */
 181static inline void nfs4_restart_rpc(struct rpc_task *task,
 182                                    const struct nfs_client *clp)
 183{
 184#ifdef CONFIG_NFS_V4_1
 185        if (nfs4_has_session(clp) &&
 186            test_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state)) {
 187                rpc_restart_call_prepare(task);
 188                return;
 189        }
 190#endif /* CONFIG_NFS_V4_1 */
 191        rpc_restart_call(task);
 192}
 193
 194/* nfs4xdr.c */
 195#ifdef CONFIG_NFS_V4
 196extern __be32 *nfs4_decode_dirent(__be32 *p, struct nfs_entry *entry, int plus);
 197#endif
 198
 199/* nfs4proc.c */
 200#ifdef CONFIG_NFS_V4
 201extern struct rpc_procinfo nfs4_procedures[];
 202#endif
 203
 204/* proc.c */
 205void nfs_close_context(struct nfs_open_context *ctx, int is_sync);
 206
 207/* dir.c */
 208extern int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask);
 209
 210/* inode.c */
 211extern struct workqueue_struct *nfsiod_workqueue;
 212extern struct inode *nfs_alloc_inode(struct super_block *sb);
 213extern void nfs_destroy_inode(struct inode *);
 214extern int nfs_write_inode(struct inode *,int);
 215extern void nfs_clear_inode(struct inode *);
 216#ifdef CONFIG_NFS_V4
 217extern void nfs4_clear_inode(struct inode *);
 218#endif
 219void nfs_zap_acl_cache(struct inode *inode);
 220extern int nfs_wait_bit_killable(void *word);
 221
 222/* super.c */
 223extern struct file_system_type nfs_xdev_fs_type;
 224#ifdef CONFIG_NFS_V4
 225extern struct file_system_type nfs4_xdev_fs_type;
 226extern struct file_system_type nfs4_referral_fs_type;
 227#endif
 228
 229extern struct rpc_stat nfs_rpcstat;
 230
 231extern int __init register_nfs_fs(void);
 232extern void __exit unregister_nfs_fs(void);
 233extern void nfs_sb_active(struct super_block *sb);
 234extern void nfs_sb_deactive(struct super_block *sb);
 235
 236/* namespace.c */
 237extern char *nfs_path(const char *base,
 238                      const struct dentry *droot,
 239                      const struct dentry *dentry,
 240                      char *buffer, ssize_t buflen);
 241
 242/* getroot.c */
 243extern struct dentry *nfs_get_root(struct super_block *, struct nfs_fh *);
 244#ifdef CONFIG_NFS_V4
 245extern struct dentry *nfs4_get_root(struct super_block *, struct nfs_fh *);
 246
 247extern int nfs4_path_walk(struct nfs_server *server,
 248                          struct nfs_fh *mntfh,
 249                          const char *path);
 250#endif
 251
 252/* read.c */
 253extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
 254
 255/* write.c */
 256extern void nfs_write_prepare(struct rpc_task *task, void *calldata);
 257#ifdef CONFIG_MIGRATION
 258extern int nfs_migrate_page(struct address_space *,
 259                struct page *, struct page *);
 260#else
 261#define nfs_migrate_page NULL
 262#endif
 263
 264/* nfs4proc.c */
 265extern int _nfs4_call_sync(struct nfs_server *server,
 266                           struct rpc_message *msg,
 267                           struct nfs4_sequence_args *args,
 268                           struct nfs4_sequence_res *res,
 269                           int cache_reply);
 270extern int _nfs4_call_sync_session(struct nfs_server *server,
 271                                   struct rpc_message *msg,
 272                                   struct nfs4_sequence_args *args,
 273                                   struct nfs4_sequence_res *res,
 274                                   int cache_reply);
 275
 276#ifdef CONFIG_NFS_V4_1
 277extern void nfs41_sequence_free_slot(const struct nfs_client *,
 278                                     struct nfs4_sequence_res *res);
 279#endif /* CONFIG_NFS_V4_1 */
 280
 281static inline void nfs4_sequence_free_slot(const struct nfs_client *clp,
 282                                           struct nfs4_sequence_res *res)
 283{
 284#ifdef CONFIG_NFS_V4_1
 285        if (nfs4_has_session(clp))
 286                nfs41_sequence_free_slot(clp, res);
 287#endif /* CONFIG_NFS_V4_1 */
 288}
 289
 290/*
 291 * Determine the device name as a string
 292 */
 293static inline char *nfs_devname(const struct vfsmount *mnt_parent,
 294                                const struct dentry *dentry,
 295                                char *buffer, ssize_t buflen)
 296{
 297        return nfs_path(mnt_parent->mnt_devname, mnt_parent->mnt_root,
 298                        dentry, buffer, buflen);
 299}
 300
 301/*
 302 * Determine the actual block size (and log2 thereof)
 303 */
 304static inline
 305unsigned long nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp)
 306{
 307        /* make sure blocksize is a power of two */
 308        if ((bsize & (bsize - 1)) || nrbitsp) {
 309                unsigned char   nrbits;
 310
 311                for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--)
 312                        ;
 313                bsize = 1 << nrbits;
 314                if (nrbitsp)
 315                        *nrbitsp = nrbits;
 316        }
 317
 318        return bsize;
 319}
 320
 321/*
 322 * Calculate the number of 512byte blocks used.
 323 */
 324static inline blkcnt_t nfs_calc_block_size(u64 tsize)
 325{
 326        blkcnt_t used = (tsize + 511) >> 9;
 327        return (used > ULONG_MAX) ? ULONG_MAX : used;
 328}
 329
 330/*
 331 * Compute and set NFS server blocksize
 332 */
 333static inline
 334unsigned long nfs_block_size(unsigned long bsize, unsigned char *nrbitsp)
 335{
 336        if (bsize < NFS_MIN_FILE_IO_SIZE)
 337                bsize = NFS_DEF_FILE_IO_SIZE;
 338        else if (bsize >= NFS_MAX_FILE_IO_SIZE)
 339                bsize = NFS_MAX_FILE_IO_SIZE;
 340
 341        return nfs_block_bits(bsize, nrbitsp);
 342}
 343
 344/*
 345 * Determine the maximum file size for a superblock
 346 */
 347static inline
 348void nfs_super_set_maxbytes(struct super_block *sb, __u64 maxfilesize)
 349{
 350        sb->s_maxbytes = (loff_t)maxfilesize;
 351        if (sb->s_maxbytes > MAX_LFS_FILESIZE || sb->s_maxbytes <= 0)
 352                sb->s_maxbytes = MAX_LFS_FILESIZE;
 353}
 354
 355/*
 356 * Determine the number of bytes of data the page contains
 357 */
 358static inline
 359unsigned int nfs_page_length(struct page *page)
 360{
 361        loff_t i_size = i_size_read(page->mapping->host);
 362
 363        if (i_size > 0) {
 364                pgoff_t end_index = (i_size - 1) >> PAGE_CACHE_SHIFT;
 365                if (page->index < end_index)
 366                        return PAGE_CACHE_SIZE;
 367                if (page->index == end_index)
 368                        return ((i_size - 1) & ~PAGE_CACHE_MASK) + 1;
 369        }
 370        return 0;
 371}
 372
 373/*
 374 * Determine the number of pages in an array of length 'len' and
 375 * with a base offset of 'base'
 376 */
 377static inline
 378unsigned int nfs_page_array_len(unsigned int base, size_t len)
 379{
 380        return ((unsigned long)len + (unsigned long)base +
 381                PAGE_SIZE - 1) >> PAGE_SHIFT;
 382}
 383