Whamcloud - gitweb
LU-6075 osd: race for check/chance od_dirent_journal
[fs/lustre-release.git] / lustre / obdclass / dt_object.c
index 460cbeb..8a7372c 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -472,35 +472,33 @@ EXPORT_SYMBOL(dt_read);
 int dt_record_read(const struct lu_env *env, struct dt_object *dt,
                    struct lu_buf *buf, loff_t *pos)
 {
-        int rc;
+       ssize_t size;
 
-        LASSERTF(dt != NULL, "dt is NULL when we want to read record\n");
+       LASSERTF(dt != NULL, "dt is NULL when we want to read record\n");
 
-        rc = dt->do_body_ops->dbo_read(env, dt, buf, pos, BYPASS_CAPA);
+       size = dt->do_body_ops->dbo_read(env, dt, buf, pos, BYPASS_CAPA);
 
-        if (rc == buf->lb_len)
-                rc = 0;
-        else if (rc >= 0)
-                rc = -EFAULT;
-        return rc;
+       if (size < 0)
+               return size;
+       return (size == (ssize_t)buf->lb_len) ? 0 : -EFAULT;
 }
 EXPORT_SYMBOL(dt_record_read);
 
 int dt_record_write(const struct lu_env *env, struct dt_object *dt,
                     const struct lu_buf *buf, loff_t *pos, struct thandle *th)
 {
-        int rc;
+       ssize_t size;
 
-        LASSERTF(dt != NULL, "dt is NULL when we want to write record\n");
-        LASSERT(th != NULL);
-        LASSERT(dt->do_body_ops);
-        LASSERT(dt->do_body_ops->dbo_write);
-        rc = dt->do_body_ops->dbo_write(env, dt, buf, pos, th, BYPASS_CAPA, 1);
-        if (rc == buf->lb_len)
-                rc = 0;
-        else if (rc >= 0)
-                rc = -EFAULT;
-        return rc;
+       LASSERTF(dt != NULL, "dt is NULL when we want to write record\n");
+       LASSERT(th != NULL);
+       LASSERT(dt->do_body_ops);
+       LASSERT(dt->do_body_ops->dbo_write);
+
+       size = dt->do_body_ops->dbo_write(env, dt, buf, pos, th, BYPASS_CAPA, 1);
+
+       if (size < 0)
+               return size;
+       return (size == (ssize_t)buf->lb_len) ? 0 : -EFAULT;
 }
 EXPORT_SYMBOL(dt_record_write);
 
@@ -666,15 +664,19 @@ static inline const struct dt_index_features *dt_index_feat_select(__u64 seq,
  * \param arg  - is a pointer to the idx_info structure
  */
 static int dt_index_page_build(const struct lu_env *env, union lu_page *lp,
-                              int nob, const struct dt_it_ops *iops,
+                              size_t nob, const struct dt_it_ops *iops,
                               struct dt_it *it, __u32 attr, void *arg)
 {
        struct idx_info         *ii = (struct idx_info *)arg;
        struct lu_idxpage       *lip = &lp->lp_idx;
        char                    *entry;
-       int                      rc, size;
+       size_t                   size;
+       int                      rc;
        ENTRY;
 
+       if (nob < LIP_HDR_SIZE)
+               return -EINVAL;
+
        /* initialize the header of the new container */
        memset(lip, 0, LIP_HDR_SIZE);
        lip->lip_magic = LIP_MAGIC;
@@ -786,7 +788,7 @@ int dt_index_walk(const struct lu_env *env, struct dt_object *obj,
 {
        struct dt_it            *it;
        const struct dt_it_ops  *iops;
-       unsigned int             pageidx, nob, nlupgs = 0;
+       size_t                   pageidx, nob, nlupgs = 0;
        int                      rc;
        ENTRY;
 
@@ -794,7 +796,7 @@ int dt_index_walk(const struct lu_env *env, struct dt_object *obj,
        LASSERT(obj->do_index_ops != NULL);
 
        nob = rdpg->rp_count;
-       if (nob <= 0)
+       if (nob == 0)
                RETURN(-EFAULT);
 
        /* Iterate through index and fill containers from @rdpg */
@@ -841,7 +843,7 @@ int dt_index_walk(const struct lu_env *env, struct dt_object *obj,
 
                /* fill lu pages */
                for (i = 0; i < LU_PAGE_COUNT; i++, lp++, nob -= LU_PAGE_SIZE) {
-                       rc = filler(env, lp, min_t(int, nob, LU_PAGE_SIZE),
+                       rc = filler(env, lp, min_t(size_t, nob, LU_PAGE_SIZE),
                                    iops, it, rdpg->rp_attrs, arg);
                        if (rc < 0)
                                break;
@@ -859,7 +861,7 @@ out:
        iops->fini(env, it);
 
        if (rc >= 0)
-               rc = min_t(unsigned int, nlupgs * LU_PAGE_SIZE, rdpg->rp_count);
+               rc = min_t(size_t, nlupgs * LU_PAGE_SIZE, rdpg->rp_count);
 
        RETURN(rc);
 }