-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;
-}
-