|
@@ -76,29 +76,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * gfs2_pte_inval - Sync and invalidate all PTEs associated with a glock
|
|
|
- * @gl: the glock
|
|
|
- *
|
|
|
- */
|
|
|
-
|
|
|
-static void gfs2_pte_inval(struct gfs2_glock *gl)
|
|
|
-{
|
|
|
- struct gfs2_inode *ip;
|
|
|
- struct inode *inode;
|
|
|
-
|
|
|
- ip = gl->gl_object;
|
|
|
- inode = &ip->i_inode;
|
|
|
- if (!ip || !S_ISREG(inode->i_mode))
|
|
|
- return;
|
|
|
-
|
|
|
- unmap_shared_mapping_range(inode->i_mapping, 0, 0);
|
|
|
- if (test_bit(GIF_SW_PAGED, &ip->i_flags))
|
|
|
- set_bit(GLF_DIRTY, &gl->gl_flags);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * meta_go_sync - sync out the metadata for this glock
|
|
|
+ * rgrp_go_sync - sync out the metadata for this glock
|
|
|
* @gl: the glock
|
|
|
*
|
|
|
* Called when demoting or unlocking an EX glock. We must flush
|
|
@@ -106,36 +84,42 @@ static void gfs2_pte_inval(struct gfs2_glock *gl)
|
|
|
* not return to caller to demote/unlock the glock until I/O is complete.
|
|
|
*/
|
|
|
|
|
|
-static void meta_go_sync(struct gfs2_glock *gl)
|
|
|
+static void rgrp_go_sync(struct gfs2_glock *gl)
|
|
|
{
|
|
|
- if (gl->gl_state != LM_ST_EXCLUSIVE)
|
|
|
+ struct address_space *metamapping = gl->gl_aspace->i_mapping;
|
|
|
+ int error;
|
|
|
+
|
|
|
+ if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags))
|
|
|
return;
|
|
|
+ BUG_ON(gl->gl_state != LM_ST_EXCLUSIVE);
|
|
|
|
|
|
- if (test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) {
|
|
|
- gfs2_log_flush(gl->gl_sbd, gl);
|
|
|
- gfs2_meta_sync(gl);
|
|
|
- gfs2_ail_empty_gl(gl);
|
|
|
- }
|
|
|
+ gfs2_log_flush(gl->gl_sbd, gl);
|
|
|
+ filemap_fdatawrite(metamapping);
|
|
|
+ error = filemap_fdatawait(metamapping);
|
|
|
+ mapping_set_error(metamapping, error);
|
|
|
+ gfs2_ail_empty_gl(gl);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * meta_go_inval - invalidate the metadata for this glock
|
|
|
+ * rgrp_go_inval - invalidate the metadata for this glock
|
|
|
* @gl: the glock
|
|
|
* @flags:
|
|
|
*
|
|
|
+ * We never used LM_ST_DEFERRED with resource groups, so that we
|
|
|
+ * should always see the metadata flag set here.
|
|
|
+ *
|
|
|
*/
|
|
|
|
|
|
-static void meta_go_inval(struct gfs2_glock *gl, int flags)
|
|
|
+static void rgrp_go_inval(struct gfs2_glock *gl, int flags)
|
|
|
{
|
|
|
- if (!(flags & DIO_METADATA))
|
|
|
- return;
|
|
|
+ struct address_space *mapping = gl->gl_aspace->i_mapping;
|
|
|
|
|
|
- gfs2_meta_inval(gl);
|
|
|
- if (gl->gl_object == GFS2_I(gl->gl_sbd->sd_rindex))
|
|
|
- gl->gl_sbd->sd_rindex_uptodate = 0;
|
|
|
- else if (gl->gl_ops == &gfs2_rgrp_glops && gl->gl_object) {
|
|
|
- struct gfs2_rgrpd *rgd = (struct gfs2_rgrpd *)gl->gl_object;
|
|
|
+ BUG_ON(!(flags & DIO_METADATA));
|
|
|
+ gfs2_assert_withdraw(gl->gl_sbd, !atomic_read(&gl->gl_ail_count));
|
|
|
+ truncate_inode_pages(mapping, 0);
|
|
|
|
|
|
+ if (gl->gl_object) {
|
|
|
+ struct gfs2_rgrpd *rgd = (struct gfs2_rgrpd *)gl->gl_object;
|
|
|
rgd->rd_flags &= ~GFS2_RDF_UPTODATE;
|
|
|
}
|
|
|
}
|
|
@@ -152,48 +136,54 @@ static void inode_go_sync(struct gfs2_glock *gl)
|
|
|
struct address_space *metamapping = gl->gl_aspace->i_mapping;
|
|
|
int error;
|
|
|
|
|
|
- if (gl->gl_state != LM_ST_UNLOCKED)
|
|
|
- gfs2_pte_inval(gl);
|
|
|
- if (gl->gl_state != LM_ST_EXCLUSIVE)
|
|
|
- return;
|
|
|
-
|
|
|
if (ip && !S_ISREG(ip->i_inode.i_mode))
|
|
|
ip = NULL;
|
|
|
+ if (ip && test_and_clear_bit(GIF_SW_PAGED, &ip->i_flags))
|
|
|
+ unmap_shared_mapping_range(ip->i_inode.i_mapping, 0, 0);
|
|
|
+ if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags))
|
|
|
+ return;
|
|
|
|
|
|
- if (test_bit(GLF_DIRTY, &gl->gl_flags)) {
|
|
|
- gfs2_log_flush(gl->gl_sbd, gl);
|
|
|
- filemap_fdatawrite(metamapping);
|
|
|
- if (ip) {
|
|
|
- struct address_space *mapping = ip->i_inode.i_mapping;
|
|
|
- filemap_fdatawrite(mapping);
|
|
|
- error = filemap_fdatawait(mapping);
|
|
|
- mapping_set_error(mapping, error);
|
|
|
- }
|
|
|
- error = filemap_fdatawait(metamapping);
|
|
|
- mapping_set_error(metamapping, error);
|
|
|
- clear_bit(GLF_DIRTY, &gl->gl_flags);
|
|
|
- gfs2_ail_empty_gl(gl);
|
|
|
+ BUG_ON(gl->gl_state != LM_ST_EXCLUSIVE);
|
|
|
+
|
|
|
+ gfs2_log_flush(gl->gl_sbd, gl);
|
|
|
+ filemap_fdatawrite(metamapping);
|
|
|
+ if (ip) {
|
|
|
+ struct address_space *mapping = ip->i_inode.i_mapping;
|
|
|
+ filemap_fdatawrite(mapping);
|
|
|
+ error = filemap_fdatawait(mapping);
|
|
|
+ mapping_set_error(mapping, error);
|
|
|
}
|
|
|
+ error = filemap_fdatawait(metamapping);
|
|
|
+ mapping_set_error(metamapping, error);
|
|
|
+ gfs2_ail_empty_gl(gl);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* inode_go_inval - prepare a inode glock to be released
|
|
|
* @gl: the glock
|
|
|
* @flags:
|
|
|
+ *
|
|
|
+ * Normally we invlidate everything, but if we are moving into
|
|
|
+ * LM_ST_DEFERRED from LM_ST_SHARED or LM_ST_EXCLUSIVE then we
|
|
|
+ * can keep hold of the metadata, since it won't have changed.
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
static void inode_go_inval(struct gfs2_glock *gl, int flags)
|
|
|
{
|
|
|
struct gfs2_inode *ip = gl->gl_object;
|
|
|
- int meta = (flags & DIO_METADATA);
|
|
|
|
|
|
- if (meta) {
|
|
|
- gfs2_meta_inval(gl);
|
|
|
+ gfs2_assert_withdraw(gl->gl_sbd, !atomic_read(&gl->gl_ail_count));
|
|
|
+
|
|
|
+ if (flags & DIO_METADATA) {
|
|
|
+ struct address_space *mapping = gl->gl_aspace->i_mapping;
|
|
|
+ truncate_inode_pages(mapping, 0);
|
|
|
if (ip)
|
|
|
set_bit(GIF_INVALID, &ip->i_flags);
|
|
|
}
|
|
|
|
|
|
+ if (ip == GFS2_I(gl->gl_sbd->sd_rindex))
|
|
|
+ gl->gl_sbd->sd_rindex_uptodate = 0;
|
|
|
if (ip && S_ISREG(ip->i_inode.i_mode))
|
|
|
truncate_inode_pages(ip->i_inode.i_mapping, 0);
|
|
|
}
|
|
@@ -395,7 +385,6 @@ static int trans_go_demote_ok(const struct gfs2_glock *gl)
|
|
|
}
|
|
|
|
|
|
const struct gfs2_glock_operations gfs2_meta_glops = {
|
|
|
- .go_xmote_th = meta_go_sync,
|
|
|
.go_type = LM_TYPE_META,
|
|
|
};
|
|
|
|
|
@@ -410,8 +399,8 @@ const struct gfs2_glock_operations gfs2_inode_glops = {
|
|
|
};
|
|
|
|
|
|
const struct gfs2_glock_operations gfs2_rgrp_glops = {
|
|
|
- .go_xmote_th = meta_go_sync,
|
|
|
- .go_inval = meta_go_inval,
|
|
|
+ .go_xmote_th = rgrp_go_sync,
|
|
|
+ .go_inval = rgrp_go_inval,
|
|
|
.go_demote_ok = rgrp_go_demote_ok,
|
|
|
.go_lock = rgrp_go_lock,
|
|
|
.go_unlock = rgrp_go_unlock,
|