From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kara Subject: Re: [PATCH 2/9] fsfreeze: add unlocked version of thaw_super Date: Tue, 25 Sep 2012 11:13:20 +0200 Message-ID: <20120925091320.GB8049@quack.suse.cz> References: <1347605006.6868.2.camel@nexus.lab.ntt.co.jp> <1347605183.6868.4.camel@nexus.lab.ntt.co.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: Al Viro , Josef Bacik , Eric Sandeen , Dave Chinner , Christoph Hellwig , Jan Kara , linux-fsdevel@vger.kernel.org, fernando@intellilink.co.jp To: Fernando Luis =?iso-8859-1?Q?V=E1zquez?= Cao Return-path: Received: from cantor2.suse.de ([195.135.220.15]:44792 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753379Ab2IYJNW (ORCPT ); Tue, 25 Sep 2012 05:13:22 -0400 Content-Disposition: inline In-Reply-To: <1347605183.6868.4.camel@nexus.lab.ntt.co.jp> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On Fri 14-09-12 15:46:23, Fernando Luis V=E1zquez 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. >=20 > Cc: Josef Bacik > Cc: Christoph Hellwig > Cc: Jan Kara > Cc: Dave Chinner > Reviewed-by: Eric Sandeen > Signed-off-by: Fernando Luis Vazquez Cao Looks good. You can add: Reviewed-by: Jan Kara Honza > --- >=20 > 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); > =20 > /** > - * 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 w= rite 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 =3D 0; > =20 > - down_write(&sb->s_umount); > if (sb->s_writers.frozen =3D=3D SB_UNFROZEN) { > - up_write(&sb->s_umount); > - return -EINVAL; > + error =3D -EINVAL; > + goto out; > } > =20 > if (sb->s_flags & MS_RDONLY) > - goto out; > + goto out_thaw; > =20 > if (sb->s_op->unfreeze_fs) { > error =3D 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; > } > } > =20 > -out: > +out_thaw: > sb->s_writers.frozen =3D SB_UNFROZEN; > smp_wmb(); > wake_up(&sb->s_writers.wait_unfrozen); > - deactivate_locked_super(sb); > +out: > + return error; > +} > =20 > - 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 =3D __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/includ= e/linux/fs.h > --- linux-3.6-rc5-orig/include/linux/fs.h 2012-09-14 12:35:48.0768476= 66 +0900 > +++ linux-3.6-rc5/include/linux/fs.h 2012-09-14 12:37:39.304848651 +0= 900 > @@ -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); > =20 >=20 >=20 --=20 Jan Kara SUSE Labs, CR -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel= " in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html