瀏覽代碼

ocfs2: Switch over to JBD2.

ocfs2 wants JBD2 for many reasons, not the least of which is that JBD is
limiting our maximum filesystem size.

It's a pretty trivial change.  Most functions are just renamed.  The
only functional change is moving to Jan's inode-based ordered data mode.
It's better, too.

Because JBD2 reads and writes JBD journals, this is compatible with any
existing filesystem.  It can even interact with JBD-based ocfs2 as long
as the journal is formated for JBD.

We provide a compatibility option so that paranoid people can still use
JBD for the time being.  This will go away shortly.

[ Moved call of ocfs2_begin_ordered_truncate() from ocfs2_delete_inode() to
  ocfs2_truncate_for_delete(). --Mark ]

Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Joel Becker 17 年之前
父節點
當前提交
2b4e30fbde
共有 12 個文件被更改,包括 224 次插入81 次删除
  1. 22 12
      fs/Kconfig
  2. 11 17
      fs/ocfs2/alloc.c
  3. 16 5
      fs/ocfs2/aops.c
  4. 10 4
      fs/ocfs2/file.c
  5. 5 0
      fs/ocfs2/inode.c
  6. 1 0
      fs/ocfs2/inode.h
  7. 38 34
      fs/ocfs2/journal.c
  8. 22 3
      fs/ocfs2/journal.h
  9. 6 1
      fs/ocfs2/ocfs2.h
  10. 82 0
      fs/ocfs2/ocfs2_jbd_compat.h
  11. 6 4
      fs/ocfs2/super.c
  12. 5 1
      fs/ocfs2/uptodate.c

+ 22 - 12
fs/Kconfig

@@ -220,17 +220,16 @@ config JBD
 	tristate
 	tristate
 	help
 	help
 	  This is a generic journalling layer for block devices.  It is
 	  This is a generic journalling layer for block devices.  It is
-	  currently used by the ext3 and OCFS2 file systems, but it could
-	  also be used to add journal support to other file systems or block
+	  currently used by the ext3 file system, but it could also be
+	  used to add journal support to other file systems or block
 	  devices such as RAID or LVM.
 	  devices such as RAID or LVM.
 
 
-	  If you are using the ext3 or OCFS2 file systems, you need to
-	  say Y here. If you are not using ext3 OCFS2 then you will probably
-	  want to say N.
+	  If you are using the ext3 file system, you need to say Y here.
+	  If you are not using ext3 then you will probably want to say N.
 
 
 	  To compile this device as a module, choose M here: the module will be
 	  To compile this device as a module, choose M here: the module will be
-	  called jbd.  If you are compiling ext3 or OCFS2 into the kernel,
-	  you cannot compile this code as a module.
+	  called jbd.  If you are compiling ext3 into the kernel, you
+	  cannot compile this code as a module.
 
 
 config JBD_DEBUG
 config JBD_DEBUG
 	bool "JBD (ext3) debugging support"
 	bool "JBD (ext3) debugging support"
@@ -254,15 +253,16 @@ config JBD2
 	help
 	help
 	  This is a generic journaling layer for block devices that support
 	  This is a generic journaling layer for block devices that support
 	  both 32-bit and 64-bit block numbers.  It is currently used by
 	  both 32-bit and 64-bit block numbers.  It is currently used by
-	  the ext4 filesystem, but it could also be used to add
+	  the ext4 and OCFS2 filesystems, but it could also be used to add
 	  journal support to other file systems or block devices such
 	  journal support to other file systems or block devices such
 	  as RAID or LVM.
 	  as RAID or LVM.
 
 
-	  If you are using ext4, you need to say Y here. If you are not
-	  using ext4 then you will probably want to say N.
+	  If you are using ext4 or OCFS2, you need to say Y here.
+	  If you are not using ext4 or OCFS2 then you will
+	  probably want to say N.
 
 
 	  To compile this device as a module, choose M here. The module will be
 	  To compile this device as a module, choose M here. The module will be
-	  called jbd2.  If you are compiling ext4 into the kernel,
+	  called jbd2.  If you are compiling ext4 or OCFS2 into the kernel,
 	  you cannot compile this code as a module.
 	  you cannot compile this code as a module.
 
 
 config JBD2_DEBUG
 config JBD2_DEBUG
@@ -440,7 +440,7 @@ config OCFS2_FS
 	tristate "OCFS2 file system support"
 	tristate "OCFS2 file system support"
 	depends on NET && SYSFS
 	depends on NET && SYSFS
 	select CONFIGFS_FS
 	select CONFIGFS_FS
-	select JBD
+	select JBD2
 	select CRC32
 	select CRC32
 	help
 	help
 	  OCFS2 is a general purpose extent based shared disk cluster file
 	  OCFS2 is a general purpose extent based shared disk cluster file
@@ -511,6 +511,16 @@ config OCFS2_DEBUG_FS
 	  this option for debugging only as it is likely to decrease
 	  this option for debugging only as it is likely to decrease
 	  performance of the filesystem.
 	  performance of the filesystem.
 
 
