vfs.h 5.8 KB
Newer Older
N
Namjae Jeon 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
 *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
 */

#ifndef __KSMBD_VFS_H__
#define __KSMBD_VFS_H__

#include <linux/file.h>
#include <linux/fs.h>
#include <linux/namei.h>
#include <uapi/linux/xattr.h>
#include <linux/posix_acl.h>
15
#include <linux/unicode.h>
N
Namjae Jeon 已提交
16 17

#include "smbacl.h"
18
#include "xattr.h"
N
Namjae Jeon 已提交
19

20 21 22 23 24 25 26 27
/*
 * Enumeration for stream type.
 */
enum {
	DATA_STREAM	= 1,	/* type $DATA */
	DIR_STREAM		/* type $INDEX_ALLOCATION */
};

N
Namjae Jeon 已提交
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
/* CreateOptions */
#define CREATE_TREE_CONNECTION			cpu_to_le32(0x00000080)
#define FILE_RESERVE_OPFILTER_LE		cpu_to_le32(0x00100000)

#define CREATE_OPTION_READONLY			0x10000000
/* system. NB not sent over wire */
#define CREATE_OPTION_SPECIAL			0x20000000

struct ksmbd_work;
struct ksmbd_file;
struct ksmbd_conn;

struct ksmbd_dir_info {
	const char	*name;
	char		*wptr;
	char		*rptr;
	int		name_len;
	int		out_buf_len;
	int		num_entry;
	int		data_count;
	int		last_entry_offset;
	bool		hide_dot_file;
	int		flags;
51
	int		last_entry_off_align;
N
Namjae Jeon 已提交
52 53 54 55 56 57 58 59 60 61 62 63
};

struct ksmbd_readdir_data {
	struct dir_context	ctx;
	union {
		void		*private;
		char		*dirent;
	};

	unsigned int		used;
	unsigned int		dirent_count;
	unsigned int		file_attr;
64
	struct unicode_map	*um;
N
Namjae Jeon 已提交
65 66 67 68 69 70 71 72 73
};

/* ksmbd kstat wrapper to get valid create time when reading dir entry */
struct ksmbd_kstat {
	struct kstat		*kstat;
	unsigned long long	create_time;
	__le32			file_attributes;
};

74 75
int ksmbd_vfs_lock_parent(struct user_namespace *user_ns, struct dentry *parent,
			  struct dentry *child);
H
Hyunchul Lee 已提交
76 77 78
int ksmbd_vfs_may_delete(struct user_namespace *user_ns, struct dentry *dentry);
int ksmbd_vfs_query_maximal_access(struct user_namespace *user_ns,
				   struct dentry *dentry, __le32 *daccess);
N
Namjae Jeon 已提交
79 80 81
int ksmbd_vfs_create(struct ksmbd_work *work, const char *name, umode_t mode);
int ksmbd_vfs_mkdir(struct ksmbd_work *work, const char *name, umode_t mode);
int ksmbd_vfs_read(struct ksmbd_work *work, struct ksmbd_file *fp,
82
		   size_t count, loff_t *pos);
N
Namjae Jeon 已提交
83
int ksmbd_vfs_write(struct ksmbd_work *work, struct ksmbd_file *fp,
84 85
		    char *buf, size_t count, loff_t *pos, bool sync,
		    ssize_t *written);
86
int ksmbd_vfs_fsync(struct ksmbd_work *work, u64 fid, u64 p_id);
N
Namjae Jeon 已提交
87 88
int ksmbd_vfs_remove_file(struct ksmbd_work *work, char *name);
int ksmbd_vfs_link(struct ksmbd_work *work,
89
		   const char *oldname, const char *newname);
A
Al Viro 已提交
90
int ksmbd_vfs_getattr(const struct path *path, struct kstat *stat);
N
Namjae Jeon 已提交
91
int ksmbd_vfs_fp_rename(struct ksmbd_work *work, struct ksmbd_file *fp,
92
			char *newname);
93
int ksmbd_vfs_truncate(struct ksmbd_work *work,
94
		       struct ksmbd_file *fp, loff_t size);
N
Namjae Jeon 已提交
95 96
struct srv_copychunk;
int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work,
97 98 99 100 101 102 103
			       struct ksmbd_file *src_fp,
			       struct ksmbd_file *dst_fp,
			       struct srv_copychunk *chunks,
			       unsigned int chunk_count,
			       unsigned int *chunk_count_written,
			       unsigned int *chunk_size_written,
			       loff_t  *total_size_written);
