Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 38649
b: refs/heads/master
c: b09e593
h: refs/heads/master
i:
  38647: 9c14369
v: v3
  • Loading branch information
Steven Whitehouse committed Apr 7, 2006
1 parent 907e318 commit 7648edc
Show file tree
Hide file tree
Showing 15 changed files with 68 additions and 70 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 55eccc6d00cea224bf634d44e9871cfe83200ff2
refs/heads/master: b09e593d799560f1a0782c20ac5900058390a26f
2 changes: 1 addition & 1 deletion trunk/fs/gfs2/daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ int gfs2_logd(void *data)
gfs2_ail1_empty(sdp, DIO_ALL);

if (time_after_eq(jiffies, t)) {
gfs2_log_flush(sdp);
gfs2_log_flush(sdp, NULL);
sdp->sd_log_flush_time = jiffies;
}

Expand Down
2 changes: 2 additions & 0 deletions trunk/fs/gfs2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,8 @@ static struct gfs2_dirent *gfs2_dirent_search(struct inode *inode,
if (error)
return ERR_PTR(error);
dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size, scan, name, NULL);
brelse(bh);

got_dent:
*pbh = bh;
return dent;
Expand Down
6 changes: 3 additions & 3 deletions trunk/fs/gfs2/glops.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ static void meta_go_sync(struct gfs2_glock *gl, int flags)
return;

if (test_and_clear_bit(GLF_DIRTY, &gl->gl_flags)) {
gfs2_log_flush_glock(gl);
gfs2_log_flush(gl->gl_sbd, gl);
gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT);
if (flags & DIO_RELEASE)
gfs2_ail_empty_gl(gl);
Expand Down Expand Up @@ -149,12 +149,12 @@ static void inode_go_sync(struct gfs2_glock *gl, int flags)
if (test_bit(GLF_DIRTY, &gl->gl_flags)) {
if (meta && data) {
gfs2_page_sync(gl, flags | DIO_START);
gfs2_log_flush_glock(gl);
gfs2_log_flush(gl->gl_sbd, gl);
gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT);
gfs2_page_sync(gl, flags | DIO_WAIT);
clear_bit(GLF_DIRTY, &gl->gl_flags);
} else if (meta) {
gfs2_log_flush_glock(gl);
gfs2_log_flush(gl->gl_sbd, gl);
gfs2_meta_sync(gl, flags | DIO_START | DIO_WAIT);
} else if (data)
gfs2_page_sync(gl, flags | DIO_START | DIO_WAIT);
Expand Down
6 changes: 3 additions & 3 deletions trunk/fs/gfs2/incore.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,12 @@ struct gfs2_log_operations {
struct gfs2_log_descriptor *ld, __be64 *ptr,
int pass);
void (*lo_after_scan) (struct gfs2_jdesc *jd, int error, int pass);
char *lo_name;
const char *lo_name;
};

struct gfs2_log_element {
struct list_head le_list;
struct gfs2_log_operations *le_ops;
const struct gfs2_log_operations *le_ops;
};

