1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or https://opensource.org/licenses/CDDL-1.0. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2011, Lawrence Livermore National Security, LLC. 23 */ 24 25 #ifndef _SYS_ZPL_H 26 #define _SYS_ZPL_H 27 28 #include <sys/mntent.h> 29 #include <sys/vfs.h> 30 #include <linux/aio.h> 31 #include <linux/dcache_compat.h> 32 #include <linux/exportfs.h> 33 #include <linux/falloc.h> 34 #include <linux/parser.h> 35 #include <linux/task_io_accounting_ops.h> 36 #include <linux/vfs_compat.h> 37 #include <linux/writeback.h> 38 #include <linux/xattr_compat.h> 39 40 /* zpl_inode.c */ 41 extern void zpl_vap_init(vattr_t *vap, struct inode *dir, 42 umode_t mode, cred_t *cr, zidmap_t *mnt_ns); 43 44 extern const struct inode_operations zpl_inode_operations; 45 #ifdef HAVE_RENAME2_OPERATIONS_WRAPPER 46 extern const struct inode_operations_wrapper zpl_dir_inode_operations; 47 #else 48 extern const struct inode_operations zpl_dir_inode_operations; 49 #endif 50 extern const struct inode_operations zpl_symlink_inode_operations; 51 extern const struct inode_operations zpl_special_inode_operations; 52 53 /* zpl_file.c */ 54 extern const struct address_space_operations zpl_address_space_operations; 55 extern const struct file_operations zpl_file_operations; 56 extern const struct file_operations zpl_dir_file_operations; 57 58 /* zpl_super.c */ 59 extern void zpl_prune_sb(int64_t nr_to_scan, void *arg); 60 61 extern const struct super_operations zpl_super_operations; 62 extern const struct export_operations zpl_export_operations; 63 extern struct file_system_type zpl_fs_type; 64 65 /* zpl_xattr.c */ 66 extern ssize_t zpl_xattr_list(struct dentry *dentry, char *buf, size_t size); 67 extern int zpl_xattr_security_init(struct inode *ip, struct inode *dip, 68 const struct qstr *qstr); 69 #if defined(CONFIG_FS_POSIX_ACL) 70 #if defined(HAVE_SET_ACL) 71 #if defined(HAVE_SET_ACL_IDMAP_DENTRY) 72 extern int zpl_set_acl(struct mnt_idmap *idmap, struct dentry *dentry, 73 struct posix_acl *acl, int type); 74 #elif defined(HAVE_SET_ACL_USERNS) 75 extern int zpl_set_acl(struct user_namespace *userns, struct inode *ip, 76 struct posix_acl *acl, int type); 77 #elif defined(HAVE_SET_ACL_USERNS_DENTRY_ARG2) 78 extern int zpl_set_acl(struct user_namespace *userns, struct dentry *dentry, 79 struct posix_acl *acl, int type); 80 #else 81 extern int zpl_set_acl(struct inode *ip, struct posix_acl *acl, int type); 82 #endif /* HAVE_SET_ACL_USERNS */ 83 #endif /* HAVE_SET_ACL */ 84 #if defined(HAVE_GET_ACL_RCU) || defined(HAVE_GET_INODE_ACL) 85 extern struct posix_acl *zpl_get_acl(struct inode *ip, int type, bool rcu); 86 #elif defined(HAVE_GET_ACL) 87 extern struct posix_acl *zpl_get_acl(struct inode *ip, int type); 88 #endif 89 extern int zpl_init_acl(struct inode *ip, struct inode *dir); 90 extern int zpl_chmod_acl(struct inode *ip); 91 #else 92 static inline int 93 zpl_init_acl(struct inode *ip, struct inode *dir) 94 { 95 return (0); 96 } 97 98 static inline int 99 zpl_chmod_acl(struct inode *ip) 100 { 101 return (0); 102 } 103 #endif /* CONFIG_FS_POSIX_ACL */ 104 105 extern xattr_handler_t *zpl_xattr_handlers[]; 106 107 /* zpl_ctldir.c */ 108 extern const struct file_operations zpl_fops_root; 109 extern const struct inode_operations zpl_ops_root; 110 111 extern const struct file_operations zpl_fops_snapdir; 112 extern const struct inode_operations zpl_ops_snapdir; 113 114 extern const struct file_operations zpl_fops_shares; 115 extern const struct inode_operations zpl_ops_shares; 116 117 #if defined(HAVE_VFS_ITERATE) || defined(HAVE_VFS_ITERATE_SHARED) 118 119 #define ZPL_DIR_CONTEXT_INIT(_dirent, _actor, _pos) { \ 120 .actor = _actor, \ 121 .pos = _pos, \ 122 } 123 124 typedef struct dir_context zpl_dir_context_t; 125 126 #define zpl_dir_emit dir_emit 127 #define zpl_dir_emit_dot dir_emit_dot 128 #define zpl_dir_emit_dotdot dir_emit_dotdot 129 #define zpl_dir_emit_dots dir_emit_dots 130 131 #else 132 133 typedef struct zpl_dir_context { 134 void *dirent; 135 const filldir_t actor; 136 loff_t pos; 137 } zpl_dir_context_t; 138 139 #define ZPL_DIR_CONTEXT_INIT(_dirent, _actor, _pos) { \ 140 .dirent = _dirent, \ 141 .actor = _actor, \ 142 .pos = _pos, \ 143 } 144 145 static inline bool 146 zpl_dir_emit(zpl_dir_context_t *ctx, const char *name, int namelen, 147 uint64_t ino, unsigned type) 148 { 149 return (!ctx->actor(ctx->dirent, name, namelen, ctx->pos, ino, type)); 150 } 151 152 static inline bool 153 zpl_dir_emit_dot(struct file *file, zpl_dir_context_t *ctx) 154 { 155 return (ctx->actor(ctx->dirent, ".", 1, ctx->pos, 156 file_inode(file)->i_ino, DT_DIR) == 0); 157 } 158 159 static inline bool 160 zpl_dir_emit_dotdot(struct file *file, zpl_dir_context_t *ctx) 161 { 162 return (ctx->actor(ctx->dirent, "..", 2, ctx->pos, 163 parent_ino(file_dentry(file)), DT_DIR) == 0); 164 } 165 166 static inline bool 167 zpl_dir_emit_dots(struct file *file, zpl_dir_context_t *ctx) 168 { 169 if (ctx->pos == 0) { 170 if (!zpl_dir_emit_dot(file, ctx)) 171 return (false); 172 ctx->pos = 1; 173 } 174 if (ctx->pos == 1) { 175 if (!zpl_dir_emit_dotdot(file, ctx)) 176 return (false); 177 ctx->pos = 2; 178 } 179 return (true); 180 } 181 #endif /* HAVE_VFS_ITERATE */ 182 183 #if defined(HAVE_INODE_TIMESTAMP_TRUNCATE) 184 #define zpl_inode_timestamp_truncate(ts, ip) timestamp_truncate(ts, ip) 185 #elif defined(HAVE_INODE_TIMESPEC64_TIMES) 186 #define zpl_inode_timestamp_truncate(ts, ip) \ 187 timespec64_trunc(ts, (ip)->i_sb->s_time_gran) 188 #else 189 #define zpl_inode_timestamp_truncate(ts, ip) \ 190 timespec_trunc(ts, (ip)->i_sb->s_time_gran) 191 #endif 192 193 #if defined(HAVE_INODE_OWNER_OR_CAPABLE) 194 #define zpl_inode_owner_or_capable(ns, ip) inode_owner_or_capable(ip) 195 #elif defined(HAVE_INODE_OWNER_OR_CAPABLE_USERNS) 196 #define zpl_inode_owner_or_capable(ns, ip) inode_owner_or_capable(ns, ip) 197 #elif defined(HAVE_INODE_OWNER_OR_CAPABLE_IDMAP) 198 #define zpl_inode_owner_or_capable(idmap, ip) inode_owner_or_capable(idmap, ip) 199 #else 200 #error "Unsupported kernel" 201 #endif 202 203 #if defined(HAVE_SETATTR_PREPARE_USERNS) || defined(HAVE_SETATTR_PREPARE_IDMAP) 204 #define zpl_setattr_prepare(ns, dentry, ia) setattr_prepare(ns, dentry, ia) 205 #else 206 /* 207 * Use kernel-provided version, or our own from 208 * linux/vfs_compat.h 209 */ 210 #define zpl_setattr_prepare(ns, dentry, ia) setattr_prepare(dentry, ia) 211 #endif 212 213 #endif /* _SYS_ZPL_H */ 214