+config OCFS2_COMPAT_JBD
+	bool "Use JBD for compatibility"
+	depends on OCFS2_FS
+	default n
+	select JBD
+	help
+	  The ocfs2 filesystem now uses JBD2 for its journalling.  JBD2
+	  is backwards compatible with JBD.  It is safe to say N here.
+	  However, if you really want to use the original JBD, say Y here.
+
 endif # BLOCK
 endif # BLOCK
 
 
 config DNOTIFY
 config DNOTIFY

+ 11 - 17
fs/ocfs2/alloc.c

@@ -6421,20 +6421,13 @@ bail:
 	return status;
 	return status;
 }
 }
 
 
-static int ocfs2_writeback_zero_func(handle_t *handle, struct buffer_head *bh)
+static int ocfs2_zero_func(handle_t *handle, struct buffer_head *bh)
 {
 {
 	set_buffer_uptodate(bh);
 	set_buffer_uptodate(bh);
 	mark_buffer_dirty(bh);
 	mark_buffer_dirty(bh);
 	return 0;
 	return 0;
 }
 }
 
 
-static int ocfs2_ordered_zero_func(handle_t *handle, struct buffer_head *bh)
-{
-	set_buffer_uptodate(bh);
-	mark_buffer_dirty(bh);
-	return ocfs2_journal_dirty_data(handle, bh);
-}
-
 static void ocfs2_map_and_dirty_page(struct inode *inode, handle_t *handle,
 static void ocfs2_map_and_dirty_page(struct inode *inode, handle_t *handle,
 				     unsigned int from, unsigned int to,
 				     unsigned int from, unsigned int to,
 				     struct page *page, int zero, u64 *phys)
 				     struct page *page, int zero, u64 *phys)
@@ -6453,17 +6446,18 @@ static void ocfs2_map_and_dirty_page(struct inode *inode, handle_t *handle,
 	 * here if they aren't - ocfs2_map_page_blocks()
 	 * here if they aren't - ocfs2_map_page_blocks()
 	 * might've skipped some
 	 * might've skipped some
 	 */
 	 */
-	if (ocfs2_should_order_data(inode)) {
-		ret = walk_page_buffers(handle,
-					page_buffers(page),
-					from, to, &partial,
-					ocfs2_ordered_zero_func);
-		if (ret < 0)
-			mlog_errno(ret);
-	} else {
+	ret = walk_page_buffers(handle, page_buffers(page),
+				from, to, &partial,
+				ocfs2_zero_func);
+	if (ret < 0)
+		mlog_errno(ret);
+	else if (ocfs2_should_order_data(inode)) {
+		ret = ocfs2_jbd2_file_inode(handle, inode);
+#ifdef CONFIG_OCFS2_COMPAT_JBD
 		ret = walk_page_buffers(handle, page_buffers(page),
 		ret = walk_page_buffers(handle, page_buffers(page),
 					from, to, &partial,
 					from, to, &partial,
-					ocfs2_writeback_zero_func);
+					ocfs2_journal_dirty_data);
+#endif
 		if (ret < 0)
 		if (ret < 0)
 			mlog_errno(ret);
 			mlog_errno(ret);
 	}
 	}

+ 16 - 5
fs/ocfs2/aops.c

@@ -485,11 +485,14 @@ handle_t *ocfs2_start_walk_page_trans(struct inode *inode,
 	}
 	}
 
 
 	if (ocfs2_should_order_data(inode)) {
 	if (ocfs2_should_order_data(inode)) {
+		ret = ocfs2_jbd2_file_inode(handle, inode);
+#ifdef CONFIG_OCFS2_COMPAT_JBD
 		ret = walk_page_buffers(handle,
 		ret = walk_page_buffers(handle,
 					page_buffers(page),
 					page_buffers(page),
 					from, to, NULL,
 					from, to, NULL,
 					ocfs2_journal_dirty_data);
 					ocfs2_journal_dirty_data);
-		if (ret < 0) 
+#endif
+		if (ret < 0)
 			mlog_errno(ret);
 			mlog_errno(ret);
 	}
 	}
 out:
 out:
@@ -669,7 +672,7 @@ static void ocfs2_invalidatepage(struct page *page, unsigned long offset)
 {
 {
 	journal_t *journal = OCFS2_SB(page->mapping->host->i_sb)->journal->j_journal;
 	journal_t *journal = OCFS2_SB(page->mapping->host->i_sb)->journal->j_journal;
 
 
-	journal_invalidatepage(journal, page, offset);
+	jbd2_journal_invalidatepage(journal, page, offset);
 }
 }
 
 
 static int ocfs2_releasepage(struct page *page, gfp_t wait)
 static int ocfs2_releasepage(struct page *page, gfp_t wait)
@@ -678,7 +681,7 @@ static int ocfs2_releasepage(struct page *page, gfp_t wait)
 
 
 	if (!page_has_buffers(page))
 	if (!page_has_buffers(page))
 		return 0;
 		return 0;
