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
*
*/
2011-02-28 14:34:09 +03:00
# ifndef FS_9P_V9FS_H
# define FS_9P_V9FS_H
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 )
2011-01-26 02:40:54 +03:00
* @ V9FS_ACCESS_CLIENT : Just like user , but access check is performed on client .
2008-03-05 16:08:09 +03:00
* @ V9FS_ACCESS_ANY : use a single attach for all users
* @ V9FS_ACCESS_MASK : bit mask of different ACCESS options
2011-01-26 02:40:54 +03:00
* @ V9FS_POSIX_ACL : POSIX ACLs are enforced
2008-03-05 16:08:09 +03:00
*
* 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
2011-01-26 02:40:54 +03:00
# define V9FS_ACL_MASK V9FS_POSIX_ACL
2010-09-27 22:57:41 +04:00
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 ,
2011-01-26 02:40:54 +03:00
V9FS_ACCESS_CLIENT = 0x10 ,
V9FS_POSIX_ACL = 0x20
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 ,
2014-01-10 16:44:09 +04:00
CACHE_MMAP ,
2008-03-05 16:08:09 +03:00
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
* @ 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 */
2013-01-30 23:57:40 +04:00
kuid_t dfltuid ; /* default uid/muid for legacy support */
kgid_t dfltgid ; /* default gid for legacy support */
kuid_t 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
} ;
2011-02-28 14:34:06 +03:00
/* cache_validity flags */
# define V9FS_INO_INVALID_ATTR 0x01
2011-02-28 14:34:02 +03:00
struct v9fs_inode {
# ifdef CONFIG_9P_FSCACHE
2016-01-08 01:49:51 +03:00
struct mutex fscache_lock ;
2011-02-28 14:34:02 +03:00
struct fscache_cookie * fscache ;
# endif
2011-07-11 20:40:59 +04:00
struct p9_qid qid ;
2011-02-28 14:34:06 +03:00
unsigned int cache_validity ;
2011-02-28 14:34:03 +03:00
struct p9_fid * writeback_fid ;
2011-03-08 14:09:46 +03:00
struct mutex v_mutex ;
2011-02-28 14:34:02 +03:00
struct inode vfs_inode ;
} ;
static inline struct v9fs_inode * V9FS_I ( const struct inode * inode )
{
return container_of ( inode , struct v9fs_inode , vfs_inode ) ;
}
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 ,
2012-06-11 01:13:09 +04:00
unsigned int flags ) ;
2011-01-10 22:51:47 +03:00
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 ,
fs: make remaining filesystems use .rename2
This is trivial to do:
- add flags argument to foo_rename()
- check if flags is zero
- assign foo_rename() to .rename2 instead of .rename
This doesn't mean it's impossible to support RENAME_NOREPLACE for these
filesystems, but it is not trivial, like for local filesystems.
RENAME_NOREPLACE must guarantee atomicity (i.e. it shouldn't be possible
for a file to be created on one host while it is overwritten by rename on
another host).
Filesystems converted:
9p, afs, ceph, coda, ecryptfs, kernfs, lustre, ncpfs, nfs, ocfs2, orangefs.
After this, we can get rid of the duplicate interfaces for rename.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: David Howells <dhowells@redhat.com> [AFS]
Acked-by: Mike Marshall <hubcap@omnibond.com>
Cc: Eric Van Hensbergen <ericvh@gmail.com>
Cc: Ilya Dryomov <idryomov@gmail.com>
Cc: Jan Harkes <jaharkes@cs.cmu.edu>
Cc: Tyler Hicks <tyhicks@canonical.com>
Cc: Oleg Drokin <oleg.drokin@intel.com>
Cc: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: Mark Fasheh <mfasheh@suse.com>
2016-09-27 12:03:58 +03:00
struct inode * new_dir , struct dentry * new_dentry ,
unsigned int flags ) ;
2011-02-28 14:34:02 +03:00
extern struct inode * v9fs_inode_from_fid ( struct v9fs_session_info * v9ses ,
struct p9_fid * fid ,
2011-07-06 15:02:31 +04:00
struct super_block * sb , int new ) ;
2011-01-10 22:51:47 +03:00
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 ;
2011-02-28 14:34:02 +03:00
extern struct inode * v9fs_inode_from_fid_dotl ( struct v9fs_session_info * v9ses ,
struct p9_fid * fid ,
2011-07-06 15:02:31 +04:00
struct super_block * sb , int new ) ;
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 ""
2013-01-30 23:57:40 +04:00
# define V9FS_DEFUID KUIDT_INIT(-2)
# define V9FS_DEFGID KGIDT_INIT(-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
2011-03-08 14:09:50 +03:00
static inline struct v9fs_session_info * v9fs_dentry2v9ses ( struct dentry * dentry )
{
return dentry - > d_sb - > s_fs_info ;
}
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
/**
2011-02-28 14:34:02 +03:00
* v9fs_get_inode_from_fid - Helper routine to populate an inode by
2011-01-10 22:51:47 +03:00
* 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 *
2011-02-28 14:34:02 +03:00
v9fs_get_inode_from_fid ( struct v9fs_session_info * v9ses , struct p9_fid * fid ,
struct super_block * sb )
2011-01-10 22:51:47 +03:00
{
if ( v9fs_proto_dotl ( v9ses ) )
2011-07-06 15:02:31 +04:00
return v9fs_inode_from_fid_dotl ( v9ses , fid , sb , 0 ) ;
2011-01-10 22:51:47 +03:00
else
2011-07-06 15:02:31 +04:00
return v9fs_inode_from_fid ( v9ses , fid , sb , 0 ) ;
2011-01-10 22:51:47 +03:00
}
2011-07-06 15:02:31 +04:00
/**
* v9fs_get_new_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_get_new_inode_from_fid ( struct v9fs_session_info * v9ses , struct p9_fid * fid ,
struct super_block * sb )
{
if ( v9fs_proto_dotl ( v9ses ) )
return v9fs_inode_from_fid_dotl ( v9ses , fid , sb , 1 ) ;
else
return v9fs_inode_from_fid ( v9ses , fid , sb , 1 ) ;
}
2011-02-28 14:34:09 +03:00
# endif