Re: Best way to shut down NILFS2? (umount hang issue)...

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/20/2013 04:14 AM, Vyacheslav Dubeyko wrote:
> Hi Michael,
> 
> On Thu, 2013-09-19 at 19:19 -0400, Michael L. Semon wrote:
> 
> [snip]
>>
>> The issue still happens.  One patch was already in the kernel, and
>> the second patch you mentioned did not make much of a difference.
>> The second patch is still installed, though.
>>
> 
> Ok. Thank you for report. I'll try to reproduce the issue, firstly.
> 
>> The problem I mentioned above is the one that is easy to explain.
>> The crash doesn't even have to stress the computer:  A simple
>> SysRq-induced crash should be enough to get the problem started, 
>> though the PC might need to be crashed more than once.
>>
>> I've changed / to mount as errors=panic, but there has been no 
>> panic yet.
>>
>> # ================
>>
>> Here is where the overall problem becomes hard to explain.  Consider this 
>> scenario:
>>
>> / is NILFS2 (rw,order=strict)
>> /boot is JFS
>> /tmp is JFS
>> /usr/src is JFS
>>
>> Because I don't want the hung NILFS2 umount to give problems to /tmp and 
>> /usr/src, I adapted the end of the standard Slackware shutdown script to 
>> look something like this:
>>
>> /bin/umount -v -a -t noproc,nosysfs,nonilfs2
>>
>> # This line can be here to show a sync problem, or removed 
>> # to show a umount problem....
>> sync
>>
>> /bin/umount -v -a -t nilfs2
>>
>> echo "Remounting root filesystem read-only."
>> /bin/mount -v -n -o remount,ro /dev/sdb12 /
>>
>> [I can get you the exact script next time.]
>>
> 
> Ok. Please, share all additional details (or script) that it will be
> helpful for the issue reproducing from your point of view.

This is for the "simple" case.  The only extra program used was LTP's 
fsstress.  No kernels were built to stress memory.  None of the 
additional JFS partitions were used:  This is just NILFS2 /, swap, and 
virtual filesystems.

> So, I need in such details:
> (1) Could you share the output of "nilfs-tune -l"?

[These results came from a session with the drive write caches shut 
off.]

nilfs-tune 2.1.5
Filesystem volume name:	  nBoot
Filesystem UUID:	  fbc3d532-ef4b-4d0a-a064-6dad94b71224
Filesystem magic number:  0x3434
Filesystem revision #:	  2.0
Filesystem features:      (none)
Filesystem state:	  invalid or mounted
Filesystem OS type:	  Linux
Block size:		  4096
Filesystem created:	  Thu Sep 19 00:37:12 2013
Last mount time:	  Sat Sep 21 15:16:44 2013
Last write time:	  Sat Sep 21 15:16:44 2013
Mount count:		  271
Maximum mount count:	  50
Reserve blocks uid:	  0 (user root)
Reserve blocks gid:	  0 (group root)
First inode:		  11
Inode size:		  128
DAT entry size:		  32
Checkpoint size:	  192
Segment usage size:	  16
Number of segments:	  639
Device size:		  5368709120
First data block:	  1
# of blocks per segment:  2048
Reserved segments %:	  5
Last checkpoint #:	  7681
Last block address:	  229931
Last sequence #:	  751
Free blocks count:	  436224
Commit interval:	  0
# of blks to create seg:  0
CRC seed:		  0x4fc978f4
CRC check sum:		  0xc37ab2f6
CRC check data size:	  0x00000118

> (2) Could you share /etc/fstab content and "mount" output for the
> reproduced issue case?

# ======================= /etc/fstab =======================

/dev/sdb2   swap              swap      defaults                      0  0
/dev/sdb12  /                 nilfs2    rw,order=strict,errors=panic  0  0
devpts      /dev/pts          devpts    gid=5,mode=620                0  0
proc        /proc             proc      defaults                      0  0
debugfs     /sys/kernel/debug debugfs   defaults                      0  0


# ====================== output of `mount`=======================

proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
/dev/sdb12 on / type nilfs2 (rw,order=strict,errors=panic,gcpid=96)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
debugfs on /sys/kernel/debug type debugfs (rw)

# ===============================================================

> (3) Could you share "fdisk -l" or "parted -l" output?

OK, and I annotated it a bit as well...

