Whamcloud - gitweb
LU-12514 utils: add "lustre_tgt" filesystem type
[fs/lustre-release.git] / lustre / utils / liblustreapi.c
index 4065574..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;
                }
@@ -1578,47 +1586,45 @@ int llapi_get_poolmembers(const char *poolname, char **members,
 int llapi_get_poollist(const char *name, char **poollist, int list_size,
                        char *buffer, int buffer_size)
 {
-       char rname[PATH_MAX];
        glob_t pathname;
        char *fsname;
-        char *ptr;
-        DIR *dir;
+       char *ptr;
+       DIR *dir;
        struct dirent *pool;
-        int rc = 0;
-        unsigned int nb_entries = 0;
-        unsigned int used = 0;
-        unsigned int i;
+       int rc = 0;
+       unsigned int nb_entries = 0;
+       unsigned int used = 0;
+       unsigned int i;
 
        /* initialize output array */
-        for (i = 0; i < list_size; i++)
-                poollist[i] = NULL;
-
-        /* is name a pathname ? */
-        ptr = strchr(name, '/');
-        if (ptr != NULL) {
-                /* only absolute pathname is supported */
-                if (*name != '/')
-                        return -EINVAL;
+       for (i = 0; i < list_size; i++)
+               poollist[i] = NULL;
 
-                if (!realpath(name, rname)) {
-                        rc = -errno;
-                        llapi_error(LLAPI_MSG_ERROR, rc, "invalid path '%s'",
-                                    name);
-                        return rc;
-                }
+       /* is name a pathname ? */
+       ptr = strchr(name, '/');
+       if (ptr != NULL) {
+               char fsname_buf[MAXNAMLEN];
+
+               /* We will need fsname for printing later */
+               rc = llapi_getname(name, fsname_buf, sizeof(fsname_buf));
+               if (rc)
+                       return rc;
+
+               ptr = strrchr(fsname_buf, '-');
+               if (ptr)
+                       *ptr = '\0';
 
-               fsname = strdup(rname);
+               fsname = strdup(fsname_buf);
                if (!fsname)
                        return -ENOMEM;
-
-               rc = poolpath(&pathname, NULL, rname);
        } else {
                /* name is FSNAME */
                fsname = strdup(name);
                if (!fsname)
                        return -ENOMEM;
-               rc = poolpath(&pathname, fsname, NULL);
        }
+
+       rc = poolpath(&pathname, fsname, NULL);
        if (rc != 0) {
                llapi_error(LLAPI_MSG_ERROR, rc,
                            "Lustre filesystem '%s' not found", name);
@@ -2701,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) {
@@ -2741,12 +2747,13 @@ static void lov_dump_user_lmm_header(struct lov_user_md *lum, char *path,
                        separator = "\n";
        }
 
-       if (verbose & VERBOSE_STRIPE_SIZE) {
+       if (((verbose & VERBOSE_STRIPE_SIZE) && !extension) ||
+           ((verbose & VERBOSE_EXT_SIZE) && extension)) {
                llapi_printf(LLAPI_MSG_NORMAL, "%s", separator);
-               if (verbose & ~VERBOSE_STRIPE_SIZE && extension)
+               if (verbose & ~VERBOSE_EXT_SIZE && extension)
                        llapi_printf(LLAPI_MSG_NORMAL, "%s%sextension_size: ",
                                     space, prefix);
-               else if (verbose & ~VERBOSE_STRIPE_SIZE)
+               if (verbose & ~VERBOSE_STRIPE_SIZE && !extension)
                        llapi_printf(LLAPI_MSG_NORMAL, "%s%sstripe_size:   ",
                                     space, prefix);
                if (is_dir && !is_raw && lum->lmm_stripe_size == 0) {
@@ -2763,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 = " ";
@@ -3182,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));
@@ -3200,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";
        }
 
@@ -3213,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";
        }
 
@@ -3498,8 +3505,15 @@ static void lov_dump_comp_v1(struct find_param *param, char *path,
                         */
                        if (entry->lcme_flags & LCME_FL_INIT)
                                continue;
-                       else
-                               break;
+
+                       if (param->fp_verbose & VERBOSE_EXT_SIZE) {
+                               if (entry->lcme_flags & LCME_FL_EXTENSION)
+                                       /* moved back below */
+                                       i++;
+                               else
+                                       continue;
+                       }
+                       break;
                }
 
                if (entry->lcme_flags & LCME_FL_INIT) {
@@ -4014,26 +4028,66 @@ 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)
                return param->fp_exclude_stripe_size ? 1 : -1;
 
+       ret = param->fp_exclude_stripe_size ? 1 : -1;
        if (v1->lmm_magic == LOV_USER_MAGIC_COMP_V1) {
                comp_v1 = (struct lov_comp_md_v1 *)v1;
                count = comp_v1->lcm_entry_count;
-               ret = param->fp_exclude_stripe_size ? 1 : -1;
        }
 
        for (i = 0; i < count; i++) {
-               if (comp_v1)
+               struct lov_comp_md_entry_v1 *ent;
+
+               if (comp_v1) {
                        v1 = lov_comp_entry(comp_v1, i);
 
-               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 */
+                       ent = &comp_v1->lcm_entries[i];
+                       if (ent->lcme_flags & LCME_FL_EXTENSION)
+                               continue;
+                       if (!(ent->lcme_flags & LCME_FL_INIT))
+                               continue;
+               }
+               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;
+}
+
+static int find_check_ext_size(struct find_param *param)
+{
+       struct lov_comp_md_v1 *comp_v1;
+       struct lov_user_md_v1 *v1;
+       int ret, i;
+
+       ret = param->fp_exclude_ext_size ? 1 : -1;
+       comp_v1 = (struct lov_comp_md_v1 *)&param->fp_lmd->lmd_lmm;
+       if (comp_v1->lcm_magic != LOV_USER_MAGIC_COMP_V1)
+               return ret;
+
+       for (i = 0; i < comp_v1->lcm_entry_count; i++) {
+               struct lov_comp_md_entry_v1 *ent;
+
+               v1 = lov_comp_entry(comp_v1, i);
+
+               ent = &comp_v1->lcm_entries[i];
+               if (!(ent->lcme_flags & LCME_FL_EXTENSION))
+                       continue;
+
+               ret = find_value_cmp(v1->lmm_stripe_size, param->fp_ext_size,
+                                    param->fp_ext_size_sign,
+                                    param->fp_exclude_ext_size,
+                                    param->fp_ext_size_units, 0);
+               /* If any ext_size matches */
                if (ret != -1)
                        break;
        }
@@ -4057,9 +4111,19 @@ static __u32 find_get_stripe_count(struct find_param *param)
        }
 
        for (i = 0; i < count; i++) {
-               if (comp_v1)
+               if (comp_v1) {
+                       struct lov_comp_md_entry_v1 *ent;
+
                        v1 = lov_comp_entry(comp_v1, i);
-               stripe_count += v1->lmm_stripe_count;
+
+                       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;
        }
 
        return stripe_count;
@@ -4308,7 +4372,7 @@ static bool find_check_lmm_info(struct find_param *param)
               param->fp_check_comp_count || param->fp_check_comp_end ||
               param->fp_check_comp_start || param->fp_check_comp_flags ||
               param->fp_check_mirror_count || param->fp_check_foreign ||
-              param->fp_check_mirror_state ||
+              param->fp_check_mirror_state || param->fp_check_ext_size ||
               param->fp_check_projid;
 }
 
@@ -4506,6 +4570,12 @@ static int cb_find_init(char *path, DIR *parent, DIR **dirp,
                        goto decided;
        }
 
+       if (param->fp_check_ext_size) {
+               decision = find_check_ext_size(param);
+               if (decision == -1)
+                       goto decided;
+       }
+
        if (param->fp_check_stripe_count) {
                decision = find_value_cmp(stripe_count, param->fp_stripe_count,
                                          param->fp_stripe_count_sign,
@@ -5272,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? */