4 * Copyright (C) Shailabh Nagar, IBM Corp. 2004
5 * Vivek Kashyap, IBM Corp. 2004
8 * Resource class filesystem (rcfs) forming the
9 * user interface to Class-based Kernel Resource Management (CKRM).
11 * Latest version, more details at http://ckrm.sf.net
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
25 * Parsing for shares added
29 #include <linux/module.h>
30 #include <linux/list.h>
32 #include <linux/namei.h>
33 #include <asm/namei.h>
34 #include <linux/namespace.h>
35 #include <linux/dcache.h>
36 #include <linux/seq_file.h>
37 #include <linux/pagemap.h>
38 #include <linux/highmem.h>
39 #include <linux/init.h>
40 #include <linux/string.h>
41 #include <linux/smp_lock.h>
42 #include <linux/backing-dev.h>
43 #include <linux/parser.h>
44 #include <asm/uaccess.h>
46 #include <linux/rcfs.h>
50 // Address of variable used as flag to indicate a magic file,
51 // ; value unimportant
55 struct inode *rcfs_get_inode(struct super_block *sb, int mode, dev_t dev)
57 struct inode * inode = new_inode(sb);
61 inode->i_uid = current->fsuid;
62 inode->i_gid = current->fsgid;
63 inode->i_blksize = PAGE_CACHE_SIZE;
65 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
66 switch (mode & S_IFMT) {
68 init_special_inode(inode, mode, dev);
71 // Treat as default assignment */
72 inode->i_op = &rcfs_file_inode_operations;
73 // inode->i_fop = &rcfs_file_operations;
76 // inode->i_op = &rcfs_dir_inode_operations;
77 inode->i_op = &rcfs_rootdir_inode_operations;
78 inode->i_fop = &simple_dir_operations;
80 // directory inodes start off with i_nlink == 2
86 inode->i_op = &page_symlink_inode_operations;
96 _rcfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
104 inode = rcfs_get_inode(dir->i_sb, mode, dev);
106 if (dir->i_mode & S_ISGID) {
107 inode->i_gid = dir->i_gid;
109 inode->i_mode |= S_ISGID;
111 d_instantiate(dentry, inode);
118 EXPORT_SYMBOL(_rcfs_mknod);
122 rcfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
124 // User can only create directories, not files
125 if ((mode & S_IFMT) != S_IFDIR)
128 return dir->i_op->mkdir(dir, dentry, mode);
130 EXPORT_SYMBOL(rcfs_mknod);
134 rcfs_create_internal(struct dentry *parent, struct rcfs_magf *magf, int magic)
137 struct dentry *mfdentry ;
139 // Get new dentry for name
140 qstr.name = magf->name;
141 qstr.len = strlen(magf->name);
142 qstr.hash = full_name_hash(magf->name,qstr.len);
143 mfdentry = lookup_hash(&qstr,parent);
145 if (!IS_ERR(mfdentry)) {
148 down(&parent->d_inode->i_sem);
149 if (magic && (magf->mode & S_IFDIR))
150 err = parent->d_inode->i_op->mkdir(parent->d_inode,
151 mfdentry, magf->mode);
153 err =_rcfs_mknod(parent->d_inode,mfdentry,
155 // _rcfs_mknod doesn't increment parent's link count,
157 parent->d_inode->i_nlink++;
159 up(&parent->d_inode->i_sem);
168 EXPORT_SYMBOL(rcfs_create_internal);
171 rcfs_delete_internal(struct dentry *mfdentry)
173 struct dentry *parent ;
175 if (!mfdentry || !mfdentry->d_parent)
178 parent = mfdentry->d_parent;
180 if (!mfdentry->d_inode) {
183 down(&mfdentry->d_inode->i_sem);
184 if (S_ISDIR(mfdentry->d_inode->i_mode))
185 simple_rmdir(parent->d_inode, mfdentry);
187 simple_unlink(parent->d_inode, mfdentry);
188 up(&mfdentry->d_inode->i_sem);
194 EXPORT_SYMBOL(rcfs_delete_internal);
196 struct inode_operations rcfs_file_inode_operations = {
197 .getattr = simple_getattr,