+int __osd_sa_xattr_update(const struct lu_env *env, struct osd_object *obj,
+ struct osd_thandle *oh)
+{
+ struct lu_buf *lb = &osd_oti_get(env)->oti_xattr_lbuf;
+ struct osd_device *osd = osd_obj2dev(obj);
+ char *dxattr;
+ size_t size;
+ int rc;
+
+ obj->oo_late_xattr = 0;
+
+ /* Update the SA for additions, modifications, and removals. */
+ rc = -nvlist_size(obj->oo_sa_xattr, &size, NV_ENCODE_XDR);
+ if (rc)
+ return rc;
+
+ lu_buf_check_and_alloc(lb, size);
+ if (lb->lb_buf == NULL) {
+ CERROR("%s: can't allocate buffer for xattr update\n",
+ osd->od_svname);
+ return -ENOMEM;
+ }
+
+ dxattr = lb->lb_buf;
+ rc = -nvlist_pack(obj->oo_sa_xattr, &dxattr, &size,
+ NV_ENCODE_XDR, KM_SLEEP);
+ if (rc)
+ return rc;
+ LASSERT(dxattr == lb->lb_buf);
+
+ sa_update(obj->oo_sa_hdl, SA_ZPL_DXATTR(osd), dxattr, size, oh->ot_tx);
+
+ return 0;
+}
+