cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vfs_cache.h (4203B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 *   Copyright (C) 2019 Samsung Electronics Co., Ltd.
      4 */
      5
      6#ifndef __VFS_CACHE_H__
      7#define __VFS_CACHE_H__
      8
      9#include <linux/file.h>
     10#include <linux/fs.h>
     11#include <linux/rwsem.h>
     12#include <linux/spinlock.h>
     13#include <linux/idr.h>
     14#include <linux/workqueue.h>
     15
     16#include "vfs.h"
     17
     18/* Windows style file permissions for extended response */
     19#define	FILE_GENERIC_ALL	0x1F01FF
     20#define	FILE_GENERIC_READ	0x120089
     21#define	FILE_GENERIC_WRITE	0x120116
     22#define	FILE_GENERIC_EXECUTE	0X1200a0
     23
     24#define KSMBD_START_FID		0
     25#define KSMBD_NO_FID		(INT_MAX)
     26#define SMB2_NO_FID		(0xFFFFFFFFFFFFFFFFULL)
     27
     28struct ksmbd_conn;
     29struct ksmbd_session;
     30
     31struct ksmbd_lock {
     32	struct file_lock *fl;
     33	struct list_head clist;
     34	struct list_head flist;
     35	struct list_head llist;
     36	unsigned int flags;
     37	int cmd;
     38	int zero_len;
     39	unsigned long long start;
     40	unsigned long long end;
     41};
     42
     43struct stream {
     44	char *name;
     45	ssize_t size;
     46};
     47
     48struct ksmbd_inode {
     49	rwlock_t			m_lock;
     50	atomic_t			m_count;
     51	atomic_t			op_count;
     52	/* opinfo count for streams */
     53	atomic_t			sop_count;
     54	struct inode			*m_inode;
     55	unsigned int			m_flags;
     56	struct hlist_node		m_hash;
     57	struct list_head		m_fp_list;
     58	struct list_head		m_op_list;
     59	struct oplock_info		*m_opinfo;
     60	__le32				m_fattr;
     61};
     62
     63struct ksmbd_file {
     64	struct file			*filp;
     65	u64				persistent_id;
     66	u64				volatile_id;
     67
     68	spinlock_t			f_lock;
     69
     70	struct ksmbd_inode		*f_ci;
     71	struct ksmbd_inode		*f_parent_ci;
     72	struct oplock_info __rcu	*f_opinfo;
     73	struct ksmbd_conn		*conn;
     74	struct ksmbd_tree_connect	*tcon;
     75
     76	atomic_t			refcount;
     77	__le32				daccess;
     78	__le32				saccess;
     79	__le32				coption;
     80	__le32				cdoption;
     81	__u64				create_time;
     82	__u64				itime;
     83
     84	bool				is_nt_open;
     85	bool				attrib_only;
     86
     87	char				client_guid[16];
     88	char				create_guid[16];
     89	char				app_instance_id[16];
     90
     91	struct stream			stream;
     92	struct list_head		node;
     93	struct list_head		blocked_works;
     94	struct list_head		lock_list;
     95
     96	int				durable_timeout;
     97
     98	/* if ls is happening on directory, below is valid*/
     99	struct ksmbd_readdir_data	readdir_data;
    100	int				dot_dotdot[2];
    101};
    102
    103static inline void set_ctx_actor(struct dir_context *ctx,
    104				 filldir_t actor)
    105{
    106	ctx->actor = actor;
    107}
    108
    109#define KSMBD_NR_OPEN_DEFAULT BITS_PER_LONG
    110
    111struct ksmbd_file_table {
    112	rwlock_t		lock;
    113	struct idr		*idr;
    114};
    115
    116static inline bool has_file_id(u64 id)
    117{
    118	return id < KSMBD_NO_FID;
    119}
    120
    121static inline bool ksmbd_stream_fd(struct ksmbd_file *fp)
    122{
    123	return fp->stream.name != NULL;
    124}
    125
    126int ksmbd_init_file_table(struct ksmbd_file_table *ft);
    127void ksmbd_destroy_file_table(struct ksmbd_file_table *ft);
    128int ksmbd_close_fd(struct ksmbd_work *work, u64 id);
    129struct ksmbd_file *ksmbd_lookup_fd_fast(struct ksmbd_work *work, u64 id);
    130struct ksmbd_file *ksmbd_lookup_foreign_fd(struct ksmbd_work *work, u64 id);
    131struct ksmbd_file *ksmbd_lookup_fd_slow(struct ksmbd_work *work, u64 id,
    132					u64 pid);
    133void ksmbd_fd_put(struct ksmbd_work *work, struct ksmbd_file *fp);
    134struct ksmbd_file *ksmbd_lookup_durable_fd(unsigned long long id);
    135struct ksmbd_file *ksmbd_lookup_fd_cguid(char *cguid);
    136struct ksmbd_file *ksmbd_lookup_fd_inode(struct inode *inode);
    137unsigned int ksmbd_open_durable_fd(struct ksmbd_file *fp);
    138struct ksmbd_file *ksmbd_open_fd(struct ksmbd_work *work, struct file *filp);
    139void ksmbd_close_tree_conn_fds(struct ksmbd_work *work);
    140void ksmbd_close_session_fds(struct ksmbd_work *work);
    141int ksmbd_close_inode_fds(struct ksmbd_work *work, struct inode *inode);
    142int ksmbd_init_global_file_table(void);
    143void ksmbd_free_global_file_table(void);
    144void ksmbd_set_fd_limit(unsigned long limit);
    145
    146/*
    147 * INODE hash
    148 */
    149int __init ksmbd_inode_hash_init(void);
    150void ksmbd_release_inode_hash(void);
    151
    152enum KSMBD_INODE_STATUS {
    153	KSMBD_INODE_STATUS_OK,
    154	KSMBD_INODE_STATUS_UNKNOWN,
    155	KSMBD_INODE_STATUS_PENDING_DELETE,
    156};
    157
    158int ksmbd_query_inode_status(struct inode *inode);
    159bool ksmbd_inode_pending_delete(struct ksmbd_file *fp);
    160void ksmbd_set_inode_pending_delete(struct ksmbd_file *fp);
    161void ksmbd_clear_inode_pending_delete(struct ksmbd_file *fp);
    162void ksmbd_fd_set_delete_on_close(struct ksmbd_file *fp,
    163				  int file_info);
    164int ksmbd_init_file_cache(void);
    165void ksmbd_exit_file_cache(void);
    166#endif /* __VFS_CACHE_H__ */