On Fri 14-09-12 15:46:23, Fernando Luis Vázquez Cao wrote: > thaw_super may be called with superblock lock already taken (fsfreeze's > emergency thaw being one example), so we need an unlocked version to avoid > lockups. > > Cc: Josef Bacik <jbacik@xxxxxxxxxxxx> > Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> > Cc: Jan Kara <jack@xxxxxxx> > Cc: Dave Chinner <dchinner@xxxxxxxxxx> > Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > Signed-off-by: Fernando Luis Vazquez Cao <fernando@xxxxxxxxxxxxx> Looks good. You can add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > > diff -urNp linux-3.6-rc5-orig/fs/super.c linux-3.6-rc5/fs/super.c > --- linux-3.6-rc5-orig/fs/super.c 2012-09-14 12:35:48.076847666 +0900 > +++ linux-3.6-rc5/fs/super.c 2012-09-14 12:41:01.596850005 +0900 > @@ -1437,40 +1437,59 @@ int freeze_super(struct super_block *sb) > EXPORT_SYMBOL(freeze_super); > > /** > - * thaw_super -- unlock filesystem > + * __thaw_super -- unlock filesystem > * @sb: the super to thaw > * > - * Unlocks the filesystem and marks it writeable again after freeze_super(). > + * Unlocks the filesystem and marks it writeable again. > + * > + * This is the unlocked version of thaw_super, so it is the caller's job to > + * to protect the superblock by grabbing the s_umount semaphore in write mode > + * and release it again on return. See thaw_super() for an example. > */ > -int thaw_super(struct super_block *sb) > +int __thaw_super(struct super_block *sb) > { > - int error; > + int error = 0; > > - down_write(&sb->s_umount); > if (sb->s_writers.frozen == SB_UNFROZEN) { > - up_write(&sb->s_umount); > - return -EINVAL; > + error = -EINVAL; > + goto out; > } > > if (sb->s_flags & MS_RDONLY) > - goto out; > + goto out_thaw; > > if (sb->s_op->unfreeze_fs) { > error = sb->s_op->unfreeze_fs(sb); > if (error) { > printk(KERN_ERR > "VFS:Filesystem thaw failed\n"); > - up_write(&sb->s_umount); > - return error; > + goto out; > } > } > > -out: > +out_thaw: > sb->s_writers.frozen = SB_UNFROZEN; > smp_wmb(); > wake_up(&sb->s_writers.wait_unfrozen); > - deactivate_locked_super(sb); > +out: > + return error; > +} > > - return 0; > +/** > + * thaw_super -- unlock filesystem > + * @sb: the super to thaw > + * > + * Unlocks the filesystem and marks it writeable again after freeze_super(). > + */ > +int thaw_super(struct super_block *sb) > +{ > + int res; > + down_write(&sb->s_umount); > + res = __thaw_super(sb); > + if (!res) > + deactivate_locked_super(sb); > + else > + up_write(&sb->s_umount); > + return res; > } > EXPORT_SYMBOL(thaw_super); > diff -urNp linux-3.6-rc5-orig/include/linux/fs.h linux-3.6-rc5/include/linux/fs.h > --- linux-3.6-rc5-orig/include/linux/fs.h 2012-09-14 12:35:48.076847666 +0900 > +++ linux-3.6-rc5/include/linux/fs.h 2012-09-14 12:37:39.304848651 +0900 > @@ -2082,6 +2082,7 @@ extern int user_statfs(const char __user > extern int fd_statfs(int, struct kstatfs *); > extern int vfs_ustat(dev_t, struct kstatfs *); > extern int freeze_super(struct super_block *super); > +extern int __thaw_super(struct super_block *super); > extern int thaw_super(struct super_block *super); > extern bool our_mnt(struct vfsmount *mnt); > > > -- Jan Kara <jack@xxxxxxx> SUSE Labs, CR -- 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