Whamcloud - gitweb
LU-12514 utils: add "lustre_tgt" filesystem type
[fs/lustre-release.git] / lustre / utils / liblustreapi.c
index 429b27d..9a29475 100644 (file)
@@ -69,6 +69,7 @@
 #endif
 #include <poll.h>
 #include <time.h>
+#include <inttypes.h>
 
 #include <libcfs/util/ioctl.h>
 #include <libcfs/util/param.h>
@@ -405,7 +406,7 @@ int llapi_stripe_limit_check(unsigned long long stripe_size, int stripe_offset,
                rc = -EINVAL;
                llapi_error(LLAPI_MSG_ERROR, rc, "error: bad stripe_size %llu, "
                                "must be an even multiple of %d bytes",
-                               stripe_size, page_size);
+                               (unsigned long long)stripe_size, page_size);
                goto out;
        }
        if (!llapi_stripe_index_is_valid(stripe_offset)) {
@@ -424,7 +425,7 @@ int llapi_stripe_limit_check(unsigned long long stripe_size, int stripe_offset,
                rc = -EINVAL;
                llapi_error(LLAPI_MSG_ERROR, rc,
                            "error: stripe size '%llu' over 4GB limit",
-                           stripe_size);
+                           (unsigned long long)stripe_size);
                goto out;
        }
 
