xref: /linux/fs/9p/fid.h (revision 3a07362fab1653d3aca31a9155c8cc776138fd02)
11f327613SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
23ed8491cSEric Van Hensbergen /*
33ed8491cSEric Van Hensbergen  * V9FS FID Management
43ed8491cSEric Van Hensbergen  *
53ed8491cSEric Van Hensbergen  *  Copyright (C) 2005 by Eric Van Hensbergen <ericvh@gmail.com>
63ed8491cSEric Van Hensbergen  */
7e0459f57SAneesh Kumar K.V #ifndef FS_9P_FID_H
8e0459f57SAneesh Kumar K.V #define FS_9P_FID_H
93ed8491cSEric Van Hensbergen #include <linux/list.h>
101543b4c5SEric Van Hensbergen #include "v9fs.h"
113ed8491cSEric Van Hensbergen 
121543b4c5SEric Van Hensbergen struct p9_fid *v9fs_fid_find_inode(struct inode *inode, bool want_writeable,
131543b4c5SEric Van Hensbergen 	kuid_t uid, bool any);
14bd238fb4SLatchesar Ionkov struct p9_fid *v9fs_fid_lookup(struct dentry *dentry);
v9fs_parent_fid(struct dentry * dentry)1577d5a6b7SAl Viro static inline struct p9_fid *v9fs_parent_fid(struct dentry *dentry)
1677d5a6b7SAl Viro {
1777d5a6b7SAl Viro 	return v9fs_fid_lookup(dentry->d_parent);
1877d5a6b7SAl Viro }
19dafbe689SDominique Martinet void v9fs_fid_add(struct dentry *dentry, struct p9_fid **fid);
20dafbe689SDominique Martinet void v9fs_open_fid_add(struct inode *inode, struct p9_fid **fid);
clone_fid(struct p9_fid * fid)21797fc16dSAl Viro static inline struct p9_fid *clone_fid(struct p9_fid *fid)
22797fc16dSAl Viro {
23797fc16dSAl Viro 	return IS_ERR(fid) ? fid :  p9_client_walk(fid, 0, NULL, 1);
24797fc16dSAl Viro }
v9fs_fid_clone(struct dentry * dentry)257d50a29fSAl Viro static inline struct p9_fid *v9fs_fid_clone(struct dentry *dentry)
267d50a29fSAl Viro {
276636b6dcSJianyong Wu 	struct p9_fid *fid, *nfid;
286636b6dcSJianyong Wu 
296636b6dcSJianyong Wu 	fid = v9fs_fid_lookup(dentry);
306636b6dcSJianyong Wu 	if (!fid || IS_ERR(fid))
316636b6dcSJianyong Wu 		return fid;
326636b6dcSJianyong Wu 
33ff5e72ebSDominique Martinet 	nfid = clone_fid(fid);
34b48dbb99SDominique Martinet 	p9_fid_put(fid);
356636b6dcSJianyong Wu 	return nfid;
367d50a29fSAl Viro }
371543b4c5SEric Van Hensbergen /**
381543b4c5SEric Van Hensbergen  * v9fs_fid_addmodes - add cache flags to fid mode (for client use only)
391543b4c5SEric Van Hensbergen  * @fid: fid to augment
401543b4c5SEric Van Hensbergen  * @s_flags: session info mount flags
411543b4c5SEric Van Hensbergen  * @s_cache: session info cache flags
421543b4c5SEric Van Hensbergen  * @f_flags: unix open flags
431543b4c5SEric Van Hensbergen  *
441543b4c5SEric Van Hensbergen  * make sure mode reflects flags of underlying mounts
451543b4c5SEric Van Hensbergen  * also qid.version == 0 reflects a synthetic or legacy file system
461543b4c5SEric Van Hensbergen  * NOTE: these are set after open so only reflect 9p client not
471543b4c5SEric Van Hensbergen  * underlying file system on server.
481543b4c5SEric Van Hensbergen  */
v9fs_fid_add_modes(struct p9_fid * fid,unsigned int s_flags,unsigned int s_cache,unsigned int f_flags)49*09430abaSEric Van Hensbergen static inline void v9fs_fid_add_modes(struct p9_fid *fid, unsigned int s_flags,
50*09430abaSEric Van Hensbergen 	unsigned int s_cache, unsigned int f_flags)
511543b4c5SEric Van Hensbergen {
521543b4c5SEric Van Hensbergen 	if ((!s_cache) ||
531543b4c5SEric Van Hensbergen 	   ((fid->qid.version == 0) && !(s_flags & V9FS_IGNORE_QV)) ||
541543b4c5SEric Van Hensbergen 	   (s_flags & V9FS_DIRECT_IO) || (f_flags & O_DIRECT)) {
551543b4c5SEric Van Hensbergen 		fid->mode |= P9L_DIRECT; /* no read or write cache */
564eb31178SEric Van Hensbergen 	} else if ((!(s_cache & CACHE_WRITEBACK)) ||
57878cb3e0SEric Van Hensbergen 				(f_flags & O_DSYNC) || (s_flags & V9FS_SYNC)) {
581543b4c5SEric Van Hensbergen 		fid->mode |= P9L_NOWRITECACHE;
591543b4c5SEric Van Hensbergen 	}
601543b4c5SEric Van Hensbergen }
61e0459f57SAneesh Kumar K.V #endif
62