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
28 #include <linux/module.h>
29 #include <linux/list.h>
31 #include <linux/namei.h>
32 #include <linux/namespace.h>
33 #include <linux/dcache.h>
34 #include <linux/seq_file.h>
35 #include <linux/pagemap.h>
36 #include <linux/highmem.h>
37 #include <linux/init.h>
38 #include <linux/string.h>
39 #include <linux/smp_lock.h>
40 #include <linux/backing-dev.h>
41 #include <linux/parser.h>
42 #include <asm/uaccess.h>
44 #include <linux/rcfs.h>
46 // Address of variable used as flag to indicate a magic file,
47 // ; value unimportant
50 struct inode *rcfs_get_inode(struct super_block *sb, int mode, dev_t dev)
52 struct inode *inode = new_inode(sb);
56 inode->i_uid = current->fsuid;
57 inode->i_gid = current->fsgid;
58 inode->i_blksize = PAGE_CACHE_SIZE;
60 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
61 switch (mode & S_IFMT) {
63 init_special_inode(inode, mode, dev);
66 // Treat as default assignment */
67 inode->i_op = &rcfs_file_inode_operations;
68 // inode->i_fop = &rcfs_file_operations;
71 // inode->i_op = &rcfs_dir_inode_operations;
72 inode->i_op = &rcfs_rootdir_inode_operations;
73 inode->i_fop = &simple_dir_operations;
75 // directory inodes start off with i_nlink == 2
81 inode->i_op = &page_symlink_inode_operations;
88 int _rcfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
96 inode = rcfs_get_inode(dir->i_sb, mode, dev);
98 if (dir->i_mode & S_ISGID) {
99 inode->i_gid = dir->i_gid;
101 inode->i_mode |= S_ISGID;
103 d_instantiate(dentry, inode);
111 EXPORT_SYMBOL(_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(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,
147 // _rcfs_mknod doesn't increment parent's link count,
149 parent->d_inode->i_nlink++;
151 up(&parent->d_inode->i_sem);
161 EXPORT_SYMBOL(rcfs_create_internal);
163 int rcfs_delete_internal(struct dentry *mfdentry)
165 struct dentry *parent;
167 if (!mfdentry || !mfdentry->d_parent)
170 parent = mfdentry->d_parent;
172 if (!mfdentry->d_inode) {
175 down(&mfdentry->d_inode->i_sem);
176 if (S_ISDIR(mfdentry->d_inode->i_mode))
177 simple_rmdir(parent->d_inode, mfdentry);
179 simple_unlink(parent->d_inode, mfdentry);
180 up(&mfdentry->d_inode->i_sem);
187 EXPORT_SYMBOL(rcfs_delete_internal);
189 struct inode_operations rcfs_file_inode_operations = {
190 .getattr = simple_getattr,