diff options
Diffstat (limited to 'fs/coda')
-rw-r--r-- | fs/coda/dir.c | 21 | ||||
-rw-r--r-- | fs/coda/symlink.c | 7 |
2 files changed, 7 insertions, 21 deletions
diff --git a/fs/coda/dir.c b/fs/coda/dir.c index e074ca346..dc4734d0b 100644 --- a/fs/coda/dir.c +++ b/fs/coda/dir.c @@ -520,7 +520,7 @@ int coda_rmdir(struct inode *dir, struct dentry *de) struct coda_inode_info *dircnp; const char *name = de->d_name.name; int len = de->d_name.len; - int error, rehash = 0; + int error; ENTRY; coda_vfs_stat.rmdir++; @@ -535,24 +535,13 @@ int coda_rmdir(struct inode *dir, struct dentry *de) if (len > CFS_MAXNAMLEN) return -ENAMETOOLONG; - error = -EBUSY; - if (de->d_count > 1) { - /* Attempt to shrink child dentries ... */ - shrink_dcache_parent(de); - if (de->d_count > 1) - return error; - } - /* Drop the dentry to force a new lookup */ - if (!list_empty(&de->d_hash)) { - d_drop(de); - rehash = 1; - } + if (!list_empty(&de->d_hash)) + return -EBUSY; /* update i_nlink and free the inode before unlinking; if rmdir fails a new lookup set i_nlink right.*/ if (de->d_inode->i_nlink) de->d_inode->i_nlink --; - d_delete(de); error = venus_rmdir(dir->i_sb, &(dircnp->c_fid), name, len); @@ -561,10 +550,6 @@ int coda_rmdir(struct inode *dir, struct dentry *de) return error; } - if (rehash) - d_add(de, NULL); - /* XXX how can mtime be set? */ - return 0; } diff --git a/fs/coda/symlink.c b/fs/coda/symlink.c index eb2fe150d..f065c0270 100644 --- a/fs/coda/symlink.c +++ b/fs/coda/symlink.c @@ -26,7 +26,7 @@ #include <linux/coda_proc.h> static int coda_readlink(struct dentry *de, char *buffer, int length); -static struct dentry *coda_follow_link(struct dentry *, struct dentry *); +static struct dentry *coda_follow_link(struct dentry *, struct dentry *, unsigned int); struct inode_operations coda_symlink_inode_operations = { NULL, /* no file-operations */ @@ -86,7 +86,8 @@ static int coda_readlink(struct dentry *de, char *buffer, int length) } static struct dentry *coda_follow_link(struct dentry *de, - struct dentry *base) + struct dentry *base, + unsigned int follow) { struct inode *inode = de->d_inode; int error; @@ -116,7 +117,7 @@ static struct dentry *coda_follow_link(struct dentry *de, memcpy(path, mem, len); path[len] = 0; - base = lookup_dentry(path, base, 1); + base = lookup_dentry(path, base, follow); kfree(path); return base; } |