Received: by 2002:a05:6358:1087:b0:cb:c9d3:cd90 with SMTP id j7csp1943647rwi; Tue, 11 Oct 2022 02:38:07 -0700 (PDT) X-Google-Smtp-Source: AMsMyM62JUSwHlK3O0rexX1TiGArBqOd8wCh8gzA72bs1DS2+BJ8WMZ9F2j/VH1boqNLA9Dgsbty X-Received: by 2002:a17:902:d2c6:b0:17f:592b:35dd with SMTP id n6-20020a170902d2c600b0017f592b35ddmr23629521plc.172.1665481087600; Tue, 11 Oct 2022 02:38:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1665481087; cv=none; d=google.com; s=arc-20160816; b=qusToCsz8LVArfYL69rk8ltx6cRgaROc9AAlNfVOBO1XzlI9WGzV3gO4dmIW5R1yaW G+BZkUiZlhsiyvdKcsELXVxuSVCRRlzXFBXceYNfoxOdfYN7KWZpU9sbmHxcggpw+7Us BEvyoN4lVrp/omg4qm2L/flrdwZGMPmMF/DOOVwHaKyNtyGz9iLMa8t1yhvrLk/RT78g VCChELrHwpfU9mBMuqnKeS8eShPcAn+ThsO0seHjCBlvAWcv81mlFM1Pgflxt9Du7RKf uOO9KnZxO0mqDpwFandPbObOGV6bZjIGMPoAJXELb47gq/avn4zVljPZrlswPZLlM/0+ guQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:subject:cc:to:from :user-agent:mime-version:date:message-id; bh=ekS8NHGgHMWRqCiKOCgBQ2vCo//++bK7U0MFX/20oUE=; b=GM9v3xDgvn5IJDOdDnNo37bxfxF45LI8sEaAzar8gICdrM/6NTOXhfpImSh8W7iPO3 TfHoRm/DlcHjxERQucFB3e0ySdRVuE/BMDJAi25XtZaagtMw4fWD7WHAIjBTs6guJRtb z2P5Rh8S386RSjxwK0u/Fn5rPoiR93OvPA0bk9nQ0r38rcvwa2BNs2TwEkr8urR/iFb5 BbbbsXkBd4W1Dx8e/bikyY4Z/Tb5qSEqYRtApat/03p8MwAascf9I9XtnoCg6JR8cIbI eT1VYS9icCJ7ZKr1VUm0kOtgF+sJRrR2B4G3L1/oJRaYO3x1iSB18kveEHBGAipMx4Rt YfnQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a23-20020a17090a8c1700b0020055731860si13745531pjo.105.2022.10.11.02.37.43; Tue, 11 Oct 2022 02:38:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-nfs-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229461AbiJKJd3 (ORCPT + 99 others); Tue, 11 Oct 2022 05:33:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47754 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229722AbiJKJd2 (ORCPT ); Tue, 11 Oct 2022 05:33:28 -0400 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D5A6B8A7DE for ; Tue, 11 Oct 2022 02:33:25 -0700 (PDT) Received: from dggpeml500021.china.huawei.com (unknown [172.30.72.54]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4Mmr7t2Pn1zVhrt; Tue, 11 Oct 2022 17:28:58 +0800 (CST) Received: from dggpeml500016.china.huawei.com (7.185.36.70) by dggpeml500021.china.huawei.com (7.185.36.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 11 Oct 2022 17:33:23 +0800 Received: from [10.174.176.102] (10.174.176.102) by dggpeml500016.china.huawei.com (7.185.36.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 11 Oct 2022 17:33:23 +0800 Message-ID: <68672de3-9fb5-e90b-814f-850185762029@huawei.com> Date: Tue, 11 Oct 2022 17:33:22 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.3.2 From: zhanchengbin To: CC: , , linfeilong Subject: [PATCH] nfs-blkmapd: PID file read by systemd failed Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.174.176.102] X-ClientProxiedBy: dggpeml100010.china.huawei.com (7.185.36.14) To dggpeml500016.china.huawei.com (7.185.36.70) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org When started nfs-blkmap.service, the PID file can't be opened, The cause is that the child process does not create the PID file before the systemd reads the PID file. Adding "ExecStartPost=/bin/sleep 0.1" to /usr/lib/systemd/system/nfs-blkmap.service will probably solve this problem, However, there is no guarantee that the above solutions are effective under high cpu pressure.So replace the daemon function with the fork function, and put the behavior of creating the PID file in the parent process to solve the above problems. Signed-off-by: zhanchengbin Reviewed-by: Zhiqiang Liu --- utils/blkmapd/device-discovery.c | 48 +++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/utils/blkmapd/device-discovery.c b/utils/blkmapd/device-discovery.c index 2736ac89..4d97ac72 100644 --- a/utils/blkmapd/device-discovery.c +++ b/utils/blkmapd/device-discovery.c @@ -507,28 +507,44 @@ int main(int argc, char **argv) if (fg) { openlog("blkmapd", LOG_PERROR, 0); } else { - if (daemon(0, 0) != 0) { - fprintf(stderr, "Daemonize failed\n"); + pid_t pid = fork(); + if (pid < 0) { + fprintf(stderr, "fork error\n"); exit(1); + } else if (pid != 0) { + pidfd = open(PID_FILE, O_WRONLY | O_CREAT, 0644); + if (pidfd < 0) { + fprintf(stderr, "Create pid file %s failed\n", PID_FILE); + exit(1); + } + + if (lockf(pidfd, F_TLOCK, 0) < 0) { + fprintf(stderr, "Already running; Exiting!"); + close(pidfd); + exit(1); + } + if (ftruncate(pidfd, 0) < 0) + fprintf(stderr, "ftruncate on %s failed: m\n", PID_FILE); + sprintf(pidbuf, "%d\n", pid); + if (write(pidfd, pidbuf, strlen(pidbuf)) != (ssize_t)strlen(pidbuf)) + fprintf(stderr, "write on %s failed: m\n", PID_FILE); + exit(0); } - 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); + (void)setsid(); + if (chdir("/")) { + fprintf(stderr, "chdir error\n"); } + int fd = open("/dev/null", O_RDWR, 0); + if (fd >= 0) { + (void)dup2(fd, STDIN_FILENO); + (void)dup2(fd, STDOUT_FILENO); + (void)dup2(fd, STDERR_FILENO); - if (lockf(pidfd, F_TLOCK, 0) < 0) { - BL_LOG_ERR("Already running; Exiting!"); - close(pidfd); - exit(1); + (void)close(fd); } - if (ftruncate(pidfd, 0) < 0) - BL_LOG_WARNING("ftruncate on %s failed: m\n", PID_FILE); - sprintf(pidbuf, "%d\n", getpid()); - if (write(pidfd, pidbuf, strlen(pidbuf)) != (ssize_t)strlen(pidbuf)) - BL_LOG_WARNING("write on %s failed: m\n", PID_FILE); + + openlog("blkmapd", LOG_PID, 0); } signal(SIGINT, sig_die); -- 2.27.0