@@ -741,32 +742,35 @@ int llapi_file_create_foreign(const char *name, mode_t mode, __u32 type,
        int fd, rc;
 
        if (foreign_lov == NULL) {
-               llapi_error(LLAPI_MSG_ERROR, -EINVAL,
+               rc = -EINVAL;
+               llapi_error(LLAPI_MSG_ERROR, rc,
                            "foreign LOV EA content must be provided");
-               return -EINVAL;
+               goto out_err;
        }
 
        len = strlen(foreign_lov);
        if (len > XATTR_SIZE_MAX - offsetof(struct lov_foreign_md, lfm_value) ||
            len <= 0) {
-               llapi_error(LLAPI_MSG_ERROR, -EINVAL,
+               rc = -EINVAL;
+               llapi_error(LLAPI_MSG_ERROR, rc,
                            "foreign LOV EA size %zu (must be 0 < len < %zu)",
                            len, XATTR_SIZE_MAX -
                            offsetof(struct lov_foreign_md, lfm_value));
-               return -EINVAL;
+               goto out_err;
        }
 
        lfm = malloc(len + offsetof(struct lov_foreign_md, lfm_value));
        if (lfm == NULL) {
-               llapi_error(LLAPI_MSG_ERROR, -ENOMEM,
+               rc = -ENOMEM;
+               llapi_error(LLAPI_MSG_ERROR, rc,
                            "failed to allocate lov_foreign_md");
-               return -ENOMEM;
+               goto out_err;
        }
 
        fd = open(name, O_WRONLY|O_CREAT|O_LOV_DELAY_CREATE, mode);
        if (fd == -1) {
-               perror("open()");
-               rc = -errno;
+               fd = -errno;
+               llapi_error(LLAPI_MSG_ERROR, fd, "open '%s' failed", name);
                goto out_free;
        }
 
@@ -778,21 +782,18 @@ int llapi_file_create_foreign(const char *name, mode_t mode, __u32 type,
 
        if (ioctl(fd, LL_IOC_LOV_SETSTRIPE, lfm) != 0) {
                char *errmsg = "stripe already set";
-               char fsname[MAX_OBD_NAME + 1] = { 0 };
 
                rc = -errno;
-               if (errno != EEXIST && errno != EALREADY)
+               if (errno == ENOTTY)
+                       errmsg = "not on a Lustre filesystem";
+               else if (errno == EEXIST || errno == EALREADY)
+                       errmsg = "stripe already set";
+               else
                        errmsg = strerror(errno);
 
                llapi_err_noerrno(LLAPI_MSG_ERROR,
                                  "setstripe error for '%s': %s", name, errmsg);
 
-               /* Make sure we are on a Lustre file system */
-               if (rc == -ENOTTY && llapi_search_fsname(name, fsname))
-                       llapi_error(LLAPI_MSG_ERROR, rc,
-                                   "'%s' is not on a Lustre filesystem",
-                                   name);
-
                close(fd);
                fd = rc;
        }
@@ -801,6 +802,10 @@ out_free:
        free(lfm);
 
        return fd;
+
+out_err:
+       errno = -rc;
+       return rc;
 }
 
 int llapi_file_create(const char *name, unsigned long long stripe_size,
@@ -1256,6 +1261,7 @@ int get_root_path(int want, char *fsname, int *outfd, char *path, int index)
        FILE *fp;
        int idx = 0, len = 0, mntlen, fd;
        int rc = -ENODEV;
+       int fsnamelen, mountlen;
 
         /* get the mount point */
        fp = setmntent(PROC_MOUNTS, "r");
@@ -1289,30 +1295,32 @@ int get_root_path(int want, char *fsname, int *outfd, char *path, int index)
                        ptr_end++;
 
                /* Check the fsname for a match, if given */
+               mountlen = ptr_end - ptr;
                 if (!(want & WANT_FSNAME) && fsname != NULL &&
-                   (strlen(fsname) > 0) &&
-                   (strncmp(ptr, fsname, ptr_end - ptr) != 0))
-                        continue;
+                   (fsnamelen = strlen(fsname)) > 0 &&
+                   (fsnamelen != mountlen ||
+                   (strncmp(ptr, fsname, mountlen) != 0)))
+                                       continue;
 
                 /* If the path isn't set return the first one we find */
                if (path == NULL || strlen(path) == 0) {
                        strncpy(mntdir, mnt.mnt_dir, sizeof(mntdir) - 1);
-                       mntdir[strlen(mnt.mnt_dir)] = '\0';
+                       mntdir[sizeof(mntdir) - 1] = '\0';
                        if ((want & WANT_FSNAME) && fsname != NULL) {
-                               strncpy(fsname, ptr, ptr_end - ptr);
-                               fsname[ptr_end - ptr] = '\0';
+                               strncpy(fsname, ptr, mountlen);
+                               fsname[mountlen] = '\0';
                        }
                        rc = 0;
                        break;
                /* Otherwise find the longest matching path */
                } else if ((strlen(path) >= mntlen) && (mntlen >= len) &&
                           (strncmp(mnt.mnt_dir, path, mntlen) == 0)) {
-                       strncpy(mntdir, mnt.mnt_dir, sizeof(mntdir));
-                       mntdir[strlen(mnt.mnt_dir)] = '\0';
+                       strncpy(mntdir, mnt.mnt_dir, sizeof(mntdir) - 1);
+                       mntdir[sizeof(mntdir) - 1] = '\0';
                        len = mntlen;
                        if ((want & WANT_FSNAME) && fsname != NULL) {
-                               strncpy(fsname, ptr, ptr_end - ptr);
-                               fsname[ptr_end - ptr] = '\0';
+                               strncpy(fsname, ptr, mountlen);
+                               fsname[mountlen] = '\0';
                        }
                        rc = 0;
                }
@@ -2699,10 +2707,10 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
                ver = (__u32)(lmm_oi_id(&lum->lmm_oi) >> 32);
                if (yaml)
                        llapi_printf(LLAPI_MSG_NORMAL, DFID_NOBRACE"\n",
-                                    seq, oid, ver);
+                                    (unsigned long long)seq, oid, ver);
                else
                        llapi_printf(LLAPI_MSG_NORMAL, DFID"\n",
-                                    seq, oid, ver);
+                                    (unsigned long long)seq, oid, ver);
        }
 
        if (verbose & VERBOSE_STRIPE_COUNT) {
@@ -2762,8 +2770,8 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
                        /* Extension size is in KiB */
                        llapi_printf(LLAPI_MSG_NORMAL, "%llu",
                                     extension ?
-                                    lum->lmm_stripe_size * SEL_UNIT_SIZE :
-                                    lum->lmm_stripe_size);
+                                    (unsigned long long)(lum->lmm_stripe_size * SEL_UNIT_SIZE) :
+                                    (unsigned long long)lum->lmm_stripe_size);
                }
                if (!yaml && is_dir)
                        separator = " ";
