lkml.org 
[lkml]   [2009]   [Jan]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH V2] Allow SysRq emergency thaw to thaw frozen filesystems
    Eric Sandeen wrote:
    > Now that the filesystem freeze operation has been elevated
    > to the VFS, and is just an ioctl away, some sort of safety net
    > for unintentionally frozen root filesystems may be in order.
    >
    > The timeout thaw originally proposed did not get merged, but
    > perhaps something like this would be useful in emergencies.
    >
    > For example, freeze /path/to/mountpoint may freeze your
    > root filesystem if you forgot that you had that unmounted.
    >
    > I chose 'j' as the last remaining character other than 'h'
    > which is sort of reserved for help (because help is generated
    > on any unknown character).
    >
    > I've tested this on a non-root fs with multiple (nested) freezers,
    > as well as on a system rendered unresponsive due to a frozen
    > root fs.
    >
    > Thanks,
    > -Eric
    >
    > Signed-off-by: Eric Sandeen <sandeen@redhat.com>
    > ---
    >
    > Index: linux-2.6/drivers/char/sysrq.c
    > ===================================================================
    > --- linux-2.6.orig/drivers/char/sysrq.c 2009-01-16 13:24:14.688575212 -0600
    > +++ linux-2.6/drivers/char/sysrq.c 2009-01-16 13:26:35.232575643 -0600
    > @@ -346,6 +346,17 @@ static struct sysrq_key_op sysrq_moom_op
    > .enable_mask = SYSRQ_ENABLE_SIGNAL,
    > };
    >
    > +static void sysrq_handle_thaw(int key, struct tty_struct *tty)
    > +{
    > + emergency_thaw_all();
    > +}
    > +static struct sysrq_key_op sysrq_thaw_op = {
    > + .handler = sysrq_handle_thaw,
    > + .help_msg = "Thaw(J)",

    Can the help text be less terse, e.g.: "thaw-filesystems(J)" ?

    Not capital-T Thaw because that was used to mean "use sysrq-T" to invoke
    this sysrq.


    > + .action_msg = "Emergency Thaw of all frozen filesystems",
    > + .enable_mask = SYSRQ_ENABLE_SIGNAL,
    > +};
    > +
    > static void sysrq_handle_kill(int key, struct tty_struct *tty)
    > {
    > send_sig_all(SIGKILL);
    > @@ -396,9 +407,9 @@ static struct sysrq_key_op *sysrq_key_ta
    > &sysrq_moom_op, /* f */
    > /* g: May be registered by ppc for kgdb */
    > NULL, /* g */
    > - NULL, /* h */
    > + NULL, /* h - reserved for help */

    Yes, thanks.

    > &sysrq_kill_op, /* i */
    > - NULL, /* j */
    > + &sysrq_thaw_op, /* j */
    > &sysrq_SAK_op, /* k */
    > #ifdef CONFIG_SMP
    > &sysrq_showallcpus_op, /* l */
    > Index: linux-2.6/fs/buffer.c
    > ===================================================================
    > --- linux-2.6.orig/fs/buffer.c 2009-01-16 13:24:15.564575078 -0600
    > +++ linux-2.6/fs/buffer.c 2009-01-16 13:26:35.257575540 -0600
    > @@ -258,6 +258,29 @@ struct super_block *freeze_bdev(struct b
    > }
    > EXPORT_SYMBOL(freeze_bdev);
    >
    > +void do_thaw_all(unsigned long unused)
    > +{
    > + struct super_block *sb;
    > + char b[BDEVNAME_SIZE];
    > +
    > + list_for_each_entry(sb, &super_blocks, s_list) {
    > + while (sb->s_bdev && !thaw_bdev(sb->s_bdev, sb))
    > + printk(KERN_WARNING "Emergency Thaw on %s\n",
    > + bdevname(sb->s_bdev, b));
    > + }
    > + printk(KERN_WARNING "Emergency Thaw complete\n");
    > +}
    > +
    > +/**
    > + * emergency_thaw_all -- forcibly thaw every frozen filesystem
    > + *
    > + * Used for emergency unfreeze of all filesystems via SysRq-z

    -j

    > + */
    > +void emergency_thaw_all(void)
    > +{
    > + pdflush_operation(do_thaw_all, 0);
    > +}
    > +
    > /**
    > * thaw_bdev -- unlock filesystem
    > * @bdev: blockdevice to unlock


    --
    ~Randy


    \
     
     \ /
      Last update: 2009-01-16 20:43    [from the cache]
    ©2003-2014 Jasper Spaans. hosted at Digital Ocean