|
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
|