From: Marko O. <d0...@us...> - 2010-03-23 18:30:21
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "kdfs". The branch, make_kdfs_compile has been updated via 1f0f458227164acfb67d663065be08f09491824a (commit) from b9f153b7b2db538c971c01212c17ac82a024ca6c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 1f0f458227164acfb67d663065be08f09491824a Author: Marko Obrovac <mar...@in...> Date: Tue Mar 23 20:25:21 2010 +0100 Implement kdfs_file_extent_read_from_file Still some issues to solve. Namely, there are two calls issued to kdfs_getindoe. In one case the info is read correctly, in the other there's no obvious way to do it (for now at least) diff --git a/fs/kdfs/file_extent.c b/fs/kdfs/file_extent.c index e786cb4..74f0af8 100644 --- a/fs/kdfs/file_extent.c +++ b/fs/kdfs/file_extent.c @@ -10,6 +10,7 @@ */ #include "file_extent.h" +#include "super.h" #include "physical_fs.h" #include "debug_kdfs.h" @@ -202,7 +203,7 @@ kdfs_node_t kdfs_file_extent_get_page_owner(struct kdfs_inode *k_inode, pgoff_t size_t kdfs_file_extent_dump_to_file(struct kdfs_inode *k_inode, struct file *file) { - int list_count = 0; + size_t list_count = 0; int bytes_written = 0; struct kdfs_file_extent *curr; @@ -213,7 +214,7 @@ size_t kdfs_file_extent_dump_to_file(struct kdfs_inode *k_inode, struct file *fi } bytes_written += kdfs_phys_write(file, (char *) &(list_count), - sizeof(int), &file->f_pos); + sizeof(size_t), &file->f_pos); list_for_each_entry(curr, &k_inode->extents_list, list_item) { bytes_written += kdfs_phys_write(file, @@ -225,8 +226,50 @@ size_t kdfs_file_extent_dump_to_file(struct kdfs_inode *k_inode, struct file *fi } -size_t kdfs_file_extent_read_from_file(struct kdfs_inode *k_inode, struct file *file) +size_t kdfs_file_extent_read_from_file(struct kdfs_inode *k_inode) { + struct file *file = NULL; + char *phys_filename = NULL; + struct kdfs_physical_inode phys_inode; + size_t no_extents = 0, index; + struct kdfs_file_extent_info record; + struct kdfs_file_extent *new_extent, *curr; + + /* Retrieve the inode meta file */ + phys_filename = kmalloc(PATH_MAX, GFP_KERNEL); + kdfs_getphysicalpath(k_inode->inode->i_sb->s_fs_info, k_inode->inode->i_ino, phys_filename); + strcat(phys_filename, "/" KDFS_INODE_FILENAME); + + file = open_phys_file(phys_filename, O_RDONLY, 0644, 0, 0); + if (!IS_ERR(file)) { + /* re-read the kdfs_physical_inode part of the meta file */ + kdfs_phys_read(file, (char *)&(phys_inode), sizeof(struct kdfs_physical_inode), &file->f_pos); + /* read the number of elements */ + kdfs_phys_read(file, (char *)&(no_extents), sizeof(size_t), &file->f_pos); + /* now, read the extents list */ + for(index = 0; index < no_extents; index++) { + kdfs_phys_read(file, (char *)&(record), sizeof(struct kdfs_file_extent_info), &file->f_pos); + new_extent = kmalloc(sizeof(struct kdfs_file_extent), GFP_KERNEL); + new_extent->data.page_first = record.page_first; + new_extent->data.page_last = record.page_last; + new_extent->data.extent_owner = record.extent_owner; + list_add_tail(&new_extent->list_item, &k_inode->extents_list); + } + close_phys_file(file); + } else { + DEBUG(DBG_ALERT, + "Can't access to the KDFS inode %ld\n" + "Please verify type of the partition %s, it should be a KDFS one", + k_inode->inode->i_ino, ((struct kdfs_super_block*)k_inode->inode->i_sb->s_fs_info)->k_opt->part_name); + } + + kfree(phys_filename); + + DEBUG(DBG_INFO, "\n\n\nLIST CONTENTS AFTER READ\n"); + list_for_each_entry(curr, &k_inode->extents_list, list_item) { + DEBUG(DBG_INFO, "#################### f=%lu, l=%lu, o=%d\n", curr->data.page_first, curr->data.page_last, curr->data.extent_owner); + } + return 0; } diff --git a/fs/kdfs/file_extent.h b/fs/kdfs/file_extent.h index 1832994..1597a5e 100644 --- a/fs/kdfs/file_extent.h +++ b/fs/kdfs/file_extent.h @@ -24,7 +24,7 @@ int kdfs_file_extent_set_page_owner(struct kdfs_inode *k_inode, pgoff_t page_no, kdfs_node_t kdfs_file_extent_get_page_owner(struct kdfs_inode *k_inode, pgoff_t page_no); size_t kdfs_file_extent_dump_to_file(struct kdfs_inode *k_inode, struct file *file); -size_t kdfs_file_extent_read_from_file(struct kdfs_inode *k_inode, struct file *file); +size_t kdfs_file_extent_read_from_file(struct kdfs_inode *k_inode); void kdfs_file_extent_net_export(struct kdfs_inode *k_inode, struct kdfs_netinode *net_inode); void kdfs_file_extent_net_import(struct kdfs_inode *k_inode, struct kdfs_netinode *net_inode); diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index f263215..92efd40 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -1147,10 +1147,12 @@ int kdfs_iol_inode_first_touch(kddm_obj_t *objEntry, * Can happen when a content associated kddm set has been instantiated */ k_inode->inode = ilookup(k_sb->sb, objid); - if (k_inode->inode) + if (k_inode->inode) { iput(k_inode->inode); - else + } else { k_inode->inode = kdfs_getinode(k_sb->sb, objid); + kdfs_file_extent_read_from_file(k_inode); + } k_inode->flags = K_INODE_OK; } ----------------------------------------------------------------------- Summary of changes: fs/kdfs/file_extent.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- fs/kdfs/file_extent.h | 2 +- fs/kdfs/inode.c | 6 ++++-- 3 files changed, 51 insertions(+), 6 deletions(-) hooks/post-receive -- kdfs |