]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: shouldn't lookup_open with special inode
authorYehuda Sadeh <yehuda@hq.newdream.net>
Mon, 19 Jan 2009 19:09:39 +0000 (11:09 -0800)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Mon, 19 Jan 2009 19:11:45 +0000 (11:11 -0800)
src/kernel/dir.c
src/kernel/inode.c

index 461b4239dc410d4dfc0f417b5c5995b9275d67f9..1177c1c9b5a90fa271f405e4d1c497912c9f63dc 100644 (file)
@@ -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);
index 85748deeee74f18a798fff90bd9927ef20c3ee9d..aeb97d5d591a8c64bf43739e9218481c1926e264 100644 (file)
@@ -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;