struct gfs2_bitmap {
Expand Down Expand Up @@ -618,6 +618,7 @@ struct gfs2_sbd {
unsigned int sd_log_num_rg;
unsigned int sd_log_num_databuf;
unsigned int sd_log_num_jdata;
unsigned int sd_log_num_hdrs;

struct list_head sd_log_le_gl;
struct list_head sd_log_le_buf;
Expand All @@ -631,7 +632,6 @@ struct gfs2_sbd {
uint64_t sd_log_sequence;
unsigned int sd_log_head;
unsigned int sd_log_tail;
uint64_t sd_log_wraps;
int sd_log_idle;

unsigned long sd_log_flush_time;
Expand Down
33 changes: 18 additions & 15 deletions trunk/fs/gfs2/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -171,13 +171,14 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks)
while(sdp->sd_log_blks_free <= blks) {
gfs2_log_unlock(sdp);
gfs2_ail1_empty(sdp, 0);
gfs2_log_flush(sdp);
gfs2_log_flush(sdp, NULL);

if (try++)
gfs2_ail1_start(sdp, 0);
gfs2_log_lock(sdp);
}
sdp->sd_log_blks_free -= blks;
/* printk(KERN_INFO "reserved %u blocks (%u left)\n", blks, sdp->sd_log_blks_free); */
gfs2_log_unlock(sdp);
mutex_unlock(&sdp->sd_log_reserve_mutex);

Expand All @@ -199,6 +200,7 @@ void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks)

gfs2_log_lock(sdp);
sdp->sd_log_blks_free += blks;
/* printk(KERN_INFO "released %u blocks (%u left)\n", blks, sdp->sd_log_blks_free); */
gfs2_assert_withdraw(sdp,
sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks);
gfs2_log_unlock(sdp);
Expand Down Expand Up @@ -342,6 +344,7 @@ static void log_pull_tail(struct gfs2_sbd *sdp, unsigned int new_tail, int pull)

gfs2_log_lock(sdp);
sdp->sd_log_blks_free += dist - ((pull) ? 1 : 0);
/* printk(KERN_INFO "pull tail refunding %u blocks (%u left) pull=%d\n", dist - ((pull) ? 1 : 0), sdp->sd_log_blks_free, pull); */
gfs2_assert_withdraw(sdp,
sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks);
gfs2_log_unlock(sdp);
Expand All @@ -364,6 +367,8 @@ static void log_write_header(struct gfs2_sbd *sdp, uint32_t flags, int pull)
unsigned int tail;
uint32_t hash;

/* printk(KERN_INFO "log write header start (flags=%08x, pull=%d)\n", flags, pull); */

bh = sb_getblk(sdp->sd_vfs, blkno);
lock_buffer(bh);
memset(bh->b_data, 0, bh->b_size);
Expand Down Expand Up @@ -398,6 +403,8 @@ static void log_write_header(struct gfs2_sbd *sdp, uint32_t flags, int pull)

sdp->sd_log_idle = (tail == sdp->sd_log_flush_head);
log_incr_head(sdp);

/* printk(KERN_INFO "log write header out\n"); */
}

static void log_flush_commit(struct gfs2_sbd *sdp)
Expand Down Expand Up @@ -432,33 +439,31 @@ static void log_flush_commit(struct gfs2_sbd *sdp)
}

/**
* gfs2_log_flush_i - flush incore transaction(s)
* gfs2_log_flush - flush incore transaction(s)
* @sdp: the filesystem
* @gl: The glock structure to flush. If NULL, flush the whole incore log
*
*/

void gfs2_log_flush_i(struct gfs2_sbd *sdp, struct gfs2_glock *gl)
void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl)
{
struct gfs2_ail *ai;

ai = kzalloc(sizeof(struct gfs2_ail), GFP_NOFS | __GFP_NOFAIL);
INIT_LIST_HEAD(&ai->ai_ail1_list);
INIT_LIST_HEAD(&ai->ai_ail2_list);

down_write(&sdp->sd_log_flush_lock);

if (gl) {
gfs2_log_lock(sdp);
if (list_empty(&gl->gl_le.le_list)) {
gfs2_log_unlock(sdp);
up_write(&sdp->sd_log_flush_lock);
kfree(ai);
return;
}
gfs2_log_unlock(sdp);
}

ai = kzalloc(sizeof(struct gfs2_ail), GFP_NOFS | __GFP_NOFAIL);
INIT_LIST_HEAD(&ai->ai_ail1_list);
INIT_LIST_HEAD(&ai->ai_ail2_list);

gfs2_assert_withdraw(sdp,
sdp->sd_log_num_buf == sdp->sd_log_commited_buf);
Expand All @@ -476,11 +481,12 @@ void gfs2_log_flush_i(struct gfs2_sbd *sdp, struct gfs2_glock *gl)
log_write_header(sdp, 0, PULL);
lops_after_commit(sdp, ai);
sdp->sd_log_head = sdp->sd_log_flush_head;
if (sdp->sd_log_flush_wrapped)
sdp->sd_log_wraps++;

/* printk(KERN_INFO "sd_log_num_hdrs %u\n", sdp->sd_log_num_hdrs); */

sdp->sd_log_blks_reserved =
sdp->sd_log_commited_buf =
sdp->sd_log_num_hdrs =
sdp->sd_log_commited_revoke = 0;

gfs2_log_lock(sdp);
Expand Down Expand Up @@ -519,8 +525,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
sdp->sd_log_blks_free += tr->tr_reserved -
(reserved - sdp->sd_log_blks_reserved);

gfs2_assert_withdraw(sdp,
sdp->sd_log_blks_free >= old);
gfs2_assert_withdraw(sdp, sdp->sd_log_blks_free >= old);
gfs2_assert_withdraw(sdp,
sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks);

Expand Down Expand Up @@ -548,7 +553,7 @@ void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
gfs2_log_lock(sdp);
if (sdp->sd_log_num_buf > gfs2_tune_get(sdp, gt_incore_log_blocks)) {
gfs2_log_unlock(sdp);
gfs2_log_flush(sdp);
gfs2_log_flush(sdp, NULL);
} else
gfs2_log_unlock(sdp);
}
Expand Down Expand Up @@ -583,8 +588,6 @@ void gfs2_log_shutdown(struct gfs2_sbd *sdp)
gfs2_assert_withdraw(sdp, list_empty(&sdp->sd_ail2_list));

