2009-09-23 22:00:27 +04:00
/*
* V9FS cache definitions .
*
* Copyright ( C ) 2009 by Abhishek Kulkarni < adkulkar @ umail . iu . edu >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation .
*
* 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
*
*/
# ifndef _9P_CACHE_H
# ifdef CONFIG_9P_FSCACHE
# include <linux/fscache.h>
# include <linux/spinlock.h>
extern struct fscache_netfs v9fs_cache_netfs ;
extern const struct fscache_cookie_def v9fs_cache_session_index_def ;
extern const struct fscache_cookie_def v9fs_cache_inode_index_def ;
extern void v9fs_cache_session_get_cookie ( struct v9fs_session_info * v9ses ) ;
extern void v9fs_cache_session_put_cookie ( struct v9fs_session_info * v9ses ) ;
extern void v9fs_cache_inode_get_cookie ( struct inode * inode ) ;
extern void v9fs_cache_inode_put_cookie ( struct inode * inode ) ;
extern void v9fs_cache_inode_flush_cookie ( struct inode * inode ) ;
extern void v9fs_cache_inode_set_cookie ( struct inode * inode , struct file * filp ) ;
extern void v9fs_cache_inode_reset_cookie ( struct inode * inode ) ;
extern int __v9fs_cache_register ( void ) ;
extern void __v9fs_cache_unregister ( void ) ;
extern int __v9fs_fscache_release_page ( struct page * page , gfp_t gfp ) ;
extern void __v9fs_fscache_invalidate_page ( struct page * page ) ;
extern int __v9fs_readpage_from_fscache ( struct inode * inode ,
struct page * page ) ;
extern int __v9fs_readpages_from_fscache ( struct inode * inode ,
struct address_space * mapping ,
struct list_head * pages ,
unsigned * nr_pages ) ;
extern void __v9fs_readpage_to_fscache ( struct inode * inode , struct page * page ) ;
2011-02-28 14:33:56 +03:00
extern void __v9fs_fscache_wait_on_page_write ( struct inode * inode ,
struct page * page ) ;
2009-09-23 22:00:27 +04:00
static inline int v9fs_fscache_release_page ( struct page * page ,
gfp_t gfp )
{
return __v9fs_fscache_release_page ( page , gfp ) ;
}
static inline void v9fs_fscache_invalidate_page ( struct page * page )
{
__v9fs_fscache_invalidate_page ( page ) ;
}
static inline int v9fs_readpage_from_fscache ( struct inode * inode ,
struct page * page )
{
return __v9fs_readpage_from_fscache ( inode , page ) ;
}
static inline int v9fs_readpages_from_fscache ( struct inode * inode ,
struct address_space * mapping ,
struct list_head * pages ,
unsigned * nr_pages )
{
return __v9fs_readpages_from_fscache ( inode , mapping , pages ,
nr_pages ) ;
}
static inline void v9fs_readpage_to_fscache ( struct inode * inode ,
struct page * page )
{
if ( PageFsCache ( page ) )
__v9fs_readpage_to_fscache ( inode , page ) ;
}
static inline void v9fs_uncache_page ( struct inode * inode , struct page * page )
{
2011-02-28 14:34:02 +03:00
struct v9fs_inode * v9inode = V9FS_I ( inode ) ;
fscache_uncache_page ( v9inode - > fscache , page ) ;
2009-09-23 22:00:27 +04:00
BUG_ON ( PageFsCache ( page ) ) ;
}
2011-02-28 14:34:02 +03:00
static inline void v9fs_fscache_set_key ( struct inode * inode ,
2009-09-23 22:00:27 +04:00
struct p9_qid * qid )
{
2011-02-28 14:34:02 +03:00
struct v9fs_inode * v9inode = V9FS_I ( inode ) ;
spin_lock ( & v9inode - > fscache_lock ) ;
v9inode - > fscache_key = qid ;
spin_unlock ( & v9inode - > fscache_lock ) ;
2009-09-23 22:00:27 +04:00
}
2011-02-28 14:33:56 +03:00
static inline void v9fs_fscache_wait_on_page_write ( struct inode * inode ,
struct page * page )
{
return __v9fs_fscache_wait_on_page_write ( inode , page ) ;
}
2009-09-23 22:00:27 +04:00
# else /* CONFIG_9P_FSCACHE */
static inline int v9fs_fscache_release_page ( struct page * page ,
gfp_t gfp ) {
return 1 ;
}
static inline void v9fs_fscache_invalidate_page ( struct page * page ) { }
static inline int v9fs_readpage_from_fscache ( struct inode * inode ,
struct page * page )
{
return - ENOBUFS ;
}
static inline int v9fs_readpages_from_fscache ( struct inode * inode ,
struct address_space * mapping ,
struct list_head * pages ,
unsigned * nr_pages )
{
return - ENOBUFS ;
}
static inline void v9fs_readpage_to_fscache ( struct inode * inode ,
struct page * page )
{ }
static inline void v9fs_uncache_page ( struct inode * inode , struct page * page )
{ }
2011-02-28 14:33:56 +03:00
static inline void v9fs_fscache_wait_on_page_write ( struct inode * inode ,
struct page * page )
{
return ;
}
2009-09-23 22:00:27 +04:00
# endif /* CONFIG_9P_FSCACHE */
# endif /* _9P_CACHE_H */