4 * Copyright (C) Shailabh Nagar, IBM Corp. 2004
5 * Vivek Kashyap, IBM Corp. 2004
7 * Resource class filesystem (rcfs) forming the
8 * user interface to Class-based Kernel Resource Management (CKRM).
10 * Latest version, more details at http://ckrm.sf.net
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
24 * Parsing for shares added
27 #include <linux/module.h>
28 #include <linux/list.h>
30 #include <linux/namei.h>
31 #include <linux/namespace.h>
32 #include <linux/dcache.h>
33 #include <linux/seq_file.h>
34 #include <linux/pagemap.h>
35 #include <linux/highmem.h>
36 #include <linux/init.h>
37 #include <linux/string.h>
38 #include <linux/smp_lock.h>
39 #include <linux/backing-dev.h>
40 #include <linux/parser.h>
41 #include <asm/uaccess.h>
43 #include <linux/rcfs.h>
46 * Address of variable used as flag to indicate a magic file,
51 struct inode *rcfs_get_inode(struct super_block *sb, int mode, dev_t dev)
53 struct inode *inode = new_inode(sb);
57 inode->i_uid = current->fsuid;
58 inode->i_gid = current->fsgid;
59 inode->i_blksize = PAGE_CACHE_SIZE;
61 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
62 switch (mode & S_IFMT) {
64 init_special_inode(inode, mode, dev);
67 /* Treat as default assignment */
68 inode->i_op = &rcfs_file_inode_operations;
69 /* inode->i_fop = &rcfs_file_operations; */
72 /* inode->i_op = &rcfs_dir_inode_operations; */
73 inode->i_op = &rcfs_rootdir_inode_operations;
74 inode->i_fop = &simple_dir_operations;
77 * directory inodes start off with i_nlink == 2
83 inode->i_op = &page_symlink_inode_operations;
90 int _rcfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
97 inode = rcfs_get_inode(dir->i_sb, mode, dev);
99 if (dir->i_mode & S_ISGID) {
100 inode->i_gid = dir->i_gid;
102 inode->i_mode |= S_ISGID;
104 d_instantiate(dentry, inode);
111 EXPORT_SYMBOL_GPL(_rcfs_mknod);
113 int rcfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
115 /* User can only create directories, not files */
116 if ((mode & S_IFMT) != S_IFDIR)
119 return dir->i_op->mkdir(dir, dentry, mode);
122 EXPORT_SYMBOL_GPL(rcfs_mknod);
124 struct dentry *rcfs_create_internal(struct dentry *parent,
125 struct rcfs_magf *magf, int magic)
128 struct dentry *mfdentry;
130 /* Get new dentry for name */
131 qstr.name = magf->name;
132 qstr.len = strlen(magf->name);
133 qstr.hash = full_name_hash(magf->name, qstr.len);
134 mfdentry = lookup_hash(&qstr, parent);
136 if (!IS_ERR(mfdentry)) {
139 down(&parent->d_inode->i_sem);
140 if (magic && (magf->mode & S_IFDIR))
141 err = parent->d_inode->i_op->mkdir(parent->d_inode,
145 err = _rcfs_mknod(parent->d_inode, mfdentry,
148 * _rcfs_mknod doesn't increment parent's link count,
151 parent->d_inode->i_nlink++;
153 up(&parent->d_inode->i_sem);
162 EXPORT_SYMBOL_GPL(rcfs_create_internal);
164 int rcfs_delete_internal(struct dentry *mfdentry)
166 struct dentry *parent;
168 if (!mfdentry || !mfdentry->d_parent)
170 parent = mfdentry->d_parent;
171 if (!mfdentry->d_inode) {
174 down(&mfdentry->d_inode->i_sem);
175 if (S_ISDIR(mfdentry->d_inode->i_mode))
176 simple_rmdir(parent->d_inode, mfdentry);
178 simple_unlink(parent->d_inode, mfdentry);
179 up(&mfdentry->d_inode->i_sem);
185 EXPORT_SYMBOL_GPL(rcfs_delete_internal);
187 struct inode_operations rcfs_file_inode_operations = {
188 .getattr = simple_getattr,