Takashi Sato wrote:
> @@ -141,6 +142,57 @@ static int ioctl_fioasync(unsigned int f
> + * ioctl_freeze - Freeze the filesystem.
> + *
> + * @filp: target file
> + *
> + * Call freeze_bdev() to freeze the filesystem.
> + */
> +static int ioctl_freeze(struct file *filp)
> + struct super_block *sb = filp->f_path.dentry->d_inode->i_sb;
> + if (!capable(CAP_SYS_ADMIN))
> + return -EPERM;
> + /* If filesystem doesn't support freeze feature, return. */
> + if (sb->s_op->write_super_lockfs == NULL)
> + return -EOPNOTSUPP;
> + /* If a regular file or a directory isn't specified, return. */
> + if (sb->s_bdev == NULL)
> + return -EINVAL;
> + /* Freeze */
> + sb = freeze_bdev(sb->s_bdev);
> + if (IS_ERR(sb))
> + return PTR_ERR(sb);
> + return 0;
Not a problem with your patch exactly, but I was just wondering; you
check here whether the sb returned from freeze_bdev is an ERR_PTR (as
does lock_fs()) - but, freeze_bdev never returns an error, does it?
->write_super_lockfs is a void...
It really seems that at least we should be able to handle IO errors on
the freeze request, and tell the user "No, your filesystem was not
Maybe I'll whip up a patch to see about propagating freeze errors up
from the filesystems that implement it, unless I'm missing some reason
not to do so...?
Also, should this be checking for a NULL returned from freeze_bdev as
well? I guess this should never happen if we have a file open on which
we are calling the ioctl ...