|
From: alebre <al...@us...> - 2010-04-02 23:37:35
|
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 15a599ff9119ab06b14d3d6544c6f5fc9061ea65 (commit)
from 287b2cc707a91d25ddf4888daa06170b9c4c9aa5 (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 15a599ff9119ab06b14d3d6544c6f5fc9061ea65
Author: ad <leb...@fr...>
Date: Sat Apr 3 01:35:07 2010 +0000
[MINOR] objectid vs pageid manipulations [JANITORING] Start to check/valid content I/O linker
diff --git a/fs/kdfs/README b/fs/kdfs/README
index 83a9b7c..1a20771 100644
--- a/fs/kdfs/README
+++ b/fs/kdfs/README
@@ -145,5 +145,5 @@ INODE MANAGEMENT:
CONTENT MANAGEMENT (DIR AND PAGES):
- - - - - - - - - - - - - - - -
-
-
+kDFS has been implemented keeping in mind that all writes should be perform locally.
+Since the implementation of the striping policies, objid does not correspond to pageid.
diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c
index 983588a..aed2e77 100644
--- a/fs/kdfs/address_space.c
+++ b/fs/kdfs/address_space.c
@@ -508,20 +508,20 @@ int __local_destroy_content_kddm_set(struct kdfs_inode *k_inode)
/*****************************************************************************/
/* */
-/* ADDRESS IO LINKER PART */
-/* (exploited for dir and file io-linkers) */
-/* */
+/* ADDRESS IO LINKER PART */
+/* (exploited for dir and file io-linkers) */
+/* (Latest code verification - April, 2010 - Adrien) */
/*****************************************************************************/
/*
- * Allocate a kdfs_page object
+ * Allocate a kdfs_page object
* @author Adrien Lebre
*
* @param objEntry Kddm page descriptor.
* @param set Kddm descriptor
* @param objid Id of the page to create.
*
- * @return the new allocated kdfs_page. NULL otherwise.
+ * @return 0
*/
int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid)
{
@@ -536,8 +536,8 @@ int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid)
k_page = kmalloc(sizeof(struct kdfs_page), GFP_KERNEL);
ASSERT(k_page);
- DEBUG(DBG_INFO, "Before Alloc new page %ld from set %lu \n", objid, set->id);
- k_page->page = find_get_page(k_mapping, objid);
+ DEBUG(DBG_INFO, "Before Alloc objid %ld from set %lu (page id %ld)\n", objid, set->id, contentobjid_to_pageindex(objid));
+ k_page->page = find_get_page(k_mapping, contentobjid_to_pageindex(objid));
if (!k_page->page) {
DEBUG(DBG_ALERT,
"Can't find page for file/directory = %ld and page id = %ld, So created and locked\n",
@@ -562,19 +562,19 @@ int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid)
}
/*
- * Handle a kdfs page first touch
+ * Handle a kdfs page first touch
* @author Adrien Lebre
*
- * @param objEntry Kddm page descriptor.
- * @param set Kddm descriptor
- * @param objid Id of the page to create.
- * @param flags Creation flag (useless in that case)
+ * @param objEntry Kddm object descriptor.
+ * @param set Kddm set descriptor
+ * @param objid Id of the object to create.
+ * @param flags Creation flag (useless in that case)
*
* @return 0 if everything is ok. Negative value otherwise.
*/
int kdfs_iol_page_first_touch(kddm_obj_t *objEntry,
- kddm_set_t *set,
- objid_t objid, int flags)
+ kddm_set_t *set,
+ objid_t objid, int flags)
{
struct address_space *k_mapping;
@@ -583,82 +583,83 @@ int kdfs_iol_page_first_touch(kddm_obj_t *objEntry,
char *page_addr = NULL;
loff_t pos;
int res = 0;
+ pgoff_t pageid;
iolinker_data = (struct content_iolinker_data *) set->private_data;
-
- DEBUG(DBG_TRACE, "file/directory = %ld, pageid = %ld (objid = %ld)\n", iolinker_data->ino, contentobjid_to_pageindex(kerrighed_node_id,objid), objid);
+ // First_Touch has to be called only on the node currently in charge of the page
+ BUG_ON(kerrighed_node_id != page_linked_node(objid));
+ pageid = contentobjid_to_pageindex(objid);
/* WARNING: quite ugly, we should not access to a local inode without locking the corresponding kddm object*/
+ /* What do you mean : locking the physical file, what kddm object ? the inode one ? */
k_mapping = ((struct content_iolinker_data *) set->private_data)->k_mapping;
- ASSERT(k_mapping);
- DEBUG(DBG_TRACE, "file/directory = %ld, pageid = %ld mapping = %p\n", iolinker_data->ino,contentobjid_to_pageindex(kerrighed_node_id, objid), k_mapping);
+ BUG_ON(k_mapping == NULL);
+ DEBUG(DBG_TRACE, "file/directory = %ld, pageid = %ld, objid = %ld, @mapping = %p\n", iolinker_data->ino,pageid, objid, k_mapping);
/* Allocate kdfs_page and retrieve page address */
k_page = kmalloc(sizeof(struct kdfs_page), GFP_KERNEL);
- ASSERT(k_page != NULL);
+ BUG_ON(k_page == NULL);
k_page->set_id = set->id;
k_page->obj_id = objid;
/* By default, the whole page is useful */
k_page->offset = 0;
k_page->to = PAGE_SIZE;
- k_page->page = NULL;
-
- ASSERT(k_mapping != NULL);
-
+
/* The page can be already in the cache, especially when we dynamically change the default owner */
- k_page->page = find_get_page(k_mapping, contentobjid_to_pageindex(kerrighed_node_id,objid));
+ k_page->page = find_get_page(k_mapping, pageid);
if (!k_page->page) {
- DEBUG(DBG_ALERT, "Can't find page for file/directory = %ld and page id = %ld, So created and locked\n", iolinker_data->ino, contentobjid_to_pageindex(kerrighed_node_id, objid));
- k_page->page = find_or_create_page(k_mapping, objid, (mapping_gfp_mask(k_mapping)|__GFP_ZERO) & ~__GFP_FS);
+ DEBUG(DBG_TRACE, "Can't find page for file/directory = %ld and " \
+ "page id = %ld, So created and locked\n", iolinker_data->ino,
+ pageid);
+ k_page->page = find_or_create_page(k_mapping, pageid, (mapping_gfp_mask(k_mapping)|__GFP_ZERO) & ~__GFP_FS);
k_page->flags = K_PG_locked;
} else
k_page->flags = K_PG_ok;
- DEBUG(DBG_ALERT, "After find Page count=%d\n", page_count(k_page->page));
+ DEBUG(DBG_TRACE, "After find Page count=%d\n", page_count(k_page->page));
page_addr = (char *) kmap(k_page->page);
- pos = (loff_t)contentobjid_to_pageindex(kerrighed_node_id, objid) * PAGE_SIZE;
+ pos = (loff_t)pageid * PAGE_SIZE;
iolinker_data->content_readphyspage(iolinker_data, page_addr, pos);
kunmap(k_page->page);
if (!IS_ERR(k_page->page))
- DEBUG(DBG_ALERT, "Can't read page for file/directory = %ld and page id = %ld\n", iolinker_data->ino, contentobjid_to_pageindex(kerrighed_node_id, objid));
+ DEBUG(DBG_ALERT, "Can't read page for file/directory = %ld and page id = %ld\n", iolinker_data->ino, contentobjid_to_pageindex(objid));
objEntry->object = (void *) k_page;
- /* TODO PRIORITY 2: should release in kdfs_put_page instead? */
- //page_cache_release(k_page->page);
-
- DEBUG(DBG_ALERT, "After read Page count=%d\n", page_count(k_page->page));
-
+ // Note: the page has not been release, this action should be perform
+ // in the insert or export function according the kddm operation (get or grab)
PRINT_FUNCTION_EXIT;
return res;
}
/*
- * Receive a fresh copy of kdfs_page.
+ * Receive a fresh copy of kdfs_page.
* @author Adrien Lebre
*
- * @param objEntry Descriptor of the page to insert.
- * @param ctnr Container descriptor
- * @param padeid Id of the page to insert.
+ * @param objEntry Descriptor to the object to insert.
+ * @param set KDDM set descriptor
+ * @param objid Id of the object to insert.
*/
int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid)
{
- struct kdfs_page *k_page;
+ struct kdfs_page *k_page;
+
PRINT_FUNCTION_NAME;
k_page = (struct kdfs_page *) objEntry->object;
- DEBUG(DBG_ALERT, "Entering page count=%d\n", page_count(k_page->page));
+ DEBUG(DBG_TRACE, "Entering page count=%d\n", page_count(k_page->page));
/*
* Set the private field of the page to get callback when it is
- * released from local cache.
+ * released from local cache (cf. kdfs_invalidatepage or kdfs_releasepage)
*/
+
SetPagePrivate(k_page->page);
set_page_private(k_page->page, (unsigned long) k_page);
@@ -672,28 +673,32 @@ int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid)
}
page_cache_release(k_page->page);
- DEBUG(DBG_ALERT, "Exiting page count=%d\n", page_count(k_page->page));
+ DEBUG(DBG_TRACE, "Exiting page count=%d\n", page_count(k_page->page));
+
PRINT_FUNCTION_EXIT;
return 0;
}
/*
- * Export an object
+ * Export an object
* @author Adrien Lebre
*
- * @param desc Network descriptor exploited by rpc_pack()
- * @param objEntry The object to export data from.
- * @param objid Object id of the object
+ * @param desc Network descriptor exploited by rpc_pack()
+ * @param set Kddm set descriptor
+ * @param objEntry The object to export data from.
+ * @param objid Object id of the object
+ * @param flags kddm specific values (TODO clarify)
*/
int kdfs_iol_page_export (struct rpc_desc *desc,
- struct kddm_set *set,
- struct kddm_obj *objEntry,
- objid_t objid,
- int flags)
+ struct kddm_set *set,
+ struct kddm_obj *objEntry,
+ objid_t objid,
+ int flags)
{
struct kdfs_page *k_page = (struct kdfs_page *)objEntry->object;
int res = 0;
char *page_addr = NULL;
+
PRINT_FUNCTION_NAME;
page_addr = (char *) kmap_atomic(k_page->page, KM_USER0);
@@ -704,43 +709,64 @@ int kdfs_iol_page_export (struct rpc_desc *desc,
kunmap_atomic(page_addr, KM_USER0);
+ if (k_page->flags == K_PG_locked) {
/*
- * If the page has been created by kDFS, we should unlock the page
- * cf. find_or_create() in first touch (in that case : first_touch
- * and export functions are the only ones called, insert is bypassed
+ * if the page is still locked, it means that we are in the case of
+ * a remote grab: first_touch and export functions are the only ones called,
+ * insert is bypassed, so the page has not been unlock and released yet.
*/
- if (k_page->flags == K_PG_locked) {
unlock_page(k_page->page);
k_page->flags = K_PG_ok;
+ page_cache_release(k_page->page);
}
- // TODO ADRIEN NOW: cache_page_release
-
PRINT_FUNCTION_EXIT;
return res;
}
-int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid)
+/*
+ * Invalidate an object
+ * @author Adrien Lebre
+ *
+ * @param objEntry The object to invalidate
+ * @param set Kddm set descriptor
+ * @param objid Object id of the object
+ *
+ * @return 0
+ */
+int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set,
+ objid_t objid)
{
- struct kdfs_page *k_page = (struct kdfs_page *)objEntry->object;
+ struct kdfs_page *k_page ;
+
PRINT_FUNCTION_NAME;
+ k_page=(struct kdfs_page *)objEntry->object;
+
+ /*
+ * the object to invalidate should concern the right page
+ */
+ BUG_ON(contentobjid_to_pageindex(objid)!=k_page->page->index);
+
+ DEBUG(DBG_INFO, "Try to invalidate objid %ld (page id %ld page addr %p) of set %lu\n", objid, k_page->page->index, k_page->page, set->id);
+
trylock_page(k_page->page);
+ // TODO Remove Useless traces
DEBUG(DBG_ALERT, "Page count before =%d\n", page_count(k_page->page));
remove_from_page_cache(k_page->page);
ClearPagePrivate(k_page->page);
unlock_page(k_page->page);
page_cache_release(k_page->page);
+ // TODO Remove Useless traces
DEBUG(DBG_ALERT, "Page after count=%d\n", page_count(k_page->page));
- /*
- * TODO PRIORITY 2: Adrien
- * Page Count should be probably decremented
- */
PRINT_FUNCTION_EXIT;
+
return 0;
}
+// TODO END OF CODE CHECKING
+
/*
* Import an object
* @author Adrien Lebre
@@ -794,7 +820,7 @@ int kdfs_iol_page_sync(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid)
DEBUG(DBG_INFO, "Try to sync page %ld (page addr %p) of set %lu\n", objid, k_page->page, set->id);
- file_pos = ((loff_t)contentobjid_to_pageindex(kerrighed_node_id, objid) * PAGE_SIZE) + k_page->offset;
+ file_pos = ((loff_t)contentobjid_to_pageindex(objid) * PAGE_SIZE) + k_page->offset;
page_addr = (char *) kmap(k_page->page);
pos_addr = page_addr + k_page->offset;
diff --git a/fs/kdfs/address_space.h b/fs/kdfs/address_space.h
index 73e6e01..1a569c7 100644
--- a/fs/kdfs/address_space.h
+++ b/fs/kdfs/address_space.h
@@ -88,6 +88,7 @@ struct kdfs_page {
/* Associated kddm meta-data */
kddm_set_id_t set_id; /* kddm set id */
objid_t obj_id; /* obj_id within kddm set */
+// TODO Now Adrien - the variable is now useless. remove it and fix the import and export functions.
#if KDFS_FILE_STRIPING
kerrighed_node_t linked_node; /* Node physically storing the object*/
#endif
@@ -113,9 +114,9 @@ static inline objid_t pageindex_to_contentobjid(kerrighed_node_t nodeid, pgoff_t
}
-static inline pgoff_t contentobjid_to_pageindex(kerrighed_node_t nodeid, objid_t objid)
+static inline pgoff_t contentobjid_to_pageindex(objid_t objid)
{
- return (objid-nodeid+1)/KDFS_MAX_NO_NODES;
+ return (objid-page_linked_node(objid)+1)/KDFS_MAX_NO_NODES;
}
-----------------------------------------------------------------------
Summary of changes:
fs/kdfs/README | 4 +-
fs/kdfs/address_space.c | 152 +++++++++++++++++++++++++++-------------------
fs/kdfs/address_space.h | 5 +-
3 files changed, 94 insertions(+), 67 deletions(-)
hooks/post-receive
--
kdfs
|