summaryrefslogtreecommitdiffstats
path: root/etc/init.d/zfs.gentoo
blob: d2ea90267fd86248ea420fe1cf495fec499755f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#!/sbin/runscript
# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-fs/zfs/files/zfs,v 0.9 2011/04/30 10:13:43 devsk Exp $

depend()
{
	before net
	after udev
}

CACHEFILE=/etc/zfs/zpool.cache
ZPOOL=/usr/sbin/zpool
ZFS=/usr/sbin/zfs
ZFS_MODULE=zfs
LOCKFILE=/var/lock/zfs/zfs_lockfile

checksystem()
{
	/sbin/modinfo $ZFS_MODULE &>/dev/null
	if [[ $? -ne 0 ]]
	then
		eerror "$ZFS_MODULE not found. Is the ZFS package installed?"
		return 1
	fi
	if [[ ! -x $ZPOOL ]]
	then
		eerror "$ZPOOL binary not found."
		return 1
	fi
	if [[ ! -x $ZFS ]]
	then
		eerror "$ZFS binary not found."
		return 1
	fi

	# create the lockdir if not there
	lockdir=$(dirname ${LOCKFILE})
	if [[ ! -d ${lockdir} ]]
	then
		mkdir -p ${lockdir} &>/dev/null
	fi
	return 0
}

start()
{
	if [[ -f $LOCKFILE ]]
	then
		einfo "ZFS already running, please stop it first. Delete $LOCKFILE if its not so."
		eend 3
		return 3
	fi
	ebegin "Starting ZFS"
	checksystem || return 1
	if ! grep -q $ZFS_MODULE /proc/modules
	then
		/sbin/modprobe $ZFS_MODULE &>/dev/null
		rv=$?
		if [[ $rv -ne 0 ]]
		then
			eerror "Failed to load the $ZFS_MODULE module, check 'dmesg|tail'."
			eend $rv
			return $rv
		fi
	fi

	# Ensure / exists in /etc/mtab, if not update mtab accordingly.
	# This should be handled by rc.sysinit but lets be paranoid.
	awk '$2 == "/" { exit 1 }' /etc/mtab
	RETVAL=$?
	if [[ $RETVAL -eq 0 ]]
	then
		/bin/mount -f /
	fi

	# Import all pools described by the cache file, and then mount
	# all filesystem based on their properties.
	if [[ -f $CACHEFILE ]]
	then
		einfo "Importing ZFS pools"

		# as per fedora script, import can fail if all pools are already imported
		# The check for $rv makes no sense...but someday, it will work right.
		$ZPOOL import -c $CACHEFILE -aN 2>/dev/null || true
		rv=$?
		if [[ $rv -ne 0 ]]
		then
			eerror "Failed to import not-yet imported pools."
			eend $rv
			return $rv
		fi
	fi

	einfo "Mounting ZFS filesystems"
	$ZFS mount -a
	rv=$?
	if [[ $rv -ne 0 ]]
	then
		eerror "Failed to mount ZFS filesystems."
		eend $rv
		return $rv
	fi

	# hack to read mounted file systems because otherwise
	# zfs returns EPERM when a non-root user reads a mounted filesystem before root did
	savepwd="$PWD"
	mount | grep " type zfs " | sed 's/.*on //' | sed 's/ type zfs.*$//' | \
	while read line
	do
		cd "$line" &> /dev/null
		ls &> /dev/null
	done
	cd "$savepwd"

	touch $LOCKFILE
	eend 0
	return 0
}

stop()
{
	if [[ ! -f $LOCKFILE ]]
	then
		einfo "ZFS is not started, remove $LOCKFILE if its not so."
		eend 3
		return 3
	fi
	ebegin "Unmounting ZFS filesystems"
	sync
	$ZFS umount -a
	if [[ $rv -ne 0 ]]
	then
		eerror "Failed to umount ZFS filesystems."
	fi
	rm -f $LOCKFILE
	eend $rv
}

status()
{
	if [[ ! -f $LOCKFILE ]]
	then
		einfo "ZFS is not started, remove $LOCKFILE if its not so."
		eend 3
		return 3
	fi

	# show pool status and list
	$ZPOOL status && echo && $ZPOOL list
}