]> git.proxmox.com Git - mirror_zfs.git/blobdiff - include/sys/zfs_vfsops.h
Add support for user/group dnode accounting & quota
[mirror_zfs.git] / include / sys / zfs_vfsops.h
index 7622f0308ee4deed10eb40290d617bb53fa95583..b59ace5b1996b151ee06ea0e4ad7b0384d8e1ee9 100644 (file)
@@ -41,11 +41,33 @@ extern "C" {
 struct zfs_sb;
 struct znode;
 
+typedef struct zfs_mntopts {
+       char            *z_osname;      /* Objset name */
+       char            *z_mntpoint;    /* Primary mount point */
+       uint64_t        z_xattr;
+       boolean_t       z_readonly;
+       boolean_t       z_do_readonly;
+       boolean_t       z_setuid;
+       boolean_t       z_do_setuid;
+       boolean_t       z_exec;
+       boolean_t       z_do_exec;
+       boolean_t       z_devices;
+       boolean_t       z_do_devices;
+       boolean_t       z_do_xattr;
+       boolean_t       z_atime;
+       boolean_t       z_do_atime;
+       boolean_t       z_relatime;
+       boolean_t       z_do_relatime;
+       boolean_t       z_nbmand;
+       boolean_t       z_do_nbmand;
+} zfs_mntopts_t;
+
 typedef struct zfs_sb {
-       struct vfsmount *z_vfs;         /* generic vfs struct */
        struct super_block *z_sb;       /* generic super_block */
+       struct backing_dev_info z_bdi;  /* generic backing dev info */
        struct zfs_sb   *z_parent;      /* parent fs */
        objset_t        *z_os;          /* objset reference */
+       zfs_mntopts_t   *z_mntopts;     /* passed mount options */
        uint64_t        z_flags;        /* super_block flags */
        uint64_t        z_root;         /* id of root znode */
        uint64_t        z_unlinkedobj;  /* id of unlinked zapobj */
@@ -60,15 +82,21 @@ typedef struct zfs_sb {
        struct zfs_fuid_info    *z_fuid_replay; /* fuid info for replay */
        zilog_t         *z_log;         /* intent log pointer */
        uint_t          z_acl_inherit;  /* acl inheritance behavior */
+       uint_t          z_acl_type;     /* type of ACL usable on this FS */
        zfs_case_t      z_case;         /* case-sense */
        boolean_t       z_utf8;         /* utf8-only */
        int             z_norm;         /* normalization flags */
        boolean_t       z_atime;        /* enable atimes mount option */
+       boolean_t       z_relatime;     /* enable relatime mount option */
        boolean_t       z_unmounted;    /* unmounted */
-       rrwlock_t       z_teardown_lock;
+       rrmlock_t       z_teardown_lock;
        krwlock_t       z_teardown_inactive_lock;
-       list_t          z_all_znodes;   /* all vnodes in the fs */
+       list_t          z_all_znodes;   /* all znodes in the fs */
+       uint64_t        z_nr_znodes;    /* number of znodes in the fs */
+       unsigned long   z_rollback_time; /* last online rollback time */
+       unsigned long   z_snap_defer_time; /* last snapshot unmount deferal */
        kmutex_t        z_znodes_lock;  /* lock for z_all_znodes */
+       arc_prune_t     *z_arc_prune;   /* called by ARC to prune caches */
        struct inode    *z_ctldir;      /* .zfs directory inode */
        boolean_t       z_show_ctldir;  /* expose .zfs in the root dir */
        boolean_t       z_issnap;       /* true if this is a snapshot */
@@ -76,45 +104,31 @@ typedef struct zfs_sb {
        boolean_t       z_use_fuids;    /* version allows fuids */
        boolean_t       z_replay;       /* set during ZIL replay */
        boolean_t       z_use_sa;       /* version allow system attributes */
+       boolean_t       z_xattr_sa;     /* allow xattrs to be stores as SA */
        uint64_t        z_version;      /* ZPL version */
        uint64_t        z_shares_dir;   /* hidden shares dir */
        kmutex_t        z_lock;
        uint64_t        z_userquota_obj;
        uint64_t        z_groupquota_obj;
+       uint64_t        z_userobjquota_obj;
+       uint64_t        z_groupobjquota_obj;
        uint64_t        z_replay_eof;   /* New end of file - replay only */
        sa_attr_type_t  *z_attr_table;  /* SA attr mapping->id */
-#define        ZFS_OBJ_MTX_SZ  64
-       kmutex_t        z_hold_mtx[ZFS_OBJ_MTX_SZ];     /* znode hold locks */
+       uint64_t        z_hold_size;    /* znode hold array size */
+       avl_tree_t      *z_hold_trees;  /* znode hold trees */
+       kmutex_t        *z_hold_locks;  /* znode hold locks */
 } zfs_sb_t;
 
 #define        ZFS_SUPER_MAGIC 0x2fc12fc1
 
-#define        ZSB_XATTR_USER  0x0001          /* Enable user xattrs */
-
-
-/*
- * Minimal snapshot helpers, the bulk of the Linux snapshot implementation
- * lives in the zpl_snap.c file which is part of the zpl source.
- */
-#define        ZFS_CTLDIR_NAME         ".zfs"
-
-#define        zfs_has_ctldir(zdp)     \
-       ((zdp)->z_id == ZTOZSB(zdp)->z_root && \
-       (ZTOZSB(zdp)->z_ctldir != NULL))
-#define        zfs_show_ctldir(zdp)    \
-       (zfs_has_ctldir(zdp) && \
-       (ZTOZSB(zdp)->z_show_ctldir))
-
-#define        ZFSCTL_INO_ROOT         0x1
-#define        ZFSCTL_INO_SNAPDIR      0x2
-#define        ZFSCTL_INO_SHARES       0x3
+#define        ZSB_XATTR       0x0001          /* Enable user xattrs */
 
 /*
  * Allow a maximum number of links.  While ZFS does not internally limit
- * this most Linux filesystems do.  It's probably a good idea to limit
- * this to a large value until it is validated that this is safe.
+ * this the inode->i_nlink member is defined as an unsigned int.  To be
+ * safe we use 2^31-1 as the limit.
  */
-#define ZFS_LINK_MAX           65536
+#define        ZFS_LINK_MAX            ((1U << 31) - 1U)
 
 /*
  * Normal filesystems (those not under .zfs/snapshot) have a total
@@ -178,19 +192,32 @@ extern boolean_t zfs_owner_overquota(zfs_sb_t *zsb, struct znode *,
     boolean_t isgroup);
 extern boolean_t zfs_fuid_overquota(zfs_sb_t *zsb, boolean_t isgroup,
     uint64_t fuid);
+extern boolean_t zfs_fuid_overobjquota(zfs_sb_t *zsb, boolean_t isgroup,
+    uint64_t fuid);
 extern int zfs_set_version(zfs_sb_t *zsb, uint64_t newvers);
-extern int zfs_sb_create(const char *name, zfs_sb_t **zsbp);
+extern int zfs_get_zplprop(objset_t *os, zfs_prop_t prop,
+    uint64_t *value);
+extern zfs_mntopts_t *zfs_mntopts_alloc(void);
+extern void zfs_mntopts_free(zfs_mntopts_t *zmo);
+extern int zfs_sb_create(const char *name, zfs_mntopts_t *zmo,
+    zfs_sb_t **zsbp);
+extern int zfs_sb_setup(zfs_sb_t *zsb, boolean_t mounting);
 extern void zfs_sb_free(zfs_sb_t *zsb);
+extern int zfs_sb_prune(struct super_block *sb, unsigned long nr_to_scan,
+    int *objects);
+extern int zfs_sb_teardown(zfs_sb_t *zsb, boolean_t unmounting);
 extern int zfs_check_global_label(const char *dsname, const char *hexsl);
+extern boolean_t zfs_is_readonly(zfs_sb_t *zsb);
 
 extern int zfs_register_callbacks(zfs_sb_t *zsb);
 extern void zfs_unregister_callbacks(zfs_sb_t *zsb);
-extern int zfs_domount(struct super_block *sb, void *data, int silent);
+extern int zfs_domount(struct super_block *sb, zfs_mntopts_t *zmo, int silent);
+extern void zfs_preumount(struct super_block *sb);
 extern int zfs_umount(struct super_block *sb);
-extern int zfs_remount(struct super_block *sb, int *flags, char *data);
+extern int zfs_remount(struct super_block *sb, int *flags, zfs_mntopts_t *zmo);
 extern int zfs_root(zfs_sb_t *zsb, struct inode **ipp);
 extern int zfs_statvfs(struct dentry *dentry, struct kstatfs *statp);
-extern int zfs_vget(struct vfsmount *vfsp, struct inode **ipp, fid_t *fidp);
+extern int zfs_vget(struct super_block *sb, struct inode **ipp, fid_t *fidp);
 
 #ifdef __cplusplus
 }