Whamcloud - gitweb
LU-6038 osd-zfs: sa_spill_alloc()/sa_spill_free() compat
[fs/lustre-release.git] / lustre / osd-zfs / osd_xattr.c
index b20a2aa..4a32f1a 100644 (file)
 /*
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
- */
-/*
- * Copyright (c) 2012, 2013, Intel Corporation.
- * Use is subject to license terms.
+ *
+ * Copyright (c) 2012, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -91,7 +89,7 @@ int __osd_xattr_load(struct osd_device *osd, uint64_t dnode, nvlist_t **sa)
                goto out_sa;
        }
 
-       buf = sa_spill_alloc(KM_SLEEP);
+       buf = osd_zio_buf_alloc(size);
        if (buf == NULL) {
                rc = -ENOMEM;
                goto out_sa;
@@ -99,7 +97,7 @@ int __osd_xattr_load(struct osd_device *osd, uint64_t dnode, nvlist_t **sa)
        rc = -sa_lookup(sa_hdl, SA_ZPL_DXATTR(osd), buf, size);
        if (rc == 0)
                rc = -nvlist_unpack(buf, size, sa, KM_SLEEP);
-       sa_spill_free(buf);
+       osd_zio_buf_free(buf, size);
 out_sa:
        sa_handle_destroy(sa_hdl);
 
@@ -377,7 +375,7 @@ __osd_sa_xattr_update(const struct lu_env *env, struct osd_object *obj,
        if (rc)
                return rc;
 
-       dxattr = sa_spill_alloc(KM_SLEEP);
+       dxattr = osd_zio_buf_alloc(sa_size);
        if (dxattr == NULL)
                RETURN(-ENOMEM);
 
@@ -388,7 +386,7 @@ __osd_sa_xattr_update(const struct lu_env *env, struct osd_object *obj,
 
        rc = osd_object_sa_update(obj, SA_ZPL_DXATTR(osd), dxattr, sa_size, oh);
 out_free:
-       sa_spill_free(dxattr);
+       osd_zio_buf_free(dxattr, sa_size);
        RETURN(rc);
 }
 
@@ -758,10 +756,10 @@ int osd_xattr_del(const struct lu_env *env, struct dt_object *dt,
 
 static int
 osd_sa_xattr_list(const struct lu_env *env, struct osd_object *obj,
-                 struct lu_buf *lb)
+                 const struct lu_buf *lb)
 {
        nvpair_t *nvp = NULL;
-       int       len, counted = 0, remain = lb->lb_len;
+       int       len, counted = 0;
        int       rc = 0;
 
        if (obj->oo_sa_xattr == NULL) {
@@ -780,16 +778,12 @@ osd_sa_xattr_list(const struct lu_env *env, struct osd_object *obj,
                     strcmp(name, POSIX_ACL_XATTR_DEFAULT) == 0))
                        continue;
 
-               len = strlen(nvpair_name(nvp));
+               len = strlen(name);
                if (lb->lb_buf != NULL) {
-                       if (len + 1 > remain)
+                       if (counted + len + 1 > lb->lb_len)
                                return -ERANGE;
 
-                       memcpy(lb->lb_buf, name, len);
-                       lb->lb_buf += len;
-                       *((char *)lb->lb_buf) = '\0';
-                       lb->lb_buf++;
-                       remain -= len + 1;
+                       memcpy(lb->lb_buf + counted, name, len + 1);
                }
                counted += len + 1;
        }
@@ -797,13 +791,13 @@ osd_sa_xattr_list(const struct lu_env *env, struct osd_object *obj,
 }
 
 int osd_xattr_list(const struct lu_env *env, struct dt_object *dt,
-                  struct lu_buf *lb, struct lustre_capa *capa)
+                  const struct lu_buf *lb, struct lustre_capa *capa)
 {
        struct osd_object      *obj = osd_dt_obj(dt);
        struct osd_device      *osd = osd_obj2dev(obj);
        zap_attribute_t        *za = &osd_oti_get(env)->oti_za;
        zap_cursor_t           *zc;
-       int                    rc, counted = 0, remain = lb->lb_len;
+       int                    rc, counted;
        ENTRY;
 
        LASSERT(obj->oo_db != NULL);
@@ -815,8 +809,8 @@ int osd_xattr_list(const struct lu_env *env, struct dt_object *dt,
        rc = osd_sa_xattr_list(env, obj, lb);
        if (rc < 0)
                GOTO(out, rc);
+
        counted = rc;
-       remain -= counted;
 
        /* continue with dnode xattr if any */
        if (obj->oo_xattr == ZFS_NO_OBJECT)
@@ -836,14 +830,10 @@ int osd_xattr_list(const struct lu_env *env, struct dt_object *dt,
 
                rc = strlen(za->za_name);
                if (lb->lb_buf != NULL) {
-                       if (rc + 1 > remain)
+                       if (counted + rc + 1 > lb->lb_len)
                                RETURN(-ERANGE);
 
-                       memcpy(lb->lb_buf, za->za_name, rc);
-                       lb->lb_buf += rc;
-                       *((char *)lb->lb_buf) = '\0';
-                       lb->lb_buf++;
-                       remain -= rc + 1;
+                       memcpy(lb->lb_buf + counted, za->za_name, rc + 1);
                }
                counted += rc + 1;