Skip to content

Commit

Permalink
GFS2: Clean up freeze code
Browse files Browse the repository at this point in the history
The freeze code has not been looked at a lot recently. Upstream has
moved on, and this is an attempt to catch us back up again. There
is a vfs level interface for the freeze code which can be called
from our (obsolete, but kept for backward compatibility purposes)
sysfs freeze interface. This means freezing this way vs. doing it
from the ioctl should now work in identical fashion.

As a result of this, the freeze function is only called once
and we can drop our own special purpose code for counting the
number of freezes.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed Jan 29, 2013
1 parent c76c4d9 commit d564053
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 78 deletions.
3 changes: 0 additions & 3 deletions fs/gfs2/incore.h
Original file line number Diff line number Diff line change
Expand Up @@ -757,10 +757,7 @@ struct gfs2_sbd {
unsigned int sd_replayed_blocks;

/* For quiescing the filesystem */

struct gfs2_holder sd_freeze_gh;
struct mutex sd_freeze_lock;
unsigned int sd_freeze_count;

char sd_fsname[GFS2_FSNAME_LEN];
char sd_table_name[GFS2_FSNAME_LEN];
Expand Down
2 changes: 0 additions & 2 deletions fs/gfs2/ops_fstype.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,6 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)

INIT_LIST_HEAD(&sdp->sd_revoke_list);

mutex_init(&sdp->sd_freeze_lock);

return sdp;
}

Expand Down
61 changes: 4 additions & 57 deletions fs/gfs2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,54 +663,6 @@ static int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp,
return error;
}

/**
* gfs2_freeze_fs - freezes the file system
* @sdp: the file system
*
* This function flushes data and meta data for all machines by
* acquiring the transaction log exclusively. All journals are
* ensured to be in a clean state as well.
*
* Returns: errno
*/

int gfs2_freeze_fs(struct gfs2_sbd *sdp)
{
int error = 0;

mutex_lock(&sdp->sd_freeze_lock);

if (!sdp->sd_freeze_count++) {
error = gfs2_lock_fs_check_clean(sdp, &sdp->sd_freeze_gh);
if (error)
sdp->sd_freeze_count--;
}

mutex_unlock(&sdp->sd_freeze_lock);

return error;
}

/**
* gfs2_unfreeze_fs - unfreezes the file system
* @sdp: the file system
*
* This function allows the file system to proceed by unlocking
* the exclusively held transaction lock. Other GFS2 nodes are
* now free to acquire the lock shared and go on with their lives.
*
*/

void gfs2_unfreeze_fs(struct gfs2_sbd *sdp)
{
mutex_lock(&sdp->sd_freeze_lock);

if (sdp->sd_freeze_count && !--sdp->sd_freeze_count)
gfs2_glock_dq_uninit(&sdp->sd_freeze_gh);

mutex_unlock(&sdp->sd_freeze_lock);
}

void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
{
struct gfs2_dinode *str = buf;
Expand Down Expand Up @@ -888,13 +840,6 @@ static void gfs2_put_super(struct super_block *sb)
int error;
struct gfs2_jdesc *jd;

/* Unfreeze the filesystem, if we need to */

mutex_lock(&sdp->sd_freeze_lock);
if (sdp->sd_freeze_count)
gfs2_glock_dq_uninit(&sdp->sd_freeze_gh);
mutex_unlock(&sdp->sd_freeze_lock);

/* No more recovery requests */
set_bit(SDF_NORECOVERY, &sdp->sd_flags);
smp_mb();
Expand Down Expand Up @@ -985,7 +930,7 @@ static int gfs2_freeze(struct super_block *sb)
return -EINVAL;

for (;;) {
error = gfs2_freeze_fs(sdp);
error = gfs2_lock_fs_check_clean(sdp, &sdp->sd_freeze_gh);
if (!error)
break;

Expand Down Expand Up @@ -1013,7 +958,9 @@ static int gfs2_freeze(struct super_block *sb)

static int gfs2_unfreeze(struct super_block *sb)
{
gfs2_unfreeze_fs(sb->s_fs_info);
struct gfs2_sbd *sdp = sb->s_fs_info;

gfs2_glock_dq_uninit(&sdp->sd_freeze_gh);
return 0;
}

Expand Down
3 changes: 0 additions & 3 deletions fs/gfs2/super.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ extern void update_statfs(struct gfs2_sbd *sdp, struct buffer_head *m_bh,
struct buffer_head *l_bh);
extern int gfs2_statfs_sync(struct super_block *sb, int type);

extern int gfs2_freeze_fs(struct gfs2_sbd *sdp);
extern void gfs2_unfreeze_fs(struct gfs2_sbd *sdp);

extern struct file_system_type gfs2_fs_type;
extern struct file_system_type gfs2meta_fs_type;
extern const struct export_operations gfs2_export_ops;
Expand Down
24 changes: 11 additions & 13 deletions fs/gfs2/sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,39 +91,37 @@ static ssize_t uuid_show(struct gfs2_sbd *sdp, char *buf)

static ssize_t freeze_show(struct gfs2_sbd *sdp, char *buf)
{
unsigned int count;

mutex_lock(&sdp->sd_freeze_lock);
count = sdp->sd_freeze_count;
mutex_unlock(&sdp->sd_freeze_lock);
struct super_block *sb = sdp->sd_vfs;
int frozen = (sb->s_writers.frozen == SB_UNFROZEN) ? 0 : 1;

return snprintf(buf, PAGE_SIZE, "%u\n", count);
return snprintf(buf, PAGE_SIZE, "%u\n", frozen);
}

static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
{
ssize_t ret = len;
int error = 0;
int error;
int n = simple_strtol(buf, NULL, 0);

if (!capable(CAP_SYS_ADMIN))
return -EACCES;

switch (n) {
case 0:
gfs2_unfreeze_fs(sdp);
error = thaw_super(sdp->sd_vfs);
break;
case 1:
error = gfs2_freeze_fs(sdp);
error = freeze_super(sdp->sd_vfs);
break;
default:
ret = -EINVAL;
return -EINVAL;
}

if (error)
if (error) {
fs_warn(sdp, "freeze %d error %d", n, error);
return error;
}

return ret;
return len;
}

static ssize_t withdraw_show(struct gfs2_sbd *sdp, char *buf)
Expand Down

0 comments on commit d564053

Please sign in to comment.