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