[prev in list] [next in list] [prev in thread] [next in thread] 

List:       freebsd-hackers
Subject:    [Fwd: rc.d/root: handle filesystems with r/o support only]
From:       Andriy Gapon <avg () freebsd ! org>
Date:       2010-04-29 5:49:07
Message-ID: 4BD91DD3.90108 () freebsd ! org
[Download RAW message or body]


There was no excitement over the proposed patch on rc@, perhaps more luck here :-)

-------- Original Message --------
Subject: rc.d/root: handle filesystems with r/o support only
Date: Sat, 17 Apr 2010 22:16:30 +0300
From: Andriy Gapon <avg@icyb.net.ua>
To: freebsd-rc@freebsd.org


Could you please review the following patch?
The idea is to not try to remount root R/W if root filesystem supports only R/O.
For example, cd9660.
This should make life easier for live CDs that use standard rc startup.
Currently one has to either put a root fs entry into fstab (and thus guess root
device name, e.g. cd0 vs acd0) or to specify root_rw_mount="NO" in rc.conf.
This change attempts to guess that automatically.

I think that things like ro_fs_list, in_list and is_readonly_fs could be shared
with other rc scripts.
E.g. see http://www.freebsd.org/cgi/query-pr.cgi?pr=conf/116931

P.S. sorry if the code style and structure differs from conventions.

--- a/etc/rc.d/root
+++ b/etc/rc.d/root
@@ -13,11 +13,54 @@ name="root"
 start_cmd="root_start"
 stop_cmd=":"

+ro_fs_list="cd9660 udf"
+
+in_list()
+{
+	local _x _list _i
+
+	_x=$1
+	_list=$2
+	for _i in ${_list}; do
+		[ "${_x}" = "${_i}" ] && return 0
+	done
+	return 1
+}
+
+is_readonly_fs()
+{
+	local _arg _ret
+
+	_arg="$1" ; shift
+	_ret=`mount -p | while read _dev _mp _type _rest; do
+		[ $_mp  = "$_arg" ] || continue
+		echo $_type
+		break
+	done`
+
+	if [ -z "${_ret}" ]; then
+		warn "root filesystem not found"
+		return 1
+	fi
+	if in_list "${_ret}" "${ro_fs_list}"; then
+		info "read-only root filesystem type: ${_ret}"
+		return 0
+	else
+		info "read-write root filesystem type: ${_ret}"
+		return 1
+	fi
+}
+
 root_start()
 {
 	# root normally must be read/write, but if this is a BOOTP NFS
 	# diskless boot it does not have to be.
 	#
+
+	if is_readonly_fs '/' ; then
+		root_rw_mount="NO"
+	fi
+
 	case ${root_rw_mount} in
 	[Nn][Oo] | '')
 		;;

-- 
Andriy Gapon


-- 
Andriy Gapon
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic