Align mount options handling and type/function names with OpenZFS

Refactor the temporary mount option in a way which minimizes
differences with upstream.  Additionally, replace the zfs_sb_t
type with zfsvfs_t and rename several functions to be consistent
with the upstream names.

Reviewed-by: George Melikov <mail@gmelikov.ru>
Reviewed-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #5876
This commit is contained in:
Brian Behlendorf 2017-03-13 15:08:40 -07:00 committed by GitHub
commit 09ec770c2c
24 changed files with 1807 additions and 1824 deletions

View File

@ -2602,7 +2602,7 @@ ztest_zil_remount(ztest_ds_t *zd, uint64_t id)
mutex_enter(&zd->zd_dirobj_lock); mutex_enter(&zd->zd_dirobj_lock);
(void) rw_wrlock(&zd->zd_zilog_lock); (void) rw_wrlock(&zd->zd_zilog_lock);
/* zfs_sb_teardown() */ /* zfsvfs_teardown() */
zil_close(zd->zd_zilog); zil_close(zd->zd_zilog);
/* zfsvfs_setup() */ /* zfsvfs_setup() */

View File

@ -202,13 +202,13 @@ typedef struct zfs_acl_ids {
#define ZFS_ACL_PASSTHROUGH_X 5 #define ZFS_ACL_PASSTHROUGH_X 5
struct znode; struct znode;
struct zfs_sb; struct zfsvfs;
#ifdef _KERNEL #ifdef _KERNEL
int zfs_acl_ids_create(struct znode *, int, vattr_t *, int zfs_acl_ids_create(struct znode *, int, vattr_t *,
cred_t *, vsecattr_t *, zfs_acl_ids_t *); cred_t *, vsecattr_t *, zfs_acl_ids_t *);
void zfs_acl_ids_free(zfs_acl_ids_t *); void zfs_acl_ids_free(zfs_acl_ids_t *);
boolean_t zfs_acl_ids_overquota(struct zfs_sb *, zfs_acl_ids_t *); boolean_t zfs_acl_ids_overquota(struct zfsvfs *, zfs_acl_ids_t *);
int zfs_getacl(struct znode *, vsecattr_t *, boolean_t, cred_t *); int zfs_getacl(struct znode *, vsecattr_t *, boolean_t, cred_t *);
int zfs_setacl(struct znode *, vsecattr_t *, boolean_t, cred_t *); int zfs_setacl(struct znode *, vsecattr_t *, boolean_t, cred_t *);
void zfs_acl_rele(void *); void zfs_acl_rele(void *);
@ -225,7 +225,7 @@ int zfs_zaccess_delete(struct znode *, struct znode *, cred_t *);
int zfs_zaccess_rename(struct znode *, struct znode *, int zfs_zaccess_rename(struct znode *, struct znode *,
struct znode *, struct znode *, cred_t *cr); struct znode *, struct znode *, cred_t *cr);
void zfs_acl_free(zfs_acl_t *); void zfs_acl_free(zfs_acl_t *);
int zfs_vsec_2_aclp(struct zfs_sb *, umode_t, vsecattr_t *, cred_t *, int zfs_vsec_2_aclp(struct zfsvfs *, umode_t, vsecattr_t *, cred_t *,
struct zfs_fuid_info **, zfs_acl_t **); struct zfs_fuid_info **, zfs_acl_t **);
int zfs_aclset_common(struct znode *, zfs_acl_t *, cred_t *, dmu_tx_t *); int zfs_aclset_common(struct znode *, zfs_acl_t *, cred_t *, dmu_tx_t *);
uint64_t zfs_external_acl(struct znode *); uint64_t zfs_external_acl(struct znode *);

View File

@ -50,9 +50,9 @@
extern int zfs_expire_snapshot; extern int zfs_expire_snapshot;
/* zfsctl generic functions */ /* zfsctl generic functions */
extern int zfsctl_create(zfs_sb_t *zsb); extern int zfsctl_create(zfsvfs_t *);
extern void zfsctl_destroy(zfs_sb_t *zsb); extern void zfsctl_destroy(zfsvfs_t *);
extern struct inode *zfsctl_root(znode_t *zp); extern struct inode *zfsctl_root(znode_t *);
extern void zfsctl_init(void); extern void zfsctl_init(void);
extern void zfsctl_fini(void); extern void zfsctl_fini(void);
extern boolean_t zfsctl_is_node(struct inode *ip); extern boolean_t zfsctl_is_node(struct inode *ip);

View File

@ -63,7 +63,7 @@ extern void zfs_rmnode(znode_t *);
extern void zfs_dl_name_switch(zfs_dirlock_t *dl, char *new, char **old); extern void zfs_dl_name_switch(zfs_dirlock_t *dl, char *new, char **old);
extern boolean_t zfs_dirempty(znode_t *); extern boolean_t zfs_dirempty(znode_t *);
extern void zfs_unlinked_add(znode_t *, dmu_tx_t *); extern void zfs_unlinked_add(znode_t *, dmu_tx_t *);
extern void zfs_unlinked_drain(zfs_sb_t *); extern void zfs_unlinked_drain(zfsvfs_t *zfsvfs);
extern int zfs_sticky_remove_access(znode_t *, znode_t *, cred_t *cr); extern int zfs_sticky_remove_access(znode_t *, znode_t *, cred_t *cr);
extern int zfs_get_xattrdir(znode_t *, struct inode **, cred_t *, int); extern int zfs_get_xattrdir(znode_t *, struct inode **, cred_t *, int);
extern int zfs_make_xattrdir(znode_t *, vattr_t *, struct inode **, cred_t *); extern int zfs_make_xattrdir(znode_t *, vattr_t *, struct inode **, cred_t *);

View File

@ -33,7 +33,6 @@
#include <sys/zfs_vfsops.h> #include <sys/zfs_vfsops.h>
#endif #endif
#include <sys/avl.h> #include <sys/avl.h>
#include <sys/list.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -100,24 +99,24 @@ typedef struct zfs_fuid_info {
#ifdef _KERNEL #ifdef _KERNEL
struct znode; struct znode;
extern uid_t zfs_fuid_map_id(zfs_sb_t *, uint64_t, cred_t *, zfs_fuid_type_t); extern uid_t zfs_fuid_map_id(zfsvfs_t *, uint64_t, cred_t *, zfs_fuid_type_t);
extern void zfs_fuid_node_add(zfs_fuid_info_t **, const char *, uint32_t, extern void zfs_fuid_node_add(zfs_fuid_info_t **, const char *, uint32_t,
uint64_t, uint64_t, zfs_fuid_type_t); uint64_t, uint64_t, zfs_fuid_type_t);
extern void zfs_fuid_destroy(zfs_sb_t *); extern void zfs_fuid_destroy(zfsvfs_t *);
extern uint64_t zfs_fuid_create_cred(zfs_sb_t *, zfs_fuid_type_t, extern uint64_t zfs_fuid_create_cred(zfsvfs_t *, zfs_fuid_type_t,
cred_t *, zfs_fuid_info_t **); cred_t *, zfs_fuid_info_t **);
extern uint64_t zfs_fuid_create(zfs_sb_t *, uint64_t, cred_t *, zfs_fuid_type_t, extern uint64_t zfs_fuid_create(zfsvfs_t *, uint64_t, cred_t *, zfs_fuid_type_t,
zfs_fuid_info_t **); zfs_fuid_info_t **);
extern void zfs_fuid_map_ids(struct znode *zp, cred_t *cr, extern void zfs_fuid_map_ids(struct znode *zp, cred_t *cr,
uid_t *uid, uid_t *gid); uid_t *uid, uid_t *gid);
extern zfs_fuid_info_t *zfs_fuid_info_alloc(void); extern zfs_fuid_info_t *zfs_fuid_info_alloc(void);
extern void zfs_fuid_info_free(zfs_fuid_info_t *); extern void zfs_fuid_info_free(zfs_fuid_info_t *);
extern boolean_t zfs_groupmember(zfs_sb_t *, uint64_t, cred_t *); extern boolean_t zfs_groupmember(zfsvfs_t *, uint64_t, cred_t *);
void zfs_fuid_sync(zfs_sb_t *, dmu_tx_t *); void zfs_fuid_sync(zfsvfs_t *, dmu_tx_t *);
extern int zfs_fuid_find_by_domain(zfs_sb_t *, const char *domain, extern int zfs_fuid_find_by_domain(zfsvfs_t *, const char *domain,
char **retdomain, boolean_t addok); char **retdomain, boolean_t addok);
extern const char *zfs_fuid_find_by_idx(zfs_sb_t *zsb, uint32_t idx); extern const char *zfs_fuid_find_by_idx(zfsvfs_t *zfsvfs, uint32_t idx);
extern void zfs_fuid_txhold(zfs_sb_t *zsb, dmu_tx_t *tx); extern void zfs_fuid_txhold(zfsvfs_t *zfsvfs, dmu_tx_t *tx);
#endif #endif
char *zfs_fuid_idx_domain(avl_tree_t *, uint32_t); char *zfs_fuid_idx_domain(avl_tree_t *, uint32_t);

View File

@ -50,7 +50,7 @@ typedef struct zfs_rlock {
avl_tree_t zr_avl; /* avl tree of range locks */ avl_tree_t zr_avl; /* avl tree of range locks */
uint64_t *zr_size; /* points to znode->z_size */ uint64_t *zr_size; /* points to znode->z_size */
uint_t *zr_blksz; /* points to znode->z_blksz */ uint_t *zr_blksz; /* points to znode->z_blksz */
uint64_t *zr_max_blksz; /* points to zsb->z_max_blksz */ uint64_t *zr_max_blksz; /* points to zfsvfs->z_max_blksz */
} zfs_rlock_t; } zfs_rlock_t;
typedef struct rl { typedef struct rl {

View File

@ -38,36 +38,46 @@
extern "C" { extern "C" {
#endif #endif
struct zfs_sb; typedef struct zfsvfs zfsvfs_t;
struct znode; struct znode;
typedef struct zfs_mntopts { /*
char *z_osname; /* Objset name */ * This structure emulates the vfs_t from other platforms. It's purpose
char *z_mntpoint; /* Primary mount point */ * is to faciliate the handling of mount options and minimize structural
uint64_t z_xattr; * differences between the platforms.
boolean_t z_readonly; */
boolean_t z_do_readonly; typedef struct vfs {
boolean_t z_setuid; struct zfsvfs *vfs_data;
boolean_t z_do_setuid; char *vfs_mntpoint; /* Primary mount point */
boolean_t z_exec; uint64_t vfs_xattr;
boolean_t z_do_exec; boolean_t vfs_readonly;
boolean_t z_devices; boolean_t vfs_do_readonly;
boolean_t z_do_devices; boolean_t vfs_setuid;
boolean_t z_do_xattr; boolean_t vfs_do_setuid;
boolean_t z_atime; boolean_t vfs_exec;
boolean_t z_do_atime; boolean_t vfs_do_exec;
boolean_t z_relatime; boolean_t vfs_devices;
boolean_t z_do_relatime; boolean_t vfs_do_devices;
boolean_t z_nbmand; boolean_t vfs_do_xattr;
boolean_t z_do_nbmand; boolean_t vfs_atime;
} zfs_mntopts_t; boolean_t vfs_do_atime;
boolean_t vfs_relatime;
boolean_t vfs_do_relatime;
boolean_t vfs_nbmand;
boolean_t vfs_do_nbmand;
} vfs_t;
typedef struct zfs_sb { typedef struct zfs_mnt {
const char *mnt_osname; /* Objset name */
char *mnt_data; /* Raw mount options */
} zfs_mnt_t;
struct zfsvfs {
vfs_t *z_vfs; /* generic fs struct */
struct super_block *z_sb; /* generic super_block */ struct super_block *z_sb; /* generic super_block */
struct backing_dev_info z_bdi; /* generic backing dev info */ struct backing_dev_info z_bdi; /* generic backing dev info */
struct zfs_sb *z_parent; /* parent fs */ struct zfsvfs *z_parent; /* parent fs */
objset_t *z_os; /* objset reference */ objset_t *z_os; /* objset reference */
zfs_mntopts_t *z_mntopts; /* passed mount options */
uint64_t z_flags; /* super_block flags */ uint64_t z_flags; /* super_block flags */
uint64_t z_root; /* id of root znode */ uint64_t z_root; /* id of root znode */
uint64_t z_unlinkedobj; /* id of unlinked zapobj */ uint64_t z_unlinkedobj; /* id of unlinked zapobj */
@ -117,7 +127,7 @@ typedef struct zfs_sb {
uint64_t z_hold_size; /* znode hold array size */ uint64_t z_hold_size; /* znode hold array size */
avl_tree_t *z_hold_trees; /* znode hold trees */ avl_tree_t *z_hold_trees; /* znode hold trees */
kmutex_t *z_hold_locks; /* znode hold locks */ kmutex_t *z_hold_locks; /* znode hold locks */
} zfs_sb_t; };
#define ZSB_XATTR 0x0001 /* Enable user xattrs */ #define ZSB_XATTR 0x0001 /* Enable user xattrs */
@ -178,44 +188,34 @@ typedef struct zfid_long {
extern uint_t zfs_fsyncer_key; extern uint_t zfs_fsyncer_key;
extern int zfs_suspend_fs(zfs_sb_t *zsb); extern int zfs_suspend_fs(zfsvfs_t *zfsvfs);
extern int zfs_resume_fs(zfs_sb_t *zsb, struct dsl_dataset *ds); extern int zfs_resume_fs(zfsvfs_t *zfsvfs, struct dsl_dataset *ds);
extern int zfs_userspace_one(zfs_sb_t *zsb, zfs_userquota_prop_t type, extern int zfs_userspace_one(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
const char *domain, uint64_t rid, uint64_t *valuep); const char *domain, uint64_t rid, uint64_t *valuep);
extern int zfs_userspace_many(zfs_sb_t *zsb, zfs_userquota_prop_t type, extern int zfs_userspace_many(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
uint64_t *cookiep, void *vbuf, uint64_t *bufsizep); uint64_t *cookiep, void *vbuf, uint64_t *bufsizep);
extern int zfs_set_userquota(zfs_sb_t *zsb, zfs_userquota_prop_t type, extern int zfs_set_userquota(zfsvfs_t *zfsvfs, zfs_userquota_prop_t type,
const char *domain, uint64_t rid, uint64_t quota); const char *domain, uint64_t rid, uint64_t quota);
extern boolean_t zfs_owner_overquota(zfs_sb_t *zsb, struct znode *, extern boolean_t zfs_owner_overquota(zfsvfs_t *zfsvfs, struct znode *,
boolean_t isgroup); boolean_t isgroup);
extern boolean_t zfs_fuid_overquota(zfs_sb_t *zsb, boolean_t isgroup, extern boolean_t zfs_fuid_overquota(zfsvfs_t *zfsvfs, boolean_t isgroup,
uint64_t fuid); uint64_t fuid);
extern boolean_t zfs_fuid_overobjquota(zfs_sb_t *zsb, boolean_t isgroup, extern boolean_t zfs_fuid_overobjquota(zfsvfs_t *zfsvfs, boolean_t isgroup,
uint64_t fuid); uint64_t fuid);
extern int zfs_set_version(zfs_sb_t *zsb, uint64_t newvers); extern int zfs_set_version(zfsvfs_t *zfsvfs, uint64_t newvers);
extern int zfs_get_zplprop(objset_t *os, zfs_prop_t prop, extern int zfsvfs_create(const char *name, zfsvfs_t **zfvp);
uint64_t *value); extern void zfsvfs_free(zfsvfs_t *zfsvfs);
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 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 boolean_t zfs_is_readonly(zfsvfs_t *zfsvfs);
extern void zfs_unregister_callbacks(zfs_sb_t *zsb); extern int zfs_domount(struct super_block *sb, zfs_mnt_t *zm, 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 void zfs_preumount(struct super_block *sb);
extern int zfs_umount(struct super_block *sb); extern int zfs_umount(struct super_block *sb);
extern int zfs_remount(struct super_block *sb, int *flags, zfs_mntopts_t *zmo); extern int zfs_remount(struct super_block *sb, int *flags, zfs_mnt_t *zm);
extern int zfs_root(zfs_sb_t *zsb, struct inode **ipp);
extern int zfs_statvfs(struct dentry *dentry, struct kstatfs *statp); extern int zfs_statvfs(struct dentry *dentry, struct kstatfs *statp);
extern int zfs_vget(struct super_block *sb, struct inode **ipp, fid_t *fidp); extern int zfs_vget(struct super_block *sb, struct inode **ipp, fid_t *fidp);
extern int zfs_prune(struct super_block *sb, unsigned long nr_to_scan,
int *objects);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -63,7 +63,6 @@ extern int zfs_rename(struct inode *sdip, char *snm, struct inode *tdip,
char *tnm, cred_t *cr, int flags); char *tnm, cred_t *cr, int flags);
extern int zfs_symlink(struct inode *dip, char *name, vattr_t *vap, extern int zfs_symlink(struct inode *dip, char *name, vattr_t *vap,
char *link, struct inode **ipp, cred_t *cr, int flags); char *link, struct inode **ipp, cred_t *cr, int flags);
extern int zfs_follow_link(struct dentry *dentry, struct nameidata *nd);
extern int zfs_readlink(struct inode *ip, uio_t *uio, cred_t *cr); extern int zfs_readlink(struct inode *ip, uio_t *uio, cred_t *cr);
extern int zfs_link(struct inode *tdip, struct inode *sip, extern int zfs_link(struct inode *tdip, struct inode *sip,
char *name, cred_t *cr, int flags); char *name, cred_t *cr, int flags);

View File

@ -233,25 +233,25 @@ typedef struct znode_hold {
*/ */
#define ZTOI(znode) (&((znode)->z_inode)) #define ZTOI(znode) (&((znode)->z_inode))
#define ITOZ(inode) (container_of((inode), znode_t, z_inode)) #define ITOZ(inode) (container_of((inode), znode_t, z_inode))
#define ZTOZSB(znode) ((zfs_sb_t *)(ZTOI(znode)->i_sb->s_fs_info)) #define ZTOZSB(znode) ((zfsvfs_t *)(ZTOI(znode)->i_sb->s_fs_info))
#define ITOZSB(inode) ((zfs_sb_t *)((inode)->i_sb->s_fs_info)) #define ITOZSB(inode) ((zfsvfs_t *)((inode)->i_sb->s_fs_info))
#define S_ISDEV(mode) (S_ISCHR(mode) || S_ISBLK(mode) || S_ISFIFO(mode)) #define S_ISDEV(mode) (S_ISCHR(mode) || S_ISBLK(mode) || S_ISFIFO(mode))
/* Called on entry to each ZFS vnode and vfs operation */ /* Called on entry to each ZFS vnode and vfs operation */
#define ZFS_ENTER(zsb) \ #define ZFS_ENTER(zfsvfs) \
{ \ { \
rrm_enter_read(&(zsb)->z_teardown_lock, FTAG); \ rrm_enter_read(&(zfsvfs)->z_teardown_lock, FTAG); \
if ((zsb)->z_unmounted) { \ if ((zfsvfs)->z_unmounted) { \
ZFS_EXIT(zsb); \ ZFS_EXIT(zfsvfs); \
return (EIO); \ return (EIO); \
} \ } \
} }
/* Must be called before exiting the vop */ /* Must be called before exiting the vop */
#define ZFS_EXIT(zsb) \ #define ZFS_EXIT(zfsvfs) \
{ \ { \
rrm_exit(&(zsb)->z_teardown_lock, FTAG); \ rrm_exit(&(zfsvfs)->z_teardown_lock, FTAG); \
} }
/* Verifies the znode is valid */ /* Verifies the znode is valid */
@ -266,7 +266,7 @@ typedef struct znode_hold {
*/ */
#define ZFS_OBJ_MTX_SZ 64 #define ZFS_OBJ_MTX_SZ 64
#define ZFS_OBJ_MTX_MAX (1024 * 1024) #define ZFS_OBJ_MTX_MAX (1024 * 1024)
#define ZFS_OBJ_HASH(zsb, obj) ((obj) & ((zsb->z_hold_size) - 1)) #define ZFS_OBJ_HASH(zfsvfs, obj) ((obj) & ((zfsvfs->z_hold_size) - 1))
extern unsigned int zfs_object_mutex_size; extern unsigned int zfs_object_mutex_size;
@ -291,7 +291,7 @@ extern unsigned int zfs_object_mutex_size;
#define STATE_CHANGED (ATTR_CTIME) #define STATE_CHANGED (ATTR_CTIME)
#define CONTENT_MODIFIED (ATTR_MTIME | ATTR_CTIME) #define CONTENT_MODIFIED (ATTR_MTIME | ATTR_CTIME)
extern int zfs_init_fs(zfs_sb_t *, znode_t **); extern int zfs_init_fs(zfsvfs_t *, znode_t **);
extern void zfs_set_dataprop(objset_t *); extern void zfs_set_dataprop(objset_t *);
extern void zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *, extern void zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *,
dmu_tx_t *tx); dmu_tx_t *tx);
@ -302,7 +302,7 @@ extern int zfs_freesp(znode_t *, uint64_t, uint64_t, int, boolean_t);
extern void zfs_znode_init(void); extern void zfs_znode_init(void);
extern void zfs_znode_fini(void); extern void zfs_znode_fini(void);
extern int zfs_znode_hold_compare(const void *, const void *); extern int zfs_znode_hold_compare(const void *, const void *);
extern int zfs_zget(zfs_sb_t *, uint64_t, znode_t **); extern int zfs_zget(zfsvfs_t *, uint64_t, znode_t **);
extern int zfs_rezget(znode_t *); extern int zfs_rezget(znode_t *);
extern void zfs_zinactive(znode_t *); extern void zfs_zinactive(znode_t *);
extern void zfs_znode_delete(znode_t *, dmu_tx_t *); extern void zfs_znode_delete(znode_t *, dmu_tx_t *);
@ -343,8 +343,8 @@ extern void zfs_log_setattr(zilog_t *zilog, dmu_tx_t *tx, int txtype,
extern void zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, znode_t *zp, extern void zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, znode_t *zp,
vsecattr_t *vsecp, zfs_fuid_info_t *fuidp); vsecattr_t *vsecp, zfs_fuid_info_t *fuidp);
extern void zfs_xvattr_set(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx); extern void zfs_xvattr_set(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx);
extern void zfs_upgrade(zfs_sb_t *zsb, dmu_tx_t *tx); extern void zfs_upgrade(zfsvfs_t *zfsvfs, dmu_tx_t *tx);
extern int zfs_create_share_dir(zfs_sb_t *zsb, dmu_tx_t *tx); extern int zfs_create_share_dir(zfsvfs_t *zfsvfs, dmu_tx_t *tx);
#if defined(HAVE_UIO_RW) #if defined(HAVE_UIO_RW)
extern caddr_t zfs_map_page(page_t *, enum seg_rw); extern caddr_t zfs_map_page(page_t *, enum seg_rw);

View File

@ -371,23 +371,23 @@ static int
zfs_acl_znode_info(znode_t *zp, int *aclsize, int *aclcount, zfs_acl_znode_info(znode_t *zp, int *aclsize, int *aclcount,
zfs_acl_phys_t *aclphys) zfs_acl_phys_t *aclphys)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
uint64_t acl_count; uint64_t acl_count;
int size; int size;
int error; int error;
ASSERT(MUTEX_HELD(&zp->z_acl_lock)); ASSERT(MUTEX_HELD(&zp->z_acl_lock));
if (zp->z_is_sa) { if (zp->z_is_sa) {
if ((error = sa_size(zp->z_sa_hdl, SA_ZPL_DACL_ACES(zsb), if ((error = sa_size(zp->z_sa_hdl, SA_ZPL_DACL_ACES(zfsvfs),
&size)) != 0) &size)) != 0)
return (error); return (error);
*aclsize = size; *aclsize = size;
if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_DACL_COUNT(zsb), if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_DACL_COUNT(zfsvfs),
&acl_count, sizeof (acl_count))) != 0) &acl_count, sizeof (acl_count))) != 0)
return (error); return (error);
*aclcount = acl_count; *aclcount = acl_count;
} else { } else {
if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_ZNODE_ACL(zsb), if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_ZNODE_ACL(zfsvfs),
aclphys, sizeof (*aclphys))) != 0) aclphys, sizeof (*aclphys))) != 0)
return (error); return (error);
@ -651,7 +651,7 @@ zfs_ace_walk(void *datap, uint64_t cookie, int aclcnt,
* ACE FUIDs will be created later. * ACE FUIDs will be created later.
*/ */
int int
zfs_copy_ace_2_fuid(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *aclp, zfs_copy_ace_2_fuid(zfsvfs_t *zfsvfs, umode_t obj_mode, zfs_acl_t *aclp,
void *datap, zfs_ace_t *z_acl, uint64_t aclcnt, size_t *size, void *datap, zfs_ace_t *z_acl, uint64_t aclcnt, size_t *size,
zfs_fuid_info_t **fuidp, cred_t *cr) zfs_fuid_info_t **fuidp, cred_t *cr)
{ {
@ -669,7 +669,7 @@ zfs_copy_ace_2_fuid(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *aclp,
entry_type = aceptr->z_hdr.z_flags & ACE_TYPE_FLAGS; entry_type = aceptr->z_hdr.z_flags & ACE_TYPE_FLAGS;
if (entry_type != ACE_OWNER && entry_type != OWNING_GROUP && if (entry_type != ACE_OWNER && entry_type != OWNING_GROUP &&
entry_type != ACE_EVERYONE) { entry_type != ACE_EVERYONE) {
aceptr->z_fuid = zfs_fuid_create(zsb, acep->a_who, aceptr->z_fuid = zfs_fuid_create(zfsvfs, acep->a_who,
cr, (entry_type == 0) ? cr, (entry_type == 0) ?
ZFS_ACE_USER : ZFS_ACE_GROUP, fuidp); ZFS_ACE_USER : ZFS_ACE_GROUP, fuidp);
} }
@ -713,7 +713,7 @@ zfs_copy_ace_2_fuid(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *aclp,
* Copy ZFS ACEs to fixed size ace_t layout * Copy ZFS ACEs to fixed size ace_t layout
*/ */
static void static void
zfs_copy_fuid_2_ace(zfs_sb_t *zsb, zfs_acl_t *aclp, cred_t *cr, zfs_copy_fuid_2_ace(zfsvfs_t *zfsvfs, zfs_acl_t *aclp, cred_t *cr,
void *datap, int filter) void *datap, int filter)
{ {
uint64_t who; uint64_t who;
@ -756,7 +756,7 @@ zfs_copy_fuid_2_ace(zfs_sb_t *zsb, zfs_acl_t *aclp, cred_t *cr,
if ((entry_type != ACE_OWNER && if ((entry_type != ACE_OWNER &&
entry_type != OWNING_GROUP && entry_type != OWNING_GROUP &&
entry_type != ACE_EVERYONE)) { entry_type != ACE_EVERYONE)) {
acep->a_who = zfs_fuid_map_id(zsb, who, acep->a_who = zfs_fuid_map_id(zfsvfs, who,
cr, (entry_type & ACE_IDENTIFIER_GROUP) ? cr, (entry_type & ACE_IDENTIFIER_GROUP) ?
ZFS_ACE_GROUP : ZFS_ACE_USER); ZFS_ACE_GROUP : ZFS_ACE_USER);
} else { } else {
@ -1316,7 +1316,7 @@ int
zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx) zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
{ {
int error; int error;
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
dmu_object_type_t otype; dmu_object_type_t otype;
zfs_acl_locator_cb_t locate = { 0 }; zfs_acl_locator_cb_t locate = { 0 };
uint64_t mode; uint64_t mode;
@ -1330,11 +1330,11 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
KUID_TO_SUID(ZTOI(zp)->i_uid), KGID_TO_SGID(ZTOI(zp)->i_gid)); KUID_TO_SUID(ZTOI(zp)->i_uid), KGID_TO_SGID(ZTOI(zp)->i_gid));
zp->z_mode = ZTOI(zp)->i_mode = mode; zp->z_mode = ZTOI(zp)->i_mode = mode;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zfsvfs), NULL,
&mode, sizeof (mode)); &mode, sizeof (mode));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
&zp->z_pflags, sizeof (zp->z_pflags)); &zp->z_pflags, sizeof (zp->z_pflags));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL,
&ctime, sizeof (ctime)); &ctime, sizeof (ctime));
if (zp->z_acl_cached) { if (zp->z_acl_cached) {
@ -1345,11 +1345,11 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
/* /*
* Upgrade needed? * Upgrade needed?
*/ */
if (!zsb->z_use_fuids) { if (!zfsvfs->z_use_fuids) {
otype = DMU_OT_OLDACL; otype = DMU_OT_OLDACL;
} else { } else {
if ((aclp->z_version == ZFS_ACL_VERSION_INITIAL) && if ((aclp->z_version == ZFS_ACL_VERSION_INITIAL) &&
(zsb->z_version >= ZPL_VERSION_FUID)) (zfsvfs->z_version >= ZPL_VERSION_FUID))
zfs_acl_xform(zp, aclp, cr); zfs_acl_xform(zp, aclp, cr);
ASSERT(aclp->z_version >= ZFS_ACL_VERSION_FUID); ASSERT(aclp->z_version >= ZFS_ACL_VERSION_FUID);
otype = DMU_OT_ACL; otype = DMU_OT_ACL;
@ -1362,9 +1362,9 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
if (zp->z_is_sa) { /* the easy case, just update the ACL attribute */ if (zp->z_is_sa) { /* the easy case, just update the ACL attribute */
locate.cb_aclp = aclp; locate.cb_aclp = aclp;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_DACL_ACES(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_DACL_ACES(zfsvfs),
zfs_acl_data_locator, &locate, aclp->z_acl_bytes); zfs_acl_data_locator, &locate, aclp->z_acl_bytes);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_DACL_COUNT(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_DACL_COUNT(zfsvfs),
NULL, &aclp->z_acl_count, sizeof (uint64_t)); NULL, &aclp->z_acl_count, sizeof (uint64_t));
} else { /* Painful legacy way */ } else { /* Painful legacy way */
zfs_acl_node_t *aclnode; zfs_acl_node_t *aclnode;
@ -1372,7 +1372,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
zfs_acl_phys_t acl_phys; zfs_acl_phys_t acl_phys;
uint64_t aoid; uint64_t aoid;
if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_ZNODE_ACL(zsb), if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_ZNODE_ACL(zfsvfs),
&acl_phys, sizeof (acl_phys))) != 0) &acl_phys, sizeof (acl_phys))) != 0)
return (error); return (error);
@ -1386,20 +1386,20 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
*/ */
if (aoid && if (aoid &&
aclp->z_version != acl_phys.z_acl_version) { aclp->z_version != acl_phys.z_acl_version) {
error = dmu_object_free(zsb->z_os, aoid, tx); error = dmu_object_free(zfsvfs->z_os, aoid, tx);
if (error) if (error)
return (error); return (error);
aoid = 0; aoid = 0;
} }
if (aoid == 0) { if (aoid == 0) {
aoid = dmu_object_alloc(zsb->z_os, aoid = dmu_object_alloc(zfsvfs->z_os,
otype, aclp->z_acl_bytes, otype, aclp->z_acl_bytes,
otype == DMU_OT_ACL ? otype == DMU_OT_ACL ?
DMU_OT_SYSACL : DMU_OT_NONE, DMU_OT_SYSACL : DMU_OT_NONE,
otype == DMU_OT_ACL ? otype == DMU_OT_ACL ?
DN_OLD_MAX_BONUSLEN : 0, tx); DN_OLD_MAX_BONUSLEN : 0, tx);
} else { } else {
(void) dmu_object_set_blocksize(zsb->z_os, (void) dmu_object_set_blocksize(zfsvfs->z_os,
aoid, aclp->z_acl_bytes, 0, tx); aoid, aclp->z_acl_bytes, 0, tx);
} }
acl_phys.z_acl_extern_obj = aoid; acl_phys.z_acl_extern_obj = aoid;
@ -1407,7 +1407,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
aclnode = list_next(&aclp->z_acl, aclnode)) { aclnode = list_next(&aclp->z_acl, aclnode)) {
if (aclnode->z_ace_count == 0) if (aclnode->z_ace_count == 0)
continue; continue;
dmu_write(zsb->z_os, aoid, off, dmu_write(zfsvfs->z_os, aoid, off,
aclnode->z_size, aclnode->z_acldata, tx); aclnode->z_size, aclnode->z_acldata, tx);
off += aclnode->z_size; off += aclnode->z_size;
} }
@ -1417,7 +1417,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
* Migrating back embedded? * Migrating back embedded?
*/ */
if (acl_phys.z_acl_extern_obj) { if (acl_phys.z_acl_extern_obj) {
error = dmu_object_free(zsb->z_os, error = dmu_object_free(zfsvfs->z_os,
acl_phys.z_acl_extern_obj, tx); acl_phys.z_acl_extern_obj, tx);
if (error) if (error)
return (error); return (error);
@ -1446,7 +1446,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
} }
acl_phys.z_acl_version = aclp->z_version; acl_phys.z_acl_version = aclp->z_version;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ZNODE_ACL(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ZNODE_ACL(zfsvfs), NULL,
&acl_phys, sizeof (acl_phys)); &acl_phys, sizeof (acl_phys));
} }
@ -1465,7 +1465,7 @@ zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, cred_t *cr, dmu_tx_t *tx)
} }
static void static void
zfs_acl_chmod(zfs_sb_t *zsb, uint64_t mode, zfs_acl_t *aclp) zfs_acl_chmod(zfsvfs_t *zfsvfs, uint64_t mode, zfs_acl_t *aclp)
{ {
void *acep = NULL; void *acep = NULL;
uint64_t who; uint64_t who;
@ -1538,7 +1538,7 @@ zfs_acl_chmod(zfs_sb_t *zsb, uint64_t mode, zfs_acl_t *aclp)
* Limit permissions to be no greater than * Limit permissions to be no greater than
* group permissions * group permissions
*/ */
if (zsb->z_acl_inherit == ZFS_ACL_RESTRICTED) { if (zfsvfs->z_acl_inherit == ZFS_ACL_RESTRICTED) {
if (!(mode & S_IRGRP)) if (!(mode & S_IRGRP))
access_mask &= ~ACE_READ_DATA; access_mask &= ~ACE_READ_DATA;
if (!(mode & S_IWGRP)) if (!(mode & S_IWGRP))
@ -1590,11 +1590,11 @@ zfs_acl_chmod_setattr(znode_t *zp, zfs_acl_t **aclp, uint64_t mode)
* strip off write_owner and write_acl * strip off write_owner and write_acl
*/ */
static void static void
zfs_restricted_update(zfs_sb_t *zsb, zfs_acl_t *aclp, void *acep) zfs_restricted_update(zfsvfs_t *zfsvfs, zfs_acl_t *aclp, void *acep)
{ {
uint32_t mask = aclp->z_ops->ace_mask_get(acep); uint32_t mask = aclp->z_ops->ace_mask_get(acep);
if ((zsb->z_acl_inherit == ZFS_ACL_RESTRICTED) && if ((zfsvfs->z_acl_inherit == ZFS_ACL_RESTRICTED) &&
(aclp->z_ops->ace_type_get(acep) == ALLOW)) { (aclp->z_ops->ace_type_get(acep) == ALLOW)) {
mask &= ~RESTRICTED_CLEAR; mask &= ~RESTRICTED_CLEAR;
aclp->z_ops->ace_mask_set(acep, mask); aclp->z_ops->ace_mask_set(acep, mask);
@ -1621,7 +1621,7 @@ zfs_ace_can_use(umode_t obj_mode, uint16_t acep_flags)
* inherit inheritable ACEs from parent * inherit inheritable ACEs from parent
*/ */
static zfs_acl_t * static zfs_acl_t *
zfs_acl_inherit(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *paclp, zfs_acl_inherit(zfsvfs_t *zfsvfs, umode_t obj_mode, zfs_acl_t *paclp,
uint64_t mode, boolean_t *need_chmod) uint64_t mode, boolean_t *need_chmod)
{ {
void *pacep; void *pacep;
@ -1639,16 +1639,16 @@ zfs_acl_inherit(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *paclp,
boolean_t passthrough, passthrough_x, noallow; boolean_t passthrough, passthrough_x, noallow;
passthrough_x = passthrough_x =
zsb->z_acl_inherit == ZFS_ACL_PASSTHROUGH_X; zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH_X;
passthrough = passthrough_x || passthrough = passthrough_x ||
zsb->z_acl_inherit == ZFS_ACL_PASSTHROUGH; zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH;
noallow = noallow =
zsb->z_acl_inherit == ZFS_ACL_NOALLOW; zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW;
*need_chmod = B_TRUE; *need_chmod = B_TRUE;
pacep = NULL; pacep = NULL;
aclp = zfs_acl_alloc(paclp->z_version); aclp = zfs_acl_alloc(paclp->z_version);
if (zsb->z_acl_inherit == ZFS_ACL_DISCARD || S_ISLNK(obj_mode)) if (zfsvfs->z_acl_inherit == ZFS_ACL_DISCARD || S_ISLNK(obj_mode))
return (aclp); return (aclp);
while ((pacep = zfs_acl_next_ace(paclp, pacep, &who, while ((pacep = zfs_acl_next_ace(paclp, pacep, &who,
&access_mask, &iflags, &type))) { &access_mask, &iflags, &type))) {
@ -1712,7 +1712,7 @@ zfs_acl_inherit(zfs_sb_t *zsb, umode_t obj_mode, zfs_acl_t *paclp,
newflags &= ~ALL_INHERIT; newflags &= ~ALL_INHERIT;
aclp->z_ops->ace_flags_set(acep, aclp->z_ops->ace_flags_set(acep,
newflags|ACE_INHERITED_ACE); newflags|ACE_INHERITED_ACE);
zfs_restricted_update(zsb, aclp, acep); zfs_restricted_update(zfsvfs, aclp, acep);
continue; continue;
} }
@ -1745,7 +1745,7 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
vsecattr_t *vsecp, zfs_acl_ids_t *acl_ids) vsecattr_t *vsecp, zfs_acl_ids_t *acl_ids)
{ {
int error; int error;
zfs_sb_t *zsb = ZTOZSB(dzp); zfsvfs_t *zfsvfs = ZTOZSB(dzp);
zfs_acl_t *paclp; zfs_acl_t *paclp;
gid_t gid = vap->va_gid; gid_t gid = vap->va_gid;
boolean_t need_chmod = B_TRUE; boolean_t need_chmod = B_TRUE;
@ -1755,7 +1755,7 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
acl_ids->z_mode = vap->va_mode; acl_ids->z_mode = vap->va_mode;
if (vsecp) if (vsecp)
if ((error = zfs_vsec_2_aclp(zsb, vap->va_mode, vsecp, if ((error = zfs_vsec_2_aclp(zfsvfs, vap->va_mode, vsecp,
cr, &acl_ids->z_fuidp, &acl_ids->z_aclp)) != 0) cr, &acl_ids->z_fuidp, &acl_ids->z_aclp)) != 0)
return (error); return (error);
@ -1765,19 +1765,19 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
/* /*
* Determine uid and gid. * Determine uid and gid.
*/ */
if ((flag & IS_ROOT_NODE) || zsb->z_replay || if ((flag & IS_ROOT_NODE) || zfsvfs->z_replay ||
((flag & IS_XATTR) && (S_ISDIR(vap->va_mode)))) { ((flag & IS_XATTR) && (S_ISDIR(vap->va_mode)))) {
acl_ids->z_fuid = zfs_fuid_create(zsb, (uint64_t)vap->va_uid, acl_ids->z_fuid = zfs_fuid_create(zfsvfs, (uint64_t)vap->va_uid,
cr, ZFS_OWNER, &acl_ids->z_fuidp); cr, ZFS_OWNER, &acl_ids->z_fuidp);
acl_ids->z_fgid = zfs_fuid_create(zsb, (uint64_t)vap->va_gid, acl_ids->z_fgid = zfs_fuid_create(zfsvfs, (uint64_t)vap->va_gid,
cr, ZFS_GROUP, &acl_ids->z_fuidp); cr, ZFS_GROUP, &acl_ids->z_fuidp);
gid = vap->va_gid; gid = vap->va_gid;
} else { } else {
acl_ids->z_fuid = zfs_fuid_create_cred(zsb, ZFS_OWNER, acl_ids->z_fuid = zfs_fuid_create_cred(zfsvfs, ZFS_OWNER,
cr, &acl_ids->z_fuidp); cr, &acl_ids->z_fuidp);
acl_ids->z_fgid = 0; acl_ids->z_fgid = 0;
if (vap->va_mask & AT_GID) { if (vap->va_mask & AT_GID) {
acl_ids->z_fgid = zfs_fuid_create(zsb, acl_ids->z_fgid = zfs_fuid_create(zfsvfs,
(uint64_t)vap->va_gid, (uint64_t)vap->va_gid,
cr, ZFS_GROUP, &acl_ids->z_fuidp); cr, ZFS_GROUP, &acl_ids->z_fuidp);
gid = vap->va_gid; gid = vap->va_gid;
@ -1793,13 +1793,13 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
acl_ids->z_fgid = KGID_TO_SGID( acl_ids->z_fgid = KGID_TO_SGID(
ZTOI(dzp)->i_gid); ZTOI(dzp)->i_gid);
gid = zfs_fuid_map_id(zsb, acl_ids->z_fgid, gid = zfs_fuid_map_id(zfsvfs, acl_ids->z_fgid,
cr, ZFS_GROUP); cr, ZFS_GROUP);
if (zsb->z_use_fuids && if (zfsvfs->z_use_fuids &&
IS_EPHEMERAL(acl_ids->z_fgid)) { IS_EPHEMERAL(acl_ids->z_fgid)) {
domain = zfs_fuid_idx_domain( domain = zfs_fuid_idx_domain(
&zsb->z_fuid_idx, &zfsvfs->z_fuid_idx,
FUID_INDEX(acl_ids->z_fgid)); FUID_INDEX(acl_ids->z_fgid));
rid = FUID_RID(acl_ids->z_fgid); rid = FUID_RID(acl_ids->z_fgid);
zfs_fuid_node_add(&acl_ids->z_fuidp, zfs_fuid_node_add(&acl_ids->z_fuidp,
@ -1808,7 +1808,7 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
acl_ids->z_fgid, ZFS_GROUP); acl_ids->z_fgid, ZFS_GROUP);
} }
} else { } else {
acl_ids->z_fgid = zfs_fuid_create_cred(zsb, acl_ids->z_fgid = zfs_fuid_create_cred(zfsvfs,
ZFS_GROUP, cr, &acl_ids->z_fuidp); ZFS_GROUP, cr, &acl_ids->z_fuidp);
gid = crgetgid(cr); gid = crgetgid(cr);
} }
@ -1840,7 +1840,7 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
!(dzp->z_pflags & ZFS_XATTR)) { !(dzp->z_pflags & ZFS_XATTR)) {
VERIFY(0 == zfs_acl_node_read(dzp, B_TRUE, VERIFY(0 == zfs_acl_node_read(dzp, B_TRUE,
&paclp, B_FALSE)); &paclp, B_FALSE));
acl_ids->z_aclp = zfs_acl_inherit(zsb, acl_ids->z_aclp = zfs_acl_inherit(zfsvfs,
vap->va_mode, paclp, acl_ids->z_mode, &need_chmod); vap->va_mode, paclp, acl_ids->z_mode, &need_chmod);
inherited = B_TRUE; inherited = B_TRUE;
} else { } else {
@ -1853,7 +1853,7 @@ zfs_acl_ids_create(znode_t *dzp, int flag, vattr_t *vap, cred_t *cr,
if (need_chmod) { if (need_chmod) {
acl_ids->z_aclp->z_hints |= S_ISDIR(vap->va_mode) ? acl_ids->z_aclp->z_hints |= S_ISDIR(vap->va_mode) ?
ZFS_ACL_AUTO_INHERIT : 0; ZFS_ACL_AUTO_INHERIT : 0;
zfs_acl_chmod(zsb, acl_ids->z_mode, acl_ids->z_aclp); zfs_acl_chmod(zfsvfs, acl_ids->z_mode, acl_ids->z_aclp);
} }
} }
@ -1883,12 +1883,12 @@ zfs_acl_ids_free(zfs_acl_ids_t *acl_ids)
} }
boolean_t boolean_t
zfs_acl_ids_overquota(zfs_sb_t *zsb, zfs_acl_ids_t *acl_ids) zfs_acl_ids_overquota(zfsvfs_t *zfsvfs, zfs_acl_ids_t *acl_ids)
{ {
return (zfs_fuid_overquota(zsb, B_FALSE, acl_ids->z_fuid) || return (zfs_fuid_overquota(zfsvfs, B_FALSE, acl_ids->z_fuid) ||
zfs_fuid_overquota(zsb, B_TRUE, acl_ids->z_fgid) || zfs_fuid_overquota(zfsvfs, B_TRUE, acl_ids->z_fgid) ||
zfs_fuid_overobjquota(zsb, B_FALSE, acl_ids->z_fuid) || zfs_fuid_overobjquota(zfsvfs, B_FALSE, acl_ids->z_fuid) ||
zfs_fuid_overobjquota(zsb, B_TRUE, acl_ids->z_fgid)); zfs_fuid_overobjquota(zfsvfs, B_TRUE, acl_ids->z_fgid));
} }
/* /*
@ -1992,7 +1992,7 @@ zfs_getacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr)
} }
int int
zfs_vsec_2_aclp(zfs_sb_t *zsb, umode_t obj_mode, zfs_vsec_2_aclp(zfsvfs_t *zfsvfs, umode_t obj_mode,
vsecattr_t *vsecp, cred_t *cr, zfs_fuid_info_t **fuidp, zfs_acl_t **zaclp) vsecattr_t *vsecp, cred_t *cr, zfs_fuid_info_t **fuidp, zfs_acl_t **zaclp)
{ {
zfs_acl_t *aclp; zfs_acl_t *aclp;
@ -2003,7 +2003,7 @@ zfs_vsec_2_aclp(zfs_sb_t *zsb, umode_t obj_mode,
if (vsecp->vsa_aclcnt > MAX_ACL_ENTRIES || vsecp->vsa_aclcnt <= 0) if (vsecp->vsa_aclcnt > MAX_ACL_ENTRIES || vsecp->vsa_aclcnt <= 0)
return (SET_ERROR(EINVAL)); return (SET_ERROR(EINVAL));
aclp = zfs_acl_alloc(zfs_acl_version(zsb->z_version)); aclp = zfs_acl_alloc(zfs_acl_version(zfsvfs->z_version));
aclp->z_hints = 0; aclp->z_hints = 0;
aclnode = zfs_acl_node_alloc(aclcnt * sizeof (zfs_object_ace_t)); aclnode = zfs_acl_node_alloc(aclcnt * sizeof (zfs_object_ace_t));
@ -2016,7 +2016,7 @@ zfs_vsec_2_aclp(zfs_sb_t *zsb, umode_t obj_mode,
return (error); return (error);
} }
} else { } else {
if ((error = zfs_copy_ace_2_fuid(zsb, obj_mode, aclp, if ((error = zfs_copy_ace_2_fuid(zfsvfs, obj_mode, aclp,
vsecp->vsa_aclentp, aclnode->z_acldata, aclcnt, vsecp->vsa_aclentp, aclnode->z_acldata, aclcnt,
&aclnode->z_size, fuidp, cr)) != 0) { &aclnode->z_size, fuidp, cr)) != 0) {
zfs_acl_free(aclp); zfs_acl_free(aclp);
@ -2052,8 +2052,8 @@ zfs_vsec_2_aclp(zfs_sb_t *zsb, umode_t obj_mode,
int int
zfs_setacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr) zfs_setacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
zilog_t *zilog = zsb->z_log; zilog_t *zilog = zfsvfs->z_log;
ulong_t mask = vsecp->vsa_mask & (VSA_ACE | VSA_ACECNT); ulong_t mask = vsecp->vsa_mask & (VSA_ACE | VSA_ACECNT);
dmu_tx_t *tx; dmu_tx_t *tx;
int error; int error;
@ -2071,7 +2071,7 @@ zfs_setacl(znode_t *zp, vsecattr_t *vsecp, boolean_t skipaclchk, cred_t *cr)
if ((error = zfs_zaccess(zp, ACE_WRITE_ACL, 0, skipaclchk, cr))) if ((error = zfs_zaccess(zp, ACE_WRITE_ACL, 0, skipaclchk, cr)))
return (error); return (error);
error = zfs_vsec_2_aclp(zsb, ZTOI(zp)->i_mode, vsecp, cr, &fuidp, error = zfs_vsec_2_aclp(zfsvfs, ZTOI(zp)->i_mode, vsecp, cr, &fuidp,
&aclp); &aclp);
if (error) if (error)
return (error); return (error);
@ -2088,13 +2088,13 @@ top:
mutex_enter(&zp->z_acl_lock); mutex_enter(&zp->z_acl_lock);
mutex_enter(&zp->z_lock); mutex_enter(&zp->z_lock);
tx = dmu_tx_create(zsb->z_os); tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE); dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE);
fuid_dirtied = zsb->z_fuid_dirty; fuid_dirtied = zfsvfs->z_fuid_dirty;
if (fuid_dirtied) if (fuid_dirtied)
zfs_fuid_txhold(zsb, tx); zfs_fuid_txhold(zfsvfs, tx);
/* /*
* If old version and ACL won't fit in bonus and we aren't * If old version and ACL won't fit in bonus and we aren't
@ -2102,7 +2102,7 @@ top:
*/ */
if ((acl_obj = zfs_external_acl(zp)) != 0) { if ((acl_obj = zfs_external_acl(zp)) != 0) {
if (zsb->z_version >= ZPL_VERSION_FUID && if (zfsvfs->z_version >= ZPL_VERSION_FUID &&
zfs_znode_acl_version(zp) <= ZFS_ACL_VERSION_INITIAL) { zfs_znode_acl_version(zp) <= ZFS_ACL_VERSION_INITIAL) {
dmu_tx_hold_free(tx, acl_obj, 0, dmu_tx_hold_free(tx, acl_obj, 0,
DMU_OBJECT_END); DMU_OBJECT_END);
@ -2137,7 +2137,7 @@ top:
zp->z_acl_cached = aclp; zp->z_acl_cached = aclp;
if (fuid_dirtied) if (fuid_dirtied)
zfs_fuid_sync(zsb, tx); zfs_fuid_sync(zfsvfs, tx);
zfs_log_acl(zilog, tx, zp, vsecp, fuidp); zfs_log_acl(zilog, tx, zp, vsecp, fuidp);
@ -2218,7 +2218,7 @@ static int
zfs_zaccess_aces_check(znode_t *zp, uint32_t *working_mode, zfs_zaccess_aces_check(znode_t *zp, uint32_t *working_mode,
boolean_t anyaccess, cred_t *cr) boolean_t anyaccess, cred_t *cr)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
zfs_acl_t *aclp; zfs_acl_t *aclp;
int error; int error;
uid_t uid = crgetuid(cr); uid_t uid = crgetuid(cr);
@ -2273,7 +2273,7 @@ zfs_zaccess_aces_check(znode_t *zp, uint32_t *working_mode,
who = gowner; who = gowner;
/*FALLTHROUGH*/ /*FALLTHROUGH*/
case ACE_IDENTIFIER_GROUP: case ACE_IDENTIFIER_GROUP:
checkit = zfs_groupmember(zsb, who, cr); checkit = zfs_groupmember(zfsvfs, who, cr);
break; break;
case ACE_EVERYONE: case ACE_EVERYONE:
checkit = B_TRUE; checkit = B_TRUE;
@ -2284,7 +2284,7 @@ zfs_zaccess_aces_check(znode_t *zp, uint32_t *working_mode,
if (entry_type == 0) { if (entry_type == 0) {
uid_t newid; uid_t newid;
newid = zfs_fuid_map_id(zsb, who, cr, newid = zfs_fuid_map_id(zfsvfs, who, cr,
ZFS_ACE_USER); ZFS_ACE_USER);
if (newid != IDMAP_WK_CREATOR_OWNER_UID && if (newid != IDMAP_WK_CREATOR_OWNER_UID &&
uid == newid) uid == newid)
@ -2357,7 +2357,7 @@ static int
zfs_zaccess_common(znode_t *zp, uint32_t v4_mode, uint32_t *working_mode, zfs_zaccess_common(znode_t *zp, uint32_t v4_mode, uint32_t *working_mode,
boolean_t *check_privs, boolean_t skipaclchk, cred_t *cr) boolean_t *check_privs, boolean_t skipaclchk, cred_t *cr)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
int err; int err;
*working_mode = v4_mode; *working_mode = v4_mode;
@ -2366,7 +2366,7 @@ zfs_zaccess_common(znode_t *zp, uint32_t v4_mode, uint32_t *working_mode,
/* /*
* Short circuit empty requests * Short circuit empty requests
*/ */
if (v4_mode == 0 || zsb->z_replay) { if (v4_mode == 0 || zfsvfs->z_replay) {
*working_mode = 0; *working_mode = 0;
return (0); return (0);
} }

View File

@ -60,12 +60,12 @@
* *
* The '.zfs', '.zfs/snapshot', and all directories created under * The '.zfs', '.zfs/snapshot', and all directories created under
* '.zfs/snapshot' (ie: '.zfs/snapshot/<snapname>') all share the same * '.zfs/snapshot' (ie: '.zfs/snapshot/<snapname>') all share the same
* share the same zfs_sb_t as the head filesystem (what '.zfs' lives under). * share the same zfsvfs_t as the head filesystem (what '.zfs' lives under).
* *
* File systems mounted on top of the '.zfs/snapshot/<snapname>' paths * File systems mounted on top of the '.zfs/snapshot/<snapname>' paths
* (ie: snapshots) are complete ZFS filesystems and have their own unique * (ie: snapshots) are complete ZFS filesystems and have their own unique
* zfs_sb_t. However, the fsid reported by these mounts will be the same * zfsvfs_t. However, the fsid reported by these mounts will be the same
* as that used by the parent zfs_sb_t to make NFS happy. * as that used by the parent zfsvfs_t to make NFS happy.
*/ */
#include <sys/types.h> #include <sys/types.h>
@ -448,14 +448,14 @@ zfsctl_is_snapdir(struct inode *ip)
* Allocate a new inode with the passed id and ops. * Allocate a new inode with the passed id and ops.
*/ */
static struct inode * static struct inode *
zfsctl_inode_alloc(zfs_sb_t *zsb, uint64_t id, zfsctl_inode_alloc(zfsvfs_t *zfsvfs, uint64_t id,
const struct file_operations *fops, const struct inode_operations *ops) const struct file_operations *fops, const struct inode_operations *ops)
{ {
struct timespec now = current_fs_time(zsb->z_sb); struct timespec now = current_fs_time(zfsvfs->z_sb);
struct inode *ip; struct inode *ip;
znode_t *zp; znode_t *zp;
ip = new_inode(zsb->z_sb); ip = new_inode(zfsvfs->z_sb);
if (ip == NULL) if (ip == NULL)
return (NULL); return (NULL);
@ -498,11 +498,11 @@ zfsctl_inode_alloc(zfs_sb_t *zsb, uint64_t id,
return (NULL); return (NULL);
} }
mutex_enter(&zsb->z_znodes_lock); mutex_enter(&zfsvfs->z_znodes_lock);
list_insert_tail(&zsb->z_all_znodes, zp); list_insert_tail(&zfsvfs->z_all_znodes, zp);
zsb->z_nr_znodes++; zfsvfs->z_nr_znodes++;
membar_producer(); membar_producer();
mutex_exit(&zsb->z_znodes_lock); mutex_exit(&zfsvfs->z_znodes_lock);
unlock_new_inode(ip); unlock_new_inode(ip);
@ -513,18 +513,18 @@ zfsctl_inode_alloc(zfs_sb_t *zsb, uint64_t id,
* Lookup the inode with given id, it will be allocated if needed. * Lookup the inode with given id, it will be allocated if needed.
*/ */
static struct inode * static struct inode *
zfsctl_inode_lookup(zfs_sb_t *zsb, uint64_t id, zfsctl_inode_lookup(zfsvfs_t *zfsvfs, uint64_t id,
const struct file_operations *fops, const struct inode_operations *ops) const struct file_operations *fops, const struct inode_operations *ops)
{ {
struct inode *ip = NULL; struct inode *ip = NULL;
while (ip == NULL) { while (ip == NULL) {
ip = ilookup(zsb->z_sb, (unsigned long)id); ip = ilookup(zfsvfs->z_sb, (unsigned long)id);
if (ip) if (ip)
break; break;
/* May fail due to concurrent zfsctl_inode_alloc() */ /* May fail due to concurrent zfsctl_inode_alloc() */
ip = zfsctl_inode_alloc(zsb, id, fops, ops); ip = zfsctl_inode_alloc(zfsvfs, id, fops, ops);
} }
return (ip); return (ip);
@ -532,7 +532,7 @@ zfsctl_inode_lookup(zfs_sb_t *zsb, uint64_t id,
/* /*
* Create the '.zfs' directory. This directory is cached as part of the VFS * Create the '.zfs' directory. This directory is cached as part of the VFS
* structure. This results in a hold on the zfs_sb_t. The code in zfs_umount() * structure. This results in a hold on the zfsvfs_t. The code in zfs_umount()
* therefore checks against a vfs_count of 2 instead of 1. This reference * therefore checks against a vfs_count of 2 instead of 1. This reference
* is removed when the ctldir is destroyed in the unmount. All other entities * is removed when the ctldir is destroyed in the unmount. All other entities
* under the '.zfs' directory are created dynamically as needed. * under the '.zfs' directory are created dynamically as needed.
@ -541,13 +541,13 @@ zfsctl_inode_lookup(zfs_sb_t *zsb, uint64_t id,
* of 64-bit inode numbers this support must be disabled on 32-bit systems. * of 64-bit inode numbers this support must be disabled on 32-bit systems.
*/ */
int int
zfsctl_create(zfs_sb_t *zsb) zfsctl_create(zfsvfs_t *zfsvfs)
{ {
ASSERT(zsb->z_ctldir == NULL); ASSERT(zfsvfs->z_ctldir == NULL);
zsb->z_ctldir = zfsctl_inode_alloc(zsb, ZFSCTL_INO_ROOT, zfsvfs->z_ctldir = zfsctl_inode_alloc(zfsvfs, ZFSCTL_INO_ROOT,
&zpl_fops_root, &zpl_ops_root); &zpl_fops_root, &zpl_ops_root);
if (zsb->z_ctldir == NULL) if (zfsvfs->z_ctldir == NULL)
return (SET_ERROR(ENOENT)); return (SET_ERROR(ENOENT));
return (0); return (0);
@ -558,12 +558,12 @@ zfsctl_create(zfs_sb_t *zsb)
* Only called when the filesystem is unmounted. * Only called when the filesystem is unmounted.
*/ */
void void
zfsctl_destroy(zfs_sb_t *zsb) zfsctl_destroy(zfsvfs_t *zfsvfs)
{ {
if (zsb->z_issnap) { if (zfsvfs->z_issnap) {
zfs_snapentry_t *se; zfs_snapentry_t *se;
spa_t *spa = zsb->z_os->os_spa; spa_t *spa = zfsvfs->z_os->os_spa;
uint64_t objsetid = dmu_objset_id(zsb->z_os); uint64_t objsetid = dmu_objset_id(zfsvfs->z_os);
rw_enter(&zfs_snapshot_lock, RW_WRITER); rw_enter(&zfs_snapshot_lock, RW_WRITER);
if ((se = zfsctl_snapshot_find_by_objsetid(spa, objsetid)) if ((se = zfsctl_snapshot_find_by_objsetid(spa, objsetid))
@ -573,9 +573,9 @@ zfsctl_destroy(zfs_sb_t *zsb)
zfsctl_snapshot_rele(se); zfsctl_snapshot_rele(se);
} }
rw_exit(&zfs_snapshot_lock); rw_exit(&zfs_snapshot_lock);
} else if (zsb->z_ctldir) { } else if (zfsvfs->z_ctldir) {
iput(zsb->z_ctldir); iput(zfsvfs->z_ctldir);
zsb->z_ctldir = NULL; zfsvfs->z_ctldir = NULL;
} }
} }
@ -646,21 +646,21 @@ int
zfsctl_fid(struct inode *ip, fid_t *fidp) zfsctl_fid(struct inode *ip, fid_t *fidp)
{ {
znode_t *zp = ITOZ(ip); znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ITOZSB(ip); zfsvfs_t *zfsvfs = ITOZSB(ip);
uint64_t object = zp->z_id; uint64_t object = zp->z_id;
zfid_short_t *zfid; zfid_short_t *zfid;
int i; int i;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
if (zfsctl_is_snapdir(ip)) { if (zfsctl_is_snapdir(ip)) {
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (zfsctl_snapdir_fid(ip, fidp)); return (zfsctl_snapdir_fid(ip, fidp));
} }
if (fidp->fid_len < SHORT_FID_LEN) { if (fidp->fid_len < SHORT_FID_LEN) {
fidp->fid_len = SHORT_FID_LEN; fidp->fid_len = SHORT_FID_LEN;
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (SET_ERROR(ENOSPC)); return (SET_ERROR(ENOSPC));
} }
@ -675,7 +675,7 @@ zfsctl_fid(struct inode *ip, fid_t *fidp)
for (i = 0; i < sizeof (zfid->zf_gen); i++) for (i = 0; i < sizeof (zfid->zf_gen); i++)
zfid->zf_gen[i] = 0; zfid->zf_gen[i] = 0;
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (0); return (0);
} }
@ -683,10 +683,10 @@ zfsctl_fid(struct inode *ip, fid_t *fidp)
* Construct a full dataset name in full_name: "pool/dataset@snap_name" * Construct a full dataset name in full_name: "pool/dataset@snap_name"
*/ */
static int static int
zfsctl_snapshot_name(zfs_sb_t *zsb, const char *snap_name, int len, zfsctl_snapshot_name(zfsvfs_t *zfsvfs, const char *snap_name, int len,
char *full_name) char *full_name)
{ {
objset_t *os = zsb->z_os; objset_t *os = zfsvfs->z_os;
if (zfs_component_namecheck(snap_name, NULL, NULL) != 0) if (zfs_component_namecheck(snap_name, NULL, NULL) != 0)
return (SET_ERROR(EILSEQ)); return (SET_ERROR(EILSEQ));
@ -736,17 +736,17 @@ out:
* Returns full path in full_path: "/pool/dataset/.zfs/snapshot/snap_name/" * Returns full path in full_path: "/pool/dataset/.zfs/snapshot/snap_name/"
*/ */
static int static int
zfsctl_snapshot_path_objset(zfs_sb_t *zsb, uint64_t objsetid, zfsctl_snapshot_path_objset(zfsvfs_t *zfsvfs, uint64_t objsetid,
int path_len, char *full_path) int path_len, char *full_path)
{ {
objset_t *os = zsb->z_os; objset_t *os = zfsvfs->z_os;
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
char *snapname; char *snapname;
boolean_t case_conflict; boolean_t case_conflict;
uint64_t id, pos = 0; uint64_t id, pos = 0;
int error = 0; int error = 0;
if (zsb->z_mntopts->z_mntpoint == NULL) if (zfsvfs->z_vfs->vfs_mntpoint == NULL)
return (ENOENT); return (ENOENT);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
@ -754,7 +754,7 @@ zfsctl_snapshot_path_objset(zfs_sb_t *zsb, uint64_t objsetid,
while (error == 0) { while (error == 0) {
dsl_pool_config_enter(dmu_objset_pool(os), FTAG); dsl_pool_config_enter(dmu_objset_pool(os), FTAG);
error = dmu_snapshot_list_next(zsb->z_os, error = dmu_snapshot_list_next(zfsvfs->z_os,
ZFS_MAX_DATASET_NAME_LEN, snapname, &id, &pos, ZFS_MAX_DATASET_NAME_LEN, snapname, &id, &pos,
&case_conflict); &case_conflict);
dsl_pool_config_exit(dmu_objset_pool(os), FTAG); dsl_pool_config_exit(dmu_objset_pool(os), FTAG);
@ -767,7 +767,7 @@ zfsctl_snapshot_path_objset(zfs_sb_t *zsb, uint64_t objsetid,
memset(full_path, 0, path_len); memset(full_path, 0, path_len);
snprintf(full_path, path_len - 1, "%s/.zfs/snapshot/%s", snprintf(full_path, path_len - 1, "%s/.zfs/snapshot/%s",
zsb->z_mntopts->z_mntpoint, snapname); zfsvfs->z_vfs->vfs_mntpoint, snapname);
out: out:
kmem_free(snapname, ZFS_MAX_DATASET_NAME_LEN); kmem_free(snapname, ZFS_MAX_DATASET_NAME_LEN);
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
@ -782,18 +782,18 @@ int
zfsctl_root_lookup(struct inode *dip, char *name, struct inode **ipp, zfsctl_root_lookup(struct inode *dip, char *name, struct inode **ipp,
int flags, cred_t *cr, int *direntflags, pathname_t *realpnp) int flags, cred_t *cr, int *direntflags, pathname_t *realpnp)
{ {
zfs_sb_t *zsb = ITOZSB(dip); zfsvfs_t *zfsvfs = ITOZSB(dip);
int error = 0; int error = 0;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
if (strcmp(name, "..") == 0) { if (strcmp(name, "..") == 0) {
*ipp = dip->i_sb->s_root->d_inode; *ipp = dip->i_sb->s_root->d_inode;
} else if (strcmp(name, ZFS_SNAPDIR_NAME) == 0) { } else if (strcmp(name, ZFS_SNAPDIR_NAME) == 0) {
*ipp = zfsctl_inode_lookup(zsb, ZFSCTL_INO_SNAPDIR, *ipp = zfsctl_inode_lookup(zfsvfs, ZFSCTL_INO_SNAPDIR,
&zpl_fops_snapdir, &zpl_ops_snapdir); &zpl_fops_snapdir, &zpl_ops_snapdir);
} else if (strcmp(name, ZFS_SHAREDIR_NAME) == 0) { } else if (strcmp(name, ZFS_SHAREDIR_NAME) == 0) {
*ipp = zfsctl_inode_lookup(zsb, ZFSCTL_INO_SHARES, *ipp = zfsctl_inode_lookup(zfsvfs, ZFSCTL_INO_SHARES,
&zpl_fops_shares, &zpl_ops_shares); &zpl_fops_shares, &zpl_ops_shares);
} else { } else {
*ipp = NULL; *ipp = NULL;
@ -802,7 +802,7 @@ zfsctl_root_lookup(struct inode *dip, char *name, struct inode **ipp,
if (*ipp == NULL) if (*ipp == NULL)
error = SET_ERROR(ENOENT); error = SET_ERROR(ENOENT);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
@ -816,24 +816,24 @@ int
zfsctl_snapdir_lookup(struct inode *dip, char *name, struct inode **ipp, zfsctl_snapdir_lookup(struct inode *dip, char *name, struct inode **ipp,
int flags, cred_t *cr, int *direntflags, pathname_t *realpnp) int flags, cred_t *cr, int *direntflags, pathname_t *realpnp)
{ {
zfs_sb_t *zsb = ITOZSB(dip); zfsvfs_t *zfsvfs = ITOZSB(dip);
uint64_t id; uint64_t id;
int error; int error;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
error = dmu_snapshot_lookup(zsb->z_os, name, &id); error = dmu_snapshot_lookup(zfsvfs->z_os, name, &id);
if (error) { if (error) {
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
*ipp = zfsctl_inode_lookup(zsb, ZFSCTL_INO_SNAPDIRS - id, *ipp = zfsctl_inode_lookup(zfsvfs, ZFSCTL_INO_SNAPDIRS - id,
&simple_dir_operations, &simple_dir_inode_operations); &simple_dir_operations, &simple_dir_inode_operations);
if (*ipp == NULL) if (*ipp == NULL)
error = SET_ERROR(ENOENT); error = SET_ERROR(ENOENT);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
@ -847,22 +847,22 @@ int
zfsctl_snapdir_rename(struct inode *sdip, char *snm, zfsctl_snapdir_rename(struct inode *sdip, char *snm,
struct inode *tdip, char *tnm, cred_t *cr, int flags) struct inode *tdip, char *tnm, cred_t *cr, int flags)
{ {
zfs_sb_t *zsb = ITOZSB(sdip); zfsvfs_t *zfsvfs = ITOZSB(sdip);
char *to, *from, *real, *fsname; char *to, *from, *real, *fsname;
int error; int error;
if (!zfs_admin_snapshot) if (!zfs_admin_snapshot)
return (EACCES); return (EACCES);
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
to = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); to = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
from = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); from = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
real = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); real = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
fsname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); fsname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
if (zsb->z_case == ZFS_CASE_INSENSITIVE) { if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE) {
error = dmu_snapshot_realname(zsb->z_os, snm, real, error = dmu_snapshot_realname(zfsvfs->z_os, snm, real,
ZFS_MAX_DATASET_NAME_LEN, NULL); ZFS_MAX_DATASET_NAME_LEN, NULL);
if (error == 0) { if (error == 0) {
snm = real; snm = real;
@ -871,7 +871,7 @@ zfsctl_snapdir_rename(struct inode *sdip, char *snm,
} }
} }
dmu_objset_name(zsb->z_os, fsname); dmu_objset_name(zfsvfs->z_os, fsname);
error = zfsctl_snapshot_name(ITOZSB(sdip), snm, error = zfsctl_snapshot_name(ITOZSB(sdip), snm,
ZFS_MAX_DATASET_NAME_LEN, from); ZFS_MAX_DATASET_NAME_LEN, from);
@ -912,7 +912,7 @@ out:
kmem_free(real, ZFS_MAX_DATASET_NAME_LEN); kmem_free(real, ZFS_MAX_DATASET_NAME_LEN);
kmem_free(fsname, ZFS_MAX_DATASET_NAME_LEN); kmem_free(fsname, ZFS_MAX_DATASET_NAME_LEN);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
@ -924,20 +924,20 @@ out:
int int
zfsctl_snapdir_remove(struct inode *dip, char *name, cred_t *cr, int flags) zfsctl_snapdir_remove(struct inode *dip, char *name, cred_t *cr, int flags)
{ {
zfs_sb_t *zsb = ITOZSB(dip); zfsvfs_t *zfsvfs = ITOZSB(dip);
char *snapname, *real; char *snapname, *real;
int error; int error;
if (!zfs_admin_snapshot) if (!zfs_admin_snapshot)
return (EACCES); return (EACCES);
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
snapname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); snapname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
real = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); real = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
if (zsb->z_case == ZFS_CASE_INSENSITIVE) { if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE) {
error = dmu_snapshot_realname(zsb->z_os, name, real, error = dmu_snapshot_realname(zfsvfs->z_os, name, real,
ZFS_MAX_DATASET_NAME_LEN, NULL); ZFS_MAX_DATASET_NAME_LEN, NULL);
if (error == 0) { if (error == 0) {
name = real; name = real;
@ -960,7 +960,7 @@ out:
kmem_free(snapname, ZFS_MAX_DATASET_NAME_LEN); kmem_free(snapname, ZFS_MAX_DATASET_NAME_LEN);
kmem_free(real, ZFS_MAX_DATASET_NAME_LEN); kmem_free(real, ZFS_MAX_DATASET_NAME_LEN);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
@ -973,7 +973,7 @@ int
zfsctl_snapdir_mkdir(struct inode *dip, char *dirname, vattr_t *vap, zfsctl_snapdir_mkdir(struct inode *dip, char *dirname, vattr_t *vap,
struct inode **ipp, cred_t *cr, int flags) struct inode **ipp, cred_t *cr, int flags)
{ {
zfs_sb_t *zsb = ITOZSB(dip); zfsvfs_t *zfsvfs = ITOZSB(dip);
char *dsname; char *dsname;
int error; int error;
@ -987,7 +987,7 @@ zfsctl_snapdir_mkdir(struct inode *dip, char *dirname, vattr_t *vap,
goto out; goto out;
} }
dmu_objset_name(zsb->z_os, dsname); dmu_objset_name(zfsvfs->z_os, dsname);
error = zfs_secpolicy_snapshot_perms(dsname, cr); error = zfs_secpolicy_snapshot_perms(dsname, cr);
if (error != 0) if (error != 0)
@ -1055,8 +1055,8 @@ zfsctl_snapshot_mount(struct path *path, int flags)
{ {
struct dentry *dentry = path->dentry; struct dentry *dentry = path->dentry;
struct inode *ip = dentry->d_inode; struct inode *ip = dentry->d_inode;
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
zfs_sb_t *snap_zsb; zfsvfs_t *snap_zfsvfs;
zfs_snapentry_t *se; zfs_snapentry_t *se;
char *full_name, *full_path; char *full_name, *full_path;
char *argv[] = { "/usr/bin/env", "mount", "-t", "zfs", "-n", NULL, NULL, char *argv[] = { "/usr/bin/env", "mount", "-t", "zfs", "-n", NULL, NULL,
@ -1068,13 +1068,13 @@ zfsctl_snapshot_mount(struct path *path, int flags)
if (ip == NULL) if (ip == NULL)
return (EISDIR); return (EISDIR);
zsb = ITOZSB(ip); zfsvfs = ITOZSB(ip);
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
full_name = kmem_zalloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); full_name = kmem_zalloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
full_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP); full_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
error = zfsctl_snapshot_name(zsb, dname(dentry), error = zfsctl_snapshot_name(zfsvfs, dname(dentry),
ZFS_MAX_DATASET_NAME_LEN, full_name); ZFS_MAX_DATASET_NAME_LEN, full_name);
if (error) if (error)
goto error; goto error;
@ -1134,14 +1134,14 @@ zfsctl_snapshot_mount(struct path *path, int flags)
spath = *path; spath = *path;
path_get(&spath); path_get(&spath);
if (zpl_follow_down_one(&spath)) { if (zpl_follow_down_one(&spath)) {
snap_zsb = ITOZSB(spath.dentry->d_inode); snap_zfsvfs = ITOZSB(spath.dentry->d_inode);
snap_zsb->z_parent = zsb; snap_zfsvfs->z_parent = zfsvfs;
dentry = spath.dentry; dentry = spath.dentry;
spath.mnt->mnt_flags |= MNT_SHRINKABLE; spath.mnt->mnt_flags |= MNT_SHRINKABLE;
rw_enter(&zfs_snapshot_lock, RW_WRITER); rw_enter(&zfs_snapshot_lock, RW_WRITER);
se = zfsctl_snapshot_alloc(full_name, full_path, se = zfsctl_snapshot_alloc(full_name, full_path,
snap_zsb->z_os->os_spa, dmu_objset_id(snap_zsb->z_os), snap_zfsvfs->z_os->os_spa, dmu_objset_id(snap_zfsvfs->z_os),
dentry); dentry);
zfsctl_snapshot_add(se); zfsctl_snapshot_add(se);
zfsctl_snapshot_unmount_delay_impl(se, zfs_expire_snapshot); zfsctl_snapshot_unmount_delay_impl(se, zfs_expire_snapshot);
@ -1152,7 +1152,7 @@ error:
kmem_free(full_name, ZFS_MAX_DATASET_NAME_LEN); kmem_free(full_name, ZFS_MAX_DATASET_NAME_LEN);
kmem_free(full_path, MAXPATHLEN); kmem_free(full_path, MAXPATHLEN);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
@ -1211,24 +1211,24 @@ int
zfsctl_shares_lookup(struct inode *dip, char *name, struct inode **ipp, zfsctl_shares_lookup(struct inode *dip, char *name, struct inode **ipp,
int flags, cred_t *cr, int *direntflags, pathname_t *realpnp) int flags, cred_t *cr, int *direntflags, pathname_t *realpnp)
{ {
zfs_sb_t *zsb = ITOZSB(dip); zfsvfs_t *zfsvfs = ITOZSB(dip);
struct inode *ip; struct inode *ip;
znode_t *dzp; znode_t *dzp;
int error; int error;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
if (zsb->z_shares_dir == 0) { if (zfsvfs->z_shares_dir == 0) {
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (SET_ERROR(ENOTSUP)); return (SET_ERROR(ENOTSUP));
} }
if ((error = zfs_zget(zsb, zsb->z_shares_dir, &dzp)) == 0) { if ((error = zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &dzp)) == 0) {
error = zfs_lookup(ZTOI(dzp), name, &ip, 0, cr, NULL, NULL); error = zfs_lookup(ZTOI(dzp), name, &ip, 0, cr, NULL, NULL);
iput(ZTOI(dzp)); iput(ZTOI(dzp));
} }
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }

View File

@ -25,7 +25,6 @@
* Copyright 2017 Nexenta Systems, Inc. * Copyright 2017 Nexenta Systems, Inc.
*/ */
#include <sys/types.h> #include <sys/types.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/time.h> #include <sys/time.h>
@ -66,13 +65,13 @@
* of names after deciding which is the appropriate lookup interface. * of names after deciding which is the appropriate lookup interface.
*/ */
static int static int
zfs_match_find(zfs_sb_t *zsb, znode_t *dzp, char *name, matchtype_t mt, zfs_match_find(zfsvfs_t *zfsvfs, znode_t *dzp, char *name, matchtype_t mt,
boolean_t update, int *deflags, pathname_t *rpnp, uint64_t *zoid) boolean_t update, int *deflags, pathname_t *rpnp, uint64_t *zoid)
{ {
boolean_t conflict = B_FALSE; boolean_t conflict = B_FALSE;
int error; int error;
if (zsb->z_norm) { if (zfsvfs->z_norm) {
size_t bufsz = 0; size_t bufsz = 0;
char *buf = NULL; char *buf = NULL;
@ -85,10 +84,10 @@ zfs_match_find(zfs_sb_t *zsb, znode_t *dzp, char *name, matchtype_t mt,
* In the non-mixed case we only expect there would ever * In the non-mixed case we only expect there would ever
* be one match, but we need to use the normalizing lookup. * be one match, but we need to use the normalizing lookup.
*/ */
error = zap_lookup_norm(zsb->z_os, dzp->z_id, name, 8, 1, error = zap_lookup_norm(zfsvfs->z_os, dzp->z_id, name, 8, 1,
zoid, mt, buf, bufsz, &conflict); zoid, mt, buf, bufsz, &conflict);
} else { } else {
error = zap_lookup(zsb->z_os, dzp->z_id, name, 8, 1, zoid); error = zap_lookup(zfsvfs->z_os, dzp->z_id, name, 8, 1, zoid);
} }
/* /*
@ -101,7 +100,7 @@ zfs_match_find(zfs_sb_t *zsb, znode_t *dzp, char *name, matchtype_t mt,
if (error == EOVERFLOW) if (error == EOVERFLOW)
error = 0; error = 0;
if (zsb->z_norm && !error && deflags) if (zfsvfs->z_norm && !error && deflags)
*deflags = conflict ? ED_CASE_CONFLICT : 0; *deflags = conflict ? ED_CASE_CONFLICT : 0;
*zoid = ZFS_DIRENT_OBJ(*zoid); *zoid = ZFS_DIRENT_OBJ(*zoid);
@ -153,7 +152,7 @@ int
zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp, zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
int flag, int *direntflags, pathname_t *realpnp) int flag, int *direntflags, pathname_t *realpnp)
{ {
zfs_sb_t *zsb = ZTOZSB(dzp); zfsvfs_t *zfsvfs = ZTOZSB(dzp);
zfs_dirlock_t *dl; zfs_dirlock_t *dl;
boolean_t update; boolean_t update;
matchtype_t mt = 0; matchtype_t mt = 0;
@ -178,7 +177,7 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
/* /*
* Case sensitivity and normalization preferences are set when * Case sensitivity and normalization preferences are set when
* the file system is created. These are stored in the * the file system is created. These are stored in the
* zsb->z_case and zsb->z_norm fields. These choices * zfsvfs->z_case and zfsvfs->z_norm fields. These choices
* affect what vnodes can be cached in the DNLC, how we * affect what vnodes can be cached in the DNLC, how we
* perform zap lookups, and the "width" of our dirlocks. * perform zap lookups, and the "width" of our dirlocks.
* *
@ -202,7 +201,7 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
* *
* See the table above zfs_dropname(). * See the table above zfs_dropname().
*/ */
if (zsb->z_norm != 0) { if (zfsvfs->z_norm != 0) {
mt = MT_NORMALIZE; mt = MT_NORMALIZE;
/* /*
@ -210,9 +209,9 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
* lookup, and if so keep track of that so that during * lookup, and if so keep track of that so that during
* normalization we don't fold case. * normalization we don't fold case.
*/ */
if ((zsb->z_case == ZFS_CASE_INSENSITIVE && if ((zfsvfs->z_case == ZFS_CASE_INSENSITIVE &&
(flag & ZCIEXACT)) || (flag & ZCIEXACT)) ||
(zsb->z_case == ZFS_CASE_MIXED && !(flag & ZCILOOK))) { (zfsvfs->z_case == ZFS_CASE_MIXED && !(flag & ZCILOOK))) {
mt |= MT_MATCH_CASE; mt |= MT_MATCH_CASE;
} }
} }
@ -227,9 +226,9 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
* Maybe can add TO-UPPERed version of name to dnlc in ci-only * Maybe can add TO-UPPERed version of name to dnlc in ci-only
* case for performance improvement? * case for performance improvement?
*/ */
update = !zsb->z_norm || update = !zfsvfs->z_norm ||
(zsb->z_case == ZFS_CASE_MIXED && (zfsvfs->z_case == ZFS_CASE_MIXED &&
!(zsb->z_norm & ~U8_TEXTPREP_TOUPPER) && !(flag & ZCILOOK)); !(zfsvfs->z_norm & ~U8_TEXTPREP_TOUPPER) && !(flag & ZCILOOK));
/* /*
* ZRENAMING indicates we are in a situation where we should * ZRENAMING indicates we are in a situation where we should
@ -242,7 +241,7 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
if (flag & ZRENAMING) if (flag & ZRENAMING)
cmpflags = 0; cmpflags = 0;
else else
cmpflags = zsb->z_norm; cmpflags = zfsvfs->z_norm;
/* /*
* Wait until there are no locks on this name. * Wait until there are no locks on this name.
@ -322,7 +321,7 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
* See if there's an object by this name; if so, put a hold on it. * See if there's an object by this name; if so, put a hold on it.
*/ */
if (flag & ZXATTR) { if (flag & ZXATTR) {
error = sa_lookup(dzp->z_sa_hdl, SA_ZPL_XATTR(zsb), &zoid, error = sa_lookup(dzp->z_sa_hdl, SA_ZPL_XATTR(zfsvfs), &zoid,
sizeof (zoid)); sizeof (zoid));
if (error == 0) if (error == 0)
error = (zoid == 0 ? SET_ERROR(ENOENT) : 0); error = (zoid == 0 ? SET_ERROR(ENOENT) : 0);
@ -343,11 +342,11 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
*zpp = VTOZ(vp); *zpp = VTOZ(vp);
return (0); return (0);
} else { } else {
error = zfs_match_find(zsb, dzp, name, mt, error = zfs_match_find(zfsvfs, dzp, name, mt,
update, direntflags, realpnp, &zoid); update, direntflags, realpnp, &zoid);
} }
#else #else
error = zfs_match_find(zsb, dzp, name, mt, error = zfs_match_find(zfsvfs, dzp, name, mt,
update, direntflags, realpnp, &zoid); update, direntflags, realpnp, &zoid);
#endif /* HAVE_DNLC */ #endif /* HAVE_DNLC */
} }
@ -361,7 +360,7 @@ zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
zfs_dirent_unlock(dl); zfs_dirent_unlock(dl);
return (SET_ERROR(EEXIST)); return (SET_ERROR(EEXIST));
} }
error = zfs_zget(zsb, zoid, zpp); error = zfs_zget(zfsvfs, zoid, zpp);
if (error) { if (error) {
zfs_dirent_unlock(dl); zfs_dirent_unlock(dl);
return (error); return (error);
@ -430,23 +429,23 @@ zfs_dirlook(znode_t *dzp, char *name, struct inode **ipp, int flags,
*ipp = ZTOI(dzp); *ipp = ZTOI(dzp);
igrab(*ipp); igrab(*ipp);
} else if (name[0] == '.' && name[1] == '.' && name[2] == 0) { } else if (name[0] == '.' && name[1] == '.' && name[2] == 0) {
zfs_sb_t *zsb = ZTOZSB(dzp); zfsvfs_t *zfsvfs = ZTOZSB(dzp);
/* /*
* If we are a snapshot mounted under .zfs, return * If we are a snapshot mounted under .zfs, return
* the inode pointer for the snapshot directory. * the inode pointer for the snapshot directory.
*/ */
if ((error = sa_lookup(dzp->z_sa_hdl, if ((error = sa_lookup(dzp->z_sa_hdl,
SA_ZPL_PARENT(zsb), &parent, sizeof (parent))) != 0) SA_ZPL_PARENT(zfsvfs), &parent, sizeof (parent))) != 0)
return (error); return (error);
if (parent == dzp->z_id && zsb->z_parent != zsb) { if (parent == dzp->z_id && zfsvfs->z_parent != zfsvfs) {
error = zfsctl_root_lookup(zsb->z_parent->z_ctldir, error = zfsctl_root_lookup(zfsvfs->z_parent->z_ctldir,
"snapshot", ipp, 0, kcred, NULL, NULL); "snapshot", ipp, 0, kcred, NULL, NULL);
return (error); return (error);
} }
rw_enter(&dzp->z_parent_lock, RW_READER); rw_enter(&dzp->z_parent_lock, RW_READER);
error = zfs_zget(zsb, parent, &zp); error = zfs_zget(zfsvfs, parent, &zp);
if (error == 0) if (error == 0)
*ipp = ZTOI(zp); *ipp = ZTOI(zp);
rw_exit(&dzp->z_parent_lock); rw_exit(&dzp->z_parent_lock);
@ -491,13 +490,13 @@ zfs_dirlook(znode_t *dzp, char *name, struct inode **ipp, int flags,
void void
zfs_unlinked_add(znode_t *zp, dmu_tx_t *tx) zfs_unlinked_add(znode_t *zp, dmu_tx_t *tx)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
ASSERT(zp->z_unlinked); ASSERT(zp->z_unlinked);
ASSERT(ZTOI(zp)->i_nlink == 0); ASSERT(ZTOI(zp)->i_nlink == 0);
VERIFY3U(0, ==, VERIFY3U(0, ==,
zap_add_int(zsb->z_os, zsb->z_unlinkedobj, zp->z_id, tx)); zap_add_int(zfsvfs->z_os, zfsvfs->z_unlinkedobj, zp->z_id, tx));
} }
/* /*
@ -505,7 +504,7 @@ zfs_unlinked_add(znode_t *zp, dmu_tx_t *tx)
* (force) umounted the file system. * (force) umounted the file system.
*/ */
void void
zfs_unlinked_drain(zfs_sb_t *zsb) zfs_unlinked_drain(zfsvfs_t *zfsvfs)
{ {
zap_cursor_t zc; zap_cursor_t zc;
zap_attribute_t zap; zap_attribute_t zap;
@ -516,7 +515,7 @@ zfs_unlinked_drain(zfs_sb_t *zsb)
/* /*
* Iterate over the contents of the unlinked set. * Iterate over the contents of the unlinked set.
*/ */
for (zap_cursor_init(&zc, zsb->z_os, zsb->z_unlinkedobj); for (zap_cursor_init(&zc, zfsvfs->z_os, zfsvfs->z_unlinkedobj);
zap_cursor_retrieve(&zc, &zap) == 0; zap_cursor_retrieve(&zc, &zap) == 0;
zap_cursor_advance(&zc)) { zap_cursor_advance(&zc)) {
@ -524,7 +523,8 @@ zfs_unlinked_drain(zfs_sb_t *zsb)
* See what kind of object we have in list * See what kind of object we have in list
*/ */
error = dmu_object_info(zsb->z_os, zap.za_first_integer, &doi); error = dmu_object_info(zfsvfs->z_os,
zap.za_first_integer, &doi);
if (error != 0) if (error != 0)
continue; continue;
@ -534,7 +534,7 @@ zfs_unlinked_drain(zfs_sb_t *zsb)
* We need to re-mark these list entries for deletion, * We need to re-mark these list entries for deletion,
* so we pull them back into core and set zp->z_unlinked. * so we pull them back into core and set zp->z_unlinked.
*/ */
error = zfs_zget(zsb, zap.za_first_integer, &zp); error = zfs_zget(zfsvfs, zap.za_first_integer, &zp);
/* /*
* We may pick up znodes that are already marked for deletion. * We may pick up znodes that are already marked for deletion.
@ -569,15 +569,15 @@ zfs_purgedir(znode_t *dzp)
zap_attribute_t zap; zap_attribute_t zap;
znode_t *xzp; znode_t *xzp;
dmu_tx_t *tx; dmu_tx_t *tx;
zfs_sb_t *zsb = ZTOZSB(dzp); zfsvfs_t *zfsvfs = ZTOZSB(dzp);
zfs_dirlock_t dl; zfs_dirlock_t dl;
int skipped = 0; int skipped = 0;
int error; int error;
for (zap_cursor_init(&zc, zsb->z_os, dzp->z_id); for (zap_cursor_init(&zc, zfsvfs->z_os, dzp->z_id);
(error = zap_cursor_retrieve(&zc, &zap)) == 0; (error = zap_cursor_retrieve(&zc, &zap)) == 0;
zap_cursor_advance(&zc)) { zap_cursor_advance(&zc)) {
error = zfs_zget(zsb, error = zfs_zget(zfsvfs,
ZFS_DIRENT_OBJ(zap.za_first_integer), &xzp); ZFS_DIRENT_OBJ(zap.za_first_integer), &xzp);
if (error) { if (error) {
skipped += 1; skipped += 1;
@ -587,11 +587,11 @@ zfs_purgedir(znode_t *dzp)
ASSERT(S_ISREG(ZTOI(xzp)->i_mode) || ASSERT(S_ISREG(ZTOI(xzp)->i_mode) ||
S_ISLNK(ZTOI(xzp)->i_mode)); S_ISLNK(ZTOI(xzp)->i_mode));
tx = dmu_tx_create(zsb->z_os); tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, dzp->z_sa_hdl, B_FALSE); dmu_tx_hold_sa(tx, dzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_zap(tx, dzp->z_id, FALSE, zap.za_name); dmu_tx_hold_zap(tx, dzp->z_id, FALSE, zap.za_name);
dmu_tx_hold_sa(tx, xzp->z_sa_hdl, B_FALSE); dmu_tx_hold_sa(tx, xzp->z_sa_hdl, B_FALSE);
dmu_tx_hold_zap(tx, zsb->z_unlinkedobj, FALSE, NULL); dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
/* Is this really needed ? */ /* Is this really needed ? */
zfs_sa_upgrade_txholds(tx, xzp); zfs_sa_upgrade_txholds(tx, xzp);
dmu_tx_mark_netfree(tx); dmu_tx_mark_netfree(tx);
@ -622,8 +622,8 @@ zfs_purgedir(znode_t *dzp)
void void
zfs_rmnode(znode_t *zp) zfs_rmnode(znode_t *zp)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
objset_t *os = zsb->z_os; objset_t *os = zfsvfs->z_os;
znode_t *xzp = NULL; znode_t *xzp = NULL;
dmu_tx_t *tx; dmu_tx_t *tx;
uint64_t acl_obj; uint64_t acl_obj;
@ -672,10 +672,10 @@ zfs_rmnode(znode_t *zp)
* If the file has extended attributes, we're going to unlink * If the file has extended attributes, we're going to unlink
* the xattr dir. * the xattr dir.
*/ */
error = sa_lookup(zp->z_sa_hdl, SA_ZPL_XATTR(zsb), error = sa_lookup(zp->z_sa_hdl, SA_ZPL_XATTR(zfsvfs),
&xattr_obj, sizeof (xattr_obj)); &xattr_obj, sizeof (xattr_obj));
if (error == 0 && xattr_obj) { if (error == 0 && xattr_obj) {
error = zfs_zget(zsb, xattr_obj, &xzp); error = zfs_zget(zfsvfs, xattr_obj, &xzp);
ASSERT(error == 0); ASSERT(error == 0);
} }
@ -686,9 +686,9 @@ zfs_rmnode(znode_t *zp)
*/ */
tx = dmu_tx_create(os); tx = dmu_tx_create(os);
dmu_tx_hold_free(tx, zp->z_id, 0, DMU_OBJECT_END); dmu_tx_hold_free(tx, zp->z_id, 0, DMU_OBJECT_END);
dmu_tx_hold_zap(tx, zsb->z_unlinkedobj, FALSE, NULL); dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
if (xzp) { if (xzp) {
dmu_tx_hold_zap(tx, zsb->z_unlinkedobj, TRUE, NULL); dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, TRUE, NULL);
dmu_tx_hold_sa(tx, xzp->z_sa_hdl, B_FALSE); dmu_tx_hold_sa(tx, xzp->z_sa_hdl, B_FALSE);
} }
if (acl_obj) if (acl_obj)
@ -713,7 +713,7 @@ zfs_rmnode(znode_t *zp)
xzp->z_unlinked = B_TRUE; /* mark xzp for deletion */ xzp->z_unlinked = B_TRUE; /* mark xzp for deletion */
clear_nlink(ZTOI(xzp)); /* no more links to it */ clear_nlink(ZTOI(xzp)); /* no more links to it */
links = 0; links = 0;
VERIFY(0 == sa_update(xzp->z_sa_hdl, SA_ZPL_LINKS(zsb), VERIFY(0 == sa_update(xzp->z_sa_hdl, SA_ZPL_LINKS(zfsvfs),
&links, sizeof (links), tx)); &links, sizeof (links), tx));
mutex_exit(&xzp->z_lock); mutex_exit(&xzp->z_lock);
zfs_unlinked_add(xzp, tx); zfs_unlinked_add(xzp, tx);
@ -721,7 +721,7 @@ zfs_rmnode(znode_t *zp)
/* Remove this znode from the unlinked set */ /* Remove this znode from the unlinked set */
VERIFY3U(0, ==, VERIFY3U(0, ==,
zap_remove_int(zsb->z_os, zsb->z_unlinkedobj, zp->z_id, tx)); zap_remove_int(zfsvfs->z_os, zfsvfs->z_unlinkedobj, zp->z_id, tx));
zfs_znode_delete(zp, tx); zfs_znode_delete(zp, tx);
@ -748,7 +748,7 @@ int
zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag) zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
{ {
znode_t *dzp = dl->dl_dzp; znode_t *dzp = dl->dl_dzp;
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
uint64_t value; uint64_t value;
int zp_is_dir = S_ISDIR(ZTOI(zp)->i_mode); int zp_is_dir = S_ISDIR(ZTOI(zp)->i_mode);
sa_bulk_attr_t bulk[5]; sa_bulk_attr_t bulk[5];
@ -772,17 +772,17 @@ zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
*/ */
inc_nlink(ZTOI(zp)); inc_nlink(ZTOI(zp));
links = ZTOI(zp)->i_nlink; links = ZTOI(zp)->i_nlink;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zfsvfs),
&links, sizeof (links)); NULL, &links, sizeof (links));
} }
} }
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zfsvfs), NULL,
&dzp->z_id, sizeof (dzp->z_id)); &dzp->z_id, sizeof (dzp->z_id));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
&zp->z_pflags, sizeof (zp->z_pflags)); &zp->z_pflags, sizeof (zp->z_pflags));
if (!(flag & ZNEW)) { if (!(flag & ZNEW)) {
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL,
ctime, sizeof (ctime)); ctime, sizeof (ctime));
zfs_tstamp_update_setup(zp, STATE_CHANGED, mtime, zfs_tstamp_update_setup(zp, STATE_CHANGED, mtime,
ctime); ctime);
@ -798,15 +798,15 @@ zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
inc_nlink(ZTOI(dzp)); inc_nlink(ZTOI(dzp));
links = ZTOI(dzp)->i_nlink; links = ZTOI(dzp)->i_nlink;
count = 0; count = 0;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zfsvfs), NULL,
&dzp->z_size, sizeof (dzp->z_size)); &dzp->z_size, sizeof (dzp->z_size));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zfsvfs), NULL,
&links, sizeof (links)); &links, sizeof (links));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL,
mtime, sizeof (mtime)); mtime, sizeof (mtime));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL,
ctime, sizeof (ctime)); ctime, sizeof (ctime));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
&dzp->z_pflags, sizeof (dzp->z_pflags)); &dzp->z_pflags, sizeof (dzp->z_pflags));
zfs_tstamp_update_setup(dzp, CONTENT_MODIFIED, mtime, ctime); zfs_tstamp_update_setup(dzp, CONTENT_MODIFIED, mtime, ctime);
error = sa_bulk_update(dzp->z_sa_hdl, bulk, count, tx); error = sa_bulk_update(dzp->z_sa_hdl, bulk, count, tx);
@ -881,7 +881,7 @@ zfs_link_destroy(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag,
boolean_t *unlinkedp) boolean_t *unlinkedp)
{ {
znode_t *dzp = dl->dl_dzp; znode_t *dzp = dl->dl_dzp;
zfs_sb_t *zsb = ZTOZSB(dzp); zfsvfs_t *zfsvfs = ZTOZSB(dzp);
int zp_is_dir = S_ISDIR(ZTOI(zp)->i_mode); int zp_is_dir = S_ISDIR(ZTOI(zp)->i_mode);
boolean_t unlinked = B_FALSE; boolean_t unlinked = B_FALSE;
sa_bulk_attr_t bulk[5]; sa_bulk_attr_t bulk[5];
@ -925,15 +925,15 @@ zfs_link_destroy(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag,
clear_nlink(ZTOI(zp)); clear_nlink(ZTOI(zp));
unlinked = B_TRUE; unlinked = B_TRUE;
} else { } else {
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs),
NULL, &ctime, sizeof (ctime)); NULL, &ctime, sizeof (ctime));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs),
NULL, &zp->z_pflags, sizeof (zp->z_pflags)); NULL, &zp->z_pflags, sizeof (zp->z_pflags));
zfs_tstamp_update_setup(zp, STATE_CHANGED, mtime, zfs_tstamp_update_setup(zp, STATE_CHANGED, mtime,
ctime); ctime);
} }
links = ZTOI(zp)->i_nlink; links = ZTOI(zp)->i_nlink;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zfsvfs),
NULL, &links, sizeof (links)); NULL, &links, sizeof (links));
error = sa_bulk_update(zp->z_sa_hdl, bulk, count, tx); error = sa_bulk_update(zp->z_sa_hdl, bulk, count, tx);
count = 0; count = 0;
@ -950,15 +950,15 @@ zfs_link_destroy(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag,
if (zp_is_dir) if (zp_is_dir)
drop_nlink(ZTOI(dzp)); /* ".." link from zp */ drop_nlink(ZTOI(dzp)); /* ".." link from zp */
links = ZTOI(dzp)->i_nlink; links = ZTOI(dzp)->i_nlink;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zfsvfs),
NULL, &links, sizeof (links)); NULL, &links, sizeof (links));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zfsvfs),
NULL, &dzp->z_size, sizeof (dzp->z_size)); NULL, &dzp->z_size, sizeof (dzp->z_size));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs),
NULL, ctime, sizeof (ctime)); NULL, ctime, sizeof (ctime));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs),
NULL, mtime, sizeof (mtime)); NULL, mtime, sizeof (mtime));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs),
NULL, &dzp->z_pflags, sizeof (dzp->z_pflags)); NULL, &dzp->z_pflags, sizeof (dzp->z_pflags));
zfs_tstamp_update_setup(dzp, CONTENT_MODIFIED, mtime, ctime); zfs_tstamp_update_setup(dzp, CONTENT_MODIFIED, mtime, ctime);
error = sa_bulk_update(dzp->z_sa_hdl, bulk, count, tx); error = sa_bulk_update(dzp->z_sa_hdl, bulk, count, tx);
@ -987,7 +987,7 @@ zfs_dirempty(znode_t *dzp)
int int
zfs_make_xattrdir(znode_t *zp, vattr_t *vap, struct inode **xipp, cred_t *cr) zfs_make_xattrdir(znode_t *zp, vattr_t *vap, struct inode **xipp, cred_t *cr)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
znode_t *xzp; znode_t *xzp;
dmu_tx_t *tx; dmu_tx_t *tx;
int error; int error;
@ -1005,19 +1005,19 @@ zfs_make_xattrdir(znode_t *zp, vattr_t *vap, struct inode **xipp, cred_t *cr)
if ((error = zfs_acl_ids_create(zp, IS_XATTR, vap, cr, NULL, if ((error = zfs_acl_ids_create(zp, IS_XATTR, vap, cr, NULL,
&acl_ids)) != 0) &acl_ids)) != 0)
return (error); return (error);
if (zfs_acl_ids_overquota(zsb, &acl_ids)) { if (zfs_acl_ids_overquota(zfsvfs, &acl_ids)) {
zfs_acl_ids_free(&acl_ids); zfs_acl_ids_free(&acl_ids);
return (SET_ERROR(EDQUOT)); return (SET_ERROR(EDQUOT));
} }
tx = dmu_tx_create(zsb->z_os); tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa_create(tx, acl_ids.z_aclp->z_acl_bytes + dmu_tx_hold_sa_create(tx, acl_ids.z_aclp->z_acl_bytes +
ZFS_SA_BASE_ATTR_SIZE); ZFS_SA_BASE_ATTR_SIZE);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE); dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE);
dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL); dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
fuid_dirtied = zsb->z_fuid_dirty; fuid_dirtied = zfsvfs->z_fuid_dirty;
if (fuid_dirtied) if (fuid_dirtied)
zfs_fuid_txhold(zsb, tx); zfs_fuid_txhold(zfsvfs, tx);
error = dmu_tx_assign(tx, TXG_WAIT); error = dmu_tx_assign(tx, TXG_WAIT);
if (error) { if (error) {
zfs_acl_ids_free(&acl_ids); zfs_acl_ids_free(&acl_ids);
@ -1027,19 +1027,19 @@ zfs_make_xattrdir(znode_t *zp, vattr_t *vap, struct inode **xipp, cred_t *cr)
zfs_mknode(zp, vap, tx, cr, IS_XATTR, &xzp, &acl_ids); zfs_mknode(zp, vap, tx, cr, IS_XATTR, &xzp, &acl_ids);
if (fuid_dirtied) if (fuid_dirtied)
zfs_fuid_sync(zsb, tx); zfs_fuid_sync(zfsvfs, tx);
#ifdef DEBUG #ifdef DEBUG
error = sa_lookup(xzp->z_sa_hdl, SA_ZPL_PARENT(zsb), error = sa_lookup(xzp->z_sa_hdl, SA_ZPL_PARENT(zfsvfs),
&parent, sizeof (parent)); &parent, sizeof (parent));
ASSERT(error == 0 && parent == zp->z_id); ASSERT(error == 0 && parent == zp->z_id);
#endif #endif
VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_XATTR(zsb), &xzp->z_id, VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_XATTR(zfsvfs), &xzp->z_id,
sizeof (xzp->z_id), tx)); sizeof (xzp->z_id), tx));
if (!zp->z_unlinked) if (!zp->z_unlinked)
(void) zfs_log_create(zsb->z_log, tx, TX_MKXATTR, zp, (void) zfs_log_create(zfsvfs->z_log, tx, TX_MKXATTR, zp,
xzp, "", NULL, acl_ids.z_fuidp, vap); xzp, "", NULL, acl_ids.z_fuidp, vap);
zfs_acl_ids_free(&acl_ids); zfs_acl_ids_free(&acl_ids);
@ -1066,7 +1066,7 @@ zfs_make_xattrdir(znode_t *zp, vattr_t *vap, struct inode **xipp, cred_t *cr)
int int
zfs_get_xattrdir(znode_t *zp, struct inode **xipp, cred_t *cr, int flags) zfs_get_xattrdir(znode_t *zp, struct inode **xipp, cred_t *cr, int flags)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
znode_t *xzp; znode_t *xzp;
zfs_dirlock_t *dl; zfs_dirlock_t *dl;
vattr_t va; vattr_t va;
@ -1087,7 +1087,7 @@ top:
return (SET_ERROR(ENOENT)); return (SET_ERROR(ENOENT));
} }
if (zfs_is_readonly(zsb)) { if (zfs_is_readonly(zfsvfs)) {
zfs_dirent_unlock(dl); zfs_dirent_unlock(dl);
return (SET_ERROR(EROFS)); return (SET_ERROR(EROFS));
} }
@ -1137,17 +1137,17 @@ zfs_sticky_remove_access(znode_t *zdp, znode_t *zp, cred_t *cr)
uid_t uid; uid_t uid;
uid_t downer; uid_t downer;
uid_t fowner; uid_t fowner;
zfs_sb_t *zsb = ZTOZSB(zdp); zfsvfs_t *zfsvfs = ZTOZSB(zdp);
if (zsb->z_replay) if (zfsvfs->z_replay)
return (0); return (0);
if ((zdp->z_mode & S_ISVTX) == 0) if ((zdp->z_mode & S_ISVTX) == 0)
return (0); return (0);
downer = zfs_fuid_map_id(zsb, KUID_TO_SUID(ZTOI(zdp)->i_uid), downer = zfs_fuid_map_id(zfsvfs, KUID_TO_SUID(ZTOI(zdp)->i_uid),
cr, ZFS_OWNER); cr, ZFS_OWNER);
fowner = zfs_fuid_map_id(zsb, KUID_TO_SUID(ZTOI(zp)->i_uid), fowner = zfs_fuid_map_id(zfsvfs, KUID_TO_SUID(ZTOI(zp)->i_uid),
cr, ZFS_OWNER); cr, ZFS_OWNER);
if ((uid = crgetuid(cr)) == downer || uid == fowner || if ((uid = crgetuid(cr)) == downer || uid == fowner ||

View File

@ -46,7 +46,7 @@
* two AVL trees are created. One tree is keyed by the index number * two AVL trees are created. One tree is keyed by the index number
* and the other by the domain string. Nodes are never removed from * and the other by the domain string. Nodes are never removed from
* trees, but new entries may be added. If a new entry is added then * trees, but new entries may be added. If a new entry is added then
* the zsb->z_fuid_dirty flag is set to true and the caller will then * the zfsvfs->z_fuid_dirty flag is set to true and the caller will then
* be responsible for calling zfs_fuid_sync() to sync the changes to disk. * be responsible for calling zfs_fuid_sync() to sync the changes to disk.
* *
*/ */
@ -191,34 +191,34 @@ zfs_fuid_idx_domain(avl_tree_t *idx_tree, uint32_t idx)
* Load the fuid table(s) into memory. * Load the fuid table(s) into memory.
*/ */
static void static void
zfs_fuid_init(zfs_sb_t *zsb) zfs_fuid_init(zfsvfs_t *zfsvfs)
{ {
rw_enter(&zsb->z_fuid_lock, RW_WRITER); rw_enter(&zfsvfs->z_fuid_lock, RW_WRITER);
if (zsb->z_fuid_loaded) { if (zfsvfs->z_fuid_loaded) {
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
return; return;
} }
zfs_fuid_avl_tree_create(&zsb->z_fuid_idx, &zsb->z_fuid_domain); zfs_fuid_avl_tree_create(&zfsvfs->z_fuid_idx, &zfsvfs->z_fuid_domain);
(void) zap_lookup(zsb->z_os, MASTER_NODE_OBJ, (void) zap_lookup(zfsvfs->z_os, MASTER_NODE_OBJ,
ZFS_FUID_TABLES, 8, 1, &zsb->z_fuid_obj); ZFS_FUID_TABLES, 8, 1, &zfsvfs->z_fuid_obj);
if (zsb->z_fuid_obj != 0) { if (zfsvfs->z_fuid_obj != 0) {
zsb->z_fuid_size = zfs_fuid_table_load(zsb->z_os, zfsvfs->z_fuid_size = zfs_fuid_table_load(zfsvfs->z_os,
zsb->z_fuid_obj, &zsb->z_fuid_idx, zfsvfs->z_fuid_obj, &zfsvfs->z_fuid_idx,
&zsb->z_fuid_domain); &zfsvfs->z_fuid_domain);
} }
zsb->z_fuid_loaded = B_TRUE; zfsvfs->z_fuid_loaded = B_TRUE;
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
} }
/* /*
* sync out AVL trees to persistent storage. * sync out AVL trees to persistent storage.
*/ */
void void
zfs_fuid_sync(zfs_sb_t *zsb, dmu_tx_t *tx) zfs_fuid_sync(zfsvfs_t *zfsvfs, dmu_tx_t *tx)
{ {
nvlist_t *nvp; nvlist_t *nvp;
nvlist_t **fuids; nvlist_t **fuids;
@ -229,30 +229,30 @@ zfs_fuid_sync(zfs_sb_t *zsb, dmu_tx_t *tx)
int numnodes; int numnodes;
int i; int i;
if (!zsb->z_fuid_dirty) { if (!zfsvfs->z_fuid_dirty) {
return; return;
} }
rw_enter(&zsb->z_fuid_lock, RW_WRITER); rw_enter(&zfsvfs->z_fuid_lock, RW_WRITER);
/* /*
* First see if table needs to be created? * First see if table needs to be created?
*/ */
if (zsb->z_fuid_obj == 0) { if (zfsvfs->z_fuid_obj == 0) {
zsb->z_fuid_obj = dmu_object_alloc(zsb->z_os, zfsvfs->z_fuid_obj = dmu_object_alloc(zfsvfs->z_os,
DMU_OT_FUID, 1 << 14, DMU_OT_FUID_SIZE, DMU_OT_FUID, 1 << 14, DMU_OT_FUID_SIZE,
sizeof (uint64_t), tx); sizeof (uint64_t), tx);
VERIFY(zap_add(zsb->z_os, MASTER_NODE_OBJ, VERIFY(zap_add(zfsvfs->z_os, MASTER_NODE_OBJ,
ZFS_FUID_TABLES, sizeof (uint64_t), 1, ZFS_FUID_TABLES, sizeof (uint64_t), 1,
&zsb->z_fuid_obj, tx) == 0); &zfsvfs->z_fuid_obj, tx) == 0);
} }
VERIFY(nvlist_alloc(&nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0); VERIFY(nvlist_alloc(&nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
numnodes = avl_numnodes(&zsb->z_fuid_idx); numnodes = avl_numnodes(&zfsvfs->z_fuid_idx);
fuids = kmem_alloc(numnodes * sizeof (void *), KM_SLEEP); fuids = kmem_alloc(numnodes * sizeof (void *), KM_SLEEP);
for (i = 0, domnode = avl_first(&zsb->z_fuid_domain); domnode; i++, for (i = 0, domnode = avl_first(&zfsvfs->z_fuid_domain); domnode; i++,
domnode = AVL_NEXT(&zsb->z_fuid_domain, domnode)) { domnode = AVL_NEXT(&zfsvfs->z_fuid_domain, domnode)) {
VERIFY(nvlist_alloc(&fuids[i], NV_UNIQUE_NAME, KM_SLEEP) == 0); VERIFY(nvlist_alloc(&fuids[i], NV_UNIQUE_NAME, KM_SLEEP) == 0);
VERIFY(nvlist_add_uint64(fuids[i], FUID_IDX, VERIFY(nvlist_add_uint64(fuids[i], FUID_IDX,
domnode->f_idx) == 0); domnode->f_idx) == 0);
@ -270,29 +270,30 @@ zfs_fuid_sync(zfs_sb_t *zsb, dmu_tx_t *tx)
VERIFY(nvlist_pack(nvp, &packed, &nvsize, VERIFY(nvlist_pack(nvp, &packed, &nvsize,
NV_ENCODE_XDR, KM_SLEEP) == 0); NV_ENCODE_XDR, KM_SLEEP) == 0);
nvlist_free(nvp); nvlist_free(nvp);
zsb->z_fuid_size = nvsize; zfsvfs->z_fuid_size = nvsize;
dmu_write(zsb->z_os, zsb->z_fuid_obj, 0, zsb->z_fuid_size, packed, tx); dmu_write(zfsvfs->z_os, zfsvfs->z_fuid_obj, 0,
kmem_free(packed, zsb->z_fuid_size); zfsvfs->z_fuid_size, packed, tx);
VERIFY(0 == dmu_bonus_hold(zsb->z_os, zsb->z_fuid_obj, kmem_free(packed, zfsvfs->z_fuid_size);
VERIFY(0 == dmu_bonus_hold(zfsvfs->z_os, zfsvfs->z_fuid_obj,
FTAG, &db)); FTAG, &db));
dmu_buf_will_dirty(db, tx); dmu_buf_will_dirty(db, tx);
*(uint64_t *)db->db_data = zsb->z_fuid_size; *(uint64_t *)db->db_data = zfsvfs->z_fuid_size;
dmu_buf_rele(db, FTAG); dmu_buf_rele(db, FTAG);
zsb->z_fuid_dirty = B_FALSE; zfsvfs->z_fuid_dirty = B_FALSE;
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
} }
/* /*
* Query domain table for a given domain. * Query domain table for a given domain.
* *
* If domain isn't found and addok is set, it is added to AVL trees and * If domain isn't found and addok is set, it is added to AVL trees and
* the zsb->z_fuid_dirty flag will be set to TRUE. It will then be * the zfsvfs->z_fuid_dirty flag will be set to TRUE. It will then be
* necessary for the caller or another thread to detect the dirty table * necessary for the caller or another thread to detect the dirty table
* and sync out the changes. * and sync out the changes.
*/ */
int int
zfs_fuid_find_by_domain(zfs_sb_t *zsb, const char *domain, zfs_fuid_find_by_domain(zfsvfs_t *zfsvfs, const char *domain,
char **retdomain, boolean_t addok) char **retdomain, boolean_t addok)
{ {
fuid_domain_t searchnode, *findnode; fuid_domain_t searchnode, *findnode;
@ -313,23 +314,23 @@ zfs_fuid_find_by_domain(zfs_sb_t *zsb, const char *domain,
searchnode.f_ksid = ksid_lookupdomain(domain); searchnode.f_ksid = ksid_lookupdomain(domain);
if (retdomain) if (retdomain)
*retdomain = searchnode.f_ksid->kd_name; *retdomain = searchnode.f_ksid->kd_name;
if (!zsb->z_fuid_loaded) if (!zfsvfs->z_fuid_loaded)
zfs_fuid_init(zsb); zfs_fuid_init(zfsvfs);
retry: retry:
rw_enter(&zsb->z_fuid_lock, rw); rw_enter(&zfsvfs->z_fuid_lock, rw);
findnode = avl_find(&zsb->z_fuid_domain, &searchnode, &loc); findnode = avl_find(&zfsvfs->z_fuid_domain, &searchnode, &loc);
if (findnode) { if (findnode) {
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
ksiddomain_rele(searchnode.f_ksid); ksiddomain_rele(searchnode.f_ksid);
return (findnode->f_idx); return (findnode->f_idx);
} else if (addok) { } else if (addok) {
fuid_domain_t *domnode; fuid_domain_t *domnode;
uint64_t retidx; uint64_t retidx;
if (rw == RW_READER && !rw_tryupgrade(&zsb->z_fuid_lock)) { if (rw == RW_READER && !rw_tryupgrade(&zfsvfs->z_fuid_lock)) {
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
rw = RW_WRITER; rw = RW_WRITER;
goto retry; goto retry;
} }
@ -337,15 +338,15 @@ retry:
domnode = kmem_alloc(sizeof (fuid_domain_t), KM_SLEEP); domnode = kmem_alloc(sizeof (fuid_domain_t), KM_SLEEP);
domnode->f_ksid = searchnode.f_ksid; domnode->f_ksid = searchnode.f_ksid;
retidx = domnode->f_idx = avl_numnodes(&zsb->z_fuid_idx) + 1; retidx = domnode->f_idx = avl_numnodes(&zfsvfs->z_fuid_idx) + 1;
avl_add(&zsb->z_fuid_domain, domnode); avl_add(&zfsvfs->z_fuid_domain, domnode);
avl_add(&zsb->z_fuid_idx, domnode); avl_add(&zfsvfs->z_fuid_idx, domnode);
zsb->z_fuid_dirty = B_TRUE; zfsvfs->z_fuid_dirty = B_TRUE;
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
return (retidx); return (retidx);
} else { } else {
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
return (-1); return (-1);
} }
} }
@ -357,23 +358,23 @@ retry:
* *
*/ */
const char * const char *
zfs_fuid_find_by_idx(zfs_sb_t *zsb, uint32_t idx) zfs_fuid_find_by_idx(zfsvfs_t *zfsvfs, uint32_t idx)
{ {
char *domain; char *domain;
if (idx == 0 || !zsb->z_use_fuids) if (idx == 0 || !zfsvfs->z_use_fuids)
return (NULL); return (NULL);
if (!zsb->z_fuid_loaded) if (!zfsvfs->z_fuid_loaded)
zfs_fuid_init(zsb); zfs_fuid_init(zfsvfs);
rw_enter(&zsb->z_fuid_lock, RW_READER); rw_enter(&zfsvfs->z_fuid_lock, RW_READER);
if (zsb->z_fuid_obj || zsb->z_fuid_dirty) if (zfsvfs->z_fuid_obj || zfsvfs->z_fuid_dirty)
domain = zfs_fuid_idx_domain(&zsb->z_fuid_idx, idx); domain = zfs_fuid_idx_domain(&zfsvfs->z_fuid_idx, idx);
else else
domain = nulldomain; domain = nulldomain;
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
ASSERT(domain); ASSERT(domain);
return (domain); return (domain);
@ -389,7 +390,7 @@ zfs_fuid_map_ids(znode_t *zp, cred_t *cr, uid_t *uidp, uid_t *gidp)
} }
uid_t uid_t
zfs_fuid_map_id(zfs_sb_t *zsb, uint64_t fuid, zfs_fuid_map_id(zfsvfs_t *zfsvfs, uint64_t fuid,
cred_t *cr, zfs_fuid_type_t type) cred_t *cr, zfs_fuid_type_t type)
{ {
#ifdef HAVE_KSID #ifdef HAVE_KSID
@ -400,7 +401,7 @@ zfs_fuid_map_id(zfs_sb_t *zsb, uint64_t fuid,
if (index == 0) if (index == 0)
return (fuid); return (fuid);
domain = zfs_fuid_find_by_idx(zsb, index); domain = zfs_fuid_find_by_idx(zfsvfs, index);
ASSERT(domain != NULL); ASSERT(domain != NULL);
if (type == ZFS_OWNER || type == ZFS_ACE_USER) { if (type == ZFS_OWNER || type == ZFS_ACE_USER) {
@ -495,7 +496,7 @@ zfs_fuid_node_add(zfs_fuid_info_t **fuidpp, const char *domain, uint32_t rid,
* be used if it exists. * be used if it exists.
*/ */
uint64_t uint64_t
zfs_fuid_create_cred(zfs_sb_t *zsb, zfs_fuid_type_t type, zfs_fuid_create_cred(zfsvfs_t *zfsvfs, zfs_fuid_type_t type,
cred_t *cr, zfs_fuid_info_t **fuidp) cred_t *cr, zfs_fuid_info_t **fuidp)
{ {
uint64_t idx; uint64_t idx;
@ -509,7 +510,7 @@ zfs_fuid_create_cred(zfs_sb_t *zsb, zfs_fuid_type_t type,
ksid = crgetsid(cr, (type == ZFS_OWNER) ? KSID_OWNER : KSID_GROUP); ksid = crgetsid(cr, (type == ZFS_OWNER) ? KSID_OWNER : KSID_GROUP);
if (!zsb->z_use_fuids || (ksid == NULL)) { if (!zfsvfs->z_use_fuids || (ksid == NULL)) {
id = (type == ZFS_OWNER) ? crgetuid(cr) : crgetgid(cr); id = (type == ZFS_OWNER) ? crgetuid(cr) : crgetgid(cr);
if (IS_EPHEMERAL(id)) if (IS_EPHEMERAL(id))
@ -532,7 +533,7 @@ zfs_fuid_create_cred(zfs_sb_t *zsb, zfs_fuid_type_t type,
rid = ksid_getrid(ksid); rid = ksid_getrid(ksid);
domain = ksid_getdomain(ksid); domain = ksid_getdomain(ksid);
idx = zfs_fuid_find_by_domain(zsb, domain, &kdomain, B_TRUE); idx = zfs_fuid_find_by_domain(zfsvfs, domain, &kdomain, B_TRUE);
zfs_fuid_node_add(fuidp, kdomain, rid, idx, id, type); zfs_fuid_node_add(fuidp, kdomain, rid, idx, id, type);
@ -550,10 +551,10 @@ zfs_fuid_create_cred(zfs_sb_t *zsb, zfs_fuid_type_t type,
* *
* During replay operations the domain+rid information is * During replay operations the domain+rid information is
* found in the zfs_fuid_info_t that the replay code has * found in the zfs_fuid_info_t that the replay code has
* attached to the zsb of the file system. * attached to the zfsvfs of the file system.
*/ */
uint64_t uint64_t
zfs_fuid_create(zfs_sb_t *zsb, uint64_t id, cred_t *cr, zfs_fuid_create(zfsvfs_t *zfsvfs, uint64_t id, cred_t *cr,
zfs_fuid_type_t type, zfs_fuid_info_t **fuidpp) zfs_fuid_type_t type, zfs_fuid_info_t **fuidpp)
{ {
#ifdef HAVE_KSID #ifdef HAVE_KSID
@ -574,11 +575,11 @@ zfs_fuid_create(zfs_sb_t *zsb, uint64_t id, cred_t *cr,
* chmod. * chmod.
*/ */
if (!zsb->z_use_fuids || !IS_EPHEMERAL(id) || fuid_idx != 0) if (!zfsvfs->z_use_fuids || !IS_EPHEMERAL(id) || fuid_idx != 0)
return (id); return (id);
if (zsb->z_replay) { if (zfsvfs->z_replay) {
fuidp = zsb->z_fuid_replay; fuidp = zfsvfs->z_fuid_replay;
/* /*
* If we are passed an ephemeral id, but no * If we are passed an ephemeral id, but no
@ -628,9 +629,9 @@ zfs_fuid_create(zfs_sb_t *zsb, uint64_t id, cred_t *cr,
} }
} }
idx = zfs_fuid_find_by_domain(zsb, domain, &kdomain, B_TRUE); idx = zfs_fuid_find_by_domain(zfsvfs, domain, &kdomain, B_TRUE);
if (!zsb->z_replay) if (!zfsvfs->z_replay)
zfs_fuid_node_add(fuidpp, kdomain, zfs_fuid_node_add(fuidpp, kdomain,
rid, idx, id, type); rid, idx, id, type);
else if (zfuid != NULL) { else if (zfuid != NULL) {
@ -647,15 +648,15 @@ zfs_fuid_create(zfs_sb_t *zsb, uint64_t id, cred_t *cr,
} }
void void
zfs_fuid_destroy(zfs_sb_t *zsb) zfs_fuid_destroy(zfsvfs_t *zfsvfs)
{ {
rw_enter(&zsb->z_fuid_lock, RW_WRITER); rw_enter(&zfsvfs->z_fuid_lock, RW_WRITER);
if (!zsb->z_fuid_loaded) { if (!zfsvfs->z_fuid_loaded) {
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
return; return;
} }
zfs_fuid_table_destroy(&zsb->z_fuid_idx, &zsb->z_fuid_domain); zfs_fuid_table_destroy(&zfsvfs->z_fuid_idx, &zfsvfs->z_fuid_domain);
rw_exit(&zsb->z_fuid_lock); rw_exit(&zfsvfs->z_fuid_lock);
} }
/* /*
@ -709,7 +710,7 @@ zfs_fuid_info_free(zfs_fuid_info_t *fuidp)
* Will use a straight FUID compare when possible. * Will use a straight FUID compare when possible.
*/ */
boolean_t boolean_t
zfs_groupmember(zfs_sb_t *zsb, uint64_t id, cred_t *cr) zfs_groupmember(zfsvfs_t *zfsvfs, uint64_t id, cred_t *cr)
{ {
#ifdef HAVE_KSID #ifdef HAVE_KSID
ksid_t *ksid = crgetsid(cr, KSID_GROUP); ksid_t *ksid = crgetsid(cr, KSID_GROUP);
@ -733,7 +734,7 @@ zfs_groupmember(zfs_sb_t *zsb, uint64_t id, cred_t *cr)
} else { } else {
const char *domain; const char *domain;
domain = zfs_fuid_find_by_idx(zsb, idx); domain = zfs_fuid_find_by_idx(zfsvfs, idx);
ASSERT(domain != NULL); ASSERT(domain != NULL);
if (strcmp(domain, if (strcmp(domain,
@ -751,7 +752,7 @@ zfs_groupmember(zfs_sb_t *zsb, uint64_t id, cred_t *cr)
/* /*
* Not found in ksidlist, check posix groups * Not found in ksidlist, check posix groups
*/ */
gid = zfs_fuid_map_id(zsb, id, cr, ZFS_GROUP); gid = zfs_fuid_map_id(zfsvfs, id, cr, ZFS_GROUP);
return (groupmember(gid, cr)); return (groupmember(gid, cr));
#else #else
return (B_TRUE); return (B_TRUE);
@ -759,17 +760,17 @@ zfs_groupmember(zfs_sb_t *zsb, uint64_t id, cred_t *cr)
} }
void void
zfs_fuid_txhold(zfs_sb_t *zsb, dmu_tx_t *tx) zfs_fuid_txhold(zfsvfs_t *zfsvfs, dmu_tx_t *tx)
{ {
if (zsb->z_fuid_obj == 0) { if (zfsvfs->z_fuid_obj == 0) {
dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT); dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT);
dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0,
FUID_SIZE_ESTIMATE(zsb)); FUID_SIZE_ESTIMATE(zfsvfs));
dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, FALSE, NULL); dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, FALSE, NULL);
} else { } else {
dmu_tx_hold_bonus(tx, zsb->z_fuid_obj); dmu_tx_hold_bonus(tx, zfsvfs->z_fuid_obj);
dmu_tx_hold_write(tx, zsb->z_fuid_obj, 0, dmu_tx_hold_write(tx, zfsvfs->z_fuid_obj, 0,
FUID_SIZE_ESTIMATE(zsb)); FUID_SIZE_ESTIMATE(zfsvfs));
} }
} }
#endif #endif

View File

@ -548,7 +548,7 @@ zfs_set_slabel_policy(const char *name, char *strval, cred_t *cr)
/* /*
* If the existing dataset label is nondefault, check if the * If the existing dataset label is nondefault, check if the
* dataset is mounted (label cannot be changed while mounted). * dataset is mounted (label cannot be changed while mounted).
* Get the zfs_sb_t; if there isn't one, then the dataset isn't * Get the zfsvfs_t; if there isn't one, then the dataset isn't
* mounted (or isn't a dataset, doesn't exist, ...). * mounted (or isn't a dataset, doesn't exist, ...).
*/ */
if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) != 0) { if (strcasecmp(ds_hexsl, ZFS_MLSLABEL_DEFAULT) != 0) {
@ -1394,7 +1394,7 @@ put_nvlist(zfs_cmd_t *zc, nvlist_t *nvl)
} }
static int static int
get_zfs_sb(const char *dsname, zfs_sb_t **zsbp) getzfsvfs(const char *dsname, zfsvfs_t **zfvp)
{ {
objset_t *os; objset_t *os;
int error; int error;
@ -1408,10 +1408,10 @@ get_zfs_sb(const char *dsname, zfs_sb_t **zsbp)
} }
mutex_enter(&os->os_user_ptr_lock); mutex_enter(&os->os_user_ptr_lock);
*zsbp = dmu_objset_get_user(os); *zfvp = dmu_objset_get_user(os);
/* bump s_active only when non-zero to prevent umount race */ /* bump s_active only when non-zero to prevent umount race */
if (*zsbp == NULL || (*zsbp)->z_sb == NULL || if (*zfvp == NULL || (*zfvp)->z_sb == NULL ||
!atomic_inc_not_zero(&((*zsbp)->z_sb->s_active))) { !atomic_inc_not_zero(&((*zfvp)->z_sb->s_active))) {
error = SET_ERROR(ESRCH); error = SET_ERROR(ESRCH);
} }
mutex_exit(&os->os_user_ptr_lock); mutex_exit(&os->os_user_ptr_lock);
@ -1420,28 +1420,28 @@ get_zfs_sb(const char *dsname, zfs_sb_t **zsbp)
} }
/* /*
* Find a zfs_sb_t for a mounted filesystem, or create our own, in which * Find a zfsvfs_t for a mounted filesystem, or create our own, in which
* case its z_sb will be NULL, and it will be opened as the owner. * case its z_sb will be NULL, and it will be opened as the owner.
* If 'writer' is set, the z_teardown_lock will be held for RW_WRITER, * If 'writer' is set, the z_teardown_lock will be held for RW_WRITER,
* which prevents all inode ops from running. * which prevents all inode ops from running.
*/ */
static int static int
zfs_sb_hold(const char *name, void *tag, zfs_sb_t **zsbp, boolean_t writer) zfsvfs_hold(const char *name, void *tag, zfsvfs_t **zfvp, boolean_t writer)
{ {
int error = 0; int error = 0;
if (get_zfs_sb(name, zsbp) != 0) if (getzfsvfs(name, zfvp) != 0)
error = zfs_sb_create(name, NULL, zsbp); error = zfsvfs_create(name, zfvp);
if (error == 0) { if (error == 0) {
rrm_enter(&(*zsbp)->z_teardown_lock, (writer) ? RW_WRITER : rrm_enter(&(*zfvp)->z_teardown_lock, (writer) ? RW_WRITER :
RW_READER, tag); RW_READER, tag);
if ((*zsbp)->z_unmounted) { if ((*zfvp)->z_unmounted) {
/* /*
* XXX we could probably try again, since the unmounting * XXX we could probably try again, since the unmounting
* thread should be just about to disassociate the * thread should be just about to disassociate the
* objset from the zsb. * objset from the zfsvfs.
*/ */
rrm_exit(&(*zsbp)->z_teardown_lock, tag); rrm_exit(&(*zfvp)->z_teardown_lock, tag);
return (SET_ERROR(EBUSY)); return (SET_ERROR(EBUSY));
} }
} }
@ -1449,15 +1449,15 @@ zfs_sb_hold(const char *name, void *tag, zfs_sb_t **zsbp, boolean_t writer)
} }
static void static void
zfs_sb_rele(zfs_sb_t *zsb, void *tag) zfsvfs_rele(zfsvfs_t *zfsvfs, void *tag)
{ {
rrm_exit(&zsb->z_teardown_lock, tag); rrm_exit(&zfsvfs->z_teardown_lock, tag);
if (zsb->z_sb) { if (zfsvfs->z_sb) {
deactivate_super(zsb->z_sb); deactivate_super(zfsvfs->z_sb);
} else { } else {
dmu_objset_disown(zsb->z_os, zsb); dmu_objset_disown(zfsvfs->z_os, zfsvfs);
zfs_sb_free(zsb); zfsvfs_free(zfsvfs);
} }
} }
@ -2324,7 +2324,7 @@ zfs_prop_set_userquota(const char *dsname, nvpair_t *pair)
zfs_userquota_prop_t type; zfs_userquota_prop_t type;
uint64_t rid; uint64_t rid;
uint64_t quota; uint64_t quota;
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
int err; int err;
if (nvpair_type(pair) == DATA_TYPE_NVLIST) { if (nvpair_type(pair) == DATA_TYPE_NVLIST) {
@ -2349,10 +2349,10 @@ zfs_prop_set_userquota(const char *dsname, nvpair_t *pair)
rid = valary[1]; rid = valary[1];
quota = valary[2]; quota = valary[2];
err = zfs_sb_hold(dsname, FTAG, &zsb, B_FALSE); err = zfsvfs_hold(dsname, FTAG, &zfsvfs, B_FALSE);
if (err == 0) { if (err == 0) {
err = zfs_set_userquota(zsb, type, domain, rid, quota); err = zfs_set_userquota(zfsvfs, type, domain, rid, quota);
zfs_sb_rele(zsb, FTAG); zfsvfs_rele(zfsvfs, FTAG);
} }
return (err); return (err);
@ -2429,13 +2429,13 @@ zfs_prop_set_special(const char *dsname, zprop_source_t source,
break; break;
case ZFS_PROP_VERSION: case ZFS_PROP_VERSION:
{ {
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
if ((err = zfs_sb_hold(dsname, FTAG, &zsb, B_TRUE)) != 0) if ((err = zfsvfs_hold(dsname, FTAG, &zfsvfs, B_TRUE)) != 0)
break; break;
err = zfs_set_version(zsb, intval); err = zfs_set_version(zfsvfs, intval);
zfs_sb_rele(zsb, FTAG); zfsvfs_rele(zfsvfs, FTAG);
if (err == 0 && intval >= ZPL_VERSION_USERSPACE) { if (err == 0 && intval >= ZPL_VERSION_USERSPACE) {
zfs_cmd_t *zc; zfs_cmd_t *zc;
@ -3640,23 +3640,23 @@ zfs_ioc_destroy(zfs_cmd_t *zc)
static int static int
zfs_ioc_rollback(const char *fsname, nvlist_t *args, nvlist_t *outnvl) zfs_ioc_rollback(const char *fsname, nvlist_t *args, nvlist_t *outnvl)
{ {
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
zvol_state_t *zv; zvol_state_t *zv;
int error; int error;
if (get_zfs_sb(fsname, &zsb) == 0) { if (getzfsvfs(fsname, &zfsvfs) == 0) {
dsl_dataset_t *ds; dsl_dataset_t *ds;
ds = dmu_objset_ds(zsb->z_os); ds = dmu_objset_ds(zfsvfs->z_os);
error = zfs_suspend_fs(zsb); error = zfs_suspend_fs(zfsvfs);
if (error == 0) { if (error == 0) {
int resume_err; int resume_err;
error = dsl_dataset_rollback(fsname, zsb, outnvl); error = dsl_dataset_rollback(fsname, zfsvfs, outnvl);
resume_err = zfs_resume_fs(zsb, ds); resume_err = zfs_resume_fs(zfsvfs, ds);
error = error ? error : resume_err; error = error ? error : resume_err;
} }
deactivate_super(zsb->z_sb); deactivate_super(zfsvfs->z_sb);
} else if ((zv = zvol_suspend(fsname)) != NULL) { } else if ((zv = zvol_suspend(fsname)) != NULL) {
error = dsl_dataset_rollback(fsname, zvol_tag(zv), outnvl); error = dsl_dataset_rollback(fsname, zvol_tag(zv), outnvl);
zvol_resume(zv); zvol_resume(zv);
@ -4246,25 +4246,25 @@ zfs_ioc_recv_impl(char *tofs, char *tosnap, char *origin,
action_handle); action_handle);
if (error == 0) { if (error == 0) {
zfs_sb_t *zsb = NULL; zfsvfs_t *zfsvfs = NULL;
zvol_state_t *zv = NULL; zvol_state_t *zv = NULL;
if (get_zfs_sb(tofs, &zsb) == 0) { if (getzfsvfs(tofs, &zfsvfs) == 0) {
/* online recv */ /* online recv */
dsl_dataset_t *ds; dsl_dataset_t *ds;
int end_err; int end_err;
ds = dmu_objset_ds(zsb->z_os); ds = dmu_objset_ds(zfsvfs->z_os);
error = zfs_suspend_fs(zsb); error = zfs_suspend_fs(zfsvfs);
/* /*
* If the suspend fails, then the recv_end will * If the suspend fails, then the recv_end will
* likely also fail, and clean up after itself. * likely also fail, and clean up after itself.
*/ */
end_err = dmu_recv_end(&drc, zsb); end_err = dmu_recv_end(&drc, zfsvfs);
if (error == 0) if (error == 0)
error = zfs_resume_fs(zsb, ds); error = zfs_resume_fs(zfsvfs, ds);
error = error ? error : end_err; error = error ? error : end_err;
deactivate_super(zsb->z_sb); deactivate_super(zfsvfs->z_sb);
} else if ((zv = zvol_suspend(tofs)) != NULL) { } else if ((zv = zvol_suspend(tofs)) != NULL) {
error = dmu_recv_end(&drc, zvol_tag(zv)); error = dmu_recv_end(&drc, zvol_tag(zv));
zvol_resume(zv); zvol_resume(zv);
@ -4869,19 +4869,19 @@ zfs_ioc_promote(zfs_cmd_t *zc)
static int static int
zfs_ioc_userspace_one(zfs_cmd_t *zc) zfs_ioc_userspace_one(zfs_cmd_t *zc)
{ {
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
int error; int error;
if (zc->zc_objset_type >= ZFS_NUM_USERQUOTA_PROPS) if (zc->zc_objset_type >= ZFS_NUM_USERQUOTA_PROPS)
return (SET_ERROR(EINVAL)); return (SET_ERROR(EINVAL));
error = zfs_sb_hold(zc->zc_name, FTAG, &zsb, B_FALSE); error = zfsvfs_hold(zc->zc_name, FTAG, &zfsvfs, B_FALSE);
if (error != 0) if (error != 0)
return (error); return (error);
error = zfs_userspace_one(zsb, error = zfs_userspace_one(zfsvfs,
zc->zc_objset_type, zc->zc_value, zc->zc_guid, &zc->zc_cookie); zc->zc_objset_type, zc->zc_value, zc->zc_guid, &zc->zc_cookie);
zfs_sb_rele(zsb, FTAG); zfsvfs_rele(zfsvfs, FTAG);
return (error); return (error);
} }
@ -4900,7 +4900,7 @@ zfs_ioc_userspace_one(zfs_cmd_t *zc)
static int static int
zfs_ioc_userspace_many(zfs_cmd_t *zc) zfs_ioc_userspace_many(zfs_cmd_t *zc)
{ {
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
int bufsize = zc->zc_nvlist_dst_size; int bufsize = zc->zc_nvlist_dst_size;
int error; int error;
void *buf; void *buf;
@ -4908,13 +4908,13 @@ zfs_ioc_userspace_many(zfs_cmd_t *zc)
if (bufsize <= 0) if (bufsize <= 0)
return (SET_ERROR(ENOMEM)); return (SET_ERROR(ENOMEM));
error = zfs_sb_hold(zc->zc_name, FTAG, &zsb, B_FALSE); error = zfsvfs_hold(zc->zc_name, FTAG, &zfsvfs, B_FALSE);
if (error != 0) if (error != 0)
return (error); return (error);
buf = vmem_alloc(bufsize, KM_SLEEP); buf = vmem_alloc(bufsize, KM_SLEEP);
error = zfs_userspace_many(zsb, zc->zc_objset_type, &zc->zc_cookie, error = zfs_userspace_many(zfsvfs, zc->zc_objset_type, &zc->zc_cookie,
buf, &zc->zc_nvlist_dst_size); buf, &zc->zc_nvlist_dst_size);
if (error == 0) { if (error == 0) {
@ -4923,7 +4923,7 @@ zfs_ioc_userspace_many(zfs_cmd_t *zc)
zc->zc_nvlist_dst_size); zc->zc_nvlist_dst_size);
} }
vmem_free(buf, bufsize); vmem_free(buf, bufsize);
zfs_sb_rele(zsb, FTAG); zfsvfs_rele(zfsvfs, FTAG);
return (error); return (error);
} }
@ -4940,10 +4940,10 @@ zfs_ioc_userspace_upgrade(zfs_cmd_t *zc)
{ {
objset_t *os; objset_t *os;
int error = 0; int error = 0;
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
if (get_zfs_sb(zc->zc_name, &zsb) == 0) { if (getzfsvfs(zc->zc_name, &zfsvfs) == 0) {
if (!dmu_objset_userused_enabled(zsb->z_os)) { if (!dmu_objset_userused_enabled(zfsvfs->z_os)) {
/* /*
* If userused is not enabled, it may be because the * If userused is not enabled, it may be because the
* objset needs to be closed & reopened (to grow the * objset needs to be closed & reopened (to grow the
@ -4951,17 +4951,17 @@ zfs_ioc_userspace_upgrade(zfs_cmd_t *zc)
*/ */
dsl_dataset_t *ds; dsl_dataset_t *ds;
ds = dmu_objset_ds(zsb->z_os); ds = dmu_objset_ds(zfsvfs->z_os);
error = zfs_suspend_fs(zsb); error = zfs_suspend_fs(zfsvfs);
if (error == 0) { if (error == 0) {
dmu_objset_refresh_ownership(zsb->z_os, dmu_objset_refresh_ownership(zfsvfs->z_os,
zsb); zfsvfs);
error = zfs_resume_fs(zsb, ds); error = zfs_resume_fs(zfsvfs, ds);
} }
} }
if (error == 0) if (error == 0)
error = dmu_objset_userspace_upgrade(zsb->z_os); error = dmu_objset_userspace_upgrade(zfsvfs->z_os);
deactivate_super(zsb->z_sb); deactivate_super(zfsvfs->z_sb);
} else { } else {
/* XXX kind of reading contents without owning */ /* XXX kind of reading contents without owning */
error = dmu_objset_hold(zc->zc_name, FTAG, &os); error = dmu_objset_hold(zc->zc_name, FTAG, &os);
@ -5127,10 +5127,10 @@ zfs_smb_acl_purge(znode_t *dzp)
{ {
zap_cursor_t zc; zap_cursor_t zc;
zap_attribute_t zap; zap_attribute_t zap;
zfs_sb_t *zsb = ZTOZSB(dzp); zfsvfs_t *zfsvfs = ZTOZSB(dzp);
int error; int error;
for (zap_cursor_init(&zc, zsb->z_os, dzp->z_id); for (zap_cursor_init(&zc, zfsvfs->z_os, dzp->z_id);
(error = zap_cursor_retrieve(&zc, &zap)) == 0; (error = zap_cursor_retrieve(&zc, &zap)) == 0;
zap_cursor_advance(&zc)) { zap_cursor_advance(&zc)) {
if ((error = VOP_REMOVE(ZTOV(dzp), zap.za_name, kcred, if ((error = VOP_REMOVE(ZTOV(dzp), zap.za_name, kcred,
@ -5150,7 +5150,7 @@ zfs_ioc_smb_acl(zfs_cmd_t *zc)
znode_t *dzp; znode_t *dzp;
vnode_t *resourcevp = NULL; vnode_t *resourcevp = NULL;
znode_t *sharedir; znode_t *sharedir;
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
nvlist_t *nvlist; nvlist_t *nvlist;
char *src, *target; char *src, *target;
vattr_t vattr; vattr_t vattr;
@ -5171,17 +5171,17 @@ zfs_ioc_smb_acl(zfs_cmd_t *zc)
} }
dzp = VTOZ(vp); dzp = VTOZ(vp);
zsb = ZTOZSB(dzp); zfsvfs = ZTOZSB(dzp);
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
/* /*
* Create share dir if its missing. * Create share dir if its missing.
*/ */
mutex_enter(&zsb->z_lock); mutex_enter(&zfsvfs->z_lock);
if (zsb->z_shares_dir == 0) { if (zfsvfs->z_shares_dir == 0) {
dmu_tx_t *tx; dmu_tx_t *tx;
tx = dmu_tx_create(zsb->z_os); tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, TRUE, dmu_tx_hold_zap(tx, MASTER_NODE_OBJ, TRUE,
ZFS_SHARES_DIR); ZFS_SHARES_DIR);
dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL); dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
@ -5189,22 +5189,22 @@ zfs_ioc_smb_acl(zfs_cmd_t *zc)
if (error != 0) { if (error != 0) {
dmu_tx_abort(tx); dmu_tx_abort(tx);
} else { } else {
error = zfs_create_share_dir(zsb, tx); error = zfs_create_share_dir(zfsvfs, tx);
dmu_tx_commit(tx); dmu_tx_commit(tx);
} }
if (error != 0) { if (error != 0) {
mutex_exit(&zsb->z_lock); mutex_exit(&zfsvfs->z_lock);
VN_RELE(vp); VN_RELE(vp);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
} }
mutex_exit(&zsb->z_lock); mutex_exit(&zfsvfs->z_lock);
ASSERT(zsb->z_shares_dir); ASSERT(zfsvfs->z_shares_dir);
if ((error = zfs_zget(zsb, zsb->z_shares_dir, &sharedir)) != 0) { if ((error = zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &sharedir)) != 0) {
VN_RELE(vp); VN_RELE(vp);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
@ -5236,7 +5236,7 @@ zfs_ioc_smb_acl(zfs_cmd_t *zc)
zc->zc_nvlist_src_size, zc->zc_iflags, &nvlist)) != 0) { zc->zc_nvlist_src_size, zc->zc_iflags, &nvlist)) != 0) {
VN_RELE(vp); VN_RELE(vp);
VN_RELE(ZTOV(sharedir)); VN_RELE(ZTOV(sharedir));
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
if (nvlist_lookup_string(nvlist, ZFS_SMB_ACL_SRC, &src) || if (nvlist_lookup_string(nvlist, ZFS_SMB_ACL_SRC, &src) ||
@ -5244,7 +5244,7 @@ zfs_ioc_smb_acl(zfs_cmd_t *zc)
&target)) { &target)) {
VN_RELE(vp); VN_RELE(vp);
VN_RELE(ZTOV(sharedir)); VN_RELE(ZTOV(sharedir));
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
nvlist_free(nvlist); nvlist_free(nvlist);
return (error); return (error);
} }
@ -5265,7 +5265,7 @@ zfs_ioc_smb_acl(zfs_cmd_t *zc)
VN_RELE(vp); VN_RELE(vp);
VN_RELE(ZTOV(sharedir)); VN_RELE(ZTOV(sharedir));
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
#else #else

View File

@ -72,7 +72,7 @@ zfs_init_vattr(vattr_t *vap, uint64_t mask, uint64_t mode,
/* ARGSUSED */ /* ARGSUSED */
static int static int
zfs_replay_error(zfs_sb_t *zsb, lr_t *lr, boolean_t byteswap) zfs_replay_error(zfsvfs_t *zfsvfs, lr_t *lr, boolean_t byteswap)
{ {
return (SET_ERROR(ENOTSUP)); return (SET_ERROR(ENOTSUP));
} }
@ -265,7 +265,8 @@ zfs_replay_swap_attrs(lr_attr_t *lrattr)
* as option FUID information. * as option FUID information.
*/ */
static int static int
zfs_replay_create_acl(zfs_sb_t *zsb, lr_acl_create_t *lracl, boolean_t byteswap) zfs_replay_create_acl(zfsvfs_t *zfsvfs,
lr_acl_create_t *lracl, boolean_t byteswap)
{ {
char *name = NULL; /* location determined later */ char *name = NULL; /* location determined later */
lr_create_t *lr = (lr_create_t *)lracl; lr_create_t *lr = (lr_create_t *)lracl;
@ -303,7 +304,7 @@ zfs_replay_create_acl(zfs_sb_t *zsb, lr_acl_create_t *lracl, boolean_t byteswap)
} }
} }
if ((error = zfs_zget(zsb, lr->lr_doid, &dzp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0)
return (error); return (error);
objid = LR_FOID_GET_OBJ(lr->lr_foid); objid = LR_FOID_GET_OBJ(lr->lr_foid);
@ -325,7 +326,7 @@ zfs_replay_create_acl(zfs_sb_t *zsb, lr_acl_create_t *lracl, boolean_t byteswap)
xva.xva_vattr.va_nblocks = lr->lr_gen; xva.xva_vattr.va_nblocks = lr->lr_gen;
xva.xva_vattr.va_fsid = dnodesize; xva.xva_vattr.va_fsid = dnodesize;
error = dmu_object_info(zsb->z_os, lr->lr_foid, NULL); error = dmu_object_info(zfsvfs->z_os, lr->lr_foid, NULL);
if (error != ENOENT) if (error != ENOENT)
goto bail; goto bail;
@ -336,7 +337,7 @@ zfs_replay_create_acl(zfs_sb_t *zsb, lr_acl_create_t *lracl, boolean_t byteswap)
aclstart = (caddr_t)(lracl + 1); aclstart = (caddr_t)(lracl + 1);
fuidstart = (caddr_t)aclstart + fuidstart = (caddr_t)aclstart +
ZIL_ACE_LENGTH(lracl->lr_acl_bytes); ZIL_ACE_LENGTH(lracl->lr_acl_bytes);
zsb->z_fuid_replay = zfs_replay_fuids(fuidstart, zfsvfs->z_fuid_replay = zfs_replay_fuids(fuidstart,
(void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt, (void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt,
lr->lr_uid, lr->lr_gid); lr->lr_uid, lr->lr_gid);
/*FALLTHROUGH*/ /*FALLTHROUGH*/
@ -352,10 +353,10 @@ zfs_replay_create_acl(zfs_sb_t *zsb, lr_acl_create_t *lracl, boolean_t byteswap)
vsec.vsa_aclcnt = lracl->lr_aclcnt; vsec.vsa_aclcnt = lracl->lr_aclcnt;
vsec.vsa_aclentsz = lracl->lr_acl_bytes; vsec.vsa_aclentsz = lracl->lr_acl_bytes;
vsec.vsa_aclflags = lracl->lr_acl_flags; vsec.vsa_aclflags = lracl->lr_acl_flags;
if (zsb->z_fuid_replay == NULL) { if (zfsvfs->z_fuid_replay == NULL) {
fuidstart = (caddr_t)(lracl + 1) + xvatlen + fuidstart = (caddr_t)(lracl + 1) + xvatlen +
ZIL_ACE_LENGTH(lracl->lr_acl_bytes); ZIL_ACE_LENGTH(lracl->lr_acl_bytes);
zsb->z_fuid_replay = zfsvfs->z_fuid_replay =
zfs_replay_fuids(fuidstart, zfs_replay_fuids(fuidstart,
(void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt, (void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt,
lr->lr_uid, lr->lr_gid); lr->lr_uid, lr->lr_gid);
@ -368,7 +369,7 @@ zfs_replay_create_acl(zfs_sb_t *zsb, lr_acl_create_t *lracl, boolean_t byteswap)
aclstart = (caddr_t)(lracl + 1); aclstart = (caddr_t)(lracl + 1);
fuidstart = (caddr_t)aclstart + fuidstart = (caddr_t)aclstart +
ZIL_ACE_LENGTH(lracl->lr_acl_bytes); ZIL_ACE_LENGTH(lracl->lr_acl_bytes);
zsb->z_fuid_replay = zfs_replay_fuids(fuidstart, zfsvfs->z_fuid_replay = zfs_replay_fuids(fuidstart,
(void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt, (void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt,
lr->lr_uid, lr->lr_gid); lr->lr_uid, lr->lr_gid);
/*FALLTHROUGH*/ /*FALLTHROUGH*/
@ -383,10 +384,10 @@ zfs_replay_create_acl(zfs_sb_t *zsb, lr_acl_create_t *lracl, boolean_t byteswap)
vsec.vsa_aclcnt = lracl->lr_aclcnt; vsec.vsa_aclcnt = lracl->lr_aclcnt;
vsec.vsa_aclentsz = lracl->lr_acl_bytes; vsec.vsa_aclentsz = lracl->lr_acl_bytes;
vsec.vsa_aclflags = lracl->lr_acl_flags; vsec.vsa_aclflags = lracl->lr_acl_flags;
if (zsb->z_fuid_replay == NULL) { if (zfsvfs->z_fuid_replay == NULL) {
fuidstart = (caddr_t)(lracl + 1) + xvatlen + fuidstart = (caddr_t)(lracl + 1) + xvatlen +
ZIL_ACE_LENGTH(lracl->lr_acl_bytes); ZIL_ACE_LENGTH(lracl->lr_acl_bytes);
zsb->z_fuid_replay = zfsvfs->z_fuid_replay =
zfs_replay_fuids(fuidstart, zfs_replay_fuids(fuidstart,
(void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt, (void *)&name, lracl->lr_fuidcnt, lracl->lr_domcnt,
lr->lr_uid, lr->lr_gid); lr->lr_uid, lr->lr_gid);
@ -404,15 +405,15 @@ bail:
iput(ZTOI(dzp)); iput(ZTOI(dzp));
if (zsb->z_fuid_replay) if (zfsvfs->z_fuid_replay)
zfs_fuid_info_free(zsb->z_fuid_replay); zfs_fuid_info_free(zfsvfs->z_fuid_replay);
zsb->z_fuid_replay = NULL; zfsvfs->z_fuid_replay = NULL;
return (error); return (error);
} }
static int static int
zfs_replay_create(zfs_sb_t *zsb, lr_create_t *lr, boolean_t byteswap) zfs_replay_create(zfsvfs_t *zfsvfs, lr_create_t *lr, boolean_t byteswap)
{ {
char *name = NULL; /* location determined later */ char *name = NULL; /* location determined later */
char *link; /* symlink content follows name */ char *link; /* symlink content follows name */
@ -437,7 +438,7 @@ zfs_replay_create(zfs_sb_t *zsb, lr_create_t *lr, boolean_t byteswap)
} }
if ((error = zfs_zget(zsb, lr->lr_doid, &dzp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0)
return (error); return (error);
objid = LR_FOID_GET_OBJ(lr->lr_foid); objid = LR_FOID_GET_OBJ(lr->lr_foid);
@ -459,7 +460,7 @@ zfs_replay_create(zfs_sb_t *zsb, lr_create_t *lr, boolean_t byteswap)
xva.xva_vattr.va_nblocks = lr->lr_gen; xva.xva_vattr.va_nblocks = lr->lr_gen;
xva.xva_vattr.va_fsid = dnodesize; xva.xva_vattr.va_fsid = dnodesize;
error = dmu_object_info(zsb->z_os, objid, NULL); error = dmu_object_info(zfsvfs->z_os, objid, NULL);
if (error != ENOENT) if (error != ENOENT)
goto out; goto out;
@ -476,7 +477,7 @@ zfs_replay_create(zfs_sb_t *zsb, lr_create_t *lr, boolean_t byteswap)
(int)lr->lr_common.lrc_txtype != TX_MKDIR_ATTR && (int)lr->lr_common.lrc_txtype != TX_MKDIR_ATTR &&
(int)lr->lr_common.lrc_txtype != TX_CREATE_ATTR) { (int)lr->lr_common.lrc_txtype != TX_CREATE_ATTR) {
start = (lr + 1); start = (lr + 1);
zsb->z_fuid_replay = zfsvfs->z_fuid_replay =
zfs_replay_fuid_domain(start, &start, zfs_replay_fuid_domain(start, &start,
lr->lr_uid, lr->lr_gid); lr->lr_uid, lr->lr_gid);
} }
@ -487,7 +488,7 @@ zfs_replay_create(zfs_sb_t *zsb, lr_create_t *lr, boolean_t byteswap)
xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize); xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize);
zfs_replay_xvattr((lr_attr_t *)((caddr_t)lr + lrsize), &xva); zfs_replay_xvattr((lr_attr_t *)((caddr_t)lr + lrsize), &xva);
start = (caddr_t)(lr + 1) + xvatlen; start = (caddr_t)(lr + 1) + xvatlen;
zsb->z_fuid_replay = zfsvfs->z_fuid_replay =
zfs_replay_fuid_domain(start, &start, zfs_replay_fuid_domain(start, &start,
lr->lr_uid, lr->lr_gid); lr->lr_uid, lr->lr_gid);
name = (char *)start; name = (char *)start;
@ -505,7 +506,7 @@ zfs_replay_create(zfs_sb_t *zsb, lr_create_t *lr, boolean_t byteswap)
xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize); xvatlen = ZIL_XVAT_SIZE(lrattr->lr_attr_masksize);
zfs_replay_xvattr((lr_attr_t *)((caddr_t)lr + lrsize), &xva); zfs_replay_xvattr((lr_attr_t *)((caddr_t)lr + lrsize), &xva);
start = (caddr_t)(lr + 1) + xvatlen; start = (caddr_t)(lr + 1) + xvatlen;
zsb->z_fuid_replay = zfsvfs->z_fuid_replay =
zfs_replay_fuid_domain(start, &start, zfs_replay_fuid_domain(start, &start,
lr->lr_uid, lr->lr_gid); lr->lr_uid, lr->lr_gid);
name = (char *)start; name = (char *)start;
@ -537,14 +538,14 @@ out:
iput(ZTOI(dzp)); iput(ZTOI(dzp));
if (zsb->z_fuid_replay) if (zfsvfs->z_fuid_replay)
zfs_fuid_info_free(zsb->z_fuid_replay); zfs_fuid_info_free(zfsvfs->z_fuid_replay);
zsb->z_fuid_replay = NULL; zfsvfs->z_fuid_replay = NULL;
return (error); return (error);
} }
static int static int
zfs_replay_remove(zfs_sb_t *zsb, lr_remove_t *lr, boolean_t byteswap) zfs_replay_remove(zfsvfs_t *zfsvfs, lr_remove_t *lr, boolean_t byteswap)
{ {
char *name = (char *)(lr + 1); /* name follows lr_remove_t */ char *name = (char *)(lr + 1); /* name follows lr_remove_t */
znode_t *dzp; znode_t *dzp;
@ -554,7 +555,7 @@ zfs_replay_remove(zfs_sb_t *zsb, lr_remove_t *lr, boolean_t byteswap)
if (byteswap) if (byteswap)
byteswap_uint64_array(lr, sizeof (*lr)); byteswap_uint64_array(lr, sizeof (*lr));
if ((error = zfs_zget(zsb, lr->lr_doid, &dzp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0)
return (error); return (error);
if (lr->lr_common.lrc_txtype & TX_CI) if (lr->lr_common.lrc_txtype & TX_CI)
@ -577,7 +578,7 @@ zfs_replay_remove(zfs_sb_t *zsb, lr_remove_t *lr, boolean_t byteswap)
} }
static int static int
zfs_replay_link(zfs_sb_t *zsb, lr_link_t *lr, boolean_t byteswap) zfs_replay_link(zfsvfs_t *zfsvfs, lr_link_t *lr, boolean_t byteswap)
{ {
char *name = (char *)(lr + 1); /* name follows lr_link_t */ char *name = (char *)(lr + 1); /* name follows lr_link_t */
znode_t *dzp, *zp; znode_t *dzp, *zp;
@ -587,10 +588,10 @@ zfs_replay_link(zfs_sb_t *zsb, lr_link_t *lr, boolean_t byteswap)
if (byteswap) if (byteswap)
byteswap_uint64_array(lr, sizeof (*lr)); byteswap_uint64_array(lr, sizeof (*lr));
if ((error = zfs_zget(zsb, lr->lr_doid, &dzp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0)
return (error); return (error);
if ((error = zfs_zget(zsb, lr->lr_link_obj, &zp)) != 0) { if ((error = zfs_zget(zfsvfs, lr->lr_link_obj, &zp)) != 0) {
iput(ZTOI(dzp)); iput(ZTOI(dzp));
return (error); return (error);
} }
@ -607,7 +608,7 @@ zfs_replay_link(zfs_sb_t *zsb, lr_link_t *lr, boolean_t byteswap)
} }
static int static int
zfs_replay_rename(zfs_sb_t *zsb, lr_rename_t *lr, boolean_t byteswap) zfs_replay_rename(zfsvfs_t *zfsvfs, lr_rename_t *lr, boolean_t byteswap)
{ {
char *sname = (char *)(lr + 1); /* sname and tname follow lr_rename_t */ char *sname = (char *)(lr + 1); /* sname and tname follow lr_rename_t */
char *tname = sname + strlen(sname) + 1; char *tname = sname + strlen(sname) + 1;
@ -618,10 +619,10 @@ zfs_replay_rename(zfs_sb_t *zsb, lr_rename_t *lr, boolean_t byteswap)
if (byteswap) if (byteswap)
byteswap_uint64_array(lr, sizeof (*lr)); byteswap_uint64_array(lr, sizeof (*lr));
if ((error = zfs_zget(zsb, lr->lr_sdoid, &sdzp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_sdoid, &sdzp)) != 0)
return (error); return (error);
if ((error = zfs_zget(zsb, lr->lr_tdoid, &tdzp)) != 0) { if ((error = zfs_zget(zfsvfs, lr->lr_tdoid, &tdzp)) != 0) {
iput(ZTOI(sdzp)); iput(ZTOI(sdzp));
return (error); return (error);
} }
@ -638,7 +639,7 @@ zfs_replay_rename(zfs_sb_t *zsb, lr_rename_t *lr, boolean_t byteswap)
} }
static int static int
zfs_replay_write(zfs_sb_t *zsb, lr_write_t *lr, boolean_t byteswap) zfs_replay_write(zfsvfs_t *zfsvfs, lr_write_t *lr, boolean_t byteswap)
{ {
char *data = (char *)(lr + 1); /* data follows lr_write_t */ char *data = (char *)(lr + 1); /* data follows lr_write_t */
znode_t *zp; znode_t *zp;
@ -648,7 +649,7 @@ zfs_replay_write(zfs_sb_t *zsb, lr_write_t *lr, boolean_t byteswap)
if (byteswap) if (byteswap)
byteswap_uint64_array(lr, sizeof (*lr)); byteswap_uint64_array(lr, sizeof (*lr));
if ((error = zfs_zget(zsb, lr->lr_foid, &zp)) != 0) { if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) {
/* /*
* As we can log writes out of order, it's possible the * As we can log writes out of order, it's possible the
* file has been removed. In this case just drop the write * file has been removed. In this case just drop the write
@ -671,10 +672,10 @@ zfs_replay_write(zfs_sb_t *zsb, lr_write_t *lr, boolean_t byteswap)
* write needs to be there. So we write the whole block and * write needs to be there. So we write the whole block and
* reduce the eof. This needs to be done within the single dmu * reduce the eof. This needs to be done within the single dmu
* transaction created within vn_rdwr -> zfs_write. So a possible * transaction created within vn_rdwr -> zfs_write. So a possible
* new end of file is passed through in zsb->z_replay_eof * new end of file is passed through in zfsvfs->z_replay_eof
*/ */
zsb->z_replay_eof = 0; /* 0 means don't change end of file */ zfsvfs->z_replay_eof = 0; /* 0 means don't change end of file */
/* If it's a dmu_sync() block, write the whole block */ /* If it's a dmu_sync() block, write the whole block */
if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) { if (lr->lr_common.lrc_reclen == sizeof (lr_write_t)) {
@ -684,7 +685,7 @@ zfs_replay_write(zfs_sb_t *zsb, lr_write_t *lr, boolean_t byteswap)
length = blocksize; length = blocksize;
} }
if (zp->z_size < eod) if (zp->z_size < eod)
zsb->z_replay_eof = eod; zfsvfs->z_replay_eof = eod;
} }
written = zpl_write_common(ZTOI(zp), data, length, &offset, written = zpl_write_common(ZTOI(zp), data, length, &offset,
@ -695,7 +696,7 @@ zfs_replay_write(zfs_sb_t *zsb, lr_write_t *lr, boolean_t byteswap)
error = SET_ERROR(EIO); /* short write */ error = SET_ERROR(EIO); /* short write */
iput(ZTOI(zp)); iput(ZTOI(zp));
zsb->z_replay_eof = 0; /* safety */ zfsvfs->z_replay_eof = 0; /* safety */
return (error); return (error);
} }
@ -707,7 +708,7 @@ zfs_replay_write(zfs_sb_t *zsb, lr_write_t *lr, boolean_t byteswap)
* the file is grown. * the file is grown.
*/ */
static int static int
zfs_replay_write2(zfs_sb_t *zsb, lr_write_t *lr, boolean_t byteswap) zfs_replay_write2(zfsvfs_t *zfsvfs, lr_write_t *lr, boolean_t byteswap)
{ {
znode_t *zp; znode_t *zp;
int error; int error;
@ -716,13 +717,13 @@ zfs_replay_write2(zfs_sb_t *zsb, lr_write_t *lr, boolean_t byteswap)
if (byteswap) if (byteswap)
byteswap_uint64_array(lr, sizeof (*lr)); byteswap_uint64_array(lr, sizeof (*lr));
if ((error = zfs_zget(zsb, lr->lr_foid, &zp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0)
return (error); return (error);
top: top:
end = lr->lr_offset + lr->lr_length; end = lr->lr_offset + lr->lr_length;
if (end > zp->z_size) { if (end > zp->z_size) {
dmu_tx_t *tx = dmu_tx_create(zsb->z_os); dmu_tx_t *tx = dmu_tx_create(zfsvfs->z_os);
zp->z_size = end; zp->z_size = end;
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE); dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
@ -737,11 +738,11 @@ top:
dmu_tx_abort(tx); dmu_tx_abort(tx);
return (error); return (error);
} }
(void) sa_update(zp->z_sa_hdl, SA_ZPL_SIZE(zsb), (void) sa_update(zp->z_sa_hdl, SA_ZPL_SIZE(zfsvfs),
(void *)&zp->z_size, sizeof (uint64_t), tx); (void *)&zp->z_size, sizeof (uint64_t), tx);
/* Ensure the replayed seq is updated */ /* Ensure the replayed seq is updated */
(void) zil_replaying(zsb->z_log, tx); (void) zil_replaying(zfsvfs->z_log, tx);
dmu_tx_commit(tx); dmu_tx_commit(tx);
} }
@ -752,7 +753,7 @@ top:
} }
static int static int
zfs_replay_truncate(zfs_sb_t *zsb, lr_truncate_t *lr, boolean_t byteswap) zfs_replay_truncate(zfsvfs_t *zfsvfs, lr_truncate_t *lr, boolean_t byteswap)
{ {
znode_t *zp; znode_t *zp;
flock64_t fl; flock64_t fl;
@ -761,7 +762,7 @@ zfs_replay_truncate(zfs_sb_t *zsb, lr_truncate_t *lr, boolean_t byteswap)
if (byteswap) if (byteswap)
byteswap_uint64_array(lr, sizeof (*lr)); byteswap_uint64_array(lr, sizeof (*lr));
if ((error = zfs_zget(zsb, lr->lr_foid, &zp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0)
return (error); return (error);
bzero(&fl, sizeof (fl)); bzero(&fl, sizeof (fl));
@ -779,7 +780,7 @@ zfs_replay_truncate(zfs_sb_t *zsb, lr_truncate_t *lr, boolean_t byteswap)
} }
static int static int
zfs_replay_setattr(zfs_sb_t *zsb, lr_setattr_t *lr, boolean_t byteswap) zfs_replay_setattr(zfsvfs_t *zfsvfs, lr_setattr_t *lr, boolean_t byteswap)
{ {
znode_t *zp; znode_t *zp;
xvattr_t xva; xvattr_t xva;
@ -792,11 +793,11 @@ zfs_replay_setattr(zfs_sb_t *zsb, lr_setattr_t *lr, boolean_t byteswap)
byteswap_uint64_array(lr, sizeof (*lr)); byteswap_uint64_array(lr, sizeof (*lr));
if ((lr->lr_mask & ATTR_XVATTR) && if ((lr->lr_mask & ATTR_XVATTR) &&
zsb->z_version >= ZPL_VERSION_INITIAL) zfsvfs->z_version >= ZPL_VERSION_INITIAL)
zfs_replay_swap_attrs((lr_attr_t *)(lr + 1)); zfs_replay_swap_attrs((lr_attr_t *)(lr + 1));
} }
if ((error = zfs_zget(zsb, lr->lr_foid, &zp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0)
return (error); return (error);
zfs_init_vattr(vap, lr->lr_mask, lr->lr_mode, zfs_init_vattr(vap, lr->lr_mask, lr->lr_mode,
@ -820,20 +821,20 @@ zfs_replay_setattr(zfs_sb_t *zsb, lr_setattr_t *lr, boolean_t byteswap)
} else } else
xva.xva_vattr.va_mask &= ~ATTR_XVATTR; xva.xva_vattr.va_mask &= ~ATTR_XVATTR;
zsb->z_fuid_replay = zfs_replay_fuid_domain(start, &start, zfsvfs->z_fuid_replay = zfs_replay_fuid_domain(start, &start,
lr->lr_uid, lr->lr_gid); lr->lr_uid, lr->lr_gid);
error = zfs_setattr(ZTOI(zp), vap, 0, kcred); error = zfs_setattr(ZTOI(zp), vap, 0, kcred);
zfs_fuid_info_free(zsb->z_fuid_replay); zfs_fuid_info_free(zfsvfs->z_fuid_replay);
zsb->z_fuid_replay = NULL; zfsvfs->z_fuid_replay = NULL;
iput(ZTOI(zp)); iput(ZTOI(zp));
return (error); return (error);
} }
static int static int
zfs_replay_acl_v0(zfs_sb_t *zsb, lr_acl_v0_t *lr, boolean_t byteswap) zfs_replay_acl_v0(zfsvfs_t *zfsvfs, lr_acl_v0_t *lr, boolean_t byteswap)
{ {
ace_t *ace = (ace_t *)(lr + 1); /* ace array follows lr_acl_t */ ace_t *ace = (ace_t *)(lr + 1); /* ace array follows lr_acl_t */
vsecattr_t vsa; vsecattr_t vsa;
@ -845,7 +846,7 @@ zfs_replay_acl_v0(zfs_sb_t *zsb, lr_acl_v0_t *lr, boolean_t byteswap)
zfs_oldace_byteswap(ace, lr->lr_aclcnt); zfs_oldace_byteswap(ace, lr->lr_aclcnt);
} }
if ((error = zfs_zget(zsb, lr->lr_foid, &zp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0)
return (error); return (error);
bzero(&vsa, sizeof (vsa)); bzero(&vsa, sizeof (vsa));
@ -877,7 +878,7 @@ zfs_replay_acl_v0(zfs_sb_t *zsb, lr_acl_v0_t *lr, boolean_t byteswap)
* *
*/ */
static int static int
zfs_replay_acl(zfs_sb_t *zsb, lr_acl_t *lr, boolean_t byteswap) zfs_replay_acl(zfsvfs_t *zfsvfs, lr_acl_t *lr, boolean_t byteswap)
{ {
ace_t *ace = (ace_t *)(lr + 1); ace_t *ace = (ace_t *)(lr + 1);
vsecattr_t vsa; vsecattr_t vsa;
@ -894,7 +895,7 @@ zfs_replay_acl(zfs_sb_t *zsb, lr_acl_t *lr, boolean_t byteswap)
} }
} }
if ((error = zfs_zget(zsb, lr->lr_foid, &zp)) != 0) if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0)
return (error); return (error);
bzero(&vsa, sizeof (vsa)); bzero(&vsa, sizeof (vsa));
@ -908,17 +909,17 @@ zfs_replay_acl(zfs_sb_t *zsb, lr_acl_t *lr, boolean_t byteswap)
void *fuidstart = (caddr_t)ace + void *fuidstart = (caddr_t)ace +
ZIL_ACE_LENGTH(lr->lr_acl_bytes); ZIL_ACE_LENGTH(lr->lr_acl_bytes);
zsb->z_fuid_replay = zfsvfs->z_fuid_replay =
zfs_replay_fuids(fuidstart, &fuidstart, zfs_replay_fuids(fuidstart, &fuidstart,
lr->lr_fuidcnt, lr->lr_domcnt, 0, 0); lr->lr_fuidcnt, lr->lr_domcnt, 0, 0);
} }
error = zfs_setsecattr(ZTOI(zp), &vsa, 0, kcred); error = zfs_setsecattr(ZTOI(zp), &vsa, 0, kcred);
if (zsb->z_fuid_replay) if (zfsvfs->z_fuid_replay)
zfs_fuid_info_free(zsb->z_fuid_replay); zfs_fuid_info_free(zfsvfs->z_fuid_replay);
zsb->z_fuid_replay = NULL; zfsvfs->z_fuid_replay = NULL;
iput(ZTOI(zp)); iput(ZTOI(zp));
return (error); return (error);

View File

@ -120,13 +120,13 @@ zfs_sa_symlink(znode_t *zp, char *link, int len, dmu_tx_t *tx)
void void
zfs_sa_get_scanstamp(znode_t *zp, xvattr_t *xvap) zfs_sa_get_scanstamp(znode_t *zp, xvattr_t *xvap)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
xoptattr_t *xoap; xoptattr_t *xoap;
ASSERT(MUTEX_HELD(&zp->z_lock)); ASSERT(MUTEX_HELD(&zp->z_lock));
VERIFY((xoap = xva_getxoptattr(xvap)) != NULL); VERIFY((xoap = xva_getxoptattr(xvap)) != NULL);
if (zp->z_is_sa) { if (zp->z_is_sa) {
if (sa_lookup(zp->z_sa_hdl, SA_ZPL_SCANSTAMP(zsb), if (sa_lookup(zp->z_sa_hdl, SA_ZPL_SCANSTAMP(zfsvfs),
&xoap->xoa_av_scanstamp, &xoap->xoa_av_scanstamp,
sizeof (xoap->xoa_av_scanstamp)) != 0) sizeof (xoap->xoa_av_scanstamp)) != 0)
return; return;
@ -154,13 +154,13 @@ zfs_sa_get_scanstamp(znode_t *zp, xvattr_t *xvap)
void void
zfs_sa_set_scanstamp(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx) zfs_sa_set_scanstamp(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
xoptattr_t *xoap; xoptattr_t *xoap;
ASSERT(MUTEX_HELD(&zp->z_lock)); ASSERT(MUTEX_HELD(&zp->z_lock));
VERIFY((xoap = xva_getxoptattr(xvap)) != NULL); VERIFY((xoap = xva_getxoptattr(xvap)) != NULL);
if (zp->z_is_sa) if (zp->z_is_sa)
VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_SCANSTAMP(zsb), VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_SCANSTAMP(zfsvfs),
&xoap->xoa_av_scanstamp, &xoap->xoa_av_scanstamp,
sizeof (xoap->xoa_av_scanstamp), tx)); sizeof (xoap->xoa_av_scanstamp), tx));
else { else {
@ -177,7 +177,7 @@ zfs_sa_set_scanstamp(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx)
xoap->xoa_av_scanstamp, sizeof (xoap->xoa_av_scanstamp)); xoap->xoa_av_scanstamp, sizeof (xoap->xoa_av_scanstamp));
zp->z_pflags |= ZFS_BONUS_SCANSTAMP; zp->z_pflags |= ZFS_BONUS_SCANSTAMP;
VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_FLAGS(zsb), VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_FLAGS(zfsvfs),
&zp->z_pflags, sizeof (uint64_t), tx)); &zp->z_pflags, sizeof (uint64_t), tx));
} }
} }
@ -185,7 +185,7 @@ zfs_sa_set_scanstamp(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx)
int int
zfs_sa_get_xattr(znode_t *zp) zfs_sa_get_xattr(znode_t *zp)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
char *obj; char *obj;
int size; int size;
int error; int error;
@ -194,7 +194,7 @@ zfs_sa_get_xattr(znode_t *zp)
ASSERT(!zp->z_xattr_cached); ASSERT(!zp->z_xattr_cached);
ASSERT(zp->z_is_sa); ASSERT(zp->z_is_sa);
error = sa_size(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb), &size); error = sa_size(zp->z_sa_hdl, SA_ZPL_DXATTR(zfsvfs), &size);
if (error) { if (error) {
if (error == ENOENT) if (error == ENOENT)
return nvlist_alloc(&zp->z_xattr_cached, return nvlist_alloc(&zp->z_xattr_cached,
@ -205,7 +205,7 @@ zfs_sa_get_xattr(znode_t *zp)
obj = vmem_alloc(size, KM_SLEEP); obj = vmem_alloc(size, KM_SLEEP);
error = sa_lookup(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb), obj, size); error = sa_lookup(zp->z_sa_hdl, SA_ZPL_DXATTR(zfsvfs), obj, size);
if (error == 0) if (error == 0)
error = nvlist_unpack(obj, size, &zp->z_xattr_cached, KM_SLEEP); error = nvlist_unpack(obj, size, &zp->z_xattr_cached, KM_SLEEP);
@ -217,7 +217,7 @@ zfs_sa_get_xattr(znode_t *zp)
int int
zfs_sa_set_xattr(znode_t *zp) zfs_sa_set_xattr(znode_t *zp)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
dmu_tx_t *tx; dmu_tx_t *tx;
char *obj; char *obj;
size_t size; size_t size;
@ -240,7 +240,7 @@ zfs_sa_set_xattr(znode_t *zp)
if (error) if (error)
goto out_free; goto out_free;
tx = dmu_tx_create(zsb->z_os); tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa_create(tx, size); dmu_tx_hold_sa_create(tx, size);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE); dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE);
@ -248,7 +248,7 @@ zfs_sa_set_xattr(znode_t *zp)
if (error) { if (error) {
dmu_tx_abort(tx); dmu_tx_abort(tx);
} else { } else {
VERIFY0(sa_update(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb), VERIFY0(sa_update(zp->z_sa_hdl, SA_ZPL_DXATTR(zfsvfs),
obj, size, tx)); obj, size, tx));
dmu_tx_commit(tx); dmu_tx_commit(tx);
} }
@ -271,7 +271,7 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
{ {
dmu_buf_t *db = sa_get_db(hdl); dmu_buf_t *db = sa_get_db(hdl);
znode_t *zp = sa_get_userdata(hdl); znode_t *zp = sa_get_userdata(hdl);
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
int count = 0; int count = 0;
sa_bulk_attr_t *bulk, *sa_attrs; sa_bulk_attr_t *bulk, *sa_attrs;
zfs_acl_locator_cb_t locate = { 0 }; zfs_acl_locator_cb_t locate = { 0 };
@ -309,18 +309,18 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
/* First do a bulk query of the attributes that aren't cached */ /* First do a bulk query of the attributes that aren't cached */
bulk = kmem_alloc(sizeof (sa_bulk_attr_t) * 20, KM_SLEEP); bulk = kmem_alloc(sizeof (sa_bulk_attr_t) * 20, KM_SLEEP);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ATIME(zsb), NULL, &atime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ATIME(zfsvfs), NULL, &atime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zsb), NULL, &mtime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, &mtime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL, &ctime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &ctime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CRTIME(zsb), NULL, &crtime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CRTIME(zfsvfs), NULL, &crtime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zsb), NULL, &mode, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zfsvfs), NULL, &mode, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zsb), NULL, &parent, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zfsvfs), NULL, &parent, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_XATTR(zsb), NULL, &xattr, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_XATTR(zfsvfs), NULL, &xattr, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_RDEV(zsb), NULL, &rdev, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_RDEV(zfsvfs), NULL, &rdev, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_UID(zsb), NULL, &uid, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_UID(zfsvfs), NULL, &uid, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GID(zsb), NULL, &gid, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GID(zfsvfs), NULL, &gid, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GEN(zsb), NULL, &tmp_gen, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GEN(zfsvfs), NULL, &tmp_gen, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ZNODE_ACL(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ZNODE_ACL(zfsvfs), NULL,
&znode_acl, 88); &znode_acl, 88);
if (sa_bulk_lookup_locked(hdl, bulk, count) != 0) { if (sa_bulk_lookup_locked(hdl, bulk, count) != 0) {
@ -334,42 +334,43 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
*/ */
count = 0; count = 0;
sa_attrs = kmem_zalloc(sizeof (sa_bulk_attr_t) * 20, KM_SLEEP); sa_attrs = kmem_zalloc(sizeof (sa_bulk_attr_t) * 20, KM_SLEEP);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_MODE(zsb), NULL, &mode, 8); SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_MODE(zfsvfs), NULL, &mode, 8);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_SIZE(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_SIZE(zfsvfs), NULL,
&zp->z_size, 8); &zp->z_size, 8);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_GEN(zsb), NULL, &tmp_gen, 8); SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_GEN(zfsvfs),
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_UID(zsb), NULL, &uid, 8); NULL, &tmp_gen, 8);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_GID(zsb), NULL, &gid, 8); SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_UID(zfsvfs), NULL, &uid, 8);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_PARENT(zsb), SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_GID(zfsvfs), NULL, &gid, 8);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_PARENT(zfsvfs),
NULL, &parent, 8); NULL, &parent, 8);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_FLAGS(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_FLAGS(zfsvfs), NULL,
&zp->z_pflags, 8); &zp->z_pflags, 8);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_ATIME(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_ATIME(zfsvfs), NULL,
&atime, 16); &atime, 16);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_MTIME(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_MTIME(zfsvfs), NULL,
&mtime, 16); &mtime, 16);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_CTIME(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_CTIME(zfsvfs), NULL,
&ctime, 16); &ctime, 16);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_CRTIME(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_CRTIME(zfsvfs), NULL,
&crtime, 16); &crtime, 16);
links = ZTOI(zp)->i_nlink; links = ZTOI(zp)->i_nlink;
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_LINKS(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_LINKS(zfsvfs), NULL,
&links, 8); &links, 8);
if (S_ISBLK(ZTOI(zp)->i_mode) || S_ISCHR(ZTOI(zp)->i_mode)) if (S_ISBLK(ZTOI(zp)->i_mode) || S_ISCHR(ZTOI(zp)->i_mode))
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_RDEV(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_RDEV(zfsvfs), NULL,
&rdev, 8); &rdev, 8);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_DACL_COUNT(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_DACL_COUNT(zfsvfs), NULL,
&zp->z_acl_cached->z_acl_count, 8); &zp->z_acl_cached->z_acl_count, 8);
if (zp->z_acl_cached->z_version < ZFS_ACL_VERSION_FUID) if (zp->z_acl_cached->z_version < ZFS_ACL_VERSION_FUID)
zfs_acl_xform(zp, zp->z_acl_cached, CRED()); zfs_acl_xform(zp, zp->z_acl_cached, CRED());
locate.cb_aclp = zp->z_acl_cached; locate.cb_aclp = zp->z_acl_cached;
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_DACL_ACES(zsb), SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_DACL_ACES(zfsvfs),
zfs_acl_data_locator, &locate, zp->z_acl_cached->z_acl_bytes); zfs_acl_data_locator, &locate, zp->z_acl_cached->z_acl_bytes);
if (xattr) if (xattr)
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_XATTR(zsb), SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_XATTR(zfsvfs),
NULL, &xattr, 8); NULL, &xattr, 8);
/* if scanstamp then add scanstamp */ /* if scanstamp then add scanstamp */
@ -377,7 +378,7 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
if (zp->z_pflags & ZFS_BONUS_SCANSTAMP) { if (zp->z_pflags & ZFS_BONUS_SCANSTAMP) {
bcopy((caddr_t)db->db_data + ZFS_OLD_ZNODE_PHYS_SIZE, bcopy((caddr_t)db->db_data + ZFS_OLD_ZNODE_PHYS_SIZE,
scanstamp, AV_SCANSTAMP_SZ); scanstamp, AV_SCANSTAMP_SZ);
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_SCANSTAMP(zsb), SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_SCANSTAMP(zfsvfs),
NULL, scanstamp, AV_SCANSTAMP_SZ); NULL, scanstamp, AV_SCANSTAMP_SZ);
zp->z_pflags &= ~ZFS_BONUS_SCANSTAMP; zp->z_pflags &= ~ZFS_BONUS_SCANSTAMP;
} }
@ -386,7 +387,7 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
VERIFY(sa_replace_all_by_template_locked(hdl, sa_attrs, VERIFY(sa_replace_all_by_template_locked(hdl, sa_attrs,
count, tx) == 0); count, tx) == 0);
if (znode_acl.z_acl_extern_obj) if (znode_acl.z_acl_extern_obj)
VERIFY(0 == dmu_object_free(zsb->z_os, VERIFY(0 == dmu_object_free(zfsvfs->z_os,
znode_acl.z_acl_extern_obj, tx)); znode_acl.z_acl_extern_obj, tx));
zp->z_is_sa = B_TRUE; zp->z_is_sa = B_TRUE;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -236,44 +236,44 @@ zfs_znode_hold_compare(const void *a, const void *b)
} }
boolean_t boolean_t
zfs_znode_held(zfs_sb_t *zsb, uint64_t obj) zfs_znode_held(zfsvfs_t *zfsvfs, uint64_t obj)
{ {
znode_hold_t *zh, search; znode_hold_t *zh, search;
int i = ZFS_OBJ_HASH(zsb, obj); int i = ZFS_OBJ_HASH(zfsvfs, obj);
boolean_t held; boolean_t held;
search.zh_obj = obj; search.zh_obj = obj;
mutex_enter(&zsb->z_hold_locks[i]); mutex_enter(&zfsvfs->z_hold_locks[i]);
zh = avl_find(&zsb->z_hold_trees[i], &search, NULL); zh = avl_find(&zfsvfs->z_hold_trees[i], &search, NULL);
held = (zh && MUTEX_HELD(&zh->zh_lock)) ? B_TRUE : B_FALSE; held = (zh && MUTEX_HELD(&zh->zh_lock)) ? B_TRUE : B_FALSE;
mutex_exit(&zsb->z_hold_locks[i]); mutex_exit(&zfsvfs->z_hold_locks[i]);
return (held); return (held);
} }
static znode_hold_t * static znode_hold_t *
zfs_znode_hold_enter(zfs_sb_t *zsb, uint64_t obj) zfs_znode_hold_enter(zfsvfs_t *zfsvfs, uint64_t obj)
{ {
znode_hold_t *zh, *zh_new, search; znode_hold_t *zh, *zh_new, search;
int i = ZFS_OBJ_HASH(zsb, obj); int i = ZFS_OBJ_HASH(zfsvfs, obj);
boolean_t found = B_FALSE; boolean_t found = B_FALSE;
zh_new = kmem_cache_alloc(znode_hold_cache, KM_SLEEP); zh_new = kmem_cache_alloc(znode_hold_cache, KM_SLEEP);
zh_new->zh_obj = obj; zh_new->zh_obj = obj;
search.zh_obj = obj; search.zh_obj = obj;
mutex_enter(&zsb->z_hold_locks[i]); mutex_enter(&zfsvfs->z_hold_locks[i]);
zh = avl_find(&zsb->z_hold_trees[i], &search, NULL); zh = avl_find(&zfsvfs->z_hold_trees[i], &search, NULL);
if (likely(zh == NULL)) { if (likely(zh == NULL)) {
zh = zh_new; zh = zh_new;
avl_add(&zsb->z_hold_trees[i], zh); avl_add(&zfsvfs->z_hold_trees[i], zh);
} else { } else {
ASSERT3U(zh->zh_obj, ==, obj); ASSERT3U(zh->zh_obj, ==, obj);
found = B_TRUE; found = B_TRUE;
} }
refcount_add(&zh->zh_refcount, NULL); refcount_add(&zh->zh_refcount, NULL);
mutex_exit(&zsb->z_hold_locks[i]); mutex_exit(&zfsvfs->z_hold_locks[i]);
if (found == B_TRUE) if (found == B_TRUE)
kmem_cache_free(znode_hold_cache, zh_new); kmem_cache_free(znode_hold_cache, zh_new);
@ -286,28 +286,28 @@ zfs_znode_hold_enter(zfs_sb_t *zsb, uint64_t obj)
} }
static void static void
zfs_znode_hold_exit(zfs_sb_t *zsb, znode_hold_t *zh) zfs_znode_hold_exit(zfsvfs_t *zfsvfs, znode_hold_t *zh)
{ {
int i = ZFS_OBJ_HASH(zsb, zh->zh_obj); int i = ZFS_OBJ_HASH(zfsvfs, zh->zh_obj);
boolean_t remove = B_FALSE; boolean_t remove = B_FALSE;
ASSERT(zfs_znode_held(zsb, zh->zh_obj)); ASSERT(zfs_znode_held(zfsvfs, zh->zh_obj));
ASSERT3S(refcount_count(&zh->zh_refcount), >, 0); ASSERT3S(refcount_count(&zh->zh_refcount), >, 0);
mutex_exit(&zh->zh_lock); mutex_exit(&zh->zh_lock);
mutex_enter(&zsb->z_hold_locks[i]); mutex_enter(&zfsvfs->z_hold_locks[i]);
if (refcount_remove(&zh->zh_refcount, NULL) == 0) { if (refcount_remove(&zh->zh_refcount, NULL) == 0) {
avl_remove(&zsb->z_hold_trees[i], zh); avl_remove(&zfsvfs->z_hold_trees[i], zh);
remove = B_TRUE; remove = B_TRUE;
} }
mutex_exit(&zsb->z_hold_locks[i]); mutex_exit(&zfsvfs->z_hold_locks[i]);
if (remove == B_TRUE) if (remove == B_TRUE)
kmem_cache_free(znode_hold_cache, zh); kmem_cache_free(znode_hold_cache, zh);
} }
int int
zfs_create_share_dir(zfs_sb_t *zsb, dmu_tx_t *tx) zfs_create_share_dir(zfsvfs_t *zfsvfs, dmu_tx_t *tx)
{ {
#ifdef HAVE_SMB_SHARE #ifdef HAVE_SMB_SHARE
zfs_acl_ids_t acl_ids; zfs_acl_ids_t acl_ids;
@ -355,17 +355,17 @@ zfs_create_share_dir(zfs_sb_t *zsb, dmu_tx_t *tx)
} }
static void static void
zfs_znode_sa_init(zfs_sb_t *zsb, znode_t *zp, zfs_znode_sa_init(zfsvfs_t *zfsvfs, znode_t *zp,
dmu_buf_t *db, dmu_object_type_t obj_type, sa_handle_t *sa_hdl) dmu_buf_t *db, dmu_object_type_t obj_type, sa_handle_t *sa_hdl)
{ {
ASSERT(zfs_znode_held(zsb, zp->z_id)); ASSERT(zfs_znode_held(zfsvfs, zp->z_id));
mutex_enter(&zp->z_lock); mutex_enter(&zp->z_lock);
ASSERT(zp->z_sa_hdl == NULL); ASSERT(zp->z_sa_hdl == NULL);
ASSERT(zp->z_acl_cached == NULL); ASSERT(zp->z_acl_cached == NULL);
if (sa_hdl == NULL) { if (sa_hdl == NULL) {
VERIFY(0 == sa_handle_get_from_db(zsb->z_os, db, zp, VERIFY(0 == sa_handle_get_from_db(zfsvfs->z_os, db, zp,
SA_HDL_SHARED, &zp->z_sa_hdl)); SA_HDL_SHARED, &zp->z_sa_hdl));
} else { } else {
zp->z_sa_hdl = sa_hdl; zp->z_sa_hdl = sa_hdl;
@ -408,14 +408,14 @@ void
zfs_inode_destroy(struct inode *ip) zfs_inode_destroy(struct inode *ip)
{ {
znode_t *zp = ITOZ(ip); znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
mutex_enter(&zsb->z_znodes_lock); mutex_enter(&zfsvfs->z_znodes_lock);
if (list_link_active(&zp->z_link_node)) { if (list_link_active(&zp->z_link_node)) {
list_remove(&zsb->z_all_znodes, zp); list_remove(&zfsvfs->z_all_znodes, zp);
zsb->z_nr_znodes--; zfsvfs->z_nr_znodes--;
} }
mutex_exit(&zsb->z_znodes_lock); mutex_exit(&zfsvfs->z_znodes_lock);
if (zp->z_acl_cached) { if (zp->z_acl_cached) {
zfs_acl_free(zp->z_acl_cached); zfs_acl_free(zp->z_acl_cached);
@ -431,7 +431,7 @@ zfs_inode_destroy(struct inode *ip)
} }
static void static void
zfs_inode_set_ops(zfs_sb_t *zsb, struct inode *ip) zfs_inode_set_ops(zfsvfs_t *zfsvfs, struct inode *ip)
{ {
uint64_t rdev = 0; uint64_t rdev = 0;
@ -457,7 +457,7 @@ zfs_inode_set_ops(zfs_sb_t *zsb, struct inode *ip)
*/ */
case S_IFCHR: case S_IFCHR:
case S_IFBLK: case S_IFBLK:
(void) sa_lookup(ITOZ(ip)->z_sa_hdl, SA_ZPL_RDEV(zsb), &rdev, (void) sa_lookup(ITOZ(ip)->z_sa_hdl, SA_ZPL_RDEV(zfsvfs), &rdev,
sizeof (rdev)); sizeof (rdev));
/*FALLTHROUGH*/ /*FALLTHROUGH*/
case S_IFIFO: case S_IFIFO:
@ -517,13 +517,13 @@ zfs_set_inode_flags(znode_t *zp, struct inode *ip)
void void
zfs_inode_update(znode_t *zp) zfs_inode_update(znode_t *zp)
{ {
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
struct inode *ip; struct inode *ip;
uint32_t blksize; uint32_t blksize;
u_longlong_t i_blocks; u_longlong_t i_blocks;
ASSERT(zp != NULL); ASSERT(zp != NULL);
zsb = ZTOZSB(zp); zfsvfs = ZTOZSB(zp);
ip = ZTOI(zp); ip = ZTOI(zp);
/* Skip .zfs control nodes which do not exist on disk. */ /* Skip .zfs control nodes which do not exist on disk. */
@ -547,7 +547,7 @@ zfs_inode_update(znode_t *zp)
* return the znode * return the znode
*/ */
static znode_t * static znode_t *
zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz, zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, int blksz,
dmu_object_type_t obj_type, uint64_t obj, sa_handle_t *hdl) dmu_object_type_t obj_type, uint64_t obj, sa_handle_t *hdl)
{ {
znode_t *zp; znode_t *zp;
@ -561,9 +561,9 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz,
sa_bulk_attr_t bulk[11]; sa_bulk_attr_t bulk[11];
int count = 0; int count = 0;
ASSERT(zsb != NULL); ASSERT(zfsvfs != NULL);
ip = new_inode(zsb->z_sb); ip = new_inode(zfsvfs->z_sb);
if (ip == NULL) if (ip == NULL)
return (NULL); return (NULL);
@ -587,21 +587,22 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz,
zp->z_range_lock.zr_blksz = &zp->z_blksz; zp->z_range_lock.zr_blksz = &zp->z_blksz;
zp->z_range_lock.zr_max_blksz = &ZTOZSB(zp)->z_max_blksz; zp->z_range_lock.zr_max_blksz = &ZTOZSB(zp)->z_max_blksz;
zfs_znode_sa_init(zsb, zp, db, obj_type, hdl); zfs_znode_sa_init(zfsvfs, zp, db, obj_type, hdl);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zsb), NULL, &mode, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zfsvfs), NULL, &mode, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GEN(zsb), NULL, &tmp_gen, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GEN(zfsvfs), NULL, &tmp_gen, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zsb), NULL, &zp->z_size, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zfsvfs), NULL,
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zsb), NULL, &links, 8); &zp->z_size, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zfsvfs), NULL, &links, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
&zp->z_pflags, 8); &zp->z_pflags, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zfsvfs), NULL,
&parent, 8); &parent, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_UID(zsb), NULL, &z_uid, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_UID(zfsvfs), NULL, &z_uid, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GID(zsb), NULL, &z_gid, 8); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GID(zfsvfs), NULL, &z_gid, 8);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ATIME(zsb), NULL, &atime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ATIME(zfsvfs), NULL, &atime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zsb), NULL, &mtime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, &mtime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL, &ctime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &ctime, 16);
if (sa_bulk_lookup(zp->z_sa_hdl, bulk, count) != 0 || tmp_gen == 0) { if (sa_bulk_lookup(zp->z_sa_hdl, bulk, count) != 0 || tmp_gen == 0) {
if (hdl == NULL) if (hdl == NULL)
@ -628,7 +629,7 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz,
ip->i_ino = obj; ip->i_ino = obj;
zfs_inode_update(zp); zfs_inode_update(zp);
zfs_inode_set_ops(zsb, ip); zfs_inode_set_ops(zfsvfs, ip);
/* /*
* The only way insert_inode_locked() can fail is if the ip->i_ino * The only way insert_inode_locked() can fail is if the ip->i_ino
@ -640,11 +641,11 @@ zfs_znode_alloc(zfs_sb_t *zsb, dmu_buf_t *db, int blksz,
*/ */
VERIFY3S(insert_inode_locked(ip), ==, 0); VERIFY3S(insert_inode_locked(ip), ==, 0);
mutex_enter(&zsb->z_znodes_lock); mutex_enter(&zfsvfs->z_znodes_lock);
list_insert_tail(&zsb->z_all_znodes, zp); list_insert_tail(&zfsvfs->z_all_znodes, zp);
zsb->z_nr_znodes++; zfsvfs->z_nr_znodes++;
membar_producer(); membar_producer();
mutex_exit(&zsb->z_znodes_lock); mutex_exit(&zfsvfs->z_znodes_lock);
unlock_new_inode(ip); unlock_new_inode(ip);
return (zp); return (zp);
@ -661,9 +662,9 @@ error:
void void
zfs_mark_inode_dirty(struct inode *ip) zfs_mark_inode_dirty(struct inode *ip)
{ {
zfs_sb_t *zsb = ITOZSB(ip); zfsvfs_t *zfsvfs = ITOZSB(ip);
if (zfs_is_readonly(zsb) || dmu_objset_is_snapshot(zsb->z_os)) if (zfs_is_readonly(zfsvfs) || dmu_objset_is_snapshot(zfsvfs->z_os))
return; return;
mark_inode_dirty(ip); mark_inode_dirty(ip);
@ -697,7 +698,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
uint64_t mode, size, links, parent, pflags; uint64_t mode, size, links, parent, pflags;
uint64_t dzp_pflags = 0; uint64_t dzp_pflags = 0;
uint64_t rdev = 0; uint64_t rdev = 0;
zfs_sb_t *zsb = ZTOZSB(dzp); zfsvfs_t *zfsvfs = ZTOZSB(dzp);
dmu_buf_t *db; dmu_buf_t *db;
timestruc_t now; timestruc_t now;
uint64_t gen, obj; uint64_t gen, obj;
@ -710,7 +711,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
zfs_acl_locator_cb_t locate = { 0 }; zfs_acl_locator_cb_t locate = { 0 };
znode_hold_t *zh; znode_hold_t *zh;
if (zsb->z_replay) { if (zfsvfs->z_replay) {
obj = vap->va_nodeid; obj = vap->va_nodeid;
now = vap->va_ctime; /* see zfs_replay_create() */ now = vap->va_ctime; /* see zfs_replay_create() */
gen = vap->va_nblocks; /* ditto */ gen = vap->va_nblocks; /* ditto */
@ -719,13 +720,13 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
obj = 0; obj = 0;
gethrestime(&now); gethrestime(&now);
gen = dmu_tx_get_txg(tx); gen = dmu_tx_get_txg(tx);
dnodesize = dmu_objset_dnodesize(zsb->z_os); dnodesize = dmu_objset_dnodesize(zfsvfs->z_os);
} }
if (dnodesize == 0) if (dnodesize == 0)
dnodesize = DNODE_MIN_SIZE; dnodesize = DNODE_MIN_SIZE;
obj_type = zsb->z_use_sa ? DMU_OT_SA : DMU_OT_ZNODE; obj_type = zfsvfs->z_use_sa ? DMU_OT_SA : DMU_OT_ZNODE;
bonuslen = (obj_type == DMU_OT_SA) ? bonuslen = (obj_type == DMU_OT_SA) ?
DN_BONUS_SIZE(dnodesize) : ZFS_OLD_ZNODE_PHYS_SIZE; DN_BONUS_SIZE(dnodesize) : ZFS_OLD_ZNODE_PHYS_SIZE;
@ -740,29 +741,29 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
* assertions below. * assertions below.
*/ */
if (S_ISDIR(vap->va_mode)) { if (S_ISDIR(vap->va_mode)) {
if (zsb->z_replay) { if (zfsvfs->z_replay) {
VERIFY0(zap_create_claim_norm_dnsize(zsb->z_os, obj, VERIFY0(zap_create_claim_norm_dnsize(zfsvfs->z_os, obj,
zsb->z_norm, DMU_OT_DIRECTORY_CONTENTS, zfsvfs->z_norm, DMU_OT_DIRECTORY_CONTENTS,
obj_type, bonuslen, dnodesize, tx)); obj_type, bonuslen, dnodesize, tx));
} else { } else {
obj = zap_create_norm_dnsize(zsb->z_os, obj = zap_create_norm_dnsize(zfsvfs->z_os,
zsb->z_norm, DMU_OT_DIRECTORY_CONTENTS, zfsvfs->z_norm, DMU_OT_DIRECTORY_CONTENTS,
obj_type, bonuslen, dnodesize, tx); obj_type, bonuslen, dnodesize, tx);
} }
} else { } else {
if (zsb->z_replay) { if (zfsvfs->z_replay) {
VERIFY0(dmu_object_claim_dnsize(zsb->z_os, obj, VERIFY0(dmu_object_claim_dnsize(zfsvfs->z_os, obj,
DMU_OT_PLAIN_FILE_CONTENTS, 0, DMU_OT_PLAIN_FILE_CONTENTS, 0,
obj_type, bonuslen, dnodesize, tx)); obj_type, bonuslen, dnodesize, tx));
} else { } else {
obj = dmu_object_alloc_dnsize(zsb->z_os, obj = dmu_object_alloc_dnsize(zfsvfs->z_os,
DMU_OT_PLAIN_FILE_CONTENTS, 0, DMU_OT_PLAIN_FILE_CONTENTS, 0,
obj_type, bonuslen, dnodesize, tx); obj_type, bonuslen, dnodesize, tx);
} }
} }
zh = zfs_znode_hold_enter(zsb, obj); zh = zfs_znode_hold_enter(zfsvfs, obj);
VERIFY(0 == sa_buf_hold(zsb->z_os, obj, NULL, &db)); VERIFY(0 == sa_buf_hold(zfsvfs->z_os, obj, NULL, &db));
/* /*
* If this is the root, fix up the half-initialized parent pointer * If this is the root, fix up the half-initialized parent pointer
@ -781,7 +782,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
flag |= IS_XATTR; flag |= IS_XATTR;
} }
if (zsb->z_use_fuids) if (zfsvfs->z_use_fuids)
pflags = ZFS_ARCHIVE | ZFS_AV_MODIFIED; pflags = ZFS_ARCHIVE | ZFS_AV_MODIFIED;
else else
pflags = 0; pflags = 0;
@ -825,7 +826,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
} }
/* Now add in all of the "SA" attributes */ /* Now add in all of the "SA" attributes */
VERIFY(0 == sa_handle_get_from_db(zsb->z_os, db, NULL, SA_HDL_SHARED, VERIFY(0 == sa_handle_get_from_db(zfsvfs->z_os, db, NULL, SA_HDL_SHARED,
&sa_hdl)); &sa_hdl));
/* /*
@ -837,74 +838,74 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
sa_attrs = kmem_alloc(sizeof (sa_bulk_attr_t) * ZPL_END, KM_SLEEP); sa_attrs = kmem_alloc(sizeof (sa_bulk_attr_t) * ZPL_END, KM_SLEEP);
if (obj_type == DMU_OT_ZNODE) { if (obj_type == DMU_OT_ZNODE) {
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_ATIME(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_ATIME(zfsvfs),
NULL, &atime, 16); NULL, &atime, 16);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_MTIME(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_MTIME(zfsvfs),
NULL, &mtime, 16); NULL, &mtime, 16);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_CTIME(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_CTIME(zfsvfs),
NULL, &ctime, 16); NULL, &ctime, 16);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_CRTIME(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_CRTIME(zfsvfs),
NULL, &crtime, 16); NULL, &crtime, 16);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_GEN(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_GEN(zfsvfs),
NULL, &gen, 8); NULL, &gen, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_MODE(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_MODE(zfsvfs),
NULL, &mode, 8); NULL, &mode, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_SIZE(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_SIZE(zfsvfs),
NULL, &size, 8); NULL, &size, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_PARENT(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_PARENT(zfsvfs),
NULL, &parent, 8); NULL, &parent, 8);
} else { } else {
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_MODE(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_MODE(zfsvfs),
NULL, &mode, 8); NULL, &mode, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_SIZE(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_SIZE(zfsvfs),
NULL, &size, 8); NULL, &size, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_GEN(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_GEN(zfsvfs),
NULL, &gen, 8); NULL, &gen, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_UID(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_UID(zfsvfs),
NULL, &acl_ids->z_fuid, 8); NULL, &acl_ids->z_fuid, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_GID(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_GID(zfsvfs),
NULL, &acl_ids->z_fgid, 8); NULL, &acl_ids->z_fgid, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_PARENT(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_PARENT(zfsvfs),
NULL, &parent, 8); NULL, &parent, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_FLAGS(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_FLAGS(zfsvfs),
NULL, &pflags, 8); NULL, &pflags, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_ATIME(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_ATIME(zfsvfs),
NULL, &atime, 16); NULL, &atime, 16);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_MTIME(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_MTIME(zfsvfs),
NULL, &mtime, 16); NULL, &mtime, 16);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_CTIME(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_CTIME(zfsvfs),
NULL, &ctime, 16); NULL, &ctime, 16);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_CRTIME(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_CRTIME(zfsvfs),
NULL, &crtime, 16); NULL, &crtime, 16);
} }
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_LINKS(zsb), NULL, &links, 8); SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_LINKS(zfsvfs), NULL, &links, 8);
if (obj_type == DMU_OT_ZNODE) { if (obj_type == DMU_OT_ZNODE) {
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_XATTR(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_XATTR(zfsvfs), NULL,
&empty_xattr, 8); &empty_xattr, 8);
} }
if (obj_type == DMU_OT_ZNODE || if (obj_type == DMU_OT_ZNODE ||
(S_ISBLK(vap->va_mode) || S_ISCHR(vap->va_mode))) { (S_ISBLK(vap->va_mode) || S_ISCHR(vap->va_mode))) {
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_RDEV(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_RDEV(zfsvfs),
NULL, &rdev, 8); NULL, &rdev, 8);
} }
if (obj_type == DMU_OT_ZNODE) { if (obj_type == DMU_OT_ZNODE) {
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_FLAGS(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_FLAGS(zfsvfs),
NULL, &pflags, 8); NULL, &pflags, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_UID(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_UID(zfsvfs), NULL,
&acl_ids->z_fuid, 8); &acl_ids->z_fuid, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_GID(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_GID(zfsvfs), NULL,
&acl_ids->z_fgid, 8); &acl_ids->z_fgid, 8);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_PAD(zsb), NULL, pad, SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_PAD(zfsvfs), NULL, pad,
sizeof (uint64_t) * 4); sizeof (uint64_t) * 4);
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_ZNODE_ACL(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_ZNODE_ACL(zfsvfs), NULL,
&acl_phys, sizeof (zfs_acl_phys_t)); &acl_phys, sizeof (zfs_acl_phys_t));
} else if (acl_ids->z_aclp->z_version >= ZFS_ACL_VERSION_FUID) { } else if (acl_ids->z_aclp->z_version >= ZFS_ACL_VERSION_FUID) {
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_DACL_COUNT(zsb), NULL, SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_DACL_COUNT(zfsvfs), NULL,
&acl_ids->z_aclp->z_acl_count, 8); &acl_ids->z_aclp->z_acl_count, 8);
locate.cb_aclp = acl_ids->z_aclp; locate.cb_aclp = acl_ids->z_aclp;
SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_DACL_ACES(zsb), SA_ADD_BULK_ATTR(sa_attrs, cnt, SA_ZPL_DACL_ACES(zfsvfs),
zfs_acl_data_locator, &locate, zfs_acl_data_locator, &locate,
acl_ids->z_aclp->z_acl_bytes); acl_ids->z_aclp->z_acl_bytes);
mode = zfs_mode_compute(mode, acl_ids->z_aclp, &pflags, mode = zfs_mode_compute(mode, acl_ids->z_aclp, &pflags,
@ -914,7 +915,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
VERIFY(sa_replace_all_by_template(sa_hdl, sa_attrs, cnt, tx) == 0); VERIFY(sa_replace_all_by_template(sa_hdl, sa_attrs, cnt, tx) == 0);
if (!(flag & IS_ROOT_NODE)) { if (!(flag & IS_ROOT_NODE)) {
*zpp = zfs_znode_alloc(zsb, db, 0, obj_type, obj, sa_hdl); *zpp = zfs_znode_alloc(zfsvfs, db, 0, obj_type, obj, sa_hdl);
VERIFY(*zpp != NULL); VERIFY(*zpp != NULL);
VERIFY(dzp != NULL); VERIFY(dzp != NULL);
} else { } else {
@ -936,7 +937,7 @@ zfs_mknode(znode_t *dzp, vattr_t *vap, dmu_tx_t *tx, cred_t *cr,
VERIFY0(zfs_aclset_common(*zpp, acl_ids->z_aclp, cr, tx)); VERIFY0(zfs_aclset_common(*zpp, acl_ids->z_aclp, cr, tx));
} }
kmem_free(sa_attrs, sizeof (sa_bulk_attr_t) * ZPL_END); kmem_free(sa_attrs, sizeof (sa_bulk_attr_t) * ZPL_END);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
} }
/* /*
@ -1043,7 +1044,7 @@ zfs_xvattr_set(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx)
} }
int int
zfs_zget(zfs_sb_t *zsb, uint64_t obj_num, znode_t **zpp) zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp)
{ {
dmu_object_info_t doi; dmu_object_info_t doi;
dmu_buf_t *db; dmu_buf_t *db;
@ -1055,11 +1056,11 @@ zfs_zget(zfs_sb_t *zsb, uint64_t obj_num, znode_t **zpp)
*zpp = NULL; *zpp = NULL;
again: again:
zh = zfs_znode_hold_enter(zsb, obj_num); zh = zfs_znode_hold_enter(zfsvfs, obj_num);
err = sa_buf_hold(zsb->z_os, obj_num, NULL, &db); err = sa_buf_hold(zfsvfs->z_os, obj_num, NULL, &db);
if (err) { if (err) {
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (err); return (err);
} }
@ -1069,7 +1070,7 @@ again:
(doi.doi_bonus_type == DMU_OT_ZNODE && (doi.doi_bonus_type == DMU_OT_ZNODE &&
doi.doi_bonus_size < sizeof (znode_phys_t)))) { doi.doi_bonus_size < sizeof (znode_phys_t)))) {
sa_buf_rele(db, NULL); sa_buf_rele(db, NULL);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (SET_ERROR(EINVAL)); return (SET_ERROR(EINVAL));
} }
@ -1105,7 +1106,7 @@ again:
if (igrab(ZTOI(zp)) == NULL) { if (igrab(ZTOI(zp)) == NULL) {
mutex_exit(&zp->z_lock); mutex_exit(&zp->z_lock);
sa_buf_rele(db, NULL); sa_buf_rele(db, NULL);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
/* inode might need this to finish evict */ /* inode might need this to finish evict */
cond_resched(); cond_resched();
goto again; goto again;
@ -1114,7 +1115,7 @@ again:
err = 0; err = 0;
mutex_exit(&zp->z_lock); mutex_exit(&zp->z_lock);
sa_buf_rele(db, NULL); sa_buf_rele(db, NULL);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (err); return (err);
} }
@ -1128,21 +1129,21 @@ again:
* if zfs_znode_alloc() fails it will drop the hold on the * if zfs_znode_alloc() fails it will drop the hold on the
* bonus buffer. * bonus buffer.
*/ */
zp = zfs_znode_alloc(zsb, db, doi.doi_data_block_size, zp = zfs_znode_alloc(zfsvfs, db, doi.doi_data_block_size,
doi.doi_bonus_type, obj_num, NULL); doi.doi_bonus_type, obj_num, NULL);
if (zp == NULL) { if (zp == NULL) {
err = SET_ERROR(ENOENT); err = SET_ERROR(ENOENT);
} else { } else {
*zpp = zp; *zpp = zp;
} }
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (err); return (err);
} }
int int
zfs_rezget(znode_t *zp) zfs_rezget(znode_t *zp)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
dmu_object_info_t doi; dmu_object_info_t doi;
dmu_buf_t *db; dmu_buf_t *db;
uint64_t obj_num = zp->z_id; uint64_t obj_num = zp->z_id;
@ -1166,7 +1167,7 @@ zfs_rezget(znode_t *zp)
if (zp->z_is_ctldir) if (zp->z_is_ctldir)
return (0); return (0);
zh = zfs_znode_hold_enter(zsb, obj_num); zh = zfs_znode_hold_enter(zfsvfs, obj_num);
mutex_enter(&zp->z_acl_lock); mutex_enter(&zp->z_acl_lock);
if (zp->z_acl_cached) { if (zp->z_acl_cached) {
@ -1183,9 +1184,9 @@ zfs_rezget(znode_t *zp)
rw_exit(&zp->z_xattr_lock); rw_exit(&zp->z_xattr_lock);
ASSERT(zp->z_sa_hdl == NULL); ASSERT(zp->z_sa_hdl == NULL);
err = sa_buf_hold(zsb->z_os, obj_num, NULL, &db); err = sa_buf_hold(zfsvfs->z_os, obj_num, NULL, &db);
if (err) { if (err) {
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (err); return (err);
} }
@ -1195,37 +1196,37 @@ zfs_rezget(znode_t *zp)
(doi.doi_bonus_type == DMU_OT_ZNODE && (doi.doi_bonus_type == DMU_OT_ZNODE &&
doi.doi_bonus_size < sizeof (znode_phys_t)))) { doi.doi_bonus_size < sizeof (znode_phys_t)))) {
sa_buf_rele(db, NULL); sa_buf_rele(db, NULL);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (SET_ERROR(EINVAL)); return (SET_ERROR(EINVAL));
} }
zfs_znode_sa_init(zsb, zp, db, doi.doi_bonus_type, NULL); zfs_znode_sa_init(zfsvfs, zp, db, doi.doi_bonus_type, NULL);
/* reload cached values */ /* reload cached values */
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GEN(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GEN(zfsvfs), NULL,
&gen, sizeof (gen)); &gen, sizeof (gen));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zfsvfs), NULL,
&zp->z_size, sizeof (zp->z_size)); &zp->z_size, sizeof (zp->z_size));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_LINKS(zfsvfs), NULL,
&links, sizeof (links)); &links, sizeof (links));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs), NULL,
&zp->z_pflags, sizeof (zp->z_pflags)); &zp->z_pflags, sizeof (zp->z_pflags));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_UID(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_UID(zfsvfs), NULL,
&z_uid, sizeof (z_uid)); &z_uid, sizeof (z_uid));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GID(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GID(zfsvfs), NULL,
&z_gid, sizeof (z_gid)); &z_gid, sizeof (z_gid));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zfsvfs), NULL,
&mode, sizeof (mode)); &mode, sizeof (mode));
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ATIME(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ATIME(zfsvfs), NULL,
&atime, 16); &atime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL,
&mtime, 16); &mtime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL, SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL,
&ctime, 16); &ctime, 16);
if (sa_bulk_lookup(zp->z_sa_hdl, bulk, count)) { if (sa_bulk_lookup(zp->z_sa_hdl, bulk, count)) {
zfs_znode_dmu_fini(zp); zfs_znode_dmu_fini(zp);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (SET_ERROR(EIO)); return (SET_ERROR(EIO));
} }
@ -1239,7 +1240,7 @@ zfs_rezget(znode_t *zp)
if (gen != ZTOI(zp)->i_generation) { if (gen != ZTOI(zp)->i_generation) {
zfs_znode_dmu_fini(zp); zfs_znode_dmu_fini(zp);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (SET_ERROR(EIO)); return (SET_ERROR(EIO));
} }
@ -1251,7 +1252,7 @@ zfs_rezget(znode_t *zp)
zp->z_atime_dirty = 0; zp->z_atime_dirty = 0;
zfs_inode_update(zp); zfs_inode_update(zp);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
return (0); return (0);
} }
@ -1259,26 +1260,26 @@ zfs_rezget(znode_t *zp)
void void
zfs_znode_delete(znode_t *zp, dmu_tx_t *tx) zfs_znode_delete(znode_t *zp, dmu_tx_t *tx)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
objset_t *os = zsb->z_os; objset_t *os = zfsvfs->z_os;
uint64_t obj = zp->z_id; uint64_t obj = zp->z_id;
uint64_t acl_obj = zfs_external_acl(zp); uint64_t acl_obj = zfs_external_acl(zp);
znode_hold_t *zh; znode_hold_t *zh;
zh = zfs_znode_hold_enter(zsb, obj); zh = zfs_znode_hold_enter(zfsvfs, obj);
if (acl_obj) { if (acl_obj) {
VERIFY(!zp->z_is_sa); VERIFY(!zp->z_is_sa);
VERIFY(0 == dmu_object_free(os, acl_obj, tx)); VERIFY(0 == dmu_object_free(os, acl_obj, tx));
} }
VERIFY(0 == dmu_object_free(os, obj, tx)); VERIFY(0 == dmu_object_free(os, obj, tx));
zfs_znode_dmu_fini(zp); zfs_znode_dmu_fini(zp);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
} }
void void
zfs_zinactive(znode_t *zp) zfs_zinactive(znode_t *zp)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
uint64_t z_id = zp->z_id; uint64_t z_id = zp->z_id;
znode_hold_t *zh; znode_hold_t *zh;
@ -1287,7 +1288,7 @@ zfs_zinactive(znode_t *zp)
/* /*
* Don't allow a zfs_zget() while were trying to release this znode. * Don't allow a zfs_zget() while were trying to release this znode.
*/ */
zh = zfs_znode_hold_enter(zsb, z_id); zh = zfs_znode_hold_enter(zfsvfs, z_id);
mutex_enter(&zp->z_lock); mutex_enter(&zp->z_lock);
@ -1297,7 +1298,7 @@ zfs_zinactive(znode_t *zp)
*/ */
if (zp->z_unlinked) { if (zp->z_unlinked) {
mutex_exit(&zp->z_lock); mutex_exit(&zp->z_lock);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
zfs_rmnode(zp); zfs_rmnode(zp);
return; return;
} }
@ -1305,7 +1306,7 @@ zfs_zinactive(znode_t *zp)
mutex_exit(&zp->z_lock); mutex_exit(&zp->z_lock);
zfs_znode_dmu_fini(zp); zfs_znode_dmu_fini(zp);
zfs_znode_hold_exit(zsb, zh); zfs_znode_hold_exit(zfsvfs, zh);
} }
static inline int static inline int
@ -1407,7 +1408,7 @@ zfs_grow_blocksize(znode_t *zp, uint64_t size, dmu_tx_t *tx)
static int static int
zfs_extend(znode_t *zp, uint64_t end) zfs_extend(znode_t *zp, uint64_t end)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
dmu_tx_t *tx; dmu_tx_t *tx;
rl_t *rl; rl_t *rl;
uint64_t newblksz; uint64_t newblksz;
@ -1425,11 +1426,11 @@ zfs_extend(znode_t *zp, uint64_t end)
zfs_range_unlock(rl); zfs_range_unlock(rl);
return (0); return (0);
} }
tx = dmu_tx_create(zsb->z_os); tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE); dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
zfs_sa_upgrade_txholds(tx, zp); zfs_sa_upgrade_txholds(tx, zp);
if (end > zp->z_blksz && if (end > zp->z_blksz &&
(!ISP2(zp->z_blksz) || zp->z_blksz < zsb->z_max_blksz)) { (!ISP2(zp->z_blksz) || zp->z_blksz < zfsvfs->z_max_blksz)) {
/* /*
* We are growing the file past the current block size. * We are growing the file past the current block size.
*/ */
@ -1526,7 +1527,7 @@ zfs_zero_partial_page(znode_t *zp, uint64_t start, uint64_t len)
static int static int
zfs_free_range(znode_t *zp, uint64_t off, uint64_t len) zfs_free_range(znode_t *zp, uint64_t off, uint64_t len)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
rl_t *rl; rl_t *rl;
int error; int error;
@ -1546,7 +1547,7 @@ zfs_free_range(znode_t *zp, uint64_t off, uint64_t len)
if (off + len > zp->z_size) if (off + len > zp->z_size)
len = zp->z_size - off; len = zp->z_size - off;
error = dmu_free_long_range(zsb->z_os, zp->z_id, off, len); error = dmu_free_long_range(zfsvfs->z_os, zp->z_id, off, len);
/* /*
* Zero partial page cache entries. This must be done under a * Zero partial page cache entries. This must be done under a
@ -1605,7 +1606,7 @@ zfs_free_range(znode_t *zp, uint64_t off, uint64_t len)
static int static int
zfs_trunc(znode_t *zp, uint64_t end) zfs_trunc(znode_t *zp, uint64_t end)
{ {
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
dmu_tx_t *tx; dmu_tx_t *tx;
rl_t *rl; rl_t *rl;
int error; int error;
@ -1625,12 +1626,12 @@ zfs_trunc(znode_t *zp, uint64_t end)
return (0); return (0);
} }
error = dmu_free_long_range(zsb->z_os, zp->z_id, end, -1); error = dmu_free_long_range(zfsvfs->z_os, zp->z_id, end, -1);
if (error) { if (error) {
zfs_range_unlock(rl); zfs_range_unlock(rl);
return (error); return (error);
} }
tx = dmu_tx_create(zsb->z_os); tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE); dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
zfs_sa_upgrade_txholds(tx, zp); zfs_sa_upgrade_txholds(tx, zp);
dmu_tx_mark_netfree(tx); dmu_tx_mark_netfree(tx);
@ -1642,12 +1643,12 @@ zfs_trunc(znode_t *zp, uint64_t end)
} }
zp->z_size = end; zp->z_size = end;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_SIZE(zfsvfs),
NULL, &zp->z_size, sizeof (zp->z_size)); NULL, &zp->z_size, sizeof (zp->z_size));
if (end == 0) { if (end == 0) {
zp->z_pflags &= ~ZFS_SPARSE; zp->z_pflags &= ~ZFS_SPARSE;
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs),
NULL, &zp->z_pflags, 8); NULL, &zp->z_pflags, 8);
} }
VERIFY(sa_bulk_update(zp->z_sa_hdl, bulk, count, tx) == 0); VERIFY(sa_bulk_update(zp->z_sa_hdl, bulk, count, tx) == 0);
@ -1674,15 +1675,15 @@ int
zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log) zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log)
{ {
dmu_tx_t *tx; dmu_tx_t *tx;
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
zilog_t *zilog = zsb->z_log; zilog_t *zilog = zfsvfs->z_log;
uint64_t mode; uint64_t mode;
uint64_t mtime[2], ctime[2]; uint64_t mtime[2], ctime[2];
sa_bulk_attr_t bulk[3]; sa_bulk_attr_t bulk[3];
int count = 0; int count = 0;
int error; int error;
if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_MODE(zsb), &mode, if ((error = sa_lookup(zp->z_sa_hdl, SA_ZPL_MODE(zfsvfs), &mode,
sizeof (mode))) != 0) sizeof (mode))) != 0)
return (error); return (error);
@ -1703,7 +1704,7 @@ zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log)
if (error || !log) if (error || !log)
goto out; goto out;
log: log:
tx = dmu_tx_create(zsb->z_os); tx = dmu_tx_create(zfsvfs->z_os);
dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE); dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
zfs_sa_upgrade_txholds(tx, zp); zfs_sa_upgrade_txholds(tx, zp);
error = dmu_tx_assign(tx, TXG_WAIT); error = dmu_tx_assign(tx, TXG_WAIT);
@ -1712,9 +1713,9 @@ log:
goto out; goto out;
} }
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zsb), NULL, mtime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, mtime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL, ctime, 16); SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, ctime, 16);
SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zsb), SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_FLAGS(zfsvfs),
NULL, &zp->z_pflags, 8); NULL, &zp->z_pflags, 8);
zfs_tstamp_update_setup(zp, CONTENT_MODIFIED, mtime, ctime); zfs_tstamp_update_setup(zp, CONTENT_MODIFIED, mtime, ctime);
error = sa_bulk_update(zp->z_sa_hdl, bulk, count, tx); error = sa_bulk_update(zp->z_sa_hdl, bulk, count, tx);
@ -1742,7 +1743,7 @@ void
zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx) zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
{ {
struct super_block *sb; struct super_block *sb;
zfs_sb_t *zsb; zfsvfs_t *zfsvfs;
uint64_t moid, obj, sa_obj, version; uint64_t moid, obj, sa_obj, version;
uint64_t sense = ZFS_CASE_SENSITIVE; uint64_t sense = ZFS_CASE_SENSITIVE;
uint64_t norm = 0; uint64_t norm = 0;
@ -1824,7 +1825,7 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
ASSERT(error == 0); ASSERT(error == 0);
/* /*
* Create root znode. Create minimal znode/inode/zsb/sb * Create root znode. Create minimal znode/inode/zfsvfs/sb
* to allow zfs_mknode to work. * to allow zfs_mknode to work.
*/ */
vattr.va_mask = ATTR_MODE|ATTR_UID|ATTR_GID; vattr.va_mask = ATTR_MODE|ATTR_UID|ATTR_GID;
@ -1838,21 +1839,21 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
rootzp->z_atime_dirty = 0; rootzp->z_atime_dirty = 0;
rootzp->z_is_sa = USE_SA(version, os); rootzp->z_is_sa = USE_SA(version, os);
zsb = kmem_zalloc(sizeof (zfs_sb_t), KM_SLEEP); zfsvfs = kmem_zalloc(sizeof (zfsvfs_t), KM_SLEEP);
zsb->z_os = os; zfsvfs->z_os = os;
zsb->z_parent = zsb; zfsvfs->z_parent = zfsvfs;
zsb->z_version = version; zfsvfs->z_version = version;
zsb->z_use_fuids = USE_FUIDS(version, os); zfsvfs->z_use_fuids = USE_FUIDS(version, os);
zsb->z_use_sa = USE_SA(version, os); zfsvfs->z_use_sa = USE_SA(version, os);
zsb->z_norm = norm; zfsvfs->z_norm = norm;
sb = kmem_zalloc(sizeof (struct super_block), KM_SLEEP); sb = kmem_zalloc(sizeof (struct super_block), KM_SLEEP);
sb->s_fs_info = zsb; sb->s_fs_info = zfsvfs;
ZTOI(rootzp)->i_sb = sb; ZTOI(rootzp)->i_sb = sb;
error = sa_setup(os, sa_obj, zfs_attr_table, ZPL_END, error = sa_setup(os, sa_obj, zfs_attr_table, ZPL_END,
&zsb->z_attr_table); &zfsvfs->z_attr_table);
ASSERT(error == 0); ASSERT(error == 0);
@ -1861,20 +1862,21 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
* insensitive. * insensitive.
*/ */
if (sense == ZFS_CASE_INSENSITIVE || sense == ZFS_CASE_MIXED) if (sense == ZFS_CASE_INSENSITIVE || sense == ZFS_CASE_MIXED)
zsb->z_norm |= U8_TEXTPREP_TOUPPER; zfsvfs->z_norm |= U8_TEXTPREP_TOUPPER;
mutex_init(&zsb->z_znodes_lock, NULL, MUTEX_DEFAULT, NULL); mutex_init(&zfsvfs->z_znodes_lock, NULL, MUTEX_DEFAULT, NULL);
list_create(&zsb->z_all_znodes, sizeof (znode_t), list_create(&zfsvfs->z_all_znodes, sizeof (znode_t),
offsetof(znode_t, z_link_node)); offsetof(znode_t, z_link_node));
size = MIN(1 << (highbit64(zfs_object_mutex_size)-1), ZFS_OBJ_MTX_MAX); size = MIN(1 << (highbit64(zfs_object_mutex_size)-1), ZFS_OBJ_MTX_MAX);
zsb->z_hold_size = size; zfsvfs->z_hold_size = size;
zsb->z_hold_trees = vmem_zalloc(sizeof (avl_tree_t) * size, KM_SLEEP); zfsvfs->z_hold_trees = vmem_zalloc(sizeof (avl_tree_t) * size,
zsb->z_hold_locks = vmem_zalloc(sizeof (kmutex_t) * size, KM_SLEEP); KM_SLEEP);
zfsvfs->z_hold_locks = vmem_zalloc(sizeof (kmutex_t) * size, KM_SLEEP);
for (i = 0; i != size; i++) { for (i = 0; i != size; i++) {
avl_create(&zsb->z_hold_trees[i], zfs_znode_hold_compare, avl_create(&zfsvfs->z_hold_trees[i], zfs_znode_hold_compare,
sizeof (znode_hold_t), offsetof(znode_hold_t, zh_node)); sizeof (znode_hold_t), offsetof(znode_hold_t, zh_node));
mutex_init(&zsb->z_hold_locks[i], NULL, MUTEX_DEFAULT, NULL); mutex_init(&zfsvfs->z_hold_locks[i], NULL, MUTEX_DEFAULT, NULL);
} }
VERIFY(0 == zfs_acl_ids_create(rootzp, IS_ROOT_NODE, &vattr, VERIFY(0 == zfs_acl_ids_create(rootzp, IS_ROOT_NODE, &vattr,
@ -1892,18 +1894,18 @@ zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *zplprops, dmu_tx_t *tx)
/* /*
* Create shares directory * Create shares directory
*/ */
error = zfs_create_share_dir(zsb, tx); error = zfs_create_share_dir(zfsvfs, tx);
ASSERT(error == 0); ASSERT(error == 0);
for (i = 0; i != size; i++) { for (i = 0; i != size; i++) {
avl_destroy(&zsb->z_hold_trees[i]); avl_destroy(&zfsvfs->z_hold_trees[i]);
mutex_destroy(&zsb->z_hold_locks[i]); mutex_destroy(&zfsvfs->z_hold_locks[i]);
} }
vmem_free(zsb->z_hold_trees, sizeof (avl_tree_t) * size); vmem_free(zfsvfs->z_hold_trees, sizeof (avl_tree_t) * size);
vmem_free(zsb->z_hold_locks, sizeof (kmutex_t) * size); vmem_free(zfsvfs->z_hold_locks, sizeof (kmutex_t) * size);
kmem_free(sb, sizeof (struct super_block)); kmem_free(sb, sizeof (struct super_block));
kmem_free(zsb, sizeof (zfs_sb_t)); kmem_free(zfsvfs, sizeof (zfsvfs_t));
} }
#endif /* _KERNEL */ #endif /* _KERNEL */

View File

@ -52,10 +52,10 @@ zpl_common_open(struct inode *ip, struct file *filp)
static int static int
zpl_root_iterate(struct file *filp, struct dir_context *ctx) zpl_root_iterate(struct file *filp, struct dir_context *ctx)
{ {
zfs_sb_t *zsb = ITOZSB(file_inode(filp)); zfsvfs_t *zfsvfs = ITOZSB(file_inode(filp));
int error = 0; int error = 0;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
if (!dir_emit_dots(filp, ctx)) if (!dir_emit_dots(filp, ctx))
goto out; goto out;
@ -76,7 +76,7 @@ zpl_root_iterate(struct file *filp, struct dir_context *ctx)
ctx->pos++; ctx->pos++;
} }
out: out:
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
@ -249,14 +249,14 @@ zpl_snapdir_lookup(struct inode *dip, struct dentry *dentry,
static int static int
zpl_snapdir_iterate(struct file *filp, struct dir_context *ctx) zpl_snapdir_iterate(struct file *filp, struct dir_context *ctx)
{ {
zfs_sb_t *zsb = ITOZSB(file_inode(filp)); zfsvfs_t *zfsvfs = ITOZSB(file_inode(filp));
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
char snapname[MAXNAMELEN]; char snapname[MAXNAMELEN];
boolean_t case_conflict; boolean_t case_conflict;
uint64_t id, pos; uint64_t id, pos;
int error = 0; int error = 0;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
if (!dir_emit_dots(filp, ctx)) if (!dir_emit_dots(filp, ctx))
@ -264,10 +264,10 @@ zpl_snapdir_iterate(struct file *filp, struct dir_context *ctx)
pos = ctx->pos; pos = ctx->pos;
while (error == 0) { while (error == 0) {
dsl_pool_config_enter(dmu_objset_pool(zsb->z_os), FTAG); dsl_pool_config_enter(dmu_objset_pool(zfsvfs->z_os), FTAG);
error = -dmu_snapshot_list_next(zsb->z_os, MAXNAMELEN, error = -dmu_snapshot_list_next(zfsvfs->z_os, MAXNAMELEN,
snapname, &id, &pos, &case_conflict); snapname, &id, &pos, &case_conflict);
dsl_pool_config_exit(dmu_objset_pool(zsb->z_os), FTAG); dsl_pool_config_exit(dmu_objset_pool(zfsvfs->z_os), FTAG);
if (error) if (error)
goto out; goto out;
@ -279,7 +279,7 @@ zpl_snapdir_iterate(struct file *filp, struct dir_context *ctx)
} }
out: out:
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
if (error == -ENOENT) if (error == -ENOENT)
return (0); return (0);
@ -378,15 +378,15 @@ static int
zpl_snapdir_getattr(struct vfsmount *mnt, struct dentry *dentry, zpl_snapdir_getattr(struct vfsmount *mnt, struct dentry *dentry,
struct kstat *stat) struct kstat *stat)
{ {
zfs_sb_t *zsb = ITOZSB(dentry->d_inode); zfsvfs_t *zfsvfs = ITOZSB(dentry->d_inode);
int error; int error;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
error = simple_getattr(mnt, dentry, stat); error = simple_getattr(mnt, dentry, stat);
stat->nlink = stat->size = 2; stat->nlink = stat->size = 2;
stat->ctime = stat->mtime = dmu_objset_snap_cmtime(zsb->z_os); stat->ctime = stat->mtime = dmu_objset_snap_cmtime(zfsvfs->z_os);
stat->atime = CURRENT_TIME; stat->atime = CURRENT_TIME;
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
@ -464,19 +464,19 @@ zpl_shares_iterate(struct file *filp, struct dir_context *ctx)
{ {
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
cred_t *cr = CRED(); cred_t *cr = CRED();
zfs_sb_t *zsb = ITOZSB(file_inode(filp)); zfsvfs_t *zfsvfs = ITOZSB(file_inode(filp));
znode_t *dzp; znode_t *dzp;
int error = 0; int error = 0;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
if (zsb->z_shares_dir == 0) { if (zfsvfs->z_shares_dir == 0) {
dir_emit_dots(filp, ctx); dir_emit_dots(filp, ctx);
goto out; goto out;
} }
error = -zfs_zget(zsb, zsb->z_shares_dir, &dzp); error = -zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &dzp);
if (error) if (error)
goto out; goto out;
@ -487,7 +487,7 @@ zpl_shares_iterate(struct file *filp, struct dir_context *ctx)
iput(ZTOI(dzp)); iput(ZTOI(dzp));
out: out:
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
ASSERT3S(error, <=, 0); ASSERT3S(error, <=, 0);
return (error); return (error);
@ -513,27 +513,27 @@ zpl_shares_getattr(struct vfsmount *mnt, struct dentry *dentry,
struct kstat *stat) struct kstat *stat)
{ {
struct inode *ip = dentry->d_inode; struct inode *ip = dentry->d_inode;
zfs_sb_t *zsb = ITOZSB(ip); zfsvfs_t *zfsvfs = ITOZSB(ip);
znode_t *dzp; znode_t *dzp;
int error; int error;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
if (zsb->z_shares_dir == 0) { if (zfsvfs->z_shares_dir == 0) {
error = simple_getattr(mnt, dentry, stat); error = simple_getattr(mnt, dentry, stat);
stat->nlink = stat->size = 2; stat->nlink = stat->size = 2;
stat->atime = CURRENT_TIME; stat->atime = CURRENT_TIME;
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
return (error); return (error);
} }
error = -zfs_zget(zsb, zsb->z_shares_dir, &dzp); error = -zfs_zget(zfsvfs, zfsvfs->z_shares_dir, &dzp);
if (error == 0) { if (error == 0) {
error = -zfs_getattr_fast(ZTOI(dzp), stat); error = -zfs_getattr_fast(ZTOI(dzp), stat);
iput(ZTOI(dzp)); iput(ZTOI(dzp));
} }
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
ASSERT3S(error, <=, 0); ASSERT3S(error, <=, 0);
return (error); return (error);

View File

@ -605,14 +605,14 @@ static int
zpl_writepages(struct address_space *mapping, struct writeback_control *wbc) zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
{ {
znode_t *zp = ITOZ(mapping->host); znode_t *zp = ITOZ(mapping->host);
zfs_sb_t *zsb = ITOZSB(mapping->host); zfsvfs_t *zfsvfs = ITOZSB(mapping->host);
enum writeback_sync_modes sync_mode; enum writeback_sync_modes sync_mode;
int result; int result;
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
if (zsb->z_os->os_sync == ZFS_SYNC_ALWAYS) if (zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS)
wbc->sync_mode = WB_SYNC_ALL; wbc->sync_mode = WB_SYNC_ALL;
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
sync_mode = wbc->sync_mode; sync_mode = wbc->sync_mode;
/* /*
@ -625,11 +625,11 @@ zpl_writepages(struct address_space *mapping, struct writeback_control *wbc)
wbc->sync_mode = WB_SYNC_NONE; wbc->sync_mode = WB_SYNC_NONE;
result = write_cache_pages(mapping, wbc, zpl_putpage, mapping); result = write_cache_pages(mapping, wbc, zpl_putpage, mapping);
if (sync_mode != wbc->sync_mode) { if (sync_mode != wbc->sync_mode) {
ZFS_ENTER(zsb); ZFS_ENTER(zfsvfs);
ZFS_VERIFY_ZP(zp); ZFS_VERIFY_ZP(zp);
if (zsb->z_log != NULL) if (zfsvfs->z_log != NULL)
zil_commit(zsb->z_log, zp->z_id); zil_commit(zfsvfs->z_log, zp->z_id);
ZFS_EXIT(zsb); ZFS_EXIT(zfsvfs);
/* /*
* We need to call write_cache_pages() again (we can't just * We need to call write_cache_pages() again (we can't just

View File

@ -48,7 +48,7 @@ zpl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
pathname_t *ppn = NULL; pathname_t *ppn = NULL;
pathname_t pn; pathname_t pn;
int zfs_flags = 0; int zfs_flags = 0;
zfs_sb_t *zsb = dentry->d_sb->s_fs_info; zfsvfs_t *zfsvfs = dentry->d_sb->s_fs_info;
if (dlen(dentry) >= ZAP_MAXNAMELEN) if (dlen(dentry) >= ZAP_MAXNAMELEN)
return (ERR_PTR(-ENAMETOOLONG)); return (ERR_PTR(-ENAMETOOLONG));
@ -57,7 +57,7 @@ zpl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
/* If we are a case insensitive fs, we need the real name */ /* If we are a case insensitive fs, we need the real name */
if (zsb->z_case == ZFS_CASE_INSENSITIVE) { if (zfsvfs->z_case == ZFS_CASE_INSENSITIVE) {
zfs_flags = FIGNORECASE; zfs_flags = FIGNORECASE;
pn_alloc(&pn); pn_alloc(&pn);
ppn = &pn; ppn = &pn;
@ -259,7 +259,7 @@ zpl_unlink(struct inode *dir, struct dentry *dentry)
cred_t *cr = CRED(); cred_t *cr = CRED();
int error; int error;
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
zfs_sb_t *zsb = dentry->d_sb->s_fs_info; zfsvfs_t *zfsvfs = dentry->d_sb->s_fs_info;
crhold(cr); crhold(cr);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
@ -269,7 +269,7 @@ zpl_unlink(struct inode *dir, struct dentry *dentry)
* For a CI FS we must invalidate the dentry to prevent the * For a CI FS we must invalidate the dentry to prevent the
* creation of negative entries. * creation of negative entries.
*/ */
if (error == 0 && zsb->z_case == ZFS_CASE_INSENSITIVE) if (error == 0 && zfsvfs->z_case == ZFS_CASE_INSENSITIVE)
d_invalidate(dentry); d_invalidate(dentry);
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
@ -319,7 +319,7 @@ zpl_rmdir(struct inode *dir, struct dentry *dentry)
cred_t *cr = CRED(); cred_t *cr = CRED();
int error; int error;
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
zfs_sb_t *zsb = dentry->d_sb->s_fs_info; zfsvfs_t *zfsvfs = dentry->d_sb->s_fs_info;
crhold(cr); crhold(cr);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
@ -329,7 +329,7 @@ zpl_rmdir(struct inode *dir, struct dentry *dentry)
* For a CI FS we must invalidate the dentry to prevent the * For a CI FS we must invalidate the dentry to prevent the
* creation of negative entries. * creation of negative entries.
*/ */
if (error == 0 && zsb->z_case == ZFS_CASE_INSENSITIVE) if (error == 0 && zfsvfs->z_case == ZFS_CASE_INSENSITIVE)
d_invalidate(dentry); d_invalidate(dentry);
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
@ -658,7 +658,7 @@ zpl_revalidate(struct dentry *dentry, unsigned int flags)
{ {
#endif /* HAVE_D_REVALIDATE_NAMEIDATA */ #endif /* HAVE_D_REVALIDATE_NAMEIDATA */
/* CSTYLED */ /* CSTYLED */
zfs_sb_t *zsb = dentry->d_sb->s_fs_info; zfsvfs_t *zfsvfs = dentry->d_sb->s_fs_info;
int error; int error;
if (flags & LOOKUP_RCU) if (flags & LOOKUP_RCU)
@ -668,12 +668,12 @@ zpl_revalidate(struct dentry *dentry, unsigned int flags)
* Automounted snapshots rely on periodic dentry revalidation * Automounted snapshots rely on periodic dentry revalidation
* to defer snapshots from being automatically unmounted. * to defer snapshots from being automatically unmounted.
*/ */
if (zsb->z_issnap) { if (zfsvfs->z_issnap) {
if (time_after(jiffies, zsb->z_snap_defer_time + if (time_after(jiffies, zfsvfs->z_snap_defer_time +
MAX(zfs_expire_snapshot * HZ / 2, HZ))) { MAX(zfs_expire_snapshot * HZ / 2, HZ))) {
zsb->z_snap_defer_time = jiffies; zfsvfs->z_snap_defer_time = jiffies;
zfsctl_snapshot_unmount_delay(zsb->z_os->os_spa, zfsctl_snapshot_unmount_delay(zfsvfs->z_os->os_spa,
dmu_objset_id(zsb->z_os), zfs_expire_snapshot); dmu_objset_id(zfsvfs->z_os), zfs_expire_snapshot);
} }
} }
@ -684,7 +684,7 @@ zpl_revalidate(struct dentry *dentry, unsigned int flags)
*/ */
if (dentry->d_inode == NULL) { if (dentry->d_inode == NULL) {
spin_lock(&dentry->d_lock); spin_lock(&dentry->d_lock);
error = time_before(dentry->d_time, zsb->z_rollback_time); error = time_before(dentry->d_time, zfsvfs->z_rollback_time);
spin_unlock(&dentry->d_lock); spin_unlock(&dentry->d_lock);
if (error) if (error)

View File

@ -184,211 +184,15 @@ zpl_statfs(struct dentry *dentry, struct kstatfs *statp)
return (error); return (error);
} }
enum {
TOKEN_RO,
TOKEN_RW,
TOKEN_SETUID,
TOKEN_NOSETUID,
TOKEN_EXEC,
TOKEN_NOEXEC,
TOKEN_DEVICES,
TOKEN_NODEVICES,
TOKEN_DIRXATTR,
TOKEN_SAXATTR,
TOKEN_XATTR,
TOKEN_NOXATTR,
TOKEN_ATIME,
TOKEN_NOATIME,
TOKEN_RELATIME,
TOKEN_NORELATIME,
TOKEN_NBMAND,
TOKEN_NONBMAND,
TOKEN_MNTPOINT,
TOKEN_LAST,
};
static const match_table_t zpl_tokens = {
{ TOKEN_RO, MNTOPT_RO },
{ TOKEN_RW, MNTOPT_RW },
{ TOKEN_SETUID, MNTOPT_SETUID },
{ TOKEN_NOSETUID, MNTOPT_NOSETUID },
{ TOKEN_EXEC, MNTOPT_EXEC },
{ TOKEN_NOEXEC, MNTOPT_NOEXEC },
{ TOKEN_DEVICES, MNTOPT_DEVICES },
{ TOKEN_NODEVICES, MNTOPT_NODEVICES },
{ TOKEN_DIRXATTR, MNTOPT_DIRXATTR },
{ TOKEN_SAXATTR, MNTOPT_SAXATTR },
{ TOKEN_XATTR, MNTOPT_XATTR },
{ TOKEN_NOXATTR, MNTOPT_NOXATTR },
{ TOKEN_ATIME, MNTOPT_ATIME },
{ TOKEN_NOATIME, MNTOPT_NOATIME },
{ TOKEN_RELATIME, MNTOPT_RELATIME },
{ TOKEN_NORELATIME, MNTOPT_NORELATIME },
{ TOKEN_NBMAND, MNTOPT_NBMAND },
{ TOKEN_NONBMAND, MNTOPT_NONBMAND },
{ TOKEN_MNTPOINT, MNTOPT_MNTPOINT "=%s" },
{ TOKEN_LAST, NULL },
};
static int
zpl_parse_option(char *option, int token, substring_t *args, zfs_mntopts_t *zmo)
{
switch (token) {
case TOKEN_RO:
zmo->z_readonly = B_TRUE;
zmo->z_do_readonly = B_TRUE;
break;
case TOKEN_RW:
zmo->z_readonly = B_FALSE;
zmo->z_do_readonly = B_TRUE;
break;
case TOKEN_SETUID:
zmo->z_setuid = B_TRUE;
zmo->z_do_setuid = B_TRUE;
break;
case TOKEN_NOSETUID:
zmo->z_setuid = B_FALSE;
zmo->z_do_setuid = B_TRUE;
break;
case TOKEN_EXEC:
zmo->z_exec = B_TRUE;
zmo->z_do_exec = B_TRUE;
break;
case TOKEN_NOEXEC:
zmo->z_exec = B_FALSE;
zmo->z_do_exec = B_TRUE;
break;
case TOKEN_DEVICES:
zmo->z_devices = B_TRUE;
zmo->z_do_devices = B_TRUE;
break;
case TOKEN_NODEVICES:
zmo->z_devices = B_FALSE;
zmo->z_do_devices = B_TRUE;
break;
case TOKEN_DIRXATTR:
zmo->z_xattr = ZFS_XATTR_DIR;
zmo->z_do_xattr = B_TRUE;
break;
case TOKEN_SAXATTR:
zmo->z_xattr = ZFS_XATTR_SA;
zmo->z_do_xattr = B_TRUE;
break;
case TOKEN_XATTR:
zmo->z_xattr = ZFS_XATTR_DIR;
zmo->z_do_xattr = B_TRUE;
break;
case TOKEN_NOXATTR:
zmo->z_xattr = ZFS_XATTR_OFF;
zmo->z_do_xattr = B_TRUE;
break;
case TOKEN_ATIME:
zmo->z_atime = B_TRUE;
zmo->z_do_atime = B_TRUE;
break;
case TOKEN_NOATIME:
zmo->z_atime = B_FALSE;
zmo->z_do_atime = B_TRUE;
break;
case TOKEN_RELATIME:
zmo->z_relatime = B_TRUE;
zmo->z_do_relatime = B_TRUE;
break;
case TOKEN_NORELATIME:
zmo->z_relatime = B_FALSE;
zmo->z_do_relatime = B_TRUE;
break;
case TOKEN_NBMAND:
zmo->z_nbmand = B_TRUE;
zmo->z_do_nbmand = B_TRUE;
break;
case TOKEN_NONBMAND:
zmo->z_nbmand = B_FALSE;
zmo->z_do_nbmand = B_TRUE;
break;
case TOKEN_MNTPOINT:
zmo->z_mntpoint = match_strdup(&args[0]);
if (zmo->z_mntpoint == NULL)
return (-ENOMEM);
break;
default:
break;
}
return (0);
}
/*
* Parse the mntopts string storing the results in provided zmo argument.
* If an error occurs the zmo argument will not be modified. The caller
* needs to set isremount when recycling an existing zfs_mntopts_t.
*/
static int
zpl_parse_options(char *osname, char *mntopts, zfs_mntopts_t *zmo,
boolean_t isremount)
{
zfs_mntopts_t *tmp_zmo;
int error;
tmp_zmo = zfs_mntopts_alloc();
tmp_zmo->z_osname = strdup(osname);
if (mntopts) {
substring_t args[MAX_OPT_ARGS];
char *tmp_mntopts, *p, *t;
int token;
t = tmp_mntopts = strdup(mntopts);
while ((p = strsep(&t, ",")) != NULL) {
if (!*p)
continue;
args[0].to = args[0].from = NULL;
token = match_token(p, zpl_tokens, args);
error = zpl_parse_option(p, token, args, tmp_zmo);
if (error) {
zfs_mntopts_free(tmp_zmo);
strfree(tmp_mntopts);
return (error);
}
}
strfree(tmp_mntopts);
}
if (isremount == B_TRUE) {
if (zmo->z_osname)
strfree(zmo->z_osname);
if (zmo->z_mntpoint)
strfree(zmo->z_mntpoint);
} else {
ASSERT3P(zmo->z_osname, ==, NULL);
ASSERT3P(zmo->z_mntpoint, ==, NULL);
}
memcpy(zmo, tmp_zmo, sizeof (zfs_mntopts_t));
kmem_free(tmp_zmo, sizeof (zfs_mntopts_t));
return (0);
}
static int static int
zpl_remount_fs(struct super_block *sb, int *flags, char *data) zpl_remount_fs(struct super_block *sb, int *flags, char *data)
{ {
zfs_sb_t *zsb = sb->s_fs_info; zfs_mnt_t zm = { .mnt_osname = NULL, .mnt_data = data };
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
int error; int error;
error = zpl_parse_options(zsb->z_mntopts->z_osname, data,
zsb->z_mntopts, B_TRUE);
if (error)
return (error);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
error = -zfs_remount(sb, flags, zsb->z_mntopts); error = -zfs_remount(sb, flags, &zm);
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
ASSERT3S(error, <=, 0); ASSERT3S(error, <=, 0);
@ -396,12 +200,13 @@ zpl_remount_fs(struct super_block *sb, int *flags, char *data)
} }
static int static int
__zpl_show_options(struct seq_file *seq, zfs_sb_t *zsb) __zpl_show_options(struct seq_file *seq, zfsvfs_t *zfsvfs)
{ {
seq_printf(seq, ",%s", zsb->z_flags & ZSB_XATTR ? "xattr" : "noxattr"); seq_printf(seq, ",%s",
zfsvfs->z_flags & ZSB_XATTR ? "xattr" : "noxattr");
#ifdef CONFIG_FS_POSIX_ACL #ifdef CONFIG_FS_POSIX_ACL
switch (zsb->z_acl_type) { switch (zfsvfs->z_acl_type) {
case ZFS_ACLTYPE_POSIXACL: case ZFS_ACLTYPE_POSIXACL:
seq_puts(seq, ",posixacl"); seq_puts(seq, ",posixacl");
break; break;
@ -431,12 +236,12 @@ zpl_show_options(struct seq_file *seq, struct vfsmount *vfsp)
static int static int
zpl_fill_super(struct super_block *sb, void *data, int silent) zpl_fill_super(struct super_block *sb, void *data, int silent)
{ {
zfs_mntopts_t *zmo = (zfs_mntopts_t *)data; zfs_mnt_t *zm = (zfs_mnt_t *)data;
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
int error; int error;
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
error = -zfs_domount(sb, zmo, silent); error = -zfs_domount(sb, zm, silent);
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
ASSERT3S(error, <=, 0); ASSERT3S(error, <=, 0);
@ -448,32 +253,18 @@ static struct dentry *
zpl_mount(struct file_system_type *fs_type, int flags, zpl_mount(struct file_system_type *fs_type, int flags,
const char *osname, void *data) const char *osname, void *data)
{ {
zfs_mntopts_t *zmo = zfs_mntopts_alloc(); zfs_mnt_t zm = { .mnt_osname = osname, .mnt_data = data };
int error;
error = zpl_parse_options((char *)osname, (char *)data, zmo, B_FALSE); return (mount_nodev(fs_type, flags, &zm, zpl_fill_super));
if (error) {
zfs_mntopts_free(zmo);
return (ERR_PTR(error));
}
return (mount_nodev(fs_type, flags, zmo, zpl_fill_super));
} }
#else #else
static int static int
zpl_get_sb(struct file_system_type *fs_type, int flags, zpl_get_sb(struct file_system_type *fs_type, int flags,
const char *osname, void *data, struct vfsmount *mnt) const char *osname, void *data, struct vfsmount *mnt)
{ {
zfs_mntopts_t *zmo = zfs_mntopts_alloc(); zfs_mnt_t zm = { .mnt_osname = osname, .mnt_data = data };
int error;
error = zpl_parse_options((char *)osname, (char *)data, zmo, B_FALSE); return (get_sb_nodev(fs_type, flags, &zm, zpl_fill_super, mnt));
if (error) {
zfs_mntopts_free(zmo);
return (error);
}
return (get_sb_nodev(fs_type, flags, zmo, zpl_fill_super, mnt));
} }
#endif /* HAVE_MOUNT_NODEV */ #endif /* HAVE_MOUNT_NODEV */
@ -494,7 +285,7 @@ zpl_prune_sb(int64_t nr_to_scan, void *arg)
struct super_block *sb = (struct super_block *)arg; struct super_block *sb = (struct super_block *)arg;
int objects = 0; int objects = 0;
(void) -zfs_sb_prune(sb, nr_to_scan, &objects); (void) -zfs_prune(sb, nr_to_scan, &objects);
} }
#ifdef HAVE_NR_CACHED_OBJECTS #ifdef HAVE_NR_CACHED_OBJECTS

View File

@ -237,7 +237,7 @@ ssize_t
zpl_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size) zpl_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size)
{ {
znode_t *zp = ITOZ(dentry->d_inode); znode_t *zp = ITOZ(dentry->d_inode);
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
xattr_filldir_t xf = { buffer_size, 0, buffer, dentry }; xattr_filldir_t xf = { buffer_size, 0, buffer, dentry };
cred_t *cr = CRED(); cred_t *cr = CRED();
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
@ -245,10 +245,10 @@ zpl_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size)
crhold(cr); crhold(cr);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
rrm_enter_read(&(zsb)->z_teardown_lock, FTAG); rrm_enter_read(&(zfsvfs)->z_teardown_lock, FTAG);
rw_enter(&zp->z_xattr_lock, RW_READER); rw_enter(&zp->z_xattr_lock, RW_READER);
if (zsb->z_use_sa && zp->z_is_sa) { if (zfsvfs->z_use_sa && zp->z_is_sa) {
error = zpl_xattr_list_sa(&xf); error = zpl_xattr_list_sa(&xf);
if (error) if (error)
goto out; goto out;
@ -262,7 +262,7 @@ zpl_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size)
out: out:
rw_exit(&zp->z_xattr_lock); rw_exit(&zp->z_xattr_lock);
rrm_exit(&(zsb)->z_teardown_lock, FTAG); rrm_exit(&(zfsvfs)->z_teardown_lock, FTAG);
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
crfree(cr); crfree(cr);
@ -349,12 +349,12 @@ __zpl_xattr_get(struct inode *ip, const char *name, void *value, size_t size,
cred_t *cr) cred_t *cr)
{ {
znode_t *zp = ITOZ(ip); znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
int error; int error;
ASSERT(RW_LOCK_HELD(&zp->z_xattr_lock)); ASSERT(RW_LOCK_HELD(&zp->z_xattr_lock));
if (zsb->z_use_sa && zp->z_is_sa) { if (zfsvfs->z_use_sa && zp->z_is_sa) {
error = zpl_xattr_get_sa(ip, name, value, size); error = zpl_xattr_get_sa(ip, name, value, size);
if (error != -ENOENT) if (error != -ENOENT)
goto out; goto out;
@ -376,14 +376,14 @@ static int
__zpl_xattr_where(struct inode *ip, const char *name, int *where, cred_t *cr) __zpl_xattr_where(struct inode *ip, const char *name, int *where, cred_t *cr)
{ {
znode_t *zp = ITOZ(ip); znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
int error; int error;
ASSERT(where); ASSERT(where);
ASSERT(RW_LOCK_HELD(&zp->z_xattr_lock)); ASSERT(RW_LOCK_HELD(&zp->z_xattr_lock));
*where = XATTR_NOENT; *where = XATTR_NOENT;
if (zsb->z_use_sa && zp->z_is_sa) { if (zfsvfs->z_use_sa && zp->z_is_sa) {
error = zpl_xattr_get_sa(ip, name, NULL, 0); error = zpl_xattr_get_sa(ip, name, NULL, 0);
if (error >= 0) if (error >= 0)
*where |= XATTR_IN_SA; *where |= XATTR_IN_SA;
@ -411,18 +411,18 @@ static int
zpl_xattr_get(struct inode *ip, const char *name, void *value, size_t size) zpl_xattr_get(struct inode *ip, const char *name, void *value, size_t size)
{ {
znode_t *zp = ITOZ(ip); znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
cred_t *cr = CRED(); cred_t *cr = CRED();
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
int error; int error;
crhold(cr); crhold(cr);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
rrm_enter_read(&(zsb)->z_teardown_lock, FTAG); rrm_enter_read(&(zfsvfs)->z_teardown_lock, FTAG);
rw_enter(&zp->z_xattr_lock, RW_READER); rw_enter(&zp->z_xattr_lock, RW_READER);
error = __zpl_xattr_get(ip, name, value, size, cr); error = __zpl_xattr_get(ip, name, value, size, cr);
rw_exit(&zp->z_xattr_lock); rw_exit(&zp->z_xattr_lock);
rrm_exit(&(zsb)->z_teardown_lock, FTAG); rrm_exit(&(zfsvfs)->z_teardown_lock, FTAG);
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
crfree(cr); crfree(cr);
@ -576,7 +576,7 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value,
size_t size, int flags) size_t size, int flags)
{ {
znode_t *zp = ITOZ(ip); znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ZTOZSB(zp); zfsvfs_t *zfsvfs = ZTOZSB(zp);
cred_t *cr = CRED(); cred_t *cr = CRED();
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
int where; int where;
@ -584,7 +584,7 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value,
crhold(cr); crhold(cr);
cookie = spl_fstrans_mark(); cookie = spl_fstrans_mark();
rrm_enter_read(&(zsb)->z_teardown_lock, FTAG); rrm_enter_read(&(zfsvfs)->z_teardown_lock, FTAG);
rw_enter(&ITOZ(ip)->z_xattr_lock, RW_WRITER); rw_enter(&ITOZ(ip)->z_xattr_lock, RW_WRITER);
/* /*
@ -615,8 +615,8 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value,
} }
/* Preferentially store the xattr as a SA for better performance */ /* Preferentially store the xattr as a SA for better performance */
if (zsb->z_use_sa && zp->z_is_sa && if (zfsvfs->z_use_sa && zp->z_is_sa &&
(zsb->z_xattr_sa || (value == NULL && where & XATTR_IN_SA))) { (zfsvfs->z_xattr_sa || (value == NULL && where & XATTR_IN_SA))) {
error = zpl_xattr_set_sa(ip, name, value, size, flags, cr); error = zpl_xattr_set_sa(ip, name, value, size, flags, cr);
if (error == 0) { if (error == 0) {
/* /*
@ -637,7 +637,7 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value,
zpl_xattr_set_sa(ip, name, NULL, 0, 0, cr); zpl_xattr_set_sa(ip, name, NULL, 0, 0, cr);
out: out:
rw_exit(&ITOZ(ip)->z_xattr_lock); rw_exit(&ITOZ(ip)->z_xattr_lock);
rrm_exit(&(zsb)->z_teardown_lock, FTAG); rrm_exit(&(zfsvfs)->z_teardown_lock, FTAG);
spl_fstrans_unmark(cookie); spl_fstrans_unmark(cookie);
crfree(cr); crfree(cr);
ASSERT3S(error, <=, 0); ASSERT3S(error, <=, 0);