From: Jim Rees <rees@umich.edu>
To: Benny Halevy <bhalevy@panasas.com>
Cc: linux-nfs@vger.kernel.org, Eric Anderle <eanderle@umich.edu>,
peter honeyman <honey@citi.umich.edu>
Subject: [PATCH] nfs-utils: Various bug fixes and cleanups to blkmapd
Date: Fri, 29 Oct 2010 11:36:37 -0400 [thread overview]
Message-ID: <20101029153637.GA31961@merit.edu> (raw)
Add "-d" command line option to just do discovery then exit
Restore active/passive test but ignore passive devices
Don't log EUI errors. These aren't really errors, since we'll fall back to
a different id type, or just use the file name.
Eliminate fd/pidfd confusion
use INFO syslog level instead of ERR for info messages
Signed-off-by: Jim Rees <rees@umich.edu>
---
utils/blkmapd/device-discovery.c | 87 ++++++++++++++++++++++---------------
utils/blkmapd/device-discovery.h | 2 +
utils/blkmapd/device-inq.c | 35 +++++++++++----
utils/blkmapd/device-process.c | 22 +++-------
4 files changed, 86 insertions(+), 60 deletions(-)
diff --git a/utils/blkmapd/device-discovery.c b/utils/blkmapd/device-discovery.c
index 271c7ed..0497a11 100644
--- a/utils/blkmapd/device-discovery.c
+++ b/utils/blkmapd/device-discovery.c
@@ -153,6 +153,11 @@ void bl_add_disk(char *filepath)
dev = sb.st_rdev;
serial = bldev_read_serial(fd, filepath);
+ ap_state = bldev_read_ap_state(fd);
+ close(fd);
+
+ if (ap_state == BL_PATH_STATE_PASSIVE)
+ return;
for (disk = visible_disk_list; disk != NULL; disk = disk->next) {
/* Already scanned or a partition?
@@ -165,14 +170,10 @@ void bl_add_disk(char *filepath)
}
}
- if (disk && diskpath) {
- close(fd);
+ if (disk && diskpath)
return;
- }
-
- close(fd);
- BL_LOG_ERR("%s: %s\n", __func__, filepath);
+ BL_LOG_INFO("%s: %s\n", __func__, filepath);
/*
* Not sure how to identify a pseudo device created by
@@ -180,8 +181,6 @@ void bl_add_disk(char *filepath)
*/
if (strncmp(filepath, "/dev/mapper", 11) == 0)
ap_state = BL_PATH_STATE_PSEUDO;
- else
- ap_state = BL_PATH_STATE_ACTIVE;
/* add path */
path = malloc(sizeof(struct bl_disk_path));
@@ -321,7 +320,7 @@ int bl_disk_inquiry_process(int fd)
bl_discover_devices();
if (!process_deviceinfo(buf, buflen, &major, &minor)) {
head->status = BL_DEVICE_REQUEST_ERR;
- goto out;
+ break;
}
tmp = realloc(head, sizeof(major) + sizeof(minor) +
sizeof(struct pipefs_hdr));
@@ -343,6 +342,7 @@ int bl_disk_inquiry_process(int fd)
break;
default:
head->status = BL_DEVICE_REQUEST_ERR;
+ break;
}
head->totallen = sizeof(struct pipefs_hdr) + len;
@@ -399,49 +399,61 @@ int bl_run_disk_inquiry_process(int fd)
/* Daemon */
int main(int argc, char **argv)
{
- int fd, opt, fg = 0, ret = 1;
+ int fd, pidfd = -1, opt, dflag = 0, fg = 0, ret = 1;
struct stat statbuf;
char pidbuf[64];
- while ((opt = getopt(argc, argv, "f")) != -1) {
+ while ((opt = getopt(argc, argv, "df")) != -1) {
switch (opt) {
+ case 'd':
+ dflag = 1;
+ break;
case 'f':
fg = 1;
break;
}
}
- if (!stat(PID_FILE, &statbuf)) {
- fprintf(stderr, "Pid file already existed\n");
- return -1;
- }
+ if (fg) {
+ openlog("blkmapd", LOG_PERROR, 0);
+ } else {
+ if (!stat(PID_FILE, &statbuf)) {
+ fprintf(stderr, "Pid file %s already existed\n", PID_FILE);
+ exit(1);
+ }
- if (!fg && daemon(0, 0) != 0) {
- fprintf(stderr, "Daemonize failed\n");
- return -1;
- }
+ if (daemon(0, 0) != 0) {
+ fprintf(stderr, "Daemonize failed\n");
+ exit(1);
+ }
- openlog("blkmapd", LOG_PID, 0);
- fd = open(PID_FILE, O_WRONLY | O_CREAT, 0644);
- if (fd < 0) {
- BL_LOG_ERR("Create pid file failed\n");
- return -1;
+ openlog("blkmapd", LOG_PID, 0);
+ pidfd = open(PID_FILE, O_WRONLY | O_CREAT, 0644);
+ if (pidfd < 0) {
+ BL_LOG_ERR("Create pid file %s failed\n", PID_FILE);
+ exit(1);
+ }
+
+ if (lockf(pidfd, F_TLOCK, 0) < 0) {
+ BL_LOG_ERR("Lock pid file %s failed\n", PID_FILE);
+ close(pidfd);
+ exit(1);
+ }
+ ftruncate(pidfd, 0);
+ sprintf(pidbuf, "%d\n", getpid());
+ write(pidfd, pidbuf, strlen(pidbuf));
}
- if (lockf(fd, F_TLOCK, 0) < 0) {
- BL_LOG_ERR("Lock pid file failed\n");
- close(fd);
- return -1;
+ if (dflag) {
+ bl_discover_devices();
+ exit(0);
}
- ftruncate(fd, 0);
- sprintf(pidbuf, "%d\n", getpid());
- write(fd, pidbuf, strlen(pidbuf));
/* open pipe file */
fd = open(BL_PIPE_FILE, O_RDWR);
if (fd < 0) {
- BL_LOG_ERR("open pipe file error\n");
- return -1;
+ BL_LOG_ERR("open pipe file %s error\n", BL_PIPE_FILE);
+ exit(1);
}
while (1) {
@@ -454,6 +466,11 @@ int main(int argc, char **argv)
BL_LOG_ERR("inquiry process return %d\n", ret);
}
}
- close(fd);
- return ret;
+
+ if (pidfd >= 0) {
+ close(pidfd);
+ unlink(PID_FILE);
+ }
+
+ exit(ret);
}
diff --git a/utils/blkmapd/device-discovery.h b/utils/blkmapd/device-discovery.h
index 4d12cba..8cf88b8 100644
--- a/utils/blkmapd/device-discovery.h
+++ b/utils/blkmapd/device-discovery.h
@@ -151,8 +151,10 @@ uint64_t process_deviceinfo(const char *dev_addr_buf,
extern ssize_t atomicio(ssize_t(*f) (int, void *, size_t),
int fd, void *_s, size_t n);
extern struct bl_serial *bldev_read_serial(int fd, const char *filename);
+extern enum bl_path_state_e bldev_read_ap_state(int fd);
extern int bl_discover_devices(void);
+#define BL_LOG_INFO(fmt...) syslog(LOG_INFO, fmt)
#define BL_LOG_WARNING(fmt...) syslog(LOG_WARNING, fmt)
#define BL_LOG_ERR(fmt...) syslog(LOG_ERR, fmt)
#define BL_LOG_DEBUG(fmt...) syslog(LOG_DEBUG, fmt)
diff --git a/utils/blkmapd/device-inq.c b/utils/blkmapd/device-inq.c
index c817e72..e1c0128 100644
--- a/utils/blkmapd/device-inq.c
+++ b/utils/blkmapd/device-inq.c
@@ -52,9 +52,10 @@
#define DEF_ALLOC_LEN 255
#define MX_ALLOC_LEN (0xc000 + 0x80)
-struct bl_serial *bl_create_scsi_string(int len, const char *bytes)
+static struct bl_serial *bl_create_scsi_string(int len, const char *bytes)
{
struct bl_serial *s;
+
s = malloc(sizeof(*s) + len);
if (s) {
s->data = (char *)&s[1];
@@ -64,7 +65,7 @@ struct bl_serial *bl_create_scsi_string(int len, const char *bytes)
return s;
}
-void bl_free_scsi_string(struct bl_serial *str)
+static void bl_free_scsi_string(struct bl_serial *str)
{
if (str)
free(str);
@@ -107,7 +108,7 @@ static int bldev_inquire_page(int fd, int page, char *buffer, int len)
return -1;
}
-int bldev_inquire_pages(int fd, int page, char **buffer)
+static int bldev_inquire_pages(int fd, int page, char **buffer)
{
int status = 0;
char *tmp;
@@ -149,6 +150,27 @@ int bldev_inquire_pages(int fd, int page, char **buffer)
return status;
}
+/* For EMC multipath devices, use VPD page (0xc0) to get status.
+ * For other devices, return ACTIVE for now
+ */
+extern enum bl_path_state_e bldev_read_ap_state(int fd)
+{
+ int status = 0;
+ char *buffer = NULL;
+ enum bl_path_state_e ap_state = BL_PATH_STATE_ACTIVE;
+
+ status = bldev_inquire_pages(fd, 0xc0, &buffer);
+ if (status)
+ goto out;
+
+ if (buffer[4] < 0x02)
+ ap_state = BL_PATH_STATE_PASSIVE;
+ out:
+ if (buffer)
+ free(buffer);
+ return ap_state;
+}
+
struct bl_serial *bldev_read_serial(int fd, const char *filename)
{
struct bl_serial *serial_out = NULL;
@@ -177,11 +199,8 @@ struct bl_serial *bldev_read_serial(int fd, const char *filename)
*/
case 2: /* EUI-64 based */
if ((dev_id->len != 8) && (dev_id->len != 12) &&
- (dev_id->len != 16)) {
- BL_LOG_ERR("EUI-64 only decodes 8, "
- "12 and 16\n");
+ (dev_id->len != 16))
break;
- }
case 3: /* NAA */
/* TODO: NAA validity judgement too complicated,
* so just ingore it here.
@@ -198,8 +217,6 @@ struct bl_serial *bldev_read_serial(int fd, const char *filename)
serial_out = bl_create_scsi_string(dev_id->len,
dev_id->data);
break;
- default:
- break;
}
if (current_id == 3)
break;
diff --git a/utils/blkmapd/device-process.c b/utils/blkmapd/device-process.c
index c4e72ea..51158dd 100644
--- a/utils/blkmapd/device-process.c
+++ b/utils/blkmapd/device-process.c
@@ -82,7 +82,7 @@ static int decode_blk_signature(uint32_t **pp, uint32_t *end,
* for mapping, then thrown away.
*/
sig->si_comps[i].bs_string = (char *)p;
- BL_LOG_ERR("%s: si_comps[%d]: bs_length %d, bs_string %s\n",
+ BL_LOG_INFO("%s: si_comps[%d]: bs_length %d, bs_string %s\n",
__func__, i, sig->si_comps[i].bs_length,
sig->si_comps[i].bs_string);
p += ((tmp + 3) >> 2);
@@ -126,7 +126,7 @@ read_cmp_blk_sig(const char *dev_name, struct bl_sig_comp *comp,
goto error;
}
- BL_LOG_ERR
+ BL_LOG_INFO
("%s: %s sig: %s, bs_string: %s, bs_length: %d, bs_offset: %lld\n",
__func__, dev_name, sig, comp->bs_string, comp->bs_length,
(long long)bs_offset);
@@ -155,7 +155,7 @@ static int verify_sig(struct bl_disk *disk, struct bl_sig *sig)
bs_offset = comp->bs_offset;
if (bs_offset < 0)
bs_offset += (((int64_t) disk->size) << 9);
- BL_LOG_ERR("%s: bs_offset: %lld\n",
+ BL_LOG_INFO("%s: bs_offset: %lld\n",
__func__, (long long) bs_offset);
ret = read_cmp_blk_sig(disk->valid_path->full_path,
comp, bs_offset);
@@ -180,7 +180,7 @@ static int map_sig_to_device(struct bl_sig *sig, struct bl_volume *vol)
struct bl_disk *lolDisk = disk;
while (lolDisk) {
- BL_LOG_ERR("%s: visible_disk_list: %s\n", __func__,
+ BL_LOG_INFO("%s: visible_disk_list: %s\n", __func__,
lolDisk->valid_path->full_path);
lolDisk = lolDisk->next;
}
@@ -324,16 +324,14 @@ uint64_t process_deviceinfo(const char *dev_addr_buf,
uint32_t *p, *end;
struct bl_volume *vols = NULL, **arrays = NULL, **arrays_ptr = NULL;
uint64_t dev = 0;
- int tried = 0;
- restart:
p = (uint32_t *) dev_addr_buf;
end = (uint32_t *) ((char *)p + dev_addr_len);
/* Decode block volume */
BLK_READBUF(p, end, 4);
READ32(num_vols);
if (num_vols <= 0) {
- BL_LOG_WARNING("Error: number of vols: %d\n", num_vols);
+ BL_LOG_ERR("Error: number of vols: %d\n", num_vols);
goto out_err;
}
@@ -363,15 +361,6 @@ uint64_t process_deviceinfo(const char *dev_addr_buf,
for (i = 0; i < num_vols; i++) {
vols[i].bv_vols = arrays_ptr;
status = decode_blk_volume(&p, end, vols, i, &count);
- if (status == -ENXIO && (tried <= 5)) {
- sleep(1);
- BL_LOG_DEBUG("%s: discover again!\n", __func__);
- bl_discover_devices();
- tried++;
- free(vols);
- free(arrays);
- goto restart;
- }
if (status)
goto out_err;
arrays_ptr += count;
@@ -385,6 +374,7 @@ uint64_t process_deviceinfo(const char *dev_addr_buf,
dev = dm_device_create(vols, num_vols);
*major = MAJOR(dev);
*minor = MINOR(dev);
+
out_err:
if (vols)
free(vols);
--
1.7.1
next reply other threads:[~2010-10-29 15:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-29 15:36 Jim Rees [this message]
2010-11-02 6:34 ` [PATCH] nfs-utils: Various bug fixes and cleanups to blkmapd Benny Halevy
2010-11-02 11:34 ` Jim Rees
2010-11-02 14:05 ` Jim Rees
[not found] ` <20101102140522.GA23409-8f4Pc2RrbJmHXe+LvDLADg@public.gmane.org>
2010-11-03 15:02 ` Benny Halevy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101029153637.GA31961@merit.edu \
--to=rees@umich.edu \
--cc=bhalevy@panasas.com \
--cc=eanderle@umich.edu \
--cc=honey@citi.umich.edu \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).