Model: ATA ST3120814A (scsi) # not really, it's IDE
Disk /dev/sda: 120GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  102MB   101MB   primary   jfs # /boot (not mounted in test)
 2      102MB   120GB   120GB   extended
 5      103MB   170MB   67.1MB  logical   # journal for /dev/sdb10
 6      171MB   305MB   134MB   logical   # $TEST_LOGDEV for xfstests
 7      306MB   440MB   134MB   logical   # $SCRATCH_LOGDEV for xfstests
 8      441MB   1073MB  631MB   logical   ext2 # dump capture (not used)
 9      1074MB  12.6GB  11.5GB  logical   xfs  # production / (not used)
10      12.6GB  120GB   107GB   logical   # dm-crypt (xfs)


Model: ATA WDC WD600BB-75CA (scsi) # not really, it's IDE
Disk /dev/sdb: 60.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name         Flags
 1      1049kB  3490MB  3489MB  jfs             gEmergency  # alt / (not used)
 2      3490MB  4295MB  805MB   linux-swap(v1)  gAltSwap    # swap
 3      4295MB  25.8GB  21.5GB  jfs             gStorage    # backup (not used)
12      25.8GB  31.1GB  5369MB  nilfs2          gN2Boot     # / for test
13      31.1GB  32.2GB  1074MB  jfs             gTmpForN2   # /tmp (not used)
 4      32.2GB  34.3GB  2080MB  nilfs2          gTestDev    # $TEST_DEV
 5      34.3GB  46.1GB  11.8GB  xfs             gScratchDev # $SCRATCH_DEV
 6      46.1GB  46.9GB  805MB                   gBadLower   # bad blocks
 7      46.9GB  47.4GB  537MB                   gTstRTDev   # $TEST_RTDEV
 8      47.4GB  48.0GB  537MB                   gScrRTDev   # $SCRATCH_RTDEV
 9      48.0GB  49.1GB  1074MB                  gBadUpper   # bad blocks
10      49.1GB  60.0GB  11.0GB  jfs             gUsrSrc   # /usr/src (not used)

> (4) Could you share /etc/nilfs_cleanerd.conf content?

# =================== /etc/nilfs_cleanerd.conf ==================

# nilfs_cleanerd.conf - configuration file of NILFS cleaner daemon.
#
# This file contains GC parameters that are loaded when cleaner gets
# started.  You can force them to be reloaded by sending a HUP signal
# to the cleaner process.
#
# Each parameter is declared with a keyword-value pair or a directive
# with no argument.  Lines beginning with "#" are ignored.  For
# details, see the man page of nilfs_cleanerd.conf(5).

# Protection period in second.
protection_period	3600

# Minimum number of clean segments
#   0 = continuous cleaning
# > 0 = pause cleaning until less segments are available
min_clean_segments	10%

# Maximum number of clean segments
max_clean_segments	20%

# The argument of min_clean_segments and max_clean_segments can be
# followed by a percent sign (%) or one of the following
# multiplicative suffixes: K 1024, MB 1000*1000, M 1024*1024, GB
# 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E.
#
# If the argument is followed by "%", it represents a disk capacity
# ratio.

# Clean segment check interval in seconds
clean_check_interval	10

# Segment selection policy.
# In NILFS version 2.0.0, only the timestamp policy is supported.
selection_policy	timestamp	# timestamp in ascend order

# The maximum number of segments to be cleaned at a time.
nsegments_per_clean	2

# The maximum number of segments to be cleaned at a time
# if clean segments < min_clean_segments
mc_nsegments_per_clean	4

# Cleaning interval in seconds.
cleaning_interval	5

# Cleaning interval in seconds
# if clean segments < min_clean_segments
mc_cleaning_interval	1

# Retry interval in seconds.
retry_interval		60

# Use mmap when reading segments if supported.
use_mmap

# Log priority.
# Supported priorities are emerg, alert, crit, err, warning, notice, info, and
# debug.
log_priority		info

# ===============================================================

My test case started to succeed, and the next 20-30 reboots were successful.  
[Again, the problem can fix itself over time.]  So I inserted this into my 
/etc/rc.d/rc.local script:

# ======================= SCRIPT FRAGMENT =======================

echo 'Issuing `nilfs-tune -l /dev/sdb12`...'
/sbin/nilfs-tune -l /dev/sdb12
echo "Querying mounts using the mount command..."
/bin/mount
echo 'Issuing `nilfs-clean --status /dev/sdb12`'
/sbin/nilfs-clean --status /dev/sdb12
echo "Running fsstress..."
/opt/ltp/testcases/bin/fsstress -p 16 -n 100 -d /tmp/test
echo "Invoking shutdown..."
/sbin/shutdown -r now

