linux/fs/ksmbd/vfs.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
   4 *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
   5 */
   6
   7#ifndef __KSMBD_VFS_H__
   8#define __KSMBD_VFS_H__
   9
  10#include <linux/file.h>
  11#include <linux/fs.h>
  12#include <linux/namei.h>
  13#include <uapi/linux/xattr.h>
  14#include <linux/posix_acl.h>
  15
  16#include "smbacl.h"
  17#include "xattr.h"
  18
  19/*
  20 * Enumeration for stream type.
  21 */
  22enum {
  23        DATA_STREAM     = 1,    /* type $DATA */
  24        DIR_STREAM              /* type $INDEX_ALLOCATION */
  25};
  26
  27/* CreateOptions */
  28/* Flag is set, it must not be a file , valid for directory only */
  29#define FILE_DIRECTORY_FILE_LE                  cpu_to_le32(0x00000001)
  30#define FILE_WRITE_THROUGH_LE                   cpu_to_le32(0x00000002)
  31#define FILE_SEQUENTIAL_ONLY_LE                 cpu_to_le32(0x00000004)
  32
  33/* Should not buffer on server*/
  34#define FILE_NO_INTERMEDIATE_BUFFERING_LE       cpu_to_le32(0x00000008)
  35/* MBZ */
  36#define FILE_SYNCHRONOUS_IO_ALERT_LE            cpu_to_le32(0x00000010)
  37/* MBZ */
  38#define FILE_SYNCHRONOUS_IO_NONALERT_LE         cpu_to_le32(0x00000020)
  39
  40/* Flaf must not be set for directory */
  41#define FILE_NON_DIRECTORY_FILE_LE              cpu_to_le32(0x00000040)
  42
  43/* Should be zero */
  44#define CREATE_TREE_CONNECTION                  cpu_to_le32(0x00000080)
  45#define FILE_COMPLETE_IF_OPLOCKED_LE            cpu_to_le32(0x00000100)
  46#define FILE_NO_EA_KNOWLEDGE_LE                 cpu_to_le32(0x00000200)
  47#define FILE_OPEN_REMOTE_INSTANCE               cpu_to_le32(0x00000400)
  48
  49/**
  50 * Doc says this is obsolete "open for recovery" flag should be zero
  51 * in any case.
  52 */
  53#define CREATE_OPEN_FOR_RECOVERY                cpu_to_le32(0x00000400)
  54#define FILE_RANDOM_ACCESS_LE                   cpu_to_le32(0x00000800)
  55#define FILE_DELETE_ON_CLOSE_LE                 cpu_to_le32(0x00001000)
  56#define FILE_OPEN_BY_FILE_ID_LE                 cpu_to_le32(0x00002000)
  57#define FILE_OPEN_FOR_BACKUP_INTENT_LE          cpu_to_le32(0x00004000)
  58#define FILE_NO_COMPRESSION_LE                  cpu_to_le32(0x00008000)
  59
  60/* Should be zero*/
  61#define FILE_OPEN_REQUIRING_OPLOCK              cpu_to_le32(0x00010000)
  62#define FILE_DISALLOW_EXCLUSIVE                 cpu_to_le32(0x00020000)
  63#define FILE_RESERVE_OPFILTER_LE                cpu_to_le32(0x00100000)
  64#define FILE_OPEN_REPARSE_POINT_LE              cpu_to_le32(0x00200000)
  65#define FILE_OPEN_NO_RECALL_LE                  cpu_to_le32(0x00400000)
  66
  67/* Should be zero */
  68#define FILE_OPEN_FOR_FREE_SPACE_QUERY_LE       cpu_to_le32(0x00800000)
  69#define CREATE_OPTIONS_MASK                     cpu_to_le32(0x00FFFFFF)
  70#define CREATE_OPTION_READONLY                  0x10000000
  71/* system. NB not sent over wire */
  72#define CREATE_OPTION_SPECIAL                   0x20000000
  73
  74struct ksmbd_work;
  75struct ksmbd_file;
  76struct ksmbd_conn;
  77
  78struct ksmbd_dir_info {
  79        const char      *name;
  80        char            *wptr;
  81        char            *rptr;
  82        int             name_len;
  83        int             out_buf_len;
  84        int             num_entry;
  85        int             data_count;
  86        int             last_entry_offset;
  87        bool            hide_dot_file;
  88        int             flags;
  89};
  90
  91struct ksmbd_readdir_data {
  92        struct dir_context      ctx;
  93        union {
  94                void            *private;
  95                char            *dirent;
  96        };
  97
  98        unsigned int            used;
  99        unsigned int            dirent_count;
 100        unsigned int            file_attr;
 101};
 102
 103/* ksmbd kstat wrapper to get valid create time when reading dir entry */
 104struct ksmbd_kstat {
 105        struct kstat            *kstat;
 106        unsigned long long      create_time;
 107        __le32                  file_attributes;
 108};
 109
 110int ksmbd_vfs_lock_parent(struct user_namespace *user_ns, struct dentry *parent,
 111                          struct dentry *child);
 112int ksmbd_vfs_may_delete(struct user_namespace *user_ns, struct dentry *dentry);
 113int ksmbd_vfs_query_maximal_access(struct user_namespace *user_ns,
 114                                   struct dentry *dentry, __le32 *daccess);
 115int ksmbd_vfs_create(struct ksmbd_work *work, const char *name, umode_t mode);
 116int ksmbd_vfs_mkdir(struct ksmbd_work *work, const char *name, umode_t mode);
 117int ksmbd_vfs_read(struct ksmbd_work *work, struct ksmbd_file *fp,
 118                   size_t count, loff_t *pos);
 119int ksmbd_vfs_write(struct ksmbd_work *work, struct ksmbd_file *fp,
 120                    char *buf, size_t count, loff_t *pos, bool sync,
 121                    ssize_t *written);
 122int ksmbd_vfs_fsync(struct ksmbd_work *work, u64 fid, u64 p_id);
 123int ksmbd_vfs_remove_file(struct ksmbd_work *work, char *name);
 124int ksmbd_vfs_link(struct ksmbd_work *work,
 125                   const char *oldname, const char *newname);
 126int ksmbd_vfs_getattr(struct path *path, struct kstat *stat);
 127int ksmbd_vfs_fp_rename(struct ksmbd_work *work, struct ksmbd_file *fp,
 128                        char *newname);
 129int ksmbd_vfs_truncate(struct ksmbd_work *work,
 130                       struct ksmbd_file *fp, loff_t size);
 131struct srv_copychunk;
 132int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work,
 133                               struct ksmbd_file *src_fp,
 134                               struct ksmbd_file *dst_fp,
 135                               struct srv_copychunk *chunks,
 136                               unsigned int chunk_count,
 137                               unsigned int *chunk_count_written,
 138                               unsigned int *chunk_size_written,
 139                               loff_t  *total_size_written);
 140ssize_t ksmbd_vfs_listxattr(struct dentry *dentry, char **list);
 141ssize_t ksmbd_vfs_getxattr(struct user_namespace *user_ns,
 142                           struct dentry *dentry,
 143                           char *xattr_name,
 144                           char **xattr_buf);
 145ssize_t ksmbd_vfs_casexattr_len(struct user_namespace *user_ns,
 146                                struct dentry *dentry, char *attr_name,
 147                                int attr_name_len);
 148int ksmbd_vfs_setxattr(struct user_namespace *user_ns,
 149                       struct dentry *dentry, const char *attr_name,
 150                       const void *attr_value, size_t attr_size, int flags);
 151int ksmbd_vfs_xattr_stream_name(char *stream_name, char **xattr_stream_name,
 152                                size_t *xattr_stream_name_size, int s_type);
 153int ksmbd_vfs_remove_xattr(struct user_namespace *user_ns,
 154                           struct dentry *dentry, char *attr_name);
 155int ksmbd_vfs_kern_path(struct ksmbd_work *work,
 156                        char *name, unsigned int flags, struct path *path,
 157                        bool caseless);
 158struct dentry *ksmbd_vfs_kern_path_create(struct ksmbd_work *work,
 159                                          const char *name,
 160                                          unsigned int flags,
 161                                          struct path *path);
 162int ksmbd_vfs_empty_dir(struct ksmbd_file *fp);
 163void ksmbd_vfs_set_fadvise(struct file *filp, __le32 option);
 164int ksmbd_vfs_zero_data(struct ksmbd_work *work, struct ksmbd_file *fp,
 165                        loff_t off, loff_t len);
 166struct file_allocated_range_buffer;
 167int ksmbd_vfs_fqar_lseek(struct ksmbd_file *fp, loff_t start, loff_t length,
 168                         struct file_allocated_range_buffer *ranges,
 169                         unsigned int in_count, unsigned int *out_count);
 170int ksmbd_vfs_unlink(struct user_namespace *user_ns,
 171                     struct dentry *dir, struct dentry *dentry);
 172void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat);
 173int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work,
 174                                struct user_namespace *user_ns,
 175                                struct dentry *dentry,
 176                                struct ksmbd_kstat *ksmbd_kstat);
 177void ksmbd_vfs_posix_lock_wait(struct file_lock *flock);
 178int ksmbd_vfs_posix_lock_wait_timeout(struct file_lock *flock, long timeout);
 179void ksmbd_vfs_posix_lock_unblock(struct file_lock *flock);
 180int ksmbd_vfs_remove_acl_xattrs(struct user_namespace *user_ns,
 181                                struct dentry *dentry);
 182int ksmbd_vfs_remove_sd_xattrs(struct user_namespace *user_ns,
 183                               struct dentry *dentry);
 184int ksmbd_vfs_set_sd_xattr(struct ksmbd_conn *conn,
 185                           struct user_namespace *user_ns,
 186                           struct dentry *dentry,
 187                           struct smb_ntsd *pntsd, int len);
 188int ksmbd_vfs_get_sd_xattr(struct ksmbd_conn *conn,
 189                           struct user_namespace *user_ns,
 190                           struct dentry *dentry,
 191                           struct smb_ntsd **pntsd);
 192int ksmbd_vfs_set_dos_attrib_xattr(struct user_namespace *user_ns,
 193                                   struct dentry *dentry,
 194                                   struct xattr_dos_attrib *da);
 195int ksmbd_vfs_get_dos_attrib_xattr(struct user_namespace *user_ns,
 196                                   struct dentry *dentry,
 197                                   struct xattr_dos_attrib *da);
 198int ksmbd_vfs_set_init_posix_acl(struct user_namespace *user_ns,
 199                                 struct inode *inode);
 200int ksmbd_vfs_inherit_posix_acl(struct user_namespace *user_ns,
 201                                struct inode *inode,
 202                                struct inode *parent_inode);
 203#endif /* __KSMBD_VFS_H__ */
 204