git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge master.kernel.org:/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw
[pandora-kernel.git]
/
fs
/
gfs2
/
lops.c
diff --git
a/fs/gfs2/lops.c
b/fs/gfs2/lops.c
index
ab6d111
..
4d7f94d
100644
(file)
--- a/
fs/gfs2/lops.c
+++ b/
fs/gfs2/lops.c
@@
-182,7
+182,7
@@
static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
}
static void buf_lo_before_scan(struct gfs2_jdesc *jd,
}
static void buf_lo_before_scan(struct gfs2_jdesc *jd,
- struct gfs2_log_header *head, int pass)
+ struct gfs2_log_header
_host
*head, int pass)
{
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
{
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
@@
-328,7
+328,7
@@
static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
}
static void revoke_lo_before_scan(struct gfs2_jdesc *jd,
}
static void revoke_lo_before_scan(struct gfs2_jdesc *jd,
- struct gfs2_log_header *head, int pass)
+ struct gfs2_log_header
_host
*head, int pass)
{
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
{
struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
@@
-509,7
+509,7
@@
static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
{
LIST_HEAD(started);
struct gfs2_bufdata *bd1 = NULL, *bd2, *bdt;
{
LIST_HEAD(started);
struct gfs2_bufdata *bd1 = NULL, *bd2, *bdt;
- struct buffer_head *bh = NULL;
+ struct buffer_head *bh = NULL
,*bh1 = NULL
;
unsigned int offset = sizeof(struct gfs2_log_descriptor);
struct gfs2_log_descriptor *ld;
unsigned int limit;
unsigned int offset = sizeof(struct gfs2_log_descriptor);
struct gfs2_log_descriptor *ld;
unsigned int limit;
@@
-537,8
+537,13
@@
static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
list_for_each_entry_safe_continue(bd1, bdt,
&sdp->sd_log_le_databuf,
bd_le.le_list) {
list_for_each_entry_safe_continue(bd1, bdt,
&sdp->sd_log_le_databuf,
bd_le.le_list) {
+ /* store off the buffer head in a local ptr since
+ * gfs2_bufdata might change when we drop the log lock
+ */
+ bh1 = bd1->bd_bh;
+
/* An ordered write buffer */
/* An ordered write buffer */
- if (b
d1->bd_bh && !buffer_pinned(bd1->bd_bh
)) {
+ if (b
h1 && !buffer_pinned(bh1
)) {
list_move(&bd1->bd_le.le_list, &started);
if (bd1 == bd2) {
bd2 = NULL;
list_move(&bd1->bd_le.le_list, &started);
if (bd1 == bd2) {
bd2 = NULL;
@@
-547,20
+552,21
@@
static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
bd_le.le_list);
}
total_dbuf--;
bd_le.le_list);
}
total_dbuf--;
- if (bd1->bd_bh) {
- get_bh(bd1->bd_bh);
- if (buffer_dirty(bd1->bd_bh)) {
+ if (bh1) {
+ if (buffer_dirty(bh1)) {
+ get_bh(bh1);
+
gfs2_log_unlock(sdp);
gfs2_log_unlock(sdp);
- wait_on_buffer(bd1->bd_bh);
- ll_rw_block(WRITE, 1,
- &bd1->bd_bh);
+
+ ll_rw_block(SWRITE, 1, &bh1);
+ brelse(bh1);
+
gfs2_log_lock(sdp);
}
gfs2_log_lock(sdp);
}
- brelse(bd1->bd_bh);
continue;
}
continue;
continue;
}
continue;
- } else if (b
d1->bd_bh
) { /* A journaled buffer */
+ } else if (b
h1
) { /* A journaled buffer */
int magic;
gfs2_log_unlock(sdp);
if (!bh) {
int magic;
gfs2_log_unlock(sdp);
if (!bh) {
@@
-582,16
+588,16
@@
static void databuf_lo_before_commit(struct gfs2_sbd *sdp)
ld->ld_data2 = cpu_to_be32(0);
memset(ld->ld_reserved, 0, sizeof(ld->ld_reserved));
}
ld->ld_data2 = cpu_to_be32(0);
memset(ld->ld_reserved, 0, sizeof(ld->ld_reserved));
}
- magic = gfs2_check_magic(b
d1->bd_bh
);
- *ptr++ = cpu_to_be64(b
d1->bd_bh
->b_blocknr);
+ magic = gfs2_check_magic(b
h1
);
+ *ptr++ = cpu_to_be64(b
h1
->b_blocknr);
*ptr++ = cpu_to_be64((__u64)magic);
*ptr++ = cpu_to_be64((__u64)magic);
- clear_buffer_escaped(b
d1->bd_bh
);
+ clear_buffer_escaped(b
h1
);
if (unlikely(magic != 0))
if (unlikely(magic != 0))
- set_buffer_escaped(b
d1->bd_bh
);
+ set_buffer_escaped(b
h1
);
gfs2_log_lock(sdp);
if (n++ > num)
break;
gfs2_log_lock(sdp);
if (n++ > num)
break;
- } else if (!b
d1->bd_bh
) {
+ } else if (!b
h1
) {
total_dbuf--;
sdp->sd_log_num_databuf--;
list_del_init(&bd1->bd_le.le_list);
total_dbuf--;
sdp->sd_log_num_databuf--;
list_del_init(&bd1->bd_le.le_list);