]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - zfs/module/zfs/zfs_sa.c
UBUNTU: SAUCE: (noup) Update spl to 0.7.3-1ubuntu1, zfs to 0.7.3-1ubuntu1
[mirror_ubuntu-bionic-kernel.git] / zfs / module / zfs / zfs_sa.c
index 98e6185cfd1ad78cbf40977b6365d766672255fc..6eb7e09990b2fd3bef3469014770583acbac7e0c 100644 (file)
@@ -97,8 +97,7 @@ zfs_sa_symlink(znode_t *zp, char *link, int len, dmu_tx_t *tx)
        dmu_buf_t *db = sa_get_db(zp->z_sa_hdl);
 
        if (ZFS_OLD_ZNODE_PHYS_SIZE + len <= dmu_bonus_max()) {
-               VERIFY(dmu_set_bonus(db,
-                   len + ZFS_OLD_ZNODE_PHYS_SIZE, tx) == 0);
+               VERIFY0(dmu_set_bonus(db, len + ZFS_OLD_ZNODE_PHYS_SIZE, tx));
                if (len) {
                        bcopy(link, (caddr_t)db->db_data +
                            ZFS_OLD_ZNODE_PHYS_SIZE, len);
@@ -107,8 +106,8 @@ zfs_sa_symlink(znode_t *zp, char *link, int len, dmu_tx_t *tx)
                dmu_buf_t *dbp;
 
                zfs_grow_blocksize(zp, len, tx);
-               VERIFY(0 == dmu_buf_hold(ZTOZSB(zp)->z_os,
-                   zp->z_id, 0, FTAG, &dbp, DMU_READ_NO_PREFETCH));
+               VERIFY0(dmu_buf_hold(ZTOZSB(zp)->z_os, zp->z_id, 0, FTAG, &dbp,
+                   DMU_READ_NO_PREFETCH));
 
                dmu_buf_will_dirty(dbp, tx);
 
@@ -121,13 +120,13 @@ zfs_sa_symlink(znode_t *zp, char *link, int len, dmu_tx_t *tx)
 void
 zfs_sa_get_scanstamp(znode_t *zp, xvattr_t *xvap)
 {
-       zfs_sb_t *zsb = ZTOZSB(zp);
+       zfsvfs_t *zfsvfs = ZTOZSB(zp);
        xoptattr_t *xoap;
 
        ASSERT(MUTEX_HELD(&zp->z_lock));
        VERIFY((xoap = xva_getxoptattr(xvap)) != NULL);
        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,
                    sizeof (xoap->xoa_av_scanstamp)) != 0)
                        return;
@@ -155,13 +154,13 @@ zfs_sa_get_scanstamp(znode_t *zp, xvattr_t *xvap)
 void
 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;
 
        ASSERT(MUTEX_HELD(&zp->z_lock));
        VERIFY((xoap = xva_getxoptattr(xvap)) != NULL);
        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,
                    sizeof (xoap->xoa_av_scanstamp), tx));
        else {
@@ -178,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));
 
                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));
        }
 }
@@ -186,7 +185,7 @@ zfs_sa_set_scanstamp(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx)
 int
 zfs_sa_get_xattr(znode_t *zp)
 {
-       zfs_sb_t *zsb = ZTOZSB(zp);
+       zfsvfs_t *zfsvfs = ZTOZSB(zp);
        char *obj;
        int size;
        int error;
@@ -195,7 +194,7 @@ zfs_sa_get_xattr(znode_t *zp)
        ASSERT(!zp->z_xattr_cached);
        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 == ENOENT)
                        return nvlist_alloc(&zp->z_xattr_cached,
@@ -204,13 +203,13 @@ zfs_sa_get_xattr(znode_t *zp)
                        return (error);
        }
 
-       obj = zio_buf_alloc(size);
+       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)
                error = nvlist_unpack(obj, size, &zp->z_xattr_cached, KM_SLEEP);
 
-       zio_buf_free(obj, size);
+       vmem_free(obj, size);
 
        return (error);
 }
@@ -218,7 +217,7 @@ zfs_sa_get_xattr(znode_t *zp)
 int
 zfs_sa_set_xattr(znode_t *zp)
 {
-       zfs_sb_t *zsb = ZTOZSB(zp);
+       zfsvfs_t *zfsvfs = ZTOZSB(zp);
        dmu_tx_t *tx;
        char *obj;
        size_t size;
@@ -234,14 +233,14 @@ zfs_sa_set_xattr(znode_t *zp)
        if (error)
                goto out;
 
-       obj = zio_buf_alloc(size);
+       obj = vmem_alloc(size, KM_SLEEP);
 
        error = nvlist_pack(zp->z_xattr_cached, &obj, &size,
            NV_ENCODE_XDR, KM_SLEEP);
        if (error)
                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(tx, zp->z_sa_hdl, B_TRUE);
 
@@ -249,12 +248,21 @@ zfs_sa_set_xattr(znode_t *zp)
        if (error) {
                dmu_tx_abort(tx);
        } else {
-               VERIFY0(sa_update(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb),
-                   obj, size, tx));
+               int count = 0;
+               sa_bulk_attr_t bulk[2];
+               uint64_t ctime[2];
+
+               zfs_tstamp_update_setup(zp, STATE_CHANGED, NULL, ctime);
+               SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_DXATTR(zfsvfs),
+                   NULL, obj, size);
+               SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs),
+                   NULL, &ctime, 16);
+               VERIFY0(sa_bulk_update(zp->z_sa_hdl, bulk, count, tx));
+
                dmu_tx_commit(tx);
        }
 out_free:
