+struct mds_cb_data {
+ struct journal_callback cb_jcb;
+ struct mds_obd *cb_mds;
+ __u64 cb_last_rcvd;
+};
+
+static void mds_ext3_callback_func(void *cb_data)
+{
+ struct mds_cb_data *mcb = cb_data;
+
+ CDEBUG(D_EXT2, "got callback for last_rcvd: %Ld\n", mcb->cb_last_rcvd);
+ if (mcb->cb_last_rcvd > mcb->cb_mds->mds_last_committed)
+ mcb->cb_mds->mds_last_committed = mcb->cb_last_rcvd;
+
+ OBD_FREE(mcb, sizeof(*mcb));
+}
+
+static int mds_ext3_set_last_rcvd(struct mds_obd *mds, void *handle)
+{
+ struct mds_cb_data *mcb;
+
+ OBD_ALLOC(mcb, sizeof(*mcb));
+ if (!mcb)
+ RETURN(-ENOMEM);
+
+ mcb->cb_mds = mds;
+ mcb->cb_last_rcvd = mds->mds_last_rcvd;
+
+#ifdef HAVE_JOURNAL_CALLBACK
+ 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
+ {
+ 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_func(mcb);
+#endif
+
+ return 0;
+}
+
+static int mds_ext3_journal_data(struct inode *inode, struct file *filp)