patch-2_6_7-vs1_9_1_12
[linux-2.6.git] / fs / ramfs / inode.c
1 /*
2  * Resizable simple ram filesystem for Linux.
3  *
4  * Copyright (C) 2000 Linus Torvalds.
5  *               2000 Transmeta Corp.
6  *
7  * Usage limits added by David Gibson, Linuxcare Australia.
8  * This file is released under the GPL.
9  */
10
11 /*
12  * NOTE! This filesystem is probably most useful
13  * not as a real filesystem, but as an example of
14  * how virtual filesystems can be written.
15  *
16  * It doesn't get much simpler than this. Consider
17  * that this file implements the full semantics of
18  * a POSIX-compliant read-write filesystem.
19  *
20  * Note in particular how the filesystem does not
21  * need to implement any data structures of its own
22  * to keep track of the virtual data: using the VFS
23  * caches is sufficient.
24  */
25
26 #include <linux/module.h>
27 #include <linux/fs.h>
28 #include <linux/pagemap.h>
29 #include <linux/highmem.h>
30 #include <linux/init.h>
31 #include <linux/string.h>
32 #include <linux/smp_lock.h>
33 #include <linux/backing-dev.h>
34
35 #include <asm/uaccess.h>
36
37 /* some random number */
38 #define RAMFS_MAGIC     0x858458f6
39
40 static struct super_operations ramfs_ops;
41 static struct address_space_operations ramfs_aops;
42 static struct file_operations ramfs_file_operations;
43 static struct inode_operations ramfs_file_inode_operations;
44 static struct inode_operations ramfs_dir_inode_operations;
45
46 static struct backing_dev_info ramfs_backing_dev_info = {
47         .ra_pages       = 0,    /* No readahead */
48         .memory_backed  = 1,    /* Does not contribute to dirty memory */
49 };
50
51 static struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev)
52 {
53         struct inode * inode = new_inode(sb);
54
55         if (inode) {
56                 inode->i_mode = mode;
57                 inode->i_uid = current->fsuid;
58                 inode->i_gid = current->fsgid;
59                 inode->i_blksize = PAGE_CACHE_SIZE;
60                 inode->i_blocks = 0;
61                 inode->i_mapping->a_ops = &ramfs_aops;
62                 inode->i_mapping->backing_dev_info = &ramfs_backing_dev_info;
63                 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
64                 switch (mode & S_IFMT) {
65                 default:
66                         init_special_inode(inode, mode, dev);
67                         break;
68                 case S_IFREG:
69                         inode->i_op = &ramfs_file_inode_operations;
70                         inode->i_fop = &ramfs_file_operations;
71                         break;
72                 case S_IFDIR:
73                         inode->i_op = &ramfs_dir_inode_operations;
74                         inode->i_fop = &simple_dir_operations;
75
76                         /* directory inodes start off with i_nlink == 2 (for "." entry) */
77                         inode->i_nlink++;
78                         break;
79                 case S_IFLNK:
80                         inode->i_op = &page_symlink_inode_operations;
81                         break;
82                 }
83         }
84         return inode;
85 }
86
87 /*
88  * File creation. Allocate an inode, and we're done..
89  */
90 /* SMP-safe */
91 static int
92 ramfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
93 {
94         struct inode * inode = ramfs_get_inode(dir->i_sb, mode, dev);
95         int error = -ENOSPC;
96
97         if (inode) {
98                 if (dir->i_mode & S_ISGID) {
99                         inode->i_gid = dir->i_gid;
100                         if (S_ISDIR(mode))
101                                 inode->i_mode |= S_ISGID;
102                 }
103                 d_instantiate(dentry, inode);
104                 dget(dentry);   /* Extra count - pin the dentry in core */
105                 error = 0;
106         }
107         return error;
108 }
109
110 static int ramfs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
111 {
112         int retval = ramfs_mknod(dir, dentry, mode | S_IFDIR, 0);
113         if (!retval)
114                 dir->i_nlink++;
115         return retval;
116 }
117
118 static int ramfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
119 {
120         return ramfs_mknod(dir, dentry, mode | S_IFREG, 0);
121 }
122
123 static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname)
124 {
125         struct inode *inode;
126         int error = -ENOSPC;
127
128         inode = ramfs_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0);
129         if (inode) {
130                 int l = strlen(symname)+1;
131                 error = page_symlink(inode, symname, l);
132                 if (!error) {
133                         if (dir->i_mode & S_ISGID)
134                                 inode->i_gid = dir->i_gid;
135                         d_instantiate(dentry, inode);
136                         dget(dentry);
137                 } else
138                         iput(inode);
139         }
140         return error;
141 }
142
143 static struct address_space_operations ramfs_aops = {
144         .readpage       = simple_readpage,
145         .prepare_write  = simple_prepare_write,
146         .commit_write   = simple_commit_write
147 };
148
149 static struct file_operations ramfs_file_operations = {
150         .read           = generic_file_read,
151         .write          = generic_file_write,
152         .mmap           = generic_file_mmap,
153         .fsync          = simple_sync_file,
154         .sendfile       = generic_file_sendfile,
155         .llseek         = generic_file_llseek,
156 };
157
158 static struct inode_operations ramfs_file_inode_operations = {
159         .getattr        = simple_getattr,
160 };
161
162 static struct inode_operations ramfs_dir_inode_operations = {
163         .create         = ramfs_create,
164         .lookup         = simple_lookup,
165         .link           = simple_link,
166         .unlink         = simple_unlink,
167         .symlink        = ramfs_symlink,
168         .mkdir          = ramfs_mkdir,
169         .rmdir          = simple_rmdir,
170         .mknod          = ramfs_mknod,
171         .rename         = simple_rename,
172 };
173
174 static struct super_operations ramfs_ops = {
175         .statfs         = simple_statfs,
176         .drop_inode     = generic_delete_inode,
177 };
178
179 static int ramfs_fill_super(struct super_block * sb, void * data, int silent)
180 {
181         struct inode * inode;
182         struct dentry * root;
183
184         sb->s_maxbytes = MAX_LFS_FILESIZE;
185         sb->s_blocksize = PAGE_CACHE_SIZE;
186         sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
187         sb->s_magic = RAMFS_MAGIC;
188         sb->s_op = &ramfs_ops;
189         inode = ramfs_get_inode(sb, S_IFDIR | 0755, 0);
190         if (!inode)
191                 return -ENOMEM;
192
193         root = d_alloc_root(inode);
194         if (!root) {
195                 iput(inode);
196                 return -ENOMEM;
197         }
198         sb->s_root = root;
199         return 0;
200 }
201
202 static struct super_block *ramfs_get_sb(struct file_system_type *fs_type,
203         int flags, const char *dev_name, void *data)
204 {
205         return get_sb_nodev(fs_type, flags, data, ramfs_fill_super);
206 }
207
208 static struct super_block *rootfs_get_sb(struct file_system_type *fs_type,
209         int flags, const char *dev_name, void *data)
210 {
211         return get_sb_nodev(fs_type, flags|MS_NOUSER, data, ramfs_fill_super);
212 }
213
214 static struct file_system_type ramfs_fs_type = {
215         .name           = "ramfs",
216         .get_sb         = ramfs_get_sb,
217         .kill_sb        = kill_litter_super,
218 };
219 static struct file_system_type rootfs_fs_type = {
220         .name           = "rootfs",
221         .get_sb         = rootfs_get_sb,
222         .kill_sb        = kill_litter_super,
223 };
224
225 static int __init init_ramfs_fs(void)
226 {
227         return register_filesystem(&ramfs_fs_type);
228 }
229
230 static void __exit exit_ramfs_fs(void)
231 {
232         unregister_filesystem(&ramfs_fs_type);
233 }
234
235 module_init(init_ramfs_fs)
236 module_exit(exit_ramfs_fs)
237
238 int __init init_rootfs(void)
239 {
240         return register_filesystem(&rootfs_fs_type);
241 }
242
243 MODULE_LICENSE("GPL");