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 http://www.opensolaris.org/os/licensing. 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); 43 44 extern const struct inode_operations zpl_inode_operations; 45 extern const struct inode_operations zpl_dir_inode_operations; 46 extern const struct inode_operations zpl_symlink_inode_operations; 47 extern const struct inode_operations zpl_special_inode_operations; 48 extern dentry_operations_t zpl_dentry_operations; 49 extern const struct address_space_operations zpl_address_space_operations; 50 extern const struct file_operations zpl_file_operations; 51 extern const struct file_operations zpl_dir_file_operations; 52 53 /* zpl_super.c */ 54 extern void zpl_prune_sb(int64_t nr_to_scan, void *arg); 55 56 extern const struct super_operations zpl_super_operations; 57 extern const struct export_operations zpl_export_operations; 58 extern struct file_system_type zpl_fs_type; 59 60 /* zpl_xattr.c */ 61 extern ssize_t zpl_xattr_list(struct dentry *dentry, char *buf, size_t size); 62 extern int zpl_xattr_security_init(struct inode *ip, struct inode *dip, 63 const struct qstr *qstr); 64 #if defined(CONFIG_FS_POSIX_ACL) 65 #if defined(HAVE_SET_ACL) 66 #if defined(HAVE_SET_ACL_USERNS) 67 extern int zpl_set_acl(struct user_namespace *userns, struct inode *ip, 68 struct posix_acl *acl, int type); 69 #else 70 extern int zpl_set_acl(struct inode *ip, struct posix_acl *acl, int type); 71 #endif /* HAVE_SET_ACL_USERNS */ 72 #endif /* HAVE_SET_ACL */ 73 extern struct posix_acl *zpl_get_acl(struct inode *ip, int type); 74 extern int zpl_init_acl(struct inode *ip, struct inode *dir); 75 extern int zpl_chmod_acl(struct inode *ip); 76 #else 77 static inline int 78 zpl_init_acl(struct inode *ip, struct inode *dir) 79 { 80 return (0); 81 } 82 83 static inline int 84 zpl_chmod_acl(struct inode *ip) 85 { 86 return (0); 87 } 88 #endif /* CONFIG_FS_POSIX_ACL */ 89 90 extern xattr_handler_t *zpl_xattr_handlers[]; 91 92 /* zpl_ctldir.c */ 93 extern const struct file_operations zpl_fops_root; 94 extern const struct inode_operations zpl_ops_root; 95 96 extern const struct file_operations zpl_fops_snapdir; 97 extern const struct inode_operations zpl_ops_snapdir; 98 extern const struct dentry_operations zpl_dops_snapdirs; 99 100 extern const struct file_operations zpl_fops_shares; 101 extern const struct inode_operations zpl_ops_shares; 102 103 #if defined(HAVE_VFS_ITERATE) || defined(HAVE_VFS_ITERATE_SHARED) 104 105 #define ZPL_DIR_CONTEXT_INIT(_dirent, _actor, _pos) { \ 106 .actor = _actor, \ 107 .pos = _pos, \ 108 } 109 110 typedef struct dir_context zpl_dir_context_t; 111 112 #define zpl_dir_emit dir_emit 113 #define zpl_dir_emit_dot dir_emit_dot 114 #define zpl_dir_emit_dotdot dir_emit_dotdot 115 #define zpl_dir_emit_dots dir_emit_dots 116 117 #else 118 119 typedef struct zpl_dir_context { 120 void *dirent; 121 const filldir_t actor; 122 loff_t pos; 123 } zpl_dir_context_t; 124 125 #define ZPL_DIR_CONTEXT_INIT(_dirent, _actor, _pos) { \ 126 .dirent = _dirent, \ 127 .actor = _actor, \ 128 .pos = _pos, \ 129 } 130 131 static inline bool 132 zpl_dir_emit(zpl_dir_context_t *ctx, const char *name, int namelen, 133 uint64_t ino, unsigned type) 134 { 135 return (!ctx->actor(ctx->dirent, name, namelen, ctx->pos, ino, type)); 136 } 137 138 static inline bool 139 zpl_dir_emit_dot(struct file *file, zpl_dir_context_t *ctx) 140 { 141 return (ctx->actor(ctx->dirent, ".", 1, ctx->pos, 142 file_inode(file)->i_ino, DT_DIR) == 0); 143 } 144 145 static inline bool 146 zpl_dir_emit_dotdot(struct file *file, zpl_dir_context_t *ctx) 147 { 148 return (ctx->actor(ctx->dirent, "..", 2, ctx->pos, 149 parent_ino(file_dentry(file)), DT_DIR) == 0); 150 } 151 152 static inline bool 153 zpl_dir_emit_dots(struct file *file, zpl_dir_context_t *ctx) 154 { 155 if (ctx->pos == 0) { 156 if (!zpl_dir_emit_dot(file, ctx)) 157 return (false); 158 ctx->pos = 1; 159 } 160 if (ctx->pos == 1) { 161 if (!zpl_dir_emit_dotdot(file, ctx)) 162 return (false); 163 ctx->pos = 2; 164 } 165 return (true); 166 } 167 #endif /* HAVE_VFS_ITERATE */ 168 169 #if defined(HAVE_INODE_TIMESTAMP_TRUNCATE) 170 #define zpl_inode_timestamp_truncate(ts, ip) timestamp_truncate(ts, ip) 171 #elif defined(HAVE_INODE_TIMESPEC64_TIMES) 172 #define zpl_inode_timestamp_truncate(ts, ip) \ 173 timespec64_trunc(ts, (ip)->i_sb->s_time_gran) 174 #else 175 #define zpl_inode_timestamp_truncate(ts, ip) \ 176 timespec_trunc(ts, (ip)->i_sb->s_time_gran) 177 #endif 178 179 #if defined(HAVE_INODE_OWNER_OR_CAPABLE) 180 #define zpl_inode_owner_or_capable(ns, ip) inode_owner_or_capable(ip) 181 #elif defined(HAVE_INODE_OWNER_OR_CAPABLE_IDMAPPED) 182 #define zpl_inode_owner_or_capable(ns, ip) inode_owner_or_capable(ns, ip) 183 #else 184 #error "Unsupported kernel" 185 #endif 186 187 #ifdef HAVE_SETATTR_PREPARE_USERNS 188 #define zpl_setattr_prepare(ns, dentry, ia) setattr_prepare(ns, dentry, ia) 189 #else 190 /* 191 * Use kernel-provided version, or our own from 192 * linux/vfs_compat.h 193 */ 194 #define zpl_setattr_prepare(ns, dentry, ia) setattr_prepare(dentry, ia) 195 #endif 196 197 #endif /* _SYS_ZPL_H */ 198