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