-	return journal_try_to_free_buffers(journal, page, wait);
+	return jbd2_journal_try_to_free_buffers(journal, page, wait);
 }
 }
 
 
 static ssize_t ocfs2_direct_IO(int rw,
 static ssize_t ocfs2_direct_IO(int rw,
@@ -1074,11 +1077,15 @@ static void ocfs2_write_failure(struct inode *inode,
 		tmppage = wc->w_pages[i];
 		tmppage = wc->w_pages[i];
 
 
 		if (page_has_buffers(tmppage)) {
 		if (page_has_buffers(tmppage)) {
-			if (ocfs2_should_order_data(inode))
+			if (ocfs2_should_order_data(inode)) {
+				ocfs2_jbd2_file_inode(wc->w_handle, inode);
+#ifdef CONFIG_OCFS2_COMPAT_JBD
 				walk_page_buffers(wc->w_handle,
 				walk_page_buffers(wc->w_handle,
 						  page_buffers(tmppage),
 						  page_buffers(tmppage),
 						  from, to, NULL,
 						  from, to, NULL,
 						  ocfs2_journal_dirty_data);
 						  ocfs2_journal_dirty_data);
+#endif
+			}
 
 
 			block_commit_write(tmppage, from, to);
 			block_commit_write(tmppage, from, to);
 		}
 		}
@@ -1917,11 +1924,15 @@ int ocfs2_write_end_nolock(struct address_space *mapping,
 		}
 		}
 
 
 		if (page_has_buffers(tmppage)) {
 		if (page_has_buffers(tmppage)) {
-			if (ocfs2_should_order_data(inode))
+			if (ocfs2_should_order_data(inode)) {
+				ocfs2_jbd2_file_inode(wc->w_handle, inode);
+#ifdef CONFIG_OCFS2_COMPAT_JBD
 				walk_page_buffers(wc->w_handle,
 				walk_page_buffers(wc->w_handle,
 						  page_buffers(tmppage),
 						  page_buffers(tmppage),
 						  from, to, NULL,
 						  from, to, NULL,
 						  ocfs2_journal_dirty_data);
 						  ocfs2_journal_dirty_data);
+#endif
+			}
 			block_commit_write(tmppage, from, to);
 			block_commit_write(tmppage, from, to);
 		}
 		}
 	}
 	}

+ 10 - 4
fs/ocfs2/file.c

@@ -185,7 +185,7 @@ static int ocfs2_sync_file(struct file *file,
 		goto bail;
 		goto bail;
 
 
 	journal = osb->journal->j_journal;
 	journal = osb->journal->j_journal;
-	err = journal_force_commit(journal);
+	err = jbd2_journal_force_commit(journal);
 
 
 bail:
 bail:
 	mlog_exit(err);
 	mlog_exit(err);
@@ -941,9 +941,15 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr)
 			goto bail_unlock;
 			goto bail_unlock;
 		}
 		}
 
 
