static int ramfs_probe(struct device_d *dev) { struct ramfs_inode *n; struct ramfs_priv *priv = xzalloc(sizeof(struct ramfs_priv)); dev->priv = priv; priv->root.name = "/"; priv->root.mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO; priv->root.parent = &priv->root; n = ramfs_get_inode(); n->name = strdup("."); n->mode = S_IFDIR; n->parent = &priv->root; n->child = n; priv->root.child = n; n = ramfs_get_inode(); n->name = strdup(".."); n->mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO; n->parent = &priv->root; n->child = priv->root.child; priv->root.child->next = n; return 0; }
static struct ramfs_inode* node_insert(struct ramfs_inode *parent_node, const char *filename, ulong mode) { struct ramfs_inode *node, *new_node = ramfs_get_inode(); new_node->name = strdup(filename); new_node->mode = mode; node = parent_node->child; if (S_ISDIR(mode)) { struct ramfs_inode *n = ramfs_get_inode(); n->name = strdup("."); n->mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO; n->child = n; n->parent = new_node; new_node->child = n; n = ramfs_get_inode(); n->name = strdup(".."); n->mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO; n->parent = new_node; n->child = parent_node->child; new_node->child->next = n; } while (node->next) node = node->next; node->next = new_node; return new_node; }
int ramfs_fill_super(struct super_block *sb, void *data, int silent) { struct ramfs_fs_info *fsi; struct inode *inode; int err; save_mount_options(sb, data); fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL); sb->s_fs_info = fsi; if (!fsi) return -ENOMEM; err = ramfs_parse_options(data, &fsi->mount_opts); if (err) return err; sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_blocksize = PAGE_SIZE; sb->s_blocksize_bits = PAGE_SHIFT; sb->s_magic = RAMFS_MAGIC; sb->s_op = &ramfs_ops; sb->s_time_gran = 1; inode = ramfs_get_inode(sb, NULL, S_IFDIR | fsi->mount_opts.mode, 0); sb->s_root = d_make_root(inode); if (!sb->s_root) return -ENOMEM; return 0; }
/* * shmem_file_setup - get an unlinked file living in tmpfs * * @name: name for dentry (to be seen in /proc/<pid>/maps * @size: size to be set for the file * */ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) { int error; struct file *file; struct inode *inode; struct dentry *dentry, *root; struct qstr this; if (IS_ERR(shm_mnt)) return (void *)shm_mnt; error = -ENOMEM; this.name = name; this.len = strlen(name); this.hash = 0; /* will go */ root = shm_mnt->mnt_root; dentry = d_alloc(root, &this); if (!dentry) goto put_memory; error = -ENFILE; file = get_empty_filp(); if (!file) goto put_dentry; error = -ENOSPC; inode = ramfs_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0); if (!inode) goto close_file; d_instantiate(dentry, inode); inode->i_nlink = 0; /* It is unlinked */ file->f_path.mnt = mntget(shm_mnt); file->f_path.dentry = dentry; file->f_mapping = inode->i_mapping; file->f_op = &ramfs_file_operations; file->f_mode = FMODE_WRITE | FMODE_READ; /* notify everyone as to the change of file size */ error = do_truncate(dentry, size, 0, file); if (error < 0) goto close_file; return file; close_file: put_filp(file); put_dentry: dput(dentry); put_memory: return ERR_PTR(error); }
/* SMP-safe */ static int ramfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { struct inode * inode = ramfs_get_inode(dir->i_sb, dir, mode, dev); int error = -ENOSPC; if (inode) { d_instantiate(dentry, inode); dget(dentry); /* Extra count - pin the dentry in core */ error = 0; dir->i_mtime = dir->i_ctime = current_time(dir); } return error; }
static int ramfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { struct inode * inode = ramfs_get_inode(dir->i_sb, dir, mode, dev); int error = -ENOSPC; if (inode) { d_instantiate(dentry, inode); dget(dentry); /* */ error = 0; dir->i_mtime = dir->i_ctime = CURRENT_TIME; } return error; }
static int ramfs_mknod(struct inode *dir, struct dentry *dentry, int mode, int dev) { struct inode * inode = ramfs_get_inode(dir->i_sb, mode, dev); int error = -ENOSPC; if (inode) { dentry->d_inode = inode; atomic_set(&dentry->d_count,1); error = 0; } return error; }
static int ramfs_fill_super(struct super_block * sb, void * data, int silent) { struct ramfs_fs_info *fsi; struct inode *inode = NULL; struct dentry *root; int err; save_mount_options(sb, data); fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL); sb->s_fs_info = fsi; if (!fsi) { err = -ENOMEM; goto fail; } err = ramfs_parse_options(data, &fsi->mount_opts); if (err) goto fail; sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; sb->s_magic = RAMFS_MAGIC; sb->s_op = &ramfs_ops; sb->s_time_gran = 1; inode = ramfs_get_inode(sb, S_IFDIR | fsi->mount_opts.mode, 0); if (!inode) { err = -ENOMEM; goto fail; } root = d_alloc_root(inode); sb->s_root = root; if (!root) { err = -ENOMEM; goto fail; } return 0; fail: kfree(fsi); sb->s_fs_info = NULL; iput(inode); return err; }
static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname) { struct inode *inode; int error = -ENOSPC; inode = ramfs_get_inode(dir->i_sb, dir, S_IFLNK|S_IRWXUGO, 0); if (inode) { int l = strlen(symname)+1; error = page_symlink(inode, symname, l); if (!error) { d_instantiate(dentry, inode); dget(dentry); dir->i_mtime = dir->i_ctime = current_time(dir); } else iput(inode); } return error; }
/* SMP-safe */ static int ramfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) { struct inode * inode = ramfs_get_inode(dir->i_sb, mode, dev); int error = -ENOSPC; if (inode) { if (dir->i_mode & S_ISGID) { inode->i_gid = dir->i_gid; if (S_ISDIR(mode)) inode->i_mode |= S_ISGID; } d_instantiate(dentry, inode); dget(dentry); /* Extra count - pin the dentry in core */ error = 0; dir->i_mtime = dir->i_ctime = CURRENT_TIME; } return error; }
static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname) { struct inode *inode; int error = -ENOSPC; inode = ramfs_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0); if (inode) { int l = strlen(symname)+1; error = page_symlink(inode, symname, l); if (!error) { if (dir->i_mode & S_ISGID) inode->i_gid = dir->i_gid; d_instantiate(dentry, inode); dget(dentry); dir->i_mtime = dir->i_ctime = CURRENT_TIME; } else iput(inode); } return error; }
static int ramfs_fill_super(struct super_block * sb, void * data, int silent) { struct inode * inode; struct dentry * root; sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_blocksize = PAGE_CACHE_SIZE; sb->s_blocksize_bits = PAGE_CACHE_SHIFT; sb->s_magic = RAMFS_MAGIC; sb->s_op = &ramfs_ops; sb->s_time_gran = 1; inode = ramfs_get_inode(sb, S_IFDIR | 0755, 0); if (!inode) return -ENOMEM; root = d_alloc_root(inode); if (!root) { iput(inode); return -ENOMEM; } sb->s_root = root; return 0; }