Received: by 10.223.176.46 with SMTP id f43csp1569960wra; Wed, 24 Jan 2018 19:39:31 -0800 (PST) X-Google-Smtp-Source: AH8x227i9Dt8MY5oUjBbISvWI5q7GsvzFzBQiydu0IPBL0+7oTJMhEjVS2YiP9q6TPSsmgxtB5n1 X-Received: by 10.98.245.214 with SMTP id b83mr14428010pfm.85.1516851570904; Wed, 24 Jan 2018 19:39:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516851570; cv=none; d=google.com; s=arc-20160816; b=P+uqyJOKlnhmg8lmxxIcF3DBruB/iVV81VNlzCcBUB10jK09QyQR6wPpmgtChQfsiA KfVElrp2/KVC1EsuUi5bht44ceWqnK8PDifGtWYflkyS/HQ8kGekM78vFi5IwL8KtZVa LKaXnd11TrRKwocrUV8wg9QN+JOzXgy0XXvUnZceOSAHSprs4r4EHNJ02yRDP/XBgsXL OBeeQq0BLhHubU78KesP+J406DpmsQsMvdQEG4p60SfX3YOquietBDVC0dKFN8fZ58YC b8BDzn4eMPiBX6znTNcbap0tpvhVmJ3nmmfsltI+LSY+D/ygsn25MAX9I9fW2roQky8A 4V9w== 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=ZrRK5IhRoQD8nldq6+eS7WpgcJBnZkeuqlczB9FjMvLbNn2OIU8HJTlB9x6SFpo+1Z 40y59sqU1CkdxyzOAMWYku1ZwuCpESAHurQdfGt8GGEUyvsSc+j77vcAneIA/NysE+UF JKa/5dTCpHlao4n8mtwYosHojqHvN3o/r6qkkix45BOAvU8/BQmevp4LWyHV6vRIrX0f uUhQtUCmpYVZywIEwKnZuQEQTST3w1mXlAJmEwPTwzQ9WKM0e5pd5jEpdCf4ewU2DFhe GxyUAJnT1m7+ozgEofy1nG5lFyFx6+bUueMQilEIWlQdgOc/e4qMzKBKq2rpcYU6JEki GmtQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cisco.com header.s=iport header.b=MxiOBR1V; 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 g83si3911199pfd.140.2018.01.24.19.39.17; Wed, 24 Jan 2018 19:39:30 -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=MxiOBR1V; 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 S933457AbeAYDha (ORCPT + 99 others); Wed, 24 Jan 2018 22:37:30 -0500 Received: from alln-iport-3.cisco.com ([173.37.142.90]:38659 "EHLO alln-iport-3.cisco.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933348AbeAYDh0 (ORCPT ); Wed, 24 Jan 2018 22:37:26 -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=1516851446; x=1518061046; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=OyyGL/Hzsjw90GOKv/V7+fXLDW3sW7eu7PxhPKZedBM=; b=MxiOBR1VOqaBy7Nozl4/sRyOoShuRLC0NUInj439BmpnnBiEjso+XuIm oWbmayhCH1JX1w4Kb5vs+yKVyEoLPT5oQ95w573w6f9kcJXA4EasA5vUO UcIU0tkEINny1fSo7B9BC+fqf80pY22FK19ywhM0QmcJteT4UOsOlZ8fl U=; X-IronPort-AV: E=Sophos;i="5.46,409,1511827200"; d="scan'208";a="61438468" Received: from rcdn-core-6.cisco.com ([173.37.93.157]) by alln-iport-3.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 Jan 2018 03:28:01 +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 w0P3Ruiu007601 (version=TLSv1/SSLv3 cipher=AES128-SHA256 bits=128 verify=NO); Thu, 25 Jan 2018 03:28:00 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 v2 05/15] initramfs: move files creation into separate state Date: Thu, 25 Jan 2018 03:27:45 +0000 Message-Id: <1516850875-25066-6-git-send-email-takondra@cisco.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1516850875-25066-1-git-send-email-takondra@cisco.com> References: <1516850875-25066-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