-		if (i_size_read(inode) > attr->ia_size)
+		if (i_size_read(inode) > attr->ia_size) {
+			if (ocfs2_should_order_data(inode)) {
+				status = ocfs2_begin_ordered_truncate(inode,
+								      attr->ia_size);
+				if (status)
+					goto bail_unlock;
+			}
 			status = ocfs2_truncate_file(inode, bh, attr->ia_size);
 			status = ocfs2_truncate_file(inode, bh, attr->ia_size);
-		else
+		} else
 			status = ocfs2_extend_file(inode, bh, attr->ia_size);
 			status = ocfs2_extend_file(inode, bh, attr->ia_size);
 		if (status < 0) {
 		if (status < 0) {
 			if (status != -ENOSPC)
 			if (status != -ENOSPC)
@@ -1888,7 +1894,7 @@ out_dio:
 		 */
 		 */
 		if (old_size != i_size_read(inode) ||
 		if (old_size != i_size_read(inode) ||
 		    old_clusters != OCFS2_I(inode)->ip_clusters) {
 		    old_clusters != OCFS2_I(inode)->ip_clusters) {
-			ret = journal_force_commit(osb->journal->j_journal);
+			ret = jbd2_journal_force_commit(osb->journal->j_journal);
 			if (ret < 0)
 			if (ret < 0)
 				written = ret;
 				written = ret;
 		}
 		}

+ 5 - 0
fs/ocfs2/inode.c

@@ -534,6 +534,9 @@ static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
 	 * data and fast symlinks.
 	 * data and fast symlinks.
 	 */
 	 */
 	if (fe->i_clusters) {
 	if (fe->i_clusters) {
+		if (ocfs2_should_order_data(inode))
+			ocfs2_begin_ordered_truncate(inode, 0);
+
 		handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
 		handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS);
 		if (IS_ERR(handle)) {
 		if (IS_ERR(handle)) {
 			status = PTR_ERR(handle);
 			status = PTR_ERR(handle);
@@ -1100,6 +1103,8 @@ void ocfs2_clear_inode(struct inode *inode)
 	oi->ip_last_trans = 0;
 	oi->ip_last_trans = 0;
 	oi->ip_dir_start_lookup = 0;
 	oi->ip_dir_start_lookup = 0;
 	oi->ip_blkno = 0ULL;
 	oi->ip_blkno = 0ULL;
+	jbd2_journal_release_jbd_inode(OCFS2_SB(inode->i_sb)->journal->j_journal,
+				       &oi->ip_jinode);
 
 
 bail:
 bail:
 	mlog_exit_void();
 	mlog_exit_void();

+ 1 - 0
fs/ocfs2/inode.h

@@ -71,6 +71,7 @@ struct ocfs2_inode_info
 	struct ocfs2_extent_map		ip_extent_map;
 	struct ocfs2_extent_map		ip_extent_map;
 
 
 	struct inode			vfs_inode;
 	struct inode			vfs_inode;
+	struct jbd2_inode		ip_jinode;
 };
 };
 
 
 /*
 /*

+ 38 - 34
fs/ocfs2/journal.c

@@ -215,9 +215,9 @@ static int ocfs2_commit_cache(struct ocfs2_super *osb)
 		goto finally;
 		goto finally;
 	}
 	}
 
 
-	journal_lock_updates(journal->j_journal);
-	status = journal_flush(journal->j_journal);
-	journal_unlock_updates(journal->j_journal);
+	jbd2_journal_lock_updates(journal->j_journal);
+	status = jbd2_journal_flush(journal->j_journal);
+	jbd2_journal_unlock_updates(journal->j_journal);
 	if (status < 0) {
 	if (status < 0) {
 		up_write(&journal->j_trans_barrier);
 		up_write(&journal->j_trans_barrier);
 		mlog_errno(status);
 		mlog_errno(status);
@@ -264,7 +264,7 @@ handle_t *ocfs2_start_trans(struct ocfs2_super *osb, int max_buffs)
 
 
 	down_read(&osb->journal->j_trans_barrier);
 	down_read(&osb->journal->j_trans_barrier);
 
 
-	handle = journal_start(journal, max_buffs);
+	handle = jbd2_journal_start(journal, max_buffs);
 	if (IS_ERR(handle)) {
 	if (IS_ERR(handle)) {
 		up_read(&osb->journal->j_trans_barrier);
 		up_read(&osb->journal->j_trans_barrier);
 
 
@@ -290,7 +290,7 @@ int ocfs2_commit_trans(struct ocfs2_super *osb,
 
 
 	BUG_ON(!handle);
 	BUG_ON(!handle);
 
 
-	ret = journal_stop(handle);
+	ret = jbd2_journal_stop(handle);
 	if (ret < 0)
 	if (ret < 0)
 		mlog_errno(ret);
 		mlog_errno(ret);
 
 
@@ -304,7 +304,7 @@ int ocfs2_commit_trans(struct ocfs2_super *osb,
  * transaction. extend_trans will either extend the current handle by
  * transaction. extend_trans will either extend the current handle by
  * nblocks, or commit it and start a new one with nblocks credits.
  * nblocks, or commit it and start a new one with nblocks credits.
  *
  *
- * This might call journal_restart() which will commit dirty buffers
+ * This might call jbd2_journal_restart() which will commit dirty buffers
  * and then restart the transaction. Before calling
  * and then restart the transaction. Before calling
  * ocfs2_extend_trans(), any changed blocks should have been
  * ocfs2_extend_trans(), any changed blocks should have been
  * dirtied. After calling it, all blocks which need to be changed must
  * dirtied. After calling it, all blocks which need to be changed must
@@ -332,7 +332,7 @@ int ocfs2_extend_trans(handle_t *handle, int nblocks)
 #ifdef CONFIG_OCFS2_DEBUG_FS
 #ifdef CONFIG_OCFS2_DEBUG_FS
 	status = 1;
 	status = 1;
 #else
 #else
-	status = journal_extend(handle, nblocks);
+	status = jbd2_journal_extend(handle, nblocks);
 	if (status < 0) {
 	if (status < 0) {
 		mlog_errno(status);
 		mlog_errno(status);
 		goto bail;
 		goto bail;
@@ -340,8 +340,10 @@ int ocfs2_extend_trans(handle_t *handle, int nblocks)
 #endif
 #endif
 
 
 	if (status > 0) {
 	if (status > 0) {
-		mlog(0, "journal_extend failed, trying journal_restart\n");
-		status = journal_restart(handle, nblocks);
+		mlog(0,
+		     "jbd2_journal_extend failed, trying "
+		     "jbd2_journal_restart\n");
+		status = jbd2_journal_restart(handle, nblocks);
 		if (status < 0) {
 		if (status < 0) {
 			mlog_errno(status);
 			mlog_errno(status);
 			goto bail;
 			goto bail;
@@ -393,11 +395,11 @@ int ocfs2_journal_access(handle_t *handle,
 	switch (type) {
 	switch (type) {
 	case OCFS2_JOURNAL_ACCESS_CREATE:
 	case OCFS2_JOURNAL_ACCESS_CREATE:
 	case OCFS2_JOURNAL_ACCESS_WRITE:
 	case OCFS2_JOURNAL_ACCESS_WRITE:
-		status = journal_get_write_access(handle, bh);
+		status = jbd2_journal_get_write_access(handle, bh);
 		break;
 		break;
 
 
 	case OCFS2_JOURNAL_ACCESS_UNDO:
 	case OCFS2_JOURNAL_ACCESS_UNDO:
-		status = journal_get_undo_access(handle, bh);
+		status = jbd2_journal_get_undo_access(handle, bh);
 		break;
 		break;
 
 
 	default:
 	default:
@@ -422,7 +424,7 @@ int ocfs2_journal_dirty(handle_t *handle,
 	mlog_entry("(bh->b_blocknr=%llu)\n",
 	mlog_entry("(bh->b_blocknr=%llu)\n",
 		   (unsigned long long)bh->b_blocknr);
 		   (unsigned long long)bh->b_blocknr);
 
 
-	status = journal_dirty_metadata(handle, bh);
+	status = jbd2_journal_dirty_metadata(handle, bh);
 	if (status < 0)
 	if (status < 0)
 		mlog(ML_ERROR, "Could not dirty metadata buffer. "
 		mlog(ML_ERROR, "Could not dirty metadata buffer. "
 		     "(bh->b_blocknr=%llu)\n",
 		     "(bh->b_blocknr=%llu)\n",
@@ -432,6 +434,7 @@ int ocfs2_journal_dirty(handle_t *handle,
 	return status;
 	return status;
 }
 }
 
 
+#ifdef CONFIG_OCFS2_COMPAT_JBD
 int ocfs2_journal_dirty_data(handle_t *handle,
 int ocfs2_journal_dirty_data(handle_t *handle,
 			     struct buffer_head *bh)
 			     struct buffer_head *bh)
 {
 {
@@ -443,8 +446,9 @@ int ocfs2_journal_dirty_data(handle_t *handle,
 
 
 	return err;
 	return err;
 }
 }
+#endif
 
 
-#define OCFS2_DEFAULT_COMMIT_INTERVAL 	(HZ * JBD_DEFAULT_MAX_COMMIT_AGE)
+#define OCFS2_DEFAULT_COMMIT_INTERVAL	(HZ * JBD2_DEFAULT_MAX_COMMIT_AGE)
 
 
 void ocfs2_set_journal_params(struct ocfs2_super *osb)
 void ocfs2_set_journal_params(struct ocfs2_super *osb)
 {
 {
@@ -457,9 +461,9 @@ void ocfs2_set_journal_params(struct ocfs2_super *osb)
 	spin_lock(&journal->j_state_lock);
 	spin_lock(&journal->j_state_lock);
 	journal->j_commit_interval = commit_interval;
 	journal->j_commit_interval = commit_interval;
 	if (osb->s_mount_opt & OCFS2_MOUNT_BARRIER)
 	if (osb->s_mount_opt & OCFS2_MOUNT_BARRIER)
-		journal->j_flags |= JFS_BARRIER;
+		journal->j_flags |= JBD2_BARRIER;
 	else
 	else
-		journal->j_flags &= ~JFS_BARRIER;
+		journal->j_flags &= ~JBD2_BARRIER;
 	spin_unlock(&journal->j_state_lock);
 	spin_unlock(&journal->j_state_lock);
 }
 }
 
 
@@ -524,14 +528,14 @@ int ocfs2_journal_init(struct ocfs2_journal *journal, int *dirty)
 	mlog(0, "inode->ip_clusters = %u\n", OCFS2_I(inode)->ip_clusters);
 	mlog(0, "inode->ip_clusters = %u\n", OCFS2_I(inode)->ip_clusters);
 
 
 	/* call the kernels journal init function now */
 	/* call the kernels journal init function now */
-	j_journal = journal_init_inode(inode);
+	j_journal = jbd2_journal_init_inode(inode);
 	if (j_journal == NULL) {
 	if (j_journal == NULL) {
 		mlog(ML_ERROR, "Linux journal layer error\n");
 		mlog(ML_ERROR, "Linux journal layer error\n");
 		status = -EINVAL;
 		status = -EINVAL;
 		goto done;
 		goto done;
 	}
 	}
 
 
-	mlog(0, "Returned from journal_init_inode\n");
+	mlog(0, "Returned from jbd2_journal_init_inode\n");
 	mlog(0, "j_journal->j_maxlen = %u\n", j_journal->j_maxlen);
 	mlog(0, "j_journal->j_maxlen = %u\n", j_journal->j_maxlen);
 
 
 	*dirty = (le32_to_cpu(di->id1.journal1.ij_flags) &
 	*dirty = (le32_to_cpu(di->id1.journal1.ij_flags) &
@@ -639,7 +643,7 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)
 	if (journal->j_state != OCFS2_JOURNAL_LOADED)
 	if (journal->j_state != OCFS2_JOURNAL_LOADED)
 		goto done;
 		goto done;
 
 
-	/* need to inc inode use count as journal_destroy will iput. */
+	/* need to inc inode use count - jbd2_journal_destroy will iput. */
 	if (!igrab(inode))
 	if (!igrab(inode))
 		BUG();
 		BUG();
 
 
@@ -668,9 +672,9 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)
 	BUG_ON(atomic_read(&(osb->journal->j_num_trans)) != 0);
 	BUG_ON(atomic_read(&(osb->journal->j_num_trans)) != 0);
 
 
 	if (ocfs2_mount_local(osb)) {
 	if (ocfs2_mount_local(osb)) {
-		journal_lock_updates(journal->j_journal);
-		status = journal_flush(journal->j_journal);
-		journal_unlock_updates(journal->j_journal);
+		jbd2_journal_lock_updates(journal->j_journal);
+		status = jbd2_journal_flush(journal->j_journal);
+		jbd2_journal_unlock_updates(journal->j_journal);
 		if (status < 0)
 		if (status < 0)
 			mlog_errno(status);
 			mlog_errno(status);
 	}
 	}
@@ -686,7 +690,7 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)
 	}
 	}
 
 
 	/* Shutdown the kernel journal system */
 	/* Shutdown the kernel journal system */
