return 1;
 }
 
+static int dir_alias(struct inode *inode)
+{
+       if (S_ISDIR(inode->i_mode)) {
+               /* Don't allow creating an alias to a directory  */
+               struct dentry *alias = d_find_alias(inode);
+               if (alias) {
+                       dput(alias);
+                       return 1;
+               }
+       }
+       return 0;
+}
+
 static struct dentry_operations fuse_dentry_operations = {
        .d_revalidate   = fuse_dentry_revalidate,
 };
        fuse_put_request(fc, req);
 
        /* Don't allow userspace to do really stupid things... */
-       if ((inode->i_mode ^ mode) & S_IFMT) {
+       if (((inode->i_mode ^ mode) & S_IFMT) || dir_alias(inode)) {
                iput(inode);
                return -EIO;
        }
        err = fuse_lookup_iget(dir, entry, &inode);
        if (err)
                return ERR_PTR(err);
-       if (inode && S_ISDIR(inode->i_mode)) {
-               /* Don't allow creating an alias to a directory  */
-               struct dentry *alias = d_find_alias(inode);
-               if (alias) {
-                       dput(alias);
-                       iput(inode);
-                       return ERR_PTR(-EIO);
-               }
+       if (inode && dir_alias(inode)) {
+               iput(inode);
+               return ERR_PTR(-EIO);
        }
        d_add(entry, inode);
        return NULL;