lkml.org 
[lkml]   [2010]   [Mar]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH] Introduce freeze_super and thaw_super for the fsfreeze ioctl
On Tue, Mar 23, 2010 at 02:48:28PM +0000, Al Viro wrote:
> On Tue, Mar 23, 2010 at 10:34:56AM -0400, Josef Bacik wrote:
> > +++ b/fs/block_dev.c
> > @@ -245,35 +245,13 @@ struct super_block *freeze_bdev(struct block_device *bdev)
> > sb = get_active_super(bdev);
>
> sb is an active locked reference
>
> > + error = freeze_super(sb, 1);
> > + if (error) {
> > + bdev->bd_fsfreeze_count--;
> > + mutex_unlock(&bdev->bd_fsfreeze_mutex);
> > + return ERR_PTR(error);
> > }
> > - up_write(&sb->s_umount);
> >
> > out:
> > sync_blockdev(bdev);
>
> > static int ioctl_fsfreeze(struct file *filp)
> > {
> > struct super_block *sb = filp->f_path.dentry->d_inode->i_sb;
>
> sb is an active reference
>

I don't understand how this is an active reference? We are talking about
s_active right?

> > + ret = freeze_super(sb, 0);
> > +
> > + return ret;
> > }
>
> > +int freeze_super(struct super_block *sb, int locked)
> > +{
> > + int ret;
> > +
> > + if (!locked) {
> > + spin_lock(&sb_lock);
> > + ret = grab_super(sb);
>
> What in hell for? We already hold an active reference here. That's leaving
> aside the obvious comments about argument-dependent locking state...

We need to have an active (s_active++) reference to the super throughout the
freeze to make sure somebody doesn't come along and umount the fs until after we
do the thaw. Now, most of this code is copy and pasted, so I don't claim to
understand why it was done this way to begin with, I was just trying to not
change as much as possible. But from what I can tell, we _need_ to have the
active reference on the sb until we thaw. Freeze_bdev already gets this active
reference via get_active_super(), but from what I can tell the ioctl_fsfreeze
doesn't have an active reference, hence the locked argument, so we can do a
grab_super and get the active reference. Would you prefer that I have a
__freeze_super that expects the sb to already have an active reference, and then
make freeze_super do the grab_super instead? Thanks,

Josef


\
 
 \ /
  Last update: 2010-03-23 16:05    [W:0.087 / U:0.584 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site