# ===============================================================

Note that it uses the fsstress from the latest LTP (September 2013) 
from ltp.sourceforge.net.  The fsstress from xfstests does not cause 
any problems.

>> I choose to build a kernel, which fills memory, exercises a JFS
>> filesystem and probably writes temp files to /tmp on JFS.  `make 
>> install` installs the kernel to /boot on JFS.  [BTW, `make install` 
>> can stall when /boot is within a NILFS2 / partition, but that has 
>> not been tested since I started using a separate /boot partition.] 
>>
>> There is a much higher chance that shutdown will hang before the
>> NILFS2 partitions are umounted.  A simple `mount` placed before the
>> `sync` shows that umount is honoring the "nonilfs2" flag, and the
>> NILFS2 partitions are still mounted.  So why would the sync *before*
>> the umount of NILFS2 partitions get hung between segctord and sync,
>> when mount supposedly has not umounted the NILFS2 partitions yet?
>> This is why I mentioned the sync issue and the umount issue at the
>> same time.
>>
>> Could it be that `umount ... nonilfs2` causes /etc/mtab to be
>> modified, which is updated by NILFS2 on /, but it is not done in 
>> time to make sync (or the next `umount ... nilfs2`) happy?  I'm 
>> only speculating on this idea.
>>
> 
> I hope that I have enough details for successful reproducing of the
> issue. But if I encounter some troubles then I'll ask you about
> additional details. I'll share results of my attempt, anyway.
> 
> So, I think that it needs to reproduce the issue and to investigate it
> before answering on your questions. :)

Thanks.  There is some more data after my question, just in case there 
is something obviously misconfigured.

Also, I did get half of the problem to show by running xfstests 
generic/069, using `./check -g auto` without specifying "-o pp=0".  
However, your latest patch was not installed in that kernel, and 
so generic/069 might have shown the problem that you patched.

Good luck!

Michael

# ======= KDB stack trace of test in /etc/rc.d/rc.local =========

Running fsstress...
seed = 1379318781
Invoking shutdown...
[  867.598103] SysRq : DEBUG

Entering kdb (current=0xc16cf620, pid 0) due to Keyboard Entry
kdb> ps
42 sleeping system daemon (state M) processes suppressed,
use 'ps A' to see all.
Task Addr       Pid   Parent [*] cpu State Thread     Command
0xc16cf620        0        0  1    0   R  0xc16cf8d8 *swapper

0xdf450000        1        0  0    0   S  0xdf4502b8  init
0xde129960       72        2  0    0   D  0xde129c18  segctord
0xde128cb0       96        1  0    0   S  0xde128f68  nilfs_cleanerd
0xde128000      115        1  0    0   S  0xde1282b8  rc.M
0xde12b2c0      124        1  0    0   S  0xde12b578  syslogd
0xde12d8d0      129        1  0    0   S  0xde12db88  klogd
0xde12e580      235        1  0    0   S  0xde12e838  sshd
0xde12a610      241        1  0    0   S  0xde12a8c8  ntpd
0xde12f230      246        1  0    0   S  0xde12f4e8  acpid
0xde12bf70      248        1  0    0   S  0xde12c228  gpm
0xde9f6580      250        1  0    0   S  0xde9f6838  crond
0xde9f58d0      252        1  0    0   S  0xde9f5b88  atd
0xdd718000      278      115  0    0   D  0xdd7182b8  shutdown
kdb> btp 278
Stack traceback for pid 278
0xdd718000      278      115  0    0   D  0xdd7182b8  shutdown
 dd78de3c 00000096 f48c74cc 00000010 00000000 dd718000 1a99a6cf 00000005 
 dd78c000 dd718000 00000005 00215ed3 00000000 1a9aa249 00000005 00000000 
 c106c8db 00000000 dd78de28 c1051df4 007d4405 00000086 dd718470 dd78de28 
