internal.h 4.5 KB
Newer Older
David Howells's avatar
David Howells committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 * NFS internal definitions
 */

#include <linux/mount.h>

struct nfs_clone_mount {
	const struct super_block *sb;
	const struct dentry *dentry;
	struct nfs_fh *fh;
	struct nfs_fattr *fattr;
	char *hostname;
	char *mnt_path;
	struct sockaddr_in *addr;
	rpc_authflavor_t authflavor;
};

/* namespace-nfs4.c */
#ifdef CONFIG_NFS_V4
extern struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry);
#else
static inline
struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry)
{
	return ERR_PTR(-ENOENT);
}
#endif

/* callback_xdr.c */
extern struct svc_version nfs4_callback_version1;

/* pagelist.c */
extern int __init nfs_init_nfspagecache(void);
34
extern void nfs_destroy_nfspagecache(void);
David Howells's avatar
David Howells committed
35
extern int __init nfs_init_readpagecache(void);
36
extern void nfs_destroy_readpagecache(void);
David Howells's avatar
David Howells committed
37
extern int __init nfs_init_writepagecache(void);
38
extern void nfs_destroy_writepagecache(void);
David Howells's avatar
David Howells committed
39
40
41

#ifdef CONFIG_NFS_DIRECTIO
extern int __init nfs_init_directcache(void);
42
extern void nfs_destroy_directcache(void);
David Howells's avatar
David Howells committed
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#else
#define nfs_init_directcache() (0)
#define nfs_destroy_directcache() do {} while(0)
#endif

/* nfs2xdr.c */
extern struct rpc_procinfo nfs_procedures[];
extern u32 * nfs_decode_dirent(u32 *, struct nfs_entry *, int);

/* nfs3xdr.c */
extern struct rpc_procinfo nfs3_procedures[];
extern u32 *nfs3_decode_dirent(u32 *, struct nfs_entry *, int);

/* nfs4xdr.c */
extern int nfs_stat_to_errno(int);
extern u32 *nfs4_decode_dirent(u32 *p, struct nfs_entry *entry, int plus);

/* nfs4proc.c */
Andrew Morton's avatar
Andrew Morton committed
61
#ifdef CONFIG_NFS_V4
David Howells's avatar
David Howells committed
62
63
64
65
66
extern struct rpc_procinfo nfs4_procedures[];

extern int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry,
				  struct nfs4_fs_locations *fs_locations,
				  struct page *page);
Andrew Morton's avatar
Andrew Morton committed
67
#endif
David Howells's avatar
David Howells committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

/* inode.c */
extern struct inode *nfs_alloc_inode(struct super_block *sb);
extern void nfs_destroy_inode(struct inode *);
extern int nfs_write_inode(struct inode *,int);
extern void nfs_clear_inode(struct inode *);
#ifdef CONFIG_NFS_V4
extern void nfs4_clear_inode(struct inode *);
#endif

/* super.c */
extern struct file_system_type nfs_referral_nfs4_fs_type;
extern struct file_system_type clone_nfs_fs_type;
#ifdef CONFIG_NFS_V4
extern struct file_system_type clone_nfs4_fs_type;
#endif
84

David Howells's avatar
David Howells committed
85
extern struct rpc_stat nfs_rpcstat;
86

David Howells's avatar
David Howells committed
87
88
89
90
91
92
93
94
95
96
extern int __init register_nfs_fs(void);
extern void __exit unregister_nfs_fs(void);

/* namespace.c */
extern char *nfs_path(const char *base, const struct dentry *dentry,
		      char *buffer, ssize_t buflen);

/*
 * Determine the mount path as a string
 */
Andrew Morton's avatar
Andrew Morton committed
97
98
static inline char *
nfs4_path(const struct dentry *dentry, char *buffer, ssize_t buflen)
David Howells's avatar
David Howells committed
99
{
Andrew Morton's avatar
Andrew Morton committed
100
#ifdef CONFIG_NFS_V4
David Howells's avatar
David Howells committed
101
	return nfs_path(NFS_SB(dentry->d_sb)->mnt_path, dentry, buffer, buflen);
Andrew Morton's avatar
Andrew Morton committed
102
103
104
#else
	return NULL;
#endif
David Howells's avatar
David Howells committed
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
}

/*
 * Determine the device name as a string
 */
static inline char *nfs_devname(const struct vfsmount *mnt_parent,
			 const struct dentry *dentry,
			 char *buffer, ssize_t buflen)
{
	return nfs_path(mnt_parent->mnt_devname, dentry, buffer, buflen);
}

/*
 * Determine the actual block size (and log2 thereof)
 */
static inline
unsigned long nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp)
{
	/* make sure blocksize is a power of two */
	if ((bsize & (bsize - 1)) || nrbitsp) {
		unsigned char	nrbits;

		for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--)
			;
		bsize = 1 << nrbits;
		if (nrbitsp)
			*nrbitsp = nrbits;
	}

	return bsize;
}

/*
 * Calculate the number of 512byte blocks used.
 */
static inline unsigned long nfs_calc_block_size(u64 tsize)
{
	loff_t used = (tsize + 511) >> 9;
	return (used > ULONG_MAX) ? ULONG_MAX : used;
}

/*
 * Compute and set NFS server blocksize
 */
static inline
unsigned long nfs_block_size(unsigned long bsize, unsigned char *nrbitsp)
{
	if (bsize < NFS_MIN_FILE_IO_SIZE)
		bsize = NFS_DEF_FILE_IO_SIZE;
	else if (bsize >= NFS_MAX_FILE_IO_SIZE)
		bsize = NFS_MAX_FILE_IO_SIZE;

	return nfs_block_bits(bsize, nrbitsp);
}

/*
 * Determine the maximum file size for a superblock
 */
static inline
void nfs_super_set_maxbytes(struct super_block *sb, __u64 maxfilesize)
{
	sb->s_maxbytes = (loff_t)maxfilesize;
	if (sb->s_maxbytes > MAX_LFS_FILESIZE || sb->s_maxbytes <= 0)
		sb->s_maxbytes = MAX_LFS_FILESIZE;
}

/*
 * Check if the string represents a "valid" IPv4 address
 */
static inline int valid_ipaddr4(const char *buf)
{
	int rc, count, in[4];

	rc = sscanf(buf, "%d.%d.%d.%d", &in[0], &in[1], &in[2], &in[3]);
	if (rc != 4)
		return -EINVAL;
	for (count = 0; count < 4; count++) {
		if (in[count] > 255)
			return -EINVAL;
	}
	return 0;
}