2019-05-28 19:57:16 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2005-09-10 00:04:24 +04:00
/*
* V9FS FID Management
*
* Copyright ( C ) 2005 by Eric Van Hensbergen < ericvh @ gmail . com >
*/
2011-02-28 14:34:09 +03:00
# ifndef FS_9P_FID_H
# define FS_9P_FID_H
2005-09-10 00:04:24 +04:00
# include <linux/list.h>
2023-03-27 05:06:37 +03:00
# include "v9fs.h"
2005-09-10 00:04:24 +04:00
2023-03-27 05:06:37 +03:00
struct p9_fid * v9fs_fid_find_inode ( struct inode * inode , bool want_writeable ,
kuid_t uid , bool any ) ;
2007-07-11 02:57:28 +04:00
struct p9_fid * v9fs_fid_lookup ( struct dentry * dentry ) ;
2016-05-29 22:29:26 +03:00
static inline struct p9_fid * v9fs_parent_fid ( struct dentry * dentry )
{
return v9fs_fid_lookup ( dentry - > d_parent ) ;
}
2022-06-12 10:05:39 +03:00
void v9fs_fid_add ( struct dentry * dentry , struct p9_fid * * fid ) ;
void v9fs_open_fid_add ( struct inode * inode , struct p9_fid * * fid ) ;
2016-08-03 18:02:48 +03:00
static inline struct p9_fid * clone_fid ( struct p9_fid * fid )
{
return IS_ERR ( fid ) ? fid : p9_client_walk ( fid , 0 , NULL , 1 ) ;
}
2016-08-03 18:12:12 +03:00
static inline struct p9_fid * v9fs_fid_clone ( struct dentry * dentry )
{
2020-09-23 17:11:46 +03:00
struct p9_fid * fid , * nfid ;
fid = v9fs_fid_lookup ( dentry ) ;
if ( ! fid | | IS_ERR ( fid ) )
return fid ;
2020-11-03 11:35:57 +03:00
nfid = clone_fid ( fid ) ;
2022-06-12 07:42:32 +03:00
p9_fid_put ( fid ) ;
2020-09-23 17:11:46 +03:00
return nfid ;
2016-08-03 18:12:12 +03:00
}
2023-03-27 05:06:37 +03:00
/**
* v9fs_fid_addmodes - add cache flags to fid mode ( for client use only )
* @ fid : fid to augment
* @ s_flags : session info mount flags
* @ s_cache : session info cache flags
* @ f_flags : unix open flags
*
* make sure mode reflects flags of underlying mounts
* also qid . version = = 0 reflects a synthetic or legacy file system
* NOTE : these are set after open so only reflect 9 p client not
* underlying file system on server .
*/
2023-07-19 19:22:32 +03:00
static inline void v9fs_fid_add_modes ( struct p9_fid * fid , unsigned int s_flags ,
unsigned int s_cache , unsigned int f_flags )
2023-03-27 05:06:37 +03:00
{
if ( fid - > qid . type ! = P9_QTFILE )
return ;
if ( ( ! s_cache ) | |
( ( fid - > qid . version = = 0 ) & & ! ( s_flags & V9FS_IGNORE_QV ) ) | |
( s_flags & V9FS_DIRECT_IO ) | | ( f_flags & O_DIRECT ) ) {
fid - > mode | = P9L_DIRECT ; /* no read or write cache */
2023-03-27 04:53:10 +03:00
} else if ( ( ! ( s_cache & CACHE_WRITEBACK ) ) | |
2023-07-19 19:22:31 +03:00
( f_flags & O_DSYNC ) | | ( s_flags & V9FS_SYNC ) ) {
2023-03-27 05:06:37 +03:00
fid - > mode | = P9L_NOWRITECACHE ;
}
}
2011-02-28 14:34:09 +03:00
# endif