sdp->sd_log_head = sdp->sd_log_flush_head;
if (sdp->sd_log_flush_wrapped)
sdp->sd_log_wraps++;
sdp->sd_log_tail = sdp->sd_log_head;

up_write(&sdp->sd_log_flush_lock);
Expand Down
6 changes: 1 addition & 5 deletions trunk/fs/gfs2/log.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ static inline void gfs2_log_pointers_init(struct gfs2_sbd *sdp,
{
if (++value == sdp->sd_jdesc->jd_blocks) {
value = 0;
sdp->sd_log_wraps++;
}
sdp->sd_log_head = sdp->sd_log_tail = value;
}
Expand All @@ -54,10 +53,7 @@ void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks);
struct buffer_head *gfs2_log_get_buf(struct gfs2_sbd *sdp);
struct buffer_head *gfs2_log_fake_buf(struct gfs2_sbd *sdp,
struct buffer_head *real);

#define gfs2_log_flush(sdp) gfs2_log_flush_i((sdp), NULL)
#define gfs2_log_flush_glock(gl) gfs2_log_flush_i((gl)->gl_sbd, (gl))
void gfs2_log_flush_i(struct gfs2_sbd *sdp, struct gfs2_glock *gl);
void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl);
void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans);

void gfs2_log_shutdown(struct gfs2_sbd *sdp);
Expand Down
14 changes: 8 additions & 6 deletions trunk/fs/gfs2/lops.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ static void buf_lo_before_commit(struct gfs2_sbd *sdp)
if (total > limit)
num = limit;
bh = gfs2_log_get_buf(sdp);
sdp->sd_log_num_hdrs++;
ld = (struct gfs2_log_descriptor *)bh->b_data;
ptr = (__be64 *)(bh->b_data + offset);
ld->ld_header.mh_magic = cpu_to_be32(GFS2_MAGIC);
Expand Down Expand Up @@ -570,6 +571,7 @@ static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
gfs2_log_unlock(sdp);
if (!bh) {
bh = gfs2_log_get_buf(sdp);
sdp->sd_log_num_hdrs++;
ld = (struct gfs2_log_descriptor *)
bh->b_data;
ptr = (__be64 *)(bh->b_data + offset);
Expand Down Expand Up @@ -750,13 +752,13 @@ static void databuf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
}


