From: Wen Congyang <wency@cn.fujitsu.com>
To: rshriram@cs.ubc.ca
Cc: Lai Jiangshan <laijs@cn.fujitsu.com>,
Ian Jackson <Ian.Jackson@eu.citrix.com>,
Jiang Yunhong <yunhong.jiang@intel.com>,
Dong Eddie <eddie.dong@intel.com>,
xen devel <xen-devel@lists.xen.org>,
Yang Hongyang <yanghy@cn.fujitsu.com>,
Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [PATCH 04/17] tools: block-remus: fix bug in tdremus_close()
Date: Mon, 20 Oct 2014 11:05:01 +0800 [thread overview]
Message-ID: <54447BDD.708@cn.fujitsu.com> (raw)
In-Reply-To: <CAP8mzPPNjjW2L-0WH6RAsNCh93v_pzQ2cLUVr8rbsit34S1CNg@mail.gmail.com>
On 10/20/2014 11:01 AM, Shriram Rajagopalan wrote:
> On Oct 13, 2014 10:15 PM, "Wen Congyang" <wency@cn.fujitsu.com> wrote:
>>
>> We close ctl_fd.fd, but we don't unregister ctl_fd.id. It will
>> cause select() return fails, and the user cannot talk with
>> tapdisk2.
>>
>> This patch also does some cleanup.
>>
>> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
>> Acked-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>
>> ---
>> tools/blktap2/drivers/block-remus.c | 90
> ++++++++++++++++++++++---------------
>> 1 file changed, 53 insertions(+), 37 deletions(-)
>>
>> diff --git a/tools/blktap2/drivers/block-remus.c
> b/tools/blktap2/drivers/block-remus.c
>> index a2c08d8..fd5f209 100644
>> --- a/tools/blktap2/drivers/block-remus.c
>> +++ b/tools/blktap2/drivers/block-remus.c
>> @@ -151,9 +151,6 @@ typedef struct poll_fd {
>> } poll_fd_t;
>>
>> struct tdremus_state {
>> -// struct tap_disk* driver;
>> - void* driver_data;
>> -
>> /* XXX: this is needed so that the server can perform operations on
>> * the driver from the stream_fd event handler. fix this. */
>> td_driver_t *tdremus_driver;
>> @@ -731,12 +728,26 @@ static int mwrite(int fd, void* buf, size_t len)
>>
>> static void inline close_stream_fd(struct tdremus_state *s)
>> {
>> + if (s->stream_fd.fd < 0)
>> + return;
>> +
>> /* XXX: -2 is magic. replace with macro perhaps? */
>> tapdisk_server_unregister_event(s->stream_fd.id);
>> close(s->stream_fd.fd);
>> s->stream_fd.fd = -2;
>> }
>>
>> +static void close_server_fd(struct tdremus_state *s)
>> +{
>> + if (s->server_fd.fd < 0)
>> + return;
>> +
>> + tapdisk_server_unregister_event(s->server_fd.id);
>> + s->server_fd.id = -1;
>> + close(s->stream_fd.fd);
>> + s->stream_fd.fd = -1;
>> +}
>> +
>> /* primary functions */
>> static void remus_client_event(event_id_t, char mode, void *private);
>> static void remus_connect_event(event_id_t id, char mode, void *private);
>> @@ -1347,12 +1358,7 @@ static int unprotected_start(td_driver_t *driver)
>> /* close the server socket */
>> close_stream_fd(s);
>>
>> - /* unregister the replication stream */
>> - tapdisk_server_unregister_event(s->server_fd.id);
>> -
>> - /* close the replication stream */
>> - close(s->server_fd.fd);
>> - s->server_fd.fd = -1;
>> + close_server_fd(s);
>>
>> /* install the unprotected read/write handlers */
>> tapdisk_remus.td_queue_read = unprotected_queue_read;
>> @@ -1553,27 +1559,27 @@ static int ctl_open(td_driver_t *driver, const
> char* name)
>> s->ctl_path[i] = '_';
>> }
>> if (asprintf(&s->msg_path, "%s.msg", s->ctl_path) < 0)
>> - goto err_ctlfifo;
>> + goto err_setmsgfifo;
>>
>> if (mkfifo(s->ctl_path, S_IRWXU|S_IRWXG|S_IRWXO) && errno !=
> EEXIST) {
>> RPRINTF("error creating control FIFO %s: %d\n",
> s->ctl_path, errno);
>> - goto err_msgfifo;
>> + goto err_mkctlfifo;
>> }
>>
>> if (mkfifo(s->msg_path, S_IRWXU|S_IRWXG|S_IRWXO) && errno !=
> EEXIST) {
>> RPRINTF("error creating message FIFO %s: %d\n",
> s->msg_path, errno);
>> - goto err_msgfifo;
>> + goto err_mkmsgfifo;
>> }
>>
>> /* RDWR so that fd doesn't block select when no writer is present
> */
>> if ((s->ctl_fd.fd = open(s->ctl_path, O_RDWR)) < 0) {
>> RPRINTF("error opening control FIFO %s: %d\n",
> s->ctl_path, errno);
>> - goto err_msgfifo;
>> + goto err_openctlfifo;
>> }
>>
>> if ((s->msg_fd.fd = open(s->msg_path, O_RDWR)) < 0) {
>> RPRINTF("error opening message FIFO %s: %d\n",
> s->msg_path, errno);
>> - goto err_openctlfifo;
>> + goto err_openmsgfifo;
>> }
>>
>> RPRINTF("control FIFO %s\n", s->ctl_path);
>> @@ -1581,36 +1587,45 @@ static int ctl_open(td_driver_t *driver, const
> char* name)
>>
>> return 0;
>>
>> - err_openctlfifo:
>> +err_openmsgfifo:
>> close(s->ctl_fd.fd);
>> - err_msgfifo:
>> + s->ctl_fd.fd = -1;
>> +err_openctlfifo:
>> + unlink(s->ctl_path);
>> +err_mkmsgfifo:
>> + unlink(s->msg_path);
>> +err_mkctlfifo:
>> free(s->msg_path);
>> s->msg_path = NULL;
>> - err_ctlfifo:
>> +err_setmsgfifo:
>> free(s->ctl_path);
>> s->ctl_path = NULL;
>> return -1;
>> }
>>
>> -static void ctl_close(td_driver_t *driver)
>> +static void ctl_close(struct tdremus_state *s)
>> {
>> - struct tdremus_state *s = (struct tdremus_state *)driver->data;
>> -
>> - /* TODO: close *all* connections */
>> -
>> - if(s->ctl_fd.fd)
>> + if(s->ctl_fd.fd) {
>> close(s->ctl_fd.fd);
>> + s->ctl_fd.fd = -1;
>> + }
>>
>> if (s->ctl_path) {
>> unlink(s->ctl_path);
>> free(s->ctl_path);
>> s->ctl_path = NULL;
>> }
>> +
>> if (s->msg_path) {
>> unlink(s->msg_path);
>> free(s->msg_path);
>> s->msg_path = NULL;
>> }
>> +
>> + if (s->msg_fd.fd) {
>> + close(s->msg_fd.fd);
>> + s->msg_fd.fd = -1;
>> + }
>> }
>>
>> static int ctl_register(struct tdremus_state *s)
>> @@ -1628,6 +1643,16 @@ static int ctl_register(struct tdremus_state *s)
>> return 0;
>> }
>>
>> +static void ctl_unregister(struct tdremus_state *s)
>> +{
>> + RPRINTF("unregistering ctl fifo\n");
>> +
>> + if (s->ctl_fd.id >= 0) {
>> + tapdisk_server_unregister_event(s->ctl_fd.id);
>> + s->ctl_fd.id = -1;
>> + }
>> +}
>> +
>> /* interface */
>>
>> static int tdremus_open(td_driver_t *driver, td_image_t *image,
> td_uuid_t uuid)
>> @@ -1658,13 +1683,12 @@ static int tdremus_open(td_driver_t *driver,
> td_image_t *image, td_uuid_t uuid)
>>
>> if ((rc = ctl_open(driver, name))) {
>> RPRINTF("error setting up control channel\n");
>> - free(s->driver_data);
>> return rc;
>> }
>>
>> if ((rc = ctl_register(s))) {
>> RPRINTF("error registering control channel\n");
>> - free(s->driver_data);
>> + ctl_close(s);
>> return rc;
>> }
>>
>> @@ -1687,19 +1711,11 @@ static int tdremus_close(td_driver_t *driver)
>> RPRINTF("closing\n");
>> if (s->ramdisk.inprogress)
>> hashtable_destroy(s->ramdisk.inprogress, 0);
>> -
>> - if (s->driver_data) {
>> - free(s->driver_data);
>> - s->driver_data = NULL;
>> - }
>> - if (s->server_fd.fd >= 0) {
>> - close(s->server_fd.fd);
>> - s->server_fd.fd = -1;
>> - }
>> - if (s->stream_fd.fd >= 0)
>> - close_stream_fd(s);
>>
>> - ctl_close(driver);
>> + close_server_fd(s);
>> + close_stream_fd(s);
>> + ctl_unregister(s);
>> + ctl_close(s);
>>
>> return 0;
>> }
>> --
>> 1.9.3
>>
>>
>>
>
> Acked-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Hmm, you have acked patch1-4...
Thanks
Wen Congyang
> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xen.org
>> http://lists.xen.org/xen-devel
>
next prev parent reply other threads:[~2014-10-20 3:05 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-14 2:13 [PATCH 00/17] blktap2 related bugfix patches Wen Congyang
2014-10-14 2:13 ` [PATCH 01/17] tools: blktap2: dynamic allocate aio_requests to avoid -EBUSY error Wen Congyang
2014-10-14 2:13 ` [PATCH 02/17] tools: block-remus: pass uuid to the callback td_open Wen Congyang
2014-10-20 2:58 ` Shriram Rajagopalan
2014-10-14 2:13 ` [PATCH 03/17] tools: block-remus: use correct way to get remus_image Wen Congyang
2014-10-20 3:02 ` Shriram Rajagopalan
2014-10-14 2:13 ` [PATCH 04/17] tools: block-remus: fix bug in tdremus_close() Wen Congyang
2014-10-20 3:01 ` Shriram Rajagopalan
2014-10-20 3:05 ` Wen Congyang [this message]
2014-10-14 2:13 ` [PATCH 05/17] tools: block-remus: fix memory leak Wen Congyang
2014-10-20 2:33 ` Shriram Rajagopalan
2014-10-14 2:13 ` [PATCH 06/17] tools: blktap2: return the correct dev path Wen Congyang
2014-10-14 2:13 ` [PATCH 07/17] tools: blktap2: use correct way to get free event id Wen Congyang
2014-10-14 2:13 ` [PATCH 08/17] tools: blktap2: don't return negative " Wen Congyang
2014-10-14 2:13 ` [PATCH 09/17] tools: blktap2: use correct way to define array Wen Congyang
2014-10-20 2:37 ` Shriram Rajagopalan
2014-10-20 2:52 ` Wen Congyang
2014-10-14 2:13 ` [PATCH 10/17] tools: block-remus: fix bug in ctl_request() Wen Congyang
2014-10-20 2:38 ` Shriram Rajagopalan
2014-10-14 2:13 ` [PATCH 11/17] tools: block-remus: clean unused functions Wen Congyang
2014-10-20 3:01 ` Shriram Rajagopalan
2014-10-14 2:14 ` [PATCH 12/17] tools: blktap2: implement an API to create a connection asynchronously Wen Congyang
2014-10-14 2:14 ` [PATCH 13/17] tools: block-remus: connect to backup asynchronously Wen Congyang
2014-10-20 2:50 ` Shriram Rajagopalan
2014-10-20 3:00 ` Wen Congyang
2014-10-20 3:11 ` Shriram Rajagopalan
2014-10-14 2:14 ` [PATCH 14/17] block-remus: switch to unprotected mode before closing Wen Congyang
2014-10-20 2:51 ` Shriram Rajagopalan
2014-10-14 2:14 ` [PATCH 15/17] tools: blktap2: move ramdisk related codes to block-replication.c Wen Congyang
2014-10-20 2:52 ` Shriram Rajagopalan
2014-10-14 2:14 ` [PATCH 16/17] support blktap remus in xl Wen Congyang
2014-10-14 2:14 ` [PATCH 17/17] HACK: libxl/remus: setup and control disk replication for blktap2 backends Wen Congyang
2014-10-20 3:00 ` Shriram Rajagopalan
2014-10-20 3:09 ` Wen Congyang
2014-10-14 15:48 ` [PATCH 00/17] blktap2 related bugfix patches Ian Jackson
2014-10-15 1:05 ` Wen Congyang
2014-10-19 20:34 ` Shriram Rajagopalan
2014-10-20 14:25 ` George Dunlap
2014-10-21 2:28 ` Wen Congyang
2014-10-21 2:56 ` Wen Congyang
2014-10-21 9:55 ` George Dunlap
2014-10-21 10:07 ` M A Young
2014-10-21 10:45 ` Bob Ball
2014-10-29 5:49 ` Wen Congyang
2014-11-03 9:58 ` George Dunlap
2014-11-03 10:07 ` Wen Congyang
2014-11-05 19:25 ` Konrad Rzeszutek Wilk
2015-02-13 6:56 ` Hongyang Yang
2015-02-14 18:40 ` George Dunlap
2014-10-27 18:32 ` Konrad Rzeszutek Wilk
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=54447BDD.708@cn.fujitsu.com \
--to=wency@cn.fujitsu.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=eddie.dong@intel.com \
--cc=ian.campbell@citrix.com \
--cc=laijs@cn.fujitsu.com \
--cc=rshriram@cs.ubc.ca \
--cc=xen-devel@lists.xen.org \
--cc=yanghy@cn.fujitsu.com \
--cc=yunhong.jiang@intel.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.