{"ZPL_SYMLINK", 0, SA_UINT8_ARRAY, 0},
{"ZPL_SCANSTAMP", 32, SA_UINT8_ARRAY, 0},
{"ZPL_DACL_ACES", 0, SA_ACL, 0},
+ {"ZPL_DXATTR", 0, SA_UINT8_ARRAY, 0},
{NULL, 0, 0, 0}
};
}
}
-#ifdef HAVE_SCANSTAMP
void
zfs_sa_get_scanstamp(znode_t *zp, xvattr_t *xvap)
{
&zp->z_pflags, sizeof (uint64_t), tx));
}
}
-#endif /* HAVE_SCANSTAMP */
+
+int
+zfs_sa_get_xattr(znode_t *zp)
+{
+ zfs_sb_t *zsb = ZTOZSB(zp);
+ char *obj;
+ int size;
+ int error;
+
+ ASSERT(RW_LOCK_HELD(&zp->z_xattr_lock));
+ ASSERT(!zp->z_xattr_cached);
+ ASSERT(zp->z_is_sa);
+
+ error = sa_size(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb), &size);
+ if (error) {
+ if (error == ENOENT)
+ return nvlist_alloc(&zp->z_xattr_cached,
+ NV_UNIQUE_NAME, KM_SLEEP);
+ else
+ return (error);
+ }
+
+ obj = sa_spill_alloc(KM_SLEEP);
+
+ error = sa_lookup(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb), obj, size);
+ if (error == 0)
+ error = nvlist_unpack(obj, size, &zp->z_xattr_cached, KM_SLEEP);
+
+ sa_spill_free(obj);
+
+ return (error);
+}
+
+int
+zfs_sa_set_xattr(znode_t *zp)
+{
+ zfs_sb_t *zsb = ZTOZSB(zp);
+ dmu_tx_t *tx;
+ char *obj;
+ size_t size;
+ int error;
+
+ ASSERT(RW_WRITE_HELD(&zp->z_xattr_lock));
+ ASSERT(zp->z_xattr_cached);
+ ASSERT(zp->z_is_sa);
+
+ error = nvlist_size(zp->z_xattr_cached, &size, NV_ENCODE_XDR);
+ if (error)
+ goto out;
+
+ obj = sa_spill_alloc(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);
+ dmu_tx_hold_sa_create(tx, size);
+ dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_TRUE);
+
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ if (error) {
+ dmu_tx_abort(tx);
+ } else {
+ error = sa_update(zp->z_sa_hdl, SA_ZPL_DXATTR(zsb),
+ obj, size, tx);
+ if (error)
+ dmu_tx_abort(tx);
+ else
+ dmu_tx_commit(tx);
+ }
+out_free:
+ sa_spill_free(obj);
+out:
+ return (error);
+}
/*
* I'm not convinced we should do any of this upgrade.
uint64_t uid, gid, mode, rdev, xattr, parent;
uint64_t crtime[2], mtime[2], ctime[2];
zfs_acl_phys_t znode_acl;
-#ifdef HAVE_SCANSTAMP
char scanstamp[AV_SCANSTAMP_SZ];
-#endif /* HAVE_SCANSTAMP */
boolean_t drop_lock = B_FALSE;
/*
SA_ADD_BULK_ATTR(sa_attrs, count, SA_ZPL_XATTR(zsb),
NULL, &xattr, 8);
-#ifdef HAVE_SCANSTAMP
/* if scanstamp then add scanstamp */
if (zp->z_pflags & ZFS_BONUS_SCANSTAMP) {
NULL, scanstamp, AV_SCANSTAMP_SZ);
zp->z_pflags &= ~ZFS_BONUS_SCANSTAMP;
}
-#endif /* HAVE_SCANSTAMP */
VERIFY(dmu_set_bonustype(db, DMU_OT_SA, tx) == 0);
VERIFY(sa_replace_all_by_template_locked(hdl, sa_attrs,
}
}
+EXPORT_SYMBOL(zfs_attr_table);
+EXPORT_SYMBOL(zfs_sa_readlink);
+EXPORT_SYMBOL(zfs_sa_symlink);
+EXPORT_SYMBOL(zfs_sa_get_scanstamp);
+EXPORT_SYMBOL(zfs_sa_set_scanstamp);
+EXPORT_SYMBOL(zfs_sa_get_xattr);
+EXPORT_SYMBOL(zfs_sa_set_xattr);
+EXPORT_SYMBOL(zfs_sa_upgrade);
+EXPORT_SYMBOL(zfs_sa_upgrade_txholds);
+
#endif