Call Trace:
 [<c106c8db>] ? trace_hardirqs_off_caller+0x1a/0x115
 [<c1051df4>] ? sched_clock_cpu+0x8f/0xe2
 [<c14f414e>] schedule+0x22/0x4c
 [<c14f1548>] schedule_timeout+0xf8/0x16c
 [<c14f5925>] ? _raw_spin_unlock_irq+0x27/0x36
 [<c106c8bf>] ? trace_hardirqs_on+0xb/0xd
 [<c14f44e8>] wait_for_completion+0x9e/0xce
 [<c104fcb6>] ? try_to_wake_up+0x138/0x138
 [<c11057e2>] sync_inodes_sb+0xc3/0x1f2
 [<c106cae9>] ? trace_hardirqs_off+0xb/0xd
 [<c14f4475>] ? wait_for_completion+0x2b/0xce
 [<c11087a5>] sync_inodes_one_sb+0x15/0x17
 [<c10e45d9>] iterate_supers+0xc5/0xc7
 [<c1108790>] ? SyS_tee+0x2c5/0x2c5
 [<c1108922>] sys_sync+0x31/0x78
 [<c14f6d3b>] sysenter_do_call+0x12/0x32

kdb> btp 72
Stack traceback for pid 72
0xde129960       72        2  0    0   D  0xde129c18  segctord
 de1addb8 00000092 de1add70 c106a213 00000000 de129960 4efb093e 00000006 
 de1ac000 de129960 00000001 c14f58d7 de129960 00000002 de1add98 00000002 
 dfaef060 00000282 de129da8 00000046 00000282 dfaef060 de1adda0 c106c8bf 
Call Trace:
 [<c106a213>] ? lock_release_holdtime.part.22+0xba/0xed
 [<c14f58d7>] ? _raw_spin_unlock_irqrestore+0x2f/0x56
 [<c106c8bf>] ? trace_hardirqs_on+0xb/0xd
 [<c10f6e51>] ? inode_lru_list_del+0x27/0x27
 [<c14f414e>] schedule+0x22/0x4c
 [<c10f6e5e>] inode_wait+0xd/0x11
 [<c14f165e>] __wait_on_bit+0x4e/0x6b
 [<c10f6e51>] ? inode_lru_list_del+0x27/0x27
 [<c1103158>] __inode_wait_for_writeback+0x80/0x98
 [<c1046b4d>] ? autoremove_wake_function+0x3d/0x3d
 [<c1104e62>] inode_wait_for_writeback+0x1d/0x28
 [<c10f79b3>] evict+0x83/0x15d
 [<c10f84b1>] iput+0xc3/0x137
 [<c127afc2>] nilfs_dispose_list+0xfc/0x14b
 [<c127b387>] nilfs_transaction_unlock+0x55/0x5e
 [<c127db60>] nilfs_segctor_thread+0xd5/0x2ad
 [<c127da8b>] ? nilfs_segctor_construct+0x229/0x229
 [<c10460c4>] kthread+0xa7/0xa9
 [<c14f6cb7>] ret_from_kernel_thread+0x1b/0x28
 [<c104601d>] ? __kthread_parkme+0x5b/0x5b

kdb> btp 96
Stack traceback for pid 96
0xde128cb0       96        1  0    0   S  0xde128f68  nilfs_cleanerd
 de26becc 00000096 00000001 c14f58d7 de128cb0 de128cb0 830bd70d 000000c9 
 de26a000 de128cb0 de1290f8 00000046 00000286 c16e6c20 de26be94 c106c8bf 
 de26bea4 00000286 13260165 de26bef4 de26bed4 c1049262 de26beb4 ab91e650 
Call Trace:
 [<c14f58d7>] ? _raw_spin_unlock_irqrestore+0x2f/0x56
 [<c106c8bf>] ? trace_hardirqs_on+0xb/0xd
 [<c1049262>] ? __hrtimer_start_range_ns+0x96/0x2a7
 [<c14f414e>] schedule+0x22/0x4c
 [<c14f3741>] schedule_hrtimeout_range_clock+0xb5/0x140
 [<c1048a10>] ? atomic_dec_and_mutex_lock+0x6b/0x6b
 [<c128ca92>] wq_sleep.constprop.12+0xb3/0x13a
 [<c128d72f>] SyS_mq_timedreceive+0x162/0x3da
 [<c10ce78d>] ? might_fault+0x93/0xa6
 [<c14f6478>] syscall_call+0x7/0xb

# ======================= /etc/rc.d/rc.S ========================

#!/bin/sh
#
# /etc/rc.d/rc.S:  System initialization script.
#
# Adapted from the standard Slackware rc.S in slackware-current.
#

