|
@@ -648,49 +648,67 @@ out_of_blocks:
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * log_write_header - Get and initialize a journal header buffer
|
|
|
|
|
|
+ * write_log_header - Write a journal log header buffer at sd_log_flush_head
|
|
* @sdp: The GFS2 superblock
|
|
* @sdp: The GFS2 superblock
|
|
|
|
+ * @seq: sequence number
|
|
|
|
+ * @tail: tail of the log
|
|
|
|
+ * @flags: log header flags
|
|
|
|
+ * @op_flags: flags to pass to the bio
|
|
*
|
|
*
|
|
* Returns: the initialized log buffer descriptor
|
|
* Returns: the initialized log buffer descriptor
|
|
*/
|
|
*/
|
|
|
|
|
|
-static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
|
|
|
|
|
|
+void gfs2_write_log_header(struct gfs2_sbd *sdp, u64 seq, u32 tail,
|
|
|
|
+ u32 flags, int op_flags)
|
|
{
|
|
{
|
|
struct gfs2_log_header *lh;
|
|
struct gfs2_log_header *lh;
|
|
- unsigned int tail;
|
|
|
|
u32 hash;
|
|
u32 hash;
|
|
- int op_flags = REQ_PREFLUSH | REQ_FUA | REQ_META | REQ_SYNC;
|
|
|
|
struct page *page = mempool_alloc(gfs2_page_pool, GFP_NOIO);
|
|
struct page *page = mempool_alloc(gfs2_page_pool, GFP_NOIO);
|
|
- enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);
|
|
|
|
|
|
+
|
|
lh = page_address(page);
|
|
lh = page_address(page);
|
|
clear_page(lh);
|
|
clear_page(lh);
|
|
|
|
|
|
- gfs2_assert_withdraw(sdp, (state != SFS_FROZEN));
|
|
|
|
-
|
|
|
|
- tail = current_tail(sdp);
|
|
|
|
-
|
|
|
|
lh->lh_header.mh_magic = cpu_to_be32(GFS2_MAGIC);
|
|
lh->lh_header.mh_magic = cpu_to_be32(GFS2_MAGIC);
|
|
lh->lh_header.mh_type = cpu_to_be32(GFS2_METATYPE_LH);
|
|
lh->lh_header.mh_type = cpu_to_be32(GFS2_METATYPE_LH);
|
|
lh->lh_header.__pad0 = cpu_to_be64(0);
|
|
lh->lh_header.__pad0 = cpu_to_be64(0);
|
|
lh->lh_header.mh_format = cpu_to_be32(GFS2_FORMAT_LH);
|
|
lh->lh_header.mh_format = cpu_to_be32(GFS2_FORMAT_LH);
|
|
lh->lh_header.mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid);
|
|
lh->lh_header.mh_jid = cpu_to_be32(sdp->sd_jdesc->jd_jid);
|
|
- lh->lh_sequence = cpu_to_be64(sdp->sd_log_sequence++);
|
|
|
|
|
|
+ lh->lh_sequence = cpu_to_be64(seq);
|
|
lh->lh_flags = cpu_to_be32(flags);
|
|
lh->lh_flags = cpu_to_be32(flags);
|
|
lh->lh_tail = cpu_to_be32(tail);
|
|
lh->lh_tail = cpu_to_be32(tail);
|
|
lh->lh_blkno = cpu_to_be32(sdp->sd_log_flush_head);
|
|
lh->lh_blkno = cpu_to_be32(sdp->sd_log_flush_head);
|
|
hash = gfs2_disk_hash(page_address(page), sizeof(struct gfs2_log_header));
|
|
hash = gfs2_disk_hash(page_address(page), sizeof(struct gfs2_log_header));
|
|
lh->lh_hash = cpu_to_be32(hash);
|
|
lh->lh_hash = cpu_to_be32(hash);
|
|
|
|
|
|
|
|
+ gfs2_log_write_page(sdp, page);
|
|
|
|
+ gfs2_log_flush_bio(sdp, REQ_OP_WRITE, op_flags);
|
|
|
|
+ log_flush_wait(sdp);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * log_write_header - Get and initialize a journal header buffer
|
|
|
|
+ * @sdp: The GFS2 superblock
|
|
|
|
+ *
|
|
|
|
+ * Returns: the initialized log buffer descriptor
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
|
|
|
|
+{
|
|
|
|
+ unsigned int tail;
|
|
|
|
+ int op_flags = REQ_PREFLUSH | REQ_FUA | REQ_META | REQ_SYNC;
|
|
|
|
+ enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);
|
|
|
|
+
|
|
|
|
+ gfs2_assert_withdraw(sdp, (state != SFS_FROZEN));
|
|
|
|
+ tail = current_tail(sdp);
|
|
|
|
+
|
|
if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) {
|
|
if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) {
|
|
gfs2_ordered_wait(sdp);
|
|
gfs2_ordered_wait(sdp);
|
|
log_flush_wait(sdp);
|
|
log_flush_wait(sdp);
|
|
op_flags = REQ_SYNC | REQ_META | REQ_PRIO;
|
|
op_flags = REQ_SYNC | REQ_META | REQ_PRIO;
|
|
}
|
|
}
|
|
-
|
|
|
|
sdp->sd_log_idle = (tail == sdp->sd_log_flush_head);
|
|
sdp->sd_log_idle = (tail == sdp->sd_log_flush_head);
|
|
- gfs2_log_write_page(sdp, page);
|
|
|
|
- gfs2_log_flush_bio(sdp, REQ_OP_WRITE, op_flags);
|
|
|
|
- log_flush_wait(sdp);
|
|
|
|
|
|
+ gfs2_write_log_header(sdp, sdp->sd_log_sequence++, tail, flags,
|
|
|
|
+ op_flags);
|
|
|
|
|
|
if (sdp->sd_log_tail != tail)
|
|
if (sdp->sd_log_tail != tail)
|
|
log_pull_tail(sdp, tail);
|
|
log_pull_tail(sdp, tail);
|