*
* You should have received a copy of the GNU General Public License
* version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* GPL HEADER END
*/
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2014, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <dirent.h>
#include <libcfs/util/param.h>
+#include <libcfs/util/string.h>
#include <lustre/lustreapi.h>
+#include <linux/lustre/lustre_idl.h>
#define MAX_LOV_UUID_COUNT 1000
return 0;
}
+int compare_lum(struct obd_uuid *puuid, struct lov_user_md *lum_dir,
+ struct lov_user_md *lum_file1, struct lov_user_md *lum_file2)
+{
+ struct lov_comp_md_v1 *comp_dir, *comp_file1;
+ struct lov_user_md *sub_dir, *sub_file1;
+ int i, rc = 0;
+
+ if (lum_dir == NULL || lum_dir->lmm_magic != LOV_MAGIC_COMP_V1)
+ return compare(puuid, lum_dir, lum_file1, lum_file2);
+
+ comp_dir = (struct lov_comp_md_v1 *)lum_dir;
+ comp_file1 = (struct lov_comp_md_v1 *)lum_file1;
+
+ if (lum_file1->lmm_magic != lum_dir->lmm_magic) {
+ llapi_err_noerrno(LLAPI_MSG_ERROR, "file1 magic %#x != %#x\n",
+ lum_file1->lmm_magic, lum_dir->lmm_magic);
+ return 10;
+ }
+
+ if (comp_file1->lcm_entry_count != comp_dir->lcm_entry_count) {
+ llapi_err_noerrno(LLAPI_MSG_ERROR, "file1 comp cnt %d != %d\n",
+ comp_file1->lcm_entry_count,
+ comp_dir->lcm_entry_count);
+ return 11;
+ }
+
+ for (i = 0; i < comp_dir->lcm_entry_count; i++) {
+ sub_dir = (struct lov_user_md *)((char *)comp_dir +
+ comp_dir->lcm_entries[i].lcme_offset);
+ sub_file1 = (struct lov_user_md *)((char *)comp_file1 +
+ comp_file1->lcm_entries[i].lcme_offset);
+
+ rc = compare(puuid, sub_dir, sub_file1, NULL);
+ if (rc)
+ break;
+ }
+
+ return rc;
+}
+
int main(int argc, char **argv)
{
struct lov_user_md *lum_dir, *lum_file1 = NULL, *lum_file2 = NULL;
}
rc = llapi_file_get_stripe(argv[1], lum_dir);
- if (rc) {
+ if (rc == -ENODATA) {
+ char root[PATH_MAX], path[PATH_MAX + 2];
+
+ rc = llapi_search_mounts(argv[1], 0, root, NULL);
+ if (rc) {
+ llapi_error(LLAPI_MSG_ERROR, rc, "error: can't get "
+ "root path for %s\n", argv[1]);
+ goto cleanup;
+ }
+
+ snprintf(path, sizeof(path), "%s/.", root);
+ rc = llapi_file_get_stripe(path, lum_dir);
if (rc == -ENODATA) {
free(lum_dir);
lum_dir = NULL;
- } else {
- llapi_error(LLAPI_MSG_ERROR, rc,
- "error: can't get EA for %s", argv[1]);
+ } else if (rc) {
+ llapi_error(LLAPI_MSG_ERROR, rc, "error: cant't get "
+ "root's LOVEA for %s\n", path);
goto cleanup;
}
+ } else if (rc) {
+ llapi_error(LLAPI_MSG_ERROR, rc, "error: can't get LOVEA for "
+ "%s", argv[1]);
+ goto cleanup;
}
/* XXX should be llapi_lov_getname() */
}
}
- rc = compare(&uuid, lum_dir, lum_file1, lum_file2);
+ rc = compare_lum(&uuid, lum_dir, lum_file1, lum_file2);
cleanup:
closedir(dir);