This adds support for create, link, symlink, mkdir, mknod and rename, all of which are relatively simple to do based on the previous patches. Signed-off-by: Arnd Bergmann --- fs/cramfs/inode.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 78 insertions(+), 0 deletions(-) diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index e7d2b47..bcdd592 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c @@ -557,6 +557,78 @@ int cramfs_rmdir(struct inode *dir, struct dentry *dentry) } /* + * File creation. Allocate an inode, and we're done.. + */ +static int +cramfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) +{ + struct inode * inode = get_cramfs_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 cramfs_mkdir(struct inode * dir, struct dentry * dentry, int mode) +{ + return cramfs_mknod(dir, dentry, mode | S_IFDIR, 0); +} + +static int cramfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd) +{ + return cramfs_mknod(dir, dentry, mode | S_IFREG, 0); +} + +static int cramfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname) +{ + struct inode *inode; + int error = -ENOSPC; + + inode = get_cramfs_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; +} + +int cramfs_rename(struct inode *old_dir, struct dentry *old_dentry, + struct inode *new_dir, struct dentry *new_dentry) +{ + struct inode *inode = old_dentry->d_inode; + + if (!cramfs_empty(new_dentry)) + return -ENOTEMPTY; + + if (new_dentry->d_inode) + cramfs_unlink(new_dir, new_dentry); + + old_dir->i_ctime = old_dir->i_mtime = new_dir->i_ctime = + new_dir->i_mtime = inode->i_ctime = CURRENT_TIME; + + return 0; +} + + +/* * Lookup and fill in the inode data.. */ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) @@ -688,8 +760,14 @@ static const struct file_operations cramfs_directory_operations = { }; static const struct inode_operations cramfs_dir_inode_operations = { + .create = cramfs_create, + .link = simple_link, .unlink = cramfs_unlink, + .symlink = cramfs_symlink, + .mkdir = cramfs_mkdir, .rmdir = cramfs_rmdir, + .mknod = cramfs_mknod, + .rename = cramfs_rename, .lookup = cramfs_lookup, }; -- 1.5.4.3 -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/