# Turn off write cache for sake of /dev/sdb10's journal on /dev/sda5.
# /sbin/hdparm -W0 /dev/sda
# Turn off write cache for all drives.
/sbin/hdparm -W0 /dev/sda /dev/sdb

PATH=/sbin:/usr/sbin:/bin:/usr/bin

# /bin/dmesg -l 0,1,2,3,4,5,6,7 --console-on debug

# Try to mount /proc:
/sbin/mount -n -v proc /proc -n -t proc 2> /dev/null

# Try to mount /sys:
/sbin/mount -n -v sysfs /sys -n -t sysfs

/sbin/mount -n -t nilfs2 -o remount,rw,order=strict,errors=panic /dev/sdb12 /

# Try not to remove mtab (doesn't make a difference)

if [ -e /etc/mtab~* ]; then
  /bin/rm /etc/mtab~*
fi
if [ -e /etc/mtab.* ]; then
  /bin/rm /etc/mtab.*
fi
if [ -e /etc/mtab ]; then
  /bin/truncate --size=0 /etc/mtab
fi
# /bin/ln -s /proc/mounts /etc/mtab
/bin/touch /etc/mtab

# Record entries in mtab
/sbin/mount -f -v proc /proc -t proc 2> /dev/null
/sbin/mount -f -v sysfs /sys -t sysfs
/sbin/mount -f -t nilfs2 -o remount,rw,order=strict,errors=panic /dev/sdb12 /

/sbin/fsck -aAR
# if [ -e /dev/sdb13 ]; then
# 	echo "Making fresh JFS /tmp on /dev/sdb13..."
# 	/sbin/jfs_mkfs -q -L jTmpForN2 /dev/sdb13
# fi

# MLS - Get the devs going, one way or another...

if [ -x /etc/rc.d/rc.udev ]; then
  /etc/rc.d/rc.udev start
else
  if [ -d /dev/ ]; then
    if [ ! -e /dev/pts ]; then
      mkdir /dev/pts
    fi
    if [ ! -e /dev/shm ]; then
      mkdir /dev/shm
    fi
    if [ ! -e /dev/md ]; then
        mkdir /dev/md
    fi
    if [ ! -e /dev/fd ]; then
      ln -sf /proc/self/fd /dev/fd
      ln -sf fd/0 /dev/stdin
      ln -sf fd/1 /dev/stdout
      ln -sf fd/2 /dev/stderr
    fi
    if [ ! -e /dev/X0R ]; then
      ln -sf null /dev/X0R
    fi
    if [ ! -e /dev/root ]; then
      ln -s /dev/sdb12 /dev/root
    fi
    if [ ! -e /dev/mouse ]; then
      ln -s /dev/input/mice /dev/mouse
    fi
    if [ ! -e /dev/cdrom ]; then
      ln -sf sr0 /dev/cdrom
    fi
    if [ -e /dev/ram0 ]; then
      ln -sf ram0 /dev/ramdisk
    fi
  fi
fi

# # MLS - either way, link ttyS0 to gps0
# if [ -e /dev/ttyS0 ]; then
#   chmod 0640 /dev/ttyS0
#   chown root:gps /dev/ttyS0
#   ln -sf ttyS0 /dev/gps0
# fi

# # If /run exists, mount a tmpfs on it (unless the
# # initrd has already done so):
# if [ -d /run ]; then
#   if ! grep -wq "tmpfs /run tmpfs" /proc/mounts ; then
#     /sbin/mount -v -n -t tmpfs tmpfs /run -o mode=0755
#   fi
# fi

# Enable swapping:
/sbin/swapon -a 2> /dev/null

# remount / rw went here.
/sbin/mount -t nilfs2 -o remount,rw,order=strict,errors=panic /dev/sdb12 /
# /sbin/mount -o remount,rw /

/sbin/hwclock --hctosys --utc --directisa

# /sbin/mdadm --auto-detect

# # Configure runtime kernel parameters:
if [ -x /sbin/sysctl -a -r /etc/sysctl.conf ]; then
  /sbin/sysctl -e -p /etc/sysctl.conf
fi

# Turn on some debugging for JBD2
# if [ -e /sys/module/jbd2/parameters/jbd2_debug ]; then
#   echo 1 > /sys/module/jbd2/parameters/jbd2_debug
# fi

