|
@@ -82,7 +82,7 @@ static int ncp_compare_dentry(const struct dentry *, const struct inode *,
|
|
|
unsigned int, const char *, const struct qstr *);
|
|
|
static int ncp_delete_dentry(const struct dentry *);
|
|
|
|
|
|
-static const struct dentry_operations ncp_dentry_operations =
|
|
|
+const struct dentry_operations ncp_dentry_operations =
|
|
|
{
|
|
|
.d_revalidate = ncp_lookup_validate,
|
|
|
.d_hash = ncp_hash_dentry,
|
|
@@ -90,14 +90,6 @@ static const struct dentry_operations ncp_dentry_operations =
|
|
|
.d_delete = ncp_delete_dentry,
|
|
|
};
|
|
|
|
|
|
-const struct dentry_operations ncp_root_dentry_operations =
|
|
|
-{
|
|
|
- .d_hash = ncp_hash_dentry,
|
|
|
- .d_compare = ncp_compare_dentry,
|
|
|
- .d_delete = ncp_delete_dentry,
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
#define ncp_namespace(i) (NCP_SERVER(i)->name_space[NCP_FINFO(i)->volNumber])
|
|
|
|
|
|
static inline int ncp_preserve_entry_case(struct inode *i, __u32 nscreator)
|
|
@@ -309,6 +301,9 @@ ncp_lookup_validate(struct dentry *dentry, struct nameidata *nd)
|
|
|
int res, val = 0, len;
|
|
|
__u8 __name[NCP_MAXPATHLEN + 1];
|
|
|
|
|
|
+ if (dentry == dentry->d_sb->s_root)
|
|
|
+ return 1;
|
|
|
+
|
|
|
if (nd->flags & LOOKUP_RCU)
|
|
|
return -ECHILD;
|
|
|
|
|
@@ -637,7 +632,6 @@ ncp_fill_cache(struct file *filp, void *dirent, filldir_t filldir,
|
|
|
entry->ino = iunique(dir->i_sb, 2);
|
|
|
inode = ncp_iget(dir->i_sb, entry);
|
|
|
if (inode) {
|
|
|
- d_set_d_op(newdent, &ncp_dentry_operations);
|
|
|
d_instantiate(newdent, inode);
|
|
|
if (!hashed)
|
|
|
d_rehash(newdent);
|
|
@@ -893,7 +887,6 @@ static struct dentry *ncp_lookup(struct inode *dir, struct dentry *dentry, struc
|
|
|
if (inode) {
|
|
|
ncp_new_dentry(dentry);
|
|
|
add_entry:
|
|
|
- d_set_d_op(dentry, &ncp_dentry_operations);
|
|
|
d_add(dentry, inode);
|
|
|
error = 0;
|
|
|
}
|