From: Yehuda Sadeh Date: Mon, 19 Jan 2009 19:09:39 +0000 (-0800) Subject: kclient: shouldn't lookup_open with special inode X-Git-Tag: v0.6~1^2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=878b6494774ebceffa879568f1d2ce099bc6416f;p=ceph.git kclient: shouldn't lookup_open with special inode --- diff --git a/src/kernel/dir.c b/src/kernel/dir.c index 461b4239dc41..1177c1c9b5a9 100644 --- a/src/kernel/dir.c +++ b/src/kernel/dir.c @@ -436,13 +436,21 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, dout(5, "lookup in dir %p dentry %p '%.*s'\n", dir, dentry, dentry->d_name.len, dentry->d_name.name); - /* open (but not create!) intent? */ - if (nd && - (nd->flags & LOOKUP_OPEN) && - (nd->flags & LOOKUP_CONTINUE) == 0 && /* only open last component */ - !(nd->intent.open.flags & O_CREAT)) { - int mode = nd->intent.open.create_mode & ~current->fs->umask; - return ceph_lookup_open(dir, dentry, nd, mode, 1); + if (dentry->d_inode) { + switch (dentry->d_inode->i_mode) { + case S_IFREG: + case S_IFLNK: + case S_IFDIR: + /* open (but not create!) intent? */ + if (nd && + (nd->flags & LOOKUP_OPEN) && + (nd->flags & LOOKUP_CONTINUE) == 0 && /* only open last component */ + !(nd->intent.open.flags & O_CREAT)) { + int mode = nd->intent.open.create_mode & ~current->fs->umask; + return ceph_lookup_open(dir, dentry, nd, mode, 1); + } + + } } return ceph_do_lookup(dir->i_sb, dentry, CEPH_STAT_CAP_INODE, 0, 1); diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 85748deeee74..aeb97d5d591a 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -530,7 +530,6 @@ no_change: case S_IFCHR: case S_IFSOCK: init_special_inode(inode, inode->i_mode, inode->i_rdev); - inode->i_op = &ceph_file_iops; break; case S_IFREG: inode->i_op = &ceph_file_iops;