# Mount non-root file systems in fstab, but not NFS or SMB 
# because TCP/IP is not yet configured, and not proc or sysfs
# because those have already been mounted.  Also check that
# devpts is not already mounted before attempting to mount
# it.  With a 2.6.x or newer kernel udev mounts devpts.
# We also need to wait a little bit to let USB and other
# hotplugged devices settle (sorry to slow down the boot):
echo "Mounting non-root local filesystems:"
if /bin/grep -wq devpts /proc/mounts ; then
  /sbin/mount -a -v -t nonfs,nosmbfs,nocifs,noproc,nosysfs,nodevpts
else
  /sbin/mount -a -v -t nonfs,nosmbfs,nocifs,noproc,nosysfs
fi

/bin/chmod 1777 /tmp

# # Clean up some temporary files:
# rm -f /var/run/* /var/run/*/* /var/run/*/*/* /etc/nologin \
#   /etc/dhcpc/*.pid /etc/forcefsck /etc/fastboot \
#   /var/state/saslauthd/saslauthd.pid \
#   /tmp/.Xauth* 1> /dev/null 2> /dev/null
#   ( cd /var/log/setup/tmp && rm -rf * )
#   ( cd /tmp && rm -rf kde-[a-zA-Z]* ksocket-[a-zA-Z]* hsperfdata_[a-zA-Z]* plugtmp* )

# # Clean up some temporary files:
rm -f /var/run/* /var/run/*/* /var/run/*/*/* /etc/nologin \
  /etc/forcefsck /etc/fastboot 1> /dev/null 2> /dev/null
  ( cd /var/log/setup/tmp && rm -rf * )

# Create a fresh utmp file:
touch /var/run/utmp
chown root:utmp /var/run/utmp
chmod 664 /var/run/utmp

# Update the current kernel level in the /etc/motd (Message Of The Day) file,
# if the first line of that file begins with the word 'Linux'.
# You are free to modify the rest of the file as you see fit.
if [ -x /bin/sed ]; then
  /bin/sed -i "{1s/^Linux.*/$(/bin/uname -sr)\./}" /etc/motd
fi

# If there are SystemV init scripts for this runlevel, run them.
if [ -x /etc/rc.d/rc.sysvinit ]; then
  . /etc/rc.d/rc.sysvinit
fi

# Run serial port setup script:
# CAREFUL!  This can make some systems hang if the rc.serial script isn't
# set up correctly.  If this happens, you may have to edit the file from a
# boot disk, and/or set it as non-executable:
# if [ -x /etc/rc.d/rc.serial ]; then
#   sh /etc/rc.d/rc.serial start
# fi

# Carry an entropy pool between reboots to improve randomness.
if [ -f /etc/random-seed ]; then
  echo "Using /etc/random-seed to initialize /dev/urandom."
  cat /etc/random-seed > /dev/urandom
fi
# Use the pool size from /proc, or 512 bytes:
if [ -r /proc/sys/kernel/random/poolsize ]; then
  dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(cat /proc/sys/kernel/random/poolsize) 2> /dev/null
else
  dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null
fi
chmod 600 /etc/random-seed

# ======================= /etc/rc.d/rc.6 ========================

#! /bin/sh
#
# /etc/rc.d/rc.6 for test

# Set the path.
PATH=/sbin:/etc:/bin:/usr/bin

echo "Mount at beginning of shutdown..."
/bin/mount

# If there are SystemV init scripts for this runlevel, run them.
if [ -x /etc/rc.d/rc.sysvinit ]; then
  . /etc/rc.d/rc.sysvinit
fi

# Set linefeed mode to avoid staircase effect.
/bin/stty onlcr

echo "Running shutdown script $0:"

# Find out how we were called.
case "$0" in
	*0)
		command="halt"
		;;
	*6)
		command=reboot
		;;
	*)
		echo "$0: call me as \"rc.0\" or \"rc.6\" please!"
		exit 1
		;;
esac

# Run any local shutdown scripts:
if [ -x /etc/rc.d/rc.local_shutdown ]; then
  /etc/rc.d/rc.local_shutdown stop
fi

# Stop the Apache web server:
if [ -x /etc/rc.d/rc.httpd ]; then
  /etc/rc.d/rc.httpd stop
fi

# Stop the MySQL database:
if [ -r /var/run/mysql/mysql.pid ]; then
  . /etc/rc.d/rc.mysqld stop
fi

# Stop the Samba server:
if [ -x /etc/rc.d/rc.samba ]; then
  . /etc/rc.d/rc.samba stop
