X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Futils%2Fliblustreapi.c;h=9a294751e5dc5bca9096243231a1a7938e48a145;hb=510aea4a37ea26769be5946ca93a4576a1dd4095;hp=f81effb1cf309b20054c9449ed52ac3eff6e2e0f;hpb=c7cf7a5076440f68dee8f7798f46f50c94404a7e;p=fs%2Flustre-release.git diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index f81effb..9a29475 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -69,6 +69,7 @@ #endif #include #include +#include #include #include @@ -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) { @@ -2764,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 = " "; @@ -3183,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)); @@ -3201,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"; } @@ -3214,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"; } @@ -4022,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 = ¶m->fp_lmd->lmd_lmm; + __u32 stripe_size = 0; int ret, i, count = 1; if (v1->lmm_magic == LOV_USER_MAGIC_FOREIGN) @@ -4042,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; } @@ -4110,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; @@ -5332,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? */