-       zio_buf_free(obj, size);
+       vmem_free(obj, size);
 out:
        return (error);
 }
@@ -272,12 +280,13 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
 {
        dmu_buf_t *db = sa_get_db(hdl);
        znode_t *zp = sa_get_userdata(hdl);
-       zfs_sb_t *zsb = ZTOZSB(zp);
+       zfsvfs_t *zfsvfs = ZTOZSB(zp);
        int count = 0;
        sa_bulk_attr_t *bulk, *sa_attrs;
        zfs_acl_locator_cb_t locate = { 0 };
-       uint64_t uid, gid, mode, rdev, xattr, parent;
+       uint64_t uid, gid, mode, rdev, xattr, parent, tmp_gen;
        uint64_t crtime[2], mtime[2], ctime[2], atime[2];
+       uint64_t links;
        zfs_acl_phys_t znode_acl;
        char scanstamp[AV_SCANSTAMP_SZ];
        boolean_t drop_lock = B_FALSE;
@@ -309,17 +318,18 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
 
        /* First do a bulk query of the attributes that aren't cached */
        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_MTIME(zsb), NULL, &mtime, 16);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zsb), NULL, &ctime, 16);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CRTIME(zsb), NULL, &crtime, 16);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zsb), NULL, &mode, 8);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zsb), NULL, &parent, 8);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_XATTR(zsb), NULL, &xattr, 8);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_RDEV(zsb), NULL, &rdev, 8);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_UID(zsb), NULL, &uid, 8);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GID(zsb), NULL, &gid, 8);
-       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ZNODE_ACL(zsb), NULL,
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_ATIME(zfsvfs), NULL, &atime, 16);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, &mtime, 16);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &ctime, 16);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CRTIME(zfsvfs), NULL, &crtime, 16);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MODE(zfsvfs), NULL, &mode, 8);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_PARENT(zfsvfs), NULL, &parent, 8);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_XATTR(zfsvfs), NULL, &xattr, 8);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_RDEV(zfsvfs), NULL, &rdev, 8);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_UID(zfsvfs), NULL, &uid, 8);
+       SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_GID(zfsvfs), NULL, &gid, 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(zfsvfs), NULL,
            &znode_acl, 88);
 
        if (sa_bulk_lookup_locked(hdl, bulk, count) != 0) {
@@ -333,42 +343,43 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
         */
        count = 0;
        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_SIZE(zsb), NULL,
+       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_MODE(zfsvfs), NULL, &mode, 8);
+       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_SIZE(zfsvfs), NULL,
            &zp->z_size, 8);
-       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_GEN(zsb),
-           NULL, &zp->z_gen, 8);
-       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_UID(zsb), NULL, &uid, 8);
-       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_GID(zsb), NULL, &gid, 8);
-       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_PARENT(zsb),
+       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_GEN(zfsvfs),
+           NULL, &tmp_gen, 8);
+       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_UID(zfsvfs), NULL, &uid, 8);
+       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);
-       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);
-       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);
-       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);
-       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);
-       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);
-       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_LINKS(zsb), NULL,
-           &zp->z_links, 8);
+       links = ZTOI(zp)->i_nlink;
+       SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_LINKS(zfsvfs), NULL,
+           &links, 8);
        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);
-       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);
 
        if (zp->z_acl_cached->z_version < ZFS_ACL_VERSION_FUID)
                zfs_acl_xform(zp, zp->z_acl_cached, CRED());
 
        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);
 
        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);
 
        /* if scanstamp then add scanstamp */
@@ -376,7 +387,7 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
        if (zp->z_pflags & ZFS_BONUS_SCANSTAMP) {
                bcopy((caddr_t)db->db_data + ZFS_OLD_ZNODE_PHYS_SIZE,
                    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);
                zp->z_pflags &= ~ZFS_BONUS_SCANSTAMP;
        }
@@ -385,7 +396,7 @@ zfs_sa_upgrade(sa_handle_t *hdl, dmu_tx_t *tx)
        VERIFY(sa_replace_all_by_template_locked(hdl, sa_attrs,
            count, tx) == 0);
        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));
 
        zp->z_is_sa = B_TRUE;