return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ err = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary)
fmt = BINARY;
nvme_status_to_string(err), err);
else
perror("smart log");
+
+ close_fd:
+ close(fd);
+
return err;
}
if (!cfg.file_name) {
fprintf(stderr, "Please provide an output file!\n");
- close(fd);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
output = open(cfg.file_name, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (output < 0) {
fprintf(stderr, "Failed to open output file!\n");
- return output;
+ err = output;
+ goto close_fd;
}
cfg.host_gen = !!cfg.host_gen;
nvme_status_to_string(err), err);
fprintf(stderr, "Failed to aquire telemetry header %d!\n", err);
free(hdr);
- goto close_out;
+ goto close_output;
}
err = write(output, (void *) hdr, 4096);
if (err != 4096) {
fprintf(stderr, "Failed to flush all data to file!");
- goto close_out;
+ goto free_hdr;
}
num_blocks = max(hdr->dalb1, max(hdr->dalb2, hdr->dalb3));
- free(hdr);
full_size = num_blocks * 512;
/* Round to page boundary */
full_size += (4096 - (full_size % 4096));
fprintf(stderr, "Failed to allocate %zu bytes for log\n",
full_size);
err = ENOMEM;
- goto close_out;
+ goto free_hdr;
}
while (full_size) {
fprintf(stderr, "Failed to aquire full telemetry log!\n");
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
- goto out;
+ break;
}
err = write(output, (void *) page_log, 4096);
if (err != 4096) {
fprintf(stderr, "Failed to flush all data to file!");
- goto out;
+ break;
}
full_size -= 4096;
offset += 4096;
}
- out:
+
free(page_log);
- close_out:
- close(fd);
+ free_hdr:
+ free(hdr);
+ close_output:
close(output);
+ close_fd:
+ close(fd);
return err;
}
return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ err = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary)
fmt = BINARY;
nvme_status_to_string(err), err);
else
perror("effects log page");
+
+ close_fd:
+ close(fd);
return err;
}
return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ err = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary)
fmt = BINARY;
if (!cfg.log_entries) {
fprintf(stderr, "non-zero log-entries is required param\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_identify_ctrl(fd, &ctrl);
err_log = calloc(cfg.log_entries, sizeof(struct nvme_error_log_page));
if (!err_log) {
fprintf(stderr, "could not alloc buffer for error log\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fd;
}
err = nvme_error_log(fd, cfg.log_entries, err_log);
perror("error log");
free(err_log);
}
+
+ close_fd:
+ close(fd);
return err;
}
return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ err = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary)
fmt = BINARY;
nvme_status_to_string(err), err);
else
perror("fw log");
+
+ close_fd:
+ close(fd);
return err;
}
if (!cfg.log_len) {
fprintf(stderr, "non-zero log-len is required param\n");
- return EINVAL;
+ err = EINVAL;
} else {
unsigned char *log;
log = malloc(cfg.log_len);
if (!log) {
fprintf(stderr, "could not alloc buffer for log\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_get_log13(fd, cfg.namespace_id, cfg.log_id,
else
perror("log page");
free(log);
- return err;
}
+
+ close_fd:
+ close(fd);
+ return err;
}
static int sanitize_log(int argc, char **argv, struct command *command, struct plugin *plugin)
return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ ret = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary)
fmt = BINARY;
else
perror("sanitize status log");
+ close_fd:
+ close(fd);
+
return ret;
}
free(cntlist);
+ close(fd);
+
return err;
}
nvme_status_to_string(err), err, cfg.namespace_id);
else
perror("id namespace list");
+
+ close(fd);
+
return err;
}
if (!cfg.namespace_id) {
fprintf(stderr, "%s: namespace-id parameter required\n",
cmd->name);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_ns_delete(fd, cfg.namespace_id);
nvme_status_to_string(err), err);
else
perror("delete namespace");
+
+ close_fd:
+ close(fd);
+
return err;
}
if (!cfg.namespace_id) {
fprintf(stderr, "%s: namespace-id parameter required\n",
cmd->name);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
num = argconfig_parse_comma_sep_array(cfg.cntlist,
nvme_status_to_string(err), err);
else
perror(attach ? "attach namespace" : "detach namespace");
+
+ close_fd:
+ close(fd);
+
return err;
}
nvme_status_to_string(err), err);
else
perror("create namespace");
+
+ close(fd);
+
return err;
}
membase = mmap(NULL, getpagesize(), PROT_READ, MAP_SHARED, fd, 0);
if (membase == MAP_FAILED) {
fprintf(stderr, "%s failed to map\n", base);
- return NULL;
+ membase = NULL;
}
+
+ close(fd);
return membase;
}
return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ err = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary) {
fprintf(stderr, "binary output\n");
fmt = BINARY;
else
perror("identify controller");
+ close_fd:
+ close(fd);
+
return err;
}
return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ err = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary)
fmt = BINARY;
if (!cfg.namespace_id)
if (posix_memalign(&nsdescs, getpagesize(), 0x1000)) {
fprintf(stderr, "can not allocate controller list payload\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fd;
}
err = nvme_identify_ns_descs(fd, cfg.namespace_id, nsdescs);
free(nsdescs);
+ close_fd:
+ close(fd);
+
return err;
}
return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ err = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary)
fmt = BINARY;
if (cfg.vendor_specific)
nvme_status_to_string(err), err, cfg.namespace_id);
else
perror("identify namespace");
+
+ close_fd:
+ close(fd);
+
return err;
}
nsid = nvme_get_nsid(fd);
if (nsid <= 0) {
perror(devicename);
+ close(fd);
return errno;
}
printf("%s: namespace-id:%d\n", devicename, nsid);
+
+ close(fd);
return 0;
}
if (cfg.sel > 7) {
fprintf(stderr, "invalid 'select' param:%d\n", cfg.sel);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (!cfg.feature_id) {
fprintf(stderr, "feature-id required param\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
switch (cfg.feature_id) {
if (cfg.data_len) {
if (posix_memalign(&buf, getpagesize(), cfg.data_len)) {
fprintf(stderr, "can not allocate feature payload\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fd;
}
memset(buf, 0, cfg.data_len);
}
if (buf)
free(buf);
+
+ close_fd:
+ close(fd);
+
return err;
}
cfg.offset <<= 2;
if (fw_fd < 0) {
fprintf(stderr, "no firmware file provided\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = fstat(fw_fd, &sb);
if (err < 0) {
perror("fstat");
- return errno;
+ goto close_fw_fd;
}
fw_size = sb.st_size;
if (fw_size & 0x3) {
fprintf(stderr, "Invalid size:%d for f/w image\n", fw_size);
- return EINVAL;
+ err = EINVAL;
+ goto close_fw_fd;
}
if (posix_memalign(&fw_buf, getpagesize(), fw_size)) {
fprintf(stderr, "No memory for f/w size:%d\n", fw_size);
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fw_fd;
}
if (cfg.xfer == 0 || cfg.xfer % 4096)
cfg.xfer = 4096;
- if (read(fw_fd, fw_buf, fw_size) != ((ssize_t)(fw_size)))
- return EIO;
+ if (read(fw_fd, fw_buf, fw_size) != ((ssize_t)(fw_size))) {
+ err = EIO;
+ goto free;
+ }
while (fw_size > 0) {
cfg.xfer = min(cfg.xfer, fw_size);
if (!err)
printf("Firmware download success\n");
+ free:
free(fw_buf);
+ close_fw_fd:
+ close(fw_fd);
+ close_fd:
+ close(fd);
return err;
}
if (cfg.slot > 7) {
fprintf(stderr, "invalid slot:%d\n", cfg.slot);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.action > 7 || cfg.action == 4 || cfg.action == 5) {
fprintf(stderr, "invalid action:%d\n", cfg.action);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.bpid > 1) {
fprintf(stderr, "invalid boot partition id:%d\n", cfg.bpid);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_fw_commit(fd, cfg.slot, cfg.action, cfg.bpid);
printf(" bpid:%d", cfg.bpid);
printf("\n");
}
+
+ close_fd:
+ close(fd);
+
return err;
}
err = nvme_subsystem_reset(fd);
if (err < 0) {
+ close(fd);
perror("Subsystem-reset");
return errno;
}
+
+ close(fd);
return err;
}
err = nvme_reset_controller(fd);
if (err < 0) {
+ close(fd);
perror("Reset");
return errno;
}
+
+ close(fd);
return err;
}
err = nvme_ns_rescan(fd);
if (err < 0) {
+ close(fd);
perror("Namespace Rescan");
return errno;
}
+
+ close(fd);
return err;
}
break;
default:
fprintf(stderr, "Invalid Sanitize Action\n");
- return -1;
+ ret = -1;
+ goto close_fd;
}
if (cfg.sanact != NVME_SANITIZE_ACT_EXIT && cfg.ause)
sanitize_cdw10 |= (cfg.owpass << NVME_SANITIZE_OWPASS_SHIFT);
} else {
fprintf(stderr, "owpass out of range [0-16] or sanitize action is not set to overwrite\n");
- return -1;
+ ret = -1;
+ goto close_fd;
}
if (cfg.oipbp)
sanitize_cdw10 |= NVME_SANITIZE_OIPBP;
ret = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &admin_cmd);
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
+
+ close_fd:
+ close(fd);
+
return ret;
}
bar = get_registers();
fabrics = false;
}
- if (!bar)
- return ENODEV;
+ if (!bar) {
+ err = ENODEV;
+ goto close_fd;
+ }
show_ctrl_registers(bar, cfg.human_readable ? HUMAN : 0, fabrics);
if (fabrics)
free(bar);
- return 0;
+
+ close_fd:
+ close(fd);
+
+ return err;
}
static int set_property(int argc, char **argv, struct command *cmd, struct plugin *plugin)
if (cfg.offset == -1) {
fprintf(stderr, "offset required param");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.value == -1) {
fprintf(stderr, "value required param");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_set_property(fd, cfg.offset, cfg.value);
if (err < 0) {
perror("set-property");
- return errno;
} else if (!err) {
printf("set-property: %02x (%s), value: %#08x\n", cfg.offset,
nvme_register_to_string(cfg.offset), cfg.value);
nvme_status_to_string(err), err);
}
+ close_fd:
+ close(fd);
+
return err;
}
/* ses & pi checks set to 7 for forward-compatibility */
if (cfg.ses > 7) {
fprintf(stderr, "invalid secure erase settings:%d\n", cfg.ses);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.lbaf > 15) {
fprintf(stderr, "invalid lbaf:%d\n", cfg.lbaf);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.pi > 7) {
fprintf(stderr, "invalid pi:%d\n", cfg.pi);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.pil > 1) {
fprintf(stderr, "invalid pil:%d\n", cfg.pil);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.ms > 1) {
fprintf(stderr, "invalid ms:%d\n", cfg.ms);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_format(fd, cfg.namespace_id, cfg.lbaf, cfg.ses, cfg.pi,
if (cfg.reset && S_ISCHR(nvme_stat.st_mode))
nvme_reset_controller(fd);
}
+
+ close_fd:
+ close(fd);
+
return err;
}
if (!cfg.feature_id) {
fprintf(stderr, "feature-id required param\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.feature_id == NVME_FEAT_LBA_RANGE)
cfg.data_len = 4096;
if (cfg.data_len) {
if (posix_memalign(&buf, getpagesize(), cfg.data_len)) {
fprintf(stderr, "can not allocate feature payload\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fd;
}
memset(buf, 0, cfg.data_len);
}
if (read(ffd, (void *)buf, cfg.data_len) < 0) {
fprintf(stderr, "failed to read data buffer from input file\n");
err = EINVAL;
- goto free;
+ goto close_ffd;
}
}
cfg.data_len, buf, &result);
if (err < 0) {
perror("set-feature");
- goto free;
} else if (!err) {
printf("set-feature:%02x (%s), value:%#08x\n", cfg.feature_id,
nvme_feature_to_string(cfg.feature_id), cfg.value);
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
-free:
+ close_ffd:
+ close(ffd);
+ free:
if (buf)
free(buf);
+ close_fd:
+ close(fd);
return err;
}
sec_fd = open(cfg.file, O_RDONLY);
if (sec_fd < 0) {
fprintf(stderr, "no firmware file provided\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = fstat(sec_fd, &sb);
if (err < 0) {
perror("fstat");
- return errno;
+ goto close_sec_fd;
}
sec_size = sb.st_size;
if (posix_memalign(&sec_buf, getpagesize(), sec_size)) {
fprintf(stderr, "No memory for security size:%d\n", sec_size);
- return ENOMEM;
+ err = ENOMEM;
+ goto close_sec_fd;
}
if (read(sec_fd, sec_buf, sec_size) < 0) {
else
printf("NVME Security Send Command Success:%d\n", result);
-free:
+ free:
free(sec_buf);
+ close_sec_fd:
+ close(sec_fd);
+ close_fd:
+ close(fd);
return err;
}
case NVME_DIR_SND_ID_OP_ENABLE:
if (!cfg.ttype) {
fprintf(stderr, "target-dir required param\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
dw12 = cfg.ttype << 8 | cfg.endir;
break;
default:
fprintf(stderr, "invalid directive operations for Identify Directives\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
break;
case NVME_DIR_STREAMS:
break;
default:
fprintf(stderr, "invalid directive operations for Streams Directives\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
break;
default:
fprintf(stderr, "invalid directive type\n");
- return EINVAL;
- break;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.data_len) {
- if (posix_memalign(&buf, getpagesize(), cfg.data_len))
- exit(ENOMEM);
+ if (posix_memalign(&buf, getpagesize(), cfg.data_len)) {
+ err = ENOMEM;
+ goto close_fd;
+ }
memset(buf, 0, cfg.data_len);
}
if (read(ffd, (void *)buf, cfg.data_len) < 0) {
fprintf(stderr, "failed to read data buffer from input file\n");
err = EINVAL;
- goto free;
+ goto close_ffd;
}
}
cfg.data_len, dw12, buf, &result);
if (err < 0) {
perror("dir-send");
- goto free;
+ goto close_ffd;
}
if (!err) {
printf("dir-send: type %#x, operation %#x, spec_val %#x, nsid %#x, result %#x \n",
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
-free:
+ close_ffd:
+ close(ffd);
+ free:
if (buf)
free(buf);
+ close_fd:
+ close(fd);
return err;
}
nvme_status_to_string(err), err);
else
printf("NVME Write Uncorrectable Success\n");
+
+ close(fd);
+
return err;
}
if (fd < 0)
return fd;
- if (cfg.prinfo > 0xf)
- return EINVAL;
+ if (cfg.prinfo > 0xf) {
+ err = EINVAL;
+ goto close_fd;
+ }
control |= (cfg.prinfo << 10);
if (cfg.limited_retry)
nvme_status_to_string(err), err);
else
printf("NVME Write Zeroes Success\n");
+
+ close_fd:
+ close(fd);
return err;
}
nr = max(nc, max(nb, ns));
if (!nr || nr > 256) {
fprintf(stderr, "No range definition provided\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (!cfg.namespace_id)
dsm = nvme_setup_dsm_range((__u32 *)ctx_attrs, (__u32 *)nlbs, (__u64 *)slbas, nr);
if (!dsm) {
fprintf(stderr, "failed to allocate data set payload\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fd;
}
err = nvme_dsm(fd, cfg.namespace_id, cfg.cdw11, dsm, nr);
nvme_status_to_string(err), err);
else
printf("NVMe DSM: success\n");
+
+ close_fd:
+ close(fd);
return err;
}
cfg.namespace_id = get_nsid(fd);
if (cfg.racqa > 7) {
fprintf(stderr, "invalid racqa:%d\n", cfg.racqa);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_resv_acquire(fd, cfg.namespace_id, cfg.rtype, cfg.racqa,
fprintf(stderr, "NVME IO command error:%s(%x)\n", nvme_status_to_string(err), err);
else
printf("NVME Reservation Acquire success\n");
+
+ close_fd:
+ close(fd);
return err;
}
cfg.namespace_id = get_nsid(fd);
if (cfg.cptpl > 3) {
fprintf(stderr, "invalid cptpl:%d\n", cfg.cptpl);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_resv_register(fd, cfg.namespace_id, cfg.rrega, cfg.cptpl,
fprintf(stderr, "NVME IO command error:%s(%x)\n", nvme_status_to_string(err), err);
else
printf("NVME Reservation success\n");
+
+ close_fd:
+ close(fd);
return err;
}
cfg.namespace_id = get_nsid(fd);
if (cfg.iekey > 1) {
fprintf(stderr, "invalid iekey:%d\n", cfg.iekey);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.rrela > 7) {
fprintf(stderr, "invalid rrela:%d\n", cfg.rrela);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
err = nvme_resv_release(fd, cfg.namespace_id, cfg.rtype, cfg.rrela,
fprintf(stderr, "NVME IO command error:%s(%x)\n", nvme_status_to_string(err), err);
else
printf("NVME Reservation Release success\n");
+
+ close_fd:
+ close(fd);
return err;
}
return fd;
fmt = validate_output_format(cfg.output_format);
- if (fmt < 0)
- return fmt;
+ if (fmt < 0) {
+ err = fmt;
+ goto close_fd;
+ }
if (cfg.raw_binary)
fmt = BINARY;
if (posix_memalign((void **)&status, getpagesize(), cfg.numd << 2)) {
fprintf(stderr, "No memory for resv report:%d\n", cfg.numd << 2);
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fd;
}
memset(status, 0, cfg.numd << 2);
}
}
free(status);
+
+ close_fd:
+ close(fd);
return err;
}
return fd;
dfd = mfd = opcode & 1 ? STDIN_FILENO : STDOUT_FILENO;
- if (cfg.prinfo > 0xf)
- return EINVAL;
+ if (cfg.prinfo > 0xf) {
+ err = EINVAL;
+ goto close_fd;
+ }
dsmgmt = cfg.dsmgmt;
control |= (cfg.prinfo << 10);
if (cfg.dtype > 0xf) {
fprintf(stderr, "Invalid directive type, %x\n",
cfg.dtype);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
control |= cfg.dtype << 4;
dsmgmt |= ((__u32)cfg.dspec) << 16;
dfd = open(cfg.data, flags, mode);
if (dfd < 0) {
perror(cfg.data);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
mfd = dfd;
}
mfd = open(cfg.metadata, flags, mode);
if (mfd < 0) {
perror(cfg.metadata);
- return EINVAL;
+ err = EINVAL;
+ goto close_dfd;
}
}
if (!cfg.data_size) {
fprintf(stderr, "data size not provided\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_mfd;
}
if (ioctl(fd, BLKPBSZGET, &phys_sector_size) < 0)
- return errno;
+ goto close_mfd;
buffer_size = (cfg.block_count + 1) * phys_sector_size;
if (cfg.data_size < buffer_size) {
if (posix_memalign(&buffer, getpagesize(), buffer_size)) {
fprintf(stderr, "can not allocate io payload\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto close_mfd;
}
memset(buffer, 0, cfg.data_size);
if (cfg.metadata_size) {
mbuffer = malloc(cfg.metadata_size);
if (!mbuffer) {
- free(buffer);
fprintf(stderr, "can not allocate io metadata payload\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto free_buffer;
}
}
if ((opcode & 1) && read(dfd, (void *)buffer, cfg.data_size) < 0) {
fprintf(stderr, "failed to read data buffer from input file\n");
err = EINVAL;
- goto free_and_return;
+ goto free_mbuffer;
}
if ((opcode & 1) && cfg.metadata_size &&
read(mfd, (void *)mbuffer, cfg.metadata_size) < 0) {
fprintf(stderr, "failed to read meta-data buffer from input file\n");
err = EINVAL;
- goto free_and_return;
+ goto free_mbuffer;
}
if (cfg.show) {
printf("apptag : %04x\n", cfg.app_tag);
printf("appmask : %04x\n", cfg.app_tag_mask);
if (cfg.dry_run)
- goto free_and_return;
+ goto free_mbuffer;
}
gettimeofday(&start_time, NULL);
if (!(opcode & 1) && write(dfd, (void *)buffer, cfg.data_size) < 0) {
fprintf(stderr, "failed to write buffer to output file\n");
err = EINVAL;
- goto free_and_return;
} else if (!(opcode & 1) && cfg.metadata_size &&
write(mfd, (void *)mbuffer, cfg.metadata_size) < 0) {
fprintf(stderr, "failed to write meta-data buffer to output file\n");
err = EINVAL;
- goto free_and_return;
} else
fprintf(stderr, "%s: Success\n", command);
}
- free_and_return:
- free(buffer);
+
+ free_mbuffer:
if (cfg.metadata_size)
free(mbuffer);
+ free_buffer:
+ free(buffer);
+ close_mfd:
+ if (strlen(cfg.metadata))
+ close(mfd);
+ close_dfd:
+ close(dfd);
+ close_fd:
+ close(fd);
return err;
}
if (posix_memalign(&sec_buf, getpagesize(), cfg.size)) {
fprintf(stderr, "No memory for security size:%d\n",
cfg.size);
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fd;
}
}
free(sec_buf);
+ close_fd:
+ close(fd);
return err;
}
break;
default:
fprintf(stderr, "invalid directive operations for Identify Directives\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
break;
case NVME_DIR_STREAMS:
break;
default:
fprintf(stderr, "invalid directive operations for Streams Directives\n");
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
break;
default:
fprintf(stderr, "invalid directive type\n");
- return EINVAL;
- break;
+ err = EINVAL;
+ goto close_fd;
}
if (cfg.data_len) {
- if (posix_memalign(&buf, getpagesize(), cfg.data_len))
- exit(ENOMEM);
+ if (posix_memalign(&buf, getpagesize(), cfg.data_len)) {
+ err = ENOMEM;
+ goto close_fd;
+ }
memset(buf, 0, cfg.data_len);
}
else if (err > 0)
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
-free:
- if (buf)
- free(buf);
- return err;
+ free:
+ if (cfg.data_len)
+ free(buf);
+ close_fd:
+ close(fd);
+ return err;
}
static int passthru(int argc, char **argv, int ioctl_cmd, const char *desc, struct command *cmd)
S_IRUSR | S_IRGRP | S_IROTH);
if (wfd < 0) {
perror(cfg.input_file);
- return EINVAL;
+ err = EINVAL;
+ goto close_fd;
}
}
metadata = malloc(cfg.metadata_len);
if (!metadata) {
fprintf(stderr, "can not allocate metadata payload\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto close_fd;
}
}
if (cfg.data_len) {
if (metadata)
free(metadata);
fprintf(stderr, "can not allocate data payload\n");
- return ENOMEM;
+ err = ENOMEM;
+ goto free_metadata;
}
memset(data, cfg.prefill, cfg.data_len);
if (!cfg.read && !cfg.write) {
fprintf(stderr, "data direction not given\n");
err = EINVAL;
- goto free_and_return;
+ goto free_data;
} else if (cfg.write) {
if (read(wfd, data, cfg.data_len) < 0) {
fprintf(stderr, "failed to read write buffer\n");
err = EINVAL;
- goto free_and_return;
+ goto free_data;
}
}
}
printf("cdw15 : %08x\n", cfg.cdw15);
printf("timeout_ms : %08x\n", cfg.timeout);
if (cfg.dry_run)
- goto free_and_return;
+ goto free_data;
}
err = nvme_passthru(fd, ioctl_cmd, cfg.opcode, cfg.flags, cfg.rsvd,
d_raw((unsigned char *)data, cfg.data_len);
}
-free_and_return:
- free(data);
- free(metadata);
+ free_data:
+ if (cfg.data_len)
+ free(data);
+ free_metadata:
+ if (cfg.metadata_len)
+ free(metadata);
+ close_fd:
+ close(fd);
return err;
}