diff -urN ext4/balloc.c ext4sd/balloc.c
--- ext4/balloc.c	2006-10-22 21:36:26.000000000 -0400
+++ ext4sd/balloc.c	2006-10-22 21:35:41.000000000 -0400
@@ -19,6 +19,7 @@
 #include <linux/ext4_jbd2.h>
 #include <linux/quotaops.h>
 #include <linux/buffer_head.h>
+#include "secrm.h"
 
 /*
  * balloc.c contains the blocks allocation and deallocation routines
@@ -611,6 +612,12 @@
 		printk ("ext4_free_blocks: nonexistent device");
 		return;
 	}
+
+#ifdef CONFIG_EXT4DEV_FS_SECRM
+	if (EXT4_I(inode)->i_flags & EXT4_SECRM_FL)
+		ext4_secrm_blocks(handle, inode, block, count, 0);
+#endif
+
 	ext4_free_blocks_sb(handle, sb, block, count, &dquot_freed_blocks);
 	if (dquot_freed_blocks)
 		DQUOT_FREE_BLOCK(inode, dquot_freed_blocks);
diff -urN ext4/inode.c ext4sd/inode.c
--- ext4/inode.c	2006-10-22 21:36:26.000000000 -0400
+++ ext4sd/inode.c	2006-10-22 21:35:41.000000000 -0400
@@ -39,6 +39,7 @@
 #include <linux/bio.h>
 #include "xattr.h"
 #include "acl.h"
+#include "secrm.h"
 
 /*
  * Test whether an inode is a fast symlink.
@@ -203,6 +204,12 @@
 	inode->i_size = 0;
 	if (inode->i_blocks)
 		ext4_truncate(inode);
+
+#ifdef CONFIG_EXT4DEV_FS_SECRM
+	if (EXT4_I(inode)->i_flags & EXT4_SECRM_FL)
+		ext4_secrm_metadata(inode, 0);
+#endif
+
 	/*
 	 * Kill off the orphan record which ext4_truncate created.
 	 * AKPM: I think this can be inside the above `if'.
diff -urN ext4/namei.c ext4sd/namei.c
--- ext4/namei.c	2006-10-22 21:36:26.000000000 -0400
+++ ext4sd/namei.c	2006-10-22 21:35:41.000000000 -0400
@@ -41,6 +41,7 @@
 #include "namei.h"
 #include "xattr.h"
 #include "acl.h"
+#include "secrm.h"
 
 /*
  * define how far ahead to read directories while searching them.
@@ -2101,6 +2102,13 @@
 	retval = ext4_delete_entry(handle, dir, de, bh);
 	if (retval)
 		goto end_unlink;
+#ifdef CONFIG_EXT4DEV_FS_SECRM
+	if (EXT4_I(dentry->d_inode)->i_flags & EXT4_SECRM_FL) {
+		retval = ext4_secrm_dentry(de, bh, dentry, 0);
+		if (retval)
+			goto end_unlink;
+	}
+#endif
 	dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
 	ext4_update_dx_flag(dir);
 	ext4_mark_inode_dirty(handle, dir);
diff -urN ext4/secrm.c ext4sd/secrm.c
--- ext4/secrm.c	1969-12-31 19:00:00.000000000 -0500
+++ ext4sd/secrm.c	2006-10-22 21:35:41.000000000 -0400
@@ -0,0 +1,101 @@
+/*  linux/fs/ext3/secrm.c
+ *
+ * Copyright (C) 2006 Stony Brook University
+ *
+ */
+#include <linux/ext4_jbd2.h>
+#include "secrm.h"
+
+int ext4_secrm_dentry(struct ext4_dir_entry_2 *de, struct buffer_head *bh, 
+			struct dentry *dentry, char ovwt_value)
+{
+        int retval;
+	retval = -EBUSY;
+
+	get_bh(bh);
+	lock_buffer(bh);
+
+	memset(de->name, ovwt_value, de->name_len);
+	mark_buffer_dirty(bh);
+
+	unlock_buffer(bh);
+
+	retval = 0;
+	put_bh(bh);
+	return retval;
+}
+
+int ext4_secrm_metadata(struct inode *inode, int ovwt_value)
+{
+        int retval = 0;
+
+        inode->i_uid = ovwt_value;
+        inode->i_gid = ovwt_value;
+        inode->i_atime.tv_sec = ovwt_value;
+        inode->i_atime.tv_nsec = ovwt_value;
+        inode->i_mtime.tv_sec = ovwt_value;
+        inode->i_mtime.tv_nsec = ovwt_value;
+        inode->i_ctime.tv_sec = ovwt_value;
+        inode->i_ctime.tv_nsec = ovwt_value;
+        inode->i_size = ovwt_value;
+        inode->i_mode = ovwt_value;
+
+        return retval;
+}
+
+int ext4_secrm_blocks(handle_t *handle, struct inode *inode,
+		ext4_fsblk_t block, unsigned long count, char ovwt_value)
+{
+	int retval = 0;
+	ext4_fsblk_t i;
+	struct buffer_head *bh = NULL;	
+	struct super_block *sb = NULL;
+
+	sb = inode->i_sb;
+
+	if (ext4_should_journal_data(inode))
+		retval = ext4_journal_extend(handle, count);
+
+	if (retval)
+		goto block_out;
+
+	for (i = block; i < block + count; i++) {
+
+		bh = sb_getblk(sb, i);
+
+		if (ext4_should_journal_data(inode)) {
+			retval = ext4_journal_get_write_access(handle, bh);
+			if (retval)
+				goto block_out;
+		}
+
+		lock_buffer(bh);
+		memset( bh->b_data, ovwt_value, bh->b_size );
+		unlock_buffer(bh);
+
+		if (ext4_should_journal_data(inode)) {
+			retval = ext4_journal_dirty_metadata(handle, bh);
+			if (retval)
+				goto block_out;
+		}
+
+		if (ext4_should_order_data(inode)) {
+			retval = ext4_journal_dirty_data(handle, bh);
+			if (retval)
+				goto block_out;
+		}
+
+		if (retval)
+			goto block_out;
+
+		mark_buffer_dirty(bh);
+		set_buffer_jbddirty(bh);
+		brelse(bh);
+	}
+	bh = NULL;
+block_out:
+	if (bh)
+		brelse(bh);
+	return retval;
+}
+
diff -urN ext4/secrm.h ext4sd/secrm.h
--- ext4/secrm.h	1969-12-31 19:00:00.000000000 -0500
+++ ext4sd/secrm.h	2006-10-22 21:35:41.000000000 -0400
@@ -0,0 +1,10 @@
+/*  linux/fs/ext3/secdel.h
+ *
+ * Copyright (C) 2006 Stony Brook University
+ *
+ */
+extern int ext4_secrm_dentry(struct ext4_dir_entry_2 *, struct buffer_head *,
+				struct dentry *, char);
+extern int ext4_secrm_blocks(handle_t *, struct inode *, ext4_fsblk_t, 
+				unsigned long, char);
+extern int ext4_secrm_metadata(struct inode *, int);
