Whamcloud - gitweb
LU-9771 util: rename LCM_FL_NOT_FLR to LCM_FL_NONE
[fs/lustre-release.git] / lustre / utils / liblustreapi_layout.c
index 531e083..f206c96 100644 (file)
@@ -34,6 +34,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <limits.h>
+#include <assert.h>
 #include <sys/xattr.h>
 #include <sys/param.h>
 
@@ -1538,6 +1539,20 @@ int llapi_layout_flags_set(struct llapi_layout *layout, uint32_t flags)
        return 0;
 }
 
+const char *llapi_layout_flags_string(uint32_t flags)
+{
+       switch (flags & LCM_FL_FLR_MASK) {
+       case LCM_FL_RDONLY:
+               return "ro";
+       case LCM_FL_WRITE_PENDING:
+               return "wp";
+       case LCM_FL_SYNC_PENDING:
+               return "sp";
+       }
+
+       return "0";
+}
+
 /**
  * llapi_layout_mirror_count_is_valid() - Check the validity of mirror count.
  * @count: Mirror count value to be checked.
@@ -2231,7 +2246,13 @@ bool llapi_layout_is_composite(struct llapi_layout *layout)
 /**
  * Iterate every components in the @layout and call callback function @cb.
  *
- * \param[in]
+ * \param[in] layout   component layout list.
+ * \param[in] cb       callback for each component
+ * \param[in] cbdata   callback data
+ *
+ * \retval < 0                         error happens during the iteration
+ * \retval LLAPI_LAYOUT_ITER_CONT      finished the iteration w/o error
+ * \retval LLAPI_LAYOUT_ITER_STOP      got something, stop the iteration
  */
 int llapi_layout_comp_iterate(struct llapi_layout *layout,
                              llapi_layout_iter_cb cb, void *cbdata)
@@ -2242,7 +2263,13 @@ int llapi_layout_comp_iterate(struct llapi_layout *layout,
        if (rc < 0)
                return rc;
 
-       while (rc == 0) {
+       /**
+        * make sure on success llapi_layout_comp_use() API returns 0 with
+        * USE_FIRST.
+        */
+       assert(rc == 0);
+
+       while (1) {
                rc = cb(layout, cbdata);
                if (rc != LLAPI_LAYOUT_ITER_CONT)
                        break;
@@ -2250,9 +2277,11 @@ int llapi_layout_comp_iterate(struct llapi_layout *layout,
                rc = llapi_layout_comp_use(layout, LLAPI_LAYOUT_COMP_USE_NEXT);
                if (rc < 0)
                        return rc;
+               else if (rc == 1)       /* reached the last comp */
+                       return LLAPI_LAYOUT_ITER_CONT;
        }
 
-       return rc >= 0 ? LLAPI_LAYOUT_ITER_CONT : rc;
+       return rc;
 }
 
 /**