gfs2: pass through holder from the VFS for freeze/thaw
[ Upstream commit 62a2175ddf7e72941868f164b7c1f92e00f213bd ] The filesystem's freeze/thaw functions can be called from contexts where the holder isn't userspace but the kernel, e.g., during systemd suspend/hibernate. So pass through the freeze/thaw flags from the VFS instead of hard-coding them. Signed-off-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0a2500782f
commit
7b4bf4d896
+8
-6
@@ -674,7 +674,7 @@ static int gfs2_sync_fs(struct super_block *sb, int wait)
|
|||||||
return sdp->sd_log_error;
|
return sdp->sd_log_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gfs2_do_thaw(struct gfs2_sbd *sdp)
|
static int gfs2_do_thaw(struct gfs2_sbd *sdp, enum freeze_holder who)
|
||||||
{
|
{
|
||||||
struct super_block *sb = sdp->sd_vfs;
|
struct super_block *sb = sdp->sd_vfs;
|
||||||
int error;
|
int error;
|
||||||
@@ -682,7 +682,7 @@ static int gfs2_do_thaw(struct gfs2_sbd *sdp)
|
|||||||
error = gfs2_freeze_lock_shared(sdp);
|
error = gfs2_freeze_lock_shared(sdp);
|
||||||
if (error)
|
if (error)
|
||||||
goto fail;
|
goto fail;
|
||||||
error = thaw_super(sb, FREEZE_HOLDER_USERSPACE);
|
error = thaw_super(sb, who);
|
||||||
if (!error)
|
if (!error)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -710,7 +710,7 @@ void gfs2_freeze_func(struct work_struct *work)
|
|||||||
gfs2_freeze_unlock(sdp);
|
gfs2_freeze_unlock(sdp);
|
||||||
set_bit(SDF_FROZEN, &sdp->sd_flags);
|
set_bit(SDF_FROZEN, &sdp->sd_flags);
|
||||||
|
|
||||||
error = gfs2_do_thaw(sdp);
|
error = gfs2_do_thaw(sdp, FREEZE_HOLDER_USERSPACE);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@@ -728,6 +728,7 @@ out:
|
|||||||
/**
|
/**
|
||||||
* gfs2_freeze_super - prevent further writes to the filesystem
|
* gfs2_freeze_super - prevent further writes to the filesystem
|
||||||
* @sb: the VFS structure for the filesystem
|
* @sb: the VFS structure for the filesystem
|
||||||
|
* @who: freeze flags
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -744,7 +745,7 @@ static int gfs2_freeze_super(struct super_block *sb, enum freeze_holder who)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
error = freeze_super(sb, FREEZE_HOLDER_USERSPACE);
|
error = freeze_super(sb, who);
|
||||||
if (error) {
|
if (error) {
|
||||||
fs_info(sdp, "GFS2: couldn't freeze filesystem: %d\n",
|
fs_info(sdp, "GFS2: couldn't freeze filesystem: %d\n",
|
||||||
error);
|
error);
|
||||||
@@ -758,7 +759,7 @@ static int gfs2_freeze_super(struct super_block *sb, enum freeze_holder who)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = gfs2_do_thaw(sdp);
|
error = gfs2_do_thaw(sdp, who);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@@ -796,6 +797,7 @@ static int gfs2_freeze_fs(struct super_block *sb)
|
|||||||
/**
|
/**
|
||||||
* gfs2_thaw_super - reallow writes to the filesystem
|
* gfs2_thaw_super - reallow writes to the filesystem
|
||||||
* @sb: the VFS structure for the filesystem
|
* @sb: the VFS structure for the filesystem
|
||||||
|
* @who: freeze flags
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -814,7 +816,7 @@ static int gfs2_thaw_super(struct super_block *sb, enum freeze_holder who)
|
|||||||
atomic_inc(&sb->s_active);
|
atomic_inc(&sb->s_active);
|
||||||
gfs2_freeze_unlock(sdp);
|
gfs2_freeze_unlock(sdp);
|
||||||
|
|
||||||
error = gfs2_do_thaw(sdp);
|
error = gfs2_do_thaw(sdp, who);
|
||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
clear_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags);
|
clear_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags);
|
||||||
|
|||||||
Reference in New Issue
Block a user