@@ -3181,7 +3189,7 @@ static void lov_dump_comp_v1_entry(struct find_param *param,
                                     "%4slcme_timestamp:      ", " ");
                if (yaml) {
                        llapi_printf(LLAPI_MSG_NORMAL, "%llu",
-                                                       entry->lcme_timestamp);
+                                    (unsigned long long)entry->lcme_timestamp);
                } else {
                        time_t stamp = entry->lcme_timestamp;
                        char *date_str = asctime(localtime(&stamp));
@@ -3199,7 +3207,7 @@ static void lov_dump_comp_v1_entry(struct find_param *param,
                        llapi_printf(LLAPI_MSG_NORMAL,
                                     "%4slcme_extent.e_start: ", " ");
                llapi_printf(LLAPI_MSG_NORMAL, "%llu",
-                            entry->lcme_extent.e_start);
+                            (unsigned long long)entry->lcme_extent.e_start);
                separator = "\n";
        }
 
@@ -3212,7 +3220,7 @@ static void lov_dump_comp_v1_entry(struct find_param *param,
                        llapi_printf(LLAPI_MSG_NORMAL, "%s", "EOF");
                else
                        llapi_printf(LLAPI_MSG_NORMAL, "%llu",
-                                       entry->lcme_extent.e_end);
+                                    (unsigned long long)entry->lcme_extent.e_end);
                separator = "\n";
        }
 
@@ -4020,6 +4028,7 @@ static int find_check_stripe_size(struct find_param *param)
 {
        struct lov_comp_md_v1 *comp_v1 = NULL;
        struct lov_user_md_v1 *v1 = &param->fp_lmd->lmd_lmm;
+       __u32 stripe_size = 0;
        int ret, i, count = 1;
 
        if (v1->lmm_magic == LOV_USER_MAGIC_FOREIGN)
@@ -4040,17 +4049,17 @@ static int find_check_stripe_size(struct find_param *param)
                        ent = &comp_v1->lcm_entries[i];
                        if (ent->lcme_flags & LCME_FL_EXTENSION)
                                continue;
+                       if (!(ent->lcme_flags & LCME_FL_INIT))
+                               continue;
                }
-
-               ret = find_value_cmp(v1->lmm_stripe_size, param->fp_stripe_size,
-                                    param->fp_stripe_size_sign,
-                                    param->fp_exclude_stripe_size,
-                                    param->fp_stripe_size_units, 0);
-               /* If any stripe_size matches */
-               if (ret != -1)
-                       break;
+               stripe_size = v1->lmm_stripe_size;
        }
 
+       ret = find_value_cmp(stripe_size, param->fp_stripe_size,
+                            param->fp_stripe_size_sign,
+                            param->fp_exclude_stripe_size,
+                            param->fp_stripe_size_units, 0);
+
        return ret;
 }
 
@@ -4108,10 +4117,13 @@ static __u32 find_get_stripe_count(struct find_param *param)
                        v1 = lov_comp_entry(comp_v1, i);
 
                        ent = &comp_v1->lcm_entries[i];
+                       if (!(ent->lcme_flags & LCME_FL_INIT))
+                               continue;
+
                        if (ent->lcme_flags & LCME_FL_EXTENSION)
                                continue;
                }
-               stripe_count += v1->lmm_stripe_count;
+               stripe_count = v1->lmm_stripe_count;
        }
 
        return stripe_count;
@@ -5330,7 +5342,7 @@ int llapi_target_check(int type_num, char **obd_type, char *dir)
 /* Is this a lustre fs? */
 int llapi_is_lustre_mnttype(const char *type)
 {
-        return (strcmp(type, "lustre") == 0 || strcmp(type,"lustre_lite") == 0);
+       return strcmp(type, "lustre") == 0 || strcmp(type, "lustre_tgt") == 0;
 }
 
 /* Is this a lustre client fs? */