struct gfs2_log_operations gfs2_glock_lops = {
const struct gfs2_log_operations gfs2_glock_lops = {
.lo_add = glock_lo_add,
.lo_after_commit = glock_lo_after_commit,
.lo_name = "glock"
};

struct gfs2_log_operations gfs2_buf_lops = {
const struct gfs2_log_operations gfs2_buf_lops = {
.lo_add = buf_lo_add,
.lo_incore_commit = buf_lo_incore_commit,
.lo_before_commit = buf_lo_before_commit,
Expand All @@ -767,7 +769,7 @@ struct gfs2_log_operations gfs2_buf_lops = {
.lo_name = "buf"
};

struct gfs2_log_operations gfs2_revoke_lops = {
const struct gfs2_log_operations gfs2_revoke_lops = {
.lo_add = revoke_lo_add,
.lo_before_commit = revoke_lo_before_commit,
.lo_before_scan = revoke_lo_before_scan,
Expand All @@ -776,13 +778,13 @@ struct gfs2_log_operations gfs2_revoke_lops = {
.lo_name = "revoke"
};

struct gfs2_log_operations gfs2_rg_lops = {
const struct gfs2_log_operations gfs2_rg_lops = {
.lo_add = rg_lo_add,
.lo_after_commit = rg_lo_after_commit,
.lo_name = "rg"
};

struct gfs2_log_operations gfs2_databuf_lops = {
const struct gfs2_log_operations gfs2_databuf_lops = {
.lo_add = databuf_lo_add,
.lo_incore_commit = buf_lo_incore_commit,
.lo_before_commit = databuf_lo_before_commit,
Expand All @@ -792,7 +794,7 @@ struct gfs2_log_operations gfs2_databuf_lops = {
.lo_name = "databuf"
};

struct gfs2_log_operations *gfs2_log_ops[] = {
const struct gfs2_log_operations *gfs2_log_ops[] = {
&gfs2_glock_lops,
&gfs2_buf_lops,
&gfs2_revoke_lops,
Expand Down
14 changes: 7 additions & 7 deletions trunk/fs/gfs2/lops.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@
#ifndef __LOPS_DOT_H__
#define __LOPS_DOT_H__

extern struct gfs2_log_operations gfs2_glock_lops;
extern struct gfs2_log_operations gfs2_buf_lops;
extern struct gfs2_log_operations gfs2_revoke_lops;
extern struct gfs2_log_operations gfs2_rg_lops;
extern struct gfs2_log_operations gfs2_databuf_lops;
extern const struct gfs2_log_operations gfs2_glock_lops;
extern const struct gfs2_log_operations gfs2_buf_lops;
extern const struct gfs2_log_operations gfs2_revoke_lops;
extern const struct gfs2_log_operations gfs2_rg_lops;
extern const struct gfs2_log_operations gfs2_databuf_lops;

extern struct gfs2_log_operations *gfs2_log_ops[];
extern const struct gfs2_log_operations *gfs2_log_ops[];

static inline void lops_init_le(struct gfs2_log_element *le,
struct gfs2_log_operations *lops)
const struct gfs2_log_operations *lops)
{
INIT_LIST_HEAD(&le->le_list);
le->le_ops = lops;
Expand Down
10 changes: 5 additions & 5 deletions trunk/fs/gfs2/meta_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,12 @@ static int gfs2_aspace_writepage(struct page *page,

static void stuck_releasepage(struct buffer_head *bh)
{
struct gfs2_sbd *sdp = bh->b_page->mapping->host->i_sb->s_fs_info;
struct inode *inode = bh->b_page->mapping->host;
struct gfs2_sbd *sdp = inode->i_sb->s_fs_info;
struct gfs2_bufdata *bd = bh->b_private;
struct gfs2_glock *gl;

fs_warn(sdp, "stuck in gfs2_releasepage()\n");
fs_warn(sdp, "stuck in gfs2_releasepage() %p\n", inode);
fs_warn(sdp, "blkno = %llu, bh->b_count = %d\n",
(uint64_t)bh->b_blocknr, atomic_read(&bh->b_count));
fs_warn(sdp, "pinned = %u\n", buffer_pinned(bh));
Expand Down Expand Up @@ -191,7 +192,6 @@ struct inode *gfs2_aspace_get(struct gfs2_sbd *sdp)
aspace->u.generic_ip = NULL;
insert_inode_hash(aspace);
}

return aspace;
}

Expand Down Expand Up @@ -353,7 +353,7 @@ void gfs2_ail_empty_gl(struct gfs2_glock *gl)
gfs2_log_unlock(sdp);

gfs2_trans_end(sdp);
gfs2_log_flush(sdp);
gfs2_log_flush(sdp, NULL);
}

/**
Expand Down Expand Up @@ -876,7 +876,7 @@ void gfs2_meta_ra(struct gfs2_glock *gl, uint64_t dblock, uint32_t extlen)

void gfs2_meta_syncfs(struct gfs2_sbd *sdp)
{
gfs2_log_flush(sdp);
gfs2_log_flush(sdp, NULL);
for (;;) {
gfs2_ail1_start(sdp, DIO_ALL);
if (gfs2_ail1_empty(sdp, DIO_ALL))
Expand Down
Loading

0 comments on commit 7648edc

Please sign in to comment.