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 *);

Reply via email to