1 /* 2 * fs/anon_inodes.c 3 * 4 * Copyright (C) 2007 Davide Libenzi <davidel@xmailserver.org> 5 * 6 * Thanks to Arnd Bergmann for code review and suggestions. 7 * More changes for Thomas Gleixner suggestions. 8 * 9 */ 10 11 #include <linux/cred.h> 12 #include <linux/file.h> 13 #include <linux/poll.h> 14 #include <linux/sched.h> 15 #include <linux/slab.h> 16 #include <linux/init.h> 17 #include <linux/fs.h> 18 #include <linux/mount.h> 19 #include <linux/module.h> 20 #include <linux/kernel.h> 21 #include <linux/magic.h> 22 #include <linux/anon_inodes.h> 23 24 #include <asm/uaccess.h> 25 26 static struct vfsmount *anon_inode_mnt __read_mostly; 27 static struct inode *anon_inode_inode; 28 static const struct file_operations anon_inode_fops; 29 30 static int anon_inodefs_get_sb(struct file_system_type *fs_type, int flags, 31 const char *dev_name, void *data, 32 struct vfsmount *mnt) 33 { 34 return get_sb_pseudo(fs_type, "anon_inode:", NULL, ANON_INODE_FS_MAGIC, 35 mnt); 36 } 37 38 /* 39 * anon_inodefs_dname() is called from d_path(). 40 */ 41 static char *anon_inodefs_dname(struct dentry *dentry, char *buffer, int buflen) 42 { 43 return dynamic_dname(dentry, buffer, buflen, "anon_inode:%s", 44 dentry->d_name.name); 45 } 46 47 static struct file_system_type anon_inode_fs_type = { 48 .name = "anon_inodefs", 49 .get_sb = anon_inodefs_get_sb, 50 .kill_sb = kill_anon_super, 51 }; 52 static const struct dentry_operations anon_inodefs_dentry_operations = { 53 .d_dname = anon_inodefs_dname, 54 }; 55 56 /* 57 * nop .set_page_dirty method so that people can use .page_mkwrite on 58 * anon inodes. 59 */ 60 static int anon_set_page_dirty(struct page *page) 61 { 62 return 0; 63 }; 64 65 static const struct address_space_operations anon_aops = { 66 .set_page_dirty = anon_set_page_dirty, 67 }; 68 69 /** 70 * anon_inode_getfd - creates a new file instance by hooking it up to an 71 * anonymous inode, and a dentry that describe the "class" 72 * of the file 73 * 74 * @name: [in] name of the "class" of the new file 75 * @fops: [in] file operations for the new file 76 * @priv: [in] private data for the new file (will be file's private_data) 77 * @flags: [in] flags 78 * 79 * Creates a new file by hooking it on a single inode. This is useful for files 80 * that do not need to have a full-fledged inode in order to operate correctly. 81 * All the files created with anon_inode_getfile() will share a single inode, 82 * hence saving memory and avoiding code duplication for the file/inode/dentry 83 * setup. Returns the newly created file* or an error pointer. 84 */ 85 struct file *anon_inode_getfile(const char *name, 86 const struct file_operations *fops, 87 void *priv, int flags) 88 { 89 struct qstr this; 90 struct path path; 91 struct file *file; 92 int error; 93 94 if (IS_ERR(anon_inode_inode)) 95 return ERR_PTR(-ENODEV); 96 97 if (fops->owner && !try_module_get(fops->owner)) 98 return ERR_PTR(-ENOENT); 99 100 /* 101 * Link the inode to a directory entry by creating a unique name 102 * using the inode sequence number. 103 */ 104 error = -ENOMEM; 105 this.name = name; 106 this.len = strlen(name); 107 this.hash = 0; 108 path.dentry = d_alloc(anon_inode_mnt->mnt_sb->s_root, &this); 109 if (!path.dentry) 110 goto err_module; 111 112 path.mnt = mntget(anon_inode_mnt); 113 /* 114 * We know the anon_inode inode count is always greater than zero, 115 * so we can avoid doing an igrab() and we can use an open-coded 116 * atomic_inc(). 117 */ 118 atomic_inc(&anon_inode_inode->i_count); 119 120 path.dentry->d_op = &anon_inodefs_dentry_operations; 121 d_instantiate(path.dentry, anon_inode_inode); 122 123 error = -ENFILE; 124 file = alloc_file(&path, OPEN_FMODE(flags), fops); 125 if (!file) 126 goto err_dput; 127 file->f_mapping = anon_inode_inode->i_mapping; 128 129 file->f_pos = 0; 130 file->f_flags = flags & (O_ACCMODE | O_NONBLOCK); 131 file->f_version = 0; 132 file->private_data = priv; 133 134 return file; 135 136 err_dput: 137 path_put(&path); 138 err_module: 139 module_put(fops->owner); 140 return ERR_PTR(error); 141 } 142 EXPORT_SYMBOL_GPL(anon_inode_getfile); 143 144 /** 145 * anon_inode_getfd - creates a new file instance by hooking it up to an 146 * anonymous inode, and a dentry that describe the "class" 147 * of the file 148 * 149 * @name: [in] name of the "class" of the new file 150 * @fops: [in] file operations for the new file 151 * @priv: [in] private data for the new file (will be file's private_data) 152 * @flags: [in] flags 153 * 154 * Creates a new file by hooking it on a single inode. This is useful for files 155 * that do not need to have a full-fledged inode in order to operate correctly. 156 * All the files created with anon_inode_getfd() will share a single inode, 157 * hence saving memory and avoiding code duplication for the file/inode/dentry 158 * setup. Returns new descriptor or an error code. 159 */ 160 int anon_inode_getfd(const char *name, const struct file_operations *fops, 161 void *priv, int flags) 162 { 163 int error, fd; 164 struct file *file; 165 166 error = get_unused_fd_flags(flags); 167 if (error < 0) 168 return error; 169 fd = error; 170 171 file = anon_inode_getfile(name, fops, priv, flags); 172 if (IS_ERR(file)) { 173 error = PTR_ERR(file); 174 goto err_put_unused_fd; 175 } 176 fd_install(fd, file); 177 178 return fd; 179 180 err_put_unused_fd: 181 put_unused_fd(fd); 182 return error; 183 } 184 EXPORT_SYMBOL_GPL(anon_inode_getfd); 185 186 /* 187 * A single inode exists for all anon_inode files. Contrary to pipes, 188 * anon_inode inodes have no associated per-instance data, so we need 189 * only allocate one of them. 190 */ 191 static struct inode *anon_inode_mkinode(void) 192 { 193 struct inode *inode = new_inode(anon_inode_mnt->mnt_sb); 194 195 if (!inode) 196 return ERR_PTR(-ENOMEM); 197 198 inode->i_fop = &anon_inode_fops; 199 200 inode->i_mapping->a_ops = &anon_aops; 201 202 /* 203 * Mark the inode dirty from the very beginning, 204 * that way it will never be moved to the dirty 205 * list because mark_inode_dirty() will think 206 * that it already _is_ on the dirty list. 207 */ 208 inode->i_state = I_DIRTY; 209 inode->i_mode = S_IRUSR | S_IWUSR; 210 inode->i_uid = current_fsuid(); 211 inode->i_gid = current_fsgid(); 212 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; 213 return inode; 214 } 215 216 static int __init anon_inode_init(void) 217 { 218 int error; 219 220 error = register_filesystem(&anon_inode_fs_type); 221 if (error) 222 goto err_exit; 223 anon_inode_mnt = kern_mount(&anon_inode_fs_type); 224 if (IS_ERR(anon_inode_mnt)) { 225 error = PTR_ERR(anon_inode_mnt); 226 goto err_unregister_filesystem; 227 } 228 anon_inode_inode = anon_inode_mkinode(); 229 if (IS_ERR(anon_inode_inode)) { 230 error = PTR_ERR(anon_inode_inode); 231 goto err_mntput; 232 } 233 234 return 0; 235 236 err_mntput: 237 mntput(anon_inode_mnt); 238 err_unregister_filesystem: 239 unregister_filesystem(&anon_inode_fs_type); 240 err_exit: 241 panic(KERN_ERR "anon_inode_init() failed (%d)\n", error); 242 } 243 244 fs_initcall(anon_inode_init); 245 246