|
@@ -44,9 +44,12 @@
|
|
|
#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
|
|
@@ -275,25 +278,44 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode)
|
|
|
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",
|
|
@@ -1208,7 +1230,21 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
|
|
|
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,
|
|
@@ -1239,6 +1275,11 @@ static const struct inode_operations v9fs_file_inode_operations = {
|
|
|
.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,
|
|
@@ -1246,3 +1287,11 @@ static const struct inode_operations v9fs_symlink_inode_operations = {
|
|
|
.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,
|
|
|
+};
|