fi

# Shut down the NFS server:
if [ -x /etc/rc.d/rc.nfsd ]; then
  /etc/rc.d/rc.nfsd stop
fi

# Shut down the SSH server:
if [ -x /etc/rc.d/rc.sshd ]; then
  /etc/rc.d/rc.sshd stop
fi

# Shut down the SASL authentication daemon:
if [ -x /etc/rc.d/rc.saslauthd ]; then
  /etc/rc.d/rc.saslauthd stop
fi

# Shut down OpenLDAP:
if [ -x /etc/rc.d/rc.openldap ]; then
  /etc/rc.d/rc.openldap stop
fi

# Stop D-Bus:
if [ -x /etc/rc.d/rc.messagebus ]; then
  sh /etc/rc.d/rc.messagebus stop
fi

# Kill any processes (typically gam) that would otherwise prevent
# unmounting NFS volumes:
unset FUSER_DELAY
for dir in $(/bin/mount | grep 'type nfs' | cut -d ' ' -f 3 ) ; do
  echo "Killing processes holding NFS mount $dir open..."
  # Background this to prevent fuser from also blocking shutdown:
  /usr/bin/fuser -k -m $dir &
  FUSER_DELAY=5
done
# If fuser was run, let it have some delay:
if [ ! -z "$FUSER_DELAY" ]; then
  sleep $FUSER_DELAY
fi

# Unmount any NFS, SMB, or CIFS filesystems:
echo "Unmounting remote filesystems."
/bin/umount -v -a -l -f -r -t nfs,smbfs,cifs

# Try to shut down pppd:
PS="$(ps ax)"
if echo "$PS" | /bin/grep -q -w pppd ; then
  if [ -x /usr/sbin/ppp-off ]; then
    /usr/sbin/ppp-off
  fi
fi

# Shut down YP services:
if [ -x /etc/rc.d/rc.yp ]; then
  if grep -wq stop /etc/rc.d/rc.yp ; then
    /etc/rc.d/rc.yp stop
  fi
fi

# Bring down the networking system, but first make sure that this
# isn't a diskless client with the / partition mounted via NFS:
if ! /bin/mount | /bin/grep -q 'on / type nfs' ; then
  if [ -x /etc/rc.d/rc.inet1 ]; then
    . /etc/rc.d/rc.inet1 stop
  fi
fi

