static void inode_go_sync(struct gfs2_glock *gl) { struct gfs2_inode *ip = gl->gl_object; 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 (test_bit(GLF_DIRTY, &gl->gl_flags)) { if (ip && !gfs2_is_jdata(ip)) filemap_fdatawrite(ip->i_inode.i_mapping); gfs2_log_flush(gl->gl_sbd, gl); if (ip && gfs2_is_jdata(ip)) filemap_fdatawrite(ip->i_inode.i_mapping); gfs2_meta_sync(gl); if (ip) { struct address_space *mapping = ip->i_inode.i_mapping; int error = filemap_fdatawait(mapping); if (error == -ENOSPC) set_bit(AS_ENOSPC, &mapping->flags); else if (error) set_bit(AS_EIO, &mapping->flags); } clear_bit(GLF_DIRTY, &gl->gl_flags); gfs2_ail_empty_gl(gl); } }
static void meta_go_sync(struct gfs2_glock *gl) { if (gl->gl_state != LM_ST_EXCLUSIVE) return; 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); } }