Commit ed36f723 authored by Jan Harkes's avatar Jan Harkes Committed by Linus Torvalds

coda: cleanup coda_lookup, use dsplice_alias

Signed-off-by: default avatarJan Harkes <jaharkes@cs.cmu.edu>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 970648eb
...@@ -97,58 +97,45 @@ const struct file_operations coda_dir_operations = { ...@@ -97,58 +97,45 @@ const struct file_operations coda_dir_operations = {
/* access routines: lookup, readlink, permission */ /* access routines: lookup, readlink, permission */
static struct dentry *coda_lookup(struct inode *dir, struct dentry *entry, struct nameidata *nd) static struct dentry *coda_lookup(struct inode *dir, struct dentry *entry, struct nameidata *nd)
{ {
struct inode *res_inode = NULL; struct inode *inode = NULL;
struct CodaFid resfid = { { 0, } }; struct CodaFid resfid = { { 0, } };
int dropme = 0; /* to indicate entry should not be cached */
int type = 0; int type = 0;
int error = 0; int error = 0;
const char *name = entry->d_name.name; const char *name = entry->d_name.name;
size_t length = entry->d_name.len; size_t length = entry->d_name.len;
if ( length > CODA_MAXNAMLEN ) { if (length > CODA_MAXNAMLEN) {
printk("name too long: lookup, %s (%*s)\n", printk(KERN_ERR "name too long: lookup, %s (%*s)\n",
coda_i2s(dir), (int)length, name); coda_i2s(dir), (int)length, name);
return ERR_PTR(-ENAMETOOLONG); return ERR_PTR(-ENAMETOOLONG);
} }
/* control object, create inode on the fly */
if (coda_isroot(dir) && coda_iscontrol(name, length)) {
error = coda_cnode_makectl(&inode, dir->i_sb);
type = CODA_NOCACHE;
goto exit;
}
lock_kernel(); lock_kernel();
/* control object, create inode on the fly */
if (coda_isroot(dir) && coda_iscontrol(name, length)) {
error = coda_cnode_makectl(&res_inode, dir->i_sb);
dropme = 1;
goto exit;
}
error = venus_lookup(dir->i_sb, coda_i2f(dir), error = venus_lookup(dir->i_sb, coda_i2f(dir), name, length,
(const char *)name, length, &type, &resfid); &type, &resfid);
if (!error)
error = coda_cnode_make(&inode, &resfid, dir->i_sb);
res_inode = NULL; unlock_kernel();
if (!error) {
if (type & CODA_NOCACHE) {
type &= (~CODA_NOCACHE);
dropme = 1;
}
error = coda_cnode_make(&res_inode, &resfid, dir->i_sb); if (error && error != -ENOENT)
if (error) {
unlock_kernel();
return ERR_PTR(error);
}
} else if (error != -ENOENT) {
unlock_kernel();
return ERR_PTR(error); return ERR_PTR(error);
}
exit: exit:
entry->d_time = 0;
entry->d_op = &coda_dentry_operations; entry->d_op = &coda_dentry_operations;
d_add(entry, res_inode);
if ( dropme ) { if (inode && (type & CODA_NOCACHE))
d_drop(entry); coda_flag_inode(inode, C_VATTR | C_PURGE);
coda_flag_inode(res_inode, C_VATTR);
} return d_splice_alias(inode, entry);
unlock_kernel();
return NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment