2019-05-28 19:57:16 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2005-09-10 00:04:20 +04:00
/*
* V9FS VFS extensions .
*
* Copyright ( C ) 2004 by Eric Van Hensbergen < ericvh @ gmail . com >
* Copyright ( C ) 2002 by Ron Minnich < rminnich @ lanl . gov >
*/
2011-02-28 14:34:09 +03:00
# ifndef FS_9P_V9FS_VFS_H
# define FS_9P_V9FS_VFS_H
2005-09-10 00:04:20 +04:00
/* plan9 semantics are that created files are implicitly opened.
* But linux semantics are that you call create , then open .
* the plan9 approach is superior as it provides an atomic
* open .
* we track the create fid here . When the file is opened , if fidopen is
* non - zero , we use the fid and can skip some steps .
* there may be a better way to do this , but I don ' t know it .
* one BAD way is to clunk the fid on create , then open it again :
* you lose the atomicity of file open
*/
/* special case:
* unlink calls remove , which is an implicit clunk . So we have to track
* that kind of thing so that we don ' t try to clunk a dead fid .
*/
2011-02-28 14:34:09 +03:00
# define P9_LOCK_TIMEOUT (30*HZ)
2005-09-10 00:04:20 +04:00
2019-01-24 09:35:13 +03:00
/* flags for v9fs_stat2inode() & v9fs_stat2inode_dotl() */
# define V9FS_STAT2INODE_KEEP_ISIZE 1
2005-09-10 00:04:20 +04:00
extern struct file_system_type v9fs_fs_type ;
2006-06-28 15:26:44 +04:00
extern const struct address_space_operations v9fs_addr_operations ;
2006-03-28 13:56:42 +04:00
extern const struct file_operations v9fs_file_operations ;
2010-03-25 15:41:54 +03:00
extern const struct file_operations v9fs_file_operations_dotl ;
2006-03-28 13:56:42 +04:00
extern const struct file_operations v9fs_dir_operations ;
2010-03-25 15:41:54 +03:00
extern const struct file_operations v9fs_dir_operations_dotl ;
2009-02-20 08:55:46 +03:00
extern const struct dentry_operations v9fs_dentry_operations ;
extern const struct dentry_operations v9fs_cached_dentry_operations ;
2011-02-28 14:33:54 +03:00
extern const struct file_operations v9fs_cached_file_operations ;
extern const struct file_operations v9fs_cached_file_operations_dotl ;
2014-01-10 16:44:09 +04:00
extern const struct file_operations v9fs_mmap_file_operations ;
extern const struct file_operations v9fs_mmap_file_operations_dotl ;
2011-02-28 14:34:02 +03:00
extern struct kmem_cache * v9fs_inode_cache ;
2005-09-10 00:04:20 +04:00
2009-09-23 22:00:27 +04:00
struct inode * v9fs_alloc_inode ( struct super_block * sb ) ;
2019-04-10 22:00:26 +03:00
void v9fs_free_inode ( struct inode * inode ) ;
2011-07-26 10:53:22 +04:00
struct inode * v9fs_get_inode ( struct super_block * sb , umode_t mode , dev_t ) ;
2011-02-28 14:34:01 +03:00
int v9fs_init_inode ( struct v9fs_session_info * v9ses ,
2011-07-26 10:53:22 +04:00
struct inode * inode , umode_t mode , dev_t ) ;
2010-06-07 22:34:48 +04:00
void v9fs_evict_inode ( struct inode * inode ) ;
2007-07-11 02:57:28 +04:00
ino_t v9fs_qid2ino ( struct p9_qid * qid ) ;
2019-01-24 09:35:13 +03:00
void v9fs_stat2inode ( struct p9_wstat * stat , struct inode * inode ,
struct super_block * sb , unsigned int flags ) ;
void v9fs_stat2inode_dotl ( struct p9_stat_dotl * stat , struct inode * inode ,
unsigned int flags ) ;
2005-09-10 00:04:20 +04:00
int v9fs_dir_release ( struct inode * inode , struct file * filp ) ;
int v9fs_file_open ( struct inode * inode , struct file * file ) ;
2008-10-16 17:30:07 +04:00
void v9fs_inode2stat ( struct inode * inode , struct p9_wstat * stat ) ;
2008-06-25 02:39:39 +04:00
int v9fs_uflags2omode ( int uflags , int extended ) ;
2008-10-14 05:36:16 +04:00
2010-02-09 00:36:48 +03:00
void v9fs_blank_wstat ( struct p9_wstat * wstat ) ;
2010-09-27 22:57:40 +04:00
int v9fs_vfs_setattr_dotl ( struct dentry * , struct iattr * ) ;
2011-07-17 04:44:56 +04:00
int v9fs_file_fsync_dotl ( struct file * filp , loff_t start , loff_t end ,
int datasync ) ;
2011-02-28 14:34:06 +03:00
int v9fs_refresh_inode ( struct p9_fid * fid , struct inode * inode ) ;
int v9fs_refresh_inode_dotl ( struct p9_fid * fid , struct inode * inode ) ;
static inline void v9fs_invalidate_inode_attr ( struct inode * inode )
{
struct v9fs_inode * v9inode ;
v9inode = V9FS_I ( inode ) ;
v9inode - > cache_validity | = V9FS_INO_INVALID_ATTR ;
return ;
}
2011-08-03 18:25:32 +04:00
int v9fs_open_to_dotl_flags ( int flags ) ;
2019-01-24 09:35:13 +03:00
static inline void v9fs_i_size_write ( struct inode * inode , loff_t i_size )
{
/*
* 32 - bit need the lock , concurrent updates could break the
* sequences and make i_size_read ( ) loop forever .
* 64 - bit updates are atomic and can skip the locking .
*/
if ( sizeof ( i_size ) > sizeof ( long ) )
spin_lock ( & inode - > i_lock ) ;
i_size_write ( inode , i_size ) ;
if ( sizeof ( i_size ) > sizeof ( long ) )
spin_unlock ( & inode - > i_lock ) ;
}
2011-02-28 14:34:09 +03:00
# endif