*
*/
-#include <asm/uaccess.h>
-#include <linux/sched.h>
-#include <linux/stat.h>
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
#include <linux/string.h>
+#include <linux/stat.h>
+#include <linux/errno.h>
#include <linux/locks.h>
-#include <linux/quotaops.h>
-#include <linux/list.h>
-#include <linux/file.h>
-#include <linux/iobuf.h>
-#include <asm/bitops.h>
-#include <asm/byteorder.h>
+#include <linux/unistd.h>
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+
+#include <linux/fs.h>
+#include <linux/stat.h>
+#include <asm/uaccess.h>
+#include <linux/vmalloc.h>
+#include <asm/segment.h>
+#include <linux/mm.h>
+#include <linux/pagemap.h>
+#include <linux/smp_lock.h>
+
#include <linux/obd_support.h>
#include <linux/obd_class.h>
extern struct obd_device obd_dev[MAX_OBD_DEVICES];
+kmem_cache_t *obdo_cachep = NULL;
+
+int obd_init_obdo_cache(void)
+{
+ ENTRY;
+ if (obdo_cachep != NULL) {
+ printk(KERN_INFO "obdo_cache already exists\n");
+ EXIT;
+ /* XXX maybe this shoul be an error return? */
+ return 0;
+ }
+
+ obdo_cachep = kmem_cache_create("obdo_cache",
+ sizeof(struct obdo),
+ 0, SLAB_HWCACHE_ALIGN,
+ NULL, NULL);
+ if (obdo_cachep == NULL) {
+ EXIT;
+ return -ENOMEM;
+ }
+ EXIT;
+ return 0;
+}
+
+void obd_cleanup_obdo_cache(void)
+{
+ ENTRY;
+ if (obdo_cachep != NULL)
+ kmem_cache_destroy(obdo_cachep);
+
+ obdo_cachep = NULL;
+ EXIT;
+}
+
/* map connection to client */
struct obd_client *gen_client(struct obd_conn *conn)
* used to make calls to these devices.
* data holds nothing
*/
-int gen_multi_setup(struct obd_device *obddev, int len, void *data)
+int gen_multi_setup(struct obd_device *obddev, uint32_t len, void *data)
{
int i;
___wait_on_page(page);
}
-int gen_copy_data(struct obd_conn *conn, obdattr *src, obdattr *tgt)
+/* XXX this should return errors correctly, so should migrate!!! */
+int gen_copy_data(struct obd_conn *dst_conn, struct obdo *dst,
+ struct obd_conn *src_conn, struct obdo *src,
+ obd_size count, obd_off offset)
{
struct page *page;
unsigned long index = 0;
int rc;
+ ENTRY;
+ CDEBUG(D_INODE, "src: ino %Ld blocks %Ld, size %Ld, dst: ino %Ld\n",
+ src->o_id, src->o_blocks, src->o_size, dst->o_id);
page = alloc_page(GFP_USER);
- if ( !page )
+ if ( !page ) {
+ EXIT;
return -ENOMEM;
-
+ }
lck_page(page);
- while (index < ((src->i_size + PAGE_SIZE - 1) >> PAGE_SHIFT)) {
+ while (index < ((src->o_size + PAGE_SIZE - 1) >> PAGE_SHIFT)) {
page->index = index;
- rc = OBP(conn->oc_dev, brw)(READ, conn, src, page, 0);
+ rc = OBP(src_conn->oc_dev, brw)
+ (READ, src_conn, src, (char *)page_address(page),
+ PAGE_SIZE, (page->index) << PAGE_SHIFT, 0);
if ( rc != PAGE_SIZE )
break;
+ CDEBUG(D_INODE, "Read page %ld ...\n", page->index);
- rc = OBP(conn->oc_dev,brw)(WRITE, conn, tgt, page, 1);
+ rc = OBP(dst_conn->oc_dev, brw)
+ (WRITE, dst_conn, dst, (char *)page_address(page),
+ PAGE_SIZE, (page->index) << PAGE_SHIFT, 1);
if ( rc != PAGE_SIZE)
break;
+
+ CDEBUG(D_INODE, "Wrote page %ld ...\n", page->index);
index ++;
}
- tgt->i_size = src->i_size;
- tgt->i_blocks = src->i_blocks;
+ dst->o_size = src->o_size;
+ dst->o_blocks = src->o_blocks;
UnlockPage(page);
__free_page(page);
+ EXIT;
return 0;
}