summaryrefslogtreecommitdiffstats
path: root/fs/msdos
diff options
context:
space:
mode:
Diffstat (limited to 'fs/msdos')
-rw-r--r--fs/msdos/.cvsignore1
-rw-r--r--fs/msdos/msdosfs_syms.c1
-rw-r--r--fs/msdos/namei.c85
3 files changed, 28 insertions, 59 deletions
diff --git a/fs/msdos/.cvsignore b/fs/msdos/.cvsignore
index 4671378ae..857dd22e9 100644
--- a/fs/msdos/.cvsignore
+++ b/fs/msdos/.cvsignore
@@ -1 +1,2 @@
.depend
+.*.flags
diff --git a/fs/msdos/msdosfs_syms.c b/fs/msdos/msdosfs_syms.c
index c8b1e8092..874afdc54 100644
--- a/fs/msdos/msdosfs_syms.c
+++ b/fs/msdos/msdosfs_syms.c
@@ -5,7 +5,6 @@
* These symbols are used by umsdos.
*/
-#include <linux/config.h>
#include <linux/module.h>
#include <linux/mm.h>
diff --git a/fs/msdos/namei.c b/fs/msdos/namei.c
index 38f131d84..87c62e4c9 100644
--- a/fs/msdos/namei.c
+++ b/fs/msdos/namei.c
@@ -21,8 +21,7 @@
#include "../fat/msbuffer.h"
-#define MSDOS_PARANOIA 1
-/* #define MSDOS_DEBUG 1 */
+#define MSDOS_DEBUG 0
#define PRINTK(x)
/* MS-DOS "device special files" */
@@ -257,7 +256,7 @@ int msdos_lookup(struct inode *dir,struct dentry *dentry)
int ino,res;
struct msdos_dir_entry *de;
struct buffer_head *bh;
- struct inode *next, *inode;
+ struct inode *inode;
PRINTK (("msdos_lookup\n"));
@@ -294,20 +293,8 @@ int msdos_lookup(struct inode *dir,struct dentry *dentry)
return 0;
}
PRINTK (("msdos_lookup 6\n"));
- while (MSDOS_I(inode)->i_old) {
- next = MSDOS_I(inode)->i_old;
-#ifdef MSDOS_PARANOIA
-printk("msdos_lookup: ino %ld, old ino=%ld\n", inode->i_ino, next->i_ino);
-if (MSDOS_I(next)->i_depend != inode)
-printk("msdos_lookup: depend=%p, inode=%p??\n", MSDOS_I(next)->i_depend, inode);
-#endif
- next->i_count++;
- iput(inode);
- inode = next;
- }
- PRINTK (("msdos_lookup 7\n"));
d_add(dentry, inode);
- PRINTK (("msdos_lookup 8\n"));
+ PRINTK (("msdos_lookup 7\n"));
return 0;
}
@@ -428,6 +415,9 @@ static int msdos_empty(struct inode *dir)
pos = 0;
bh = NULL;
while (fat_get_entry(dir,&pos,&bh,&de) > -1) {
+ /* Ignore vfat longname entries */
+ if (de->attr == ATTR_EXT)
+ continue;
if (!IS_FREE(de->name) &&
strncmp(de->name,MSDOS_DOT , MSDOS_NAME) &&
strncmp(de->name,MSDOS_DOTDOT, MSDOS_NAME)) {
@@ -471,7 +461,7 @@ int msdos_rmdir(struct inode *dir, struct dentry *dentry)
res = -EBUSY;
if (dentry->d_count > 1) {
#ifdef MSDOS_DEBUG
-printk("rename_diff_dir: %s/%s busy, d_count=%d\n",
+printk("msdos_rmdir: %s/%s busy, d_count=%d\n",
dentry->d_parent->d_name.name, dentry->d_name.name, dentry->d_count);
#endif
goto rmdir_done;
@@ -744,53 +734,31 @@ static int rename_diff_dir(struct inode *old_dir,char *old_name,
mark_inode_dirty(new_dir);
}
msdos_read_inode(free_inode);
- /*
- * Check whether there's already a linked inode ...
- */
- if (MSDOS_I(old_inode)->i_linked) {
- struct inode *linked = MSDOS_I(old_inode)->i_linked;
-#ifdef MSDOS_PARANOIA
-printk("rename_diff_dir: inode %ld already has link %ld, freeing it\n",
-old_inode->i_ino, linked->i_ino);
-#endif
- MSDOS_I(old_inode)->i_linked = NULL;
- MSDOS_I(linked)->i_oldlink = NULL;
- iput(linked);
- }
- MSDOS_I(old_inode)->i_busy = 1;
- MSDOS_I(old_inode)->i_linked = free_inode;
- MSDOS_I(free_inode)->i_oldlink = old_inode;
-#ifdef MSDOS_DEBUG
-printk("rename_diff_dir: inode %ld added as link of %ld\n",
-free_inode->i_ino, old_inode->i_ino);
-#endif
+
+ free_inode->i_mode = old_inode->i_mode;
+ free_inode->i_size = old_inode->i_size;
+ free_inode->i_blocks = old_inode->i_blocks;
+ free_inode->i_mtime = old_inode->i_mtime;
+ free_inode->i_atime = old_inode->i_atime;
+ free_inode->i_ctime = old_inode->i_ctime;
+ MSDOS_I(free_inode)->i_ctime_ms = MSDOS_I(old_inode)->i_ctime_ms;
+
+ MSDOS_I(free_inode)->i_start = MSDOS_I(old_inode)->i_start;
+ MSDOS_I(free_inode)->i_logstart = MSDOS_I(old_inode)->i_logstart;
+ MSDOS_I(free_inode)->i_attrs = MSDOS_I(old_inode)->i_attrs;
+
+ /* Detach d_alias from old inode and attach to new inode */
+ list_del(&old_dentry->d_alias);
+ d_instantiate(old_dentry, free_inode);
+ iput(old_inode);
+
fat_cache_inval_inode(old_inode);
mark_inode_dirty(old_inode);
old_de->name[0] = DELETED_FLAG;
fat_mark_buffer_dirty(sb, old_bh, 1);
fat_mark_buffer_dirty(sb, free_bh, 1);
+
if (exists) {
- /*
- * Check whether there's already a depend inode ...
- */
- if (MSDOS_I(new_inode)->i_depend) {
- struct inode *depend = MSDOS_I(new_inode)->i_depend;
-#ifdef MSDOS_PARANOIA
-printk("rename_diff_dir: inode %ld already has depend %ld, freeing it\n",
-new_inode->i_ino, depend->i_ino);
-#endif
- MSDOS_I(new_inode)->i_depend = NULL;
- MSDOS_I(depend)->i_old = NULL;
- iput(depend);
- }
- MSDOS_I(new_inode)->i_depend = free_inode;
- MSDOS_I(free_inode)->i_old = new_inode;
- /* Two references now exist to free_inode so increase count */
- free_inode->i_count++;
-#ifdef MSDOS_DEBUG
-printk("rename_diff_dir: inode %ld added as depend of %ld\n",
-free_inode->i_ino, new_inode->i_ino);
-#endif
/* free_inode is put after putting new_inode and old_inode */
fat_brelse(sb, new_bh);
}
@@ -815,6 +783,7 @@ free_inode->i_ino, new_inode->i_ino);
iput(dotdot_inode);
fat_brelse(sb, dotdot_bh);
}
+
/* Update the dcache */
d_move(old_dentry, new_dentry);
error = 0;