blob: 29281b7c388703d6a6b809823198f37a9405241c [file] [log] [blame]
Thomas Gleixner1f327612019-05-28 09:57:16 -07001/* SPDX-License-Identifier: GPL-2.0-only */
Eric Van Hensbergen3ed84912005-09-09 13:04:24 -07002/*
3 * V9FS FID Management
4 *
5 * Copyright (C) 2005 by Eric Van Hensbergen <ericvh@gmail.com>
Eric Van Hensbergen3ed84912005-09-09 13:04:24 -07006 */
Aneesh Kumar K.Ve0459f52011-02-28 17:04:09 +05307#ifndef FS_9P_FID_H
8#define FS_9P_FID_H
Eric Van Hensbergen3ed84912005-09-09 13:04:24 -07009#include <linux/list.h>
Eric Van Hensbergen1543b4c2023-03-27 02:06:37 +000010#include "v9fs.h"
Eric Van Hensbergen3ed84912005-09-09 13:04:24 -070011
Eric Van Hensbergen1543b4c2023-03-27 02:06:37 +000012struct p9_fid *v9fs_fid_find_inode(struct inode *inode, bool want_writeable,
13 kuid_t uid, bool any);
Latchesar Ionkovbd238fb2007-07-10 17:57:28 -050014struct p9_fid *v9fs_fid_lookup(struct dentry *dentry);
Al Viro77d5a6b2016-05-29 15:29:26 -040015static inline struct p9_fid *v9fs_parent_fid(struct dentry *dentry)
16{
17 return v9fs_fid_lookup(dentry->d_parent);
18}
Dominique Martinetdafbe682022-06-12 16:05:39 +090019void v9fs_fid_add(struct dentry *dentry, struct p9_fid **fid);
Dominique Martinetdafbe682022-06-12 16:05:39 +090020void v9fs_open_fid_add(struct inode *inode, struct p9_fid **fid);
Al Viro797fc162016-08-03 11:02:48 -040021static inline struct p9_fid *clone_fid(struct p9_fid *fid)
22{
23 return IS_ERR(fid) ? fid : p9_client_walk(fid, 0, NULL, 1);
24}
Al Viro7d50a292016-08-03 11:12:12 -040025static inline struct p9_fid *v9fs_fid_clone(struct dentry *dentry)
26{
Jianyong Wu6636b6d2020-09-23 22:11:46 +080027 struct p9_fid *fid, *nfid;
28
29 fid = v9fs_fid_lookup(dentry);
30 if (!fid || IS_ERR(fid))
31 return fid;
32
Dominique Martinetff5e72e2020-11-03 09:35:57 +010033 nfid = clone_fid(fid);
Dominique Martinetb48dbb92022-06-12 13:42:32 +090034 p9_fid_put(fid);
Jianyong Wu6636b6d2020-09-23 22:11:46 +080035 return nfid;
Al Viro7d50a292016-08-03 11:12:12 -040036}
Eric Van Hensbergen1543b4c2023-03-27 02:06:37 +000037/**
38 * v9fs_fid_addmodes - add cache flags to fid mode (for client use only)
39 * @fid: fid to augment
40 * @s_flags: session info mount flags
41 * @s_cache: session info cache flags
42 * @f_flags: unix open flags
43 *
44 * make sure mode reflects flags of underlying mounts
45 * also qid.version == 0 reflects a synthetic or legacy file system
46 * NOTE: these are set after open so only reflect 9p client not
47 * underlying file system on server.
48 */
Eric Van Hensbergen09430ab2023-07-19 16:22:32 +000049static inline void v9fs_fid_add_modes(struct p9_fid *fid, unsigned int s_flags,
50 unsigned int s_cache, unsigned int f_flags)
Eric Van Hensbergen1543b4c2023-03-27 02:06:37 +000051{
52 if (fid->qid.type != P9_QTFILE)
53 return;
54
55 if ((!s_cache) ||
56 ((fid->qid.version == 0) && !(s_flags & V9FS_IGNORE_QV)) ||
57 (s_flags & V9FS_DIRECT_IO) || (f_flags & O_DIRECT)) {
58 fid->mode |= P9L_DIRECT; /* no read or write cache */
Eric Van Hensbergen4eb31172023-03-27 01:53:10 +000059 } else if ((!(s_cache & CACHE_WRITEBACK)) ||
Eric Van Hensbergen878cb3e2023-07-19 16:22:31 +000060 (f_flags & O_DSYNC) || (s_flags & V9FS_SYNC)) {
Eric Van Hensbergen1543b4c2023-03-27 02:06:37 +000061 fid->mode |= P9L_NOWRITECACHE;
Eric Van Hensbergen1543b4c2023-03-27 02:06:37 +000062 }
63}
Aneesh Kumar K.Ve0459f52011-02-28 17:04:09 +053064#endif