# In case dhcpcd might have been manually started on the command line,
# look for the .pid file, and shut dhcpcd down if it's found:
if /bin/ls /etc/dhcpc/*.pid 1> /dev/null 2> /dev/null ; then
  /sbin/dhcpcd -k 1> /dev/null 2> /dev/null
  # A little time for /etc/resolv.conf and/or other files to
  # restore themselves.
  sleep 2
fi

# Shut down PCMCIA devices:
if [ -x /etc/rc.d/rc.pcmcia ]; then
  . /etc/rc.d/rc.pcmcia stop
  # The cards might need a little extra time here to deactivate:
  /bin/sleep 5
fi

# Turn off process accounting:
if [ -x /sbin/accton -a -r /var/log/pacct ]; then
  /sbin/accton off
fi

# Terminate acpid before syslog:
if [ -x /etc/rc.d/rc.acpid -a -r /var/run/acpid.pid ]; then # quit
  . /etc/rc.d/rc.acpid stop
fi

# Stop udev:
if [ -x /etc/rc.d/rc.udev ]; then
  sh /etc/rc.d/rc.udev force-stop
fi

/sbin/hwclock --systohc --utc --directisa

# I had problems when killall5 seemed to kill nilfs_cleanerd. 
# Therefore, exclude the gcpids reported by mount from killall5 
# and trust that they are still running.
pidskip=$(mount | sed -ne 's/^.*gcpid=\([0-9][0-9]*\).*$/\1/p' \
  | tr "\n" "," | sed -e 's/,$//')

echo NILFS2 before killall5, using pidskip $pidskip ...
ps ax | grep nilfs | grep -v grep
sleep 1

# Kill all remaining processes.
if [ ! "$1" = "fast" ]; then
  echo "Sending all processes the SIGTERM signal."
  if [ -z $pidskip ]; then
    /sbin/killall5 -15
  else
    /sbin/killall5 -15 -o $pidskip
  fi
  /bin/sleep 5
  echo "Sending all processes the SIGKILL signal."
  if [ -z $pidskip ]; then
    /sbin/killall5 -9
  else
    /sbin/killall5 -9 -o $pidskip
  fi
fi

echo NILFS2 after killall5...
ps ax | grep nilfs | grep -v grep
sleep 1

# Try to turn off quota.
if /bin/grep -q quota /etc/fstab ; then
  if [ -x /sbin/quotaoff ]; then
    echo "Turning off filesystem quotas."
    /sbin/quotaoff -a
  fi
fi

# Carry a random seed between reboots.
echo "Saving random seed from /dev/urandom in /etc/random-seed."
# Use the pool size from /proc, or 512 bytes:
if [ -r /proc/sys/kernel/random/poolsize ]; then
  /bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=$(cat /proc/sys/kernel/random/poolsize) 2> /dev/null
else
  /bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null
fi
/bin/chmod 600 /etc/random-seed

# Before unmounting file systems write a reboot or halt record to wtmp.
$command -w

# Clear /var/lock/subsys.
if [ -d /var/lock/subsys ]; then
  rm -f /var/lock/subsys/*
fi

# Turn off swap:
echo "Turning off swap."
/sbin/swapoff -a
/bin/sync

# echo "Issuing nilfs-clean -b for / ."
# /sbin/nilfs-clean -b /dev/sdb12

echo "Unmounting local file systems, except for NILFS2 file systems."
/bin/umount -v -a -t noproc,nosysfs,nonilfs2

echo "Checking mounts before umounting NILFS2 file systems:"
/bin/mount

# Comment out the next two lines to test umount hangs instead of sync hangs.
echo "Issuing sync"
/bin/sync

echo "Unmounting NILFS2 file systems."
/bin/umount -v -a -r -t nilfs2,noproc,nosysfs
# /sbin/hdparm -F /dev/sda /dev/sdb

echo "Remounting root filesystem read-only."
/bin/mount -t nilfs2 -n -o remount,ro /dev/sdb12 /

# This never hurts:
# /bin/sync

# Close any volumes opened by cryptsetup:
if [ -f /etc/crypttab -a -x /sbin/cryptsetup ]; then
  cat /etc/crypttab | grep -v "^#" | grep -v "^$" | while read line; do
    # NOTE: we only support LUKS formatted volumes (except for swap)!
    LUKS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f1 -d' ')
    DEV=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f2 -d' ')
    OPTS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f4 -d' ')
    if /sbin/cryptsetup isLuks $DEV 2>/dev/null ; then
      echo "Locking LUKS crypt volume '${LUKS}':"
      /sbin/cryptsetup luksClose ${LUKS}
    elif echo $OPTS | grep -wq swap ; then
      # If any of the volumes was used as encrypted swap,
      # then run mkswap on the underlying device -
      # in case other Linux installations on this computer should use it:
      echo "Erasing encrypted swap '${LUKS}' and restoring normal swap on ${DEV}:"
      /sbin/cryptsetup remove ${LUKS}
      mkswap $DEV
    fi
  done
fi

# Deactivate LVM volume groups:
if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then
  echo "Deactivating LVM volume groups:"
  /sbin/vgchange -an --ignorelockingfailure
fi

# This never hurts again (especially since root-on-LVM always fails
# to deactivate the / logical volume...  but at least it was
# remounted as read-only first)
# /sbin/hdparm -F /dev/sda /dev/sdb
/bin/sync

# sleep 3 fixes problems with some hard drives that don't
# otherwise finish syncing before reboot or poweroff
/bin/sleep 3

# This is to ensure all processes have completed on SMP machines:
wait

if [ -x /sbin/genpowerd ]; then
  # See if this is a powerfail situation:
  if /bin/egrep -q "FAIL|SCRAM" /etc/upsstatus 2> /dev/null ; then
    # Signal UPS to shut off the inverter:
    /sbin/genpowerd -k
    if [ ! $? = 0 ]; then
      echo
      echo "There was an error signaling the UPS."
      echo "Perhaps you need to edit /etc/genpowerd.conf to configure"
      echo "the serial line and UPS type."
      # Wasting 15 seconds of precious power:
      /bin/sleep 15
    fi
  fi
fi

# Now halt (poweroff with APM or ACPI enabled kernels) or reboot.
if [ "$command" = "reboot" ]; then
  echo "Rebooting."
  /sbin/reboot
else
  /sbin/poweroff
fi


--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux BTRFS]     [Linux CIFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux