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 |