2005-09-10 00:04:20 +04:00
/*
* V9FS definitions .
*
2008-02-07 04:25:03 +03:00
* Copyright ( C ) 2004 - 2008 by Eric Van Hensbergen < ericvh @ gmail . com >
2005-09-10 00:04:20 +04:00
* Copyright ( C ) 2002 by Ron Minnich < rminnich @ lanl . gov >
*
* This program is free software ; you can redistribute it and / or modify
2006-03-25 14:07:28 +03:00
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation .
2005-09-10 00:04:20 +04:00
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to :
* Free Software Foundation
* 51 Franklin Street , Fifth Floor
* Boston , MA 02111 - 1301 USA
*
*/
2010-04-22 13:42:00 +04:00
# include <linux/backing-dev.h>
2005-09-10 00:04:20 +04:00
2008-03-05 16:08:09 +03:00
/**
* enum p9_session_flags - option flags for each 9 P session
2010-03-05 21:48:00 +03:00
* @ V9FS_PROTO_2000U : whether or not to use 9 P2000 . u extensions
2010-03-08 20:33:04 +03:00
* @ V9FS_PROTO_2000L : whether or not to use 9 P2000 . l extensions
2008-03-05 16:08:09 +03:00
* @ V9FS_ACCESS_SINGLE : only the mounting user can access the hierarchy
* @ V9FS_ACCESS_USER : a new attach will be issued for every user ( default )
* @ V9FS_ACCESS_ANY : use a single attach for all users
* @ V9FS_ACCESS_MASK : bit mask of different ACCESS options
*
* Session flags reflect options selected by users at mount time
*/
2010-09-27 22:57:41 +04:00
# define V9FS_ACCESS_ANY (V9FS_ACCESS_SINGLE | \
V9FS_ACCESS_USER | \
V9FS_ACCESS_CLIENT )
# define V9FS_ACCESS_MASK V9FS_ACCESS_ANY
2008-03-05 16:08:09 +03:00
enum p9_session_flags {
2010-03-05 21:48:00 +03:00
V9FS_PROTO_2000U = 0x01 ,
2010-03-08 20:33:04 +03:00
V9FS_PROTO_2000L = 0x02 ,
2010-03-05 21:48:00 +03:00
V9FS_ACCESS_SINGLE = 0x04 ,
V9FS_ACCESS_USER = 0x08 ,
2010-09-27 22:57:41 +04:00
V9FS_ACCESS_CLIENT = 0x10
2008-03-05 16:08:09 +03:00
} ;
/* possible values of ->cache */
/**
* enum p9_cache_modes - user specified cache preferences
* @ CACHE_NONE : do not cache data , dentries , or directory contents ( default )
* @ CACHE_LOOSE : cache data , dentries , and directory contents w / no consistency
*
* eventually support loose , tight , time , session , default always none
*/
enum p9_cache_modes {
CACHE_NONE ,
CACHE_LOOSE ,
2009-09-23 22:00:27 +04:00
CACHE_FSCACHE ,
2008-03-05 16:08:09 +03:00
} ;
/**
* struct v9fs_session_info - per - instance session information
* @ flags : session options of type & p9_session_flags
* @ nodev : set to 1 to disable device mapping
* @ debug : debug level
* @ afid : authentication handle
* @ cache : cache mode of type & p9_cache_modes
2009-09-23 22:00:27 +04:00
* @ cachetag : the tag of the cache associated with this session
* @ fscache : session cookie associated with FS - Cache
2008-03-05 16:08:09 +03:00
* @ options : copy of options string given by user
* @ uname : string user name to mount hierarchy as
* @ aname : mount specifier for remote hierarchy
* @ maxdata : maximum data to be sent / recvd per protocol message
* @ dfltuid : default numeric userid to mount hierarchy as
* @ dfltgid : default numeric groupid to mount hierarchy as
* @ uid : if % V9FS_ACCESS_SINGLE , the numeric uid which mounted the hierarchy
* @ clnt : reference to 9 P network client instantiated for this session
2009-09-23 22:00:27 +04:00
* @ slist : reference to list of registered 9 p sessions
2008-03-05 16:08:09 +03:00
*
* This structure holds state for each session instance established during
* a sys_mount ( ) .
*
* Bugs : there seems to be a lot of state which could be condensed and / or
* removed .
*/
2005-09-10 00:04:20 +04:00
struct v9fs_session_info {
/* options */
2008-03-05 16:08:09 +03:00
unsigned char flags ;
unsigned char nodev ;
unsigned short debug ;
unsigned int afid ;
unsigned int cache ;
2009-09-23 22:00:27 +04:00
# ifdef CONFIG_9P_FSCACHE
char * cachetag ;
struct fscache_cookie * fscache ;
# endif
2005-09-10 00:04:20 +04:00
2007-10-17 23:31:07 +04:00
char * uname ; /* user name to mount as */
char * aname ; /* name of remote hierarchy being mounted */
2008-02-07 04:25:03 +03:00
unsigned int maxdata ; /* max data for client interface */
2007-10-17 23:31:07 +04:00
unsigned int dfltuid ; /* default uid/muid for legacy support */
unsigned int dfltgid ; /* default gid for legacy support */
2007-10-17 23:31:07 +04:00
u32 uid ; /* if ACCESS_SINGLE, the uid that has access */
2007-07-11 02:57:28 +04:00
struct p9_client * clnt ; /* 9p client */
2009-09-23 22:00:27 +04:00
struct list_head slist ; /* list of sessions registered with v9fs */
2010-04-22 13:42:00 +04:00
struct backing_dev_info bdi ;
2010-06-30 17:48:50 +04:00
struct rw_semaphore rename_sem ;
2005-09-10 00:04:20 +04:00
} ;
2007-07-11 02:57:28 +04:00
struct p9_fid * v9fs_session_init ( struct v9fs_session_info * , const char * ,
char * ) ;
2011-01-10 22:51:47 +03:00
extern void v9fs_session_close ( struct v9fs_session_info * v9ses ) ;
extern void v9fs_session_cancel ( struct v9fs_session_info * v9ses ) ;
extern void v9fs_session_begin_cancel ( struct v9fs_session_info * v9ses ) ;
extern struct dentry * v9fs_vfs_lookup ( struct inode * dir , struct dentry * dentry ,
struct nameidata * nameidata ) ;
extern int v9fs_vfs_unlink ( struct inode * i , struct dentry * d ) ;
extern int v9fs_vfs_rmdir ( struct inode * i , struct dentry * d ) ;
extern int v9fs_vfs_rename ( struct inode * old_dir , struct dentry * old_dentry ,
struct inode * new_dir , struct dentry * new_dentry ) ;
extern void v9fs_vfs_put_link ( struct dentry * dentry , struct nameidata * nd ,
void * p ) ;
extern struct inode * v9fs_inode ( struct v9fs_session_info * v9ses ,
struct p9_fid * fid ,
struct super_block * sb ) ;
extern const struct inode_operations v9fs_dir_inode_operations_dotl ;
extern const struct inode_operations v9fs_file_inode_operations_dotl ;
extern const struct inode_operations v9fs_symlink_inode_operations_dotl ;
extern struct inode * v9fs_inode_dotl ( struct v9fs_session_info * v9ses ,
struct p9_fid * fid ,
struct super_block * sb ) ;
2005-09-10 00:04:20 +04:00
/* other default globals */
2007-10-17 23:31:07 +04:00
# define V9FS_PORT 564
2005-09-10 00:04:20 +04:00
# define V9FS_DEFUSER "nobody"
# define V9FS_DEFANAME ""
2007-10-17 23:31:07 +04:00
# define V9FS_DEFUID (-2)
# define V9FS_DEFGID (-2)
2005-09-10 00:04:20 +04:00
2007-07-11 02:57:28 +04:00
static inline struct v9fs_session_info * v9fs_inode2v9ses ( struct inode * inode )
{
return ( inode - > i_sb - > s_fs_info ) ;
}
2007-10-17 23:31:07 +04:00
2010-03-05 21:48:00 +03:00
static inline int v9fs_proto_dotu ( struct v9fs_session_info * v9ses )
2007-10-17 23:31:07 +04:00
{
2010-03-05 21:48:00 +03:00
return v9ses - > flags & V9FS_PROTO_2000U ;
}
static inline int v9fs_proto_dotl ( struct v9fs_session_info * v9ses )
{
2010-03-08 20:33:04 +03:00
return v9ses - > flags & V9FS_PROTO_2000L ;
2007-10-17 23:31:07 +04:00
}
2011-01-10 22:51:47 +03:00
/**
* v9fs_inode_from_fid - Helper routine to populate an inode by
* issuing a attribute request
* @ v9ses : session information
* @ fid : fid to issue attribute request for
* @ sb : superblock on which to create inode
*
*/
static inline struct inode *
v9fs_inode_from_fid ( struct v9fs_session_info * v9ses , struct p9_fid * fid ,
struct super_block * sb )
{
if ( v9fs_proto_dotl ( v9ses ) )
return v9fs_inode_dotl ( v9ses , fid , sb ) ;
else
return v9fs_inode ( v9ses , fid , sb ) ;
}