[stgt] [PATCH] tgtd: protect socket for management IPC with lockf(3)
Hitoshi Mitake
mitake.hitoshi at gmail.com
Thu Oct 31 02:31:35 CET 2013
On Tue, Oct 29, 2013 at 11:21 AM, Hitoshi Mitake
<mitake.hitoshi at lab.ntt.co.jp> wrote:
> If two or more tgtds are launched with same control port (a number
> specified with -C option), tgtadm cannot communicate with tgtds
> because the latest tgtd cominates the socket. This behavior is
> confusing.
>
> This patch lets tgtd lock the socket with lockf(3). With this change,
> tgtd will exits when the socket of its control port is already locked.
>
> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
> ---
> usr/mgmt.c | 36 +++++++++++++++++++++++++++++-------
> usr/tgtd.c | 6 +++---
> 2 files changed, 32 insertions(+), 10 deletions(-)
ping?
>
> diff --git a/usr/mgmt.c b/usr/mgmt.c
> index c0bf7be..e795555 100644
> --- a/usr/mgmt.c
> +++ b/usr/mgmt.c
> @@ -62,8 +62,9 @@ struct mgmt_task {
>
> #define MAX_MGT_BUFSIZE (8*1024) /* limit incoming mgmt request data size */
>
> -static int ipc_fd;
> +static int ipc_fd, ipc_lock_fd;
> char mgmt_path[256];
> +char mgmt_lock_path[256];
>
> static struct mgmt_task *mtask_alloc(void);
> static void mtask_free(struct mgmt_task *mtask);
> @@ -760,13 +761,30 @@ out:
> int ipc_init(void)
> {
> extern short control_port;
> - int fd, err;
> + int fd = 0, err;
> struct sockaddr_un addr;
>
> + sprintf(mgmt_lock_path, "%s.%d.lock", TGT_IPC_NAMESPACE, control_port);
> + ipc_lock_fd = open(mgmt_lock_path, O_WRONLY | O_CREAT,
> + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
> + if (ipc_lock_fd < 0) {
> + eprintf("failed to open lock file for management IPC\n");
> + return -1;
> + }
> +
> + if (lockf(ipc_lock_fd, F_TLOCK, 1) < 0) {
> + if (errno == EACCES || errno == EAGAIN)
> + eprintf("another tgtd is using %s\n", mgmt_lock_path);
> + else
> + eprintf("unable to get lock of management IPC: %s"\
> + " (errno: %m)\n", mgmt_lock_path);
> + goto close_lock_fd;
> + }
> +
> fd = socket(AF_LOCAL, SOCK_STREAM, 0);
> if (fd < 0) {
> eprintf("can't open a socket, %m\n");
> - return -1;
> + goto close_lock_fd;
> }
>
> sprintf(mgmt_path, "%s.%d", TGT_IPC_NAMESPACE, control_port);
> @@ -778,24 +796,27 @@ int ipc_init(void)
> err = bind(fd, (struct sockaddr *) &addr, sizeof(addr));
> if (err) {
> eprintf("can't bind a socket, %m\n");
> - goto out;
> + goto close_ipc_fd;
> }
>
> err = listen(fd, 32);
> if (err) {
> eprintf("can't listen a socket, %m\n");
> - goto out;
> + goto close_ipc_fd;
> }
>
> err = tgt_event_add(fd, EPOLLIN, mgmt_event_handler, NULL);
> if (err)
> - goto out;
> + goto close_ipc_fd;
>
> ipc_fd = fd;
>
> return 0;
> -out:
> +
> +close_ipc_fd:
> close(fd);
> +close_lock_fd:
> + close(ipc_lock_fd);
> return -1;
> }
>
> @@ -803,4 +824,5 @@ void ipc_exit(void)
> {
> tgt_event_del(ipc_fd);
> close(ipc_fd);
> + close(ipc_lock_fd);
> }
> diff --git a/usr/tgtd.c b/usr/tgtd.c
> index f985510..64eff32 100644
> --- a/usr/tgtd.c
> +++ b/usr/tgtd.c
> @@ -577,11 +577,11 @@ int main(int argc, char **argv)
>
> spare_args = optind < argc ? argv[optind] : NULL;
>
> - err = ipc_init();
> - if (err)
> + if (is_daemon && daemon(0, 0))
> exit(1);
>
> - if (is_daemon && daemon(0, 0))
> + err = ipc_init();
> + if (err)
> exit(1);
>
> err = log_init(program_name, LOG_SPACE_SIZE, is_daemon, is_debug);
> --
> 1.7.10.4
>
--
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