diff options
| author | Sripathi Kodi <sripathik@in.ibm.com> | 2010-03-25 12:41:54 +0000 | 
|---|---|---|
| committer | Eric Van Hensbergen <ericvh@gmail.com> | 2010-05-21 16:44:33 -0500 | 
| commit | 9b6533c9b331ddbba9a40c972d82222ecffbc359 (patch) | |
| tree | 62d4f5ece3c2cbefc09197b386cac2cd4a6693ae /fs/9p | |
| parent | c56e4acf55c804cbeea0ddb696ef698c73d39826 (diff) | |
9p: VFS switches for 9p2000.L: VFS switches
Implements VFS switches for 9p2000.L protocol.
Signed-off-by: Sripathi Kodi <sripathik@in.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'fs/9p')
| -rw-r--r-- | fs/9p/v9fs_vfs.h | 2 | ||||
| -rw-r--r-- | fs/9p/vfs_dir.c | 8 | ||||
| -rw-r--r-- | fs/9p/vfs_file.c | 11 | ||||
| -rw-r--r-- | fs/9p/vfs_inode.c | 71 | ||||
| -rw-r--r-- | fs/9p/vfs_super.c | 18 | 
5 files changed, 97 insertions, 13 deletions
diff --git a/fs/9p/v9fs_vfs.h b/fs/9p/v9fs_vfs.h index ed835836e0dc..32ef4009d030 100644 --- a/fs/9p/v9fs_vfs.h +++ b/fs/9p/v9fs_vfs.h @@ -40,7 +40,9 @@  extern struct file_system_type v9fs_fs_type;  extern const struct address_space_operations v9fs_addr_operations;  extern const struct file_operations v9fs_file_operations; +extern const struct file_operations v9fs_file_operations_dotl;  extern const struct file_operations v9fs_dir_operations; +extern const struct file_operations v9fs_dir_operations_dotl;  extern const struct dentry_operations v9fs_dentry_operations;  extern const struct dentry_operations v9fs_cached_dentry_operations; diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index 0adfd64dfcee..d61e3b28ce37 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c @@ -203,3 +203,11 @@ const struct file_operations v9fs_dir_operations = {  	.open = v9fs_file_open,  	.release = v9fs_dir_release,  }; + +const struct file_operations v9fs_dir_operations_dotl = { +	.read = generic_read_dir, +	.llseek = generic_file_llseek, +	.readdir = v9fs_dir_readdir, +	.open = v9fs_file_open, +	.release = v9fs_dir_release, +}; diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index df52d488d2a6..25b300e1c9d7 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -296,3 +296,14 @@ const struct file_operations v9fs_file_operations = {  	.mmap = generic_file_readonly_mmap,  	.fsync = v9fs_file_fsync,  }; + +const struct file_operations v9fs_file_operations_dotl = { +	.llseek = generic_file_llseek, +	.read = v9fs_file_read, +	.write = v9fs_file_write, +	.open = v9fs_file_open, +	.release = v9fs_dir_release, +	.lock = v9fs_file_lock, +	.mmap = generic_file_readonly_mmap, +	.fsync = v9fs_file_fsync, +}; diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index f2434fc9d2c4..13a8ed6088b8 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -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, +}; diff --git a/fs/9p/vfs_super.c b/fs/9p/vfs_super.c index 806da5d3b3a0..cc3fa8c3aab6 100644 --- a/fs/9p/vfs_super.c +++ b/fs/9p/vfs_super.c @@ -45,7 +45,7 @@  #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 @@ -76,7 +76,10 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,  	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 | @@ -222,6 +225,17 @@ static const struct super_operations v9fs_super_ops = {  	.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,  | 