N
Namjae Jeon 已提交
104
ssize_t ksmbd_vfs_listxattr(struct dentry *dentry, char **list);
H
Hyunchul Lee 已提交
105 106 107
ssize_t ksmbd_vfs_getxattr(struct user_namespace *user_ns,
			   struct dentry *dentry,
			   char *xattr_name,
108
			   char **xattr_buf);
H
Hyunchul Lee 已提交
109 110
ssize_t ksmbd_vfs_casexattr_len(struct user_namespace *user_ns,
				struct dentry *dentry, char *attr_name,
111
				int attr_name_len);
H
Hyunchul Lee 已提交
112 113
int ksmbd_vfs_setxattr(struct user_namespace *user_ns,
		       struct dentry *dentry, const char *attr_name,
114
		       void *attr_value, size_t attr_size, int flags);
115
int ksmbd_vfs_xattr_stream_name(char *stream_name, char **xattr_stream_name,
116
				size_t *xattr_stream_name_size, int s_type);
H
Hyunchul Lee 已提交
117 118
int ksmbd_vfs_remove_xattr(struct user_namespace *user_ns,
			   struct dentry *dentry, char *attr_name);
119 120
int ksmbd_vfs_kern_path(struct ksmbd_work *work,
			char *name, unsigned int flags, struct path *path,
121
			bool caseless);
122 123 124 125
struct dentry *ksmbd_vfs_kern_path_create(struct ksmbd_work *work,
					  const char *name,
					  unsigned int flags,
					  struct path *path);
N
Namjae Jeon 已提交
126 127
int ksmbd_vfs_empty_dir(struct ksmbd_file *fp);
void ksmbd_vfs_set_fadvise(struct file *filp, __le32 option);
128
int ksmbd_vfs_zero_data(struct ksmbd_work *work, struct ksmbd_file *fp,
129
			loff_t off, loff_t len);
N
Namjae Jeon 已提交
130 131
struct file_allocated_range_buffer;
int ksmbd_vfs_fqar_lseek(struct ksmbd_file *fp, loff_t start, loff_t length,
132
			 struct file_allocated_range_buffer *ranges,
N
Namjae Jeon 已提交
133
			 unsigned int in_count, unsigned int *out_count);
H
Hyunchul Lee 已提交
134 135
int ksmbd_vfs_unlink(struct user_namespace *user_ns,
		     struct dentry *dir, struct dentry *dentry);
N
Namjae Jeon 已提交
136
void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat);
H
Hyunchul Lee 已提交
137 138 139
int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work,
				struct user_namespace *user_ns,
				struct dentry *dentry,
140
				struct ksmbd_kstat *ksmbd_kstat);
141
void ksmbd_vfs_posix_lock_wait(struct file_lock *flock);
N
Namjae Jeon 已提交
142 143
int ksmbd_vfs_posix_lock_wait_timeout(struct file_lock *flock, long timeout);
void ksmbd_vfs_posix_lock_unblock(struct file_lock *flock);
H
Hyunchul Lee 已提交
144 145 146 147 148 149 150
int ksmbd_vfs_remove_acl_xattrs(struct user_namespace *user_ns,
				struct dentry *dentry);
int ksmbd_vfs_remove_sd_xattrs(struct user_namespace *user_ns,
			       struct dentry *dentry);
int ksmbd_vfs_set_sd_xattr(struct ksmbd_conn *conn,
			   struct user_namespace *user_ns,
			   struct dentry *dentry,
151
			   struct smb_ntsd *pntsd, int len);
H
Hyunchul Lee 已提交
152 153 154
int ksmbd_vfs_get_sd_xattr(struct ksmbd_conn *conn,
			   struct user_namespace *user_ns,
			   struct dentry *dentry,
155
			   struct smb_ntsd **pntsd);
H
Hyunchul Lee 已提交
156 157
int ksmbd_vfs_set_dos_attrib_xattr(struct user_namespace *user_ns,
				   struct dentry *dentry,
158
				   struct xattr_dos_attrib *da);
H
Hyunchul Lee 已提交
159 160
int ksmbd_vfs_get_dos_attrib_xattr(struct user_namespace *user_ns,
				   struct dentry *dentry,
161
				   struct xattr_dos_attrib *da);
H
Hyunchul Lee 已提交
162 163 164 165
int ksmbd_vfs_set_init_posix_acl(struct user_namespace *user_ns,
				 struct inode *inode);
int ksmbd_vfs_inherit_posix_acl(struct user_namespace *user_ns,
				struct inode *inode,
166
				struct inode *parent_inode);
N
Namjae Jeon 已提交
167
#endif /* __KSMBD_VFS_H__ */