18d59ecb2SHans Petter Selasky /*- 28d59ecb2SHans Petter Selasky * Copyright (c) 2010 Isilon Systems, Inc. 38d59ecb2SHans Petter Selasky * Copyright (c) 2010 iX Systems, Inc. 48d59ecb2SHans Petter Selasky * Copyright (c) 2010 Panasas, Inc. 5*1125dbc0SHans Petter Selasky * Copyright (c) 2013-2016 Mellanox Technologies, Ltd. 68d59ecb2SHans Petter Selasky * All rights reserved. 78d59ecb2SHans Petter Selasky * 88d59ecb2SHans Petter Selasky * Redistribution and use in source and binary forms, with or without 98d59ecb2SHans Petter Selasky * modification, are permitted provided that the following conditions 108d59ecb2SHans Petter Selasky * are met: 118d59ecb2SHans Petter Selasky * 1. Redistributions of source code must retain the above copyright 128d59ecb2SHans Petter Selasky * notice unmodified, this list of conditions, and the following 138d59ecb2SHans Petter Selasky * disclaimer. 148d59ecb2SHans Petter Selasky * 2. Redistributions in binary form must reproduce the above copyright 158d59ecb2SHans Petter Selasky * notice, this list of conditions and the following disclaimer in the 168d59ecb2SHans Petter Selasky * documentation and/or other materials provided with the distribution. 178d59ecb2SHans Petter Selasky * 188d59ecb2SHans Petter Selasky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 198d59ecb2SHans Petter Selasky * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 208d59ecb2SHans Petter Selasky * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 218d59ecb2SHans Petter Selasky * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 228d59ecb2SHans Petter Selasky * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 238d59ecb2SHans Petter Selasky * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 248d59ecb2SHans Petter Selasky * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 258d59ecb2SHans Petter Selasky * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 268d59ecb2SHans Petter Selasky * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 278d59ecb2SHans Petter Selasky * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 288d59ecb2SHans Petter Selasky * 298d59ecb2SHans Petter Selasky * $FreeBSD$ 308d59ecb2SHans Petter Selasky */ 318d59ecb2SHans Petter Selasky #ifndef _LINUX_FS_H_ 328d59ecb2SHans Petter Selasky #define _LINUX_FS_H_ 338d59ecb2SHans Petter Selasky 348d59ecb2SHans Petter Selasky #include <sys/cdefs.h> 358d59ecb2SHans Petter Selasky #include <sys/param.h> 368d59ecb2SHans Petter Selasky #include <sys/systm.h> 378d59ecb2SHans Petter Selasky #include <sys/conf.h> 388d59ecb2SHans Petter Selasky #include <sys/vnode.h> 398d59ecb2SHans Petter Selasky #include <sys/file.h> 408d59ecb2SHans Petter Selasky #include <sys/filedesc.h> 418d59ecb2SHans Petter Selasky #include <linux/types.h> 428d59ecb2SHans Petter Selasky #include <linux/wait.h> 438d59ecb2SHans Petter Selasky #include <linux/semaphore.h> 448d59ecb2SHans Petter Selasky 458d59ecb2SHans Petter Selasky struct module; 468d59ecb2SHans Petter Selasky struct kiocb; 478d59ecb2SHans Petter Selasky struct iovec; 488d59ecb2SHans Petter Selasky struct dentry; 498d59ecb2SHans Petter Selasky struct page; 508d59ecb2SHans Petter Selasky struct file_lock; 518d59ecb2SHans Petter Selasky struct pipe_inode_info; 528d59ecb2SHans Petter Selasky struct vm_area_struct; 538d59ecb2SHans Petter Selasky struct poll_table_struct; 548d59ecb2SHans Petter Selasky struct files_struct; 558d59ecb2SHans Petter Selasky 568d59ecb2SHans Petter Selasky #define inode vnode 578d59ecb2SHans Petter Selasky #define i_cdev v_rdev 588d59ecb2SHans Petter Selasky 598d59ecb2SHans Petter Selasky #define S_IRUGO (S_IRUSR | S_IRGRP | S_IROTH) 608d59ecb2SHans Petter Selasky #define S_IWUGO (S_IWUSR | S_IWGRP | S_IWOTH) 618d59ecb2SHans Petter Selasky 628d59ecb2SHans Petter Selasky 638d59ecb2SHans Petter Selasky typedef struct files_struct *fl_owner_t; 648d59ecb2SHans Petter Selasky 658d59ecb2SHans Petter Selasky struct dentry { 668d59ecb2SHans Petter Selasky struct inode *d_inode; 678d59ecb2SHans Petter Selasky }; 688d59ecb2SHans Petter Selasky 698d59ecb2SHans Petter Selasky struct file_operations; 708d59ecb2SHans Petter Selasky 718d59ecb2SHans Petter Selasky struct linux_file { 728d59ecb2SHans Petter Selasky struct file *_file; 738d59ecb2SHans Petter Selasky const struct file_operations *f_op; 748d59ecb2SHans Petter Selasky void *private_data; 758d59ecb2SHans Petter Selasky int f_flags; 768d59ecb2SHans Petter Selasky int f_mode; /* Just starting mode. */ 778d59ecb2SHans Petter Selasky struct dentry *f_dentry; 788d59ecb2SHans Petter Selasky struct dentry f_dentry_store; 798d59ecb2SHans Petter Selasky struct selinfo f_selinfo; 808d59ecb2SHans Petter Selasky struct sigio *f_sigio; 818d59ecb2SHans Petter Selasky struct vnode *f_vnode; 828d59ecb2SHans Petter Selasky }; 838d59ecb2SHans Petter Selasky 848d59ecb2SHans Petter Selasky #define file linux_file 858d59ecb2SHans Petter Selasky #define fasync_struct sigio * 868d59ecb2SHans Petter Selasky 878d59ecb2SHans Petter Selasky #define fasync_helper(fd, filp, on, queue) \ 888d59ecb2SHans Petter Selasky ({ \ 898d59ecb2SHans Petter Selasky if ((on)) \ 908d59ecb2SHans Petter Selasky *(queue) = &(filp)->f_sigio; \ 918d59ecb2SHans Petter Selasky else \ 928d59ecb2SHans Petter Selasky *(queue) = NULL; \ 938d59ecb2SHans Petter Selasky 0; \ 948d59ecb2SHans Petter Selasky }) 958d59ecb2SHans Petter Selasky 968d59ecb2SHans Petter Selasky #define kill_fasync(queue, sig, pollstat) \ 978d59ecb2SHans Petter Selasky do { \ 988d59ecb2SHans Petter Selasky if (*(queue) != NULL) \ 998d59ecb2SHans Petter Selasky pgsigio(*(queue), (sig), 0); \ 1008d59ecb2SHans Petter Selasky } while (0) 1018d59ecb2SHans Petter Selasky 1028d59ecb2SHans Petter Selasky typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned); 1038d59ecb2SHans Petter Selasky 1048d59ecb2SHans Petter Selasky struct file_operations { 1058d59ecb2SHans Petter Selasky struct module *owner; 1068d59ecb2SHans Petter Selasky ssize_t (*read)(struct file *, char __user *, size_t, loff_t *); 1078d59ecb2SHans Petter Selasky ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *); 1088d59ecb2SHans Petter Selasky unsigned int (*poll) (struct file *, struct poll_table_struct *); 1098d59ecb2SHans Petter Selasky long (*unlocked_ioctl)(struct file *, unsigned int, unsigned long); 1108d59ecb2SHans Petter Selasky int (*mmap)(struct file *, struct vm_area_struct *); 1118d59ecb2SHans Petter Selasky int (*open)(struct inode *, struct file *); 1128d59ecb2SHans Petter Selasky int (*release)(struct inode *, struct file *); 1138d59ecb2SHans Petter Selasky int (*fasync)(int, struct file *, int); 1148d59ecb2SHans Petter Selasky 1158d59ecb2SHans Petter Selasky /* Although not supported in FreeBSD, to align with Linux code 1168d59ecb2SHans Petter Selasky * we are adding llseek() only when it is mapped to no_llseek which returns 1178d59ecb2SHans Petter Selasky * an illegal seek error 1188d59ecb2SHans Petter Selasky */ 1198d59ecb2SHans Petter Selasky loff_t (*llseek)(struct file *, loff_t, int); 1208d59ecb2SHans Petter Selasky #if 0 1218d59ecb2SHans Petter Selasky /* We do not support these methods. Don't permit them to compile. */ 1228d59ecb2SHans Petter Selasky loff_t (*llseek)(struct file *, loff_t, int); 1238d59ecb2SHans Petter Selasky ssize_t (*aio_read)(struct kiocb *, const struct iovec *, 1248d59ecb2SHans Petter Selasky unsigned long, loff_t); 1258d59ecb2SHans Petter Selasky ssize_t (*aio_write)(struct kiocb *, const struct iovec *, 1268d59ecb2SHans Petter Selasky unsigned long, loff_t); 1278d59ecb2SHans Petter Selasky int (*readdir)(struct file *, void *, filldir_t); 1288d59ecb2SHans Petter Selasky int (*ioctl)(struct inode *, struct file *, unsigned int, 1298d59ecb2SHans Petter Selasky unsigned long); 1308d59ecb2SHans Petter Selasky long (*compat_ioctl)(struct file *, unsigned int, unsigned long); 1318d59ecb2SHans Petter Selasky int (*flush)(struct file *, fl_owner_t id); 1328d59ecb2SHans Petter Selasky int (*fsync)(struct file *, struct dentry *, int datasync); 1338d59ecb2SHans Petter Selasky int (*aio_fsync)(struct kiocb *, int datasync); 1348d59ecb2SHans Petter Selasky int (*lock)(struct file *, int, struct file_lock *); 1358d59ecb2SHans Petter Selasky ssize_t (*sendpage)(struct file *, struct page *, int, size_t, 1368d59ecb2SHans Petter Selasky loff_t *, int); 1378d59ecb2SHans Petter Selasky unsigned long (*get_unmapped_area)(struct file *, unsigned long, 1388d59ecb2SHans Petter Selasky unsigned long, unsigned long, unsigned long); 1398d59ecb2SHans Petter Selasky int (*check_flags)(int); 1408d59ecb2SHans Petter Selasky int (*flock)(struct file *, int, struct file_lock *); 1418d59ecb2SHans Petter Selasky ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, 1428d59ecb2SHans Petter Selasky loff_t *, size_t, unsigned int); 1438d59ecb2SHans Petter Selasky ssize_t (*splice_read)(struct file *, loff_t *, 1448d59ecb2SHans Petter Selasky struct pipe_inode_info *, size_t, unsigned int); 1458d59ecb2SHans Petter Selasky int (*setlease)(struct file *, long, struct file_lock **); 1468d59ecb2SHans Petter Selasky #endif 1478d59ecb2SHans Petter Selasky }; 1488d59ecb2SHans Petter Selasky #define fops_get(fops) (fops) 1498d59ecb2SHans Petter Selasky 1508d59ecb2SHans Petter Selasky #define FMODE_READ FREAD 1518d59ecb2SHans Petter Selasky #define FMODE_WRITE FWRITE 1528d59ecb2SHans Petter Selasky #define FMODE_EXEC FEXEC 1538d59ecb2SHans Petter Selasky 154*1125dbc0SHans Petter Selasky int __register_chrdev(unsigned int major, unsigned int baseminor, 155*1125dbc0SHans Petter Selasky unsigned int count, const char *name, 156*1125dbc0SHans Petter Selasky const struct file_operations *fops); 157*1125dbc0SHans Petter Selasky int __register_chrdev_p(unsigned int major, unsigned int baseminor, 158*1125dbc0SHans Petter Selasky unsigned int count, const char *name, 159*1125dbc0SHans Petter Selasky const struct file_operations *fops, uid_t uid, 160*1125dbc0SHans Petter Selasky gid_t gid, int mode); 161*1125dbc0SHans Petter Selasky void __unregister_chrdev(unsigned int major, unsigned int baseminor, 162*1125dbc0SHans Petter Selasky unsigned int count, const char *name); 163*1125dbc0SHans Petter Selasky 164*1125dbc0SHans Petter Selasky static inline void 165*1125dbc0SHans Petter Selasky unregister_chrdev(unsigned int major, const char *name) 166*1125dbc0SHans Petter Selasky { 167*1125dbc0SHans Petter Selasky 168*1125dbc0SHans Petter Selasky __unregister_chrdev(major, 0, 256, name); 169*1125dbc0SHans Petter Selasky } 170*1125dbc0SHans Petter Selasky 171*1125dbc0SHans Petter Selasky static inline int 172*1125dbc0SHans Petter Selasky register_chrdev(unsigned int major, const char *name, 173*1125dbc0SHans Petter Selasky const struct file_operations *fops) 174*1125dbc0SHans Petter Selasky { 175*1125dbc0SHans Petter Selasky 176*1125dbc0SHans Petter Selasky return (__register_chrdev(major, 0, 256, name, fops)); 177*1125dbc0SHans Petter Selasky } 178*1125dbc0SHans Petter Selasky 179*1125dbc0SHans Petter Selasky static inline int 180*1125dbc0SHans Petter Selasky register_chrdev_p(unsigned int major, const char *name, 181*1125dbc0SHans Petter Selasky const struct file_operations *fops, uid_t uid, gid_t gid, int mode) 182*1125dbc0SHans Petter Selasky { 183*1125dbc0SHans Petter Selasky 184*1125dbc0SHans Petter Selasky return (__register_chrdev_p(major, 0, 256, name, fops, uid, gid, mode)); 185*1125dbc0SHans Petter Selasky } 186*1125dbc0SHans Petter Selasky 1878d59ecb2SHans Petter Selasky static inline int 1888d59ecb2SHans Petter Selasky register_chrdev_region(dev_t dev, unsigned range, const char *name) 1898d59ecb2SHans Petter Selasky { 1908d59ecb2SHans Petter Selasky 1918d59ecb2SHans Petter Selasky return 0; 1928d59ecb2SHans Petter Selasky } 1938d59ecb2SHans Petter Selasky 1948d59ecb2SHans Petter Selasky static inline void 1958d59ecb2SHans Petter Selasky unregister_chrdev_region(dev_t dev, unsigned range) 1968d59ecb2SHans Petter Selasky { 1978d59ecb2SHans Petter Selasky 1988d59ecb2SHans Petter Selasky return; 1998d59ecb2SHans Petter Selasky } 2008d59ecb2SHans Petter Selasky 2018d59ecb2SHans Petter Selasky static inline int 2028d59ecb2SHans Petter Selasky alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, 2038d59ecb2SHans Petter Selasky const char *name) 2048d59ecb2SHans Petter Selasky { 2058d59ecb2SHans Petter Selasky 2068d59ecb2SHans Petter Selasky return 0; 2078d59ecb2SHans Petter Selasky } 2088d59ecb2SHans Petter Selasky 2098d59ecb2SHans Petter Selasky /* No current support for seek op in FreeBSD */ 2108d59ecb2SHans Petter Selasky static inline int 2118d59ecb2SHans Petter Selasky nonseekable_open(struct inode *inode, struct file *filp) 2128d59ecb2SHans Petter Selasky { 2138d59ecb2SHans Petter Selasky return 0; 2148d59ecb2SHans Petter Selasky } 2158d59ecb2SHans Petter Selasky 2168d59ecb2SHans Petter Selasky static inline dev_t 2178d59ecb2SHans Petter Selasky iminor(struct inode *inode) 2188d59ecb2SHans Petter Selasky { 2198d59ecb2SHans Petter Selasky 220*1125dbc0SHans Petter Selasky return (MINOR(dev2unit(inode->v_rdev))); 2218d59ecb2SHans Petter Selasky } 2228d59ecb2SHans Petter Selasky 2238d59ecb2SHans Petter Selasky static inline struct inode * 2248d59ecb2SHans Petter Selasky igrab(struct inode *inode) 2258d59ecb2SHans Petter Selasky { 2268d59ecb2SHans Petter Selasky int error; 2278d59ecb2SHans Petter Selasky 2288d59ecb2SHans Petter Selasky error = vget(inode, 0, curthread); 2298d59ecb2SHans Petter Selasky if (error) 2308d59ecb2SHans Petter Selasky return (NULL); 2318d59ecb2SHans Petter Selasky 2328d59ecb2SHans Petter Selasky return (inode); 2338d59ecb2SHans Petter Selasky } 2348d59ecb2SHans Petter Selasky 2358d59ecb2SHans Petter Selasky static inline void 2368d59ecb2SHans Petter Selasky iput(struct inode *inode) 2378d59ecb2SHans Petter Selasky { 2388d59ecb2SHans Petter Selasky 2398d59ecb2SHans Petter Selasky vrele(inode); 2408d59ecb2SHans Petter Selasky } 2418d59ecb2SHans Petter Selasky 2428d59ecb2SHans Petter Selasky static inline loff_t 2438d59ecb2SHans Petter Selasky no_llseek(struct file *file, loff_t offset, int whence) 2448d59ecb2SHans Petter Selasky { 2458d59ecb2SHans Petter Selasky return -ESPIPE; 2468d59ecb2SHans Petter Selasky } 2478d59ecb2SHans Petter Selasky 2488d59ecb2SHans Petter Selasky #endif /* _LINUX_FS_H_ */ 249