Generic delete (CKRM RCFS rewrite)
Generic functions to delete files/directories. Use sane names and eliminate special
treatment of root directory entries.
Signed-off-by: Shailabh Nagar <[EMAIL PROTECTED]>
fs/rcfs/dir.c | 10 -----
fs/rcfs/inode.c | 90 +++++++++++++++++++++++++++++++++++++++------------
fs/rcfs/rootdir.c | 17 ---------
include/linux/rcfs.h | 5 +-
4 files changed, 72 insertions(+), 50 deletions(-)
Index: linux-2.6.12/fs/rcfs/dir.c
===================================================================
--- linux-2.6.12.orig/fs/rcfs/dir.c 2005-08-09 15:30:35.953434968 -0400
+++ linux-2.6.12/fs/rcfs/dir.c 2005-08-09 15:30:36.026423872 -0400
@@ -117,13 +117,3 @@ int rcfs_rmdir(struct inode *dir, struct
out:
return -EBUSY;
}
-
-int rcfs_unlink(struct inode *dir, struct dentry *dentry)
-{
- /*
- * -ENOENT and not -ENOPERM to allow rm -rf to work despite
- * magic files being present
- */
- return -ENOENT;
-}
-
Index: linux-2.6.12/fs/rcfs/inode.c
===================================================================
--- linux-2.6.12.orig/fs/rcfs/inode.c 2005-08-09 15:30:35.953434968 -0400
+++ linux-2.6.12/fs/rcfs/inode.c 2005-08-09 15:30:36.026423872 -0400
@@ -109,27 +109,6 @@ struct inode_operations rcfs_file_inode_
*/
int RCFS_IS_MAGIC;
-int rcfs_delete_internal(struct dentry *mfdentry)
-{
- struct dentry *parent;
-
- if (!mfdentry || !mfdentry->d_parent)
- return -EINVAL;
- parent = mfdentry->d_parent;
- if (!mfdentry->d_inode) {
- return 0;
- }
- down(&mfdentry->d_inode->i_sem);
- if (S_ISDIR(mfdentry->d_inode->i_mode))
- simple_rmdir(parent->d_inode, mfdentry);
- else
- simple_unlink(parent->d_inode, mfdentry);
- up(&mfdentry->d_inode->i_sem);
- d_delete(mfdentry);
-
- return 0;
-}
-
/******************************
*
* Generic inode/dentry helpers
@@ -364,6 +343,74 @@ exit:
return dentry;
}
+static int rcfs_unlink (struct inode *dir, struct dentry *dentry)
+{
+ struct inode *inode = dentry->d_inode;
+ down(&inode->i_sem);
+ dentry->d_inode->i_nlink--;
+ dput(dentry);
+ up(&inode->i_sem);
+ d_delete(dentry);
+ return 0;
+}
+
+int rcfs_rmdir(struct inode *dir, struct dentry *dentry)
+{
+ int error = -ENOTEMPTY;
+ struct inode * inode = dentry->d_inode;
+
+ down(&inode->i_sem);
+ rcfs_unhash(dentry);
+ if (rcfs_empty(dentry)) {
+ dentry->d_inode->i_nlink -= 2;
+ dput(dentry);
+ inode->i_flags |= S_DEAD;
+ dir->i_nlink--;
+ error = 0;
+ }
+ up(&inode->i_sem);
+ if (!error)
+ d_delete(dentry);
+ dput(dentry);
+ return error;
+}
+
+
+int __rcfs_destroy_file(struct dentry *dentry)
+{
+ struct dentry *parent = dentry->d_parent;
+ int rc;
+
+ rc = 0;
+ if (rcfs_positive(dentry)) {
+ if (dentry->d_inode) {
+ if (S_ISDIR(dentry->d_inode->i_mode))
+ rc = rcfs_rmdir(parent->d_inode, dentry);
+ else
+ rc = rcfs_unlink(parent->d_inode, dentry);
+ dput(dentry);
+ }
+ }
+
+ return rc;
+}
+
+
+int rcfs_destroy_file (struct dentry *dentry)
+{
+ struct dentry *parent = dentry->d_parent;
+ int rc;
+
+ if (!parent || !parent->d_inode)
+ return -EINVAL;
+
+ down(&parent->d_inode->i_sem);
+ rc = __rcfs_destroy_file(dentry);
+ up(&parent->d_inode->i_sem);
+
+ return rc;
+}
+
/* Fill inode name */
int rcfs_name(struct dentry *parent, struct inode *inode, char *name)
{
@@ -392,6 +439,7 @@ int rcfs_name(struct dentry *parent, str
}
+
static struct file_system_type rcfs_fs_type = {
.owner = THIS_MODULE,
.name = "rcfs",
Index: linux-2.6.12/fs/rcfs/rootdir.c
===================================================================
--- linux-2.6.12.orig/fs/rcfs/rootdir.c 2005-08-09 15:30:35.953434968 -0400
+++ linux-2.6.12/fs/rcfs/rootdir.c 2005-08-09 15:30:36.027423720 -0400
@@ -60,23 +60,6 @@ int rcfs_unregister_engine(struct rbce_e
EXPORT_SYMBOL_GPL(rcfs_unregister_engine);
-int rcfs_rmroot(struct dentry *rootde)
-{
- struct rcfs_inode_info *ri;
-
- if (!rootde)
- return -EINVAL;
-
- rcfs_clear_magic(rootde);
- ri = rcfs_get_inode_info(rootde->d_inode);
- kfree(ri->name);
- ri->name = NULL;
- rcfs_delete_internal(rootde);
- return 0;
-}
-
-EXPORT_SYMBOL_GPL(rcfs_rmroot);
-
int rcfs_register_classtype(struct ckrm_classtype * clstype)
{
int rc;
Index: linux-2.6.12/include/linux/rcfs.h
===================================================================
--- linux-2.6.12.orig/include/linux/rcfs.h 2005-08-09 15:30:35.953434968 -0400
+++ linux-2.6.12/include/linux/rcfs.h 2005-08-09 15:30:36.027423720 -0400
@@ -58,7 +58,6 @@ struct rcfs_mfdesc {
extern struct rcfs_mfdesc *genmfdesc[];
struct dentry *rcfs_set_magf_byname(char *, void *);
-int rcfs_delete_internal(struct dentry *);
int rcfs_create_magic(struct dentry *, struct rcfs_magf *, int);
int rcfs_clear_magic(struct dentry *);
@@ -77,7 +76,6 @@ extern struct file_operations rcfs_file_
int rcfs_register_classtype(struct ckrm_classtype *);
int rcfs_deregister_classtype(struct ckrm_classtype *);
-int rcfs_rmroot(struct dentry *);
#define RCFS_ROOT "/rcfs" /* TODO: Should use the mount point */
extern struct dentry *rcfs_rootde;
@@ -85,7 +83,10 @@ extern struct rbce_eng_callback rcfs_eng
/* Helper functions */
extern int rcfs_mkdir(struct inode *, struct dentry *, int);
+extern int rcfs_rmdir(struct inode *, struct dentry *);
extern struct dentry *rcfs_create_file(const char *, mode_t, struct dentry *, struct file_operations *, struct inode_operations *, void *);
+extern int __rcfs_destroy_file(struct dentry *);
+extern int rcfs_destroy_file(struct dentry *);
extern int rcfs_name(struct dentry *, struct inode *, char *);
extern int rcfs_create_noperm(struct inode *, struct dentry *, int , struct nameidata *);