Пример #1
0
static void
devlist(int argc, char *argv[])
{
	struct nvme_controller_data	cdata;
	struct nvme_namespace_data	nsdata;
	struct stat			devstat;
	char				name[64], path[64];
	uint32_t			i;
	int				ch, ctrlr, exit_code, fd, found;

	exit_code = EX_OK;

	while ((ch = getopt(argc, argv, "")) != -1) {
		switch ((char)ch) {
		default:
			usage();
		}
	}

	ctrlr = -1;
	found = 0;

	while (1) {
		ctrlr++;
		sprintf(name, "nvme%d", ctrlr);
		sprintf(path, "/dev/%s", name);

		if (stat(path, &devstat) != 0)
			break;

		found++;

		fd = open(path, O_RDWR);
		if (fd < 0) {
			printf("Could not open %s. errno=%d (%s)\n", path,
			    errno, strerror(errno));
			exit_code = EX_NOPERM;
			continue;
		}

		read_controller_data(fd, &cdata);
		printf("%6s: %s\n", name, cdata.mn);

		for (i = 0; i < cdata.nn; i++) {
			sprintf(name, "nvme%dns%d", ctrlr, i+1);
			read_namespace_data(fd, i+1, &nsdata);
			printf("  %10s (%lldGB)\n",
				name,
				nsdata.nsze *
				(long long)ns_get_sector_size(&nsdata) /
				1024 / 1024 / 1024);
		}
	}

	if (found == 0)
		printf("No NVMe controllers found.\n");

	exit(exit_code);
}
Пример #2
0
void
devlist(int argc, char *argv[])
{
	struct nvm_identify_controller	cdata;
	struct nvm_identify_namespace	nsdata;
	char				name[64];
	uint8_t				mn[64];
	uint32_t			i;
	int				ch, ctrlr, fd, found, ret;

	while ((ch = getopt(argc, argv, "")) != -1) {
		switch (ch) {
		default:
			devlist_usage();
		}
	}

	ctrlr = -1;
	found = 0;

	while (1) {
		ctrlr++;
		sprintf(name, "%s%d", NVME_CTRLR_PREFIX, ctrlr);

		ret = open_dev(name, &fd, 0, 0);

		if (ret != 0) {
			if (ret == EACCES) {
				warnx("could not open "_PATH_DEV"%s\n", name);
				continue;
			} else
				break;
		}

		found++;
		read_controller_data(fd, &cdata);
		nvme_strvis(mn, sizeof(mn), cdata.mn, sizeof(cdata.mn));
		printf("%6s: %s\n", name, mn);

		for (i = 0; i < cdata.nn; i++) {
			sprintf(name, "%s%d%s%d", NVME_CTRLR_PREFIX, ctrlr,
			    NVME_NS_PREFIX, i+1);
			read_namespace_data(fd, i+1, &nsdata);
			printf("  %10s (%lldMB)\n",
				name,
				nsdata.nsze *
				(long long)ns_get_sector_size(&nsdata) /
				1024 / 1024);
		}

		close(fd);
	}

	if (found == 0)
		printf("No NVMe controllers found.\n");

	exit(1);
}
Пример #3
0
static void
identify_ns(int argc, char *argv[])
{
	struct nvme_namespace_data	nsdata;
	char				path[64];
	int				ch, fd, hexflag = 0, hexlength, nsid;
	int				verboseflag = 0;

	while ((ch = getopt(argc, argv, "vx")) != -1) {
		switch ((char)ch) {
		case 'v':
			verboseflag = 1;
			break;
		case 'x':
			hexflag = 1;
			break;
		default:
			identify_usage();
		}
	}

	/* Check that a namespace was specified. */
	if (optind >= argc)
		identify_usage();

	/*
	 * Check if the specified device node exists before continuing.
	 *  This is a cleaner check for cases where the correct controller
	 *  is specified, but an invalid namespace on that controller.
	 */
	open_dev(argv[optind], &fd, 1, 1);
	close(fd);

	/*
	 * We send IDENTIFY commands to the controller, not the namespace,
	 *  since it is an admin cmd.  The namespace ID will be specified in
	 *  the IDENTIFY command itself.  So parse the namespace's device node
	 *  string to get the controller substring and namespace ID.
	 */
	parse_ns_str(argv[optind], path, &nsid);
	open_dev(path, &fd, 1, 1);
	read_namespace_data(fd, nsid, &nsdata);
	close(fd);

	if (hexflag == 1) {
		if (verboseflag == 1)
			hexlength = sizeof(struct nvme_namespace_data);
		else
			hexlength = offsetof(struct nvme_namespace_data,
			    reserved6);
		print_hex(&nsdata, hexlength);
		exit(0);
	}

	if (verboseflag == 1) {
		fprintf(stderr, "-v not currently supported without -x\n");
		identify_usage();
	}

	print_namespace(&nsdata);
	exit(0);
}
Пример #4
0
static void
identify_ns(int argc, char *argv[])
{
	struct nvme_namespace_data	nsdata;
	struct stat			devstat;
	char				path[64];
	char				*nsloc;
	int				ch, fd, hexflag = 0, hexlength, nsid;
	int				verboseflag = 0;

	while ((ch = getopt(argc, argv, "vx")) != -1) {
		switch ((char)ch) {
		case 'v':
			verboseflag = 1;
			break;
		case 'x':
			hexflag = 1;
			break;
		default:
			usage();
		}
	}

	/*
	 * Check if the specified device node exists before continuing.
	 *  This is a cleaner check for cases where the correct controller
	 *  is specified, but an invalid namespace on that controller.
	 */
	sprintf(path, "/dev/%s", argv[optind]);
	if (stat(path, &devstat) < 0) {
		printf("Invalid device node %s. errno=%d (%s)\n", path, errno,
		    strerror(errno));
		exit(EX_IOERR);
	}

	nsloc = strstr(argv[optind], "ns");
	if (nsloc == NULL) {
		printf("Invalid namepsace %s.\n", argv[optind]);
		exit(EX_IOERR);
	}

	/*
	 * Pull the namespace id from the string. +2 skips past the "ns" part
	 *  of the string.
	 */
	nsid = strtol(nsloc + 2, NULL, 10);
	if (nsid == 0 && errno != 0) {
		printf("Invalid namespace ID %s.\n", argv[optind]);
		exit(EX_IOERR);
	}

	/*
	 * We send IDENTIFY commands to the controller, not the namespace,
	 *  since it is an admin cmd.  So the path should only include the
	 *  nvmeX part of the nvmeXnsY string.
	 */
	sprintf(path, "/dev/");
	strncat(path, argv[optind], nsloc - argv[optind]);
	if (stat(path, &devstat) < 0) {
		printf("Invalid device node %s. errno=%d (%s)\n", path, errno,
		    strerror(errno));
		exit(EX_IOERR);
	}

	fd = open(path, O_RDWR);
	if (fd < 0) {
		printf("Could not open %s. errno=%d (%s)\n", path, errno,
		    strerror(errno));
		exit(EX_NOPERM);
	}

	read_namespace_data(fd, nsid, &nsdata);

	if (hexflag == 1) {
		if (verboseflag == 1)
			hexlength = sizeof(struct nvme_namespace_data);
		else
			hexlength = offsetof(struct nvme_namespace_data,
			    reserved6);
		print_namespace_hex(&nsdata, hexlength);
		exit(EX_OK);
	}

	if (verboseflag == 1) {
		printf("-v not currently supported without -x.\n");
		usage();
	}

	print_namespace(&nsdata);
	exit(EX_OK);
}