-	journal_destroy(journal->j_journal);
+	jbd2_journal_destroy(journal->j_journal);
 
 
 	OCFS2_I(inode)->ip_open_count--;
 	OCFS2_I(inode)->ip_open_count--;
 
 
@@ -711,15 +715,15 @@ static void ocfs2_clear_journal_error(struct super_block *sb,
 {
 {
 	int olderr;
 	int olderr;
 
 
-	olderr = journal_errno(journal);
+	olderr = jbd2_journal_errno(journal);
 	if (olderr) {
 	if (olderr) {
 		mlog(ML_ERROR, "File system error %d recorded in "
 		mlog(ML_ERROR, "File system error %d recorded in "
 		     "journal %u.\n", olderr, slot);
 		     "journal %u.\n", olderr, slot);
 		mlog(ML_ERROR, "File system on device %s needs checking.\n",
 		mlog(ML_ERROR, "File system on device %s needs checking.\n",
 		     sb->s_id);
 		     sb->s_id);
 
 
-		journal_ack_err(journal);
-		journal_clear_err(journal);
+		jbd2_journal_ack_err(journal);
+		jbd2_journal_clear_err(journal);
 	}
 	}
 }
 }
 
 
@@ -734,7 +738,7 @@ int ocfs2_journal_load(struct ocfs2_journal *journal, int local, int replayed)
 
 
 	osb = journal->j_osb;
 	osb = journal->j_osb;
 
 
-	status = journal_load(journal->j_journal);
+	status = jbd2_journal_load(journal->j_journal);
 	if (status < 0) {
 	if (status < 0) {
 		mlog(ML_ERROR, "Failed to load journal!\n");
 		mlog(ML_ERROR, "Failed to load journal!\n");
 		goto done;
 		goto done;
@@ -778,7 +782,7 @@ int ocfs2_journal_wipe(struct ocfs2_journal *journal, int full)
 
 
 	BUG_ON(!journal);
 	BUG_ON(!journal);
 
 
-	status = journal_wipe(journal->j_journal, full);
+	status = jbd2_journal_wipe(journal->j_journal, full);
 	if (status < 0) {
 	if (status < 0) {
 		mlog_errno(status);
 		mlog_errno(status);
 		goto bail;
 		goto bail;
@@ -1229,19 +1233,19 @@ static int ocfs2_replay_journal(struct ocfs2_super *osb,
 	}
 	}
 
 
 	mlog(0, "calling journal_init_inode\n");
 	mlog(0, "calling journal_init_inode\n");
-	journal = journal_init_inode(inode);
+	journal = jbd2_journal_init_inode(inode);
 	if (journal == NULL) {
 	if (journal == NULL) {
 		mlog(ML_ERROR, "Linux journal layer error\n");
 		mlog(ML_ERROR, "Linux journal layer error\n");
 		status = -EIO;
 		status = -EIO;
 		goto done;
 		goto done;
 	}
 	}
 
 
-	status = journal_load(journal);
+	status = jbd2_journal_load(journal);
 	if (status < 0) {
 	if (status < 0) {
 		mlog_errno(status);
 		mlog_errno(status);
 		if (!igrab(inode))
 		if (!igrab(inode))
 			BUG();
 			BUG();
-		journal_destroy(journal);
+		jbd2_journal_destroy(journal);
 		goto done;
 		goto done;
 	}
 	}
 
 
@@ -1249,9 +1253,9 @@ static int ocfs2_replay_journal(struct ocfs2_super *osb,
 
 
 	/* wipe the journal */
 	/* wipe the journal */
 	mlog(0, "flushing the journal.\n");
 	mlog(0, "flushing the journal.\n");
-	journal_lock_updates(journal);
-	status = journal_flush(journal);
-	journal_unlock_updates(journal);
+	jbd2_journal_lock_updates(journal);
+	status = jbd2_journal_flush(journal);
+	jbd2_journal_unlock_updates(journal);
 	if (status < 0)
 	if (status < 0)
 		mlog_errno(status);
 		mlog_errno(status);
 
 
@@ -1272,7 +1276,7 @@ static int ocfs2_replay_journal(struct ocfs2_super *osb,
 	if (!igrab(inode))
 	if (!igrab(inode))
 		BUG();
 		BUG();
 
 
-	journal_destroy(journal);
+	jbd2_journal_destroy(journal);
 
 
 done:
 done:
 	/* drop the lock on this nodes journal */
 	/* drop the lock on this nodes journal */

+ 22 - 3
fs/ocfs2/journal.h

@@ -27,7 +27,12 @@
 #define OCFS2_JOURNAL_H
 #define OCFS2_JOURNAL_H
 
 
 #include <linux/fs.h>
 #include <linux/fs.h>
-#include <linux/jbd.h>
+#ifndef CONFIG_OCFS2_COMPAT_JBD
+# include <linux/jbd2.h>
+#else
+# include <linux/jbd.h>
+# include "ocfs2_jbd_compat.h"
+#endif
 
 
 enum ocfs2_journal_state {
 enum ocfs2_journal_state {
 	OCFS2_JOURNAL_FREE = 0,
 	OCFS2_JOURNAL_FREE = 0,
@@ -215,8 +220,8 @@ static inline void ocfs2_checkpoint_inode(struct inode *inode)
  *                          buffer. Will have to call ocfs2_journal_dirty once
  *                          buffer. Will have to call ocfs2_journal_dirty once
  *                          we've actually dirtied it. Type is one of . or .
  *                          we've actually dirtied it. Type is one of . or .
  *  ocfs2_journal_dirty    - Mark a journalled buffer as having dirty data.
  *  ocfs2_journal_dirty    - Mark a journalled buffer as having dirty data.
- *  ocfs2_journal_dirty_data - Indicate that a data buffer should go out before
- *                             the current handle commits.
+ *  ocfs2_jbd2_file_inode  - Mark an inode so that its data goes out before
+ *                           the current handle commits.
  */
  */
 
 
 /* You must always start_trans with a number of buffs > 0, but it's
 /* You must always start_trans with a number of buffs > 0, but it's
@@ -268,8 +273,10 @@ int                  ocfs2_journal_access(handle_t *handle,
  */
  */
 int                  ocfs2_journal_dirty(handle_t *handle,
 int                  ocfs2_journal_dirty(handle_t *handle,
 					 struct buffer_head *bh);
 					 struct buffer_head *bh);
+#ifdef CONFIG_OCFS2_COMPAT_JBD
 int                  ocfs2_journal_dirty_data(handle_t *handle,
 int                  ocfs2_journal_dirty_data(handle_t *handle,
 					      struct buffer_head *bh);
 					      struct buffer_head *bh);
+#endif
 
 
 /*
 /*
  *  Credit Macros:
  *  Credit Macros:
@@ -430,4 +437,16 @@ static inline int ocfs2_calc_tree_trunc_credits(struct super_block *sb,
 	return credits;
 	return credits;
 }
 }
 
 
+static inline int ocfs2_jbd2_file_inode(handle_t *handle, struct inode *inode)
+{
+	return jbd2_journal_file_inode(handle, &OCFS2_I(inode)->ip_jinode);
+}
+
+static inline int ocfs2_begin_ordered_truncate(struct inode *inode,
+					       loff_t new_size)
+{
+	return jbd2_journal_begin_ordered_truncate(&OCFS2_I(inode)->ip_jinode,
+						   new_size);
+}
+
 #endif /* OCFS2_JOURNAL_H */
 #endif /* OCFS2_JOURNAL_H */

+ 6 - 1
fs/ocfs2/ocfs2.h

@@ -34,7 +34,12 @@
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
 #include <linux/kref.h>
 #include <linux/kref.h>
 #include <linux/mutex.h>
 #include <linux/mutex.h>
-#include <linux/jbd.h>
+#ifndef CONFIG_OCFS2_COMPAT_JBD
+# include <linux/jbd2.h>
+#else
+# include <linux/jbd.h>
+# include "ocfs2_jbd_compat.h"
+#endif
 
 
 /* For union ocfs2_dlm_lksb */
 /* For union ocfs2_dlm_lksb */
 #include "stackglue.h"
 #include "stackglue.h"

+ 82 - 0
fs/ocfs2/ocfs2_jbd_compat.h

@@ -0,0 +1,82 @@
+/* -*- mode: c; c-basic-offset: 8; -*-
+ * vim: noexpandtab sw=8 ts=8 sts=0:
+ *
+ * ocfs2_jbd_compat.h
+ *
+ * Compatibility defines for JBD.
+ *
+ * Copyright (C) 2008 Oracle.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+
+#ifndef OCFS2_JBD_COMPAT_H
+#define OCFS2_JBD_COMPAT_H
+
+#ifndef CONFIG_OCFS2_COMPAT_JBD
+# error Should not have been included
+#endif
+
+struct jbd2_inode {
+	unsigned int dummy;
+};
+
+#define JBD2_BARRIER			JFS_BARRIER
+#define JBD2_DEFAULT_MAX_COMMIT_AGE	JBD_DEFAULT_MAX_COMMIT_AGE
+
+#define jbd2_journal_ack_err			journal_ack_err
+#define jbd2_journal_clear_err			journal_clear_err
+#define jbd2_journal_destroy			journal_destroy
+#define jbd2_journal_dirty_metadata		journal_dirty_metadata
+#define jbd2_journal_errno			journal_errno
+#define jbd2_journal_extend			journal_extend
+#define jbd2_journal_flush			journal_flush
+#define jbd2_journal_force_commit		journal_force_commit
+#define jbd2_journal_get_write_access		journal_get_write_access
+#define jbd2_journal_get_undo_access		journal_get_undo_access
+#define jbd2_journal_init_inode			journal_init_inode
+#define jbd2_journal_invalidatepage		journal_invalidatepage
+#define jbd2_journal_load			journal_load
+#define jbd2_journal_lock_updates		journal_lock_updates
+#define jbd2_journal_restart			journal_restart
+#define jbd2_journal_start			journal_start
+#define jbd2_journal_start_commit		journal_start_commit
+#define jbd2_journal_stop			journal_stop
+#define jbd2_journal_try_to_free_buffers	journal_try_to_free_buffers
+#define jbd2_journal_unlock_updates		journal_unlock_updates
+#define jbd2_journal_wipe			journal_wipe
+#define jbd2_log_wait_commit			log_wait_commit
+
+static inline int jbd2_journal_file_inode(handle_t *handle,
+					  struct jbd2_inode *inode)
+{
+	return 0;
+}
+
+static inline int jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode,
+						      loff_t new_size)
+{
+	return 0;
+}
+
+static inline void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode,
+					       struct inode *inode)
+{
+	return;
+}
+
+static inline void jbd2_journal_release_jbd_inode(journal_t *journal,
+						  struct jbd2_inode *jinode)
+{
+	return;
+}
+
+
+#endif  /* OCFS2_JBD_COMPAT_H */

+ 6 - 4
fs/ocfs2/super.c

@@ -212,10 +212,11 @@ static int ocfs2_sync_fs(struct super_block *sb, int wait)
 		ocfs2_schedule_truncate_log_flush(osb, 0);
 		ocfs2_schedule_truncate_log_flush(osb, 0);
 	}
 	}
 
 
-	if (journal_start_commit(OCFS2_SB(sb)->journal->j_journal, &target)) {
+	if (jbd2_journal_start_commit(OCFS2_SB(sb)->journal->j_journal,
+				      &target)) {
 		if (wait)
 		if (wait)
-			log_wait_commit(OCFS2_SB(sb)->journal->j_journal,
-					target);
+			jbd2_log_wait_commit(OCFS2_SB(sb)->journal->j_journal,
+					     target);
 	}
 	}
 	return 0;
 	return 0;
 }
 }
@@ -332,6 +333,7 @@ static struct inode *ocfs2_alloc_inode(struct super_block *sb)
 	if (!oi)
 	if (!oi)
 		return NULL;
 		return NULL;
 
 
+	jbd2_journal_init_jbd_inode(&oi->ip_jinode, &oi->vfs_inode);
 	return &oi->vfs_inode;
 	return &oi->vfs_inode;
 }
 }
 
 
@@ -896,7 +898,7 @@ static int ocfs2_parse_options(struct super_block *sb,
 			if (option < 0)
 			if (option < 0)
 				return 0;
 				return 0;
 			if (option == 0)
 			if (option == 0)
-				option = JBD_DEFAULT_MAX_COMMIT_AGE;
+				option = JBD2_DEFAULT_MAX_COMMIT_AGE;
 			mopt->commit_interval = HZ * option;
 			mopt->commit_interval = HZ * option;
 			break;
 			break;
 		case Opt_localalloc:
 		case Opt_localalloc:

+ 5 - 1
fs/ocfs2/uptodate.c

@@ -53,7 +53,11 @@
 #include <linux/highmem.h>
 #include <linux/highmem.h>
 #include <linux/buffer_head.h>
 #include <linux/buffer_head.h>
 #include <linux/rbtree.h>
 #include <linux/rbtree.h>
-#include <linux/jbd.h>
+#ifndef CONFIG_OCFS2_COMPAT_JBD
+# include <linux/jbd2.h>
+#else
+# include <linux/jbd.h>
+#endif
 
 
 #define MLOG_MASK_PREFIX ML_UPTODATE
 #define MLOG_MASK_PREFIX ML_UPTODATE