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>
This commit is contained in:
Steven Whitehouse 2013-01-11 10:49:34 +00:00
Родитель c76c4d96bd
Коммит d564053f07
5 изменённых файлов: 15 добавлений и 78 удалений

Просмотреть файл

@ -757,10 +757,7 @@ struct gfs2_sbd {
unsigned int sd_replayed_blocks; unsigned int sd_replayed_blocks;
/* For quiescing the filesystem */ /* For quiescing the filesystem */
struct gfs2_holder sd_freeze_gh; struct gfs2_holder sd_freeze_gh;
struct mutex sd_freeze_lock;
unsigned int sd_freeze_count;
char sd_fsname[GFS2_FSNAME_LEN]; char sd_fsname[GFS2_FSNAME_LEN];
char sd_table_name[GFS2_FSNAME_LEN]; char sd_table_name[GFS2_FSNAME_LEN];

Просмотреть файл

@ -115,8 +115,6 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
INIT_LIST_HEAD(&sdp->sd_revoke_list); INIT_LIST_HEAD(&sdp->sd_revoke_list);
mutex_init(&sdp->sd_freeze_lock);
return sdp; return sdp;
} }

Просмотреть файл

@ -663,54 +663,6 @@ out:
return error; 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) void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
{ {
struct gfs2_dinode *str = buf; struct gfs2_dinode *str = buf;
@ -888,13 +840,6 @@ static void gfs2_put_super(struct super_block *sb)
int error; int error;
struct gfs2_jdesc *jd; 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 */ /* No more recovery requests */
set_bit(SDF_NORECOVERY, &sdp->sd_flags); set_bit(SDF_NORECOVERY, &sdp->sd_flags);
smp_mb(); smp_mb();
@ -985,7 +930,7 @@ static int gfs2_freeze(struct super_block *sb)
return -EINVAL; return -EINVAL;
for (;;) { for (;;) {
error = gfs2_freeze_fs(sdp); error = gfs2_lock_fs_check_clean(sdp, &sdp->sd_freeze_gh);
if (!error) if (!error)
break; break;
@ -1013,7 +958,9 @@ static int gfs2_freeze(struct super_block *sb)
static int gfs2_unfreeze(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; return 0;
} }

Просмотреть файл

@ -46,9 +46,6 @@ extern void update_statfs(struct gfs2_sbd *sdp, struct buffer_head *m_bh,
struct buffer_head *l_bh); struct buffer_head *l_bh);
extern int gfs2_statfs_sync(struct super_block *sb, int type); 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 gfs2_fs_type;
extern struct file_system_type gfs2meta_fs_type; extern struct file_system_type gfs2meta_fs_type;
extern const struct export_operations gfs2_export_ops; extern const struct export_operations gfs2_export_ops;

Просмотреть файл

@ -91,19 +91,15 @@ static ssize_t uuid_show(struct gfs2_sbd *sdp, char *buf)
static ssize_t freeze_show(struct gfs2_sbd *sdp, char *buf) static ssize_t freeze_show(struct gfs2_sbd *sdp, char *buf)
{ {
unsigned int count; struct super_block *sb = sdp->sd_vfs;
int frozen = (sb->s_writers.frozen == SB_UNFROZEN) ? 0 : 1;
mutex_lock(&sdp->sd_freeze_lock); return snprintf(buf, PAGE_SIZE, "%u\n", frozen);
count = sdp->sd_freeze_count;
mutex_unlock(&sdp->sd_freeze_lock);
return snprintf(buf, PAGE_SIZE, "%u\n", count);
} }
static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len) static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
{ {
ssize_t ret = len; int error;
int error = 0;
int n = simple_strtol(buf, NULL, 0); int n = simple_strtol(buf, NULL, 0);
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
@ -111,19 +107,21 @@ static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
switch (n) { switch (n) {
case 0: case 0:
gfs2_unfreeze_fs(sdp); error = thaw_super(sdp->sd_vfs);
break; break;
case 1: case 1:
error = gfs2_freeze_fs(sdp); error = freeze_super(sdp->sd_vfs);
break; break;
default: default:
ret = -EINVAL; return -EINVAL;
} }
if (error) if (error) {
fs_warn(sdp, "freeze %d error %d", n, 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) static ssize_t withdraw_show(struct gfs2_sbd *sdp, char *buf)