On 9/13/12 6:03 AM, Fernando Luis Vázquez Cao wrote: > The thawing of a filesystem through sysrq-j loops infinitely as it > incorrectly detects a thawed filesytsem as frozen and tries to > unfreeze repeatedly. This is a regression caused by > 4504230a71566785a05d3e6b53fa1ee071b864eb ("freeze_bdev: grab active > reference to frozen superblocks") in that it no longer returned > -EINVAL for superblocks that were not frozen. > > Return -EINVAL when the filesystem is already unfrozen to avoid this > problem. > > Cc: Josef Bacik <jbacik@xxxxxxxxxxxx> > Cc: Eric Sandeen <sandeen@xxxxxxxxxx> > Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> > Reviewed-by: Jan Kara <jack@xxxxxxx> > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> > Signed-off-by: Fernando Luis Vazquez Cao <fernando@xxxxxxxxxxxxx> Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> I actually sent a simpler (but less cleaned up) version of this 2 years ago, I guess it got missed and I didn't notice. So thanks! -Eric > --- > > diff -urNp vfs-orig/fs/block_dev.c vfs/fs/block_dev.c > --- vfs-orig/fs/block_dev.c 2012-07-04 18:57:54.000000000 +0900 > +++ vfs/fs/block_dev.c 2012-07-12 13:22:38.124815295 +0900 > @@ -319,22 +319,17 @@ int thaw_bdev(struct block_device *bdev, > if (!bdev->bd_fsfreeze_count) > goto out; > > - error = 0; > - if (--bdev->bd_fsfreeze_count > 0) > - goto out; > - > - if (!sb) > + if (--bdev->bd_fsfreeze_count > 0 || !sb) { > + error = 0; > goto out; > + } > > error = thaw_super(sb); > - if (error) { > + if (error) > bdev->bd_fsfreeze_count++; > - mutex_unlock(&bdev->bd_fsfreeze_mutex); > - return error; > - } > out: > mutex_unlock(&bdev->bd_fsfreeze_mutex); > - return 0; > + return error; > } > EXPORT_SYMBOL(thaw_bdev); > > > -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html