Received: by 10.223.185.116 with SMTP id b49csp1110819wrg; Fri, 16 Feb 2018 12:40:04 -0800 (PST) X-Google-Smtp-Source: AH8x225XDYTfZ5xzuX5Xkr8qSgFLNtHOp4xL4zWHLFoynaUgXDVhBgWdSBrBSQKusY2wOZZN83Po X-Received: by 10.99.95.71 with SMTP id t68mr6042282pgb.321.1518813604351; Fri, 16 Feb 2018 12:40:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518813604; cv=none; d=google.com; s=arc-20160816; b=MIM29o8gwVfoxrZxA0PgF0pPWB/pi7qhH/cE0Fc1OWSZ/HxBsZeHH5IDRV7Ba19Sv6 jJQI8SuE37QiDOpezpVeYk1MIyPoj7SMZj+ITbq9zkw9+J3C4mEELVXdNKbCrLLRBT9n COR5nsQ/QCRSIgd4Q7Anl2q3KpaMuGO1gjCSJ9tGueVPy23+L+T9IVxAdIAwbKO8eqX3 u7u11Pi6NcMVvsLT+uWITAg9O+GsSvZRiM1LfO2JuRKJjt6PElojMVbxIfc35qWRbcgK vRSh52pCMjpSRLHfsr23CTQukcJZaky0QOIDEz+am5eX23VmlBrzQvVGu2t/jsG/OMyR /PJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=go03eOhbinrgqmKABZB3y1jic2I8dKK5OlOIBJr43vw=; b=sFOHuK2W8kiwPXj/QIH9WWW4nkfviEyr5E2/N/FR26rdsVvTSR3fn6V6zvIDI2f5yt npP7ALL4rGUtTlfwf/exMAg8iUk/wZgctE+CKPm/Cc9QKRA3/UQ2pmc4VMilby2CF1V+ zmG7ahXoXlTllljY4npDb+GinZn4KLAQv6OhVqvEbgmsDBOeMS7HOi379heTO0buD76D Zt681QZIAYgMxFSdDlGP0KZLGntSe9pn0tZuWzKZnpoO6xgbFFCTgcIDTlKpj+whFs5g uMR7H1AtsMmlXBIN3agsm14PHxFqkyed0IGTDuycy/ZRKqICNuGgvQEVxJBAcm7j7RZv PDPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cisco.com header.s=iport header.b=RGMzb9a7; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cisco.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z9si1578566pgp.675.2018.02.16.12.39.49; Fri, 16 Feb 2018 12:40:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@cisco.com header.s=iport header.b=RGMzb9a7; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cisco.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751239AbeBPUik (ORCPT + 99 others); Fri, 16 Feb 2018 15:38:40 -0500 Received: from rcdn-iport-2.cisco.com ([173.37.86.73]:35645 "EHLO rcdn-iport-2.cisco.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750928AbeBPUeB (ORCPT ); Fri, 16 Feb 2018 15:34:01 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=3410; q=dns/txt; s=iport; t=1518813240; x=1520022840; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=OyyGL/Hzsjw90GOKv/V7+fXLDW3sW7eu7PxhPKZedBM=; b=RGMzb9a7+0Mgl/QO02r+9L/yDdbYqrJS8zbWdVyntK0gjf8I+f8RjmL2 +lMC8+NgqjvVukRayoeGPgSlq125t46d7Ac9c100dL+TKfpKzrimFlG3P jfLdcdNDmXeMkvnPashXo/gur1F7zVCcUYV5SXt5Q8B9Mua/oEAt2Ylzf c=; X-IronPort-AV: E=Sophos;i="5.46,520,1511827200"; d="scan'208";a="359949663" Received: from rcdn-core-6.cisco.com ([173.37.93.157]) by rcdn-iport-2.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Feb 2018 20:33:59 +0000 Received: from sjc-ads-7132.cisco.com (sjc-ads-7132.cisco.com [10.30.217.207]) (authenticated bits=0) by rcdn-core-6.cisco.com (8.14.5/8.14.5) with ESMTP id w1GKXsMU015412 (version=TLSv1/SSLv3 cipher=AES128-SHA256 bits=128 verify=NO); Fri, 16 Feb 2018 20:33:59 GMT From: Taras Kondratiuk To: "H. Peter Anvin" , Al Viro , Arnd Bergmann , Rob Landley , Mimi Zohar , Jonathan Corbet , James McMechan Cc: initramfs@vger.kernel.org, Victor Kamensky , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-security-module@vger.kernel.org, xe-linux-external@cisco.com Subject: [PATCH v3 05/15] initramfs: move files creation into separate state Date: Fri, 16 Feb 2018 20:33:41 +0000 Message-Id: <1518813234-5874-6-git-send-email-takondra@cisco.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1518813234-5874-1-git-send-email-takondra@cisco.com> References: <1518813234-5874-1-git-send-email-takondra@cisco.com> X-Auto-Response-Suppress: DR, OOF, AutoReply X-Authenticated-User: takondra@cisco.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Move most of the file creation logic into a separate state. This splits collection of data stage from data processing and makes it easier to add additional states for a new archive format. Signed-off-by: Taras Kondratiuk --- init/initramfs.c | 52 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/init/initramfs.c b/init/initramfs.c index d0ab7ad6ac05..2d5920c094e0 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -192,6 +192,7 @@ static int __init do_collect(void); static int __init do_header(void); static int __init do_skip(void); static int __init do_name(void); +static int __init do_create(void); static int __init do_copy(void); static int __init do_symlink(void); static int __init do_reset(void); @@ -292,12 +293,12 @@ static int __init do_reset(void) return 1; } -static int __init maybe_link(void) +static int __init maybe_link(char *name) { if (nlink >= 2) { - char *old = find_link(major, minor, ino, mode, collected); + char *old = find_link(major, minor, ino, mode, name); if (old) - return (sys_link(old, collected) < 0) ? -1 : 1; + return (sys_link(old, name) < 0) ? -1 : 1; } return 0; } @@ -321,52 +322,59 @@ static void *memcpy_optional(void *dest, const void *src, size_t n) return dest; } -static __initdata int wfd; - static int __init do_name(void) { - state = do_skip; - next_state = do_reset; if (strcmp(collected, "TRAILER!!!") == 0) { + state = do_skip; + next_state = do_reset; free_hash(); return 0; } - clean_path(collected, mode); + memcpy_optional(name_buf, collected, N_ALIGN(name_len)); + state = do_create; + return 0; +} + + +static __initdata int wfd; + +static int __init do_create(void) +{ + state = do_skip; + next_state = do_reset; + clean_path(name_buf, mode); if (S_ISREG(mode)) { - int ml = maybe_link(); + int ml = maybe_link(name_buf); if (ml >= 0) { int openflags = O_WRONLY|O_CREAT; if (ml != 1) openflags |= O_TRUNC; - wfd = sys_open(collected, openflags, mode); + wfd = sys_open(name_buf, openflags, mode); if (wfd >= 0) { sys_fchown(wfd, uid, gid); sys_fchmod(wfd, mode); if (body_len) sys_ftruncate(wfd, body_len); - memcpy_optional(name_buf, collected, - N_ALIGN(name_len)); state = do_copy; } } } else if (S_ISDIR(mode)) { - sys_mkdir(collected, mode); - sys_chown(collected, uid, gid); - sys_chmod(collected, mode); - dir_add(collected, mtime); + sys_mkdir(name_buf, mode); + sys_chown(name_buf, uid, gid); + sys_chmod(name_buf, mode); + dir_add(name_buf, mtime); } else if (S_ISBLK(mode) || S_ISCHR(mode) || S_ISFIFO(mode) || S_ISSOCK(mode)) { - if (maybe_link() == 0) { - sys_mknod(collected, mode, rdev); - sys_chown(collected, uid, gid); - sys_chmod(collected, mode); - do_utime(collected, mtime); + if (maybe_link(name_buf) == 0) { + sys_mknod(name_buf, mode, rdev); + sys_chown(name_buf, uid, gid); + sys_chmod(name_buf, mode); + do_utime(name_buf, mtime); } } else if (S_ISLNK(mode)) { if (body_len > PATH_MAX) return 0; - memcpy_optional(name_buf, collected, N_ALIGN(name_len)); read_into(symlink_buf, body_len, do_symlink); } return 0; -- 2.10.3.dirty