On Sun, Dec 7, 2008 at 1:06 AM, Daniel Phillips <[EMAIL PROTECTED]> wrote:
> Well, tux3_rename and tux3_rmdir look plausible, but tux_add_link is a
> cut and paste of tux_create_entry.  You should be able to write it as a
> call to the original tux_create_entry.
>
> Regards,
>
> Daniel
>

I see what you mean. Attached is another patch with less code duplication.

Cheers,
Michael Pattrick
diff -r 714c3fe139b4 user/kernel/namei.c
--- a/user/kernel/namei.c	Sun Dec 07 20:33:12 2008 +0900
+++ b/user/kernel/namei.c	Sun Dec 07 13:30:08 2008 -0500
@@ -115,6 +115,78 @@
 	return err;
 }
 
+static int tux3_rename (struct inode *old_dir, struct dentry *old_dentry,
+			struct inode *new_dir, struct dentry *new_dentry)
+{
+	struct inode *old_inode = old_dentry->d_inode;
+	struct inode *new_inode = new_dentry->d_inode;
+	struct buffer_head *old_buffer, * new_buffer;
+	tux_dirent *old_de, *new_de=NULL;
+
+	int err = -ENOENT;
+	old_de =tux_find_entry (old_dir, old_dentry->d_name.name, 
+				old_dentry->d_name.len, &old_buffer);
+	if (!old_de)
+		goto out;
+
+	if (new_inode) {
+		err = -ENOTEMPTY;
+		if (!tux_dir_is_empty (new_inode))
+			goto out;
+
+		err = -ENOENT;
+		new_de = tux_find_entry (new_dir, new_dentry->d_name.name,
+					 new_dentry->d_name.len, &new_buffer);
+		if (!new_de)
+			goto out;
+
+		if (tux_delete_entry (new_buffer, new_de)<0)
+			goto out;
+		
+		new_inode->i_ctime = new_dentry->d_parent->d_inode->i_ctime;
+		inode_dec_link_count(new_inode);
+		err = tux_create_entry(new_dentry->d_parent->d_inode, 
+			new_dentry->d_name.name, new_dentry->d_name.len, 
+			tux_inode(old_inode)->inum, old_inode->i_mode);
+
+		if (err<0)
+			goto out;
+
+	}else{
+		inode_inc_link_count(old_inode);
+		err = tux_add_dirent(new_dentry->d_parent->d_inode,new_dentry,old_inode);
+		if (err<0) {
+			inode_dec_link_count(old_inode);
+			goto out;
+		}
+	}
+	old_inode->i_ctime = CURRENT_TIME_SEC;
+	tux_delete_entry (old_buffer, old_de);
+	inode_dec_link_count(old_inode);
+out:
+	return err;
+}
+
+static int tux3_rmdir (struct inode *dir, struct dentry *dentry)
+{
+	struct inode *inode = dentry->d_inode;
+	int err = -ENOTEMPTY;
+	struct buffer_head *buffer;
+	tux_dirent *de;
+	if (tux_dir_is_empty(inode)) {
+		de = tux_find_entry (dir, dentry->d_name.name, 
+			dentry->d_name.len, &buffer);
+		err = tux_delete_entry (buffer, de);
+
+		if (!err) {
+			inode->i_size = 0;
+			inode_dec_link_count(inode);
+			inode_dec_link_count(dir);
+		}
+	}
+	return err;
+}
+
 const struct file_operations tux_dir_fops = {
 	.llseek		= generic_file_llseek,
 	.read		= generic_read_dir,
@@ -128,9 +200,9 @@
 	.unlink		= tux3_unlink,
 	.symlink	= tux3_symlink,
 	.mkdir		= tux3_mkdir,
-//	.rmdir		= ext3_rmdir,
+	.rmdir		= tux3_rmdir,
 //	.mknod		= ext3_mknod,
-//	.rename		= ext3_rename,
+	.rename		= tux3_rename,
 //	.setattr	= ext3_setattr,
 //	.setxattr	= generic_setxattr,
 //	.getxattr	= generic_getxattr,
diff -r 714c3fe139b4 user/kernel/tux3.h
--- a/user/kernel/tux3.h	Sun Dec 07 20:33:12 2008 +0900
+++ b/user/kernel/tux3.h	Sun Dec 07 13:30:08 2008 -0500
@@ -651,6 +651,7 @@
 loff_t tux_create_entry(struct inode *dir, const char *name, int len, inum_t inum, unsigned mode);
 int tux_delete_entry(struct buffer_head *buffer, tux_dirent *entry);
 int tux_readdir(struct file *file, void *state, filldir_t filldir);
+int tux_dir_is_empty(struct inode *dir);
 extern const struct file_operations tux_dir_fops;
 extern const struct inode_operations tux_dir_iops;
 
_______________________________________________
Tux3 mailing list
[email protected]
http://mailman.tux3.org/cgi-bin/mailman/listinfo/tux3

Reply via email to