X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=include%2Fsys%2Fzfs_vfsops.h;h=4dd46710f72bf20a90d19990c67a4291bde95127;hb=72938d6905d9dcd60f7a5ff68ae469e74c248228;hp=34a871587a81c2bc8b9a7b94dc1e5f560743a242;hpb=bcf308227c9aa51ef9d5a1fe3f2f1342ff2aee94;p=zfs.git diff --git a/include/sys/zfs_vfsops.h b/include/sys/zfs_vfsops.h index 34a8715..4dd4671 100644 --- a/include/sys/zfs_vfsops.h +++ b/include/sys/zfs_vfsops.h @@ -38,13 +38,15 @@ extern "C" { #endif -typedef struct zfsvfs zfsvfs_t; +struct zfs_sb; struct znode; -struct zfsvfs { - vfs_t *z_vfs; /* generic fs struct */ - zfsvfs_t *z_parent; /* parent fs */ +typedef struct zfs_sb { + 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 */ + uint64_t z_flags; /* super_block flags */ uint64_t z_root; /* id of root znode */ uint64_t z_unlinkedobj; /* id of unlinked zapobj */ uint64_t z_max_blksz; /* maximum block size for files */ @@ -65,15 +67,19 @@ struct zfsvfs { boolean_t z_unmounted; /* unmounted */ rrwlock_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 */ kmutex_t z_znodes_lock; /* lock for z_all_znodes */ struct inode *z_ctldir; /* .zfs directory inode */ + avl_tree_t z_ctldir_snaps; /* .zfs/snapshot entries */ + kmutex_t z_ctldir_lock; /* .zfs ctldir lock */ boolean_t z_show_ctldir; /* expose .zfs in the root dir */ boolean_t z_issnap; /* true if this is a snapshot */ boolean_t z_vscan; /* virus scan on/off */ 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; @@ -81,36 +87,20 @@ struct zfsvfs { uint64_t z_groupquota_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 +#define ZFS_OBJ_MTX_SZ 256 kmutex_t z_hold_mtx[ZFS_OBJ_MTX_SZ]; /* znode hold locks */ } zfs_sb_t; #define ZFS_SUPER_MAGIC 0x2fc12fc1 - -/* - * 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 @@ -162,30 +152,39 @@ typedef struct zfid_long { extern uint_t zfs_fsyncer_key; -extern int zfs_suspend_fs(zfsvfs_t *zfsvfs); -extern int zfs_resume_fs(zfsvfs_t *zfsvfs, const char *osname); -extern int zfs_userspace_one(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type, +extern int zfs_suspend_fs(zfs_sb_t *zsb); +extern int zfs_resume_fs(zfs_sb_t *zsb, const char *osname); +extern int zfs_userspace_one(zfs_sb_t *zsb, zfs_userquota_prop_t type, const char *domain, uint64_t rid, uint64_t *valuep); -extern int zfs_userspace_many(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type, +extern int zfs_userspace_many(zfs_sb_t *zsb, zfs_userquota_prop_t type, uint64_t *cookiep, void *vbuf, uint64_t *bufsizep); -extern int zfs_set_userquota(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type, +extern int zfs_set_userquota(zfs_sb_t *zsb, zfs_userquota_prop_t type, const char *domain, uint64_t rid, uint64_t quota); -extern boolean_t zfs_owner_overquota(zfsvfs_t *zfsvfs, struct znode *, +extern boolean_t zfs_owner_overquota(zfs_sb_t *zsb, struct znode *, boolean_t isgroup); -extern boolean_t zfs_fuid_overquota(zfsvfs_t *zfsvfs, boolean_t isgroup, +extern boolean_t zfs_fuid_overquota(zfs_sb_t *zsb, boolean_t isgroup, uint64_t fuid); -extern int zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers); -extern int zfsvfs_create(const char *name, zfsvfs_t **zfvp); -extern void zfsvfs_free(zfsvfs_t *zfsvfs); +extern int zfs_set_version(zfs_sb_t *zsb, uint64_t newvers); +extern int zfs_get_zplprop(objset_t *os, zfs_prop_t prop, + uint64_t *value); +extern int zfs_sb_create(const char *name, 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 int zfs_register_callbacks(vfs_t *vfsp); -extern void zfs_unregister_callbacks(zfsvfs_t *zfsvfs); -extern int zfs_domount(vfs_t *vfsp, char *osname); -extern int zfs_umount(vfs_t *vfsp, int fflag, cred_t *cr); -extern int zfs_root(vfs_t *vfsp, vnode_t **vpp); -extern int zfs_statvfs(vfs_t *vfsp, struct statvfs64 *statp); -extern int zfs_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp); +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 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_root(zfs_sb_t *zsb, struct inode **ipp); +extern int zfs_statvfs(struct dentry *dentry, struct kstatfs *statp); +extern int zfs_vget(struct super_block *sb, struct inode **ipp, fid_t *fidp); #ifdef __cplusplus }