From patchwork Thu Sep 19 15:21:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paulo Alcantara X-Patchwork-Id: 1164729 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=cjr.nz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=cjr.nz header.i=@cjr.nz header.b="eDALsFLb"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46Z1682MvJz9sNk for ; Fri, 20 Sep 2019 01:31:28 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391297AbfISPbY (ORCPT ); Thu, 19 Sep 2019 11:31:24 -0400 Received: from mx.cjr.nz ([51.158.111.142]:37450 "EHLO mx.cjr.nz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391251AbfISPbR (ORCPT ); Thu, 19 Sep 2019 11:31:17 -0400 X-Greylist: delayed 588 seconds by postgrey-1.27 at vger.kernel.org; Thu, 19 Sep 2019 11:31:14 EDT Received: from authenticated-user (mx.cjr.nz [51.158.111.142]) (Authenticated sender: pc) by mx.cjr.nz (Postfix) with ESMTPSA id 62CE5810ED; Thu, 19 Sep 2019 15:21:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cjr.nz; s=dkim; t=1568906484; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bqBW/6HCxHbOBX6UDF4RraSrWtlbtoyENDx4W6h26Kg=; b=eDALsFLbAo9CuvAL6iYqBxDnPZQ5yxZuGMFlzDm81QqgfMb0+AqMXKB57oHX9hbUCVND4I +oMR0Y/rj7fO+FVRvQ/hlADpHYEqJ+EA984Xk1mlAeDtNKO/hbs+pwaaPcNnA/c89KzPou PCRlWN/zd0DsV4GCgvtH9HfrV87DSFRV2JN60L1ARXdcfYF9sCEnMhGZ7gyGd+U/ibLcsU KCRjC0lRHSotu7vUr9gdNttsWeUumM6tACJxx+VsulKAgyEr/Y3bxwVIveUaljjiwcvYe3 KMYnOywW1scfol5T/kiRoYfOuNUCKmUU04sFUWjdUNb4ktGwg41TESwBmNcXsQ== From: "Paulo Alcantara (SUSE)" To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: "Paulo Alcantara (SUSE)" , Aurelien Aptel Subject: [PATCH v2 1/3] cifs: Add support for root file systems Date: Thu, 19 Sep 2019 12:21:14 -0300 Message-Id: <20190919152116.27076-1-pc@cjr.nz> In-Reply-To: <20190716220452.3382-1-paulo@paulo.ac> References: <20190716220452.3382-1-paulo@paulo.ac> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=cjr.nz; s=dkim; t=1568906484; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bqBW/6HCxHbOBX6UDF4RraSrWtlbtoyENDx4W6h26Kg=; b=DmcqcYhEsHjSAYpnAcK1PahDzeulb5DnK2pA2FSoZzoiSFxw3ffmYHrkGUBASJYE9q9iWJ xPD0BUTLnObSoybZPiknpiqHhVuSUiVwrhvrqshMofZaambb5W+BEyDZwuVt+iy9IL90uV FZQMC6xvD7WOhy5D5m/hRjLu7jtel4vfWGrtTt9WTJ8XOsUJvbu5umgP3TTkSXoigvky3Y wGEG7oE0DrnOc14WXayZu8EMtDknr6cZTr8r9BSUMRr0MpmW6+SB6AyExyzv1ogUUje6oe 6ZQUjT2LCuvGAE8wpsQBpnMI8s5ogm3JLJkKVA/TxXuWdUKxSoyQeBkUmSOG0g== ARC-Seal: i=1; s=dkim; d=cjr.nz; t=1568906484; a=rsa-sha256; cv=none; b=oxoOiCUmVmK+tImSDrJlhmULbGkVNtjuNKm1JlIbr7TMuEyDVjbhmcRvRcMyfoI8dMhdyu JI1psD58zgNgG2AMjMn38RRCC2QLlUNedNEWuj0C9cXdYdnxAREfvB+XGWxUBIAR89xXcQ nEIMMdO53DNI/yBmt8PhKvMf7wC68DlVs8sw/KU3MEsMnhdzJHa9R7FrC6tQDovScbAMKc zHp2He8jJ8mvZOntPH4UfHI8dMTQJd/Yg51vCu+xCJPMZieZt0zCiJYl8Tu4UDFPMzjqr1 UtpMsI5IeuQWQSr4M146LnEiJBRyBE5I5A5GmOgxRvfL2QJjFIasMqo/2kWABw== ARC-Authentication-Results: i=1; mx.cjr.nz; auth=pass smtp.auth=pc smtp.mailfrom=pc@cjr.nz Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Introduce a new CONFIG_CIFS_ROOT option to handle root file systems over a SMB share. In order to mount the root file system during the init process, make cifs.ko perform non-blocking socket operations while mounting and accessing it. Signed-off-by: Paulo Alcantara (SUSE) Signed-off-by: Aurelien Aptel --- Documentation/filesystems/cifs/cifsroot.txt | 97 +++++++++++++++++++++ fs/cifs/Kconfig | 8 ++ fs/cifs/Makefile | 2 + fs/cifs/cifsglob.h | 2 + fs/cifs/cifsroot.c | 94 ++++++++++++++++++++ fs/cifs/connect.c | 17 +++- include/linux/root_dev.h | 1 + 7 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 Documentation/filesystems/cifs/cifsroot.txt create mode 100644 fs/cifs/cifsroot.c diff --git a/Documentation/filesystems/cifs/cifsroot.txt b/Documentation/filesystems/cifs/cifsroot.txt new file mode 100644 index 000000000000..0fa1a2c36a40 --- /dev/null +++ b/Documentation/filesystems/cifs/cifsroot.txt @@ -0,0 +1,97 @@ +Mounting root file system via SMB (cifs.ko) +=========================================== + +Written 2019 by Paulo Alcantara +Written 2019 by Aurelien Aptel + +The CONFIG_CIFS_ROOT option enables experimental root file system +support over the SMB protocol via cifs.ko. + +It introduces a new kernel command-line option called 'cifsroot=' +which will tell the kernel to mount the root file system over the +network by utilizing SMB or CIFS protocol. + +In order to mount, the network stack will also need to be set up by +using 'ip=' config option. For more details, see +Documentation/filesystems/nfs/nfsroot.txt. + +A CIFS root mount currently requires the use of SMB1+UNIX Extensions +which is only supported by the Samba server. SMB1 is the older +deprecated version of the protocol but it has been extended to support +POSIX features (See [1]). The equivalent extensions for the newer +recommended version of the protocol (SMB3) have not been fully +implemented yet which means SMB3 doesn't support some required POSIX +file system objects (e.g. block devices, pipes, sockets). + +As a result, a CIFS root will default to SMB1 for now but the version +to use can nonetheless be changed via the 'vers=' mount option. This +default will change once the SMB3 POSIX extensions are fully +implemented. + +Server configuration +==================== + +To enable SMB1+UNIX extensions you will need to set these global +settings in Samba smb.conf: + + [global] + server min protocol = NT1 + unix extension = yes # default + +Kernel command line +=================== + +root=/dev/cifs + +This is just a virtual device that basically tells the kernel to mount +the root file system via SMB protocol. + +cifsroot=///[,options] + +Enables the kernel to mount the root file system via SMB that are +located in the and specified in this option. + +The default mount options are set in fs/cifs/cifsroot.c. + +server-ip + IPv4 address of the server. + +share + Path to SMB share (rootfs). + +options + Optional mount options. For more information, see mount.cifs(8). + +Examples +======== + +Export root file system as a Samba share in smb.conf file. + +... +[linux] + path = /path/to/rootfs + read only = no + guest ok = yes + force user = root + force group = root + browseable = yes + writeable = yes + admin users = root + public = yes + create mask = 0777 + directory mask = 0777 +... + +Restart smb service. + +# systemctl restart smb + +Test it under QEMU on a kernel built with CONFIG_CIFS_ROOT and +CONFIG_IP_PNP options enabled. + +# qemu-system-x86_64 -enable-kvm -cpu host -m 1024 \ + -kernel /path/to/linux/arch/x86/boot/bzImage -nographic \ + -append "root=/dev/cifs rw ip=dhcp cifsroot=//10.0.2.2/linux,username=foo,password=bar console=ttyS0 3" + + +1: https://wiki.samba.org/index.php/UNIX_Extensions diff --git a/fs/cifs/Kconfig b/fs/cifs/Kconfig index 350bc3061656..22cf04fb32d3 100644 --- a/fs/cifs/Kconfig +++ b/fs/cifs/Kconfig @@ -211,3 +211,11 @@ config CIFS_FSCACHE Makes CIFS FS-Cache capable. Say Y here if you want your CIFS data to be cached locally on disk through the general filesystem cache manager. If unsure, say N. + +config CIFS_ROOT + bool "SMB root file system (Experimental)" + depends on CIFS=y && IP_PNP + help + Enables root file system support over SMB protocol. + + Most people say N here. diff --git a/fs/cifs/Makefile b/fs/cifs/Makefile index 41332f20055b..51bae9340842 100644 --- a/fs/cifs/Makefile +++ b/fs/cifs/Makefile @@ -21,3 +21,5 @@ cifs-$(CONFIG_CIFS_DFS_UPCALL) += dns_resolve.o cifs_dfs_ref.o dfs_cache.o cifs-$(CONFIG_CIFS_FSCACHE) += fscache.o cache.o cifs-$(CONFIG_CIFS_SMB_DIRECT) += smbdirect.o + +cifs-$(CONFIG_CIFS_ROOT) += cifsroot.o diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index fe610e7e3670..08c19e134f76 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h @@ -602,6 +602,7 @@ struct smb_vol { __u32 handle_timeout; /* persistent and durable handle timeout in ms */ unsigned int max_credits; /* smb3 max_credits 10 < credits < 60000 */ __u16 compression; /* compression algorithm 0xFFFF default 0=disabled */ + bool rootfs:1; /* if it's a SMB root file system */ }; /** @@ -755,6 +756,7 @@ struct TCP_Server_Info { * reconnect. */ int nr_targets; + bool noblockcnt; /* use non-blocking connect() */ }; struct cifs_credits { diff --git a/fs/cifs/cifsroot.c b/fs/cifs/cifsroot.c new file mode 100644 index 000000000000..37edbfb8e096 --- /dev/null +++ b/fs/cifs/cifsroot.c @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * SMB root file system support + * + * Copyright (c) 2019 Paulo Alcantara + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DEFAULT_MNT_OPTS \ + "vers=1.0,cifsacl,mfsymlinks,rsize=1048576,wsize=65536,uid=0,gid=0," \ + "hard,rootfs" + +static char root_dev[2048] __initdata = ""; +static char root_opts[1024] __initdata = DEFAULT_MNT_OPTS; + +static __be32 __init parse_srvaddr(char *start, char *end) +{ + /* TODO: ipv6 support */ + char addr[sizeof("aaa.bbb.ccc.ddd")]; + int i = 0; + + while (start < end && i < sizeof(addr) - 1) { + if (isdigit(*start) || *start == '.') + addr[i++] = *start; + start++; + } + addr[i] = '\0'; + return in_aton(addr); +} + +/* cifsroot=///[,options] */ +static int __init cifs_root_setup(char *line) +{ + char *s; + int len; + __be32 srvaddr = htonl(INADDR_NONE); + + ROOT_DEV = Root_CIFS; + + if (strlen(line) > 3 && line[0] == '/' && line[1] == '/') { + s = strchr(&line[2], '/'); + if (!s || s[1] == '\0') + return 1; + + /* make s point to ',' or '\0' at end of line */ + s = strchrnul(s, ','); + /* len is strlen(unc) + '\0' */ + len = s - line + 1; + if (len > sizeof(root_dev)) { + printk(KERN_ERR "Root-CIFS: UNC path too long\n"); + return 1; + } + strlcpy(root_dev, line, len); + srvaddr = parse_srvaddr(&line[2], s); + if (*s) { + int n = snprintf(root_opts, + sizeof(root_opts), "%s,%s", + DEFAULT_MNT_OPTS, s + 1); + if (n >= sizeof(root_opts)) { + printk(KERN_ERR "Root-CIFS: mount options string too long\n"); + root_opts[sizeof(root_opts)-1] = '\0'; + return 1; + } + } + } + + root_server_addr = srvaddr; + + return 1; +} + +__setup("cifsroot=", cifs_root_setup); + +int __init cifs_root_data(char **dev, char **opts) +{ + if (!root_dev[0] || root_server_addr == htonl(INADDR_NONE)) { + printk(KERN_ERR "Root-CIFS: no SMB server address\n"); + return -1; + } + + *dev = root_dev; + *opts = root_opts; + + return 0; +} diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 5299effa6f7d..d1c7b128df53 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -96,7 +96,7 @@ enum { Opt_multiuser, Opt_sloppy, Opt_nosharesock, Opt_persistent, Opt_nopersistent, Opt_resilient, Opt_noresilient, - Opt_domainauto, Opt_rdma, Opt_modesid, + Opt_domainauto, Opt_rdma, Opt_modesid, Opt_rootfs, Opt_compress, /* Mount options which take numeric value */ @@ -262,6 +262,7 @@ static const match_table_t cifs_mount_option_tokens = { { Opt_ignore, "nomand" }, { Opt_ignore, "relatime" }, { Opt_ignore, "_netdev" }, + { Opt_rootfs, "rootfs" }, { Opt_err, NULL } }; @@ -1748,6 +1749,11 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, case Opt_nodfs: vol->nodfs = 1; break; + case Opt_rootfs: +#ifdef CONFIG_CIFS_ROOT + vol->rootfs = true; +#endif + break; case Opt_posixpaths: vol->posix_paths = 1; break; @@ -2681,7 +2687,8 @@ cifs_get_tcp_session(struct smb_vol *volume_info) goto out_err_crypto_release; } - tcp_ses->noblocksnd = volume_info->noblocksnd; + tcp_ses->noblockcnt = volume_info->rootfs; + tcp_ses->noblocksnd = volume_info->noblocksnd || volume_info->rootfs; tcp_ses->noautotune = volume_info->noautotune; tcp_ses->tcp_nodelay = volume_info->sockopt_tcp_nodelay; tcp_ses->rdma = volume_info->rdma; @@ -3814,7 +3821,11 @@ generic_ip_connect(struct TCP_Server_Info *server) socket->sk->sk_sndbuf, socket->sk->sk_rcvbuf, socket->sk->sk_rcvtimeo); - rc = socket->ops->connect(socket, saddr, slen, 0); + rc = socket->ops->connect(socket, saddr, slen, + server->noblockcnt ? O_NONBLOCK : 0); + + if (rc == -EINPROGRESS) + rc = 0; if (rc < 0) { cifs_dbg(FYI, "Error %d connecting to server\n", rc); sock_release(socket); diff --git a/include/linux/root_dev.h b/include/linux/root_dev.h index bab671b0782f..4e78651371ba 100644 --- a/include/linux/root_dev.h +++ b/include/linux/root_dev.h @@ -8,6 +8,7 @@ enum { Root_NFS = MKDEV(UNNAMED_MAJOR, 255), + Root_CIFS = MKDEV(UNNAMED_MAJOR, 254), Root_RAM0 = MKDEV(RAMDISK_MAJOR, 0), Root_RAM1 = MKDEV(RAMDISK_MAJOR, 1), Root_FD0 = MKDEV(FLOPPY_MAJOR, 0), From patchwork Thu Sep 19 15:21:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paulo Alcantara X-Patchwork-Id: 1164730 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=cjr.nz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=cjr.nz header.i=@cjr.nz header.b="nXaB8slR"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46Z16C2d2Pz9sNk for ; Fri, 20 Sep 2019 01:31:31 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391265AbfISPbR (ORCPT ); Thu, 19 Sep 2019 11:31:17 -0400 Received: from mx.cjr.nz ([51.158.111.142]:37444 "EHLO mx.cjr.nz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388084AbfISPbQ (ORCPT ); Thu, 19 Sep 2019 11:31:16 -0400 Received: from authenticated-user (mx.cjr.nz [51.158.111.142]) (Authenticated sender: pc) by mx.cjr.nz (Postfix) with ESMTPSA id CE49781032; Thu, 19 Sep 2019 15:21:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cjr.nz; s=dkim; t=1568906486; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aFbgfo1uvoVeTPm4h0phE3Z4pZpOiCMHkefqq14la6Q=; b=nXaB8slRPCDtEybVDpqswlfqMrDCV1RBMcvotG8frZ9iAD1GKSOtzLjaNzC5ud+PZF2Gsp E+2Hm88M5BZ97klu/YzK20JG1jlTDGL9+fBVetWKaD2+uPMRnnw4rDU+s5KnBn5VFAxuIb Cw+AzBBBTGlpCIjAj/gg/xcFn6RdtzzuWBvFciYYXIB9/5P+0CkyaoLVFzKjqhAa7bTRBH EqVrvysdxI7sPCdVVaJozQIp7QRiZ821xvh78+09uBKZx8Yl+poTHfNec6GLGLf8dwgt9L e/4Dz//dzLFr2vAk+6BiDbMw0wXg7OCMEsTB2in1G4IBvKe70JsSw6vMhmNmDw== From: "Paulo Alcantara (SUSE)" To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: "Paulo Alcantara (SUSE)" , Andrew Morton Subject: [PATCH v2 2/3] init: Support mounting root file systems over SMB Date: Thu, 19 Sep 2019 12:21:15 -0300 Message-Id: <20190919152116.27076-2-pc@cjr.nz> In-Reply-To: <20190919152116.27076-1-pc@cjr.nz> References: <20190716220452.3382-1-paulo@paulo.ac> <20190919152116.27076-1-pc@cjr.nz> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=cjr.nz; s=dkim; t=1568906486; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aFbgfo1uvoVeTPm4h0phE3Z4pZpOiCMHkefqq14la6Q=; b=TITbx/1AVJLTFDQBFrw78lpWLqfF3EDMQZPA7WnmVHzOGKCyHBk7gYDj4GR425BZPmx4Tz m71oISUPmbx2AN0bO2PLOvPnONro5kAGa29cRqsCGGw4+G23MeZKCxF1wbD3tpdyJjPtBH ur3faHkkCgp4SZdfHnQ1SxUOzbQSwWGnjqw8qrRvBd1uDJmqnhCfh39X6+kbd4kSP12UlR tcDaY0QclgBK967/ehNsbjYIbFfarihwX85VBy4T5Ffvv7XOtG2pcYWPWFSWZIO85VN1wL ChG7RqEUkRU9FZxrb3d8rPX86h/ljdMdwYWq60nApHCL9Fozntwbph036lXLBQ== ARC-Seal: i=1; s=dkim; d=cjr.nz; t=1568906486; a=rsa-sha256; cv=none; b=bmjR8f31d/SiO/chIPIooJQaIONlj7t+PitWoRXDZXUzmzzEUDGT34sveecn8BajV81urh uubDTRMySbnMl6xZntFJvMTHCbonQ8F/OkRfujY2eYgpQ9jAkCzhYS4Gw8DaJtry+wkb5v /A2pcZeI2zox/gxDddj3TEldF4XiYWXOTukdfm0Dbt2JWr9R3VVmxBkvD31bVjktG5gJ7W JpZdpsRhxHW+DQuuvfQGG2fxtyoRpBHeV/BvUpELtz1dz1zO/C/5KQPaYwp8l+y5+jxiYR SVwZOsE/zG7Ll5xbdtXPNxokI/urv9kbx0w9a9Q+vGY8ggvV/dhZXRUgGsfO/g== ARC-Authentication-Results: i=1; mx.cjr.nz; auth=pass smtp.auth=pc smtp.mailfrom=pc@cjr.nz Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add a new virtual device named /dev/cifs (0xfe) to tell the kernel to mount the root file system over the network by using SMB protocol. cifs_root_data() will be responsible to retrieve the parsed information of the new command-line option (cifsroot=) and then call do_mount_root() with the appropriate mount options for cifs.ko. Cc: Andrew Morton Signed-off-by: Paulo Alcantara (SUSE) --- init/do_mounts.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/init/do_mounts.c b/init/do_mounts.c index 53cb37b66227..cffef647a95b 100644 --- a/init/do_mounts.c +++ b/init/do_mounts.c @@ -212,6 +212,7 @@ static int match_dev_by_label(struct device *dev, const void *data) * a colon. * 9) PARTLABEL= with name being the GPT partition label. * MSDOS partitions do not support labels! + * 10) /dev/cifs represents Root_CIFS (0xfe) * * If name doesn't have fall into the categories above, we return (0,0). * block_class is used to check if something is a disk name. If the disk @@ -268,6 +269,9 @@ dev_t name_to_dev_t(const char *name) res = Root_NFS; if (strcmp(name, "nfs") == 0) goto done; + res = Root_CIFS; + if (strcmp(name, "cifs") == 0) + goto done; res = Root_RAM0; if (strcmp(name, "ram") == 0) goto done; @@ -501,6 +505,42 @@ static int __init mount_nfs_root(void) } #endif +#ifdef CONFIG_CIFS_ROOT + +extern int cifs_root_data(char **dev, char **opts); + +#define CIFSROOT_TIMEOUT_MIN 5 +#define CIFSROOT_TIMEOUT_MAX 30 +#define CIFSROOT_RETRY_MAX 5 + +static int __init mount_cifs_root(void) +{ + char *root_dev, *root_data; + unsigned int timeout; + int try, err; + + err = cifs_root_data(&root_dev, &root_data); + if (err != 0) + return 0; + + timeout = CIFSROOT_TIMEOUT_MIN; + for (try = 1; ; try++) { + err = do_mount_root(root_dev, "cifs", root_mountflags, + root_data); + if (err == 0) + return 1; + if (try > CIFSROOT_RETRY_MAX) + break; + + ssleep(timeout); + timeout <<= 1; + if (timeout > CIFSROOT_TIMEOUT_MAX) + timeout = CIFSROOT_TIMEOUT_MAX; + } + return 0; +} +#endif + #if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD) void __init change_floppy(char *fmt, ...) { @@ -542,6 +582,15 @@ void __init mount_root(void) ROOT_DEV = Root_FD0; } #endif +#ifdef CONFIG_CIFS_ROOT + if (ROOT_DEV == Root_CIFS) { + if (mount_cifs_root()) + return; + + printk(KERN_ERR "VFS: Unable to mount root fs via SMB, trying floppy.\n"); + ROOT_DEV = Root_FD0; + } +#endif #ifdef CONFIG_BLK_DEV_FD if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) { /* rd_doload is 2 for a dual initrd/ramload setup */ From patchwork Thu Sep 19 15:21:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paulo Alcantara X-Patchwork-Id: 1164728 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=quarantine dis=none) header.from=cjr.nz Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=cjr.nz header.i=@cjr.nz header.b="cOJRl1mY"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46Z16201gnz9sNk for ; Fri, 20 Sep 2019 01:31:21 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391275AbfISPbR (ORCPT ); Thu, 19 Sep 2019 11:31:17 -0400 Received: from mx.cjr.nz ([51.158.111.142]:37448 "EHLO mx.cjr.nz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391255AbfISPbQ (ORCPT ); Thu, 19 Sep 2019 11:31:16 -0400 Received: from authenticated-user (mx.cjr.nz [51.158.111.142]) (Authenticated sender: pc) by mx.cjr.nz (Postfix) with ESMTPSA id 616EC810F3; Thu, 19 Sep 2019 15:21:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cjr.nz; s=dkim; t=1568906486; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=35pe9kkxdC7EjCrreNNnD39E8uLZQzbEg7Hs3HWa184=; b=cOJRl1mYDRbcAWsieqLPyrwnn1ZcKgG6d5fS52/HuBgJd0VRUQXW6bYEEOAlCQuHfBKirN DMK7n5lIQDe3t5EW5Zi+kDzqYKGwU67S5vOUhldnMRs7x3YmSDcsx2godYA3nR/DKxiQ1B m6OmbRih+3OzjdgGR+RlK2PPv59NdGUmiQhYNgwRBHcsUGdLwrBkqr2DalzXGwl9egdGvC M3ZwfiPlUO1KcCFptYQ/0wDLKVLchnDu2AJLO6AvTQ4hFIowHGs4Sm6D3NG0Fz5Bcpr1e9 Bxb/t6aC+kEvL2Z0Pb6l7TxzJktjrOE7JxwKQ0nwVED1o3rCigDxjHKYQZBIig== From: "Paulo Alcantara (SUSE)" To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org Cc: "Paulo Alcantara (SUSE)" , "David S. Miller" , Alexey Kuznetsov , Hideaki YOSHIFUJI Subject: [PATCH v2 3/3] ipconfig: Handle CONFIG_CIFS_ROOT option Date: Thu, 19 Sep 2019 12:21:16 -0300 Message-Id: <20190919152116.27076-3-pc@cjr.nz> In-Reply-To: <20190919152116.27076-1-pc@cjr.nz> References: <20190716220452.3382-1-paulo@paulo.ac> <20190919152116.27076-1-pc@cjr.nz> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=cjr.nz; s=dkim; t=1568906486; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=35pe9kkxdC7EjCrreNNnD39E8uLZQzbEg7Hs3HWa184=; b=ZUFwe3MHtU4uhVteniaWRxAZy5z6wahxyYYQpAdDmcw2cIQFVFjg7uS1UrsA7VJt7EJ+Xd d0sjpVt6ITnPuIvOMLX8CBU28eoD/Qdlw+z8TDvoKgAGt4sSQ60U4pCHzko1r2R1J/8q8x SjbSBjwUoYF+sbw88BZzCnxtk9XTkIqA0C/15rrx97/r/At10yWslDJpfa7kFtB1R9iKaE eLSTO9DHyykbYzr5W/tdufn1wQL/R1zRflqvnlIKlsXYYrAO34ck7va33bzTuNdIdoAYHg /Mmp0qwvtm6SRGHBx5cG8g2r+61OxNaIDhkp2Kt4ZyC5A+hm6uBJscAxneQs7g== ARC-Seal: i=1; s=dkim; d=cjr.nz; t=1568906486; a=rsa-sha256; cv=none; b=TFv/T5Cvp+8RF2T+Ji1+0Y89OEIJVpfDIoKkCPzAny1cjLt0TLtFfSg6yP0xZXe7jNp+P2 rLOHUXGGJv17o60IPze9azS/vlQLgHyOXwPGCWhqqIs4PpXQo1rW2oUarnmheQPMngdHlv qoMybQyKdEI5eSTvdOkwl+eiNOnIRACfClreP3c7beKBzk7X+U4ShjiHJQctVCf5Jb52Pp uZxWXJ2ZYQbtXeITTiHoH9J6AwOcLjYCAkS7xb96mtI2WovGeSRfEFs+IfCvMgQRwb/BWk WASoVRQ4UyxaZ8YUR6cCsbd4uZkLAN6yfiWiS6JAYJj8k4ZeRp4ovFOHTrhoIA== ARC-Authentication-Results: i=1; mx.cjr.nz; auth=pass smtp.auth=pc smtp.mailfrom=pc@cjr.nz Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The experimental root file system support in cifs.ko relies on ipconfig to set up the network stack and then accessing the SMB share that contains the rootfs files. Cc: "David S. Miller" Cc: Alexey Kuznetsov Cc: Hideaki YOSHIFUJI Signed-off-by: Paulo Alcantara (SUSE) --- net/ipv4/ipconfig.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 9bcca08efec9..32e20b758b68 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c @@ -1483,10 +1483,10 @@ static int __init ip_auto_config(void) * missing values. */ if (ic_myaddr == NONE || -#ifdef CONFIG_ROOT_NFS +#if defined(CONFIG_ROOT_NFS) || defined(CONFIG_CIFS_ROOT) (root_server_addr == NONE && ic_servaddr == NONE && - ROOT_DEV == Root_NFS) || + (ROOT_DEV == Root_NFS || ROOT_DEV == Root_CIFS)) || #endif ic_first_dev->next) { #ifdef IPCONFIG_DYNAMIC @@ -1513,6 +1513,12 @@ static int __init ip_auto_config(void) goto try_try_again; } #endif +#ifdef CONFIG_CIFS_ROOT + if (ROOT_DEV == Root_CIFS) { + pr_err("IP-Config: Retrying forever (CIFS root)...\n"); + goto try_try_again; + } +#endif if (--retries) { pr_err("IP-Config: Reopening network devices...\n");