#include "cache.h"
 
 static const struct inode_operations v9fs_dir_inode_operations;
-static const struct inode_operations v9fs_dir_inode_operations_ext;
+static const struct inode_operations v9fs_dir_inode_operations_dotu;
+static const struct inode_operations v9fs_dir_inode_operations_dotl;
 static const struct inode_operations v9fs_file_inode_operations;
+static const struct inode_operations v9fs_file_inode_operations_dotl;
 static const struct inode_operations v9fs_symlink_inode_operations;
+static const struct inode_operations v9fs_symlink_inode_operations_dotl;
 
 /**
  * unixmode2p9mode - convert unix mode bits to plan 9
                init_special_inode(inode, inode->i_mode, inode->i_rdev);
                break;
        case S_IFREG:
-               inode->i_op = &v9fs_file_inode_operations;
-               inode->i_fop = &v9fs_file_operations;
+               if (v9fs_proto_dotl(v9ses)) {
+                       inode->i_op = &v9fs_file_inode_operations_dotl;
+                       inode->i_fop = &v9fs_file_operations_dotl;
+               } else {
+                       inode->i_op = &v9fs_file_inode_operations;
+                       inode->i_fop = &v9fs_file_operations;
+               }
+
                break;
+
        case S_IFLNK:
-               if (!v9fs_proto_dotu(v9ses)) {
-                       P9_DPRINTK(P9_DEBUG_ERROR,
-                                  "extended modes used w/o 9P2000.u\n");
+               if (!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)) {
+                       P9_DPRINTK(P9_DEBUG_ERROR, "extended modes used with "
+                                               "legacy protocol.\n");
                        err = -EINVAL;
                        goto error;
                }
-               inode->i_op = &v9fs_symlink_inode_operations;
+
+               if (v9fs_proto_dotl(v9ses))
+                       inode->i_op = &v9fs_symlink_inode_operations_dotl;
+               else
+                       inode->i_op = &v9fs_symlink_inode_operations;
+
                break;
        case S_IFDIR:
                inc_nlink(inode);
-               if (v9fs_proto_dotu(v9ses))
-                       inode->i_op = &v9fs_dir_inode_operations_ext;
+               if (v9fs_proto_dotl(v9ses))
+                       inode->i_op = &v9fs_dir_inode_operations_dotl;
+               else if (v9fs_proto_dotu(v9ses))
+                       inode->i_op = &v9fs_dir_inode_operations_dotu;
                else
                        inode->i_op = &v9fs_dir_inode_operations;
-               inode->i_fop = &v9fs_dir_operations;
+
+               if (v9fs_proto_dotl(v9ses))
+                       inode->i_fop = &v9fs_dir_operations_dotl;
+               else
+                       inode->i_fop = &v9fs_dir_operations;
+
                break;
        default:
                P9_DPRINTK(P9_DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n",
        return retval;
 }
 
-static const struct inode_operations v9fs_dir_inode_operations_ext = {
+static const struct inode_operations v9fs_dir_inode_operations_dotu = {
+       .create = v9fs_vfs_create,
+       .lookup = v9fs_vfs_lookup,
+       .symlink = v9fs_vfs_symlink,
+       .link = v9fs_vfs_link,
+       .unlink = v9fs_vfs_unlink,
+       .mkdir = v9fs_vfs_mkdir,
+       .rmdir = v9fs_vfs_rmdir,
+       .mknod = v9fs_vfs_mknod,
+       .rename = v9fs_vfs_rename,
+       .getattr = v9fs_vfs_getattr,
+       .setattr = v9fs_vfs_setattr,
+};
+
+static const struct inode_operations v9fs_dir_inode_operations_dotl = {
        .create = v9fs_vfs_create,
        .lookup = v9fs_vfs_lookup,
        .symlink = v9fs_vfs_symlink,
        .setattr = v9fs_vfs_setattr,
 };
 
+static const struct inode_operations v9fs_file_inode_operations_dotl = {
+       .getattr = v9fs_vfs_getattr,
+       .setattr = v9fs_vfs_setattr,
+};
+
 static const struct inode_operations v9fs_symlink_inode_operations = {
        .readlink = generic_readlink,
        .follow_link = v9fs_vfs_follow_link,
        .getattr = v9fs_vfs_getattr,
        .setattr = v9fs_vfs_setattr,
 };
+
+static const struct inode_operations v9fs_symlink_inode_operations_dotl = {
+       .readlink = generic_readlink,
+       .follow_link = v9fs_vfs_follow_link,
+       .put_link = v9fs_vfs_put_link,
+       .getattr = v9fs_vfs_getattr,
+       .setattr = v9fs_vfs_setattr,
+};
 
 #include "v9fs_vfs.h"
 #include "fid.h"
 
-static const struct super_operations v9fs_super_ops;
+static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl;
 
 /**
  * v9fs_set_super - set the superblock
        sb->s_blocksize_bits = fls(v9ses->maxdata - 1);
        sb->s_blocksize = 1 << sb->s_blocksize_bits;
        sb->s_magic = V9FS_MAGIC;
-       sb->s_op = &v9fs_super_ops;
+       if (v9fs_proto_dotl(v9ses))
+               sb->s_op = &v9fs_super_ops_dotl;
+       else
+               sb->s_op = &v9fs_super_ops;
        sb->s_bdi = &v9ses->bdi;
 
        sb->s_flags = flags | MS_ACTIVE | MS_SYNCHRONOUS | MS_DIRSYNC |
        .umount_begin = v9fs_umount_begin,
 };
 
+static const struct super_operations v9fs_super_ops_dotl = {
+#ifdef CONFIG_9P_FSCACHE
+       .alloc_inode = v9fs_alloc_inode,
+       .destroy_inode = v9fs_destroy_inode,
+#endif
+       .statfs = simple_statfs,
+       .clear_inode = v9fs_clear_inode,
+       .show_options = generic_show_options,
+       .umount_begin = v9fs_umount_begin,
+};
+
 struct file_system_type v9fs_fs_type = {
        .name = "9p",
        .get_sb = v9fs_get_sb,