[stgt] segfault when stopping the target

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Tue Oct 21 15:27:58 CEST 2008


On Tue, 21 Oct 2008 14:15:57 +0200
Tomasz Chmielewski <mangoo at wpkg.org> wrote:

> FUJITA Tomonori schrieb:
> 
> >>>> # tgtadm --op delete --mode conn --tid 2 --sid 2 --cid 0
> >>>> Segmentation fault
> >>>>
> >>>> If a segfault does not happen immediately, start all these commands 
> >>>> again (or, generally, "tgtadm --op delete --mode conn --tid 2 --sid 1 
> >>>> --cid 0" is enough).
> >>>>
> >>>> For me, on x86, segfault happens in 90% of cases. Sometimes, the 
> >>>> connection is eventually deleted.
> > 
> > I tried the above commands three times on x86 but I can't reproduce
> > this problem.
> 
> It is easier when there is some traffic to the target.
> 
> 
> > Can you use gdb to find where tgtadm crashes?
> 
> Sure.
> Here is strace output, but it doesn't say much, does it? I'll try to get more data with gdb.
> 
> execve("/usr/sbin/tgtadm", ["tgtadm", "--op", "delete", "--mode", "conn", "--tid", "1", "--sid", "1", "--cid", "0"], [/* 20 vars */]) = 0
> uname({sys="Linux", node="megathecus", ...}) = 0
> brk(0)                                  = 0x804d000
> access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
> mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x6feee000
> access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
> open("/etc/ld.so.cache", O_RDONLY)      = 3
> fstat64(3, {st_mode=S_IFREG|0644, st_size=16095, ...}) = 0
> mmap2(NULL, 16095, PROT_READ, MAP_PRIVATE, 3, 0) = 0x6feea000
> close(3)                                = 0
> access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
> open("/lib/tls/libc.so.6", O_RDONLY)    = 3
> read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240O\1"..., 512) = 512
> fstat64(3, {st_mode=S_IFREG|0644, st_size=1245488, ...}) = 0
> mmap2(NULL, 1251484, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x6fdb8000
> mmap2(0x6fee0000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x128) = 0x6fee0000
> mmap2(0x6fee7000, 10396, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x6fee7000
> close(3)                                = 0
> mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x6fdb7000
> mprotect(0x6fee0000, 20480, PROT_READ)  = 0
> set_thread_area({entry_number:-1 -> 6, base_addr:0x6fdb78e0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0,useable:1}) = 0
> munmap(0x6feea000, 16095)               = 0
> brk(0)                                  = 0x804d000
> brk(0x8070000)                          = 0x8070000
> socket(PF_FILE, SOCK_STREAM, 0)         = 3
> connect(3, {sa_family=AF_FILE, path=@TGT_IPC_ABSTRACT_NAMESPACE}, 110) = 0
> write(3, "\4\0\0\0\1\0\0\0iscsi\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 116) = 116
> read(3, "", 8)                          = 0
> --- SIGSEGV (Segmentation fault) @ 0 (0) ---
> +++ killed by SIGSEGV +++
> Process 5131 detached

This helps?

=
From: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
Subject: [PATCH] tgtadm: handle partial response

Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
 usr/tgtadm.c |   20 ++++++++++++++++++--
 1 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/usr/tgtadm.c b/usr/tgtadm.c
index 23dbc53..c161693 100644
--- a/usr/tgtadm.c
+++ b/usr/tgtadm.c
@@ -198,13 +198,29 @@ static int ipc_mgmt_rsp(int fd)
 {
 	struct tgtadm_rsp rsp;
 	int err, rest, len;
+	char *p;
 
-	err = read(fd, &rsp, sizeof(rsp));
+	rest = sizeof(rsp);
+	p = (char *)&rsp;
+retry:
+	err = recv(fd, p, rest, MSG_WAITALL);
 	if (err < 0) {
-		eprintf("can't get the response, %m\n");
+		if (errno == EAGAIN)
+			goto retry;
+		else if (errno == EINTR)
+			eprintf("interrupted by a signal\n");
+		else
+			eprintf("can't get the response, %m\n");
+
 		return errno;
+	} else {
+		p += err;
+		rest -= err;
 	}
 
+	if (rest)
+		goto retry;
+
 	if (rsp.err != TGTADM_SUCCESS) {
 		eprintf("%s\n", tgtadm_emsg[rsp.err]);
 		return EINVAL;
-- 
1.5.6.5

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list