+
+static void mds_ext3_callback_status(void *jcb, int error)
+{
+ struct mds_cb_data *mcb = (struct mds_cb_data *)jcb;
+
+ CDEBUG(D_EXT2, "got callback for last_rcvd %Ld: rc = %d\n",
+ mcb->cb_last_rcvd, error);
+ if (!error && mcb->cb_last_rcvd > mcb->cb_mds->mds_last_committed)
+ mcb->cb_mds->mds_last_committed = mcb->cb_last_rcvd;
+
+ kmem_cache_free(jcb_cache, mcb);
+ --jcb_cache_count;
+}
+
+#ifdef HAVE_JOURNAL_CALLBACK
+static void mds_ext3_callback_func(void *cb_data)
+{
+ mds_ext3_callback_status(cb_data, 0);
+}
+#endif
+
+static int mds_ext3_set_last_rcvd(struct mds_obd *mds, void *handle)
+{
+ struct mds_cb_data *mcb;
+
+ mcb = kmem_cache_alloc(jcb_cache, GFP_NOFS);
+ if (!mcb)
+ RETURN(-ENOMEM);
+
+ ++jcb_cache_count;
+ mcb->cb_mds = mds;
+ mcb->cb_last_rcvd = mds->mds_last_rcvd;
+
+#ifdef HAVE_JOURNAL_CALLBACK_STATUS
+ CDEBUG(D_EXT2, "set callback for last_rcvd: %Ld\n",
+ (unsigned long long)mcb->cb_last_rcvd);
+ journal_callback_set(handle, mds_ext3_callback_status,
+ (void *)mcb);
+#elif defined(HAVE_JOURNAL_CALLBACK)
+ /* XXX original patch version - remove soon */
+#warning "using old journal callback kernel patch, please update"
+ CDEBUG(D_EXT2, "set callback for last_rcvd: %Ld\n",
+ (unsigned long long)mcb->cb_last_rcvd);
+ journal_callback_set(handle, mds_ext3_callback_func, mcb);
+#else
+#warning "no journal callback kernel patch, faking it..."
+ {
+ static long next = 0;
+
+ if (time_after(jiffies, next)) {
+ CERROR("no journal callback kernel patch, faking it...\n");
+ next = jiffies + 300 * HZ;
+ }
+ }
+ mds_ext3_callback_status((struct journal_callback *)mcb, 0);
+#endif
+
+ return 0;
+}
+
+static int mds_ext3_journal_data(struct file *filp)
+{
+ struct inode *inode = filp->f_dentry->d_inode;
+
+ EXT3_I(inode)->i_flags |= EXT3_JOURNAL_DATA_FL;
+
+ return 0;
+}
+
+static struct mds_fs_operations mds_ext3_fs_ops = {