1 |
62 |
marcus.erl |
#ifndef _LINUX_FS_H
|
2 |
|
|
#define _LINUX_FS_H
|
3 |
|
|
|
4 |
|
|
/*
|
5 |
|
|
* This file has definitions for some important file table
|
6 |
|
|
* structures etc.
|
7 |
|
|
*/
|
8 |
|
|
|
9 |
|
|
#include <linux/limits.h>
|
10 |
|
|
#include <linux/ioctl.h>
|
11 |
|
|
|
12 |
|
|
/*
|
13 |
|
|
* It's silly to have NR_OPEN bigger than NR_FILE, but you can change
|
14 |
|
|
* the file limit at runtime and only root can increase the per-process
|
15 |
|
|
* nr_file rlimit, so it's safe to set up a ridiculously high absolute
|
16 |
|
|
* upper limit on files-per-process.
|
17 |
|
|
*
|
18 |
|
|
* Some programs (notably those using select()) may have to be
|
19 |
|
|
* recompiled to take full advantage of the new limits..
|
20 |
|
|
*/
|
21 |
|
|
|
22 |
|
|
/* Fixed constants first: */
|
23 |
|
|
#undef NR_OPEN
|
24 |
|
|
#define NR_OPEN (1024*1024) /* Absolute upper limit on fd num */
|
25 |
|
|
#define INR_OPEN 1024 /* Initial setting for nfile rlimits */
|
26 |
|
|
|
27 |
|
|
#define BLOCK_SIZE_BITS 10
|
28 |
|
|
#define BLOCK_SIZE (1<<BLOCK_SIZE_BITS)
|
29 |
|
|
|
30 |
|
|
#define SEEK_SET 0 /* seek relative to beginning of file */
|
31 |
|
|
#define SEEK_CUR 1 /* seek relative to current file position */
|
32 |
|
|
#define SEEK_END 2 /* seek relative to end of file */
|
33 |
|
|
#define SEEK_MAX SEEK_END
|
34 |
|
|
|
35 |
|
|
/* And dynamically-tunable limits and defaults: */
|
36 |
|
|
struct files_stat_struct {
|
37 |
|
|
int nr_files; /* read only */
|
38 |
|
|
int nr_free_files; /* read only */
|
39 |
|
|
int max_files; /* tunable */
|
40 |
|
|
};
|
41 |
|
|
extern struct files_stat_struct files_stat;
|
42 |
|
|
extern int get_max_files(void);
|
43 |
|
|
|
44 |
|
|
struct inodes_stat_t {
|
45 |
|
|
int nr_inodes;
|
46 |
|
|
int nr_unused;
|
47 |
|
|
int dummy[5]; /* padding for sysctl ABI compatibility */
|
48 |
|
|
};
|
49 |
|
|
extern struct inodes_stat_t inodes_stat;
|
50 |
|
|
|
51 |
|
|
extern int leases_enable, lease_break_time;
|
52 |
|
|
|
53 |
|
|
#ifdef CONFIG_DNOTIFY
|
54 |
|
|
extern int dir_notify_enable;
|
55 |
|
|
#endif
|
56 |
|
|
|
57 |
|
|
#define NR_FILE 8192 /* this can well be larger on a larger system */
|
58 |
|
|
|
59 |
|
|
#define MAY_EXEC 1
|
60 |
|
|
#define MAY_WRITE 2
|
61 |
|
|
#define MAY_READ 4
|
62 |
|
|
#define MAY_APPEND 8
|
63 |
|
|
|
64 |
|
|
#define FMODE_READ 1
|
65 |
|
|
#define FMODE_WRITE 2
|
66 |
|
|
|
67 |
|
|
/* Internal kernel extensions */
|
68 |
|
|
#define FMODE_LSEEK 4
|
69 |
|
|
#define FMODE_PREAD 8
|
70 |
|
|
#define FMODE_PWRITE FMODE_PREAD /* These go hand in hand */
|
71 |
|
|
|
72 |
|
|
/* File is being opened for execution. Primary users of this flag are
|
73 |
|
|
distributed filesystems that can use it to achieve correct ETXTBUSY
|
74 |
|
|
behavior for cross-node execution/opening_for_writing of files */
|
75 |
|
|
#define FMODE_EXEC 16
|
76 |
|
|
|
77 |
|
|
#define RW_MASK 1
|
78 |
|
|
#define RWA_MASK 2
|
79 |
|
|
#define READ 0
|
80 |
|
|
#define WRITE 1
|
81 |
|
|
#define READA 2 /* read-ahead - don't block if no resources */
|
82 |
|
|
#define SWRITE 3 /* for ll_rw_block() - wait for buffer lock */
|
83 |
|
|
#define READ_SYNC (READ | (1 << BIO_RW_SYNC))
|
84 |
|
|
#define READ_META (READ | (1 << BIO_RW_META))
|
85 |
|
|
#define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNC))
|
86 |
|
|
#define WRITE_BARRIER ((1 << BIO_RW) | (1 << BIO_RW_BARRIER))
|
87 |
|
|
|
88 |
|
|
#define SEL_IN 1
|
89 |
|
|
#define SEL_OUT 2
|
90 |
|
|
#define SEL_EX 4
|
91 |
|
|
|
92 |
|
|
/* public flags for file_system_type */
|
93 |
|
|
#define FS_REQUIRES_DEV 1
|
94 |
|
|
#define FS_BINARY_MOUNTDATA 2
|
95 |
|
|
#define FS_HAS_SUBTYPE 4
|
96 |
|
|
#define FS_REVAL_DOT 16384 /* Check the paths ".", ".." for staleness */
|
97 |
|
|
#define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move()
|
98 |
|
|
* during rename() internally.
|
99 |
|
|
*/
|
100 |
|
|
|
101 |
|
|
/*
|
102 |
|
|
* These are the fs-independent mount-flags: up to 32 flags are supported
|
103 |
|
|
*/
|
104 |
|
|
#define MS_RDONLY 1 /* Mount read-only */
|
105 |
|
|
#define MS_NOSUID 2 /* Ignore suid and sgid bits */
|
106 |
|
|
#define MS_NODEV 4 /* Disallow access to device special files */
|
107 |
|
|
#define MS_NOEXEC 8 /* Disallow program execution */
|
108 |
|
|
#define MS_SYNCHRONOUS 16 /* Writes are synced at once */
|
109 |
|
|
#define MS_REMOUNT 32 /* Alter flags of a mounted FS */
|
110 |
|
|
#define MS_MANDLOCK 64 /* Allow mandatory locks on an FS */
|
111 |
|
|
#define MS_DIRSYNC 128 /* Directory modifications are synchronous */
|
112 |
|
|
#define MS_NOATIME 1024 /* Do not update access times. */
|
113 |
|
|
#define MS_NODIRATIME 2048 /* Do not update directory access times */
|
114 |
|
|
#define MS_BIND 4096
|
115 |
|
|
#define MS_MOVE 8192
|
116 |
|
|
#define MS_REC 16384
|
117 |
|
|
#define MS_VERBOSE 32768 /* War is peace. Verbosity is silence.
|
118 |
|
|
MS_VERBOSE is deprecated. */
|
119 |
|
|
#define MS_SILENT 32768
|
120 |
|
|
#define MS_POSIXACL (1<<16) /* VFS does not apply the umask */
|
121 |
|
|
#define MS_UNBINDABLE (1<<17) /* change to unbindable */
|
122 |
|
|
#define MS_PRIVATE (1<<18) /* change to private */
|
123 |
|
|
#define MS_SLAVE (1<<19) /* change to slave */
|
124 |
|
|
#define MS_SHARED (1<<20) /* change to shared */
|
125 |
|
|
#define MS_RELATIME (1<<21) /* Update atime relative to mtime/ctime. */
|
126 |
|
|
#define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */
|
127 |
|
|
#define MS_ACTIVE (1<<30)
|
128 |
|
|
#define MS_NOUSER (1<<31)
|
129 |
|
|
|
130 |
|
|
/*
|
131 |
|
|
* Superblock flags that can be altered by MS_REMOUNT
|
132 |
|
|
*/
|
133 |
|
|
#define MS_RMT_MASK (MS_RDONLY|MS_SYNCHRONOUS|MS_MANDLOCK)
|
134 |
|
|
|
135 |
|
|
/*
|
136 |
|
|
* Old magic mount flag and mask
|
137 |
|
|
*/
|
138 |
|
|
#define MS_MGC_VAL 0xC0ED0000
|
139 |
|
|
#define MS_MGC_MSK 0xffff0000
|
140 |
|
|
|
141 |
|
|
/* Inode flags - they have nothing to superblock flags now */
|
142 |
|
|
|
143 |
|
|
#define S_SYNC 1 /* Writes are synced at once */
|
144 |
|
|
#define S_NOATIME 2 /* Do not update access times */
|
145 |
|
|
#define S_APPEND 4 /* Append-only file */
|
146 |
|
|
#define S_IMMUTABLE 8 /* Immutable file */
|
147 |
|
|
#define S_DEAD 16 /* removed, but still open directory */
|
148 |
|
|
#define S_NOQUOTA 32 /* Inode is not counted to quota */
|
149 |
|
|
#define S_DIRSYNC 64 /* Directory modifications are synchronous */
|
150 |
|
|
#define S_NOCMTIME 128 /* Do not update file c/mtime */
|
151 |
|
|
#define S_SWAPFILE 256 /* Do not truncate: swapon got its bmaps */
|
152 |
|
|
#define S_PRIVATE 512 /* Inode is fs-internal */
|
153 |
|
|
|
154 |
|
|
/*
|
155 |
|
|
* Note that nosuid etc flags are inode-specific: setting some file-system
|
156 |
|
|
* flags just means all the inodes inherit those flags by default. It might be
|
157 |
|
|
* possible to override it selectively if you really wanted to with some
|
158 |
|
|
* ioctl() that is not currently implemented.
|
159 |
|
|
*
|
160 |
|
|
* Exception: MS_RDONLY is always applied to the entire file system.
|
161 |
|
|
*
|
162 |
|
|
* Unfortunately, it is possible to change a filesystems flags with it mounted
|
163 |
|
|
* with files in use. This means that all of the inodes will not have their
|
164 |
|
|
* i_flags updated. Hence, i_flags no longer inherit the superblock mount
|
165 |
|
|
* flags, so these have to be checked separately. -- rmk@arm.uk.linux.org
|
166 |
|
|
*/
|
167 |
|
|
#define __IS_FLG(inode,flg) ((inode)->i_sb->s_flags & (flg))
|
168 |
|
|
|
169 |
|
|
#define IS_RDONLY(inode) ((inode)->i_sb->s_flags & MS_RDONLY)
|
170 |
|
|
#define IS_SYNC(inode) (__IS_FLG(inode, MS_SYNCHRONOUS) || \
|
171 |
|
|
((inode)->i_flags & S_SYNC))
|
172 |
|
|
#define IS_DIRSYNC(inode) (__IS_FLG(inode, MS_SYNCHRONOUS|MS_DIRSYNC) || \
|
173 |
|
|
((inode)->i_flags & (S_SYNC|S_DIRSYNC)))
|
174 |
|
|
#define IS_MANDLOCK(inode) __IS_FLG(inode, MS_MANDLOCK)
|
175 |
|
|
#define IS_NOATIME(inode) __IS_FLG(inode, MS_RDONLY|MS_NOATIME)
|
176 |
|
|
|
177 |
|
|
#define IS_NOQUOTA(inode) ((inode)->i_flags & S_NOQUOTA)
|
178 |
|
|
#define IS_APPEND(inode) ((inode)->i_flags & S_APPEND)
|
179 |
|
|
#define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE)
|
180 |
|
|
#define IS_POSIXACL(inode) __IS_FLG(inode, MS_POSIXACL)
|
181 |
|
|
|
182 |
|
|
#define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD)
|
183 |
|
|
#define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME)
|
184 |
|
|
#define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE)
|
185 |
|
|
#define IS_PRIVATE(inode) ((inode)->i_flags & S_PRIVATE)
|
186 |
|
|
|
187 |
|
|
/* the read-only stuff doesn't really belong here, but any other place is
|
188 |
|
|
probably as bad and I don't want to create yet another include file. */
|
189 |
|
|
|
190 |
|
|
#define BLKROSET _IO(0x12,93) /* set device read-only (0 = read-write) */
|
191 |
|
|
#define BLKROGET _IO(0x12,94) /* get read-only status (0 = read_write) */
|
192 |
|
|
#define BLKRRPART _IO(0x12,95) /* re-read partition table */
|
193 |
|
|
#define BLKGETSIZE _IO(0x12,96) /* return device size /512 (long *arg) */
|
194 |
|
|
#define BLKFLSBUF _IO(0x12,97) /* flush buffer cache */
|
195 |
|
|
#define BLKRASET _IO(0x12,98) /* set read ahead for block device */
|
196 |
|
|
#define BLKRAGET _IO(0x12,99) /* get current read ahead setting */
|
197 |
|
|
#define BLKFRASET _IO(0x12,100)/* set filesystem (mm/filemap.c) read-ahead */
|
198 |
|
|
#define BLKFRAGET _IO(0x12,101)/* get filesystem (mm/filemap.c) read-ahead */
|
199 |
|
|
#define BLKSECTSET _IO(0x12,102)/* set max sectors per request (ll_rw_blk.c) */
|
200 |
|
|
#define BLKSECTGET _IO(0x12,103)/* get max sectors per request (ll_rw_blk.c) */
|
201 |
|
|
#define BLKSSZGET _IO(0x12,104)/* get block device sector size */
|
202 |
|
|
#if 0
|
203 |
|
|
#define BLKPG _IO(0x12,105)/* See blkpg.h */
|
204 |
|
|
|
205 |
|
|
/* Some people are morons. Do not use sizeof! */
|
206 |
|
|
|
207 |
|
|
#define BLKELVGET _IOR(0x12,106,size_t)/* elevator get */
|
208 |
|
|
#define BLKELVSET _IOW(0x12,107,size_t)/* elevator set */
|
209 |
|
|
/* This was here just to show that the number is taken -
|
210 |
|
|
probably all these _IO(0x12,*) ioctls should be moved to blkpg.h. */
|
211 |
|
|
#endif
|
212 |
|
|
/* A jump here: 108-111 have been used for various private purposes. */
|
213 |
|
|
#define BLKBSZGET _IOR(0x12,112,size_t)
|
214 |
|
|
#define BLKBSZSET _IOW(0x12,113,size_t)
|
215 |
|
|
#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size in bytes (u64 *arg) */
|
216 |
|
|
#define BLKTRACESETUP _IOWR(0x12,115,struct blk_user_trace_setup)
|
217 |
|
|
#define BLKTRACESTART _IO(0x12,116)
|
218 |
|
|
#define BLKTRACESTOP _IO(0x12,117)
|
219 |
|
|
#define BLKTRACETEARDOWN _IO(0x12,118)
|
220 |
|
|
|
221 |
|
|
#define BMAP_IOCTL 1 /* obsolete - kept for compatibility */
|
222 |
|
|
#define FIBMAP _IO(0x00,1) /* bmap access */
|
223 |
|
|
#define FIGETBSZ _IO(0x00,2) /* get the block size used for bmap */
|
224 |
|
|
|
225 |
|
|
#define FS_IOC_GETFLAGS _IOR('f', 1, long)
|
226 |
|
|
#define FS_IOC_SETFLAGS _IOW('f', 2, long)
|
227 |
|
|
#define FS_IOC_GETVERSION _IOR('v', 1, long)
|
228 |
|
|
#define FS_IOC_SETVERSION _IOW('v', 2, long)
|
229 |
|
|
#define FS_IOC32_GETFLAGS _IOR('f', 1, int)
|
230 |
|
|
#define FS_IOC32_SETFLAGS _IOW('f', 2, int)
|
231 |
|
|
#define FS_IOC32_GETVERSION _IOR('v', 1, int)
|
232 |
|
|
#define FS_IOC32_SETVERSION _IOW('v', 2, int)
|
233 |
|
|
|
234 |
|
|
/*
|
235 |
|
|
* Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS)
|
236 |
|
|
*/
|
237 |
|
|
#define FS_SECRM_FL 0x00000001 /* Secure deletion */
|
238 |
|
|
#define FS_UNRM_FL 0x00000002 /* Undelete */
|
239 |
|
|
#define FS_COMPR_FL 0x00000004 /* Compress file */
|
240 |
|
|
#define FS_SYNC_FL 0x00000008 /* Synchronous updates */
|
241 |
|
|
#define FS_IMMUTABLE_FL 0x00000010 /* Immutable file */
|
242 |
|
|
#define FS_APPEND_FL 0x00000020 /* writes to file may only append */
|
243 |
|
|
#define FS_NODUMP_FL 0x00000040 /* do not dump file */
|
244 |
|
|
#define FS_NOATIME_FL 0x00000080 /* do not update atime */
|
245 |
|
|
/* Reserved for compression usage... */
|
246 |
|
|
#define FS_DIRTY_FL 0x00000100
|
247 |
|
|
#define FS_COMPRBLK_FL 0x00000200 /* One or more compressed clusters */
|
248 |
|
|
#define FS_NOCOMP_FL 0x00000400 /* Don't compress */
|
249 |
|
|
#define FS_ECOMPR_FL 0x00000800 /* Compression error */
|
250 |
|
|
/* End compression flags --- maybe not all used */
|
251 |
|
|
#define FS_BTREE_FL 0x00001000 /* btree format dir */
|
252 |
|
|
#define FS_INDEX_FL 0x00001000 /* hash-indexed directory */
|
253 |
|
|
#define FS_IMAGIC_FL 0x00002000 /* AFS directory */
|
254 |
|
|
#define FS_JOURNAL_DATA_FL 0x00004000 /* Reserved for ext3 */
|
255 |
|
|
#define FS_NOTAIL_FL 0x00008000 /* file tail should not be merged */
|
256 |
|
|
#define FS_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */
|
257 |
|
|
#define FS_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/
|
258 |
|
|
#define FS_EXTENT_FL 0x00080000 /* Extents */
|
259 |
|
|
#define FS_DIRECTIO_FL 0x00100000 /* Use direct i/o */
|
260 |
|
|
#define FS_RESERVED_FL 0x80000000 /* reserved for ext2 lib */
|
261 |
|
|
|
262 |
|
|
#define FS_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */
|
263 |
|
|
#define FS_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */
|
264 |
|
|
|
265 |
|
|
|
266 |
|
|
#define SYNC_FILE_RANGE_WAIT_BEFORE 1
|
267 |
|
|
#define SYNC_FILE_RANGE_WRITE 2
|
268 |
|
|
#define SYNC_FILE_RANGE_WAIT_AFTER 4
|
269 |
|
|
|
270 |
|
|
#ifdef __KERNEL__
|
271 |
|
|
|
272 |
|
|
#include <linux/linkage.h>
|
273 |
|
|
#include <linux/wait.h>
|
274 |
|
|
#include <linux/types.h>
|
275 |
|
|
#include <linux/kdev_t.h>
|
276 |
|
|
#include <linux/dcache.h>
|
277 |
|
|
#include <linux/namei.h>
|
278 |
|
|
#include <linux/stat.h>
|
279 |
|
|
#include <linux/cache.h>
|
280 |
|
|
#include <linux/kobject.h>
|
281 |
|
|
#include <linux/list.h>
|
282 |
|
|
#include <linux/radix-tree.h>
|
283 |
|
|
#include <linux/prio_tree.h>
|
284 |
|
|
#include <linux/init.h>
|
285 |
|
|
#include <linux/pid.h>
|
286 |
|
|
#include <linux/mutex.h>
|
287 |
|
|
#include <linux/capability.h>
|
288 |
|
|
|
289 |
|
|
#include <asm/atomic.h>
|
290 |
|
|
#include <asm/semaphore.h>
|
291 |
|
|
#include <asm/byteorder.h>
|
292 |
|
|
|
293 |
|
|
struct export_operations;
|
294 |
|
|
struct hd_geometry;
|
295 |
|
|
struct iovec;
|
296 |
|
|
struct nameidata;
|
297 |
|
|
struct kiocb;
|
298 |
|
|
struct pipe_inode_info;
|
299 |
|
|
struct poll_table_struct;
|
300 |
|
|
struct kstatfs;
|
301 |
|
|
struct vm_area_struct;
|
302 |
|
|
struct vfsmount;
|
303 |
|
|
|
304 |
|
|
extern void __init inode_init(void);
|
305 |
|
|
extern void __init inode_init_early(void);
|
306 |
|
|
extern void __init mnt_init(void);
|
307 |
|
|
extern void __init files_init(unsigned long);
|
308 |
|
|
|
309 |
|
|
struct buffer_head;
|
310 |
|
|
typedef int (get_block_t)(struct inode *inode, sector_t iblock,
|
311 |
|
|
struct buffer_head *bh_result, int create);
|
312 |
|
|
typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset,
|
313 |
|
|
ssize_t bytes, void *private);
|
314 |
|
|
|
315 |
|
|
/*
|
316 |
|
|
* Attribute flags. These should be or-ed together to figure out what
|
317 |
|
|
* has been changed!
|
318 |
|
|
*/
|
319 |
|
|
#define ATTR_MODE 1
|
320 |
|
|
#define ATTR_UID 2
|
321 |
|
|
#define ATTR_GID 4
|
322 |
|
|
#define ATTR_SIZE 8
|
323 |
|
|
#define ATTR_ATIME 16
|
324 |
|
|
#define ATTR_MTIME 32
|
325 |
|
|
#define ATTR_CTIME 64
|
326 |
|
|
#define ATTR_ATIME_SET 128
|
327 |
|
|
#define ATTR_MTIME_SET 256
|
328 |
|
|
#define ATTR_FORCE 512 /* Not a change, but a change it */
|
329 |
|
|
#define ATTR_ATTR_FLAG 1024
|
330 |
|
|
#define ATTR_KILL_SUID 2048
|
331 |
|
|
#define ATTR_KILL_SGID 4096
|
332 |
|
|
#define ATTR_FILE 8192
|
333 |
|
|
#define ATTR_KILL_PRIV 16384
|
334 |
|
|
#define ATTR_OPEN 32768 /* Truncating from open(O_TRUNC) */
|
335 |
|
|
|
336 |
|
|
/*
|
337 |
|
|
* This is the Inode Attributes structure, used for notify_change(). It
|
338 |
|
|
* uses the above definitions as flags, to know which values have changed.
|
339 |
|
|
* Also, in this manner, a Filesystem can look at only the values it cares
|
340 |
|
|
* about. Basically, these are the attributes that the VFS layer can
|
341 |
|
|
* request to change from the FS layer.
|
342 |
|
|
*
|
343 |
|
|
* Derek Atkins <warlord@MIT.EDU> 94-10-20
|
344 |
|
|
*/
|
345 |
|
|
struct iattr {
|
346 |
|
|
unsigned int ia_valid;
|
347 |
|
|
umode_t ia_mode;
|
348 |
|
|
uid_t ia_uid;
|
349 |
|
|
gid_t ia_gid;
|
350 |
|
|
loff_t ia_size;
|
351 |
|
|
struct timespec ia_atime;
|
352 |
|
|
struct timespec ia_mtime;
|
353 |
|
|
struct timespec ia_ctime;
|
354 |
|
|
|
355 |
|
|
/*
|
356 |
|
|
* Not an attribute, but an auxilary info for filesystems wanting to
|
357 |
|
|
* implement an ftruncate() like method. NOTE: filesystem should
|
358 |
|
|
* check for (ia_valid & ATTR_FILE), and not for (ia_file != NULL).
|
359 |
|
|
*/
|
360 |
|
|
struct file *ia_file;
|
361 |
|
|
};
|
362 |
|
|
|
363 |
|
|
/*
|
364 |
|
|
* Includes for diskquotas.
|
365 |
|
|
*/
|
366 |
|
|
#include <linux/quota.h>
|
367 |
|
|
|
368 |
|
|
/**
|
369 |
|
|
* enum positive_aop_returns - aop return codes with specific semantics
|
370 |
|
|
*
|
371 |
|
|
* @AOP_WRITEPAGE_ACTIVATE: Informs the caller that page writeback has
|
372 |
|
|
* completed, that the page is still locked, and
|
373 |
|
|
* should be considered active. The VM uses this hint
|
374 |
|
|
* to return the page to the active list -- it won't
|
375 |
|
|
* be a candidate for writeback again in the near
|
376 |
|
|
* future. Other callers must be careful to unlock
|
377 |
|
|
* the page if they get this return. Returned by
|
378 |
|
|
* writepage();
|
379 |
|
|
*
|
380 |
|
|
* @AOP_TRUNCATED_PAGE: The AOP method that was handed a locked page has
|
381 |
|
|
* unlocked it and the page might have been truncated.
|
382 |
|
|
* The caller should back up to acquiring a new page and
|
383 |
|
|
* trying again. The aop will be taking reasonable
|
384 |
|
|
* precautions not to livelock. If the caller held a page
|
385 |
|
|
* reference, it should drop it before retrying. Returned
|
386 |
|
|
* by readpage().
|
387 |
|
|
*
|
388 |
|
|
* address_space_operation functions return these large constants to indicate
|
389 |
|
|
* special semantics to the caller. These are much larger than the bytes in a
|
390 |
|
|
* page to allow for functions that return the number of bytes operated on in a
|
391 |
|
|
* given page.
|
392 |
|
|
*/
|
393 |
|
|
|
394 |
|
|
enum positive_aop_returns {
|
395 |
|
|
AOP_WRITEPAGE_ACTIVATE = 0x80000,
|
396 |
|
|
AOP_TRUNCATED_PAGE = 0x80001,
|
397 |
|
|
};
|
398 |
|
|
|
399 |
|
|
#define AOP_FLAG_UNINTERRUPTIBLE 0x0001 /* will not do a short write */
|
400 |
|
|
#define AOP_FLAG_CONT_EXPAND 0x0002 /* called from cont_expand */
|
401 |
|
|
|
402 |
|
|
/*
|
403 |
|
|
* oh the beauties of C type declarations.
|
404 |
|
|
*/
|
405 |
|
|
struct page;
|
406 |
|
|
struct address_space;
|
407 |
|
|
struct writeback_control;
|
408 |
|
|
|
409 |
|
|
struct iov_iter {
|
410 |
|
|
const struct iovec *iov;
|
411 |
|
|
unsigned long nr_segs;
|
412 |
|
|
size_t iov_offset;
|
413 |
|
|
size_t count;
|
414 |
|
|
};
|
415 |
|
|
|
416 |
|
|
size_t iov_iter_copy_from_user_atomic(struct page *page,
|
417 |
|
|
struct iov_iter *i, unsigned long offset, size_t bytes);
|
418 |
|
|
size_t iov_iter_copy_from_user(struct page *page,
|
419 |
|
|
struct iov_iter *i, unsigned long offset, size_t bytes);
|
420 |
|
|
void iov_iter_advance(struct iov_iter *i, size_t bytes);
|
421 |
|
|
int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes);
|
422 |
|
|
size_t iov_iter_single_seg_count(struct iov_iter *i);
|
423 |
|
|
|
424 |
|
|
static inline void iov_iter_init(struct iov_iter *i,
|
425 |
|
|
const struct iovec *iov, unsigned long nr_segs,
|
426 |
|
|
size_t count, size_t written)
|
427 |
|
|
{
|
428 |
|
|
i->iov = iov;
|
429 |
|
|
i->nr_segs = nr_segs;
|
430 |
|
|
i->iov_offset = 0;
|
431 |
|
|
i->count = count + written;
|
432 |
|
|
|
433 |
|
|
iov_iter_advance(i, written);
|
434 |
|
|
}
|
435 |
|
|
|
436 |
|
|
static inline size_t iov_iter_count(struct iov_iter *i)
|
437 |
|
|
{
|
438 |
|
|
return i->count;
|
439 |
|
|
}
|
440 |
|
|
|
441 |
|
|
|
442 |
|
|
struct address_space_operations {
|
443 |
|
|
int (*writepage)(struct page *page, struct writeback_control *wbc);
|
444 |
|
|
int (*readpage)(struct file *, struct page *);
|
445 |
|
|
void (*sync_page)(struct page *);
|
446 |
|
|
|
447 |
|
|
/* Write back some dirty pages from this mapping. */
|
448 |
|
|
int (*writepages)(struct address_space *, struct writeback_control *);
|
449 |
|
|
|
450 |
|
|
/* Set a page dirty. Return true if this dirtied it */
|
451 |
|
|
int (*set_page_dirty)(struct page *page);
|
452 |
|
|
|
453 |
|
|
int (*readpages)(struct file *filp, struct address_space *mapping,
|
454 |
|
|
struct list_head *pages, unsigned nr_pages);
|
455 |
|
|
|
456 |
|
|
/*
|
457 |
|
|
* ext3 requires that a successful prepare_write() call be followed
|
458 |
|
|
* by a commit_write() call - they must be balanced
|
459 |
|
|
*/
|
460 |
|
|
int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
|
461 |
|
|
int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
|
462 |
|
|
|
463 |
|
|
int (*write_begin)(struct file *, struct address_space *mapping,
|
464 |
|
|
loff_t pos, unsigned len, unsigned flags,
|
465 |
|
|
struct page **pagep, void **fsdata);
|
466 |
|
|
int (*write_end)(struct file *, struct address_space *mapping,
|
467 |
|
|
loff_t pos, unsigned len, unsigned copied,
|
468 |
|
|
struct page *page, void *fsdata);
|
469 |
|
|
|
470 |
|
|
/* Unfortunately this kludge is needed for FIBMAP. Don't use it */
|
471 |
|
|
sector_t (*bmap)(struct address_space *, sector_t);
|
472 |
|
|
void (*invalidatepage) (struct page *, unsigned long);
|
473 |
|
|
int (*releasepage) (struct page *, gfp_t);
|
474 |
|
|
ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
|
475 |
|
|
loff_t offset, unsigned long nr_segs);
|
476 |
|
|
struct page* (*get_xip_page)(struct address_space *, sector_t,
|
477 |
|
|
int);
|
478 |
|
|
/* migrate the contents of a page to the specified target */
|
479 |
|
|
int (*migratepage) (struct address_space *,
|
480 |
|
|
struct page *, struct page *);
|
481 |
|
|
int (*launder_page) (struct page *);
|
482 |
|
|
};
|
483 |
|
|
|
484 |
|
|
/*
|
485 |
|
|
* pagecache_write_begin/pagecache_write_end must be used by general code
|
486 |
|
|
* to write into the pagecache.
|
487 |
|
|
*/
|
488 |
|
|
int pagecache_write_begin(struct file *, struct address_space *mapping,
|
489 |
|
|
loff_t pos, unsigned len, unsigned flags,
|
490 |
|
|
struct page **pagep, void **fsdata);
|
491 |
|
|
|
492 |
|
|
int pagecache_write_end(struct file *, struct address_space *mapping,
|
493 |
|
|
loff_t pos, unsigned len, unsigned copied,
|
494 |
|
|
struct page *page, void *fsdata);
|
495 |
|
|
|
496 |
|
|
struct backing_dev_info;
|
497 |
|
|
struct address_space {
|
498 |
|
|
struct inode *host; /* owner: inode, block_device */
|
499 |
|
|
struct radix_tree_root page_tree; /* radix tree of all pages */
|
500 |
|
|
rwlock_t tree_lock; /* and rwlock protecting it */
|
501 |
|
|
unsigned int i_mmap_writable;/* count VM_SHARED mappings */
|
502 |
|
|
struct prio_tree_root i_mmap; /* tree of private and shared mappings */
|
503 |
|
|
struct list_head i_mmap_nonlinear;/*list VM_NONLINEAR mappings */
|
504 |
|
|
spinlock_t i_mmap_lock; /* protect tree, count, list */
|
505 |
|
|
unsigned int truncate_count; /* Cover race condition with truncate */
|
506 |
|
|
unsigned long nrpages; /* number of total pages */
|
507 |
|
|
pgoff_t writeback_index;/* writeback starts here */
|
508 |
|
|
const struct address_space_operations *a_ops; /* methods */
|
509 |
|
|
unsigned long flags; /* error bits/gfp mask */
|
510 |
|
|
struct backing_dev_info *backing_dev_info; /* device readahead, etc */
|
511 |
|
|
spinlock_t private_lock; /* for use by the address_space */
|
512 |
|
|
struct list_head private_list; /* ditto */
|
513 |
|
|
struct address_space *assoc_mapping; /* ditto */
|
514 |
|
|
} __attribute__((aligned(sizeof(long))));
|
515 |
|
|
/*
|
516 |
|
|
* On most architectures that alignment is already the case; but
|
517 |
|
|
* must be enforced here for CRIS, to let the least signficant bit
|
518 |
|
|
* of struct page's "mapping" pointer be used for PAGE_MAPPING_ANON.
|
519 |
|
|
*/
|
520 |
|
|
|
521 |
|
|
struct block_device {
|
522 |
|
|
dev_t bd_dev; /* not a kdev_t - it's a search key */
|
523 |
|
|
struct inode * bd_inode; /* will die */
|
524 |
|
|
int bd_openers;
|
525 |
|
|
struct mutex bd_mutex; /* open/close mutex */
|
526 |
|
|
struct semaphore bd_mount_sem;
|
527 |
|
|
struct list_head bd_inodes;
|
528 |
|
|
void * bd_holder;
|
529 |
|
|
int bd_holders;
|
530 |
|
|
#ifdef CONFIG_SYSFS
|
531 |
|
|
struct list_head bd_holder_list;
|
532 |
|
|
#endif
|
533 |
|
|
struct block_device * bd_contains;
|
534 |
|
|
unsigned bd_block_size;
|
535 |
|
|
struct hd_struct * bd_part;
|
536 |
|
|
/* number of times partitions within this device have been opened. */
|
537 |
|
|
unsigned bd_part_count;
|
538 |
|
|
int bd_invalidated;
|
539 |
|
|
struct gendisk * bd_disk;
|
540 |
|
|
struct list_head bd_list;
|
541 |
|
|
struct backing_dev_info *bd_inode_backing_dev_info;
|
542 |
|
|
/*
|
543 |
|
|
* Private data. You must have bd_claim'ed the block_device
|
544 |
|
|
* to use this. NOTE: bd_claim allows an owner to claim
|
545 |
|
|
* the same device multiple times, the owner must take special
|
546 |
|
|
* care to not mess up bd_private for that case.
|
547 |
|
|
*/
|
548 |
|
|
unsigned long bd_private;
|
549 |
|
|
};
|
550 |
|
|
|
551 |
|
|
/*
|
552 |
|
|
* Radix-tree tags, for tagging dirty and writeback pages within the pagecache
|
553 |
|
|
* radix trees
|
554 |
|
|
*/
|
555 |
|
|
#define PAGECACHE_TAG_DIRTY 0
|
556 |
|
|
#define PAGECACHE_TAG_WRITEBACK 1
|
557 |
|
|
|
558 |
|
|
int mapping_tagged(struct address_space *mapping, int tag);
|
559 |
|
|
|
560 |
|
|
/*
|
561 |
|
|
* Might pages of this file be mapped into userspace?
|
562 |
|
|
*/
|
563 |
|
|
static inline int mapping_mapped(struct address_space *mapping)
|
564 |
|
|
{
|
565 |
|
|
return !prio_tree_empty(&mapping->i_mmap) ||
|
566 |
|
|
!list_empty(&mapping->i_mmap_nonlinear);
|
567 |
|
|
}
|
568 |
|
|
|
569 |
|
|
/*
|
570 |
|
|
* Might pages of this file have been modified in userspace?
|
571 |
|
|
* Note that i_mmap_writable counts all VM_SHARED vmas: do_mmap_pgoff
|
572 |
|
|
* marks vma as VM_SHARED if it is shared, and the file was opened for
|
573 |
|
|
* writing i.e. vma may be mprotected writable even if now readonly.
|
574 |
|
|
*/
|
575 |
|
|
static inline int mapping_writably_mapped(struct address_space *mapping)
|
576 |
|
|
{
|
577 |
|
|
return mapping->i_mmap_writable != 0;
|
578 |
|
|
}
|
579 |
|
|
|
580 |
|
|
/*
|
581 |
|
|
* Use sequence counter to get consistent i_size on 32-bit processors.
|
582 |
|
|
*/
|
583 |
|
|
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
|
584 |
|
|
#include <linux/seqlock.h>
|
585 |
|
|
#define __NEED_I_SIZE_ORDERED
|
586 |
|
|
#define i_size_ordered_init(inode) seqcount_init(&inode->i_size_seqcount)
|
587 |
|
|
#else
|
588 |
|
|
#define i_size_ordered_init(inode) do { } while (0)
|
589 |
|
|
#endif
|
590 |
|
|
|
591 |
|
|
struct inode {
|
592 |
|
|
struct hlist_node i_hash;
|
593 |
|
|
struct list_head i_list;
|
594 |
|
|
struct list_head i_sb_list;
|
595 |
|
|
struct list_head i_dentry;
|
596 |
|
|
unsigned long i_ino;
|
597 |
|
|
atomic_t i_count;
|
598 |
|
|
unsigned int i_nlink;
|
599 |
|
|
uid_t i_uid;
|
600 |
|
|
gid_t i_gid;
|
601 |
|
|
dev_t i_rdev;
|
602 |
|
|
unsigned long i_version;
|
603 |
|
|
loff_t i_size;
|
604 |
|
|
#ifdef __NEED_I_SIZE_ORDERED
|
605 |
|
|
seqcount_t i_size_seqcount;
|
606 |
|
|
#endif
|
607 |
|
|
struct timespec i_atime;
|
608 |
|
|
struct timespec i_mtime;
|
609 |
|
|
struct timespec i_ctime;
|
610 |
|
|
unsigned int i_blkbits;
|
611 |
|
|
blkcnt_t i_blocks;
|
612 |
|
|
unsigned short i_bytes;
|
613 |
|
|
umode_t i_mode;
|
614 |
|
|
spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
|
615 |
|
|
struct mutex i_mutex;
|
616 |
|
|
struct rw_semaphore i_alloc_sem;
|
617 |
|
|
const struct inode_operations *i_op;
|
618 |
|
|
const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
|
619 |
|
|
struct super_block *i_sb;
|
620 |
|
|
struct file_lock *i_flock;
|
621 |
|
|
struct address_space *i_mapping;
|
622 |
|
|
struct address_space i_data;
|
623 |
|
|
#ifdef CONFIG_QUOTA
|
624 |
|
|
struct dquot *i_dquot[MAXQUOTAS];
|
625 |
|
|
#endif
|
626 |
|
|
struct list_head i_devices;
|
627 |
|
|
union {
|
628 |
|
|
struct pipe_inode_info *i_pipe;
|
629 |
|
|
struct block_device *i_bdev;
|
630 |
|
|
struct cdev *i_cdev;
|
631 |
|
|
};
|
632 |
|
|
int i_cindex;
|
633 |
|
|
|
634 |
|
|
__u32 i_generation;
|
635 |
|
|
|
636 |
|
|
#ifdef CONFIG_DNOTIFY
|
637 |
|
|
unsigned long i_dnotify_mask; /* Directory notify events */
|
638 |
|
|
struct dnotify_struct *i_dnotify; /* for directory notifications */
|
639 |
|
|
#endif
|
640 |
|
|
|
641 |
|
|
#ifdef CONFIG_INOTIFY
|
642 |
|
|
struct list_head inotify_watches; /* watches on this inode */
|
643 |
|
|
struct mutex inotify_mutex; /* protects the watches list */
|
644 |
|
|
#endif
|
645 |
|
|
|
646 |
|
|
unsigned long i_state;
|
647 |
|
|
unsigned long dirtied_when; /* jiffies of first dirtying */
|
648 |
|
|
|
649 |
|
|
unsigned int i_flags;
|
650 |
|
|
|
651 |
|
|
atomic_t i_writecount;
|
652 |
|
|
#ifdef CONFIG_SECURITY
|
653 |
|
|
void *i_security;
|
654 |
|
|
#endif
|
655 |
|
|
void *i_private; /* fs or device private pointer */
|
656 |
|
|
};
|
657 |
|
|
|
658 |
|
|
/*
|
659 |
|
|
* inode->i_mutex nesting subclasses for the lock validator:
|
660 |
|
|
*
|
661 |
|
|
* 0: the object of the current VFS operation
|
662 |
|
|
* 1: parent
|
663 |
|
|
* 2: child/target
|
664 |
|
|
* 3: quota file
|
665 |
|
|
*
|
666 |
|
|
* The locking order between these classes is
|
667 |
|
|
* parent -> child -> normal -> xattr -> quota
|
668 |
|
|
*/
|
669 |
|
|
enum inode_i_mutex_lock_class
|
670 |
|
|
{
|
671 |
|
|
I_MUTEX_NORMAL,
|
672 |
|
|
I_MUTEX_PARENT,
|
673 |
|
|
I_MUTEX_CHILD,
|
674 |
|
|
I_MUTEX_XATTR,
|
675 |
|
|
I_MUTEX_QUOTA
|
676 |
|
|
};
|
677 |
|
|
|
678 |
|
|
extern void inode_double_lock(struct inode *inode1, struct inode *inode2);
|
679 |
|
|
extern void inode_double_unlock(struct inode *inode1, struct inode *inode2);
|
680 |
|
|
|
681 |
|
|
/*
|
682 |
|
|
* NOTE: in a 32bit arch with a preemptable kernel and
|
683 |
|
|
* an UP compile the i_size_read/write must be atomic
|
684 |
|
|
* with respect to the local cpu (unlike with preempt disabled),
|
685 |
|
|
* but they don't need to be atomic with respect to other cpus like in
|
686 |
|
|
* true SMP (so they need either to either locally disable irq around
|
687 |
|
|
* the read or for example on x86 they can be still implemented as a
|
688 |
|
|
* cmpxchg8b without the need of the lock prefix). For SMP compiles
|
689 |
|
|
* and 64bit archs it makes no difference if preempt is enabled or not.
|
690 |
|
|
*/
|
691 |
|
|
static inline loff_t i_size_read(const struct inode *inode)
|
692 |
|
|
{
|
693 |
|
|
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
|
694 |
|
|
loff_t i_size;
|
695 |
|
|
unsigned int seq;
|
696 |
|
|
|
697 |
|
|
do {
|
698 |
|
|
seq = read_seqcount_begin(&inode->i_size_seqcount);
|
699 |
|
|
i_size = inode->i_size;
|
700 |
|
|
} while (read_seqcount_retry(&inode->i_size_seqcount, seq));
|
701 |
|
|
return i_size;
|
702 |
|
|
#elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPT)
|
703 |
|
|
loff_t i_size;
|
704 |
|
|
|
705 |
|
|
preempt_disable();
|
706 |
|
|
i_size = inode->i_size;
|
707 |
|
|
preempt_enable();
|
708 |
|
|
return i_size;
|
709 |
|
|
#else
|
710 |
|
|
return inode->i_size;
|
711 |
|
|
#endif
|
712 |
|
|
}
|
713 |
|
|
|
714 |
|
|
/*
|
715 |
|
|
* NOTE: unlike i_size_read(), i_size_write() does need locking around it
|
716 |
|
|
* (normally i_mutex), otherwise on 32bit/SMP an update of i_size_seqcount
|
717 |
|
|
* can be lost, resulting in subsequent i_size_read() calls spinning forever.
|
718 |
|
|
*/
|
719 |
|
|
static inline void i_size_write(struct inode *inode, loff_t i_size)
|
720 |
|
|
{
|
721 |
|
|
#if BITS_PER_LONG==32 && defined(CONFIG_SMP)
|
722 |
|
|
write_seqcount_begin(&inode->i_size_seqcount);
|
723 |
|
|
inode->i_size = i_size;
|
724 |
|
|
write_seqcount_end(&inode->i_size_seqcount);
|
725 |
|
|
#elif BITS_PER_LONG==32 && defined(CONFIG_PREEMPT)
|
726 |
|
|
preempt_disable();
|
727 |
|
|
inode->i_size = i_size;
|
728 |
|
|
preempt_enable();
|
729 |
|
|
#else
|
730 |
|
|
inode->i_size = i_size;
|
731 |
|
|
#endif
|
732 |
|
|
}
|
733 |
|
|
|
734 |
|
|
static inline unsigned iminor(const struct inode *inode)
|
735 |
|
|
{
|
736 |
|
|
return MINOR(inode->i_rdev);
|
737 |
|
|
}
|
738 |
|
|
|
739 |
|
|
static inline unsigned imajor(const struct inode *inode)
|
740 |
|
|
{
|
741 |
|
|
return MAJOR(inode->i_rdev);
|
742 |
|
|
}
|
743 |
|
|
|
744 |
|
|
extern struct block_device *I_BDEV(struct inode *inode);
|
745 |
|
|
|
746 |
|
|
struct fown_struct {
|
747 |
|
|
rwlock_t lock; /* protects pid, uid, euid fields */
|
748 |
|
|
struct pid *pid; /* pid or -pgrp where SIGIO should be sent */
|
749 |
|
|
enum pid_type pid_type; /* Kind of process group SIGIO should be sent to */
|
750 |
|
|
uid_t uid, euid; /* uid/euid of process setting the owner */
|
751 |
|
|
int signum; /* posix.1b rt signal to be delivered on IO */
|
752 |
|
|
};
|
753 |
|
|
|
754 |
|
|
/*
|
755 |
|
|
* Track a single file's readahead state
|
756 |
|
|
*/
|
757 |
|
|
struct file_ra_state {
|
758 |
|
|
pgoff_t start; /* where readahead started */
|
759 |
|
|
unsigned int size; /* # of readahead pages */
|
760 |
|
|
unsigned int async_size; /* do asynchronous readahead when
|
761 |
|
|
there are only # of pages ahead */
|
762 |
|
|
|
763 |
|
|
unsigned int ra_pages; /* Maximum readahead window */
|
764 |
|
|
int mmap_miss; /* Cache miss stat for mmap accesses */
|
765 |
|
|
loff_t prev_pos; /* Cache last read() position */
|
766 |
|
|
};
|
767 |
|
|
|
768 |
|
|
/*
|
769 |
|
|
* Check if @index falls in the readahead windows.
|
770 |
|
|
*/
|
771 |
|
|
static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index)
|
772 |
|
|
{
|
773 |
|
|
return (index >= ra->start &&
|
774 |
|
|
index < ra->start + ra->size);
|
775 |
|
|
}
|
776 |
|
|
|
777 |
|
|
struct file {
|
778 |
|
|
/*
|
779 |
|
|
* fu_list becomes invalid after file_free is called and queued via
|
780 |
|
|
* fu_rcuhead for RCU freeing
|
781 |
|
|
*/
|
782 |
|
|
union {
|
783 |
|
|
struct list_head fu_list;
|
784 |
|
|
struct rcu_head fu_rcuhead;
|
785 |
|
|
} f_u;
|
786 |
|
|
struct path f_path;
|
787 |
|
|
#define f_dentry f_path.dentry
|
788 |
|
|
#define f_vfsmnt f_path.mnt
|
789 |
|
|
const struct file_operations *f_op;
|
790 |
|
|
atomic_t f_count;
|
791 |
|
|
unsigned int f_flags;
|
792 |
|
|
mode_t f_mode;
|
793 |
|
|
loff_t f_pos;
|
794 |
|
|
struct fown_struct f_owner;
|
795 |
|
|
unsigned int f_uid, f_gid;
|
796 |
|
|
struct file_ra_state f_ra;
|
797 |
|
|
|
798 |
|
|
u64 f_version;
|
799 |
|
|
#ifdef CONFIG_SECURITY
|
800 |
|
|
void *f_security;
|
801 |
|
|
#endif
|
802 |
|
|
/* needed for tty driver, and maybe others */
|
803 |
|
|
void *private_data;
|
804 |
|
|
|
805 |
|
|
#ifdef CONFIG_EPOLL
|
806 |
|
|
/* Used by fs/eventpoll.c to link all the hooks to this file */
|
807 |
|
|
struct list_head f_ep_links;
|
808 |
|
|
spinlock_t f_ep_lock;
|
809 |
|
|
#endif /* #ifdef CONFIG_EPOLL */
|
810 |
|
|
struct address_space *f_mapping;
|
811 |
|
|
};
|
812 |
|
|
extern spinlock_t files_lock;
|
813 |
|
|
#define file_list_lock() spin_lock(&files_lock);
|
814 |
|
|
#define file_list_unlock() spin_unlock(&files_lock);
|
815 |
|
|
|
816 |
|
|
#define get_file(x) atomic_inc(&(x)->f_count)
|
817 |
|
|
#define file_count(x) atomic_read(&(x)->f_count)
|
818 |
|
|
|
819 |
|
|
#define MAX_NON_LFS ((1UL<<31) - 1)
|
820 |
|
|
|
821 |
|
|
/* Page cache limit. The filesystems should put that into their s_maxbytes
|
822 |
|
|
limits, otherwise bad things can happen in VM. */
|
823 |
|
|
#if BITS_PER_LONG==32
|
824 |
|
|
#define MAX_LFS_FILESIZE (((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1)
|
825 |
|
|
#elif BITS_PER_LONG==64
|
826 |
|
|
#define MAX_LFS_FILESIZE 0x7fffffffffffffffUL
|
827 |
|
|
#endif
|
828 |
|
|
|
829 |
|
|
#define FL_POSIX 1
|
830 |
|
|
#define FL_FLOCK 2
|
831 |
|
|
#define FL_ACCESS 8 /* not trying to lock, just looking */
|
832 |
|
|
#define FL_EXISTS 16 /* when unlocking, test for existence */
|
833 |
|
|
#define FL_LEASE 32 /* lease held on this file */
|
834 |
|
|
#define FL_CLOSE 64 /* unlock on close */
|
835 |
|
|
#define FL_SLEEP 128 /* A blocking lock */
|
836 |
|
|
|
837 |
|
|
/*
|
838 |
|
|
* The POSIX file lock owner is determined by
|
839 |
|
|
* the "struct files_struct" in the thread group
|
840 |
|
|
* (or NULL for no owner - BSD locks).
|
841 |
|
|
*
|
842 |
|
|
* Lockd stuffs a "host" pointer into this.
|
843 |
|
|
*/
|
844 |
|
|
typedef struct files_struct *fl_owner_t;
|
845 |
|
|
|
846 |
|
|
struct file_lock_operations {
|
847 |
|
|
void (*fl_insert)(struct file_lock *); /* lock insertion callback */
|
848 |
|
|
void (*fl_remove)(struct file_lock *); /* lock removal callback */
|
849 |
|
|
void (*fl_copy_lock)(struct file_lock *, struct file_lock *);
|
850 |
|
|
void (*fl_release_private)(struct file_lock *);
|
851 |
|
|
};
|
852 |
|
|
|
853 |
|
|
struct lock_manager_operations {
|
854 |
|
|
int (*fl_compare_owner)(struct file_lock *, struct file_lock *);
|
855 |
|
|
void (*fl_notify)(struct file_lock *); /* unblock callback */
|
856 |
|
|
int (*fl_grant)(struct file_lock *, struct file_lock *, int);
|
857 |
|
|
void (*fl_copy_lock)(struct file_lock *, struct file_lock *);
|
858 |
|
|
void (*fl_release_private)(struct file_lock *);
|
859 |
|
|
void (*fl_break)(struct file_lock *);
|
860 |
|
|
int (*fl_mylease)(struct file_lock *, struct file_lock *);
|
861 |
|
|
int (*fl_change)(struct file_lock **, int);
|
862 |
|
|
};
|
863 |
|
|
|
864 |
|
|
/* that will die - we need it for nfs_lock_info */
|
865 |
|
|
#include <linux/nfs_fs_i.h>
|
866 |
|
|
|
867 |
|
|
struct file_lock {
|
868 |
|
|
struct file_lock *fl_next; /* singly linked list for this inode */
|
869 |
|
|
struct list_head fl_link; /* doubly linked list of all locks */
|
870 |
|
|
struct list_head fl_block; /* circular list of blocked processes */
|
871 |
|
|
fl_owner_t fl_owner;
|
872 |
|
|
unsigned int fl_pid;
|
873 |
|
|
wait_queue_head_t fl_wait;
|
874 |
|
|
struct file *fl_file;
|
875 |
|
|
unsigned char fl_flags;
|
876 |
|
|
unsigned char fl_type;
|
877 |
|
|
loff_t fl_start;
|
878 |
|
|
loff_t fl_end;
|
879 |
|
|
|
880 |
|
|
struct fasync_struct * fl_fasync; /* for lease break notifications */
|
881 |
|
|
unsigned long fl_break_time; /* for nonblocking lease breaks */
|
882 |
|
|
|
883 |
|
|
struct file_lock_operations *fl_ops; /* Callbacks for filesystems */
|
884 |
|
|
struct lock_manager_operations *fl_lmops; /* Callbacks for lockmanagers */
|
885 |
|
|
union {
|
886 |
|
|
struct nfs_lock_info nfs_fl;
|
887 |
|
|
struct nfs4_lock_info nfs4_fl;
|
888 |
|
|
struct {
|
889 |
|
|
struct list_head link; /* link in AFS vnode's pending_locks list */
|
890 |
|
|
int state; /* state of grant or error if -ve */
|
891 |
|
|
} afs;
|
892 |
|
|
} fl_u;
|
893 |
|
|
};
|
894 |
|
|
|
895 |
|
|
/* The following constant reflects the upper bound of the file/locking space */
|
896 |
|
|
#ifndef OFFSET_MAX
|
897 |
|
|
#define INT_LIMIT(x) (~((x)1 << (sizeof(x)*8 - 1)))
|
898 |
|
|
#define OFFSET_MAX INT_LIMIT(loff_t)
|
899 |
|
|
#define OFFT_OFFSET_MAX INT_LIMIT(off_t)
|
900 |
|
|
#endif
|
901 |
|
|
|
902 |
|
|
#include <linux/fcntl.h>
|
903 |
|
|
|
904 |
|
|
extern int fcntl_getlk(struct file *, struct flock __user *);
|
905 |
|
|
extern int fcntl_setlk(unsigned int, struct file *, unsigned int,
|
906 |
|
|
struct flock __user *);
|
907 |
|
|
|
908 |
|
|
#if BITS_PER_LONG == 32
|
909 |
|
|
extern int fcntl_getlk64(struct file *, struct flock64 __user *);
|
910 |
|
|
extern int fcntl_setlk64(unsigned int, struct file *, unsigned int,
|
911 |
|
|
struct flock64 __user *);
|
912 |
|
|
#endif
|
913 |
|
|
|
914 |
|
|
extern void send_sigio(struct fown_struct *fown, int fd, int band);
|
915 |
|
|
extern int fcntl_setlease(unsigned int fd, struct file *filp, long arg);
|
916 |
|
|
extern int fcntl_getlease(struct file *filp);
|
917 |
|
|
|
918 |
|
|
/* fs/sync.c */
|
919 |
|
|
extern int do_sync_mapping_range(struct address_space *mapping, loff_t offset,
|
920 |
|
|
loff_t endbyte, unsigned int flags);
|
921 |
|
|
|
922 |
|
|
/* fs/locks.c */
|
923 |
|
|
extern void locks_init_lock(struct file_lock *);
|
924 |
|
|
extern void locks_copy_lock(struct file_lock *, struct file_lock *);
|
925 |
|
|
extern void locks_remove_posix(struct file *, fl_owner_t);
|
926 |
|
|
extern void locks_remove_flock(struct file *);
|
927 |
|
|
extern void posix_test_lock(struct file *, struct file_lock *);
|
928 |
|
|
extern int posix_lock_file(struct file *, struct file_lock *, struct file_lock *);
|
929 |
|
|
extern int posix_lock_file_wait(struct file *, struct file_lock *);
|
930 |
|
|
extern int posix_unblock_lock(struct file *, struct file_lock *);
|
931 |
|
|
extern int vfs_test_lock(struct file *, struct file_lock *);
|
932 |
|
|
extern int vfs_lock_file(struct file *, unsigned int, struct file_lock *, struct file_lock *);
|
933 |
|
|
extern int vfs_cancel_lock(struct file *filp, struct file_lock *fl);
|
934 |
|
|
extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl);
|
935 |
|
|
extern int __break_lease(struct inode *inode, unsigned int flags);
|
936 |
|
|
extern void lease_get_mtime(struct inode *, struct timespec *time);
|
937 |
|
|
extern int generic_setlease(struct file *, long, struct file_lock **);
|
938 |
|
|
extern int vfs_setlease(struct file *, long, struct file_lock **);
|
939 |
|
|
extern int lease_modify(struct file_lock **, int);
|
940 |
|
|
extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
|
941 |
|
|
extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
|
942 |
|
|
extern struct seq_operations locks_seq_operations;
|
943 |
|
|
|
944 |
|
|
struct fasync_struct {
|
945 |
|
|
int magic;
|
946 |
|
|
int fa_fd;
|
947 |
|
|
struct fasync_struct *fa_next; /* singly linked list */
|
948 |
|
|
struct file *fa_file;
|
949 |
|
|
};
|
950 |
|
|
|
951 |
|
|
#define FASYNC_MAGIC 0x4601
|
952 |
|
|
|
953 |
|
|
/* SMP safe fasync helpers: */
|
954 |
|
|
extern int fasync_helper(int, struct file *, int, struct fasync_struct **);
|
955 |
|
|
/* can be called from interrupts */
|
956 |
|
|
extern void kill_fasync(struct fasync_struct **, int, int);
|
957 |
|
|
/* only for net: no internal synchronization */
|
958 |
|
|
extern void __kill_fasync(struct fasync_struct *, int, int);
|
959 |
|
|
|
960 |
|
|
extern int __f_setown(struct file *filp, struct pid *, enum pid_type, int force);
|
961 |
|
|
extern int f_setown(struct file *filp, unsigned long arg, int force);
|
962 |
|
|
extern void f_delown(struct file *filp);
|
963 |
|
|
extern pid_t f_getown(struct file *filp);
|
964 |
|
|
extern int send_sigurg(struct fown_struct *fown);
|
965 |
|
|
|
966 |
|
|
/*
|
967 |
|
|
* Umount options
|
968 |
|
|
*/
|
969 |
|
|
|
970 |
|
|
#define MNT_FORCE 0x00000001 /* Attempt to forcibily umount */
|
971 |
|
|
#define MNT_DETACH 0x00000002 /* Just detach from the tree */
|
972 |
|
|
#define MNT_EXPIRE 0x00000004 /* Mark for expiry */
|
973 |
|
|
|
974 |
|
|
extern struct list_head super_blocks;
|
975 |
|
|
extern spinlock_t sb_lock;
|
976 |
|
|
|
977 |
|
|
#define sb_entry(list) list_entry((list), struct super_block, s_list)
|
978 |
|
|
#define S_BIAS (1<<30)
|
979 |
|
|
struct super_block {
|
980 |
|
|
struct list_head s_list; /* Keep this first */
|
981 |
|
|
dev_t s_dev; /* search index; _not_ kdev_t */
|
982 |
|
|
unsigned long s_blocksize;
|
983 |
|
|
unsigned char s_blocksize_bits;
|
984 |
|
|
unsigned char s_dirt;
|
985 |
|
|
unsigned long long s_maxbytes; /* Max file size */
|
986 |
|
|
struct file_system_type *s_type;
|
987 |
|
|
const struct super_operations *s_op;
|
988 |
|
|
struct dquot_operations *dq_op;
|
989 |
|
|
struct quotactl_ops *s_qcop;
|
990 |
|
|
const struct export_operations *s_export_op;
|
991 |
|
|
unsigned long s_flags;
|
992 |
|
|
unsigned long s_magic;
|
993 |
|
|
struct dentry *s_root;
|
994 |
|
|
struct rw_semaphore s_umount;
|
995 |
|
|
struct mutex s_lock;
|
996 |
|
|
int s_count;
|
997 |
|
|
int s_syncing;
|
998 |
|
|
int s_need_sync_fs;
|
999 |
|
|
atomic_t s_active;
|
1000 |
|
|
#ifdef CONFIG_SECURITY
|
1001 |
|
|
void *s_security;
|
1002 |
|
|
#endif
|
1003 |
|
|
struct xattr_handler **s_xattr;
|
1004 |
|
|
|
1005 |
|
|
struct list_head s_inodes; /* all inodes */
|
1006 |
|
|
struct list_head s_dirty; /* dirty inodes */
|
1007 |
|
|
struct list_head s_io; /* parked for writeback */
|
1008 |
|
|
struct list_head s_more_io; /* parked for more writeback */
|
1009 |
|
|
struct hlist_head s_anon; /* anonymous dentries for (nfs) exporting */
|
1010 |
|
|
struct list_head s_files;
|
1011 |
|
|
|
1012 |
|
|
struct block_device *s_bdev;
|
1013 |
|
|
struct mtd_info *s_mtd;
|
1014 |
|
|
struct list_head s_instances;
|
1015 |
|
|
struct quota_info s_dquot; /* Diskquota specific options */
|
1016 |
|
|
|
1017 |
|
|
int s_frozen;
|
1018 |
|
|
wait_queue_head_t s_wait_unfrozen;
|
1019 |
|
|
|
1020 |
|
|
char s_id[32]; /* Informational name */
|
1021 |
|
|
|
1022 |
|
|
void *s_fs_info; /* Filesystem private info */
|
1023 |
|
|
|
1024 |
|
|
/*
|
1025 |
|
|
* The next field is for VFS *only*. No filesystems have any business
|
1026 |
|
|
* even looking at it. You had been warned.
|
1027 |
|
|
*/
|
1028 |
|
|
struct mutex s_vfs_rename_mutex; /* Kludge */
|
1029 |
|
|
|
1030 |
|
|
/* Granularity of c/m/atime in ns.
|
1031 |
|
|
Cannot be worse than a second */
|
1032 |
|
|
u32 s_time_gran;
|
1033 |
|
|
|
1034 |
|
|
/*
|
1035 |
|
|
* Filesystem subtype. If non-empty the filesystem type field
|
1036 |
|
|
* in /proc/mounts will be "type.subtype"
|
1037 |
|
|
*/
|
1038 |
|
|
char *s_subtype;
|
1039 |
|
|
};
|
1040 |
|
|
|
1041 |
|
|
extern struct timespec current_fs_time(struct super_block *sb);
|
1042 |
|
|
|
1043 |
|
|
/*
|
1044 |
|
|
* Snapshotting support.
|
1045 |
|
|
*/
|
1046 |
|
|
enum {
|
1047 |
|
|
SB_UNFROZEN = 0,
|
1048 |
|
|
SB_FREEZE_WRITE = 1,
|
1049 |
|
|
SB_FREEZE_TRANS = 2,
|
1050 |
|
|
};
|
1051 |
|
|
|
1052 |
|
|
#define vfs_check_frozen(sb, level) \
|
1053 |
|
|
wait_event((sb)->s_wait_unfrozen, ((sb)->s_frozen < (level)))
|
1054 |
|
|
|
1055 |
|
|
#define get_fs_excl() atomic_inc(¤t->fs_excl)
|
1056 |
|
|
#define put_fs_excl() atomic_dec(¤t->fs_excl)
|
1057 |
|
|
#define has_fs_excl() atomic_read(¤t->fs_excl)
|
1058 |
|
|
|
1059 |
|
|
#define is_owner_or_cap(inode) \
|
1060 |
|
|
((current->fsuid == (inode)->i_uid) || capable(CAP_FOWNER))
|
1061 |
|
|
|
1062 |
|
|
/* not quite ready to be deprecated, but... */
|
1063 |
|
|
extern void lock_super(struct super_block *);
|
1064 |
|
|
extern void unlock_super(struct super_block *);
|
1065 |
|
|
|
1066 |
|
|
/*
|
1067 |
|
|
* VFS helper functions..
|
1068 |
|
|
*/
|
1069 |
|
|
extern int vfs_permission(struct nameidata *, int);
|
1070 |
|
|
extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *);
|
1071 |
|
|
extern int vfs_mkdir(struct inode *, struct dentry *, int);
|
1072 |
|
|
extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t);
|
1073 |
|
|
extern int vfs_symlink(struct inode *, struct dentry *, const char *, int);
|
1074 |
|
|
extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
|
1075 |
|
|
extern int vfs_rmdir(struct inode *, struct dentry *);
|
1076 |
|
|
extern int vfs_unlink(struct inode *, struct dentry *);
|
1077 |
|
|
extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
|
1078 |
|
|
|
1079 |
|
|
/*
|
1080 |
|
|
* VFS dentry helper functions.
|
1081 |
|
|
*/
|
1082 |
|
|
extern void dentry_unhash(struct dentry *dentry);
|
1083 |
|
|
|
1084 |
|
|
/*
|
1085 |
|
|
* VFS file helper functions.
|
1086 |
|
|
*/
|
1087 |
|
|
extern int file_permission(struct file *, int);
|
1088 |
|
|
|
1089 |
|
|
/*
|
1090 |
|
|
* File types
|
1091 |
|
|
*
|
1092 |
|
|
* NOTE! These match bits 12..15 of stat.st_mode
|
1093 |
|
|
* (ie "(i_mode >> 12) & 15").
|
1094 |
|
|
*/
|
1095 |
|
|
#define DT_UNKNOWN 0
|
1096 |
|
|
#define DT_FIFO 1
|
1097 |
|
|
#define DT_CHR 2
|
1098 |
|
|
#define DT_DIR 4
|
1099 |
|
|
#define DT_BLK 6
|
1100 |
|
|
#define DT_REG 8
|
1101 |
|
|
#define DT_LNK 10
|
1102 |
|
|
#define DT_SOCK 12
|
1103 |
|
|
#define DT_WHT 14
|
1104 |
|
|
|
1105 |
|
|
#define OSYNC_METADATA (1<<0)
|
1106 |
|
|
#define OSYNC_DATA (1<<1)
|
1107 |
|
|
#define OSYNC_INODE (1<<2)
|
1108 |
|
|
int generic_osync_inode(struct inode *, struct address_space *, int);
|
1109 |
|
|
|
1110 |
|
|
/*
|
1111 |
|
|
* This is the "filldir" function type, used by readdir() to let
|
1112 |
|
|
* the kernel specify what kind of dirent layout it wants to have.
|
1113 |
|
|
* This allows the kernel to read directories into kernel space or
|
1114 |
|
|
* to have different dirent layouts depending on the binary type.
|
1115 |
|
|
*/
|
1116 |
|
|
typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
|
1117 |
|
|
|
1118 |
|
|
struct block_device_operations {
|
1119 |
|
|
int (*open) (struct inode *, struct file *);
|
1120 |
|
|
int (*release) (struct inode *, struct file *);
|
1121 |
|
|
int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);
|
1122 |
|
|
long (*unlocked_ioctl) (struct file *, unsigned, unsigned long);
|
1123 |
|
|
long (*compat_ioctl) (struct file *, unsigned, unsigned long);
|
1124 |
|
|
int (*direct_access) (struct block_device *, sector_t, unsigned long *);
|
1125 |
|
|
int (*media_changed) (struct gendisk *);
|
1126 |
|
|
int (*revalidate_disk) (struct gendisk *);
|
1127 |
|
|
int (*getgeo)(struct block_device *, struct hd_geometry *);
|
1128 |
|
|
struct module *owner;
|
1129 |
|
|
};
|
1130 |
|
|
|
1131 |
|
|
/*
|
1132 |
|
|
* "descriptor" for what we're up to with a read.
|
1133 |
|
|
* This allows us to use the same read code yet
|
1134 |
|
|
* have multiple different users of the data that
|
1135 |
|
|
* we read from a file.
|
1136 |
|
|
*
|
1137 |
|
|
* The simplest case just copies the data to user
|
1138 |
|
|
* mode.
|
1139 |
|
|
*/
|
1140 |
|
|
typedef struct {
|
1141 |
|
|
size_t written;
|
1142 |
|
|
size_t count;
|
1143 |
|
|
union {
|
1144 |
|
|
char __user * buf;
|
1145 |
|
|
void *data;
|
1146 |
|
|
} arg;
|
1147 |
|
|
int error;
|
1148 |
|
|
} read_descriptor_t;
|
1149 |
|
|
|
1150 |
|
|
typedef int (*read_actor_t)(read_descriptor_t *, struct page *, unsigned long, unsigned long);
|
1151 |
|
|
|
1152 |
|
|
/* These macros are for out of kernel modules to test that
|
1153 |
|
|
* the kernel supports the unlocked_ioctl and compat_ioctl
|
1154 |
|
|
* fields in struct file_operations. */
|
1155 |
|
|
#define HAVE_COMPAT_IOCTL 1
|
1156 |
|
|
#define HAVE_UNLOCKED_IOCTL 1
|
1157 |
|
|
|
1158 |
|
|
/*
|
1159 |
|
|
* NOTE:
|
1160 |
|
|
* read, write, poll, fsync, readv, writev, unlocked_ioctl and compat_ioctl
|
1161 |
|
|
* can be called without the big kernel lock held in all filesystems.
|
1162 |
|
|
*/
|
1163 |
|
|
struct file_operations {
|
1164 |
|
|
struct module *owner;
|
1165 |
|
|
loff_t (*llseek) (struct file *, loff_t, int);
|
1166 |
|
|
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
|
1167 |
|
|
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
|
1168 |
|
|
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
|
1169 |
|
|
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
|
1170 |
|
|
int (*readdir) (struct file *, void *, filldir_t);
|
1171 |
|
|
unsigned int (*poll) (struct file *, struct poll_table_struct *);
|
1172 |
|
|
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
|
1173 |
|
|
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
|
1174 |
|
|
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
|
1175 |
|
|
int (*mmap) (struct file *, struct vm_area_struct *);
|
1176 |
|
|
int (*open) (struct inode *, struct file *);
|
1177 |
|
|
int (*flush) (struct file *, fl_owner_t id);
|
1178 |
|
|
int (*release) (struct inode *, struct file *);
|
1179 |
|
|
int (*fsync) (struct file *, struct dentry *, int datasync);
|
1180 |
|
|
int (*aio_fsync) (struct kiocb *, int datasync);
|
1181 |
|
|
int (*fasync) (int, struct file *, int);
|
1182 |
|
|
int (*lock) (struct file *, int, struct file_lock *);
|
1183 |
|
|
ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
|
1184 |
|
|
unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
|
1185 |
|
|
int (*check_flags)(int);
|
1186 |
|
|
int (*dir_notify)(struct file *filp, unsigned long arg);
|
1187 |
|
|
int (*flock) (struct file *, int, struct file_lock *);
|
1188 |
|
|
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
|
1189 |
|
|
ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
|
1190 |
|
|
int (*setlease)(struct file *, long, struct file_lock **);
|
1191 |
|
|
};
|
1192 |
|
|
|
1193 |
|
|
struct inode_operations {
|
1194 |
|
|
int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
|
1195 |
|
|
struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
|
1196 |
|
|
int (*link) (struct dentry *,struct inode *,struct dentry *);
|
1197 |
|
|
int (*unlink) (struct inode *,struct dentry *);
|
1198 |
|
|
int (*symlink) (struct inode *,struct dentry *,const char *);
|
1199 |
|
|
int (*mkdir) (struct inode *,struct dentry *,int);
|
1200 |
|
|
int (*rmdir) (struct inode *,struct dentry *);
|
1201 |
|
|
int (*mknod) (struct inode *,struct dentry *,int,dev_t);
|
1202 |
|
|
int (*rename) (struct inode *, struct dentry *,
|
1203 |
|
|
struct inode *, struct dentry *);
|
1204 |
|
|
int (*readlink) (struct dentry *, char __user *,int);
|
1205 |
|
|
void * (*follow_link) (struct dentry *, struct nameidata *);
|
1206 |
|
|
void (*put_link) (struct dentry *, struct nameidata *, void *);
|
1207 |
|
|
void (*truncate) (struct inode *);
|
1208 |
|
|
int (*permission) (struct inode *, int, struct nameidata *);
|
1209 |
|
|
int (*setattr) (struct dentry *, struct iattr *);
|
1210 |
|
|
int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
|
1211 |
|
|
int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
|
1212 |
|
|
ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
|
1213 |
|
|
ssize_t (*listxattr) (struct dentry *, char *, size_t);
|
1214 |
|
|
int (*removexattr) (struct dentry *, const char *);
|
1215 |
|
|
void (*truncate_range)(struct inode *, loff_t, loff_t);
|
1216 |
|
|
long (*fallocate)(struct inode *inode, int mode, loff_t offset,
|
1217 |
|
|
loff_t len);
|
1218 |
|
|
};
|
1219 |
|
|
|
1220 |
|
|
struct seq_file;
|
1221 |
|
|
|
1222 |
|
|
ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
|
1223 |
|
|
unsigned long nr_segs, unsigned long fast_segs,
|
1224 |
|
|
struct iovec *fast_pointer,
|
1225 |
|
|
struct iovec **ret_pointer);
|
1226 |
|
|
|
1227 |
|
|
extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
|
1228 |
|
|
extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
|
1229 |
|
|
extern ssize_t vfs_readv(struct file *, const struct iovec __user *,
|
1230 |
|
|
unsigned long, loff_t *);
|
1231 |
|
|
extern ssize_t vfs_writev(struct file *, const struct iovec __user *,
|
1232 |
|
|
unsigned long, loff_t *);
|
1233 |
|
|
|
1234 |
|
|
/*
|
1235 |
|
|
* NOTE: write_inode, delete_inode, clear_inode, put_inode can be called
|
1236 |
|
|
* without the big kernel lock held in all filesystems.
|
1237 |
|
|
*/
|
1238 |
|
|
struct super_operations {
|
1239 |
|
|
struct inode *(*alloc_inode)(struct super_block *sb);
|
1240 |
|
|
void (*destroy_inode)(struct inode *);
|
1241 |
|
|
|
1242 |
|
|
void (*read_inode) (struct inode *);
|
1243 |
|
|
|
1244 |
|
|
void (*dirty_inode) (struct inode *);
|
1245 |
|
|
int (*write_inode) (struct inode *, int);
|
1246 |
|
|
void (*put_inode) (struct inode *);
|
1247 |
|
|
void (*drop_inode) (struct inode *);
|
1248 |
|
|
void (*delete_inode) (struct inode *);
|
1249 |
|
|
void (*put_super) (struct super_block *);
|
1250 |
|
|
void (*write_super) (struct super_block *);
|
1251 |
|
|
int (*sync_fs)(struct super_block *sb, int wait);
|
1252 |
|
|
void (*write_super_lockfs) (struct super_block *);
|
1253 |
|
|
void (*unlockfs) (struct super_block *);
|
1254 |
|
|
int (*statfs) (struct dentry *, struct kstatfs *);
|
1255 |
|
|
int (*remount_fs) (struct super_block *, int *, char *);
|
1256 |
|
|
void (*clear_inode) (struct inode *);
|
1257 |
|
|
void (*umount_begin) (struct vfsmount *, int);
|
1258 |
|
|
|
1259 |
|
|
int (*show_options)(struct seq_file *, struct vfsmount *);
|
1260 |
|
|
int (*show_stats)(struct seq_file *, struct vfsmount *);
|
1261 |
|
|
#ifdef CONFIG_QUOTA
|
1262 |
|
|
ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
|
1263 |
|
|
ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
|
1264 |
|
|
#endif
|
1265 |
|
|
};
|
1266 |
|
|
|
1267 |
|
|
/*
|
1268 |
|
|
* Inode state bits. Protected by inode_lock.
|
1269 |
|
|
*
|
1270 |
|
|
* Three bits determine the dirty state of the inode, I_DIRTY_SYNC,
|
1271 |
|
|
* I_DIRTY_DATASYNC and I_DIRTY_PAGES.
|
1272 |
|
|
*
|
1273 |
|
|
* Four bits define the lifetime of an inode. Initially, inodes are I_NEW,
|
1274 |
|
|
* until that flag is cleared. I_WILL_FREE, I_FREEING and I_CLEAR are set at
|
1275 |
|
|
* various stages of removing an inode.
|
1276 |
|
|
*
|
1277 |
|
|
* Two bits are used for locking and completion notification, I_LOCK and I_SYNC.
|
1278 |
|
|
*
|
1279 |
|
|
* I_DIRTY_SYNC Inode itself is dirty.
|
1280 |
|
|
* I_DIRTY_DATASYNC Data-related inode changes pending
|
1281 |
|
|
* I_DIRTY_PAGES Inode has dirty pages. Inode itself may be clean.
|
1282 |
|
|
* I_NEW get_new_inode() sets i_state to I_LOCK|I_NEW. Both
|
1283 |
|
|
* are cleared by unlock_new_inode(), called from iget().
|
1284 |
|
|
* I_WILL_FREE Must be set when calling write_inode_now() if i_count
|
1285 |
|
|
* is zero. I_FREEING must be set when I_WILL_FREE is
|
1286 |
|
|
* cleared.
|
1287 |
|
|
* I_FREEING Set when inode is about to be freed but still has dirty
|
1288 |
|
|
* pages or buffers attached or the inode itself is still
|
1289 |
|
|
* dirty.
|
1290 |
|
|
* I_CLEAR Set by clear_inode(). In this state the inode is clean
|
1291 |
|
|
* and can be destroyed.
|
1292 |
|
|
*
|
1293 |
|
|
* Inodes that are I_WILL_FREE, I_FREEING or I_CLEAR are
|
1294 |
|
|
* prohibited for many purposes. iget() must wait for
|
1295 |
|
|
* the inode to be completely released, then create it
|
1296 |
|
|
* anew. Other functions will just ignore such inodes,
|
1297 |
|
|
* if appropriate. I_LOCK is used for waiting.
|
1298 |
|
|
*
|
1299 |
|
|
* I_LOCK Serves as both a mutex and completion notification.
|
1300 |
|
|
* New inodes set I_LOCK. If two processes both create
|
1301 |
|
|
* the same inode, one of them will release its inode and
|
1302 |
|
|
* wait for I_LOCK to be released before returning.
|
1303 |
|
|
* Inodes in I_WILL_FREE, I_FREEING or I_CLEAR state can
|
1304 |
|
|
* also cause waiting on I_LOCK, without I_LOCK actually
|
1305 |
|
|
* being set. find_inode() uses this to prevent returning
|
1306 |
|
|
* nearly-dead inodes.
|
1307 |
|
|
* I_SYNC Similar to I_LOCK, but limited in scope to writeback
|
1308 |
|
|
* of inode dirty data. Having a seperate lock for this
|
1309 |
|
|
* purpose reduces latency and prevents some filesystem-
|
1310 |
|
|
* specific deadlocks.
|
1311 |
|
|
*
|
1312 |
|
|
* Q: Why does I_DIRTY_DATASYNC exist? It appears as if it could be replaced
|
1313 |
|
|
* by (I_DIRTY_SYNC|I_DIRTY_PAGES).
|
1314 |
|
|
* Q: What is the difference between I_WILL_FREE and I_FREEING?
|
1315 |
|
|
* Q: igrab() only checks on (I_FREEING|I_WILL_FREE). Should it also check on
|
1316 |
|
|
* I_CLEAR? If not, why?
|
1317 |
|
|
*/
|
1318 |
|
|
#define I_DIRTY_SYNC 1
|
1319 |
|
|
#define I_DIRTY_DATASYNC 2
|
1320 |
|
|
#define I_DIRTY_PAGES 4
|
1321 |
|
|
#define I_NEW 8
|
1322 |
|
|
#define I_WILL_FREE 16
|
1323 |
|
|
#define I_FREEING 32
|
1324 |
|
|
#define I_CLEAR 64
|
1325 |
|
|
#define __I_LOCK 7
|
1326 |
|
|
#define I_LOCK (1 << __I_LOCK)
|
1327 |
|
|
#define __I_SYNC 8
|
1328 |
|
|
#define I_SYNC (1 << __I_SYNC)
|
1329 |
|
|
|
1330 |
|
|
#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)
|
1331 |
|
|
|
1332 |
|
|
extern void __mark_inode_dirty(struct inode *, int);
|
1333 |
|
|
static inline void mark_inode_dirty(struct inode *inode)
|
1334 |
|
|
{
|
1335 |
|
|
__mark_inode_dirty(inode, I_DIRTY);
|
1336 |
|
|
}
|
1337 |
|
|
|
1338 |
|
|
static inline void mark_inode_dirty_sync(struct inode *inode)
|
1339 |
|
|
{
|
1340 |
|
|
__mark_inode_dirty(inode, I_DIRTY_SYNC);
|
1341 |
|
|
}
|
1342 |
|
|
|
1343 |
|
|
/**
|
1344 |
|
|
* inc_nlink - directly increment an inode's link count
|
1345 |
|
|
* @inode: inode
|
1346 |
|
|
*
|
1347 |
|
|
* This is a low-level filesystem helper to replace any
|
1348 |
|
|
* direct filesystem manipulation of i_nlink. Currently,
|
1349 |
|
|
* it is only here for parity with dec_nlink().
|
1350 |
|
|
*/
|
1351 |
|
|
static inline void inc_nlink(struct inode *inode)
|
1352 |
|
|
{
|
1353 |
|
|
inode->i_nlink++;
|
1354 |
|
|
}
|
1355 |
|
|
|
1356 |
|
|
static inline void inode_inc_link_count(struct inode *inode)
|
1357 |
|
|
{
|
1358 |
|
|
inc_nlink(inode);
|
1359 |
|
|
mark_inode_dirty(inode);
|
1360 |
|
|
}
|
1361 |
|
|
|
1362 |
|
|
/**
|
1363 |
|
|
* drop_nlink - directly drop an inode's link count
|
1364 |
|
|
* @inode: inode
|
1365 |
|
|
*
|
1366 |
|
|
* This is a low-level filesystem helper to replace any
|
1367 |
|
|
* direct filesystem manipulation of i_nlink. In cases
|
1368 |
|
|
* where we are attempting to track writes to the
|
1369 |
|
|
* filesystem, a decrement to zero means an imminent
|
1370 |
|
|
* write when the file is truncated and actually unlinked
|
1371 |
|
|
* on the filesystem.
|
1372 |
|
|
*/
|
1373 |
|
|
static inline void drop_nlink(struct inode *inode)
|
1374 |
|
|
{
|
1375 |
|
|
inode->i_nlink--;
|
1376 |
|
|
}
|
1377 |
|
|
|
1378 |
|
|
/**
|
1379 |
|
|
* clear_nlink - directly zero an inode's link count
|
1380 |
|
|
* @inode: inode
|
1381 |
|
|
*
|
1382 |
|
|
* This is a low-level filesystem helper to replace any
|
1383 |
|
|
* direct filesystem manipulation of i_nlink. See
|
1384 |
|
|
* drop_nlink() for why we care about i_nlink hitting zero.
|
1385 |
|
|
*/
|
1386 |
|
|
static inline void clear_nlink(struct inode *inode)
|
1387 |
|
|
{
|
1388 |
|
|
inode->i_nlink = 0;
|
1389 |
|
|
}
|
1390 |
|
|
|
1391 |
|
|
static inline void inode_dec_link_count(struct inode *inode)
|
1392 |
|
|
{
|
1393 |
|
|
drop_nlink(inode);
|
1394 |
|
|
mark_inode_dirty(inode);
|
1395 |
|
|
}
|
1396 |
|
|
|
1397 |
|
|
extern void touch_atime(struct vfsmount *mnt, struct dentry *dentry);
|
1398 |
|
|
static inline void file_accessed(struct file *file)
|
1399 |
|
|
{
|
1400 |
|
|
if (!(file->f_flags & O_NOATIME))
|
1401 |
|
|
touch_atime(file->f_path.mnt, file->f_path.dentry);
|
1402 |
|
|
}
|
1403 |
|
|
|
1404 |
|
|
int sync_inode(struct inode *inode, struct writeback_control *wbc);
|
1405 |
|
|
|
1406 |
|
|
struct file_system_type {
|
1407 |
|
|
const char *name;
|
1408 |
|
|
int fs_flags;
|
1409 |
|
|
int (*get_sb) (struct file_system_type *, int,
|
1410 |
|
|
const char *, void *, struct vfsmount *);
|
1411 |
|
|
void (*kill_sb) (struct super_block *);
|
1412 |
|
|
struct module *owner;
|
1413 |
|
|
struct file_system_type * next;
|
1414 |
|
|
struct list_head fs_supers;
|
1415 |
|
|
|
1416 |
|
|
struct lock_class_key s_lock_key;
|
1417 |
|
|
struct lock_class_key s_umount_key;
|
1418 |
|
|
|
1419 |
|
|
struct lock_class_key i_lock_key;
|
1420 |
|
|
struct lock_class_key i_mutex_key;
|
1421 |
|
|
struct lock_class_key i_mutex_dir_key;
|
1422 |
|
|
struct lock_class_key i_alloc_sem_key;
|
1423 |
|
|
};
|
1424 |
|
|
|
1425 |
|
|
extern int get_sb_bdev(struct file_system_type *fs_type,
|
1426 |
|
|
int flags, const char *dev_name, void *data,
|
1427 |
|
|
int (*fill_super)(struct super_block *, void *, int),
|
1428 |
|
|
struct vfsmount *mnt);
|
1429 |
|
|
extern int get_sb_single(struct file_system_type *fs_type,
|
1430 |
|
|
int flags, void *data,
|
1431 |
|
|
int (*fill_super)(struct super_block *, void *, int),
|
1432 |
|
|
struct vfsmount *mnt);
|
1433 |
|
|
extern int get_sb_nodev(struct file_system_type *fs_type,
|
1434 |
|
|
int flags, void *data,
|
1435 |
|
|
int (*fill_super)(struct super_block *, void *, int),
|
1436 |
|
|
struct vfsmount *mnt);
|
1437 |
|
|
void generic_shutdown_super(struct super_block *sb);
|
1438 |
|
|
void kill_block_super(struct super_block *sb);
|
1439 |
|
|
void kill_anon_super(struct super_block *sb);
|
1440 |
|
|
void kill_litter_super(struct super_block *sb);
|
1441 |
|
|
void deactivate_super(struct super_block *sb);
|
1442 |
|
|
int set_anon_super(struct super_block *s, void *data);
|
1443 |
|
|
struct super_block *sget(struct file_system_type *type,
|
1444 |
|
|
int (*test)(struct super_block *,void *),
|
1445 |
|
|
int (*set)(struct super_block *,void *),
|
1446 |
|
|
void *data);
|
1447 |
|
|
extern int get_sb_pseudo(struct file_system_type *, char *,
|
1448 |
|
|
const struct super_operations *ops, unsigned long,
|
1449 |
|
|
struct vfsmount *mnt);
|
1450 |
|
|
extern int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb);
|
1451 |
|
|
int __put_super(struct super_block *sb);
|
1452 |
|
|
int __put_super_and_need_restart(struct super_block *sb);
|
1453 |
|
|
void unnamed_dev_init(void);
|
1454 |
|
|
|
1455 |
|
|
/* Alas, no aliases. Too much hassle with bringing module.h everywhere */
|
1456 |
|
|
#define fops_get(fops) \
|
1457 |
|
|
(((fops) && try_module_get((fops)->owner) ? (fops) : NULL))
|
1458 |
|
|
#define fops_put(fops) \
|
1459 |
|
|
do { if (fops) module_put((fops)->owner); } while(0)
|
1460 |
|
|
|
1461 |
|
|
extern int register_filesystem(struct file_system_type *);
|
1462 |
|
|
extern int unregister_filesystem(struct file_system_type *);
|
1463 |
|
|
extern struct vfsmount *kern_mount_data(struct file_system_type *, void *data);
|
1464 |
|
|
#define kern_mount(type) kern_mount_data(type, NULL)
|
1465 |
|
|
extern int may_umount_tree(struct vfsmount *);
|
1466 |
|
|
extern int may_umount(struct vfsmount *);
|
1467 |
|
|
extern void umount_tree(struct vfsmount *, int, struct list_head *);
|
1468 |
|
|
extern void release_mounts(struct list_head *);
|
1469 |
|
|
extern long do_mount(char *, char *, char *, unsigned long, void *);
|
1470 |
|
|
extern struct vfsmount *copy_tree(struct vfsmount *, struct dentry *, int);
|
1471 |
|
|
extern void mnt_set_mountpoint(struct vfsmount *, struct dentry *,
|
1472 |
|
|
struct vfsmount *);
|
1473 |
|
|
extern struct vfsmount *collect_mounts(struct vfsmount *, struct dentry *);
|
1474 |
|
|
extern void drop_collected_mounts(struct vfsmount *);
|
1475 |
|
|
|
1476 |
|
|
extern int vfs_statfs(struct dentry *, struct kstatfs *);
|
1477 |
|
|
|
1478 |
|
|
/* /sys/fs */
|
1479 |
|
|
extern struct kset fs_subsys;
|
1480 |
|
|
|
1481 |
|
|
#define FLOCK_VERIFY_READ 1
|
1482 |
|
|
#define FLOCK_VERIFY_WRITE 2
|
1483 |
|
|
|
1484 |
|
|
extern int locks_mandatory_locked(struct inode *);
|
1485 |
|
|
extern int locks_mandatory_area(int, struct inode *, struct file *, loff_t, size_t);
|
1486 |
|
|
|
1487 |
|
|
/*
|
1488 |
|
|
* Candidates for mandatory locking have the setgid bit set
|
1489 |
|
|
* but no group execute bit - an otherwise meaningless combination.
|
1490 |
|
|
*/
|
1491 |
|
|
|
1492 |
|
|
static inline int __mandatory_lock(struct inode *ino)
|
1493 |
|
|
{
|
1494 |
|
|
return (ino->i_mode & (S_ISGID | S_IXGRP)) == S_ISGID;
|
1495 |
|
|
}
|
1496 |
|
|
|
1497 |
|
|
/*
|
1498 |
|
|
* ... and these candidates should be on MS_MANDLOCK mounted fs,
|
1499 |
|
|
* otherwise these will be advisory locks
|
1500 |
|
|
*/
|
1501 |
|
|
|
1502 |
|
|
static inline int mandatory_lock(struct inode *ino)
|
1503 |
|
|
{
|
1504 |
|
|
return IS_MANDLOCK(ino) && __mandatory_lock(ino);
|
1505 |
|
|
}
|
1506 |
|
|
|
1507 |
|
|
static inline int locks_verify_locked(struct inode *inode)
|
1508 |
|
|
{
|
1509 |
|
|
if (mandatory_lock(inode))
|
1510 |
|
|
return locks_mandatory_locked(inode);
|
1511 |
|
|
return 0;
|
1512 |
|
|
}
|
1513 |
|
|
|
1514 |
|
|
extern int rw_verify_area(int, struct file *, loff_t *, size_t);
|
1515 |
|
|
|
1516 |
|
|
static inline int locks_verify_truncate(struct inode *inode,
|
1517 |
|
|
struct file *filp,
|
1518 |
|
|
loff_t size)
|
1519 |
|
|
{
|
1520 |
|
|
if (inode->i_flock && mandatory_lock(inode))
|
1521 |
|
|
return locks_mandatory_area(
|
1522 |
|
|
FLOCK_VERIFY_WRITE, inode, filp,
|
1523 |
|
|
size < inode->i_size ? size : inode->i_size,
|
1524 |
|
|
(size < inode->i_size ? inode->i_size - size
|
1525 |
|
|
: size - inode->i_size)
|
1526 |
|
|
);
|
1527 |
|
|
return 0;
|
1528 |
|
|
}
|
1529 |
|
|
|
1530 |
|
|
static inline int break_lease(struct inode *inode, unsigned int mode)
|
1531 |
|
|
{
|
1532 |
|
|
if (inode->i_flock)
|
1533 |
|
|
return __break_lease(inode, mode);
|
1534 |
|
|
return 0;
|
1535 |
|
|
}
|
1536 |
|
|
|
1537 |
|
|
/* fs/open.c */
|
1538 |
|
|
|
1539 |
|
|
extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs,
|
1540 |
|
|
struct file *filp);
|
1541 |
|
|
extern long do_sys_open(int dfd, const char __user *filename, int flags,
|
1542 |
|
|
int mode);
|
1543 |
|
|
extern struct file *filp_open(const char *, int, int);
|
1544 |
|
|
extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
|
1545 |
|
|
extern int filp_close(struct file *, fl_owner_t id);
|
1546 |
|
|
extern char * getname(const char __user *);
|
1547 |
|
|
|
1548 |
|
|
/* fs/dcache.c */
|
1549 |
|
|
extern void __init vfs_caches_init_early(void);
|
1550 |
|
|
extern void __init vfs_caches_init(unsigned long);
|
1551 |
|
|
|
1552 |
|
|
extern struct kmem_cache *names_cachep;
|
1553 |
|
|
|
1554 |
|
|
#define __getname() kmem_cache_alloc(names_cachep, GFP_KERNEL)
|
1555 |
|
|
#define __putname(name) kmem_cache_free(names_cachep, (void *)(name))
|
1556 |
|
|
#ifndef CONFIG_AUDITSYSCALL
|
1557 |
|
|
#define putname(name) __putname(name)
|
1558 |
|
|
#else
|
1559 |
|
|
extern void putname(const char *name);
|
1560 |
|
|
#endif
|
1561 |
|
|
|
1562 |
|
|
#ifdef CONFIG_BLOCK
|
1563 |
|
|
extern int register_blkdev(unsigned int, const char *);
|
1564 |
|
|
extern void unregister_blkdev(unsigned int, const char *);
|
1565 |
|
|
extern struct block_device *bdget(dev_t);
|
1566 |
|
|
extern void bd_set_size(struct block_device *, loff_t size);
|
1567 |
|
|
extern void bd_forget(struct inode *inode);
|
1568 |
|
|
extern void bdput(struct block_device *);
|
1569 |
|
|
extern struct block_device *open_by_devnum(dev_t, unsigned);
|
1570 |
|
|
extern const struct address_space_operations def_blk_aops;
|
1571 |
|
|
#else
|
1572 |
|
|
static inline void bd_forget(struct inode *inode) {}
|
1573 |
|
|
#endif
|
1574 |
|
|
extern const struct file_operations def_blk_fops;
|
1575 |
|
|
extern const struct file_operations def_chr_fops;
|
1576 |
|
|
extern const struct file_operations bad_sock_fops;
|
1577 |
|
|
extern const struct file_operations def_fifo_fops;
|
1578 |
|
|
#ifdef CONFIG_BLOCK
|
1579 |
|
|
extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
|
1580 |
|
|
extern int blkdev_ioctl(struct inode *, struct file *, unsigned, unsigned long);
|
1581 |
|
|
extern int blkdev_driver_ioctl(struct inode *inode, struct file *file,
|
1582 |
|
|
struct gendisk *disk, unsigned cmd,
|
1583 |
|
|
unsigned long arg);
|
1584 |
|
|
extern long compat_blkdev_ioctl(struct file *, unsigned, unsigned long);
|
1585 |
|
|
extern int blkdev_get(struct block_device *, mode_t, unsigned);
|
1586 |
|
|
extern int blkdev_put(struct block_device *);
|
1587 |
|
|
extern int bd_claim(struct block_device *, void *);
|
1588 |
|
|
extern void bd_release(struct block_device *);
|
1589 |
|
|
#ifdef CONFIG_SYSFS
|
1590 |
|
|
extern int bd_claim_by_disk(struct block_device *, void *, struct gendisk *);
|
1591 |
|
|
extern void bd_release_from_disk(struct block_device *, struct gendisk *);
|
1592 |
|
|
#else
|
1593 |
|
|
#define bd_claim_by_disk(bdev, holder, disk) bd_claim(bdev, holder)
|
1594 |
|
|
#define bd_release_from_disk(bdev, disk) bd_release(bdev)
|
1595 |
|
|
#endif
|
1596 |
|
|
#endif
|
1597 |
|
|
|
1598 |
|
|
/* fs/char_dev.c */
|
1599 |
|
|
#define CHRDEV_MAJOR_HASH_SIZE 255
|
1600 |
|
|
extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);
|
1601 |
|
|
extern int register_chrdev_region(dev_t, unsigned, const char *);
|
1602 |
|
|
extern int register_chrdev(unsigned int, const char *,
|
1603 |
|
|
const struct file_operations *);
|
1604 |
|
|
extern void unregister_chrdev(unsigned int, const char *);
|
1605 |
|
|
extern void unregister_chrdev_region(dev_t, unsigned);
|
1606 |
|
|
extern int chrdev_open(struct inode *, struct file *);
|
1607 |
|
|
extern void chrdev_show(struct seq_file *,off_t);
|
1608 |
|
|
|
1609 |
|
|
/* fs/block_dev.c */
|
1610 |
|
|
#define BDEVNAME_SIZE 32 /* Largest string for a blockdev identifier */
|
1611 |
|
|
|
1612 |
|
|
#ifdef CONFIG_BLOCK
|
1613 |
|
|
#define BLKDEV_MAJOR_HASH_SIZE 255
|
1614 |
|
|
extern const char *__bdevname(dev_t, char *buffer);
|
1615 |
|
|
extern const char *bdevname(struct block_device *bdev, char *buffer);
|
1616 |
|
|
extern struct block_device *lookup_bdev(const char *);
|
1617 |
|
|
extern struct block_device *open_bdev_excl(const char *, int, void *);
|
1618 |
|
|
extern void close_bdev_excl(struct block_device *);
|
1619 |
|
|
extern void blkdev_show(struct seq_file *,off_t);
|
1620 |
|
|
#else
|
1621 |
|
|
#define BLKDEV_MAJOR_HASH_SIZE 0
|
1622 |
|
|
#endif
|
1623 |
|
|
|
1624 |
|
|
extern void init_special_inode(struct inode *, umode_t, dev_t);
|
1625 |
|
|
|
1626 |
|
|
/* Invalid inode operations -- fs/bad_inode.c */
|
1627 |
|
|
extern void make_bad_inode(struct inode *);
|
1628 |
|
|
extern int is_bad_inode(struct inode *);
|
1629 |
|
|
|
1630 |
|
|
extern const struct file_operations read_fifo_fops;
|
1631 |
|
|
extern const struct file_operations write_fifo_fops;
|
1632 |
|
|
extern const struct file_operations rdwr_fifo_fops;
|
1633 |
|
|
|
1634 |
|
|
extern int fs_may_remount_ro(struct super_block *);
|
1635 |
|
|
|
1636 |
|
|
#ifdef CONFIG_BLOCK
|
1637 |
|
|
/*
|
1638 |
|
|
* return READ, READA, or WRITE
|
1639 |
|
|
*/
|
1640 |
|
|
#define bio_rw(bio) ((bio)->bi_rw & (RW_MASK | RWA_MASK))
|
1641 |
|
|
|
1642 |
|
|
/*
|
1643 |
|
|
* return data direction, READ or WRITE
|
1644 |
|
|
*/
|
1645 |
|
|
#define bio_data_dir(bio) ((bio)->bi_rw & 1)
|
1646 |
|
|
|
1647 |
|
|
extern int check_disk_change(struct block_device *);
|
1648 |
|
|
extern int __invalidate_device(struct block_device *);
|
1649 |
|
|
extern int invalidate_partition(struct gendisk *, int);
|
1650 |
|
|
#endif
|
1651 |
|
|
extern int invalidate_inodes(struct super_block *);
|
1652 |
|
|
unsigned long __invalidate_mapping_pages(struct address_space *mapping,
|
1653 |
|
|
pgoff_t start, pgoff_t end,
|
1654 |
|
|
bool be_atomic);
|
1655 |
|
|
unsigned long invalidate_mapping_pages(struct address_space *mapping,
|
1656 |
|
|
pgoff_t start, pgoff_t end);
|
1657 |
|
|
|
1658 |
|
|
static inline unsigned long __deprecated
|
1659 |
|
|
invalidate_inode_pages(struct address_space *mapping)
|
1660 |
|
|
{
|
1661 |
|
|
return invalidate_mapping_pages(mapping, 0, ~0UL);
|
1662 |
|
|
}
|
1663 |
|
|
|
1664 |
|
|
static inline void invalidate_remote_inode(struct inode *inode)
|
1665 |
|
|
{
|
1666 |
|
|
if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
|
1667 |
|
|
S_ISLNK(inode->i_mode))
|
1668 |
|
|
invalidate_mapping_pages(inode->i_mapping, 0, -1);
|
1669 |
|
|
}
|
1670 |
|
|
extern int invalidate_inode_pages2(struct address_space *mapping);
|
1671 |
|
|
extern int invalidate_inode_pages2_range(struct address_space *mapping,
|
1672 |
|
|
pgoff_t start, pgoff_t end);
|
1673 |
|
|
extern int write_inode_now(struct inode *, int);
|
1674 |
|
|
extern int filemap_fdatawrite(struct address_space *);
|
1675 |
|
|
extern int filemap_flush(struct address_space *);
|
1676 |
|
|
extern int filemap_fdatawait(struct address_space *);
|
1677 |
|
|
extern int filemap_write_and_wait(struct address_space *mapping);
|
1678 |
|
|
extern int filemap_write_and_wait_range(struct address_space *mapping,
|
1679 |
|
|
loff_t lstart, loff_t lend);
|
1680 |
|
|
extern int wait_on_page_writeback_range(struct address_space *mapping,
|
1681 |
|
|
pgoff_t start, pgoff_t end);
|
1682 |
|
|
extern int __filemap_fdatawrite_range(struct address_space *mapping,
|
1683 |
|
|
loff_t start, loff_t end, int sync_mode);
|
1684 |
|
|
|
1685 |
|
|
extern long do_fsync(struct file *file, int datasync);
|
1686 |
|
|
extern void sync_supers(void);
|
1687 |
|
|
extern void sync_filesystems(int wait);
|
1688 |
|
|
extern void __fsync_super(struct super_block *sb);
|
1689 |
|
|
extern void emergency_sync(void);
|
1690 |
|
|
extern void emergency_remount(void);
|
1691 |
|
|
extern int do_remount_sb(struct super_block *sb, int flags,
|
1692 |
|
|
void *data, int force);
|
1693 |
|
|
#ifdef CONFIG_BLOCK
|
1694 |
|
|
extern sector_t bmap(struct inode *, sector_t);
|
1695 |
|
|
#endif
|
1696 |
|
|
extern int notify_change(struct dentry *, struct iattr *);
|
1697 |
|
|
extern int permission(struct inode *, int, struct nameidata *);
|
1698 |
|
|
extern int generic_permission(struct inode *, int,
|
1699 |
|
|
int (*check_acl)(struct inode *, int));
|
1700 |
|
|
|
1701 |
|
|
extern int get_write_access(struct inode *);
|
1702 |
|
|
extern int deny_write_access(struct file *);
|
1703 |
|
|
static inline void put_write_access(struct inode * inode)
|
1704 |
|
|
{
|
1705 |
|
|
atomic_dec(&inode->i_writecount);
|
1706 |
|
|
}
|
1707 |
|
|
static inline void allow_write_access(struct file *file)
|
1708 |
|
|
{
|
1709 |
|
|
if (file)
|
1710 |
|
|
atomic_inc(&file->f_path.dentry->d_inode->i_writecount);
|
1711 |
|
|
}
|
1712 |
|
|
extern int do_pipe(int *);
|
1713 |
|
|
extern struct file *create_read_pipe(struct file *f);
|
1714 |
|
|
extern struct file *create_write_pipe(void);
|
1715 |
|
|
extern void free_write_pipe(struct file *);
|
1716 |
|
|
|
1717 |
|
|
extern int open_namei(int dfd, const char *, int, int, struct nameidata *);
|
1718 |
|
|
extern int may_open(struct nameidata *, int, int);
|
1719 |
|
|
|
1720 |
|
|
extern int kernel_read(struct file *, unsigned long, char *, unsigned long);
|
1721 |
|
|
extern struct file * open_exec(const char *);
|
1722 |
|
|
|
1723 |
|
|
/* fs/dcache.c -- generic fs support functions */
|
1724 |
|
|
extern int is_subdir(struct dentry *, struct dentry *);
|
1725 |
|
|
extern ino_t find_inode_number(struct dentry *, struct qstr *);
|
1726 |
|
|
|
1727 |
|
|
#include <linux/err.h>
|
1728 |
|
|
|
1729 |
|
|
/* needed for stackable file system support */
|
1730 |
|
|
extern loff_t default_llseek(struct file *file, loff_t offset, int origin);
|
1731 |
|
|
|
1732 |
|
|
extern loff_t vfs_llseek(struct file *file, loff_t offset, int origin);
|
1733 |
|
|
|
1734 |
|
|
extern void inode_init_once(struct inode *);
|
1735 |
|
|
extern void iput(struct inode *);
|
1736 |
|
|
extern struct inode * igrab(struct inode *);
|
1737 |
|
|
extern ino_t iunique(struct super_block *, ino_t);
|
1738 |
|
|
extern int inode_needs_sync(struct inode *inode);
|
1739 |
|
|
extern void generic_delete_inode(struct inode *inode);
|
1740 |
|
|
extern void generic_drop_inode(struct inode *inode);
|
1741 |
|
|
|
1742 |
|
|
extern struct inode *ilookup5_nowait(struct super_block *sb,
|
1743 |
|
|
unsigned long hashval, int (*test)(struct inode *, void *),
|
1744 |
|
|
void *data);
|
1745 |
|
|
extern struct inode *ilookup5(struct super_block *sb, unsigned long hashval,
|
1746 |
|
|
int (*test)(struct inode *, void *), void *data);
|
1747 |
|
|
extern struct inode *ilookup(struct super_block *sb, unsigned long ino);
|
1748 |
|
|
|
1749 |
|
|
extern struct inode * iget5_locked(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *);
|
1750 |
|
|
extern struct inode * iget_locked(struct super_block *, unsigned long);
|
1751 |
|
|
extern void unlock_new_inode(struct inode *);
|
1752 |
|
|
|
1753 |
|
|
static inline struct inode *iget(struct super_block *sb, unsigned long ino)
|
1754 |
|
|
{
|
1755 |
|
|
struct inode *inode = iget_locked(sb, ino);
|
1756 |
|
|
|
1757 |
|
|
if (inode && (inode->i_state & I_NEW)) {
|
1758 |
|
|
sb->s_op->read_inode(inode);
|
1759 |
|
|
unlock_new_inode(inode);
|
1760 |
|
|
}
|
1761 |
|
|
|
1762 |
|
|
return inode;
|
1763 |
|
|
}
|
1764 |
|
|
|
1765 |
|
|
extern void __iget(struct inode * inode);
|
1766 |
|
|
extern void clear_inode(struct inode *);
|
1767 |
|
|
extern void destroy_inode(struct inode *);
|
1768 |
|
|
extern struct inode *new_inode(struct super_block *);
|
1769 |
|
|
extern int __remove_suid(struct dentry *, int);
|
1770 |
|
|
extern int should_remove_suid(struct dentry *);
|
1771 |
|
|
extern int remove_suid(struct dentry *);
|
1772 |
|
|
|
1773 |
|
|
extern void __insert_inode_hash(struct inode *, unsigned long hashval);
|
1774 |
|
|
extern void remove_inode_hash(struct inode *);
|
1775 |
|
|
static inline void insert_inode_hash(struct inode *inode) {
|
1776 |
|
|
__insert_inode_hash(inode, inode->i_ino);
|
1777 |
|
|
}
|
1778 |
|
|
|
1779 |
|
|
extern struct file * get_empty_filp(void);
|
1780 |
|
|
extern void file_move(struct file *f, struct list_head *list);
|
1781 |
|
|
extern void file_kill(struct file *f);
|
1782 |
|
|
#ifdef CONFIG_BLOCK
|
1783 |
|
|
struct bio;
|
1784 |
|
|
extern void submit_bio(int, struct bio *);
|
1785 |
|
|
extern int bdev_read_only(struct block_device *);
|
1786 |
|
|
#endif
|
1787 |
|
|
extern int set_blocksize(struct block_device *, int);
|
1788 |
|
|
extern int sb_set_blocksize(struct super_block *, int);
|
1789 |
|
|
extern int sb_min_blocksize(struct super_block *, int);
|
1790 |
|
|
extern int sb_has_dirty_inodes(struct super_block *);
|
1791 |
|
|
|
1792 |
|
|
extern int generic_file_mmap(struct file *, struct vm_area_struct *);
|
1793 |
|
|
extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *);
|
1794 |
|
|
extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
|
1795 |
|
|
int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk);
|
1796 |
|
|
extern ssize_t generic_file_aio_read(struct kiocb *, const struct iovec *, unsigned long, loff_t);
|
1797 |
|
|
extern ssize_t generic_file_aio_write(struct kiocb *, const struct iovec *, unsigned long, loff_t);
|
1798 |
|
|
extern ssize_t generic_file_aio_write_nolock(struct kiocb *, const struct iovec *,
|
1799 |
|
|
unsigned long, loff_t);
|
1800 |
|
|
extern ssize_t generic_file_direct_write(struct kiocb *, const struct iovec *,
|
1801 |
|
|
unsigned long *, loff_t, loff_t *, size_t, size_t);
|
1802 |
|
|
extern ssize_t generic_file_buffered_write(struct kiocb *, const struct iovec *,
|
1803 |
|
|
unsigned long, loff_t, loff_t *, size_t, ssize_t);
|
1804 |
|
|
extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos);
|
1805 |
|
|
extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos);
|
1806 |
|
|
extern void do_generic_mapping_read(struct address_space *mapping,
|
1807 |
|
|
struct file_ra_state *, struct file *,
|
1808 |
|
|
loff_t *, read_descriptor_t *, read_actor_t);
|
1809 |
|
|
extern int generic_segment_checks(const struct iovec *iov,
|
1810 |
|
|
unsigned long *nr_segs, size_t *count, int access_flags);
|
1811 |
|
|
|
1812 |
|
|
/* fs/splice.c */
|
1813 |
|
|
extern ssize_t generic_file_splice_read(struct file *, loff_t *,
|
1814 |
|
|
struct pipe_inode_info *, size_t, unsigned int);
|
1815 |
|
|
extern ssize_t generic_file_splice_write(struct pipe_inode_info *,
|
1816 |
|
|
struct file *, loff_t *, size_t, unsigned int);
|
1817 |
|
|
extern ssize_t generic_file_splice_write_nolock(struct pipe_inode_info *,
|
1818 |
|
|
struct file *, loff_t *, size_t, unsigned int);
|
1819 |
|
|
extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe,
|
1820 |
|
|
struct file *out, loff_t *, size_t len, unsigned int flags);
|
1821 |
|
|
extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
|
1822 |
|
|
size_t len, unsigned int flags);
|
1823 |
|
|
|
1824 |
|
|
extern void
|
1825 |
|
|
file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping);
|
1826 |
|
|
extern loff_t no_llseek(struct file *file, loff_t offset, int origin);
|
1827 |
|
|
extern loff_t generic_file_llseek(struct file *file, loff_t offset, int origin);
|
1828 |
|
|
extern loff_t remote_llseek(struct file *file, loff_t offset, int origin);
|
1829 |
|
|
extern int generic_file_open(struct inode * inode, struct file * filp);
|
1830 |
|
|
extern int nonseekable_open(struct inode * inode, struct file * filp);
|
1831 |
|
|
|
1832 |
|
|
#ifdef CONFIG_FS_XIP
|
1833 |
|
|
extern ssize_t xip_file_read(struct file *filp, char __user *buf, size_t len,
|
1834 |
|
|
loff_t *ppos);
|
1835 |
|
|
extern int xip_file_mmap(struct file * file, struct vm_area_struct * vma);
|
1836 |
|
|
extern ssize_t xip_file_write(struct file *filp, const char __user *buf,
|
1837 |
|
|
size_t len, loff_t *ppos);
|
1838 |
|
|
extern int xip_truncate_page(struct address_space *mapping, loff_t from);
|
1839 |
|
|
#else
|
1840 |
|
|
static inline int xip_truncate_page(struct address_space *mapping, loff_t from)
|
1841 |
|
|
{
|
1842 |
|
|
return 0;
|
1843 |
|
|
}
|
1844 |
|
|
#endif
|
1845 |
|
|
|
1846 |
|
|
static inline void do_generic_file_read(struct file * filp, loff_t *ppos,
|
1847 |
|
|
read_descriptor_t * desc,
|
1848 |
|
|
read_actor_t actor)
|
1849 |
|
|
{
|
1850 |
|
|
do_generic_mapping_read(filp->f_mapping,
|
1851 |
|
|
&filp->f_ra,
|
1852 |
|
|
filp,
|
1853 |
|
|
ppos,
|
1854 |
|
|
desc,
|
1855 |
|
|
actor);
|
1856 |
|
|
}
|
1857 |
|
|
|
1858 |
|
|
#ifdef CONFIG_BLOCK
|
1859 |
|
|
ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
|
1860 |
|
|
struct block_device *bdev, const struct iovec *iov, loff_t offset,
|
1861 |
|
|
unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,
|
1862 |
|
|
int lock_type);
|
1863 |
|
|
|
1864 |
|
|
enum {
|
1865 |
|
|
DIO_LOCKING = 1, /* need locking between buffered and direct access */
|
1866 |
|
|
DIO_NO_LOCKING, /* bdev; no locking at all between buffered/direct */
|
1867 |
|
|
DIO_OWN_LOCKING, /* filesystem locks buffered and direct internally */
|
1868 |
|
|
};
|
1869 |
|
|
|
1870 |
|
|
static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb,
|
1871 |
|
|
struct inode *inode, struct block_device *bdev, const struct iovec *iov,
|
1872 |
|
|
loff_t offset, unsigned long nr_segs, get_block_t get_block,
|
1873 |
|
|
dio_iodone_t end_io)
|
1874 |
|
|
{
|
1875 |
|
|
return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
|
1876 |
|
|
nr_segs, get_block, end_io, DIO_LOCKING);
|
1877 |
|
|
}
|
1878 |
|
|
|
1879 |
|
|
static inline ssize_t blockdev_direct_IO_no_locking(int rw, struct kiocb *iocb,
|
1880 |
|
|
struct inode *inode, struct block_device *bdev, const struct iovec *iov,
|
1881 |
|
|
loff_t offset, unsigned long nr_segs, get_block_t get_block,
|
1882 |
|
|
dio_iodone_t end_io)
|
1883 |
|
|
{
|
1884 |
|
|
return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
|
1885 |
|
|
nr_segs, get_block, end_io, DIO_NO_LOCKING);
|
1886 |
|
|
}
|
1887 |
|
|
|
1888 |
|
|
static inline ssize_t blockdev_direct_IO_own_locking(int rw, struct kiocb *iocb,
|
1889 |
|
|
struct inode *inode, struct block_device *bdev, const struct iovec *iov,
|
1890 |
|
|
loff_t offset, unsigned long nr_segs, get_block_t get_block,
|
1891 |
|
|
dio_iodone_t end_io)
|
1892 |
|
|
{
|
1893 |
|
|
return __blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
|
1894 |
|
|
nr_segs, get_block, end_io, DIO_OWN_LOCKING);
|
1895 |
|
|
}
|
1896 |
|
|
#endif
|
1897 |
|
|
|
1898 |
|
|
extern const struct file_operations generic_ro_fops;
|
1899 |
|
|
|
1900 |
|
|
#define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
|
1901 |
|
|
|
1902 |
|
|
extern int vfs_readlink(struct dentry *, char __user *, int, const char *);
|
1903 |
|
|
extern int vfs_follow_link(struct nameidata *, const char *);
|
1904 |
|
|
extern int page_readlink(struct dentry *, char __user *, int);
|
1905 |
|
|
extern void *page_follow_link_light(struct dentry *, struct nameidata *);
|
1906 |
|
|
extern void page_put_link(struct dentry *, struct nameidata *, void *);
|
1907 |
|
|
extern int __page_symlink(struct inode *inode, const char *symname, int len,
|
1908 |
|
|
gfp_t gfp_mask);
|
1909 |
|
|
extern int page_symlink(struct inode *inode, const char *symname, int len);
|
1910 |
|
|
extern const struct inode_operations page_symlink_inode_operations;
|
1911 |
|
|
extern int generic_readlink(struct dentry *, char __user *, int);
|
1912 |
|
|
extern void generic_fillattr(struct inode *, struct kstat *);
|
1913 |
|
|
extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
1914 |
|
|
void inode_add_bytes(struct inode *inode, loff_t bytes);
|
1915 |
|
|
void inode_sub_bytes(struct inode *inode, loff_t bytes);
|
1916 |
|
|
loff_t inode_get_bytes(struct inode *inode);
|
1917 |
|
|
void inode_set_bytes(struct inode *inode, loff_t bytes);
|
1918 |
|
|
|
1919 |
|
|
extern int vfs_readdir(struct file *, filldir_t, void *);
|
1920 |
|
|
|
1921 |
|
|
extern int vfs_stat(char __user *, struct kstat *);
|
1922 |
|
|
extern int vfs_lstat(char __user *, struct kstat *);
|
1923 |
|
|
extern int vfs_stat_fd(int dfd, char __user *, struct kstat *);
|
1924 |
|
|
extern int vfs_lstat_fd(int dfd, char __user *, struct kstat *);
|
1925 |
|
|
extern int vfs_fstat(unsigned int, struct kstat *);
|
1926 |
|
|
|
1927 |
|
|
extern int vfs_ioctl(struct file *, unsigned int, unsigned int, unsigned long);
|
1928 |
|
|
|
1929 |
|
|
extern void get_filesystem(struct file_system_type *fs);
|
1930 |
|
|
extern void put_filesystem(struct file_system_type *fs);
|
1931 |
|
|
extern struct file_system_type *get_fs_type(const char *name);
|
1932 |
|
|
extern struct super_block *get_super(struct block_device *);
|
1933 |
|
|
extern struct super_block *user_get_super(dev_t);
|
1934 |
|
|
extern void drop_super(struct super_block *sb);
|
1935 |
|
|
|
1936 |
|
|
extern int dcache_dir_open(struct inode *, struct file *);
|
1937 |
|
|
extern int dcache_dir_close(struct inode *, struct file *);
|
1938 |
|
|
extern loff_t dcache_dir_lseek(struct file *, loff_t, int);
|
1939 |
|
|
extern int dcache_readdir(struct file *, void *, filldir_t);
|
1940 |
|
|
extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
1941 |
|
|
extern int simple_statfs(struct dentry *, struct kstatfs *);
|
1942 |
|
|
extern int simple_link(struct dentry *, struct inode *, struct dentry *);
|
1943 |
|
|
extern int simple_unlink(struct inode *, struct dentry *);
|
1944 |
|
|
extern int simple_rmdir(struct inode *, struct dentry *);
|
1945 |
|
|
extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
|
1946 |
|
|
extern int simple_sync_file(struct file *, struct dentry *, int);
|
1947 |
|
|
extern int simple_empty(struct dentry *);
|
1948 |
|
|
extern int simple_readpage(struct file *file, struct page *page);
|
1949 |
|
|
extern int simple_prepare_write(struct file *file, struct page *page,
|
1950 |
|
|
unsigned offset, unsigned to);
|
1951 |
|
|
extern int simple_write_begin(struct file *file, struct address_space *mapping,
|
1952 |
|
|
loff_t pos, unsigned len, unsigned flags,
|
1953 |
|
|
struct page **pagep, void **fsdata);
|
1954 |
|
|
extern int simple_write_end(struct file *file, struct address_space *mapping,
|
1955 |
|
|
loff_t pos, unsigned len, unsigned copied,
|
1956 |
|
|
struct page *page, void *fsdata);
|
1957 |
|
|
|
1958 |
|
|
extern struct dentry *simple_lookup(struct inode *, struct dentry *, struct nameidata *);
|
1959 |
|
|
extern ssize_t generic_read_dir(struct file *, char __user *, size_t, loff_t *);
|
1960 |
|
|
extern const struct file_operations simple_dir_operations;
|
1961 |
|
|
extern const struct inode_operations simple_dir_inode_operations;
|
1962 |
|
|
struct tree_descr { char *name; const struct file_operations *ops; int mode; };
|
1963 |
|
|
struct dentry *d_alloc_name(struct dentry *, const char *);
|
1964 |
|
|
extern int simple_fill_super(struct super_block *, int, struct tree_descr *);
|
1965 |
|
|
extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
|
1966 |
|
|
extern void simple_release_fs(struct vfsmount **mount, int *count);
|
1967 |
|
|
|
1968 |
|
|
extern ssize_t simple_read_from_buffer(void __user *, size_t, loff_t *, const void *, size_t);
|
1969 |
|
|
|
1970 |
|
|
#ifdef CONFIG_MIGRATION
|
1971 |
|
|
extern int buffer_migrate_page(struct address_space *,
|
1972 |
|
|
struct page *, struct page *);
|
1973 |
|
|
#else
|
1974 |
|
|
#define buffer_migrate_page NULL
|
1975 |
|
|
#endif
|
1976 |
|
|
|
1977 |
|
|
extern int inode_change_ok(struct inode *, struct iattr *);
|
1978 |
|
|
extern int __must_check inode_setattr(struct inode *, struct iattr *);
|
1979 |
|
|
|
1980 |
|
|
extern void file_update_time(struct file *file);
|
1981 |
|
|
|
1982 |
|
|
static inline ino_t parent_ino(struct dentry *dentry)
|
1983 |
|
|
{
|
1984 |
|
|
ino_t res;
|
1985 |
|
|
|
1986 |
|
|
spin_lock(&dentry->d_lock);
|
1987 |
|
|
res = dentry->d_parent->d_inode->i_ino;
|
1988 |
|
|
spin_unlock(&dentry->d_lock);
|
1989 |
|
|
return res;
|
1990 |
|
|
}
|
1991 |
|
|
|
1992 |
|
|
/* kernel/fork.c */
|
1993 |
|
|
extern int unshare_files(void);
|
1994 |
|
|
|
1995 |
|
|
/* Transaction based IO helpers */
|
1996 |
|
|
|
1997 |
|
|
/*
|
1998 |
|
|
* An argresp is stored in an allocated page and holds the
|
1999 |
|
|
* size of the argument or response, along with its content
|
2000 |
|
|
*/
|
2001 |
|
|
struct simple_transaction_argresp {
|
2002 |
|
|
ssize_t size;
|
2003 |
|
|
char data[0];
|
2004 |
|
|
};
|
2005 |
|
|
|
2006 |
|
|
#define SIMPLE_TRANSACTION_LIMIT (PAGE_SIZE - sizeof(struct simple_transaction_argresp))
|
2007 |
|
|
|
2008 |
|
|
char *simple_transaction_get(struct file *file, const char __user *buf,
|
2009 |
|
|
size_t size);
|
2010 |
|
|
ssize_t simple_transaction_read(struct file *file, char __user *buf,
|
2011 |
|
|
size_t size, loff_t *pos);
|
2012 |
|
|
int simple_transaction_release(struct inode *inode, struct file *file);
|
2013 |
|
|
|
2014 |
|
|
static inline void simple_transaction_set(struct file *file, size_t n)
|
2015 |
|
|
{
|
2016 |
|
|
struct simple_transaction_argresp *ar = file->private_data;
|
2017 |
|
|
|
2018 |
|
|
BUG_ON(n > SIMPLE_TRANSACTION_LIMIT);
|
2019 |
|
|
|
2020 |
|
|
/*
|
2021 |
|
|
* The barrier ensures that ar->size will really remain zero until
|
2022 |
|
|
* ar->data is ready for reading.
|
2023 |
|
|
*/
|
2024 |
|
|
smp_mb();
|
2025 |
|
|
ar->size = n;
|
2026 |
|
|
}
|
2027 |
|
|
|
2028 |
|
|
/*
|
2029 |
|
|
* simple attribute files
|
2030 |
|
|
*
|
2031 |
|
|
* These attributes behave similar to those in sysfs:
|
2032 |
|
|
*
|
2033 |
|
|
* Writing to an attribute immediately sets a value, an open file can be
|
2034 |
|
|
* written to multiple times.
|
2035 |
|
|
*
|
2036 |
|
|
* Reading from an attribute creates a buffer from the value that might get
|
2037 |
|
|
* read with multiple read calls. When the attribute has been read
|
2038 |
|
|
* completely, no further read calls are possible until the file is opened
|
2039 |
|
|
* again.
|
2040 |
|
|
*
|
2041 |
|
|
* All attributes contain a text representation of a numeric value
|
2042 |
|
|
* that are accessed with the get() and set() functions.
|
2043 |
|
|
*/
|
2044 |
|
|
#define DEFINE_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt) \
|
2045 |
|
|
static int __fops ## _open(struct inode *inode, struct file *file) \
|
2046 |
|
|
{ \
|
2047 |
|
|
__simple_attr_check_format(__fmt, 0ull); \
|
2048 |
|
|
return simple_attr_open(inode, file, __get, __set, __fmt); \
|
2049 |
|
|
} \
|
2050 |
|
|
static struct file_operations __fops = { \
|
2051 |
|
|
.owner = THIS_MODULE, \
|
2052 |
|
|
.open = __fops ## _open, \
|
2053 |
|
|
.release = simple_attr_close, \
|
2054 |
|
|
.read = simple_attr_read, \
|
2055 |
|
|
.write = simple_attr_write, \
|
2056 |
|
|
};
|
2057 |
|
|
|
2058 |
|
|
static inline void __attribute__((format(printf, 1, 2)))
|
2059 |
|
|
__simple_attr_check_format(const char *fmt, ...)
|
2060 |
|
|
{
|
2061 |
|
|
/* don't do anything, just let the compiler check the arguments; */
|
2062 |
|
|
}
|
2063 |
|
|
|
2064 |
|
|
int simple_attr_open(struct inode *inode, struct file *file,
|
2065 |
|
|
u64 (*get)(void *), void (*set)(void *, u64),
|
2066 |
|
|
const char *fmt);
|
2067 |
|
|
int simple_attr_close(struct inode *inode, struct file *file);
|
2068 |
|
|
ssize_t simple_attr_read(struct file *file, char __user *buf,
|
2069 |
|
|
size_t len, loff_t *ppos);
|
2070 |
|
|
ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
2071 |
|
|
size_t len, loff_t *ppos);
|
2072 |
|
|
|
2073 |
|
|
|
2074 |
|
|
#ifdef CONFIG_SECURITY
|
2075 |
|
|
static inline char *alloc_secdata(void)
|
2076 |
|
|
{
|
2077 |
|
|
return (char *)get_zeroed_page(GFP_KERNEL);
|
2078 |
|
|
}
|
2079 |
|
|
|
2080 |
|
|
static inline void free_secdata(void *secdata)
|
2081 |
|
|
{
|
2082 |
|
|
free_page((unsigned long)secdata);
|
2083 |
|
|
}
|
2084 |
|
|
#else
|
2085 |
|
|
static inline char *alloc_secdata(void)
|
2086 |
|
|
{
|
2087 |
|
|
return (char *)1;
|
2088 |
|
|
}
|
2089 |
|
|
|
2090 |
|
|
static inline void free_secdata(void *secdata)
|
2091 |
|
|
{ }
|
2092 |
|
|
#endif /* CONFIG_SECURITY */
|
2093 |
|
|
|
2094 |
|
|
struct ctl_table;
|
2095 |
|
|
int proc_nr_files(struct ctl_table *table, int write, struct file *filp,
|
2096 |
|
|
void __user *buffer, size_t *lenp, loff_t *ppos);
|
2097 |
|
|
|
2098 |
|
|
|
2099 |
|
|
#endif /* __KERNEL__ */
|
2100 |
|
|
#endif /* _LINUX_FS_H */
|