You can subscribe to this list here.
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(37) |
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2010 |
Jan
(6) |
Feb
|
Mar
(13) |
Apr
(3) |
May
(6) |
Jun
|
Jul
(4) |
Aug
|
Sep
|
Oct
(3) |
Nov
(6) |
Dec
(8) |
2011 |
Jan
(11) |
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Marko O. <d0...@us...> - 2010-03-22 13:08:22
|
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 bd020c813b463aeb6c30eb078ab75bed96007ac7 (commit) from c1d32fe132c4e3398b8dc11cbaa88e9ed63ae824 (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 bd020c813b463aeb6c30eb078ab75bed96007ac7 Author: Marko Obrovac <mar...@in...> Date: Mon Mar 22 15:02:32 2010 +0100 Work on striping extents management continued ... [MINOR] The system is now able to store the extents list in the .meta file of the appropriate inode. Read support comming soon. [MINOR] Consolidate some commonly used defines and types into a new header file (common.h). This file is included in all other header files to facilitate the manipulation of types and objects. diff --git a/fs/kdfs/address_space.h b/fs/kdfs/address_space.h index 46f6679..aab2433 100644 --- a/fs/kdfs/address_space.h +++ b/fs/kdfs/address_space.h @@ -15,6 +15,9 @@ #ifndef __KDFS_ADDR_SPACE__ #define __KDFS_ADDR_SPACE__ + +#include "common.h" + /*--------------------------------------------------------------------------* * * * MACROS * diff --git a/fs/kdfs/common.h b/fs/kdfs/common.h new file mode 100644 index 0000000..cba32d0 --- /dev/null +++ b/fs/kdfs/common.h @@ -0,0 +1,116 @@ +/* + * KDDM File System - common types and includes + * + * @file file_extent.h + * + * @author Marko Obrovac (2010-xxxx) + * + * Copyright (C) 2006-2007, XtreemOS Consortium. + * Copyright (C) 2008-20xx, XtreemOS Consortium, Ascola Research Group. + */ + +#ifndef __KDFS_COMMON__ +#define __KDFS_COMMON__ + + +#include <linux/list.h> +#include <linux/pagemap.h> + +#include <kddm/kddm.h> + + +/* Max number of extent records that fit in a kddm object */ +/* if you change the kdfs_netinode or kdfs_file_extent_info + structures, please update this constant! + 124 = size of kdfs_netinode (without the extents array) + 24 = size of kdfs_file_extent_info */ +#define FILE_EXT_MAX_MEMBERS ((PAGE_SIZE - 124)/24) + + +typedef short kdfs_node_t; /* kerrighed_node_t*/ + +/* FILE STRIPING TYPES */ +/* the actual strip extent info */ +struct kdfs_file_extent_info { + pgoff_t page_first; /* the first page no owned by a node */ + pgoff_t page_last; /* the last page no owned by a node */ + kdfs_node_t extent_owner; /* the node holding the pages contents */ +}; + +/* the extent list item */ +struct kdfs_file_extent { + struct kdfs_file_extent_info data; /* the extent data */ + struct list_head list_item; /* the list member linking it to the list */ +}; + +struct kdfs_inode { + struct inode* inode; /* Local copy of the inode */ + + kddm_set_id_t content_setid; /* Clusterwide Reference to the File or Dir container associated */ + + /* k_inode flags*/ + char flags; + + /* Cluster-wide count */ + atomic_t cw_count; + + /* Striping extents list */ + /* TODO take care of netinode too!!! */ + struct list_head extents_list; +}; + +/* + * Network representation of kdfs_inode + * exploited during import and export functions + */ +struct kdfs_netinode { + /* inode informations */ + unsigned long i_ino; + loff_t i_size; + umode_t i_mode; + unsigned int i_nlink; + uid_t i_uid; + gid_t i_gid; + struct timespec i_atime; + struct timespec i_mtime; + struct timespec i_ctime; + unsigned long i_version; + unsigned long i_state; + + /* Cluster-wide count */ + atomic_t cw_count; + + /* miscellaneous informations*/ + kddm_set_id_t content_setid; + + /* k_inode flags*/ + char flags; + + /* File extents portion */ + size_t no_extents; + struct kdfs_file_extent_info extents[FILE_EXT_MAX_MEMBERS]; +}; + +/* + * A physical representation of kDFS inode is required. + * This representation is stored on the .meta file. + * First, to protect kDFS consistency (direct manipulations on the native FS + * inodes will not impact on the kDFS structure). + * Second, since we exploit a '...' file for storing meta-informations + * (directory entries, object localisation, ...). We simply cannont exploit nlink native value. + * Directly using native inodes make inode management harder and uglier :p + */ +struct kdfs_physical_inode { + loff_t size; + umode_t mode; + unsigned int nlink; + unsigned long version; + uid_t uid; + gid_t gid; + struct timespec atime; + struct timespec mtime; + struct timespec ctime; +}; + + +#endif diff --git a/fs/kdfs/dir.h b/fs/kdfs/dir.h index 7c0eae5..49493ee 100644 --- a/fs/kdfs/dir.h +++ b/fs/kdfs/dir.h @@ -14,6 +14,10 @@ #ifndef __KDFS_DIRECTORY__ #define __KDFS_DIRECTORY__ + +#include "common.h" + + /*--------------------------------------------------------------------------* * * * MACROS * diff --git a/fs/kdfs/extent.h b/fs/kdfs/extent.h index 8c4aea7..bd51150 100644 --- a/fs/kdfs/extent.h +++ b/fs/kdfs/extent.h @@ -11,6 +11,10 @@ #ifndef __KDFS_EXTENT__ #define __KDFS_EXTENT__ + +#include "common.h" + + struct kdfs_zone { /* Where is this zone in the logical file */ loff_t l_start; diff --git a/fs/kdfs/file.h b/fs/kdfs/file.h index 9826fa6..c64222b 100644 --- a/fs/kdfs/file.h +++ b/fs/kdfs/file.h @@ -14,6 +14,11 @@ #ifndef __KDFS_FILE__ #define __KDFS_FILE__ + + +#include "common.h" + + /*--------------------------------------------------------------------------* * * * EXTERN VARIABLES * diff --git a/fs/kdfs/file_extent.c b/fs/kdfs/file_extent.c index 13360c5..e786cb4 100644 --- a/fs/kdfs/file_extent.c +++ b/fs/kdfs/file_extent.c @@ -227,7 +227,6 @@ 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) { - /* TODO Implement*/ return 0; } diff --git a/fs/kdfs/file_extent.h b/fs/kdfs/file_extent.h index 1b3a7bd..1832994 100644 --- a/fs/kdfs/file_extent.h +++ b/fs/kdfs/file_extent.h @@ -13,12 +13,7 @@ #define __KDFS_FILE_EXTENT__ -#include <linux/list.h> -#include <linux/pagemap.h> - -#include <kddm/kddm.h> - -#include "inode.h" +#include "common.h" void kdfs_file_extent_init(struct kdfs_inode *k_inode); diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 8113b82..f263215 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -15,8 +15,8 @@ #include <net/krgrpc/rpcid.h> #include <kddm/kddm.h> -#include "super.h" #include "inode.h" +#include "super.h" #include "file_extent.h" #include "dir.h" #include "file.h" @@ -1369,7 +1369,7 @@ int kdfs_iol_inode_sync_object(kddm_obj_t *objEntry, return -1; } - kdfs_write_inode(kdfs_inode->inode); + __kdfs_write_inode(kdfs_inode); PRINT_FUNCTION_EXIT; return 0; } diff --git a/fs/kdfs/inode.h b/fs/kdfs/inode.h index f508d46..1581ef5 100644 --- a/fs/kdfs/inode.h +++ b/fs/kdfs/inode.h @@ -15,6 +15,11 @@ #define __KDFS_INODE__ + +#include "common.h" + + + /*--------------------------------------------------------------------------* * * * MACROS * @@ -29,13 +34,6 @@ #define K_INODE_DIRTY 8 #define K_INODE_TODELETE 16 -/* Max number of extent records that fit in a kddm object */ -/* if you change the kdfs_netinode or kdfs_file_extent_info - structures, please update this constant! - 124 = size of kdfs_netinode (without the extents array) - 24 = size of kdfs_file_extent_info */ -#define FILE_EXT_MAX_MEMBERS ((PAGE_SIZE - 124)/24) - /* cf <ctnr/object-server.h> */ #ifndef KDDM_CREATE_ON_FT #define KDDM_CREATE_ON_FT 0x00000100 @@ -47,74 +45,6 @@ * * *--------------------------------------------------------------------------*/ -/* COPIED FROM super.h */ -#ifndef __KDFS_SUPER__ -typedef short kdfs_node_t; /* kerrighed_node_t*/ -#endif -/* END COPY */ - -/* FILE STRIPING TYPES */ -/* the actual strip extent info */ -struct kdfs_file_extent_info { - pgoff_t page_first; /* the first page no owned by a node */ - pgoff_t page_last; /* the last page no owned by a node */ - kdfs_node_t extent_owner; /* the node holding the pages contents */ -}; -/* the extent list item */ -struct kdfs_file_extent { - struct kdfs_file_extent_info data; /* the extent data */ - struct list_head list_item; /* the list member linking it to the list */ -}; - - -struct kdfs_inode { - struct inode* inode; /* Local copy of the inode */ - - kddm_set_id_t content_setid; /* Clusterwide Reference to the File or Dir container associated */ - - /* k_inode flags*/ - char flags; - - /* Cluster-wide count */ - atomic_t cw_count; - - /* Striping extents list */ - /* TODO take care of netinode too!!! */ - struct list_head extents_list; -}; - -/* - * Network representation of kdfs_inode - * exploited during import and export functions - */ -struct kdfs_netinode { - /* inode informations */ - unsigned long i_ino; - loff_t i_size; - umode_t i_mode; - unsigned int i_nlink; - uid_t i_uid; - gid_t i_gid; - struct timespec i_atime; - struct timespec i_mtime; - struct timespec i_ctime; - unsigned long i_version; - unsigned long i_state; - - /* Cluster-wide count */ - atomic_t cw_count; - - /* miscellaneous informations*/ - kddm_set_id_t content_setid; - - /* k_inode flags*/ - char flags; - - /* File extents portion */ - size_t no_extents; - struct kdfs_file_extent_info extents[FILE_EXT_MAX_MEMBERS]; -}; - /*--------------------------------------------------------------------------* * * * PROTOTYPES * diff --git a/fs/kdfs/physical_fs.h b/fs/kdfs/physical_fs.h index da833c6..590f9fd 100644 --- a/fs/kdfs/physical_fs.h +++ b/fs/kdfs/physical_fs.h @@ -13,6 +13,11 @@ #ifndef __KDFS_PHYSICAL_FS__ #define __KDFS_PHYSICAL_FS__ + + +#include "common.h" + + /*--------------------------------------------------------------------------* * * * MACROS * diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index db1ebdf..b2fc70e 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -22,8 +22,8 @@ #include <kddm/kddm.h> #include "physical_fs.h" -#include "super.h" #include "inode.h" +#include "super.h" #include "file_extent.h" #include "dir.h" #include "address_space.h" @@ -990,8 +990,6 @@ struct inode *kdfs_getinode(struct super_block *sb, unsigned long ino) /* * Write a physical inode of kDFS - * This function is called by the VFS when a kDFS inode is marked dirty and one - * sync operation is generated by the VFS (sync, pdfflush, ...) * * @author Adrien Lebre * @@ -999,8 +997,9 @@ struct inode *kdfs_getinode(struct super_block *sb, unsigned long ino) * @param sync ?? - but currently not used * */ -int kdfs_write_inode(struct inode *inode) +int __kdfs_write_inode(struct kdfs_inode *k_inode) { + struct inode *inode = k_inode->inode; struct file *file = NULL; char *phys_filename = NULL; struct kdfs_physical_inode phys_inode; @@ -1042,7 +1041,7 @@ int kdfs_write_inode(struct inode *inode) * it seams the kdfs_inode is locked, but we need it * to dump the extent's info in the meta file ... **********************/ - //kdfs_file_extent_dump_to_file(kdfs_iget(inode->i_ino), file); + kdfs_file_extent_dump_to_file(k_inode, file); close_phys_file(file); } else { DEBUG (DBG_ALERT, diff --git a/fs/kdfs/super.h b/fs/kdfs/super.h index 4b615e7..38c9efc 100644 --- a/fs/kdfs/super.h +++ b/fs/kdfs/super.h @@ -18,6 +18,11 @@ #include <asm/page.h> #include <linux/statfs.h> + + +#include "common.h" + + /*--------------------------------------------------------------------------* * * * MACROS * @@ -38,7 +43,6 @@ #define KDFS_COMPUTE_ROOT_INODEID(kdfs_sb)\ ((kdfs_sb->root_nodeid << 24) + KDFS_ROOT_INODEID) -typedef short kdfs_node_t; /* kerrighed_node_t*/ #define KDFS_MIN_NODEID 0 #define KDFS_MAX_NODEID 255 #define KDFS_MAX_NO_NODES ((KDFS_MAX_NODEID) - (KDFS_MIN_NODEID) + 1) @@ -171,27 +175,6 @@ struct kdfs_netcwsb { char bmp[KDFS_CW_SB_BYTES]; // The bitmap to transfer }; -/* - * A physical representation of kDFS inode is required. - * This representation is stored on the .meta file. - * First, to protect kDFS consistency (direct manipulations on the native FS - * inodes will not impact on the kDFS structure). - * Second, since we exploit a '...' file for storing meta-informations - * (directory entries, object localisation, ...). We simply cannont exploit nlink native value. - * Directly using native inodes make inode management harder and uglier :p - */ -struct kdfs_physical_inode { - loff_t size; - umode_t mode; - unsigned int nlink; - unsigned long version; - uid_t uid; - gid_t gid; - struct timespec atime; - struct timespec mtime; - struct timespec ctime; -}; - /*--------------------------------------------------------------------------* * * * EXTERN VARIABLES * @@ -215,7 +198,7 @@ int finalize_kdfs(void); void cleanup_kdfs(void); void kdfs_getphysicalpath(struct kdfs_super_block *k_sb, unsigned long ino, char *physical_filename); -int kdfs_write_inode(struct inode *inode); +int __kdfs_write_inode(struct kdfs_inode *k_inode); struct inode *kdfs_getinode(struct super_block *sb, unsigned long ino); /* Get a free inode id from kdfs_sb partition */ ----------------------------------------------------------------------- Summary of changes: fs/kdfs/address_space.h | 3 + fs/kdfs/common.h | 116 +++++++++++++++++++++++++++++++++++++++++++++++ fs/kdfs/dir.h | 4 ++ fs/kdfs/extent.h | 4 ++ fs/kdfs/file.h | 5 ++ fs/kdfs/file_extent.c | 1 - fs/kdfs/file_extent.h | 7 +--- fs/kdfs/inode.c | 4 +- fs/kdfs/inode.h | 80 ++------------------------------ fs/kdfs/physical_fs.h | 5 ++ fs/kdfs/super.c | 9 ++-- fs/kdfs/super.h | 29 +++--------- 12 files changed, 155 insertions(+), 112 deletions(-) create mode 100644 fs/kdfs/common.h hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-03-22 08:07:30
|
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 c1d32fe132c4e3398b8dc11cbaa88e9ed63ae824 (commit) from 220d6f49eb3796930870a04b9ec525dfcd7cd635 (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 c1d32fe132c4e3398b8dc11cbaa88e9ed63ae824 Author: Marko Obrovac <mar...@in...> Date: Mon Mar 22 09:58:05 2010 +0100 Striping partially done! Currently, a file created on one node will be striped across several nodes if other nodes write to it. The extents list is being correctly imported and exported. Still, the changes to the list are not (yet) flushed to the disk so once the inode gets evicted from the cache, all extents info is lost. diff --git a/fs/kdfs/Makefile b/fs/kdfs/Makefile index f59b146..9396011 100644 --- a/fs/kdfs/Makefile +++ b/fs/kdfs/Makefile @@ -1 +1 @@ -obj-y := physical_fs.o super.o inode.o dir.o file.o address_space.o extent.o cow.o +obj-y := physical_fs.o super.o inode.o dir.o file.o address_space.o extent.o cow.o file_extent.o diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 1d6254e..8c658b2 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -19,6 +19,7 @@ #include "super.h" #include "inode.h" +#include "file_extent.h" #include "address_space.h" #include "physical_fs.h" @@ -186,6 +187,8 @@ int __kdfs_commit_write(struct file *file, if (((loff_t)page->index * PAGE_SIZE) + _to > k_inode->inode->i_size) i_size_write(k_inode->inode, ((loff_t)page->index * PAGE_SIZE) + _to); + /* set the page's owner to this node */ + kdfs_file_extent_set_page_owner(k_inode, page->index, kerrighed_node_id); /* * From the local node point of view, we have to set DIRTY flag to the page: * set_page_dirty(page); diff --git a/fs/kdfs/file.c b/fs/kdfs/file.c index ddeb1df..45a7835 100644 --- a/fs/kdfs/file.c +++ b/fs/kdfs/file.c @@ -17,6 +17,7 @@ #include "super.h" #include "inode.h" +#include "file_extent.h" #include "address_space.h" #include "file.h" @@ -266,10 +267,11 @@ kerrighed_node_t kdfs_iol_file_default_owner (kddm_set_t *kddm_set, struct kdfs_inode *k_inode = kdfs_ilocalfind(my_data->ino); // check who's the default owner of the object !!! - ret_val = inode_linked_node(k_inode->inode->i_ino); + //ret_val = inode_linked_node(k_inode->inode->i_ino); + ret_val = kdfs_file_extent_get_page_owner(k_inode, objid); kdfs_iput(k_inode->inode->i_ino); - DEBUG(DBG_INFO, "inode_linked_node ::: %d\n", ret_val); + DEBUG(DBG_INFO, "######### /\\/\\/\\/ page owner ::: %d\n", ret_val); return ret_val; //return 2; } diff --git a/fs/kdfs/file_extent.c b/fs/kdfs/file_extent.c new file mode 100644 index 0000000..13360c5 --- /dev/null +++ b/fs/kdfs/file_extent.c @@ -0,0 +1,286 @@ +/* + * KDDM File System - striping extents management + * + * @file file_extent.c + * + * @author Marko Obrovac (2010-xxxx) + * + * Copyright (C) 2006-2007, XtreemOS Consortium. + * Copyright (C) 2008-20xx, XtreemOS Consortium, Ascola Research Group. + */ + +#include "file_extent.h" +#include "physical_fs.h" + +#include "debug_kdfs.h" +#define KDFS_PART "KDFS - Strip Extents Management" + + +void kdfs_file_extent_init(struct kdfs_inode *k_inode) +{ + DEBUG(DBG_INFO, "INIT LIST\n"); + /* initialise the extents list */ + INIT_LIST_HEAD(&k_inode->extents_list); +} + +struct kdfs_file_extent *kdfs_file_extent_alloc(pgoff_t page_start, pgoff_t page_end, kdfs_node_t owner_id) +{ + struct kdfs_file_extent *extent; + + /* Allocate the new item and populate it */ + extent = kmalloc(sizeof(struct kdfs_file_extent), GFP_KERNEL); + extent->data.page_first = page_start; + extent->data.page_last = page_end; + extent->data.extent_owner = owner_id; + + return extent; + +} + +int kdfs_file_extent_find(struct list_head *extents, pgoff_t page_no, struct kdfs_file_extent **ext_before, struct kdfs_file_extent **ext_in, struct kdfs_file_extent **ext_after) +{ + struct kdfs_file_extent *curr = NULL; + + *ext_before = *ext_in = *ext_after = NULL; + + list_for_each_entry(curr, extents, list_item) { + if (curr->data.page_first <= page_no && curr->data.page_last >= page_no) { + /* the page is inside this extent */ + *ext_in = curr; + return 1; + } + if (curr->data.page_first > page_no) { + /* the item should be inserted before the current one */ + *ext_after = curr; + return 1; + } + if (curr->data.page_last < page_no) { + /* the item should be inserted after the current one */ + *ext_before = curr; + } + } + + return 1; + +} + +int kdfs_file_extent_set_page_owner(struct kdfs_inode *k_inode, pgoff_t page_no, kdfs_node_t node_id) +{ + struct kdfs_file_extent *new_extent, *sec_new_extent; + struct kdfs_file_extent *extent_before, *extent_in, *extent_after; + struct kdfs_file_extent *curr = NULL; + int ret = 0; + + PRINT_FUNCTION_NAME; + DEBUG(DBG_INFO, "extent for ino=%lu, page_no=%lu, node=%d\n", k_inode->inode->i_ino, page_no, node_id); + + /* if the list is empty, just create a new item */ + if (list_empty(&k_inode->extents_list)) { + new_extent = kdfs_file_extent_alloc(page_no, page_no, node_id); + list_add(&new_extent->list_item, &k_inode->extents_list); + goto out; + } + + /* try to locate the page's extent */ + kdfs_file_extent_find(&k_inode->extents_list, page_no, &extent_before, &extent_in, &extent_after); + + /* do we have to add it in the middle of an existing extent? */ + if (extent_in) { + if (extent_in->data.extent_owner == node_id) { + /* same owner, so nothing to do */ + goto out; + } + if (extent_in->data.page_first < page_no && extent_in->data.page_last > page_no) { + /* extent_in has to be split in three parts */ + new_extent = kdfs_file_extent_alloc(page_no, page_no, node_id); + list_add(&new_extent->list_item, &extent_in->list_item); + sec_new_extent = kdfs_file_extent_alloc(page_no + 1, extent_in->data.page_last, extent_in->data.extent_owner); + list_add(&sec_new_extent->list_item, &new_extent->list_item); + extent_in->data.page_last = page_no - 1; + goto out; + } + /* :: border cases :: */ + if (extent_in->data.page_first == page_no) { + /* the new extent has to be put in front of extent_in */ + if (extent_in->data.page_last == page_no) { + /* this is a one-page extent, so just change the owner */ + extent_in->data.extent_owner = node_id; + goto out; + } + /* fix extent_in's border */ + extent_in->data.page_first = page_no + 1; + if (extent_before) { + if (extent_before->data.page_last == page_no - 1 && extent_before->data.extent_owner == node_id) { + /* add this page to the previous extent */ + extent_before->data.page_last = page_no; + goto out; + } + /* add a new extent between extent_before and extent_in */ + new_extent = kdfs_file_extent_alloc(page_no, page_no, node_id); + list_add(&new_extent->list_item, &extent_before->list_item); + goto out; + } + /* extent_in is the first item in the list, so add a new extent in front of it */ + new_extent = kdfs_file_extent_alloc(page_no, page_no, node_id); + list_add(&new_extent->list_item, &k_inode->extents_list); + goto out; + } + /* this page_no is the last page in extent_in but has a different owner */ + /* fix extent_in's border */ + extent_in->data.page_last = page_no - 1; + if (extent_after && extent_after->data.page_first == page_no + 1 && extent_after->data.extent_owner == node_id) { + /* we can attach this page to the next extent in the list */ + extent_after->data.page_first = page_no; + goto out; + } + /* create a new extent and place it after extent_in */ + new_extent = kdfs_file_extent_alloc(page_no, page_no, node_id); + list_add(&new_extent->list_item, &extent_in->list_item); + goto out; + } + + /* do we have to add the extent between two other extents? */ + if (extent_before && extent_after && extent_before->data.extent_owner == extent_after->data.extent_owner + && extent_before->data.extent_owner == node_id && extent_before->data.page_last == extent_after->data.page_first - 2) { + /* concatenate the two extents, encapsulating the page to be added */ + extent_before->data.page_last = extent_after->data.page_last; + /* delete extent_after, as it is part of extent_before now */ + list_del(&extent_after->list_item); + kfree(extent_after); + goto out; + } + + /* are there any extents we can attach this page to? */ + if (extent_before && extent_before->data.extent_owner == node_id && extent_before->data.page_last == page_no - 1) { + /* just append the page to extent_before */ + extent_before->data.page_last = page_no; + goto out; + } + if (extent_after && extent_after->data.extent_owner == node_id && extent_after->data.page_first == page_no + 1) { + /* add this page to extent_after */ + extent_after->data.page_first = page_no; + goto out; + } + + /* do we have to add the extent after an existing one? */ + if (extent_before) { + /* just create a new extent and place it after extent_before */ + new_extent = kdfs_file_extent_alloc(page_no, page_no, node_id); + list_add(&new_extent->list_item, &extent_before->list_item); + goto out; + } + + /* finally, add a new extent in front of extent_after */ + new_extent = kdfs_file_extent_alloc(page_no, page_no, node_id); + list_add_tail(&new_extent->list_item, &extent_after->list_item); + +out: + DEBUG(DBG_INFO, "LIST CONTENTS AFTER MANIP\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); + } + + PRINT_FUNCTION_EXIT; + + return ret; + +} + +kdfs_node_t kdfs_file_extent_get_page_owner(struct kdfs_inode *k_inode, pgoff_t page_no) +{ + struct kdfs_file_extent *extent_before, *extent_in, *extent_after; + + kdfs_file_extent_find(&k_inode->extents_list, page_no, &extent_before, &extent_in, &extent_after); + + if (extent_in) { + return extent_in->data.extent_owner; + } + + return kerrighed_node_id; + +} + +size_t kdfs_file_extent_dump_to_file(struct kdfs_inode *k_inode, struct file *file) +{ + int list_count = 0; + int bytes_written = 0; + struct kdfs_file_extent *curr; + + ASSERT(k_inode != NULL); + + list_for_each_entry(curr, &k_inode->extents_list, list_item) { + list_count++; + } + + bytes_written += kdfs_phys_write(file, (char *) &(list_count), + sizeof(int), &file->f_pos); + + list_for_each_entry(curr, &k_inode->extents_list, list_item) { + bytes_written += kdfs_phys_write(file, + (char *) &(curr->data), sizeof(struct kdfs_file_extent_info), + &file->f_pos); + } + + return bytes_written; + +} + +size_t kdfs_file_extent_read_from_file(struct kdfs_inode *k_inode, struct file *file) +{ + /* TODO Implement*/ + return 0; + +} + +void kdfs_file_extent_net_export(struct kdfs_inode *k_inode, struct kdfs_netinode *net_inode) +{ + int list_count = 0; + struct kdfs_file_extent *curr; + + DEBUG(DBG_INFO, "Exporting the extents list for inode %lu\n", k_inode->inode->i_ino); + + list_for_each_entry(curr, &k_inode->extents_list, list_item) { + net_inode->extents[list_count].page_first = curr->data.page_first; + net_inode->extents[list_count].page_last = curr->data.page_last; + net_inode->extents[list_count].extent_owner = curr->data.extent_owner; + //DEBUG(DBG_INFO, "Exporting <%lu, %lu, %d>\n", net_inode->extents[list_count].page_first, net_inode->extents[list_count].page_last, net_inode->extents[list_count].extent_owner); + list_count++; + if (list_count == FILE_EXT_MAX_MEMBERS) { + DEBUG(DBG_ALERT, "The list is too large to export! Exporting only partially\n"); + break; + } + } + + net_inode->no_extents = list_count; + //DEBUG(DBG_INFO, "NO EXPORTED: %d\n", net_inode->no_extents); + +} + +void kdfs_file_extent_net_import(struct kdfs_inode *k_inode, struct kdfs_netinode *net_inode) +{ + int index; + struct kdfs_file_extent *new_extent, *curr; + + DEBUG(DBG_INFO, "Importing the extents list for inode %lu\n", k_inode->inode->i_ino); + + kdfs_file_extent_init(k_inode); + + //DEBUG(DBG_INFO, "NO TO IMPORT: %d\n", net_inode->no_extents); + + for(index = 0; index < net_inode->no_extents; index++) { + new_extent = kmalloc(sizeof(struct kdfs_file_extent), GFP_KERNEL); + new_extent->data.page_first = net_inode->extents[index].page_first; + new_extent->data.page_last = net_inode->extents[index].page_last; + new_extent->data.extent_owner = net_inode->extents[index].extent_owner; + DEBUG(DBG_INFO, "Importing <%lu, %lu, %d>\n", net_inode->extents[index].page_first, net_inode->extents[index].page_last, net_inode->extents[index].extent_owner); + list_add_tail(&new_extent->list_item, &k_inode->extents_list); + } + + DEBUG(DBG_INFO, "LIST CONTENTS AFTER IMPORT\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); + } + +} + + diff --git a/fs/kdfs/file_extent.h b/fs/kdfs/file_extent.h new file mode 100644 index 0000000..1b3a7bd --- /dev/null +++ b/fs/kdfs/file_extent.h @@ -0,0 +1,38 @@ +/* + * KDDM File System - striping extents management + * + * @file file_extent.h + * + * @author Marko Obrovac (2010-xxxx) + * + * Copyright (C) 2006-2007, XtreemOS Consortium. + * Copyright (C) 2008-20xx, XtreemOS Consortium, Ascola Research Group. + */ + +#ifndef __KDFS_FILE_EXTENT__ +#define __KDFS_FILE_EXTENT__ + + +#include <linux/list.h> +#include <linux/pagemap.h> + +#include <kddm/kddm.h> + +#include "inode.h" + + +void kdfs_file_extent_init(struct kdfs_inode *k_inode); +struct kdfs_file_extent *kdfs_file_extent_alloc(pgoff_t page_start, pgoff_t page_end, kdfs_node_t owner_id); +int kdfs_file_extent_find(struct list_head *extents, pgoff_t page_no, struct kdfs_file_extent **ext_before, struct kdfs_file_extent **ext_in, struct kdfs_file_extent **ext_after); + +int kdfs_file_extent_set_page_owner(struct kdfs_inode *k_inode, pgoff_t page_no, kdfs_node_t node_id); +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); + +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); + + +#endif /* __KDFS_FILE_EXTENT__ */ diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 90250e2..8113b82 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -17,6 +17,7 @@ #include "super.h" #include "inode.h" +#include "file_extent.h" #include "dir.h" #include "file.h" #include "address_space.h" @@ -25,6 +26,7 @@ #include "debug_kdfs.h" #define KDFS_PART "KDFS - Inode Management" + /******************************** * * * SOME DEBUG FUNCTIONS * @@ -1050,6 +1052,8 @@ int kdfs_iol_inode_alloc_object (kddm_obj_t *objEntry, k_inode = kmalloc(sizeof(struct kdfs_inode), GFP_KERNEL); ASSERT(k_inode != NULL); atomic_set(&k_inode->cw_count, 0); + /* initialise the extents */ + kdfs_file_extent_init(k_inode); /* Check if the inode is locally in the cache */ /* Can happen when a content associated kddm set has been instantiated */ @@ -1126,6 +1130,8 @@ int kdfs_iol_inode_first_touch(kddm_obj_t *objEntry, k_inode = kmalloc(sizeof(struct kdfs_inode), GFP_KERNEL); ASSERT(k_inode != NULL); atomic_set(&k_inode->cw_count, 0); + /* initialise the extents */ + kdfs_file_extent_init(k_inode); if (flags & KDDM_CREATE_ON_FT) { k_inode->inode = new_inode (k_sb->sb); @@ -1192,6 +1198,9 @@ int kdfs_iol_inode_export_object(struct rpc_desc *desc, PRINT_FUNCTION_NAME; kdfs_export_kdfs_inode(&net_dest, src); + + /* export the extents part */ + kdfs_file_extent_net_export(src, &net_dest); res = rpc_pack_type(desc, net_dest); @@ -1220,6 +1229,9 @@ int kdfs_iol_inode_import_object(struct rpc_desc *desc, res = rpc_unpack_type(desc, net_src); kdfs_import_kdfs_inode(inode_dst, &net_src); + + /* import the extents part */ + kdfs_file_extent_net_import(inode_dst, &net_src); PRINT_FUNCTION_EXIT; return res; diff --git a/fs/kdfs/inode.h b/fs/kdfs/inode.h index 24e4bde..f508d46 100644 --- a/fs/kdfs/inode.h +++ b/fs/kdfs/inode.h @@ -14,6 +14,7 @@ #ifndef __KDFS_INODE__ #define __KDFS_INODE__ + /*--------------------------------------------------------------------------* * * * MACROS * @@ -28,6 +29,13 @@ #define K_INODE_DIRTY 8 #define K_INODE_TODELETE 16 +/* Max number of extent records that fit in a kddm object */ +/* if you change the kdfs_netinode or kdfs_file_extent_info + structures, please update this constant! + 124 = size of kdfs_netinode (without the extents array) + 24 = size of kdfs_file_extent_info */ +#define FILE_EXT_MAX_MEMBERS ((PAGE_SIZE - 124)/24) + /* cf <ctnr/object-server.h> */ #ifndef KDDM_CREATE_ON_FT #define KDDM_CREATE_ON_FT 0x00000100 @@ -39,6 +47,26 @@ * * *--------------------------------------------------------------------------*/ +/* COPIED FROM super.h */ +#ifndef __KDFS_SUPER__ +typedef short kdfs_node_t; /* kerrighed_node_t*/ +#endif +/* END COPY */ + +/* FILE STRIPING TYPES */ +/* the actual strip extent info */ +struct kdfs_file_extent_info { + pgoff_t page_first; /* the first page no owned by a node */ + pgoff_t page_last; /* the last page no owned by a node */ + kdfs_node_t extent_owner; /* the node holding the pages contents */ +}; +/* the extent list item */ +struct kdfs_file_extent { + struct kdfs_file_extent_info data; /* the extent data */ + struct list_head list_item; /* the list member linking it to the list */ +}; + + struct kdfs_inode { struct inode* inode; /* Local copy of the inode */ @@ -49,6 +77,10 @@ struct kdfs_inode { /* Cluster-wide count */ atomic_t cw_count; + + /* Striping extents list */ + /* TODO take care of netinode too!!! */ + struct list_head extents_list; }; /* @@ -77,6 +109,10 @@ struct kdfs_netinode { /* k_inode flags*/ char flags; + + /* File extents portion */ + size_t no_extents; + struct kdfs_file_extent_info extents[FILE_EXT_MAX_MEMBERS]; }; /*--------------------------------------------------------------------------* diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index ee51d2c..db1ebdf 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -24,6 +24,7 @@ #include "physical_fs.h" #include "super.h" #include "inode.h" +#include "file_extent.h" #include "dir.h" #include "address_space.h" @@ -1035,6 +1036,13 @@ int kdfs_write_inode(struct inode *inode) kdfs_phys_write(file, (char *) &(phys_inode), sizeof(struct kdfs_physical_inode), &file->f_pos); + /* Dump the extent's info also */ + /********************** + * #### PROBLEM #### + * it seams the kdfs_inode is locked, but we need it + * to dump the extent's info in the meta file ... + **********************/ + //kdfs_file_extent_dump_to_file(kdfs_iget(inode->i_ino), file); close_phys_file(file); } else { DEBUG (DBG_ALERT, diff --git a/fs/kdfs/super.h b/fs/kdfs/super.h index f480a74..4b615e7 100644 --- a/fs/kdfs/super.h +++ b/fs/kdfs/super.h @@ -14,7 +14,7 @@ #ifndef __KDFS_SUPER__ #define __KDFS_SUPER__ -// for PAGE_SIZE + // for PAGE_SIZE #include <asm/page.h> #include <linux/statfs.h> ----------------------------------------------------------------------- Summary of changes: fs/kdfs/Makefile | 2 +- fs/kdfs/address_space.c | 3 + fs/kdfs/file.c | 6 +- fs/kdfs/file_extent.c | 286 +++++++++++++++++++++++++++++++++++++++++++++++ fs/kdfs/file_extent.h | 38 ++++++ fs/kdfs/inode.c | 12 ++ fs/kdfs/inode.h | 36 ++++++ fs/kdfs/super.c | 8 ++ fs/kdfs/super.h | 2 +- 9 files changed, 389 insertions(+), 4 deletions(-) create mode 100644 fs/kdfs/file_extent.c create mode 100644 fs/kdfs/file_extent.h hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-03-18 21:07:59
|
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 220d6f49eb3796930870a04b9ec525dfcd7cd635 (commit) from a690f294559e7bfb5569d689ea969eaa1c38f504 (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 220d6f49eb3796930870a04b9ec525dfcd7cd635 Author: Marko Obrovac <mar...@in...> Date: Thu Mar 18 23:06:52 2010 +0100 Improve debugging info - include file name and line number in the output diff --git a/fs/kdfs/debug_kdfs.h b/fs/kdfs/debug_kdfs.h index 55b1623..f9a4785 100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@ -41,7 +41,7 @@ # define DEBUG(level, format, args...) \ do { \ if (KDFS_DEBUG_LEVEL >= level || level == DBG_PANIC) { \ - /*pr_debug*/printk("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ + /*pr_debug*/printk("KDFS - %s @ (%s : %d) - %d | ", __func__, __FILE__, __LINE__, \ current->pid) ; \ /*pr_debug*/printk(format, ## args) ; \ } \ @@ -56,8 +56,8 @@ do { \ /* FUNCTION NAME : ENTER and EXIT */ // TODO: redefine the following macros to take into account debug level ! -#define PRINT_FUNCTION_NAME DEBUG(DBG_TRACE, "%s\n", __PRETTY_FUNCTION__) -#define PRINT_FUNCTION_EXIT DEBUG(DBG_TRACE, "%s exited\n", __PRETTY_FUNCTION__) +#define PRINT_FUNCTION_NAME DEBUG(DBG_TRACE, "function ENTER\n") +#define PRINT_FUNCTION_EXIT DEBUG(DBG_TRACE, "function EXIT\n") /* ASSERT and BUG ON */ @@ -72,8 +72,8 @@ do { \ #define ASSERT(expr) \ do {\ if ( !(expr) ) {\ - pr_debug("PANIC : ASSERT " #expr " failed in %s \ - line %d\n", __PRETTY_FUNCTION__, __LINE__ ); \ + /*pr_debug*/printk("PANIC : ASSERT " #expr " failed in %s \ + at %s on line %d\n", __func__, __FILE__, __LINE__ ); \ BUG(); \ } \ } while (0) ----------------------------------------------------------------------- Summary of changes: fs/kdfs/debug_kdfs.h | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-03-18 20:01:56
|
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 a690f294559e7bfb5569d689ea969eaa1c38f504 (commit) from 1c0d160b9b5bb9590b972ad1e3677f5a0f9f198c (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 a690f294559e7bfb5569d689ea969eaa1c38f504 Author: Marko Obrovac <mar...@in...> Date: Thu Mar 18 21:57:13 2010 +0100 * fix a typo * update the definition of kdfs_iol_file_default_owner (the definition changed in the io_linker.h file) * add the kddm tips given by renaud diff --git a/fs/kdfs/file.c b/fs/kdfs/file.c index 048de65..ddeb1df 100644 --- a/fs/kdfs/file.c +++ b/fs/kdfs/file.c @@ -251,7 +251,10 @@ kddm_set_t *create_file_kddm_set(struct kdfs_inode *k_inode) * @param kddm_set Container descriptor * @param objid inode Id. */ -kerrighed_node_t kdfs_iol_file_default_owner (kddm_set_t *kddm_set, objid_t objid) +kerrighed_node_t kdfs_iol_file_default_owner (kddm_set_t *kddm_set, + objid_t objid, + const krgnodemask_t *nodes, + int nr_nodes) { /* * TODO NOW, Adrien @@ -266,7 +269,7 @@ kerrighed_node_t kdfs_iol_file_default_owner (kddm_set_t *kddm_set, objid_t obji ret_val = inode_linked_node(k_inode->inode->i_ino); kdfs_iput(k_inode->inode->i_ino); - DEBUG(DBG_INFO, "inode_linked_node ::: %lu\n", ret_val); + DEBUG(DBG_INFO, "inode_linked_node ::: %d\n", ret_val); return ret_val; //return 2; } diff --git a/fs/kdfs/inode.h b/fs/kdfs/inode.h index fdee579..24e4bde 100644 --- a/fs/kdfs/inode.h +++ b/fs/kdfs/inode.h @@ -31,7 +31,7 @@ /* cf <ctnr/object-server.h> */ #ifndef KDDM_CREATE_ON_FT #define KDDM_CREATE_ON_FT 0x00000100 -#YYendif +#endif /*--------------------------------------------------------------------------* * * diff --git a/fs/kdfs/kddm-tips b/fs/kdfs/kddm-tips new file mode 100644 index 0000000..098221a --- /dev/null +++ b/fs/kdfs/kddm-tips @@ -0,0 +1,3 @@ +KDDM_LOCAL_EXCLUSIVE: 2 concurrent grabs on the same nodes are mutually exclusive (which is not the case by default) +KDDM_FT_LINKED: a first touch must be done on a specific node. (unused) +KDDM_FROZEN: for internal use only ----------------------------------------------------------------------- Summary of changes: fs/kdfs/file.c | 7 +++++-- fs/kdfs/inode.h | 2 +- fs/kdfs/kddm-tips | 3 +++ 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 fs/kdfs/kddm-tips hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-03-17 17:52:45
|
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 1c0d160b9b5bb9590b972ad1e3677f5a0f9f198c (commit) from 58e1c712a0b4ba0ba4fde785cf79209fd7f40e09 (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 1c0d160b9b5bb9590b972ad1e3677f5a0f9f198c Author: Marko Obrovac <mar...@in...> Date: Wed Mar 17 19:48:40 2010 +0100 Start striping development diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 56d14eb..1d6254e 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -841,13 +841,15 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) content_data = (struct content_iolinker_data *) kddm_set->private_data; DEBUG(DBG_INFO, "Instantiate kddm %ld with ino : %ld\n", kddm_set->id, content_data->ino); - if (kddm_set->def_owner == kerrighed_node_id) { + if (kddm_set->def_owner == kerrighed_node_id || kddm_set->def_owner == KDDM_CUSTOM_DEF_OWNER) { content_data->phys_dirname = kmalloc(PATH_MAX, GFP_KERNEL); ASSERT(content_data->phys_dirname != NULL); /* Retrieve local path corresponding to kfds inode number*/ kdfs_getphysicalpath(k_sb, content_data->ino, content_data->phys_dirname); - + if (check_create_phys_dir(content_data->phys_dirname, 0777, 0, 0) != 0) + BUG(); + /* Try to open the physical associated file */ phys_dirname = content_data->phys_dirname + strlen(content_data->phys_dirname); snprintf(content_data->phys_dirname, PATH_MAX, "%s/.meta.index", content_data->phys_dirname); @@ -881,6 +883,7 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) /* TODO PRIORITY 2, Adrien, we could have some issue if the kernel tries to remove the inode during this code */ /* Retrieve the local ref to the k_mapping object */ + inode = ilookup(k_sb->sb, content_data->ino); if (inode) { DEBUG(DBG_INFO, "K_mapping from the cache\n"); diff --git a/fs/kdfs/address_space.h b/fs/kdfs/address_space.h index 894a5fc..46f6679 100644 --- a/fs/kdfs/address_space.h +++ b/fs/kdfs/address_space.h @@ -29,7 +29,7 @@ #define K_PG_used 2 /* If defined, kDFS provides local striping policy */ -#define KDFS_FILE_STRIPING 0 +#define KDFS_FILE_STRIPING 1 /*--------------------------------------------------------------------------* * * @@ -86,7 +86,7 @@ struct kdfs_page { kddm_set_id_t set_id; /* kddm set id */ objid_t obj_id; /* obj_id within kddm set */ #if KDFS_FILE_STRIPING - kdfs_node_t linked_node; /* Node physically storing the object*/ + kerrighed_node_t linked_node; /* Node physically storing the object*/ #endif /* k_page flags*/ diff --git a/fs/kdfs/file.c b/fs/kdfs/file.c index a1707bc..048de65 100644 --- a/fs/kdfs/file.c +++ b/fs/kdfs/file.c @@ -218,7 +218,8 @@ kddm_set_t *create_file_kddm_set(struct kdfs_inode *k_inode) ASSERT(k_inode->inode != NULL); #if KDFS_FILE_STRIPING - kddm_set = __create_content_kddm_set(0, KDDM_SET_CUSTOM_LINKED, k_inode, FILE_LINKER); + //kddm_set = __create_content_kddm_set(0, inode_linked_node(k_inode->inode->i_ino), k_inode, FILE_LINKER); + kddm_set = __create_content_kddm_set(0, KDDM_CUSTOM_DEF_OWNER, k_inode, FILE_LINKER); #else kddm_set = __create_content_kddm_set(0, inode_linked_node(k_inode->inode->i_ino), k_inode, FILE_LINKER); #endif @@ -256,7 +257,18 @@ kerrighed_node_t kdfs_iol_file_default_owner (kddm_set_t *kddm_set, objid_t obji * TODO NOW, Adrien * Implement */ - return KERRIGHED_NODE_ID_NONE; + kerrighed_node_t ret_val; + struct content_iolinker_data *my_data = (struct content_iolinker_data *)kddm_set->private_data; + + struct kdfs_inode *k_inode = kdfs_ilocalfind(my_data->ino); + + // check who's the default owner of the object !!! + ret_val = inode_linked_node(k_inode->inode->i_ino); + kdfs_iput(k_inode->inode->i_ino); + + DEBUG(DBG_INFO, "inode_linked_node ::: %lu\n", ret_val); + return ret_val; + //return 2; } /* diff --git a/fs/kdfs/inode.h b/fs/kdfs/inode.h index 24e4bde..fdee579 100644 --- a/fs/kdfs/inode.h +++ b/fs/kdfs/inode.h @@ -31,7 +31,7 @@ /* cf <ctnr/object-server.h> */ #ifndef KDDM_CREATE_ON_FT #define KDDM_CREATE_ON_FT 0x00000100 -#endif +#YYendif /*--------------------------------------------------------------------------* * * ----------------------------------------------------------------------- Summary of changes: fs/kdfs/address_space.c | 7 +++++-- fs/kdfs/address_space.h | 4 ++-- fs/kdfs/file.c | 16 ++++++++++++++-- fs/kdfs/inode.h | 2 +- 4 files changed, 22 insertions(+), 7 deletions(-) hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-01-18 16:28:11
|
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 58e1c712a0b4ba0ba4fde785cf79209fd7f40e09 (commit) from 4e903f43d02fdd14ab8eaa970daa15cb70fe4510 (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 58e1c712a0b4ba0ba4fde785cf79209fd7f40e09 Author: Marko Obrovac <mar...@in...> Date: Mon Jan 18 16:27:10 2010 +0000 Remove __change_to_physical_root and __change_to_saved_root functions as they are not needed. Moreover, they cause the dentry count problem. diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index c299877..2c9637b 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -24,25 +24,6 @@ #define KDFS_PART "KDFS - Native File System Accesses" -void __change_to_physical_root(struct path *saved_root) -{ - write_lock(¤t->fs->lock); - *saved_root = current->fs->root; - current->fs->root = init_task.fs->root; - write_unlock(¤t->fs->lock); -} - -void __change_to_saved_root(const struct path *saved_root) -{ - struct path root; - - write_lock(¤t->fs->lock); - root = current->fs->root; - current->fs->root = *saved_root; - write_unlock(¤t->fs->lock); - path_put(&root); -} - int __change_creds(struct cred **overridden, const struct cred **old, uid_t fsuid, gid_t fsgid) { @@ -84,7 +65,6 @@ long create_phys_dir(const char *pathname, int error = 0; struct dentry *dentry; struct nameidata nd; - struct path saved_path; const struct cred *old_creds; struct cred *overridden_creds; @@ -94,8 +74,6 @@ long create_phys_dir(const char *pathname, if (error) goto out; - __change_to_physical_root(&saved_path); - error = path_lookup(pathname, LOOKUP_PARENT, &nd); if (error) goto out; @@ -124,7 +102,6 @@ long create_phys_dir(const char *pathname, path_put(&nd.path); out: - __change_to_saved_root(&saved_path); __revert_old_creds(overridden_creds, old_creds); return error; @@ -148,7 +125,6 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) struct dentry *dentry; struct inode *dir; long res = 0; - struct path saved_path; const struct cred *old_creds; struct cred *overridden_creds; @@ -158,8 +134,6 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) if (res) goto out; - __change_to_physical_root(&saved_path); - file = filp_open(pathname, O_LARGEFILE|O_RDONLY, 0644); if (IS_ERR(file) && PTR_ERR(file) == -ENOENT) { DEBUG(DBG_INFO, "Can't access to phys_dir %s\n", pathname); @@ -184,7 +158,6 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) filp_close(file,current->files); out: - __change_to_saved_root(&saved_path); __revert_old_creds(overridden_creds, old_creds); return res; @@ -209,7 +182,6 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ { int error = 0; struct file *file = NULL; - struct path saved_path; const struct cred *old_creds; struct cred *overridden_creds; @@ -217,8 +189,6 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ if (error) goto out; - __change_to_physical_root(&saved_path); - DEBUG(DBG_INFO, "Open physical file %s with flags 0x%08x - mode %o\n", filename, flags, mode); @@ -230,7 +200,6 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ DEBUG(DBG_INFO, "Open physical file %s done : %p\n", filename, file); out: - __change_to_saved_root(&saved_path); __revert_old_creds(overridden_creds, old_creds); if (error) @@ -411,7 +380,6 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) struct dentry *dentry; struct inode *dir; int res = 0; - struct path saved_path; const struct cred *old_creds; struct cred *overridden_creds; @@ -421,8 +389,6 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) if (res) goto out; - __change_to_physical_root(&saved_path); - file = filp_open(filename, O_LARGEFILE|O_RDONLY, 0644); if (IS_ERR(file) && PTR_ERR(file) == -ENOENT) { @@ -448,7 +414,6 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) DEBUG(DBG_INFO, "After vfs_unlink res = %d\n", res); out: - __change_to_saved_root(&saved_path); __revert_old_creds(overridden_creds, old_creds); return res; ----------------------------------------------------------------------- Summary of changes: fs/kdfs/physical_fs.c | 35 ----------------------------------- 1 files changed, 0 insertions(+), 35 deletions(-) hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-01-13 14:22:54
|
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 4e903f43d02fdd14ab8eaa970daa15cb70fe4510 (commit) from e941db48a032fb614ebbbdfe59947a9e5e3534cb (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 4e903f43d02fdd14ab8eaa970daa15cb70fe4510 Author: Marko Obrovac <mar...@in...> Date: Wed Jan 13 14:21:53 2010 +0000 Add another argument to import/export functions used inside the iolinker_struct structure. diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index b66bd6c..56d14eb 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -13,6 +13,8 @@ #include <linux/pagemap.h> +#include <net/krgrpc/rpc.h> +#include <net/krgrpc/rpcid.h> #include <kddm/kddm.h> #include "super.h" @@ -632,7 +634,8 @@ int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) int kdfs_iol_page_export (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, - objid_t objid) + objid_t objid, + int flags) { struct kdfs_page *k_page = (struct kdfs_page *)objEntry->object; int res = 0; @@ -694,7 +697,8 @@ int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t obji int kdfs_iol_page_import(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, - objid_t objid) + objid_t objid, + int flags) { int res = 0; struct kdfs_page *kdfs_page = (struct kdfs_page*) objEntry->object; diff --git a/fs/kdfs/address_space.h b/fs/kdfs/address_space.h index 491695c..894a5fc 100644 --- a/fs/kdfs/address_space.h +++ b/fs/kdfs/address_space.h @@ -112,9 +112,9 @@ void kdfs_mark_page_dirty(kddm_set_id_t set_id, objid_t obj_id); int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid, int flags); int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); -int kdfs_iol_page_export (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, objid_t objid); +int kdfs_iol_page_export (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, objid_t objid, int flags); int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); -int kdfs_iol_page_import (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, objid_t objid); +int kdfs_iol_page_import (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, objid_t objid, int flags); int kdfs_iol_page_sync(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_put(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_remove(void *object, struct kddm_set *set, objid_t objid); diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index c6d2e67..90250e2 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -11,6 +11,8 @@ * Copyright (C) 2006-2007, XtreemOS Consortium. */ +#include <net/krgrpc/rpc.h> +#include <net/krgrpc/rpcid.h> #include <kddm/kddm.h> #include "super.h" @@ -1181,7 +1183,8 @@ int kdfs_iol_inode_first_touch(kddm_obj_t *objEntry, int kdfs_iol_inode_export_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, - objid_t objid) + objid_t objid, + int flags) { struct kdfs_inode *src = (struct kdfs_inode *) objEntry->object; struct kdfs_netinode net_dest; @@ -1206,7 +1209,8 @@ int kdfs_iol_inode_export_object(struct rpc_desc *desc, int kdfs_iol_inode_import_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, - objid_t objid) + objid_t objid, + int flags) { int res = 0; struct kdfs_inode *inode_dst = (struct kdfs_inode*) objEntry->object; diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 8eabce5..ee51d2c 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -17,6 +17,8 @@ #include <linux/proc_fs.h> #include <linux/seq_file.h> +#include <net/krgrpc/rpc.h> +#include <net/krgrpc/rpcid.h> #include <kddm/kddm.h> #include "physical_fs.h" @@ -1888,7 +1890,8 @@ static inline void __kdfs_import_kdfs_cwsb(struct kdfs_cw_sb *dest, struct kdfs_ int kdfs_iol_sb_export(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, - objid_t objid) + objid_t objid, + int flags) { struct kdfs_cw_sb *k_cw_sb = NULL; struct kdfs_super_block *k_sb = NULL; @@ -1946,7 +1949,8 @@ int kdfs_iol_sb_export(struct rpc_desc *desc, int kdfs_iol_sb_import (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, - objid_t objid) + objid_t objid, + int flags) { int res = 0; struct kdfs_generic_sb *kgsb = objEntry->object; ----------------------------------------------------------------------- Summary of changes: fs/kdfs/address_space.c | 8 ++++++-- fs/kdfs/address_space.h | 4 ++-- fs/kdfs/inode.c | 8 ++++++-- fs/kdfs/super.c | 8 ++++++-- 4 files changed, 20 insertions(+), 8 deletions(-) hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-01-13 14:05:24
|
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 discards c6db9af7d662f1f6f50ec7da423000a11c1ad145 (commit) discards aac7aa4efd9eccdfbeaa04c04db7928e8b439110 (commit) discards 159422433e1cbebdd6b3df6edc5e63a77eb17941 (commit) discards a5960d10bd3d0e0b3f67f01a9d2bff5c4d9a76db (commit) discards 6d804a59635d22cd8ccecc171681223bae641978 (commit) discards 727feafdfdb67c56faf8936a555306ac12ba83bd (commit) discards d922ea7c84da39b7ec2ae3d5b05f4e422f6c7495 (commit) discards 42cfa16f195acdd55c4c99ab0ac577eabbf80823 (commit) discards 9fee3b665950ede2d8d578add26530e5bb5a8249 (commit) discards 5144e43b2e59b913bfe8012cf26dc612a6829091 (commit) discards 59d4826cea6aa3f17f387cea83a045f4aaea1fd5 (commit) discards 2e86087f0a4bd2f6e419803905f8cedb6311e81a (commit) discards c61ed4f2effa24ddc2729d4a9a7b9b812ca73f8a (commit) discards a87005035a822077ade4b96f7ae9afe09b6f2001 (commit) discards 0ed4e289e003fb2353b318d21cf17060074e6f69 (commit) discards 942cf87a46b58f3e096826d13ee7ad0ec64db17d (commit) discards 9dedc3c491c2774afbed77d87864433a016080bb (commit) discards 250cc5ac019298154f5712d8c227d7fc3aac99ba (commit) discards 87111978622231b06aa57a74ad350c7cac7d9ac3 (commit) discards e9b2900ac5dcea18ed708cf4688628437606aacd (commit) via e941db48a032fb614ebbbdfe59947a9e5e3534cb (commit) via af683a1fbdbab0cb30ce009103873e11e41dda00 (commit) via 1f74cfe1b051faaa60e5a0a2bebe242e7a93d5c4 (commit) via 665e738693c1a0eaccee8aa00d34df938dc82a51 (commit) via e988f0cc6ef3a09422e24030a7ce586840808218 (commit) via 954ebb4f87b09c2583e557574f3e5f56da9c6a2c (commit) via a15cda30e2116e4a0deb4f5508a2dc6efd9a9ae1 (commit) via 1474819c8521d263dedfdeacc86dfeb9220c3665 (commit) via 09a34f7bd89cd0bb13ccc8594c0d3fc787a0401f (commit) via 149ed630a8943a7b00b4c68710fddb054cfacb2d (commit) via 9c7155504e2c4d60e5ad9f24509a388206bb22a6 (commit) via cf749454a37ec18fdaef3e87c49868b745f8d7d2 (commit) via ba883349dd1a5baafa210eb902665363f1ba9f41 (commit) via bd8bd26b267146df7e49e3338f9679fdcada585c (commit) via a848c99a02723cd8cb8a03830f47713640cf7976 (commit) via f3fa022fae876a86e2075229de1e1e29b9ce1ea1 (commit) via 02bbde5b03504121dd9d0af733d8e55a30e0ada9 (commit) via c118ec7202dd53b1fee58eb8fca3535ef04f5cf2 (commit) via f5a04976cc51b2835361b779f5e458b059307859 (commit) via 408200feebbbc22d70cf5ed45a3f8a87551bdd92 (commit) via fd93f5e6b8527fa2e26673808fe725a89f307aaf (commit) via 219b025717142a0ea244798bb5fbf104e1af79de (commit) via 07fde119b640c73a84fab3671006ae15e91dcb76 (commit) via 3e78c3f8f6ccdea35ec35a0010f6289e7538124b (commit) via 9979402bc16319a4b32df4919b78b84b06f9f905 (commit) via dfc958f2d6ea3ca6d80dc294d23e18b5dd9d66b1 (commit) via ca0974f08c3530809f832b51d2b314622bf3ec28 (commit) via f91427f8280a09d05126e3402084a211c97694b2 (commit) via b25d6bdc3234fc9b0453a82a7112a582b04cbe0c (commit) via 03f5862a6e7dfc16f1946c2854c02c2e7c7f8b48 (commit) via 274b61ee980b7587b21fc0e48eb06bd91f09bb88 (commit) via e5b21886edb7671a009fc6f185129fd75c96a7d7 (commit) via 25aea9bc2f8a73b682af071f81c85b047213b2f0 (commit) via 25bc94fd5572782b3fa41ff48f17e885099952d1 (commit) via 0315473364cde4a1eb142754f444bb368692d200 (commit) via 6ac7ad7c39138f15ddec89db1a9bf79b79980356 (commit) via 876c777f908744a2aa0c3500386b543cfd3521b8 (commit) via 9eb1359cdfbbf39b13b68bef03cb65e20db81f34 (commit) via d008878909eacfcb0faeaed9ea8782bd744f3956 (commit) via ad90d51a605ce1e0dc08484d988cb71541af9fd4 (commit) via 87985e4509613ed6d14d3fac9e08345008371c12 (commit) This update added new revisions after undoing existing revisions. That is to say, the old revision is not a strict subset of the new revision. This situation occurs when you --force push a change and generate a repository containing something like this: * -- * -- B -- O -- O -- O (c6db9af7d662f1f6f50ec7da423000a11c1ad145) \ N -- N -- N (e941db48a032fb614ebbbdfe59947a9e5e3534cb) When this happens we assume that you've already had alert emails for all of the O revisions, and so we here report only the revisions in the N branch from the common base, B. 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 e941db48a032fb614ebbbdfe59947a9e5e3534cb Author: Marko Obrovac <mar...@in...> Date: Tue Jan 12 16:15:05 2010 +0000 Bug fix: * fixed the rpc problem - turned out the definition of import/export functions in struct iolinker_struct had been changed, which caused a wrong pointer assignment. diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 5b60704..b66bd6c 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -630,7 +630,9 @@ int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) * @param objid Object id of the object */ int kdfs_iol_page_export (struct rpc_desc *desc, - kddm_obj_t *objEntry) + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { struct kdfs_page *k_page = (struct kdfs_page *)objEntry->object; int res = 0; @@ -689,7 +691,10 @@ int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t obji * @param object The object to import data in. * @param desc Network descriptor exploited by rpc_pack() */ -int kdfs_iol_page_import(kddm_obj_t *objEntry, struct rpc_desc *desc) +int kdfs_iol_page_import(struct rpc_desc *desc, + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { int res = 0; struct kdfs_page *kdfs_page = (struct kdfs_page*) objEntry->object; diff --git a/fs/kdfs/address_space.h b/fs/kdfs/address_space.h index 5a7ac7a..491695c 100644 --- a/fs/kdfs/address_space.h +++ b/fs/kdfs/address_space.h @@ -112,9 +112,9 @@ void kdfs_mark_page_dirty(kddm_set_id_t set_id, objid_t obj_id); int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid, int flags); int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); -int kdfs_iol_page_export (struct rpc_desc *desc, kddm_obj_t *objEntry); +int kdfs_iol_page_export (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, objid_t objid); int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); -int kdfs_iol_page_import (kddm_obj_t *objEntry, struct rpc_desc *desc); +int kdfs_iol_page_import (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, objid_t objid); int kdfs_iol_page_sync(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_put(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_remove(void *object, struct kddm_set *set, objid_t objid); diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index f126cb8..c6d2e67 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -1179,7 +1179,9 @@ int kdfs_iol_inode_first_touch(kddm_obj_t *objEntry, * */ int kdfs_iol_inode_export_object(struct rpc_desc *desc, - kddm_obj_t *objEntry) + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { struct kdfs_inode *src = (struct kdfs_inode *) objEntry->object; struct kdfs_netinode net_dest; @@ -1201,7 +1203,10 @@ int kdfs_iol_inode_export_object(struct rpc_desc *desc, * @param object The object to import data in. * @param desc Network descriptor exploited by rpc_pack() */ -int kdfs_iol_inode_import_object(kddm_obj_t *objEntry, struct rpc_desc *desc) +int kdfs_iol_inode_import_object(struct rpc_desc *desc, + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { int res = 0; struct kdfs_inode *inode_dst = (struct kdfs_inode*) objEntry->object; diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 1c2c87b..8eabce5 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -1886,7 +1886,9 @@ static inline void __kdfs_import_kdfs_cwsb(struct kdfs_cw_sb *dest, struct kdfs_ * @param objid Identifier of the object in the kDDM set */ int kdfs_iol_sb_export(struct rpc_desc *desc, - kddm_obj_t *objEntry) + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { struct kdfs_cw_sb *k_cw_sb = NULL; struct kdfs_super_block *k_sb = NULL; @@ -1941,8 +1943,10 @@ int kdfs_iol_sb_export(struct rpc_desc *desc, * @param object The object to import data in. * @param desc Network descriptor exploited by rpc_pack() */ -int kdfs_iol_sb_import (kddm_obj_t *objEntry, - struct rpc_desc *desc) +int kdfs_iol_sb_import (struct rpc_desc *desc, + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { int res = 0; struct kdfs_generic_sb *kgsb = objEntry->object; commit af683a1fbdbab0cb30ce009103873e11e41dda00 Author: Marko Obrovac <mar...@in...> Date: Thu Oct 29 08:33:39 2009 +0000 Substitute pr_debug with printk as to be able to always see kdfs debug output diff --git a/fs/kdfs/debug_kdfs.h b/fs/kdfs/debug_kdfs.h index a5a377c..55b1623 100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@ -41,9 +41,9 @@ # define DEBUG(level, format, args...) \ do { \ if (KDFS_DEBUG_LEVEL >= level || level == DBG_PANIC) { \ - pr_debug("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ + /*pr_debug*/printk("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ current->pid) ; \ - pr_debug(format, ## args) ; \ + /*pr_debug*/printk(format, ## args) ; \ } \ if(level == DBG_PANIC)\ BUG();\ commit 1f74cfe1b051faaa60e5a0a2bebe242e7a93d5c4 Merge: ae83ede 665e738 Author: Marko Obrovac <mar...@in...> Date: Wed Jan 13 13:40:01 2010 +0000 Merge branch 'master' of git://mirrors.git.kernel.org/cluster/kerrighed/kernel into clean-merge Conflicts: include/kddm/io_linker.h include/kddm/kddm_set.h diff --cc include/kddm/io_linker.h index 41abb51,c56425c..b6fa1e0 --- a/include/kddm/io_linker.h +++ b/include/kddm/io_linker.h @@@ -64,7 -64,7 +64,8 @@@ enu STRING_LIST_LINKER, KDDM_TEST_LINKER, MM_STRUCT_LINKER, + PIDMAP_MAP_LINKER, + SB_LINKER, MAX_IO_LINKER, /* MUST always be the last one */ } ; diff --cc include/kddm/kddm_set.h index 6853124,5632a6c..9cc9c99 --- a/include/kddm/kddm_set.h +++ b/include/kddm/kddm_set.h @@@ -67,46 -71,35 +71,47 @@@ enu enum { KDDM_SET_UNUSED, // 0 - TASK_KDDM_ID, // 1 - SIGNAL_STRUCT_KDDM_ID, // 2 - SIGHAND_STRUCT_KDDM_ID, // 3 - STATIC_NODE_INFO_KDDM_ID, // 4 - STATIC_CPU_INFO_KDDM_ID, // 5 - DYNAMIC_NODE_INFO_KDDM_ID, // 6 - DYNAMIC_CPU_INFO_KDDM_ID, // 7 - APP_KDDM_ID, // 8 - SHMID_KDDM_ID, // 9 - SHMKEY_KDDM_ID, // 10 - SHMMAP_KDDM_ID, // 11 - SEMARRAY_KDDM_ID, // 12 - SEMKEY_KDDM_ID, // 13 - SEMMAP_KDDM_ID, // 14 - SEMUNDO_KDDM_ID, // 15 - MSG_KDDM_ID, // 16 - MSGKEY_KDDM_ID, // 17 - MSGMAP_KDDM_ID, // 18 - MSGMASTER_KDDM_ID, // 19 - PID_KDDM_ID, // 20 - CHILDREN_KDDM_ID, // 21 - DVFS_FILE_STRUCT_KDDM_ID, // 22 - GLOBAL_LOCK_KDDM_SET_ID, // 23 - GLOBAL_CONFIG_KDDM_SET_ID, // 24 - KDDM_TEST4_DIST, // 25 - KDDM_TEST4_LOC, // 26 - KDDM_TEST4096, // 27 - MM_STRUCT_KDDM_ID, // 28 + KDFS_FILE_KDDM__ID, // 1 + KDFS_INODE_KDDM_ID, // 2 + KDFS_DENTRY_KDDM_ID, // 3 + TASK_KDDM_ID, // 4 + SIGNAL_STRUCT_KDDM_ID, // 5 + SIGHAND_STRUCT_KDDM_ID, // 6 + STATIC_NODE_INFO_KDDM_ID, // 7 + STATIC_CPU_INFO_KDDM_ID, // 8 + DYNAMIC_NODE_INFO_KDDM_ID, // 9 + DYNAMIC_CPU_INFO_KDDM_ID, // 10 + MEMORY_NODE_INFO_KDDM_ID, // 11 + STREAM_KDDM_ID, // 12 + SOCKET_KDDM_ID, // 13 + APP_KDDM_ID, // 14 + FUTEX_KDDM_ID, // 15 + SHMID_KDDM_ID, // 16 + SHMKEY_KDDM_ID, // 17 + SHMMAP_KDDM_ID, // 18 + SEMARRAY_KDDM_ID, // 19 + SEMKEY_KDDM_ID, // 20 + SEMMAP_KDDM_ID, // 21 + SEMUNDO_KDDM_ID, // 22 + MSG_KDDM_ID, // 23 + MSGKEY_KDDM_ID, // 24 + MSGMAP_KDDM_ID, // 25 + MSGMASTER_KDDM_ID, // 26 + DSTREAM_KDDM_ID, // 27 + DSTREAM_SOCKET_BASE, // 28 + PIDMAP_MAP_KDDM_ID, // 29 + DSTREAM_SOCKET_MAX = DSTREAM_SOCKET_BASE + AF_MAX, // + 32 = 60 + DSTREAM_PIPE_KDDM_ID, // 61 + PID_KDDM_ID, // 62 + CHILDREN_KDDM_ID, // 63 + DVFS_FILE_STRUCT_KDDM_ID, // 64 + GLOBAL_LOCK_KDDM_SET_ID, // 65 + GLOBAL_CONFIG_KDDM_SET_ID, // 66 + KDDM_TEST4_DIST, // 67 + KDDM_TEST4_LOC, // 68 + KDDM_TEST4096, // 69 + MM_STRUCT_KDDM_ID, // 70 + KDFS_SB_KDDM_ID, MIN_KDDM_ID, /* MUST always be the last one */ }; commit 665e738693c1a0eaccee8aa00d34df938dc82a51 Author: Louis Rilling <lou...@ke...> Date: Thu Dec 17 18:19:14 2009 +0100 [BUGFIX] epm: Fix task_delay_info leak on import error Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kernel/fork.c b/kernel/fork.c index e5f883b..97317ca 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1664,6 +1664,9 @@ bad_fork_cleanup_policy: bad_fork_cleanup_cgroup: #endif cgroup_exit(p, cgroup_callbacks_done); +#ifdef CONFIG_KRG_EPM + if (!krg_current) +#endif delayacct_tsk_free(p); if (p->binfmt) module_put(p->binfmt->module); diff --git a/kerrighed/epm/ghost.c b/kerrighed/epm/ghost.c index 7a0cd9e..d4b4147 100644 --- a/kerrighed/epm/ghost.c +++ b/kerrighed/epm/ghost.c @@ -1249,8 +1249,10 @@ static int import_delays(struct epm_action *action, } err = ghost_read(ghost, delays, sizeof(*delays)); - if (err) + if (err) { + kmem_cache_free(delayacct_cache, delays); goto out; + } spin_lock_init(&delays->lock); task->delays = delays; commit e988f0cc6ef3a09422e24030a7ce586840808218 Author: Matthieu Fertré <mat...@ke...> Date: Tue Dec 22 11:36:14 2009 +0100 IPC Msg queue: msgsnd syscall is automatically restarted after being interrupted by a Kerrighed action. diff --git a/ipc/msg.c b/ipc/msg.c index 98988c0..5a914b6 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -817,6 +817,16 @@ long do_msgsnd(int msqid, long mtype, void __user *mtext, #endif ss_del(&s); +#if defined(CONFIG_KRG_IPC) && defined(CONFIG_KRG_EPM) + if (krg_action_any_pending(current)) { +#ifdef CONFIG_KRG_DEBUG + printk("%s:%d - action kerrighed! --> need replay!!\n", + __PRETTY_FUNCTION__, __LINE__); +#endif + err = -ERESTARTSYS; + goto out_unlock_free; + } +#endif if (signal_pending(current)) { err = -ERESTARTNOHAND; goto out_unlock_free; commit 954ebb4f87b09c2583e557574f3e5f56da9c6a2c Author: Matthieu Fertré <mat...@ke...> Date: Tue Dec 22 11:35:53 2009 +0100 IPC Msg queue: msgrcv syscall is automatically restarted after being interrupted by a Kerrighed action. diff --git a/ipc/msg.c b/ipc/msg.c index 9bc05ba..98988c0 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -44,6 +44,9 @@ #include "util.h" #ifdef CONFIG_KRG_IPC #include "krgmsg.h" +#ifdef CONFIG_KRG_EPM +#include <kerrighed/action.h> +#endif #endif /* @@ -1069,6 +1072,17 @@ long do_msgrcv(int msqid, long *pmtype, void __user *mtext, goto out_unlock; list_del(&msr_d.r_list); + +#if defined(CONFIG_KRG_IPC) && defined(CONFIG_KRG_EPM) + if (krg_action_any_pending(current)) { +#ifdef CONFIG_KRG_DEBUG + printk("%s:%d - action kerrighed! --> need replay!!\n", + __PRETTY_FUNCTION__, __LINE__); +#endif + msg = ERR_PTR(-ERESTARTSYS); + goto out_unlock; + } +#endif if (signal_pending(current)) { msg = ERR_PTR(-ERESTARTNOHAND); out_unlock: commit a15cda30e2116e4a0deb4f5508a2dc6efd9a9ae1 Author: Matthieu Fertré <mat...@ke...> Date: Tue Dec 22 09:40:31 2009 +0100 IPC Sem: semtimedop syscall is automatically restarted after being interrupted by a Kerrighed action. diff --git a/ipc/sem.c b/ipc/sem.c index ee816ba..97c2c54 100644 --- a/ipc/sem.c +++ b/ipc/sem.c @@ -89,6 +89,9 @@ #ifdef CONFIG_KRG_IPC #include <linux/random.h> #include <kerrighed/pid.h> +#ifdef CONFIG_KRG_EPM +#include <kerrighed/action.h> +#endif #include "krgsem.h" #endif @@ -1488,6 +1491,18 @@ SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops, goto out_free; } +#if defined(CONFIG_KRG_IPC) && defined(CONFIG_KRG_EPM) + if (krg_action_any_pending(current)) { +#ifdef CONFIG_KRG_DEBUG + printk("%s:%d - action kerrighed! --> need replay!!\n", + __PRETTY_FUNCTION__, __LINE__); +#endif + list_del(&queue.list); + error = -ERESTARTSYS; + goto out_unlock_free; + } +#endif + /* * If queue.status != -EINTR we are woken up by another process */ commit 1474819c8521d263dedfdeacc86dfeb9220c3665 Author: Matthieu Fertré <mat...@ke...> Date: Tue Dec 22 11:59:28 2009 +0100 [JANITOR] IPC Msg queue: check return codes of kmalloc, rpc_pack and rpc_unpack diff --git a/ipc/msg_handler.c b/ipc/msg_handler.c index d2daeb3..904af3b 100644 --- a/ipc/msg_handler.c +++ b/ipc/msg_handler.c @@ -203,9 +203,10 @@ struct msgsnd_msg { kerrighed_node_t requester; int msqid; - long mtype; int msgflg; + long mtype; pid_t tgid; + size_t msgsz; }; long krg_ipc_msgsnd(int msqid, long mtype, void __user *mtext, @@ -221,18 +222,6 @@ long krg_ipc_msgsnd(int msqid, long mtype, void __user *mtext, int index; struct msgsnd_msg msg; - msg.requester = kerrighed_node_id; - msg.msqid = msqid; - msg.mtype = mtype; - msg.msgflg = msgflg; - msg.tgid = tgid; - - buffer = kmalloc(msgsz, GFP_KERNEL); - r = copy_from_user(buffer, mtext, msgsz); - if (r) - goto exit; - - /* TODO: manage ipc namespace */ index = ipcid_to_idx(msqid); master_set = krgipc_ops_master_set(msg_ids(ns).krgops); @@ -253,12 +242,33 @@ long krg_ipc_msgsnd(int msqid, long mtype, void __user *mtext, goto exit; } + msg.requester = kerrighed_node_id; + msg.msqid = msqid; + msg.mtype = mtype; + msg.msgflg = msgflg; + msg.tgid = tgid; + msg.msgsz = msgsz; + + buffer = kmalloc(msgsz, GFP_KERNEL); + if (!buffer) { + r = -ENOMEM; + goto exit; + } + + r = copy_from_user(buffer, mtext, msgsz); + if (r) + goto exit_free_buffer; + desc = rpc_begin(IPC_MSG_SEND, *master_node); _kddm_put_object(master_set, index); - rpc_pack_type(desc, msg); - rpc_pack_type(desc, msgsz); - rpc_pack(desc, 0, buffer, msgsz); + r = rpc_pack_type(desc, msg); + if (r) + goto exit_rpc; + + r = rpc_pack(desc, 0, buffer, msgsz); + if (r) + goto exit_rpc; err = rpc_unpack(desc, RPC_FLAGS_INTR, &r, sizeof(r)); if (err == RPC_EINTR) { @@ -267,16 +277,16 @@ long krg_ipc_msgsnd(int msqid, long mtype, void __user *mtext, r = -EINTR; } +exit_rpc: rpc_end(desc, 0); - -exit: +exit_free_buffer: kfree(buffer); +exit: return r; } static void handle_do_msg_send(struct rpc_desc *desc, void *_msg, size_t size) { - size_t msgsz; void *mtext; long r; sigset_t sigset, oldsigset; @@ -286,25 +296,30 @@ static void handle_do_msg_send(struct rpc_desc *desc, void *_msg, size_t size) ns = find_get_krg_ipcns(); BUG_ON(!ns); - rpc_unpack_type(desc, msgsz); - - mtext = kmalloc(msgsz, GFP_KERNEL); + mtext = kmalloc(msg->msgsz, GFP_KERNEL); + if (!mtext) { + r = -ENOMEM; + goto exit_put_ns; + } - rpc_unpack(desc, 0, mtext, msgsz); + r = rpc_unpack(desc, 0, mtext, msg->msgsz); + if (r) + goto exit_free_text; sigfillset(&sigset); sigprocmask(SIG_UNBLOCK, &sigset, &oldsigset); - r = __do_msgsnd(msg->msqid, msg->mtype, mtext, msgsz, msg->msgflg, + r = __do_msgsnd(msg->msqid, msg->mtype, mtext, msg->msgsz, msg->msgflg, ns, msg->tgid); sigprocmask(SIG_SETMASK, &oldsigset, NULL); flush_signals(current); - rpc_pack_type(desc, r); + r = rpc_pack_type(desc, r); +exit_free_text: kfree(mtext); - +exit_put_ns: put_ipc_ns(ns); } @@ -312,9 +327,10 @@ struct msgrcv_msg { kerrighed_node_t requester; int msqid; - long msgtyp; int msgflg; + long msgtyp; pid_t tgid; + size_t msgsz; }; long krg_ipc_msgrcv(int msqid, long *pmtype, void __user *mtext, @@ -330,11 +346,6 @@ long krg_ipc_msgrcv(int msqid, long *pmtype, void __user *mtext, int retval; int index; struct msgrcv_msg msg; - msg.requester = kerrighed_node_id; - msg.msqid = msqid; - msg.msgtyp = msgtyp; - msg.msgflg = msgflg; - msg.tgid = tgid; /* TODO: manage ipc namespace */ index = ipcid_to_idx(msqid); @@ -356,20 +367,40 @@ long krg_ipc_msgrcv(int msqid, long *pmtype, void __user *mtext, return r; } + msg.requester = kerrighed_node_id; + msg.msqid = msqid; + msg.msgtyp = msgtyp; + msg.msgflg = msgflg; + msg.tgid = tgid; + msg.msgsz = msgsz; + desc = rpc_begin(IPC_MSG_RCV, *master_node); _kddm_put_object(master_set, index); - rpc_pack_type(desc, msg); - rpc_pack_type(desc, msgsz); + r = rpc_pack_type(desc, msg); + if (r) + goto exit; err = rpc_unpack(desc, RPC_FLAGS_INTR, &r, sizeof(r)); if (!err) { if (r > 0) { /* get the real msg type */ - rpc_unpack(desc, 0, pmtype, sizeof(long)); + err = rpc_unpack(desc, 0, pmtype, sizeof(long)); + if (err) + goto err_rpc; buffer = kmalloc(r, GFP_KERNEL); - rpc_unpack(desc, 0, buffer, r); + if (!buffer) { + r = -ENOMEM; + goto exit; + } + + err = rpc_unpack(desc, 0, buffer, r); + if (err) { + kfree(buffer); + goto err_rpc; + } + retval = copy_to_user(mtext, buffer, r); kfree(buffer); if (retval) @@ -381,18 +412,23 @@ long krg_ipc_msgrcv(int msqid, long *pmtype, void __user *mtext, rpc_signal(desc, next_signal(¤t->pending, ¤t->blocked)); r = -EINTR; - } + } else + r = -EPIPE; +exit: rpc_end(desc, 0); return r; + +err_rpc: + r = -EPIPE; + goto exit; } static void handle_do_msg_rcv(struct rpc_desc *desc, void *_msg, size_t size) { - size_t msgsz; void *mtext; - long r; - long pmtype; + long msgsz, pmtype; + int r; struct msgrcv_msg *msg = _msg; sigset_t sigset, oldsigset; struct ipc_namespace *ns; @@ -400,27 +436,34 @@ static void handle_do_msg_rcv(struct rpc_desc *desc, void *_msg, size_t size) ns = find_get_krg_ipcns(); BUG_ON(!ns); - rpc_unpack_type(desc, msgsz); - - mtext = kmalloc(msgsz, GFP_KERNEL); + mtext = kmalloc(msg->msgsz, GFP_KERNEL); + if (!mtext) + goto exit_put_ns; sigfillset(&sigset); sigprocmask(SIG_UNBLOCK, &sigset, &oldsigset); - r = __do_msgrcv(msg->msqid, &pmtype, mtext, msgsz, - msg->msgtyp, msg->msgflg, ns, msg->tgid); + msgsz = __do_msgrcv(msg->msqid, &pmtype, mtext, msg->msgsz, + msg->msgtyp, msg->msgflg, ns, msg->tgid); sigprocmask(SIG_SETMASK, &oldsigset, NULL); flush_signals(current); - rpc_pack_type(desc, r); - if (r > 0) { - rpc_pack_type(desc, pmtype); /* send the real type of msg */ - rpc_pack(desc, 0, mtext, r); - } + r = rpc_pack_type(desc, msgsz); + if (r || msgsz <= 0) + goto exit_free_text; - kfree(mtext); + r = rpc_pack_type(desc, pmtype); /* send the real type of msg */ + if (r) + goto exit_free_text; + + r = rpc_pack(desc, 0, mtext, msgsz); + if (r) + goto exit_free_text; +exit_free_text: + kfree(mtext); +exit_put_ns: put_ipc_ns(ns); } commit 09a34f7bd89cd0bb13ccc8594c0d3fc787a0401f Author: Louis Rilling <lou...@ke...> Date: Thu Dec 10 15:12:41 2009 +0100 [BUGFIX] epm: Fix huge stack frame of sighand_struct_import_objec() And let gcc 4.4 happily compile Kerrighed. Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kerrighed/epm/sighand.c b/kerrighed/epm/sighand.c index c2bb275..9c31a9f 100644 --- a/kerrighed/epm/sighand.c +++ b/kerrighed/epm/sighand.c @@ -118,10 +118,16 @@ static int sighand_struct_import_object(struct rpc_desc *desc, { struct sighand_struct_kddm_object *obj = obj_entry->object; struct sighand_struct *dest; - struct sighand_struct tmp; + struct sighand_struct *tmp; int retval; - retval = rpc_unpack_type(desc, tmp); + tmp = kmem_cache_alloc(sighand_cachep, GFP_KERNEL); + if (!tmp) + return -ENOMEM; + + retval = rpc_unpack_type(desc, tmp->count); + if (likely(!retval)) + retval = rpc_unpack_type(desc, tmp->action); if (likely(!retval)) retval = rpc_unpack_type(desc, obj->count); @@ -130,11 +136,13 @@ static int sighand_struct_import_object(struct rpc_desc *desc, spin_lock_irq(&dest->siglock); /* This is safe since all changes are protected by grab, and * no thread can hold a grab during import */ - atomic_set(&dest->count, atomic_read(&tmp.count)); - memcpy(dest->action, tmp.action, sizeof(dest->action)); + atomic_set(&dest->count, atomic_read(&tmp->count)); + memcpy(dest->action, tmp->action, sizeof(dest->action)); spin_unlock_irq(&dest->siglock); } + kmem_cache_free(sighand_cachep, tmp); + return retval; } @@ -152,7 +160,9 @@ static int sighand_struct_export_object(struct rpc_desc *desc, int retval; src = obj->sighand; - retval = rpc_pack_type(desc, *src); + retval = rpc_pack_type(desc, src->count); + if (likely(!retval)) + retval = rpc_pack_type(desc, src->action); if (likely(!retval)) retval = rpc_pack_type(desc, obj->count); commit 149ed630a8943a7b00b4c68710fddb054cfacb2d Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:32:03 2009 +0100 [MINOR] Move page_table_tree.h to public include kerrighed dir. diff --git a/kerrighed/mm/page_table_tree.h b/include/kerrighed/page_table_tree.h similarity index 100% rename from kerrighed/mm/page_table_tree.h rename to include/kerrighed/page_table_tree.h diff --git a/kerrighed/mm/memory_int_linker.c b/kerrighed/mm/memory_int_linker.c index 269b1c0..4fe455c 100644 --- a/kerrighed/mm/memory_int_linker.c +++ b/kerrighed/mm/memory_int_linker.c @@ -16,13 +16,13 @@ #include <linux/rmap.h> #include <linux/acct.h> #include <kerrighed/pid.h> +#include <kerrighed/page_table_tree.h> #include <asm/tlb.h> #include <kddm/kddm.h> #include "memory_int_linker.h" #include "memory_io_linker.h" #include "mm_struct.h" -#include "page_table_tree.h" struct vm_operations_struct null_vm_ops = {}; diff --git a/kerrighed/mm/memory_io_linker.c b/kerrighed/mm/memory_io_linker.c index c5afc90..174d527 100644 --- a/kerrighed/mm/memory_io_linker.c +++ b/kerrighed/mm/memory_io_linker.c @@ -18,9 +18,10 @@ #include <net/krgrpc/rpc.h> #include <kddm/kddm.h> +#include <kerrighed/page_table_tree.h> + #include "memory_io_linker.h" #include "memory_int_linker.h" -#include "page_table_tree.h" /*****************************************************************************/ /* */ diff --git a/kerrighed/mm/mm.c b/kerrighed/mm/mm.c index 1ca6034..5ad069d 100644 --- a/kerrighed/mm/mm.c +++ b/kerrighed/mm/mm.c @@ -17,8 +17,8 @@ #include <kerrighed/krgsyms.h> #include <kerrighed/mm.h> #include <kerrighed/hotplug.h> +#include <kerrighed/page_table_tree.h> #include <kddm/kddm.h> -#include "page_table_tree.h" #include "mm_struct.h" #include "memory_int_linker.h" #include "memory_io_linker.h" diff --git a/kerrighed/mm/page_table_tree.c b/kerrighed/mm/page_table_tree.c index a4443cb..0e04c92 100644 --- a/kerrighed/mm/page_table_tree.c +++ b/kerrighed/mm/page_table_tree.c @@ -13,8 +13,8 @@ #include <net/krgrpc/rpc.h> #include <kddm/kddm.h> +#include <kerrighed/page_table_tree.h> -#include "page_table_tree.h" #include "memory_int_linker.h" #include "mm_struct.h" #include "vma_struct.h" commit 9c7155504e2c4d60e5ad9f24509a388206bb22a6 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:29:56 2009 +0100 [KDDM] Use the new flags parameter to inform IO linkers about flush operations. diff --git a/include/kddm/object_server.h b/include/kddm/object_server.h index c3d6827..fb3432b 100644 --- a/include/kddm/object_server.h +++ b/include/kddm/object_server.h @@ -32,7 +32,7 @@ #define KDDM_DONT_KILL 0x00000020 #define KDDM_NEED_OBJ_RM_ACK2 0x00000040 #define KDDM_NO_FREEZE 0x00000080 -#define KDDM_CREATE_ON_FT 0x00000100 +#define KDDM_IO_FLUSH 0x00000100 #define KDDM_SYNC_OBJECT 0x00000200 #define KDDM_NO_DATA 0x00000400 #define KDDM_TRY_GRAB 0x00000800 diff --git a/kddm/kddm_flush_object.c b/kddm/kddm_flush_object.c index 5d750cc..8d41311 100644 --- a/kddm/kddm_flush_object.c +++ b/kddm/kddm_flush_object.c @@ -99,7 +99,7 @@ send_copy: } send_copy_on_write(set, obj_entry, objid, dest, - KDDM_REMOVE_ON_ACK); + KDDM_REMOVE_ON_ACK | KDDM_IO_FLUSH); res = 0; goto exit_no_unlock; diff --git a/kddm/object_server.c b/kddm/object_server.c index ac2e27e..5a5b779 100644 --- a/kddm/object_server.c +++ b/kddm/object_server.c @@ -112,7 +112,8 @@ static inline int __handle_invalidation_ack (kerrighed_node_t sender, BUG_ON (dest == 1); obj_entry = send_copy_on_write_and_inv ( - set, obj_entry, msg->objid, dest, 0); + set, obj_entry, msg->objid, dest, + KDDM_IO_FLUSH); /* Wake up the set_flush function */ commit cf749454a37ec18fdaef3e87c49868b745f8d7d2 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:28:55 2009 +0100 [KDDM] Add flags parameter to import/export IO linker functions. This can be usefull to inform IO linkers that an export is coming from a flush. diff --git a/include/kddm/io_linker.h b/include/kddm/io_linker.h index 8ac5665..c56425c 100644 --- a/include/kddm/io_linker.h +++ b/include/kddm/io_linker.h @@ -110,9 +110,9 @@ struct iolinker_struct { int (*alloc_object) (struct kddm_obj * obj_entry, struct kddm_set * set, objid_t objid); int (*import_object) (struct rpc_desc *desc, struct kddm_set *set, - struct kddm_obj *obj_entry, objid_t objid); + struct kddm_obj *obj_entry, objid_t objid, int flags); int (*export_object) (struct rpc_desc *desc, struct kddm_set *set, - struct kddm_obj *obj_entry, objid_t objid); + struct kddm_obj *obj_entry, objid_t objid, int flags); kerrighed_node_t (*default_owner) (struct kddm_set * set, objid_t objid, const krgnodemask_t * nodes, int nr_nodes); char linker_name[16]; @@ -271,9 +271,8 @@ int kddm_io_change_state (struct kddm_obj * obj_entry, * @param buffer Buffer containing data to import. */ int kddm_io_import_object (struct rpc_desc *desc, struct kddm_set *set, - struct kddm_obj *obj_entry, objid_t objid); - - + struct kddm_obj *obj_entry, objid_t objid, + int flags); /** Request an IO linker to export data from an object. * @author Renaud Lottiaux @@ -283,7 +282,8 @@ int kddm_io_import_object (struct rpc_desc *desc, struct kddm_set *set, * @param buffer Buffer to export data to. */ int kddm_io_export_object (struct rpc_desc *desc, struct kddm_set *set, - struct kddm_obj *obj_entry, objid_t objid); + struct kddm_obj *obj_entry, objid_t objid, + int flags); kerrighed_node_t kddm_io_default_owner (struct kddm_set * set, objid_t objid); /** Request an IO linker to allocate an object. diff --git a/ipc/msg_io_linker.c b/ipc/msg_io_linker.c index e9ba4f2..c4dd044 100644 --- a/ipc/msg_io_linker.c +++ b/ipc/msg_io_linker.c @@ -254,7 +254,8 @@ int msq_remove_object(void *object, struct kddm_set *set, objid_t objid) int msq_export_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { msq_object_t *msq_object; int r; @@ -278,7 +279,8 @@ int msq_export_object (struct rpc_desc *desc, int msq_import_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { msq_object_t *msq_object, buffer; struct msg_queue *msq; diff --git a/ipc/semarray_io_linker.c b/ipc/semarray_io_linker.c index 0049c75..71914ba 100644 --- a/ipc/semarray_io_linker.c +++ b/ipc/semarray_io_linker.c @@ -392,7 +392,8 @@ static inline void __export_semqueues(struct rpc_desc *desc, int semarray_export_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { semarray_object_t *sem_object; struct sem_array *sma; @@ -577,7 +578,8 @@ static inline void __unimport_semqueues(struct sem_array *sma) int semarray_import_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { semarray_object_t *sem_object; int r = 0; diff --git a/ipc/semundolst_io_linker.c b/ipc/semundolst_io_linker.c index 96dccc7..c0513b7 100644 --- a/ipc/semundolst_io_linker.c +++ b/ipc/semundolst_io_linker.c @@ -135,7 +135,8 @@ int undolist_invalidate_object (struct kddm_obj * obj_entry, int undolist_export_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct semundo_list_object *undo_list; struct semundo_id *un; @@ -174,7 +175,8 @@ error: int undolist_import_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct semundo_list_object *undo_list; struct semundo_id *un, *prev = NULL; diff --git a/ipc/shm_memory_linker.c b/ipc/shm_memory_linker.c index 28a593b..37f824f 100644 --- a/ipc/shm_memory_linker.c +++ b/ipc/shm_memory_linker.c @@ -34,9 +34,11 @@ extern int memory_alloc_object (struct kddm_obj * objEntry, struct kddm_set * kddm, objid_t objid); extern int memory_import_object (struct rpc_desc *desc, struct kddm_set *set, - struct kddm_obj *objEntry, objid_t objid); + struct kddm_obj *objEntry, objid_t objid, + int flags); extern int memory_export_object (struct rpc_desc *desc, struct kddm_set *set, - struct kddm_obj *objEntry, objid_t objid); + struct kddm_obj *objEntry, objid_t objid, + int flags); extern void map_kddm_page (struct vm_area_struct *vma, unsigned long address, struct page *page, int write); diff --git a/ipc/shmid_io_linker.c b/ipc/shmid_io_linker.c index 9792e79..7033d97 100644 --- a/ipc/shmid_io_linker.c +++ b/ipc/shmid_io_linker.c @@ -233,7 +233,8 @@ int shmid_remove_object (void *object, int shmid_export_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { shmid_object_t *shp_object; @@ -255,7 +256,8 @@ int shmid_export_object (struct rpc_desc *desc, int shmid_import_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { shmid_object_t *shp_object, buffer; struct shmid_kernel *shp; diff --git a/kddm/io_linker.c b/kddm/io_linker.c index fdb78ad..3183674 100644 --- a/kddm/io_linker.c +++ b/kddm/io_linker.c @@ -363,7 +363,8 @@ int kddm_io_change_state (struct kddm_obj * obj_entry, int kddm_io_import_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct iolinker_struct *io = set->iolinker; int res; @@ -373,7 +374,7 @@ int kddm_io_import_object (struct rpc_desc *desc, might_sleep(); if (io && io->import_object) - res = io->import_object(desc, set, obj_entry, objid); + res = io->import_object(desc, set, obj_entry, objid, flags); else res = rpc_unpack(desc, 0, obj_entry->object, set->obj_size); @@ -392,13 +393,14 @@ int kddm_io_import_object (struct rpc_desc *desc, int kddm_io_export_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct iolinker_struct *io = set->iolinker; int res; if (io && io->export_object) - res = io->export_object(desc, set, obj_entry, objid); + res = io->export_object(desc, set, obj_entry, objid, flags); else res = rpc_pack(desc, 0, obj_entry->object, set->obj_size); diff --git a/kddm/object_server.c b/kddm/object_server.c index b9fee0d..ac2e27e 100644 --- a/kddm/object_server.c +++ b/kddm/object_server.c @@ -669,7 +669,8 @@ void handle_object_receive (struct rpc_desc* desc, res = kddm_io_alloc_object (obj_entry, set, msg->objid); BUG_ON(res != 0); - kddm_io_import_object (desc, set, obj_entry, msg->objid); + kddm_io_import_object (desc, set, obj_entry, msg->objid, + msg->flags); kddm_obj_path_lock(set, msg->objid); diff --git a/kddm/protocol_action.c b/kddm/protocol_action.c index 7f6febc..d5d96b9 100644 --- a/kddm/protocol_action.c +++ b/kddm/protocol_action.c @@ -114,7 +114,7 @@ static inline int send_msg_to_object_receiver(kerrighed_node_t dest, } if (!(flags & KDDM_NO_DATA)) { - err = kddm_io_export_object(desc, set, obj_entry, objid); + err = kddm_io_export_object(desc, set, obj_entry, objid, flags); if (err) goto err_cancel; } diff --git a/kerrighed/epm/children.c b/kerrighed/epm/children.c index dde682c..aa56b85 100644 --- a/kerrighed/epm/children.c +++ b/kerrighed/epm/children.c @@ -164,7 +164,8 @@ static int children_first_touch(struct kddm_obj *obj_entry, static int children_export_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct children_kddm_object *obj = obj_entry->object; struct remote_child *child; @@ -195,7 +196,8 @@ out: static int children_import_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct children_kddm_object *obj = obj_entry->object; struct remote_child *child, *next; diff --git a/kerrighed/epm/pid.c b/kerrighed/epm/pid.c index 08fb14f..9e293d5 100644 --- a/kerrighed/epm/pid.c +++ b/kerrighed/epm/pid.c @@ -98,7 +98,8 @@ static int pid_first_touch(struct kddm_obj *obj_entry, static int pid_import_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct pid_kddm_object *obj = obj_entry->object; @@ -111,7 +112,8 @@ static int pid_import_object(struct rpc_desc *desc, static int pid_export_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct pid_kddm_object *obj = obj_entry->object; diff --git a/kerrighed/epm/pidmap.c b/kerrighed/epm/pidmap.c index 739675f..6dc5d2e 100644 --- a/kerrighed/epm/pidmap.c +++ b/kerrighed/epm/pidmap.c @@ -60,7 +60,8 @@ out: } static int pidmap_map_import_object(struct rpc_desc *desc, struct kddm_set *set, - struct kddm_obj *obj_entry, objid_t objid) + struct kddm_obj *obj_entry, objid_t objid, + int flags) { struct pidmap_map *map = obj_entry->object; @@ -68,7 +69,8 @@ static int pidmap_map_import_object(struct rpc_desc *desc, struct kddm_set *set, } static int pidmap_map_export_object(struct rpc_desc *desc, struct kddm_set *set, - struct kddm_obj *obj_entry, objid_t objid) + struct kddm_obj *obj_entry, objid_t objid, + int flags) { struct pidmap_map *map = obj_entry->object; diff --git a/kerrighed/epm/sighand.c b/kerrighed/epm/sighand.c index de42988..c2bb275 100644 --- a/kerrighed/epm/sighand.c +++ b/kerrighed/epm/sighand.c @@ -113,7 +113,8 @@ static int sighand_struct_first_touch(struct kddm_obj *obj_entry, static int sighand_struct_import_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct sighand_struct_kddm_object *obj = obj_entry->object; struct sighand_struct *dest; @@ -143,7 +144,8 @@ static int sighand_struct_import_object(struct rpc_desc *desc, static int sighand_struct_export_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct sighand_struct_kddm_object *obj = obj_entry->object; struct sighand_struct *src; diff --git a/kerrighed/epm/signal.c b/kerrighed/epm/signal.c index 8e2d2e9..bd4c5ea 100644 --- a/kerrighed/epm/signal.c +++ b/kerrighed/epm/signal.c @@ -156,7 +156,8 @@ static int signal_struct_first_touch(struct kddm_obj *obj_entry, static int signal_struct_import_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct signal_struct_kddm_object *obj = obj_entry->object; struct signal_struct *dest = obj->signal; @@ -257,7 +258,8 @@ static int signal_struct_import_object(struct rpc_desc *desc, static int signal_struct_export_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int _flags) { struct signal_struct_kddm_object *obj = obj_entry->object; struct task_struct *tsk; diff --git a/kerrighed/fs/file_struct_io_linker.c b/kerrighed/fs/file_struct_io_linker.c index cadf3d1..a5f2b17 100644 --- a/kerrighed/fs/file_struct_io_linker.c +++ b/kerrighed/fs/file_struct_io_linker.c @@ -73,7 +73,8 @@ int file_remove_object (void *object, int file_export_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct dvfs_file_struct *dvfs_file; @@ -92,7 +93,8 @@ int file_export_object (struct rpc_desc *desc, int file_import_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct dvfs_file_struct *dvfs_file, buffer; diff --git a/kerrighed/mm/memory_io_linker.c b/kerrighed/mm/memory_io_linker.c index 9bc58b1..c5afc90 100644 --- a/kerrighed/mm/memory_io_linker.c +++ b/kerrighed/mm/memory_io_linker.c @@ -54,7 +54,8 @@ int memory_alloc_object (struct kddm_obj * obj_entry, int memory_import_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct page *page = obj_entry->object; char *data; @@ -76,7 +77,8 @@ int memory_import_object (struct rpc_desc *desc, int memory_export_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct page *page = (struct page *)obj_entry->object; char *data; diff --git a/kerrighed/mm/mm_struct_io_linker.c b/kerrighed/mm/mm_struct_io_linker.c index 65ec662..4b4dd97 100644 --- a/kerrighed/mm/mm_struct_io_linker.c +++ b/kerrighed/mm/mm_struct_io_linker.c @@ -80,7 +80,8 @@ int mm_remove_object (void *object, int mm_export_object (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct mm_struct *mm; krgsyms_val_t unmap_id, get_unmap_id; @@ -115,7 +116,8 @@ int mm_export_object (struct rpc_desc *desc, int mm_import_object (struct rpc_desc *desc, struct kddm_set *_set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct mm_struct *mm; krgsyms_val_t unmap_id, get_unmap_id; diff --git a/kerrighed/proc/task.c b/kerrighed/proc/task.c index 48c2d36..cacf0f8 100644 --- a/kerrighed/proc/task.c +++ b/kerrighed/proc/task.c @@ -107,7 +107,8 @@ static int task_first_touch(struct kddm_obj *obj_entry, static int task_import_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct task_kddm_object *dest = obj_entry->object; struct task_kddm_object src; @@ -196,7 +197,8 @@ static void task_update_object(struct task_kddm_object *obj) static int task_export_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct task_kddm_object *src = obj_entry->object; struct task_struct *tsk; diff --git a/kerrighed/scheduler/global_lock.c b/kerrighed/scheduler/global_lock.c index 12e148a..1883ec0 100644 --- a/kerrighed/scheduler/global_lock.c +++ b/kerrighed/scheduler/global_lock.c @@ -27,7 +27,8 @@ static int global_lock_alloc_object(struct kddm_obj *obj_entry, static int global_lock_export_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { return 0; } @@ -36,7 +37,8 @@ static int global_lock_export_object(struct rpc_desc *desc, static int global_lock_import_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { return 0; } diff --git a/kerrighed/scheduler/string_list.c b/kerrighed/scheduler/string_list.c index 0848d74..1db7157 100644 --- a/kerrighed/scheduler/string_list.c +++ b/kerrighed/scheduler/string_list.c @@ -72,7 +72,8 @@ static void string_list_make_empty(struct string_list_object *object) static int string_list_import_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct string_list_object *obj = obj_entry->object; struct string_list_element *elt; @@ -110,7 +111,8 @@ out: static int string_list_export_object(struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, - objid_t objid) + objid_t objid, + int flags) { struct string_list_object *obj = obj_entry->object; struct string_list_element *elt; commit ba883349dd1a5baafa210eb902665363f1ba9f41 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:24:57 2009 +0100 [BUGFIX] Fix issues with *at functions on FAF files. This patch built a full pathname from a FAF directory file and a relative pathname in the kernel do_path_lookup. The calling *at function will then work on the absolute path generated. diff --git a/fs/namei.c b/fs/namei.c index fdee2a1..60835a8 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -34,6 +34,9 @@ #include <linux/device_cgroup.h> #include <linux/fs_struct.h> #include <asm/uaccess.h> +#ifdef CONFIG_KRG_FAF +#include <kerrighed/faf.h> +#endif #define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE]) @@ -1050,6 +1053,20 @@ static int do_path_lookup(int dfd, const char *name, if (!file) goto out_fail; +#ifdef CONFIG_KRG_FAF + if (file->f_flags & O_FAF_CLT) { + faf_client_data_t *data = file->private_data; + + retval = -ENOTDIR; + if (!S_ISDIR(data->i_mode)) + goto fput_fail; + + retval = krg_faf_do_path_lookup(file, name, flags, nd); + + fput_light(file, fput_needed); + return retval; + } +#endif dentry = file->f_path.dentry; retval = -ENOTDIR; commit bd8bd26b267146df7e49e3338f9679fdcada585c Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:22:24 2009 +0100 [MINOR] Expose faf_client_data_t. diff --git a/include/kerrighed/faf.h b/include/kerrighed/faf.h index e1ff500..88d40c5 100644 --- a/include/kerrighed/faf.h +++ b/include/kerrighed/faf.h @@ -10,6 +10,24 @@ struct file; struct kstat; struct statfs; +/*--------------------------------------------------------------------------* + * * + * TYPES * + * * + *--------------------------------------------------------------------------*/ + +typedef struct faf_client_data { + kerrighed_node_t server_id; + int server_fd; + unsigned long f_flags; + fmode_t f_mode; + loff_t f_pos; + wait_queue_head_t poll_wq; + unsigned int poll_revents; + umode_t i_mode; + unsigned int is_named_pipe:1; +} faf_client_data_t; + off_t krg_faf_lseek(struct file *file, off_t offset, unsigned int origin); long krg_faf_llseek(struct file *file, unsigned long offset_high, diff --git a/kerrighed/fs/faf/faf_internal.h b/kerrighed/fs/faf/faf_internal.h index b433e42..efbf980 100644 --- a/kerrighed/fs/faf/faf_internal.h +++ b/kerrighed/fs/faf/faf_internal.h @@ -23,24 +23,6 @@ struct dvfs_file_struct; /*--------------------------------------------------------------------------* * * - * TYPES * - * * - *--------------------------------------------------------------------------*/ - -typedef struct faf_client_data { - kerrighed_node_t server_id; - int server_fd; - unsigned long f_flags; - fmode_t f_mode; - loff_t f_pos; - wait_queue_head_t poll_wq; - unsigned int poll_revents; - umode_t i_mode; - unsigned int is_named_pipe:1; -} faf_client_data_t; - -/*--------------------------------------------------------------------------* - * * * EXTERN FUNCTIONS * * * *--------------------------------------------------------------------------*/ commit a848c99a02723cd8cb8a03830f47713640cf7976 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:21:49 2009 +0100 [FAF] Introduce krg_faf_do_path_lookup function. This function is used to build a full pathname from a directory file and a relative pathname for a FAF file. This function will be used to support linkat, and all *at functions on FAF files. diff --git a/include/kerrighed/faf.h b/include/kerrighed/faf.h index fcdd00f..e1ff500 100644 --- a/include/kerrighed/faf.h +++ b/include/kerrighed/faf.h @@ -4,6 +4,7 @@ #define __FAF_H__ #include <linux/types.h> +#include <linux/namei.h> struct file; struct kstat; @@ -28,6 +29,8 @@ long krg_faf_fstatfs(struct file *file, struct statfs *statfs); long krg_faf_fsync(struct file *file); long krg_faf_flock(struct file *file, unsigned int cmd); char *krg_faf_d_path(struct file *file, char *buffer, int size); +int krg_faf_do_path_lookup(struct file *file, const char *name, + unsigned int flags, struct nameidata *nd); void krg_faf_srv_close(struct file *file); struct sockaddr; diff --git a/kerrighed/fs/faf/faf_hooks.c b/kerrighed/fs/faf/faf_hooks.c index 0169a10..430ccea 100644 --- a/kerrighed/fs/faf/faf_hooks.c +++ b/kerrighed/fs/faf/faf_hooks.c @@ -6,6 +6,7 @@ */ #include <linux/fs.h> #include <linux/file.h> +#include <linux/namei.h> #include <linux/socket.h> #include <linux/sched.h> #include <linux/wait.h> @@ -596,6 +597,39 @@ err_cancel: goto out_end; } +int krg_faf_do_path_lookup(struct file *file, + const char *name, + unsigned int flags, + struct nameidata *nd) +{ + char *tmp = (char *) __get_free_page (GFP_KERNEL); + char *path; + int len, err = 0; + + path = faf_d_path(file, tmp, PAGE_SIZE); + + if (IS_ERR(path)) { + err = PTR_ERR(path); + goto exit; + } + + len = strlen (path); + if ((len >= 10) && (strcmp (path + len - 10, " (deleted)") == 0)) + len -= 10; + + if (likely(path != tmp)) { + strncpy(tmp, path, PAGE_SIZE); + path = tmp; + } + + strncpy(&path[len], name, PAGE_SIZE - len); + + err = path_lookup(path, flags, nd); +exit: + free_page ((unsigned long) tmp); + return err; +} + long krg_faf_bind (struct file * file, struct sockaddr __user *umyaddr, int addrlen) commit f3fa022fae876a86e2075229de1e1e29b9ce1ea1 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:17:14 2009 +0100 [MINOR] Add paranoia check in free_pages_check. diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 0733c3a..548081c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -251,10 +251,10 @@ static void bad_page(struct page *page) current->comm, page_to_pfn(page)); #ifdef CONFIG_KRG_MM printk(KERN_ALERT - "page:%p flags:%p count:%d mapcount:%d mapping:%p index:%lx kddm_count:%d\n", + "page:%p flags:%p count:%d mapcount:%d mapping:%p index:%lx kddm_count:%d obj_entry:%p\n", page, (void *)page->flags, page_count(page), page_mapcount(page), page->mapping, page->index, - page_kddm_count(page)); + page_kddm_count(page), page->obj_entry); #else printk(KERN_ALERT "page:%p flags:%p count:%d mapcount:%d mapping:%p index:%lx\n", @@ -505,6 +505,7 @@ static inline int free_pages_check(struct page *page) (page->mapping != NULL) | (page_count(page) != 0) | #ifdef CONFIG_KRG_MM + (page->obj_entry != NULL) | (page_kddm_count(page) != 0) | #endif (page->flags & PAGE_FLAGS_CHECK_AT_FREE))) { commit 02bbde5b03504121dd9d0af733d8e55a30e0ada9 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:17:04 2009 +0100 [MINOR] Move the non NULL mm test in grab_swap_token. diff --git a/mm/memory.c b/mm/memory.c index 8f09d26..9dad218 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2572,9 +2572,6 @@ static int do_swap_page(struct mm_struct *mm, struct vm_area_struct *vma, delayacct_set_flag(DELAYACCT_PF_SWAPIN); page = lookup_swap_cache(entry); if (!page) { -#ifdef CONFIG_KRG_MM - if (current->mm) -#endif grab_swap_token(); /* Contend for token _before_ read-in */ page = swapin_readahead(entry, GFP_HIGHUSER_MOVABLE, vma, address); diff --git a/mm/thrash.c b/mm/thrash.c index c4c5205..3f80c7d 100644 --- a/mm/thrash.c +++ b/mm/thrash.c @@ -30,6 +30,11 @@ void grab_swap_token(void) { int current_interval; +#ifdef CONFIG_KRG_MM + if (!current->mm) + return; +#endif + global_faults++; current_interval = global_faults - current->mm->faultstamp; commit c118ec7202dd53b1fee58eb8fca3535ef04f5cf2 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:16:46 2009 +0100 [BUGFIX] Fix wrong initialization in memory_remove_page. diff --git a/kerrighed/mm/memory_io_linker.c b/kerrighed/mm/memory_io_linker.c index c4563d6..9bc58b1 100644 --- a/kerrighed/mm/memory_io_linker.c +++ b/kerrighed/mm/memory_io_linker.c @@ -211,9 +211,11 @@ int memory_remove_page (void *object, objid_t objid) { struct page *page = (struct page *) object; - struct kddm_obj *obj_entry = page->obj_entry; + struct kddm_obj *obj_entry; if (page) { + obj_entry = page->obj_entry; + /* Invalidate page table entry */ kddm_pt_invalidate (set, objid, obj_entry, page); commit f5a04976cc51b2835361b779f5e458b059307859 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:15:49 2009 +0100 [MINOR] Fix compilation issue. diff --git a/lib/cluster_barrier.c b/lib/cluster_barrier.c index a74f42b..fa15c8a 100644 --- a/lib/cluster_barrier.c +++ b/lib/cluster_barrier.c @@ -8,10 +8,12 @@ #include <linux/cluster_barrier.h> #include <linux/hashtable.h> +#include <linux/unique_id.h> #include <net/krgrpc/rpc.h> #include <kerrighed/types.h> #include <kerrighed/hotplug.h> +#include <kerrighed/krginit.h> #define TABLE_SIZE 128 commit 408200feebbbc22d70cf5ed45a3f8a87551bdd92 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:15:33 2009 +0100 [MINOR] Fix compilation issue. Compile the hotplug directory only if the CONFIG_KRG_HOTPLUG option is set. diff --git a/kerrighed/Makefile b/kerrighed/Makefile index e7ae071..49836e3 100644 --- a/kerrighed/Makefile +++ b/kerrighed/Makefile @@ -1,5 +1,5 @@ -obj-y := hotplug/ +obj-$(CONFIG_KRG_HOTPLUG) += hotplug/ obj-$(CONFIG_KRG_CAP) += capability/ obj-$(CONFIG_KRG_PROCFS) += procfs/ obj-$(CONFIG_KRG_PROC) += proc/ commit fd93f5e6b8527fa2e26673808fe725a89f307aaf Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Dec 22 13:13:33 2009 +0100 [MINOR] Fix missing #ifdef. diff --git a/mm/vmscan.c b/mm/vmscan.c index e431879..6b26696 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -599,6 +599,7 @@ void putback_lru_page(struct page *page) } #endif /* CONFIG_UNEVICTABLE_LRU */ +#ifdef CONFIG_KRG_MM static int check_injection_flow(void) { long i = 0, limit = RPC_MAX_PAGES; @@ -618,6 +619,7 @@ static int check_injection_flow(void) return 0; } +#endif /* * shrink_page_list() returns the number of reclaimed pages commit 219b025717142a0ea244798bb5fbf104e1af79de Author: Louis Rilling <lou...@ke...> Date: Mon Dec 14 16:56:59 2009 +0100 [BUILD] Fix compilation of ptrace.c without KRG_EPM Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 198432f..e31b3a9 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c @@ -426,7 +426,9 @@ int ptrace_detach(struct task_struct *child, unsigned int data) if (child->ptrace) { child->exit_code = data; dead = __ptrace_detach(current, child); +#ifdef CONFIG_KRG_EPM krg_set_child_ptraced(parent_children_obj, child, 0); +#endif if (!child->exit_state) wake_up_process(child); } commit 07fde119b640c73a84fab3671006ae15e91dcb76 Author: Jean Parpaillon <jea...@ke...> Date: Wed Dec 16 12:11:33 2009 +0100 [misc] Replace Linux logo with Kerrighed one diff --git a/drivers/video/logo/logo_linux_clut224.ppm b/drivers/video/logo/logo_linux_clut224.ppm index 3c14e43..3b4ae11 100644 --- a/drivers/video/logo/logo_linux_clut224.ppm +++ b/drivers/video/logo/logo_linux_clut224.ppm @@ -1,1604 +1,1123 @@ P3 -# Standard 224-color Linux logo 80 80 255 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 6 6 6 6 6 6 10 10 10 10 10 10 - 10 10 10 6 6 6 6 6 6 6 6 6 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0... [truncated message content] |
From: Marko O. <d0...@us...> - 2010-01-12 16:26:14
|
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 c6db9af7d662f1f6f50ec7da423000a11c1ad145 (commit) from aac7aa4efd9eccdfbeaa04c04db7928e8b439110 (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 c6db9af7d662f1f6f50ec7da423000a11c1ad145 Author: Marko Obrovac <mar...@in...> Date: Tue Jan 12 16:15:05 2010 +0000 Bug fix: * fixed the rpc problem - turned out the definition of import/export functions in struct iolinker_struct had been changed, which caused a wrong pointer assignment. diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 27874db..ed65b57 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -632,7 +632,9 @@ int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) * @param objid Object id of the object */ int kdfs_iol_page_export (struct rpc_desc *desc, - kddm_obj_t *objEntry) + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { struct kdfs_page *k_page = (struct kdfs_page *)objEntry->object; int res = 0; @@ -691,7 +693,10 @@ int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t obji * @param object The object to import data in. * @param desc Network descriptor exploited by rpc_pack() */ -int kdfs_iol_page_import(kddm_obj_t *objEntry, struct rpc_desc *desc) +int kdfs_iol_page_import(struct rpc_desc *desc, + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { int res = 0; struct kdfs_page *kdfs_page = (struct kdfs_page*) objEntry->object; diff --git a/fs/kdfs/address_space.h b/fs/kdfs/address_space.h index 5a7ac7a..491695c 100644 --- a/fs/kdfs/address_space.h +++ b/fs/kdfs/address_space.h @@ -112,9 +112,9 @@ void kdfs_mark_page_dirty(kddm_set_id_t set_id, objid_t obj_id); int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid, int flags); int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); -int kdfs_iol_page_export (struct rpc_desc *desc, kddm_obj_t *objEntry); +int kdfs_iol_page_export (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *obj_entry, objid_t objid); int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); -int kdfs_iol_page_import (kddm_obj_t *objEntry, struct rpc_desc *desc); +int kdfs_iol_page_import (struct rpc_desc *desc, struct kddm_set *set, struct kddm_obj *objEntry, objid_t objid); int kdfs_iol_page_sync(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_put(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid); int kdfs_iol_page_remove(void *object, struct kddm_set *set, objid_t objid); diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 4cce701..bce1195 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -1181,7 +1181,9 @@ int kdfs_iol_inode_first_touch(kddm_obj_t *objEntry, * */ int kdfs_iol_inode_export_object(struct rpc_desc *desc, - kddm_obj_t *objEntry) + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { struct kdfs_inode *src = (struct kdfs_inode *) objEntry->object; struct kdfs_netinode net_dest; @@ -1203,7 +1205,10 @@ int kdfs_iol_inode_export_object(struct rpc_desc *desc, * @param object The object to import data in. * @param desc Network descriptor exploited by rpc_pack() */ -int kdfs_iol_inode_import_object(kddm_obj_t *objEntry, struct rpc_desc *desc) +int kdfs_iol_inode_import_object(struct rpc_desc *desc, + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { int res = 0; struct kdfs_inode *inode_dst = (struct kdfs_inode*) objEntry->object; diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 747bb7e..ceba02e 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -1888,7 +1888,9 @@ static inline void __kdfs_import_kdfs_cwsb(struct kdfs_cw_sb *dest, struct kdfs_ * @param objid Identifier of the object in the kDDM set */ int kdfs_iol_sb_export(struct rpc_desc *desc, - kddm_obj_t *objEntry) + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { struct kdfs_cw_sb *k_cw_sb = NULL; struct kdfs_super_block *k_sb = NULL; @@ -1943,8 +1945,10 @@ int kdfs_iol_sb_export(struct rpc_desc *desc, * @param object The object to import data in. * @param desc Network descriptor exploited by rpc_pack() */ -int kdfs_iol_sb_import (kddm_obj_t *objEntry, - struct rpc_desc *desc) +int kdfs_iol_sb_import (struct rpc_desc *desc, + struct kddm_set *set, + struct kddm_obj *objEntry, + objid_t objid) { int res = 0; struct kdfs_generic_sb *kgsb = objEntry->object; ----------------------------------------------------------------------- Summary of changes: fs/kdfs/address_space.c | 9 +++++++-- fs/kdfs/address_space.h | 4 ++-- fs/kdfs/inode.c | 9 +++++++-- fs/kdfs/super.c | 10 +++++++--- 4 files changed, 23 insertions(+), 9 deletions(-) hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-01-11 16:05:05
|
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 aac7aa4efd9eccdfbeaa04c04db7928e8b439110 (commit) from 159422433e1cbebdd6b3df6edc5e63a77eb17941 (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 aac7aa4efd9eccdfbeaa04c04db7928e8b439110 Author: Marko Obrovac <mar...@in...> Date: Mon Jan 11 16:04:24 2010 +0000 Forgot to remove a conflict line marker diff --git a/fs/kdfs/debug_kdfs.h b/fs/kdfs/debug_kdfs.h index bfc8446..3636fc6 100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@ -44,7 +44,6 @@ do { \ /*pr_debug*/printk("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ current->pid) ; \ /*pr_debug*/printk(format, ## args) ; \ ->>>>>>> e9b2900ac5dcea18ed708cf4688628437606aacd } \ if(level == DBG_PANIC)\ BUG();\ ----------------------------------------------------------------------- Summary of changes: fs/kdfs/debug_kdfs.h | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2010-01-11 15:48:10
|
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 159422433e1cbebdd6b3df6edc5e63a77eb17941 (commit) via a5960d10bd3d0e0b3f67f01a9d2bff5c4d9a76db (commit) via 6d804a59635d22cd8ccecc171681223bae641978 (commit) via 727feafdfdb67c56faf8936a555306ac12ba83bd (commit) via d922ea7c84da39b7ec2ae3d5b05f4e422f6c7495 (commit) via 42cfa16f195acdd55c4c99ab0ac577eabbf80823 (commit) via 9fee3b665950ede2d8d578add26530e5bb5a8249 (commit) via 5144e43b2e59b913bfe8012cf26dc612a6829091 (commit) via 59d4826cea6aa3f17f387cea83a045f4aaea1fd5 (commit) via 2e86087f0a4bd2f6e419803905f8cedb6311e81a (commit) via c61ed4f2effa24ddc2729d4a9a7b9b812ca73f8a (commit) via a87005035a822077ade4b96f7ae9afe09b6f2001 (commit) via 0ed4e289e003fb2353b318d21cf17060074e6f69 (commit) via 942cf87a46b58f3e096826d13ee7ad0ec64db17d (commit) via 9dedc3c491c2774afbed77d87864433a016080bb (commit) via 250cc5ac019298154f5712d8c227d7fc3aac99ba (commit) via 87111978622231b06aa57a74ad350c7cac7d9ac3 (commit) via e90089683d8d32255ee55e2d836225d72efe85f5 (commit) via baece1e8a982a096ab76e50547a104c4cfa98a72 (commit) via efa1df423b0d7917b4623e307b7d458dd1cd6a16 (commit) via 37068a1d0d9ae607cd5d197005a921c7ca8074d8 (commit) via eefb55fb51de2797a7901cd9827dedf8b9015d92 (commit) via 9e58211763497549cd2491d01bf3ae226bd48b19 (commit) via 5f7461ada88e462353da2d6d9a0b004b9fc4c1d1 (commit) via 37cccc92fa18c524639fecdacb7ebcd3ef4e65f4 (commit) via ba24f66901b5eb467f4fbfe1792f5a1665170bd4 (commit) via f329899adb892b045d703c40674913934b3b5f27 (commit) via 1bc38883c96886d363d1eedc872cd13f16cbaace (commit) via 6cbbb0ba9659c196903c16639aebd701adfbd9bf (commit) via b4b470948c5660cdf97fdc30085aa513c52ab621 (commit) via 39e80a793bb13a4da7d1c866e8c519a3dad3d167 (commit) via 9504d5ab452f80a69678619200b30fcb9c227ae3 (commit) via ceb929fe04b3a196bfb95616d4ad284baca59dde (commit) via cf03337d62107dc50ba0fee8cd3d1cb319b98a78 (commit) via 3dbf029c045785470ed2fc985ba563851725c6ec (commit) via bb7c19326702855ed79b16a6b3a13b3b2f2e2408 (commit) via 98ac1bcff92f547076665f707c31110cad6dadd3 (commit) via 7ca01d4cf4bc2c02bc6b6c762d9af56beb4c057d (commit) via 67bd421cadb556dcb80d09887ce9b6bd96f53997 (commit) via f2a919ceb695197498716cd7b9d29a1830dd8376 (commit) via 0a2de04bffac70353111356adb711a884bc5ecc4 (commit) via 82b023c1c4b768fdb0ce4e4641f8ee6034f53186 (commit) via 915b839a817d3749249ae9b49cf942a0e9cc6ac5 (commit) via 40e4e2dd556986c690b4425f12f4109655d9a501 (commit) via f131c539d3b9d262c1efd289aaab858545f53d32 (commit) via 5639be07865fd6c237874eef1550a1022f7fcf98 (commit) via aab7523efaf345acca2bb9ac68038d7e6eee4afe (commit) via bd0df69f9d0cd0b5708b0f133388bec4352d7e78 (commit) via ed553ed1642fca061c8faf52fbb7fbd0304587e1 (commit) via dfba7dd31a1d2936f3d31f9f6aa5a65a71e33cff (commit) via 6c9518db317a864602b29f422abbe796882de67b (commit) via 45e4c4413b119a3562580e5ac07acc7737315861 (commit) via 8f9cd865a569ec46d4c7b17bd9b59990e226337e (commit) via 9738e237e48df9380bb17ef5c6e040a6b6411bf2 (commit) via 4779fdd41e7bfde2bcf83a773df9b2435a95f43e (commit) via abf7345618946001d1387a72eb7b4a36ecd8e4e9 (commit) via 1e332338e807c6029efaa36f0c3f278e21b0d703 (commit) via 06ac5a2e0b4af128fe0f4813db265137e54f8d7a (commit) via 2f1ae9d763e324e7930b42fc323d36f6bc7489b3 (commit) via 370d01df6b87de28a27f0606fecad7a78bb17bbe (commit) via b626262af785cd78a5588cc9b63dc5cb00f2d28d (commit) via b108c31ff3d1c6864f68ef5279bd1a7ef2330ca8 (commit) via 0db65b9d5048affd827554ef0e7db2832af09090 (commit) via 63df3666207494718affeec7771bb627757f5cd1 (commit) via 9ac3afb145d2945df1003c9a7635bd87c20d20ed (commit) via 2acaee07836e7af9206a1776642f3b2160954b7a (commit) via 2f3101b827869104b0ab205138339c024e692ce6 (commit) via d5f4de9f6bccdbb23e2bcf2194d3bc32f9ac2a5e (commit) via 0dbbea8e5bb3bc8dd01d57ed015b3aa7fa6c9c3e (commit) via b73cea92154b23e44a9abea5f3ef5402abb931ee (commit) via 3aaf3034811c9912d2a494f26690c1240e6cdb4d (commit) via 42dc5601a2abbce78a6ad86649618a5fbbe34311 (commit) via eb638b4067d284578e3a3a03d3e0c9f2651a7d50 (commit) via 023396fb1effbba56068516a5a7d588e75e8e0d3 (commit) via 2ccfae7f9c42402047c7f424aeb93e22e8f31a62 (commit) via 6dd4ba6adaf244569f2c5c2b09343e8117f0cd76 (commit) via a5c9c1d1d706f6b36bdc0c4e5feae3cc8a7061bb (commit) via a27ff405db154e79db8e11297d5b066ec157f645 (commit) via e29bbca4dc3a29d04db063845df2342a1688ba28 (commit) via 7a8f3ef7b1f9842f6938a8ae235008a2859774a9 (commit) via 198c361c608a5c91ed99608fc3d770d4db0fe23d (commit) via 702b2a4e05236707bf00ced40d6223d4352f9bcb (commit) via c1aab557a7d2c321966e304a71f186fd7a755a8c (commit) via 9e44327b50b9419eba2bf05ff493fee084264440 (commit) via d63336d6d4ca02651034fa8a21cd9079762b0ded (commit) via d4a28a30cb46d5bd751bd9158a169dda9be03e92 (commit) via 044c8680cf7fa945b45d8191b63b1e17b53ff031 (commit) via 9e96b948a2a9a920be352ef6aba8390be302d14a (commit) via 16c9cb24b6089e99aa9ddbb70976fbdcc0742f74 (commit) via a179d799af7fdeda72121f7a1e65c22e9644859b (commit) via 5b6df576f5ae9f139e966cf61dd6a7467549b858 (commit) via 09e966b166aa6dfc76e9126ed7325177c9a32a6c (commit) via 70dcedd0b1b0deeeb9f17b74f6c82b943f13c33a (commit) via 6b7bbe01c3350e5dcabcee6f74e687e27cbe1c46 (commit) via f56392cfe4a8ccee7a151b40e149d6d67ba1110e (commit) via 2ba013bea1e10cb256a7cfe5a9cc2df8b90dcb17 (commit) via b4693639bc21d24b7351f426efcbb632d2e0d30d (commit) via b5239bf421973f62e18ce86ccf3ce70bc42f4274 (commit) via 045d080860edbab50ddc7847f696c55752fa866a (commit) via 15734ef1e1a7095ca10d64c40706f424661a7de0 (commit) via c15bf128d1ec4003c4ed610c5d687e5082bfcd01 (commit) via 5ea24637c229a94d5205ce6a9311f6d0b200999e (commit) via a5ff64bb765a024f14a075aa2b09ef9112f6b708 (commit) via 82e12755db2fe9b3b224df7b73e1aa2c6148af33 (commit) via 3ebcb76a2bdc73805959272a7f656890b7787b25 (commit) via b5be9b5aa21163b6f6c152ded431016f484eef69 (commit) via 7508c996d225b04183ca244fba3bdc8f43e7e19d (commit) via 09d750e1a6594fd8b15e37fe21273974631e6a63 (commit) via 3d259dbaa28735714e937479a81024a6b243ca44 (commit) via e54d0456066c3858c7e0186e696700cf64caebc0 (commit) via cec7be6ff86873ed6f7f06f7ad3cb8e13e0df4c7 (commit) via 19b005b5f89656739ae21d504389d0a11a9e6c76 (commit) via 33765dc75ea949f110da9354f7c64ab559a40840 (commit) via f6ede09de097d4e5653a90d231d3f2388a8f636f (commit) via 4e498cbe1327cba9f2dc15f4ee8daed98742ccea (commit) via 486f9e4cc88df7fb427a9605846e61238f6f037e (commit) via cd976597cd2e5778505b6f839eb274510e0c0f3e (commit) via 2aa2210b086ab0cf87d078f5a61b47d22ea8a18e (commit) via b3a5776b63ec50a7596c50b56580c74394388452 (commit) via fc6ea12288e121066006c9640cf4e474e8e99116 (commit) via 0b9683e293c0c28fb43e671344ef38b755c68a92 (commit) via d2ff0447ff7fe1262385de58fe62f8cba0253b25 (commit) via f5de4c7d2880b0e90baf9c70f3f65c05e4e4b59d (commit) via 5b645a5e874b24dc8d409d818290badf998e6c8c (commit) via a84a0ea3ab7264866ee62c6eadac0939044f7c43 (commit) from e9b2900ac5dcea18ed708cf4688628437606aacd (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 159422433e1cbebdd6b3df6edc5e63a77eb17941 Merge: a5960d1 e9b2900 Author: Marko Obrovac <mar...@in...> Date: Mon Jan 11 15:44:43 2010 +0000 Resolve some merge conflicts with remote/make_kdfs_compile diff --cc fs/kdfs/debug_kdfs.h index f50a0b2,55b1623..bfc8446 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@@ -41,9 -41,9 +41,10 @@@ # define DEBUG(level, format, args...) \ do { \ if (KDFS_DEBUG_LEVEL >= level || level == DBG_PANIC) { \ - printk("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ + /*pr_debug*/printk("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ current->pid) ; \ - printk(format, ## args) ; \ + /*pr_debug*/printk(format, ## args) ; \ ++>>>>>>> e9b2900ac5dcea18ed708cf4688628437606aacd } \ if(level == DBG_PANIC)\ BUG();\ commit a5960d10bd3d0e0b3f67f01a9d2bff5c4d9a76db Merge: ae83ede 6d804a5 Author: Marko Obrovac <mar...@in...> Date: Mon Jan 11 15:05:48 2010 +0000 Merge branch 'master' of git://mirrors.git.kernel.org/cluster/kerrighed/kernel into make_kdfs_compile Conflicts: include/kddm/io_linker.h include/kddm/kddm_set.h All conficts have been resolved. diff --cc fs/kdfs/address_space.c index 5b60704,0000000..27874db mode 100644,000000..100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@@ -1,926 -1,0 +1,928 @@@ +/* + * KDDM File System - address space management + * + * @file address_space.h + * + * @author Adrien Lebre (2007-xxxx) + * @comment Based on the Renaud Lottiaux's kerfs proposal (2002-2005) + * + * @maintainer Adrien Lebre + * + * Copyright (C) 2006-2007, XtreemOS Consortium. + */ + +#include <linux/pagemap.h> + ++#include <net/krgrpc/rpcid.h> ++#include <net/krgrpc/rpc.h> +#include <kddm/kddm.h> + +#include "super.h" +#include "inode.h" +#include "address_space.h" +#include "physical_fs.h" + +#include "debug_kdfs.h" +#define KDFS_PART "KDFS - Address Space Management" + +int kdfs_content_readphyspage(struct content_iolinker_data *content_data, + char *page_addr, loff_t pos); +int kdfs_content_writephyspage(struct content_iolinker_data *content_data, + char *page_addr, loff_t from, loff_t to); +int kdfs_content_readphyspage_cow(struct content_iolinker_data *content_data, + char *page_addr, loff_t pos); +int kdfs_content_writephyspage_cow(struct content_iolinker_data *content_data, + char *page_addr, loff_t from, loff_t to); + +/*****************************************************************************/ +/* */ +/* INTERNAL ADDRESS SPACE OPERATIONS */ +/* */ +/*****************************************************************************/ + +int kdfs_content_writephyspage(struct content_iolinker_data *content_data, + char *page_addr, loff_t from, loff_t to) +{ + unsigned int objid = from / PAGE_CACHE_SIZE; + char *pos_addr = NULL; + loff_t file_pos; + size_t len; + + file_pos = from; + pos_addr = page_addr + (from - ((loff_t)objid * PAGE_CACHE_SIZE)); + len = to - from; + + kdfs_phys_write(content_data->phys_file, pos_addr, len, &file_pos); + + PRINT_FUNCTION_EXIT; + return 0; +} + + +/*****************************************************************************/ +/* */ +/* ADDRESS SPACE OPERATIONS */ +/* */ +/*****************************************************************************/ + + +/* + * Called by low VFS layer + * The page is locked. + */ +int kdfs_readpage(struct file *file, struct page *page) +{ + struct kdfs_page *k_page = NULL; + struct kdfs_inode *k_inode = NULL; + + + ASSERT(page != NULL); + k_inode=kdfs_ilocalfind(page->mapping->host->i_ino); + if (k_inode->content_setid == KDDM_SET_UNUSED) + DEBUG (DBG_PANIC, "No contentset associated.... looks really strange (inode %lu, name %s)\n", + k_inode->inode->i_ino, list_entry(k_inode->inode->i_dentry.next, struct dentry, d_alias)->d_name.name); + + /* TODO PRIORITY 2: test kdfs_get_page returned value */ + k_page = kdfs_get_page(k_inode->content_setid, page->index); + + DEBUG(DBG_INFO, " Readpage k_page->page : %p and page %p\n", k_page->page, page); + BUG_ON(k_page->page != page); + + SetPageUptodate(k_page->page); + unlock_page(k_page->page); + + _kdfs_put_page(k_page); + kdfs_iput(k_inode->inode->i_ino); + + PRINT_FUNCTION_EXIT; + return 0; +} + +/* TODO Suggested by Adrien for xxxx + * Priority : 3 + * Merge new kdfs_write_begin function with the older kdfs_prepare_write. + */ +/* + * page has been found or allocated from/in the page cache and locked + * However, the data should be pre-read from the storage + * Thus, one first-touch can happen. ISSUE, put data in the same page + */ +int __kdfs_prepare_write (struct file *file, struct page *page, + unsigned offset, unsigned _to) +{ + struct kdfs_page *k_page = NULL; + struct kdfs_inode *k_inode = NULL; + + DEBUG (DBG_INFO, "begin_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", + file->f_dentry->d_name.name, file->f_dentry->d_inode->i_ino, page->index, offset, _to, page_count(page), page->mapping); + + BUG_ON (page->mapping == NULL); + BUG_ON (!PageLocked(page)); + + k_inode=kdfs_ilocalfind(file->f_dentry->d_inode->i_ino); + if(k_inode->content_setid == KDDM_SET_UNUSED){ + DEBUG (DBG_PANIC, "No contentset associated.... looks really strange \n"); + } + + /* TODO PRIORITY 2: test kdfs_get_page returned value */ + k_page = kdfs_grab_page(k_inode->content_setid, page->index); + BUG_ON(k_page->page != page) ; + k_page->offset = offset; + k_page->to = _to; + + SetPageUptodate (k_page->page); + + kdfs_iput(k_inode->inode->i_ino); + PRINT_FUNCTION_EXIT; + return 0; +} + +int kdfs_write_begin (struct file *file, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, + struct page **pagep, void **fsdata) +{ + struct page *page; + pgoff_t index; + unsigned from; + + index = pos >> PAGE_CACHE_SHIFT; + from = pos & (PAGE_CACHE_SIZE - 1); + + page = grab_cache_page_write_begin(mapping, index, flags); + if (!page) + return -ENOMEM; + + *pagep = page; + return __kdfs_prepare_write(file, page, from, from+len); +} + + +/* TODO Suggested by Adrien for xxxx + * Priority : 3 + * Merge new kdfs_write_begin function with the older kdfs_prepare_write. + */ +/* TODO Suggested by Adrien for Adrien, + * an old TODO, ... probably just remove it ;) + * cf. http://www.mail-archive.com/git...@vg.../msg03083.html + */ +int __kdfs_commit_write(struct file *file, + struct page *page, + unsigned offset, + unsigned _to) +{ + struct kdfs_inode *k_inode = NULL; + + DEBUG(DBG_INFO, "commit_write for page %ld for file %s" + "(ino %lu) (from %u to %u) (count = %d)\n", + page->index, file->f_dentry->d_name.name, + file->f_dentry->d_inode->i_ino, offset, _to, + page_count(page)); + + k_inode = kdfs_ilocalfind(file->f_dentry->d_inode->i_ino); + if (k_inode->content_setid == KDDM_SET_UNUSED) + DEBUG(DBG_PANIC, "No contentset associated.... looks really strange \n"); + + if (((loff_t)page->index * PAGE_SIZE) + _to > k_inode->inode->i_size) + i_size_write(k_inode->inode, ((loff_t)page->index * PAGE_SIZE) + _to); + + /* + * From the local node point of view, we have to set DIRTY flag to the page: + * set_page_dirty(page); + * However, due to the write behind issue at such a distributed level, we have + * chosen to directly call the kDDM sync functions (write through) + */ + kdfs_mark_page_dirty(k_inode->content_setid, page->index); + __kdfs_put_page(k_inode->content_setid, page->index); + + kdfs_mark_inode_dirty(k_inode); + kdfs_iput(k_inode->inode->i_ino); + + PRINT_FUNCTION_EXIT; + return 0; +} + +int kdfs_write_end(struct file *file, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata) +{ + unsigned from = pos & (PAGE_CACHE_SIZE - 1); + + /* zero the stale part of the page if we did a short copy */ + if (copied < len) { + void *kaddr = kmap_atomic(page, KM_USER0); + memset(kaddr + from + copied, 0, len - copied); + flush_dcache_page(page); + kunmap_atomic(kaddr, KM_USER0); + } + + __kdfs_commit_write(file, page, from, from+copied); + + unlock_page(page); + page_cache_release(page); + + return copied; +} + + +int kdfs_writepage(struct page *page, struct writeback_control *wbc) +{ + + PRINT_FUNCTION_NAME; + /* TODO */ + BUG(); + PRINT_FUNCTION_EXIT; + return 0; +} + +/* + * Called by the VFS during a truncate operation. That is, when + * parts of the page are now deprecated. + */ +void kdfs_invalidatepage(struct page *page, unsigned long offset) +{ + struct kdfs_page *k_page; + + PRINT_FUNCTION_NAME; + ASSERT(page->mapping != NULL); + + k_page = (struct kdfs_page *) page->private; + if (offset == 0) { + /* The whole page is invalidated so it should be removed */ + kddm_remove_object(kddm_def_ns, k_page->set_id, k_page->obj_id); + ClearPagePrivate(page); + } + else { + /* Not sure about this */ + kdfs_grab_page(k_page->set_id, k_page->obj_id); + kddm_sync_frozen_object(kddm_def_ns, k_page->set_id, k_page->obj_id); + __kdfs_put_page(k_page->set_id, k_page->obj_id); + } + PRINT_FUNCTION_EXIT; +} + +/* + * Called when a page is released from the local page cache + * WARNING: Must return 1 for success, 0 otherwise! + */ +int kdfs_releasepage(struct page *page, gfp_t mask) +{ + struct kdfs_page *k_page; + kddm_obj_t *obj_entry; + kddm_set_t *associated_set; + + ASSERT (page->mapping != NULL); + PRINT_FUNCTION_NAME; + + k_page = (struct kdfs_page *) page->private; + associated_set = _find_get_kddm_set(kddm_def_ns, k_page->set_id); + obj_entry = __get_kddm_obj_entry(associated_set, k_page->obj_id); + if (OBJ_EXCLUSIVE2(COPYSET(obj_entry))) { + put_kddm_obj_entry(associated_set, obj_entry, k_page->obj_id); + put_kddm_set(associated_set); + kdfs_grab_page(k_page->set_id, k_page->obj_id); + kddm_remove_frozen_object(kddm_def_ns, k_page->set_id, k_page->obj_id); + } + else { + put_kddm_obj_entry(associated_set, obj_entry, k_page->obj_id); + put_kddm_set(associated_set); + kddm_flush_object(kddm_def_ns, k_page->set_id, k_page->obj_id, KERRIGHED_NODE_ID_NONE); + } + + ClearPagePrivate(page); + PRINT_FUNCTION_EXIT; + return 1; +} + +struct address_space_operations kdfs_aops = { + .write_begin = kdfs_write_begin, + .write_end = kdfs_write_end, + .invalidatepage = kdfs_invalidatepage, + .readpage = kdfs_readpage, + .releasepage = kdfs_releasepage, + .writepage = kdfs_writepage, +}; + + +/*****************************************************************************/ +/* */ +/* ADDRESS SPACE LINKER PART */ +/* */ +/*****************************************************************************/ + +struct kdfs_page *kdfs_get_page(kddm_set_id_t set_id, objid_t obj_id) +{ + DEBUG(DBG_INFO, "Get page %ld from set %ld\n", obj_id, set_id); + return kddm_get_object(kddm_def_ns, set_id, obj_id); +} + +struct kdfs_page *kdfs_grab_page(kddm_set_id_t set_id, objid_t obj_id) +{ + DEBUG(DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); + return kddm_grab_object(kddm_def_ns, set_id, obj_id); +} + +struct kdfs_page *kdfs_findlocal_page(kddm_set_id_t set_id, objid_t obj_id) +{ + DEBUG(DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); + return kddm_find_object(kddm_def_ns, set_id, obj_id); +} + +void __kdfs_put_page(kddm_set_id_t set_id, objid_t obj_id) +{ + kddm_put_object(kddm_def_ns, set_id, obj_id); +} + +void _kdfs_put_page(struct kdfs_page *k_page) +{ + DEBUG(DBG_INFO, "Put page %ld from set %ld\n", k_page->obj_id, k_page->set_id); + kddm_put_object(kddm_def_ns, k_page->set_id, k_page->obj_id); +} + +void kdfs_mark_page_dirty(kddm_set_id_t set_id, objid_t obj_id) +{ + DEBUG(DBG_INFO, "Sync page %ld from set %lu\n", obj_id, set_id); + kddm_sync_frozen_object(kddm_def_ns, set_id, obj_id); +} + +/* + * Create content kddm_set (internal function) + * @author Adrien Lebre + * + * @param set_id Id associated to the new set + * @param def_owner Kerrighed node id where meta-file is stored + * @param inode Inode associated with this new 'content' set + * @param type FILE_LINKER or DIR_LINKER + * @return a new container built from the inode + * + * Note: Actually, the new container is directly linked to a specific + * node However, we will maybe change to KDDM_SET_CUSTOM_LINKED flag + * since we will have to support replicas mechanisms even for + * meta-data informations. + */ + +kddm_set_t *__create_content_kddm_set(kddm_set_id_t set_id, + kerrighed_node_t def_owner, + struct kdfs_inode *k_inode, + iolinker_id_t type) +{ + struct content_iolinker_data *content_data; + kddm_set_t *kddm_set = NULL; + + PRINT_FUNCTION_NAME; + + /* Allocate space for the file_data structure */ + content_data = kmalloc(sizeof(struct content_iolinker_data), GFP_KERNEL); + ASSERT(content_data != NULL); + + /* Enpack the content IO linker data */ + content_data->ino = k_inode->inode->i_ino; /* Valid clusterwide */ + + kddm_set = _create_new_kddm_set(kddm_def_ns, set_id, type, + def_owner, sizeof(struct kdfs_page), + content_data, sizeof(struct content_iolinker_data), KDDM_FT_LINKED); + + if (IS_ERR(kddm_set)) + DEBUG(DBG_PANIC, "Can't create content kddm_set for inode %ld\n", k_inode->inode->i_ino); + + /* We can free all the memory allocated */ + kfree(content_data); + + PRINT_FUNCTION_EXIT; + return kddm_set; +} + +int __kddm_set_local_destroy(int nsid, int setid) +{ + struct kddm_ns *ns; + struct kddm_set *kddm_set; + + /* Remove the kddm set from the name space */ + ns = kddm_ns_get (nsid); + if (ns == NULL) + return -EINVAL; + + kddm_set = hashtable_remove(ns->kddm_set_table, setid); + kddm_ns_put (ns); + + if (kddm_set == NULL) + return -EINVAL; + + put_kddm_set(kddm_set); + return 0; +} + +/* + * Destroy the local instance of a content kddm_set (internal function) + * @author Adrien Lebre + * + * @param k_inode Inode associated with this 'content' set + * @return O if everything was ok + */ +int __local_destroy_content_kddm_set(struct kdfs_inode *k_inode) +{ + kddm_set_t *kddm_set = NULL; + + PRINT_FUNCTION_NAME; + + kddm_set = _local_get_kddm_set(kddm_def_ns, k_inode->content_setid); + if (!kddm_set) + DEBUG(DBG_INFO, "The associated kddm_set for inode %ld hasn't been instantiated\n", k_inode->inode->i_ino); + else{ + /* + * TODO PRIORITY 1, Adrien / (Renaud kDDM stuff) + * According to the function __handle_req_kddm_set_destroy + * http://lxr.kerlabs.com/kerrighed/source/modules/ctnr/kddm_set.c#650 + * I have to first remove the set from the local namespace and then + * free the kddm_set struct. + * Currently, I implemented the following function + * which is approximately a copy/paste of the __handle_req_kddm_set_destroy + * function. + */ + __kddm_set_local_destroy(KDDM_DEF_NS_ID, k_inode->content_setid); + + /* + * Free the kddm set structure (second call, count will reach 0 + * and the set structure will be freed) + */ + put_kddm_set(kddm_set); + } + PRINT_FUNCTION_EXIT; + return 0; +} + +/*****************************************************************************/ +/* */ +/* ADDRESS IO LINKER PART */ +/* (exploited for dir and file io-linkers) */ +/* */ +/*****************************************************************************/ + +/* + * 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. + */ +int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) +{ + struct kdfs_page *k_page = NULL; + struct address_space *k_mapping = NULL; + PRINT_FUNCTION_NAME; + + ASSERT(set->private_data != NULL); + k_mapping = ((struct content_iolinker_data *) set->private_data)->k_mapping; + ASSERT(k_mapping != NULL); + + 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); + if (!k_page->page) { + DEBUG(DBG_ALERT, + "Can't find page for file/directory = %ld and page id = %ld, So created and locked\n", + k_mapping->host->i_ino, objid); + k_page->page = find_or_create_page(k_mapping, objid, mapping_gfp_mask(k_mapping) & ~__GFP_FS); + k_page->flags = K_PG_locked; + } else + k_page->flags = K_PG_ok; + + DEBUG(DBG_INFO, "After Alloc new page %ld from set %lu (page addr=%p count=%d)\n", objid, set->id, k_page->page, page_count(k_page->page)); + + 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; + + objEntry->object = k_page; + PRINT_FUNCTION_EXIT; + return 0; +} + +/* + * 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) + * + * @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) +{ + + struct address_space *k_mapping; + struct content_iolinker_data *iolinker_data; + struct kdfs_page *k_page = NULL; + char *page_addr = NULL; + loff_t pos; + int res = 0; + + iolinker_data = (struct content_iolinker_data *) set->private_data; + + DEBUG(DBG_TRACE, "file/directory = %ld, pageid = %ld gonna to retrieve inode \n", iolinker_data->ino, objid); + + /* WARNING: quite ugly, we should not access to a local inode without locking the corresponding kddm object*/ + 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, objid, k_mapping); + + /* Allocate kdfs_page and retrieve page address */ + k_page = kmalloc(sizeof(struct kdfs_page), GFP_KERNEL); + + ASSERT(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); + + k_page->page = find_get_page(k_mapping, 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", iolinker_data->ino, objid); + k_page->page = find_or_create_page(k_mapping, objid, (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)); + + page_addr = (char *) kmap(k_page->page); + pos = (loff_t)objid * 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, 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)); + + PRINT_FUNCTION_EXIT; + return res; +} + +/* + * 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. + */ +int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) +{ + 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)); + + /* + * Set the private field of the page to get callback when it is + * released from local cache. + */ + SetPagePrivate(k_page->page); + set_page_private(k_page->page, (unsigned long) k_page); + + /* + * if the page has been created by kDFS, we should unlock the page + * cf. find_or_create() in alloc and first touch + */ + if(k_page->flags == K_PG_locked) { + unlock_page(k_page->page); + k_page->flags=K_PG_ok; + } + page_cache_release(k_page->page); + + DEBUG(DBG_ALERT, "Exiting page count=%d\n", page_count(k_page->page)); + PRINT_FUNCTION_EXIT; + return 0; +} + +/* + * 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 + */ +int kdfs_iol_page_export (struct rpc_desc *desc, + kddm_obj_t *objEntry) +{ + 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); + + res = rpc_pack(desc, 0, page_addr, PAGE_SIZE); + if (res < 0) + DEBUG(DBG_ALERT, "can't pack export page (res=%d)\n", res); + + kunmap_atomic(page_addr, KM_USER0); + + /* + * 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 (k_page->flags == K_PG_locked) { + unlock_page(k_page->page); + k_page->flags = K_PG_ok; + } + + // 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) +{ + struct kdfs_page *k_page = (struct kdfs_page *)objEntry->object; + PRINT_FUNCTION_NAME; + + trylock_page(k_page->page); + 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); + 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; +} + +/* + * Import an object + * @author Adrien Lebre + * + * @param object The object to import data in. + * @param desc Network descriptor exploited by rpc_pack() + */ +int kdfs_iol_page_import(kddm_obj_t *objEntry, struct rpc_desc *desc) +{ + int res = 0; + struct kdfs_page *kdfs_page = (struct kdfs_page*) objEntry->object; + char *page_addr = NULL ; + + PRINT_FUNCTION_NAME; + page_addr = (char *) kmap(kdfs_page->page); + + res = rpc_unpack(desc, 0, page_addr, PAGE_SIZE); + + kunmap(kdfs_page->page); + + PRINT_FUNCTION_EXIT; + return res; +} + +/* + * Sync a page on the right node + * @author Adrien Lebre + * + * @param objEntry Descriptor of the page to sync. + * @param set kddm descriptor + * @param objid page id. + * WARNING: Corresponding kdfs_inode should be grabbed ! + */ +int kdfs_iol_page_sync(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) +{ + struct kdfs_page *k_page = NULL; + char *page_addr = NULL; + char *pos_addr = NULL; + loff_t file_pos; + size_t len; + struct content_iolinker_data *iolinker_data = (struct content_iolinker_data*) set->private_data; + + ASSERT(objEntry != NULL); + k_page = objEntry->object; + ASSERT(k_page != NULL); + ASSERT(k_page->page != NULL); + + 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)objid * PAGE_SIZE) + k_page->offset; + page_addr = (char *) kmap(k_page->page); + + pos_addr = page_addr + k_page->offset; + len = k_page->to - k_page->offset; + + iolinker_data->content_writephyspage(iolinker_data, page_addr, file_pos, file_pos + len); + + kunmap(k_page->page); + + PRINT_FUNCTION_EXIT; + return 0; +} + +/* + * Callback for kddm_put_object to unlock a page when we are the locker + * @author Pierre Riteau + * + * @param objEntry page to unlock + * @param set set containing the page + * @param objid object identifier of the page + */ +int kdfs_iol_page_put(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) +{ + struct kdfs_page* k_page; + + PRINT_FUNCTION_NAME; + ASSERT(objEntry != NULL); + k_page = (struct kdfs_page *)objEntry->object; + + DEBUG(DBG_ALERT, "Page count = %d\n", page_count(k_page->page)); + + //page_cache_release(k_page->page); + + PRINT_FUNCTION_EXIT; + return 0; +} + +/* + * I/O linker function called when a page is removed + * @author Pierre Riteau + * + * @param objEntry page to remove + * @param set set containing the page + * @param objid object identifier of the page + */ +int kdfs_iol_page_remove(void *object, struct kddm_set *set, objid_t objid) +{ + struct kdfs_page *k_page = (struct kdfs_page *) object; + PRINT_FUNCTION_NAME; + + if ((!PageLocked(k_page->page))) { + /* + * This is not the kernel trying to remove the page but the KDDMs, + * so we need to remove the page from the cache by hand, because + * we are not called by the VFS + */ + trylock_page(k_page->page); + 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); + DEBUG(DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); + } + + PRINT_FUNCTION_EXIT; + return 0; +} + +/* + * Instantiate a container with a content linker. + * @author Adrien Lebre + * + * @param kddm_set kddm to instantiate + * @param private_data content_iolinker_data to access to physical file. + * + * @return error code or 0 if everything was ok. + */ +int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) +{ + struct content_iolinker_data *content_data = NULL; + struct inode *inode = NULL; + int result = 0; + char *phys_dirname; + struct file *filp; + + /* TODO NOW: Adrien */ + /* Ugly, we decided to forbid calling kddm grab/get functions + * at such level in order to avoid deadlock + */ + struct kdfs_super_block *k_sb = kdfs_getsb(kerrighed_node_id); + PRINT_FUNCTION_NAME; + ASSERT(k_sb != NULL); + + ASSERT(kddm_set != NULL); + ASSERT(kddm_set->private_data != NULL); + + content_data = (struct content_iolinker_data *) kddm_set->private_data; + DEBUG(DBG_INFO, "Instantiate kddm %ld with ino : %ld\n", kddm_set->id, content_data->ino); + + if (kddm_set->def_owner == kerrighed_node_id) { + content_data->phys_dirname = kmalloc(PATH_MAX, GFP_KERNEL); + ASSERT(content_data->phys_dirname != NULL); + + /* Retrieve local path corresponding to kfds inode number*/ + kdfs_getphysicalpath(k_sb, content_data->ino, content_data->phys_dirname); + + /* Try to open the physical associated file */ + phys_dirname = content_data->phys_dirname + strlen(content_data->phys_dirname); + snprintf(content_data->phys_dirname, PATH_MAX, "%s/.meta.index", content_data->phys_dirname); + filp = open_phys_file(content_data->phys_dirname, O_RDONLY, 0644, 0, 0); + *phys_dirname = '\0'; + if (IS_ERR(filp)) { + /* This file is not checkpointed, use the standard content file. */ + snprintf(content_data->phys_dirname, PATH_MAX, "%s/" KDFS_CONTENT_FILENAME, content_data->phys_dirname); + filp = open_phys_file(content_data->phys_dirname, O_CREAT|O_LARGEFILE|O_RDWR, 0644, 0,0); + BUG_ON(IS_ERR(filp)); + content_data->phys_file = filp; + *phys_dirname = '\0'; + + content_data->content_readphyspage = kdfs_content_readphyspage; + content_data->content_writephyspage = kdfs_content_writephyspage; + content_data->current_meta = NULL; + } + else { + /* This file is checkpointed, initialization will be done on the first read/write. */ + content_data->phys_file = NULL; + + content_data->content_readphyspage = kdfs_content_readphyspage_cow; + content_data->content_writephyspage = kdfs_content_writephyspage_cow; + content_data->current_meta = NULL; + } + } else { + DEBUG (DBG_INFO, "Nothing TODO, file is not on this node\n"); + content_data->phys_dirname = NULL; + content_data->phys_file = NULL; + } + + /* TODO PRIORITY 2, Adrien, we could have some issue if the kernel tries to remove the inode during this code */ + /* Retrieve the local ref to the k_mapping object */ + inode = ilookup(k_sb->sb, content_data->ino); + if (inode) { + DEBUG(DBG_INFO, "K_mapping from the cache\n"); + content_data->k_mapping = inode->i_mapping; + iput(inode); + } else { + DEBUG(DBG_INFO, "K_mapping will be retrieve from iget\n"); + inode = kdfs_getinode(k_sb->sb, content_data->ino); + content_data->k_mapping = inode->i_mapping; + } + if (!content_data->k_mapping) + DEBUG(DBG_PANIC, "k_mapping was not cleanly initialized\n"); + + __kdfs_putsb(k_sb); + PRINT_FUNCTION_EXIT; + return result; +} + +/* + * Uninstantiate a content container. + * @author Adrien Lebre + * + * @param kddm_set kddm_set to uninstantiate + */ +void content_uninstantiate(kddm_set_t *kddm_set, int destroy) +{ + struct content_iolinker_data *content_data; + PRINT_FUNCTION_NAME; + + ASSERT(kddm_set != NULL); + ASSERT(kddm_set->private_data != NULL); + content_data = (struct content_iolinker_data *) kddm_set->private_data; + + if (content_data->phys_dirname != NULL) + kfree(content_data->phys_dirname); + + if (content_data->phys_file != NULL) + close_phys_file(content_data->phys_file); + + PRINT_FUNCTION_EXIT; +} + +int kdfs_content_readphyspage(struct content_iolinker_data *content_data, + char *page_addr, loff_t pos) +{ + int res = 0; + + kdfs_phys_read(content_data->phys_file, page_addr, PAGE_CACHE_SIZE, &pos); + + PRINT_FUNCTION_EXIT; + return res; +} diff --cc fs/kdfs/debug_kdfs.h index a5a377c,0000000..f50a0b2 mode 100644,000000..100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@@ -1,86 -1,0 +1,86 @@@ +/* + * KDDM File System file - debug macros + * + * @file debug_kdfs.h + * + * @author Adrien Lebre + * + * @maintainer Adrien Lebre + * + * Copyright (C) 2006-2007, XtreemOS Consortium. + */ + +#ifndef __KDFS_DEBUG__ +#define __KDFS_DEBUG__ + +/* Common headers */ +#include <asm-generic/bug.h> +#include <linux/err.h> +#include <linux/kernel.h> + +/* Kerrighed headers (dynamical debugging) */ +#include <kerrighed/debug.h> +//#include <kerrighed/debug_tools2.h> + +/* DEBUG Level */ +#define DBG_PANIC 0 +#define DBG_ALERT 1 +#define DBG_WARNING 2 +#define DBG_TRACE 3 +#define DBG_INFO 4 + +#define KDFS_DEBUG_LEVEL 4 + +#ifdef DEBUG +#undef DEBUG +#endif + +#ifdef NDEBUG +# define DEBUG(level, format, args...) do {} while(0) +#else +# define DEBUG(level, format, args...) \ +do { \ + if (KDFS_DEBUG_LEVEL >= level || level == DBG_PANIC) { \ - pr_debug("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ ++ printk("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ + current->pid) ; \ - pr_debug(format, ## args) ; \ ++ printk(format, ## args) ; \ + } \ + if(level == DBG_PANIC)\ + BUG();\ +} while (0) +#endif + +/* Adrien last check before matthieu */ +/* if ((KDFS_DEBUG_LEVEL>=level) && \ (type & (KDFS_DEBUG_MASK))) \ */ + + +/* FUNCTION NAME : ENTER and EXIT */ +// TODO: redefine the following macros to take into account debug level ! +#define PRINT_FUNCTION_NAME DEBUG(DBG_TRACE, "%s\n", __PRETTY_FUNCTION__) +#define PRINT_FUNCTION_EXIT DEBUG(DBG_TRACE, "%s exited\n", __PRETTY_FUNCTION__) + + +/* ASSERT and BUG ON */ + +#ifdef ASSERT +#undef ASSERT +#endif + +#ifdef NDEBUG +#define ASSERT(expr) do {} while(0) +#else +#define ASSERT(expr) \ +do {\ + if ( !(expr) ) {\ - pr_debug("PANIC : ASSERT " #expr " failed in %s \ ++ printk("PANIC : ASSERT " #expr " failed in %s \ + line %d\n", __PRETTY_FUNCTION__, __LINE__ ); \ + BUG(); \ + } \ +} while (0) +#endif + +/* Add __KDFS_PROCDIR_ feature - Pierre Riteau */ +#define __KDFS_PROCDIR_ 1 + + +#endif // __KDFS_DEBUG__ diff --cc fs/kdfs/file.c index a1707bc,0000000..d93dc51 mode 100644,000000..100644 --- a/fs/kdfs/file.c +++ b/fs/kdfs/file.c @@@ -1,304 -1,0 +1,306 @@@ +/* + * KDDM File System file - file content manamgement + * + * @file file.c + * + * @author Adrien Lebre (2007-xxx) + * @comment Based on the Renaud Lottiaux's kerfs proposal (2003-2005) + * + * @maintainer Adrien Lebre + * + * Copyright (C) 2006-2007, XtreemOS Consortium. + */ + +#include <linux/buffer_head.h> + ++#include <net/krgrpc/rpcid.h> ++#include <net/krgrpc/rpc.h> +#include <kddm/kddm.h> + +#include "super.h" +#include "inode.h" +#include "address_space.h" +#include "file.h" + +#include "debug_kdfs.h" +#define KDFS_PART "KDFS - File Content Management" + +/*****************************************************************************/ +/* */ +/* INTERNAL FILE OPERATIONS */ +/* */ +/*****************************************************************************/ + +/*****************************************************************************/ +/* */ +/* FILE OPERATIONS */ +/* */ +/*****************************************************************************/ + +loff_t kdfs_llseek(struct file *filp, loff_t offset, int origin) +{ + loff_t r; + + DEBUG(DBG_INFO, + "lseek on file %s at offset %lld current offset is %lld\n", + filp->f_dentry->d_name.name, offset, filp->f_pos); + + r = generic_file_llseek(filp, offset, origin); + + DEBUG(DBG_INFO, + "lseek on file %s offset is now %lld: done with err %lld\n", + filp->f_dentry->d_name.name, + filp->f_pos, r); + + return r; +} + +ssize_t kdfs_read(struct file *filp, char *buf, size_t count, loff_t *ppos) +{ + ssize_t r = 0; + struct kdfs_inode *kdfs_inode = NULL; + + DEBUG(DBG_INFO, + "read %zd bytes from file %s at offset %lld in buffer %p\n", + count, filp->f_dentry->d_name.name, *ppos, buf); + + kdfs_inode = kdfs_iget(filp->f_dentry->d_inode->i_ino); + if (kdfs_inode->content_setid == KDDM_SET_UNUSED) { + /* Create the associated kddm_set */ + create_file_kddm_set(kdfs_inode); + } + + r = do_sync_read(filp, buf, count, ppos); + + // TODO PRIORITY 2: FILE TIMESTAMP ? + + kdfs_iput(filp->f_dentry->d_inode->i_ino); + + DEBUG(DBG_INFO, "read of file %s at offset %lld: done\n", + filp->f_dentry->d_name.name, *ppos); + + return r; +} + +ssize_t kdfs_write(struct file *filp, const char *buf, size_t count, loff_t *ppos) +{ + ssize_t r = 0; + struct kdfs_inode *kdfs_inode = NULL; + + DEBUG(DBG_INFO, + "write %zd bytes to file %s at offset %lld\n", + count, filp->f_dentry->d_name.name, *ppos); + + kdfs_inode = kdfs_igrab(filp->f_dentry->d_inode->i_ino); + if (kdfs_inode->content_setid == KDDM_SET_UNUSED) { + /* Create the associated kddm_set */ + create_file_kddm_set(kdfs_inode); + } + + /* Call generic_file_aio_write */ + r = do_sync_write(filp, buf, count, ppos); + + kdfs_iput(filp->f_dentry->d_inode->i_ino); + + DEBUG(DBG_INFO, + "write to file %s at offset %lld: " + "done with return value %zd\n", + filp->f_dentry->d_name.name, *ppos, r); + + return r; +} + +int kdfs_mmap(struct file *filp, struct vm_area_struct *vm) +{ + int ret = 0; + struct kdfs_inode *k_inode = NULL; + + DEBUG(DBG_INFO, "mmap file %s \n", filp->f_dentry->d_name.name); + + k_inode = kdfs_igrab(filp->f_dentry->d_inode->i_ino); + if (k_inode->content_setid == KDDM_SET_UNUSED) { + /* Create the associated kddm_set */ + create_file_kddm_set(k_inode); + } + + /* Call generic_file_map */ + ret = generic_file_mmap (filp, vm); + + kdfs_iput(filp->f_dentry->d_inode->i_ino); + + PRINT_FUNCTION_EXIT; + return ret; +} + +int kdfs_open(struct inode *inode, struct file *filp) +{ + struct kdfs_super_block *k_sb; + struct kdfs_cw_sb *k_cwsb; + struct kdfs_inode *k_inode; + int r = 0; + + DEBUG(DBG_INFO, "open file %s - inode %ld\n", + filp->f_dentry->d_name.name, inode->i_ino); + + k_cwsb = __kdfs_get_cwsb(); + if (!test_bit(inode_linked_node(inode->i_ino), (unsigned long *) k_cwsb->cw_bitmap->map)) { + r = -ENODEV; + __kdfs_put_cwsb(); + goto out; + } + __kdfs_put_cwsb(); + + if ((k_sb = kdfs_getsb(inode_linked_node(inode->i_ino))) == NULL) { + DEBUG(DBG_ALERT, "No kdfs super-block available\n"); + return -EFAULT; + } + + k_inode = kdfs_igrab(inode->i_ino); + r = generic_file_open (inode, filp); + atomic_inc(&k_inode->cw_count); + kdfs_iput(inode->i_ino); + __kdfs_putsb(k_sb); + +out: + DEBUG(DBG_INFO, "open file %s: inode %ld: done with error %d\n", + filp->f_dentry->d_name.name, inode->i_ino, r); + + return r; +} + +int kdfs_release(struct inode *inode, struct file *filp) +{ + struct kdfs_inode *k_inode; + + DEBUG(DBG_INFO, + "Release file %s (i_size %lld) (inode %p)\n", + filp->f_dentry->d_name.name, + filp->f_dentry->d_inode->i_size, + filp->f_dentry->d_inode); + + k_inode = kdfs_igrab(inode->i_ino); + atomic_dec(&k_inode->cw_count); + kdfs_iput(inode->i_ino); + + return 0; +} + +struct file_operations kdfs_file_fops = { + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, + .fsync = file_fsync, + .llseek = kdfs_llseek, + .mmap = kdfs_mmap, + .open = kdfs_open, + .read = kdfs_read, + .release = kdfs_release, + .write = kdfs_write, +}; + +/*****************************************************************************/ +/* */ +/* FILE LINKER PART */ +/* */ +/*****************************************************************************/ + +/* + * Create file_kddm_set from file inode + * @author Adrien Lebre + * + * @param dir Reference to the associated kdfs_inode + * @return a new container built from the file + */ +kddm_set_t *create_file_kddm_set(struct kdfs_inode *k_inode) +{ + kddm_set_t *kddm_set = NULL; + + PRINT_FUNCTION_NAME; + + ASSERT(k_inode != NULL); + ASSERT(k_inode->inode != NULL); + +#if KDFS_FILE_STRIPING + kddm_set = __create_content_kddm_set(0, KDDM_SET_CUSTOM_LINKED, k_inode, FILE_LINKER); +#else + kddm_set = __create_content_kddm_set(0, inode_linked_node(k_inode->inode->i_ino), k_inode, FILE_LINKER); +#endif + if (!IS_ERR(kddm_set)) { + k_inode->content_setid=kddm_set->id; + DEBUG(DBG_INFO, "Create content kddm_set for file %s (inode %ld) with id %ld\n", + list_entry(k_inode->inode->i_dentry.next, struct dentry, d_alias)->d_name.name, + k_inode->inode->i_ino, k_inode->content_setid); + } else { + DEBUG(DBG_PANIC, "Can't create content kddm_set for file%s (inode %ld)\n", + list_entry(k_inode->inode->i_dentry.next, struct dentry, d_alias)->d_name.name, + k_inode->inode->i_ino); + } + + return kddm_set; +} + +/*****************************************************************************/ +/* */ +/* FILE IO LINKER PART */ +/* */ +/*****************************************************************************/ + +/* + * Determine the owner for a particular page. + * If the page has not been yet allocated, the page will be stored locally. + * @author Adrien Lebre + * + * @param kddm_set Container descriptor + * @param objid inode Id. + */ +kerrighed_node_t kdfs_iol_file_default_owner (kddm_set_t *kddm_set, objid_t objid) +{ + /* + * TODO NOW, Adrien + * Implement + */ + return KERRIGHED_NODE_ID_NONE; +} + +/* + * Instantiate a container with a file linker. + * @author Adrien Lebre + * + * @param kddm_set kddm to instantiate + * @param private_data file_iolinker_data to access to physical file. + * + * @return error code or 0 if everything was ok. + */ +int kdfs_iol_file_instantiate (kddm_set_t *kddm_set, void *private_data, int master) +{ + return content_instantiate(kddm_set, private_data, master); +} + +/** Uninstantiate a file container. + * @author Adrien Lebre + * + * @param kddm_set kddm_set to uninstantiate + */ +void kdfs_iol_file_uninstantiate (kddm_set_t *kddm_set, int destroy) +{ + content_uninstantiate(kddm_set, destroy); +} + +/* Init the file I/O linker */ +struct iolinker_struct file_io_linker = { + .alloc_object = kdfs_iol_page_alloc, +#if KDFS_FILE_STRIPING + .default_owner = kdfs_iol_file_default_owner, +#endif + .export_object = kdfs_iol_page_export, + .first_touch = kdfs_iol_page_first_touch, + .import_object = kdfs_iol_page_import, + .insert_object = kdfs_iol_page_insert, + .instantiate = kdfs_iol_file_instantiate, + .invalidate_object = kdfs_iol_page_invalidate, + .linker_name = "file", + .linker_id = FILE_LINKER, + .put_object = kdfs_iol_page_put, + .remove_object = kdfs_iol_page_remove, + .sync_object = kdfs_iol_page_sync, + .uninstantiate = kdfs_iol_file_uninstantiate, +}; diff --cc fs/kdfs/inode.c index f126cb8,0000000..4cce701 mode 100644,000000..100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@@ -1,1407 -1,0 +1,1409 @@@ +/* + * KDDM File System file - inode management + * + * @file inode.c + * + * @author Adrien Lebre (2007-xxx) + * @comment Based on the Renaud Lottiaux's kerfs proposal (2003-2005) + * + * @maintainer Adrien Lebre + * + * Copyright (C) 2006-2007, XtreemOS Consortium. + */ + ++#include <net/krgrpc/rpcid.h> ++#include <net/krgrpc/rpc.h> +#include <kddm/kddm.h> + +#include "super.h" +#include "inode.h" +#include "dir.h" +#include "file.h" +#include "address_space.h" +#include "physical_fs.h" + +#include "debug_kdfs.h" +#define KDFS_PART "KDFS - Inode Management" + +/******************************** + * * + * SOME DEBUG FUNCTIONS * + * * + ********************************/ + +void print_inode_cont(struct inode *node) +{ + printk("\n\n\n=== INODE DUMP ===\n"); + printk(" i_ino: %ld\n", node->i_ino); + printk(" i_count: %d\n", node->i_count.counter); + printk(" i_nlink: %u\n", node->i_nlink); + printk(" i_uid: %u\n", node->i_uid); + printk(" i_gid: %u\n", node->i_gid); + printk("i_version: %llu\n", (unsigned long long)node->i_version); + printk(" i_mode: %x\n\n\n", node->i_mode); +} + +void print_dentry_cont(struct dentry *entry, int print_inode_info) +{ + printk("\n\n\n=== DENTRY DUMP ===\n"); + printk("d_count: %d\n", entry->d_count.counter); + printk("d_flags: %x\n", entry->d_flags); + printk(" d_name: %s\n", entry->d_name.name); + printk("d_iname: %s\n", entry->d_iname); + + if (print_inode_info != 0) { + if (IS_ERR(entry->d_inode)) + printk("DENTRY INODE NULL!!!\n"); + else + print_inode_cont(entry->d_inode); + } + + printk("\n\n"); +} + +/*****************************************************************************/ +/* */ +/* INODE INTERNAL FUNCTIONS */ +/* */ +/*****************************************************************************/ + +static inline void kdfs_export_kdfs_inode(struct kdfs_netinode *dest, struct kdfs_inode *src) +{ + /* export inode informations */ + dest->i_ino = src->inode->i_ino; + dest->i_size = src->inode->i_size; + dest->i_mode = src->inode->i_mode; + dest->i_nlink = src->inode->i_nlink; + dest->i_uid = src->inode->i_uid; + dest->i_gid = src->inode->i_gid; + dest->i_atime = src->inode->i_atime; + dest->i_mtime = src->inode->i_mtime; + dest->i_ctime = src->inode->i_ctime; + dest->i_version = src->inode->i_version; + dest->i_state = src->inode->i_state; + + atomic_set(&dest->cw_count, atomic_read(&src->cw_count)); + + /* export miscellaneous */ + dest->content_setid = src->content_setid; + dest->flags = src->flags; +} + +static inline void kdfs_import_kdfs_inode (struct kdfs_inode *dest, struct kdfs_netinode *src) +{ + /* import inode informations */ + dest->inode->i_ino=src->i_ino; + dest->inode->i_size = src->i_size; + dest->inode->i_mode = src->i_mode; + dest->inode->i_nlink = src->i_nlink; + dest->inode->i_uid = src->i_uid; + dest->inode->i_gid = src->i_gid; + dest->inode->i_atime = src->i_atime; + dest->inode->i_mtime = src->i_mtime; + dest->inode->i_ctime = src->i_ctime; + dest->inode->i_version = src->i_version; + dest->inode->i_state = src->i_state; + + atomic_set(&dest->cw_count, atomic_read(&src->cw_count)); + + /*export miscellaneous */ + dest->content_setid = src->content_setid; + dest->flags = src->flags; +} + +/* + * Internal kDFS mknod function + * @author Adrien Lebre + * + * @param k_pdir Directory to create the inode in. + * @param dentry Dentry of the file to create. + * @param mode Mode of the file to create. + * @param dev Device associated to the file. + * @comments kDFS dir inode has to be locked (grabded) + * If creation succeeded, new nod is returned locked + */ +struct kdfs_inode *__kdfs_mknod(struct kdfs_inode *k_pdir, + struct dentry *dentry, + int mode, + dev_t dev) +{ + ino_t ino = KDFS_BAD_INODEID; + struct kdfs_inode *k_nnod; + struct kdfs_super_block *k_sb; + + DEBUG(DBG_TRACE, + "Internal mknod %s (parent dir %ld ino)\n", + dentry->d_name.name, k_pdir->inode->i_ino); + + k_sb = kdfs_grabsb(kerrighed_node_id); + if (k_sb->s_mount_opt & KDFS_MOUNT_DISKLESS) { + kdfs_node_t linked_node; + linked_node = k_sb->root_nodeid; + __kdfs_putsb(k_sb); + k_sb = kdfs_grabsb(linked_node); + } + BUG_ON(k_sb == NULL); + + /* Get an inode ID */ + ino = kdfs_get_freeino(k_sb); + // TODO PRIORITY 2 Adrien put here or later + __kdfs_putsb(k_sb); + + k_nnod = kdfs_icreate(ino); /* get a kDFS inode from the kDDM set (k_inode is lock)*/ + if (IS_ERR(k_nnod)) { + DEBUG(DBG_ALERT, "Can't grab new file inode object (ino=%ld)\n", ino); + return k_nnod; + } + + k_nnod->inode->i_mode = mode; + switch (mode & S_IFMT) { + case S_IFREG: + k_nnod->inode->i_op = &kdfs_file_inode_operations; + k_nnod->inode->i_fop = &kdfs_file_fops; + k_nnod->inode->i_mapping->a_ops = &kdfs_aops ; + break; + case S_IFDIR: + k_nnod->inode->i_op = &kdfs_dir_inode_operations; + k_nnod->inode->i_fop = &kdfs_dir_fops; + k_nnod->inode->i_mapping->a_ops = &kdfs_aops ; + break; + case S_IFLNK: + k_nnod->inode->i_op = &kdfs_symlink_inode_operations; + k_nnod->inode->i_mapping->a_ops = &kdfs_aops ; + break; + case S_IFBLK: + case S_IFCHR: + case S_IFIFO: + case S_IFSOCK: + init_special_inode(k_nnod->inode, mode, dev); + break; + default: + BUG(); + break; + } + + k_nnod->inode->i_uid = current_fsuid(); + k_nnod->inode->i_gid = current_fsgid(); + + if (k_pdir->inode->i_mode & S_ISGID) { + k_nnod->inode->i_gid = k_pdir->inode->i_gid; + if (S_ISDIR(mode)) + k_nnod->inode->i_mode |= S_ISGID; + } + + k_nnod->inode->i_mtime = k_nnod->inode->i_atime = k_nnod->inode->i_ctime = CURRENT_TIME_SEC; + k_nnod->flags = K_INODE_OK; + + /* Sync kddm object to propagate change to the right partitions (clusterwide) */ + kdfs_mark_inode_dirty(k_nnod); + + // TODO PRIORITY 1: Test return value, test if kdfs_ndir->inode->i_ino == ino + kdfs_add_dir_entry(k_pdir, (char *) dentry->d_name.name, ino, mode); + + DEBUG(DBG_TRACE, "i_count before d_instantiate %d\n", atomic_read(&k_nnod->inode->i_count)); + d_instantiate(dentry, k_nnod->inode); + DEBUG(DBG_TRACE, "i_count after d_instantiate %d\n", atomic_read(&k_nnod->inode->i_count)); + DEBUG(DBG_TRACE, "New nod done (ino=%ld, size=%lld)\n", k_nnod->inode->i_ino, k_nnod->inode->i_size); + return k_nnod; +} + +/*****************************************************************************/ +/* */ +/* INODE VFS OPERATIONS */ +/* */ +/*****************************************************************************/ + +/* + * File system dependent mknod function called by the Linux + * and also by kdfs_create. + * @author Adrien Lebre + * + * @param dir Directory to create the inode in. + * @param dentry Dentry of the file to create. + * @param mode Mode of the file to create. + * @param dev Device associated to the file. + */ +int kdfs_mknod(struct inode *dir, + struct dentry *dentry, + int mode, + dev_t dev) +{ + struct kdfs_inode *k_pdir, *k_nnod; + + DEBUG(DBG_TRACE, + "New nod %s (parent dir %ld ino)\n", + dentry->d_name.name, dir->i_ino); + + /* Grab the parent directory */ + k_pdir = kdfs_igrab(dir->i_ino); + if (IS_ERR(k_pdir)) + return PTR_ERR(k_pdir); + + k_nnod = __kdfs_mknod(k_pdir, dentry, mode, dev); + if (k_nnod) { + kdfs_iput(k_nnod->inode->i_ino); + DEBUG(DBG_TRACE, + "New nod (ino=%ld, size=%lld)\n", + k_nnod->inode->i_ino,k_nnod->inode->i_size); + } else + // TODO PRIORITY 2, Adrien, if we got an error we should release the local inode if needed ! + DEBUG(DBG_TRACE,"New nod creation failed \n"); + + kdfs_iput(dir->i_ino); + PRINT_FUNCTION_EXIT; + return 0; +} + +/* + * File system dependent create function called by the Linux VFS. + * @author Adrien Lebre + * + * @param dir Directory to create the inode in. + * @param dentry Dentry of the file to create. + * @param mode Mode of the file to create. + * @param nd TODO comments + */ +int kdfs_create(struct inode *dir, struct dentry *dentry, + int mode, + struct nameidata *nd) +{ + int res = 0; + DEBUG(DBG_TRACE, + "create %s (parent dir %ld ino)\n", + dentry->d_name.name, dir->i_ino); + + res = kdfs_mknod(dir, dentry, mode|S_IFREG, 0); + + DEBUG(DBG_TRACE, + "create %s done: res = %d\n", + dentry->d_name.name, res); + return res; +} ... [truncated message content] |
From: Marko O. <d0...@us...> - 2009-10-29 08:39: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 e9b2900ac5dcea18ed708cf4688628437606aacd (commit) from ae83edea9758450a29fbfa59bd8b3cd3ebbf0efe (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 e9b2900ac5dcea18ed708cf4688628437606aacd Author: Marko Obrovac <mar...@in...> Date: Thu Oct 29 08:33:39 2009 +0000 Substitute pr_debug with printk as to be able to always see kdfs debug output diff --git a/fs/kdfs/debug_kdfs.h b/fs/kdfs/debug_kdfs.h index a5a377c..55b1623 100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@ -41,9 +41,9 @@ # define DEBUG(level, format, args...) \ do { \ if (KDFS_DEBUG_LEVEL >= level || level == DBG_PANIC) { \ - pr_debug("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ + /*pr_debug*/printk("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ current->pid) ; \ - pr_debug(format, ## args) ; \ + /*pr_debug*/printk(format, ## args) ; \ } \ if(level == DBG_PANIC)\ BUG();\ ----------------------------------------------------------------------- Summary of changes: fs/kdfs/debug_kdfs.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2009-10-28 12:24:58
|
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 "UNNAMED PROJECT". The branch, master has been updated via 00d7530dbb8e59541120635b9a349954c1c0484e (commit) from 8b361814e9b8a1a41b3fbddaf91b4cdea4115220 (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 00d7530dbb8e59541120635b9a349954c1c0484e Author: Marko Obrovac <mar...@in...> Date: Wed Oct 28 12:20:56 2009 +0000 Added netclient.c to the tools directory diff --git a/scripts/Makefile.in b/scripts/Makefile.in index 36284b0..b55c34b 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.10.1 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,8 +16,9 @@ @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -41,6 +43,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -56,45 +59,47 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIST_ID = @DIST_ID@ DIST_RELEASE = @DIST_RELEASE@ DSYMUTIL = @DSYMUTIL@ -ECHO = @ECHO@ +DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ +FGREP = @FGREP@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ +NM = @NM@ NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -108,8 +113,7 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -147,6 +151,7 @@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lsb = @lsb@ +lt_ECHO = @lt_ECHO@ ltpbase = @ltpbase@ mandir = @mandir@ mkdir_p = @mkdir_p@ @@ -165,6 +170,7 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ vanilla_linux_version = @vanilla_linux_version@ @@ -203,14 +209,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu scripts/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu scripts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -228,6 +234,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo @@ -257,13 +264,17 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -294,6 +305,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -312,6 +324,8 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: @@ -320,18 +334,28 @@ install-data-am: install-data-local install-dvi: install-dvi-am +install-dvi-am: + install-exec-am: install-html: install-html-am +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -381,6 +405,7 @@ uninstall-local: dist-hook: rm -rf $(find $(distdir) -name '*~') + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/tools/netclient.c b/tools/netclient.c new file mode 100644 index 0000000..1a64130 --- /dev/null +++ b/tools/netclient.c @@ -0,0 +1,194 @@ +/* + * A network client for interacting with KDB. + * + * Dan Aloni <da...@xi...>, 2006 (c) + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + */ +/* + * Changelog: + * - 2007: added rough arguments to configure the listening port and not + * deactivate character echoing - Louis Riling <lou...@ke...> + * - 2007: fix newline over ssh - Matthieu Fertre <mf...@ir...> + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/poll.h> +#include <netinet/in.h> +#include <termios.h> +#include <unistd.h> +#include <arpa/inet.h> +#include <signal.h> + +struct termios orig_tty; +int enable_echo = 0; + +void sigint(int s) +{ + tcsetattr(STDIN_FILENO, TCSANOW, &orig_tty); +} + +void disable_icanon(void) +{ + struct termios tty; + + tcgetattr(STDIN_FILENO, &tty); + orig_tty = tty; + + tty.c_lflag &= ~ICANON; + if (!enable_echo) + tty.c_lflag &= ~ECHO; + + tty.c_iflag &= ~ICRNL; + + tcsetattr(STDIN_FILENO, TCSANOW, &tty); + + signal(SIGINT, sigint); +} + + +int main(int argc, char *argv[]) +{ + int sock_fd; + int ret; + int flag; + int stdin_fd = STDIN_FILENO; + char in_char; + struct sockaddr_in listening_address = { + .sin_family = AF_INET, + .sin_addr.s_addr = INADDR_ANY, + .sin_port = htons(6666), + }; + struct sockaddr_in remote_address = { + .sin_family = AF_INET, + .sin_addr.s_addr = INADDR_ANY, + .sin_port = htons(6665), + }; + struct pollfd ufds[2]; + int enable_recv = 1; + int nr_pollfd = 2; + + if (argc < 2) + return -1; + + remote_address.sin_addr.s_addr = inet_addr(argv[1]); + if (argc > 2) + listening_address.sin_port = htons(atoi(argv[2])); + + if (argc > 3) + enable_echo = 1; + + if (!listening_address.sin_port) { + printf("netkdb sending to %s:%d, SIGINT will exit\n", inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port)); + enable_recv = 0; + nr_pollfd = 1; + } else { + printf("netkdb listening and sending on port %d to %s:%d, SIGINT will exit\n", ntohs(listening_address.sin_port), inet_ntoa(remote_address.sin_addr), ntohs(remote_address.sin_port)); + } + if (enable_echo) + printf("echo enabled\n"); + + sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (sock_fd < 0) { + printf("socket creation failed\n"); + return -1; + } + + flag = 1; + ret = setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); + if (ret <0) { + return -1; + } + + ret = bind(sock_fd, (struct sockaddr *)&listening_address, + sizeof(listening_address)); + + if (ret < 0) { + printf("bind failed\n"); + return -1; + } + + ufds[0].fd = stdin_fd; + ufds[0].events = POLLIN; + if (enable_recv) { + ufds[1].fd = sock_fd; + ufds[1].events = POLLIN; + } else + shutdown(sock_fd, SHUT_RD); + + disable_icanon(); + + while (1) { + ufds[0].revents = 0; + if (enable_recv) + ufds[1].revents = 0; + + ret = poll(ufds, nr_pollfd, 1000); + if (ret < 0) + break; + + if (ufds[0].revents & POLLIN) { + ret = read(stdin_fd, &in_char, 1); + if (ret == 0) + break; + + /* translate backspace to what kdb is expecting */ + if (in_char == 127) { + in_char = 8; + } + /* translate enter to what kdb is expecting + * (\n -> \r) */ + if (in_char == 10) { + in_char = 13; + } + + ret = sendto(sock_fd, &in_char, 1, 0, (struct sockaddr *)&remote_address, + sizeof(remote_address)); + + if (ret < 0) { + fprintf(stderr, "sendto() failed\n"); + break; + } + } + + if (enable_recv && (ufds[1].revents & POLLIN)) { + struct sockaddr_in source; + socklen_t socklen = sizeof(remote_address); + char buf[0x1000]; + + ret = recvfrom(sock_fd, buf, sizeof(buf), 0, (struct sockaddr *)&source, + &socklen); + + if (ret < 0) { + fprintf(stderr, "recvfrom() failed\n"); + break; + } + + if (source.sin_addr.s_addr == remote_address.sin_addr.s_addr) { + write(STDOUT_FILENO, buf, ret); + } + } + } + + tcsetattr(STDIN_FILENO, TCSANOW, &orig_tty); + + return 0; +} + ----------------------------------------------------------------------- Summary of changes: scripts/Makefile.in | 67 ++++++++++++------ tools/netclient.c | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 240 insertions(+), 21 deletions(-) create mode 100644 tools/netclient.c hooks/post-receive -- UNNAMED PROJECT |
From: Marko O. <d0...@us...> - 2009-10-27 13:42:12
|
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 ae83edea9758450a29fbfa59bd8b3cd3ebbf0efe (commit) from e9dc700afcb49febc90f5b5dc580818bfc33fb6d (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 ae83edea9758450a29fbfa59bd8b3cd3ebbf0efe Author: Marko Obrovac <mar...@in...> Date: Tue Oct 27 13:36:00 2009 +0000 A small fix in the kernel compilation script: use "pwd" instead of "dirname" when setting the repo to the current working directory diff --git a/scripts/compile-kernel b/scripts/compile-kernel index 91cca8e..fd82b12 100755 --- a/scripts/compile-kernel +++ b/scripts/compile-kernel @@ -45,7 +45,7 @@ if [ $# -eq 1 ]; then REPO=$1; else if [ "x$REPO" == "x" ]; then - REPO=`dirname $0`; + REPO=`pwd`; fi; fi; ----------------------------------------------------------------------- Summary of changes: scripts/compile-kernel | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2009-10-27 12:42:39
|
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 e9dc700afcb49febc90f5b5dc580818bfc33fb6d (commit) from a555410defc36ea806183bcb78b8f2ab4b50996e (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 e9dc700afcb49febc90f5b5dc580818bfc33fb6d Author: Marko Obrovac <mar...@in...> Date: Tue Oct 27 12:36:18 2009 +0000 Add a simple kernel compilation utility diff --git a/scripts/compile-kernel b/scripts/compile-kernel new file mode 100755 index 0000000..91cca8e --- /dev/null +++ b/scripts/compile-kernel @@ -0,0 +1,77 @@ +#!/bin/bash + +################################################################# +# # +# compile-kernel # +# # +#===============================================================# +# # +# Author: Marko Obrovac # +# Copyright(c) 2009 XtreemOS Consortium # +# Licence: GPL # +# # +#---------------------------------------------------------------# +# # +# A simple utilily script to compile and install the kernel # +# and its modules. # +# # +# Usage: # +# by default, the script uses the Makefile-s in the current # +# working directory, making it possible to call the script # +# in a nice fashion from the kernel root directory: # +# $ ./scripts/compile-kernel # +# It is also possible to supply the root kernel directory # +# as an argument: # +# $ compile-kernel /path/to/kernel/dir # +# Alternatively, the REPO environment variable can be set # +# to point to the kernel directory: # +# $ export REPO=/path/to/kernel/dir # +# $ compile-kernel # +# # +# Assumptions: # +# This script makes two important assumptions: # +# a) you either run the script as the super-user or your # +# running user is able to use the sudo command # +# b) the machine you're compiling the kernel has at least # +# a modern dual-core processor, so it adds the '-j3' # +# argument to "make" # +# If these assumptions are not met, you will have to modify # +# the script accordingly # +# # +################################################################# + + +if [ $# -eq 1 ]; then + REPO=$1; +else + if [ "x$REPO" == "x" ]; then + REPO=`dirname $0`; + fi; +fi; + +echo -e "Using dir $REPO\n"; + +echo "###"; +echo "#"; +echo "# COMPILING KERNEL"; +echo "#"; +echo -e "###\n"; + +make -C $REPO -j3; + +if [ $? -ne 0 ]; then + echo -e "\nPlease correct the errors and try again! Leaving..."; + exit 1; +fi; + +echo -e "\n###"; +echo "#"; +echo "# INSTALLING THE KERNEL & MODULES"; +echo "#"; +echo -e "###\n"; + +sudo make -C $REPO modules_install; +sudo make -C $REPO install; + +exit; + ----------------------------------------------------------------------- Summary of changes: scripts/compile-kernel | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 77 insertions(+), 0 deletions(-) create mode 100755 scripts/compile-kernel hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2009-10-26 17:05:41
|
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 a555410defc36ea806183bcb78b8f2ab4b50996e (commit) via d6e23fb32b8e9765d0d0afa11b4e9959938d872d (commit) via a19e999ecf51d928bb1cab259ca1534eeca731b4 (commit) from 9567af3f521aeecb16c274127db8e39ef9527c48 (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 a555410defc36ea806183bcb78b8f2ab4b50996e Author: Marko Obrovac <mar...@in...> Date: Mon Oct 26 17:01:16 2009 +0000 Second part of the patch, forgot to attach unversioned files in the previous commit. diff --git a/Documentation/kgdb/kgdboe-reboot b/Documentation/kgdb/kgdboe-reboot new file mode 100755 index 0000000..83ef8c4 --- /dev/null +++ b/Documentation/kgdb/kgdboe-reboot @@ -0,0 +1,11 @@ +#!/bin/bash + +ADDR=$1 +PORT=6443 +if [ $# -ge 2 ]; then + PORT=$2 +fi + +echo -ne '\003' | nc -u -q 0 $ADDR $PORT > /dev/null +echo -ne '$R0#82' | nc -u -q 0 $ADDR $PORT > /dev/null +echo -ne '+' | nc -u -q 0 $ADDR $PORT > /dev/null diff --git a/Documentation/kgdb/krg-gdbinit b/Documentation/kgdb/krg-gdbinit new file mode 100644 index 0000000..a265f9c --- /dev/null +++ b/Documentation/kgdb/krg-gdbinit @@ -0,0 +1,122 @@ +define offset_of + print &((struct $arg0 *) 0)->$arg1 +end + +define ps + set $inittask = &init_task + set $mthread = &init_task + set $tasks_off = (size_t)&((struct task_struct*) 0)->tasks + set $thread_group_off = (size_t)&((struct task_struct*) 0)->thread_group + set $cont = 1 + while $cont == 1 + set $athread = $mthread + set $subcont = 1 + while $subcont == 1 + printf "%d %s\n", $athread->pid, (char*)$athread->comm + if (int)$athread->thread_group.next == 0 + set $subcont = 0 + else + set $athread = (struct task_struct*)((char*)$athread->thread_group.next-$thread_group_off) + if $athread == $mthread + set $subcont = 0 + end + end + end + set $mthread = (struct task_struct*)((char*)$mthread->tasks.next-$tasks_off) + if $mthread == $inittask + set $cont = 0 + end + end +end +document ps + list all threads and processes in the system +end + +define dmesg + set $i = 0 + set $end_idx = (log_end - 1) & (log_buf_len - 1) + + while ($i < logged_chars) + set $idx = (log_end - 1 - logged_chars + $i) & (log_buf_len - 1) + + if ($idx + 100 <= $end_idx) || \ + ($end_idx <= $idx && $idx + 100 < log_buf_len) + printf "%.100s", &log_buf[$idx] + set $i = $i + 100 + else + printf "%c", log_buf[$idx] + set $i = $i + 1 + end + end +end +document dmesg + print the kernel ring buffer +end + +define task + set $t = (struct task_struct *) $arg0 + + printf "Task %d %s:\n", $t->pid, $t->comm + printf " task_struct:\t0x%lx\n", $t + printf " stack:\t0x%lx\n", $t->stack + printf " signal:\t0x%lx\n", $t->signal + printf " sighand:\t0x%lx\n", $t->sighand + printf " mm:\t\t0x%lx\n", $t->mm + printf " files:\t0x%lx\n", $t->files + printf " fs:\t\t0x%lx\n", $t->fs + printf " state:\t0x%lx\n", $t->state + printf " flags:\t0x%x\n", $t->flags +end +document task + print informations on a task given its task_struct address +end + +define taskpid + set $nr = $arg0 + set $s = pidhash_shift + set $hash = $nr + (unsigned long)&init_pid_ns + set $n = $hash + + set $n <<= 18 + set $hash -= $n + set $n <<= 33 + set $hash -= $n + set $n <<= 3 + set $hash += $n + set $n <<= 3 + set $hash -= $n + set $n <<= 4 + set $hash += $n + set $n <<= 2 + set $hash += $n + + set $hash >>= (64 - $s) + + set $pos = pid_hash[$hash].first + while $pos != 0 + set $upid = (struct upid *)((char *)$pos - (char *)&((struct upid *)0)->pid_chain) + if $upid->nr == $nr && $upid->ns == &init_pid_ns + set $pid = (struct pid *)((char *)$upid - (char *)&(((struct pid *)0)->numbers[0])) + loop_break + end + + set $pos = $pos->next + end + + set $t = 0 + if $pos != 0 + set $t = $pid->tasks[0].first + if $t != 0 + set $t = (struct task_struct *)((char *)$t - (char *)&((struct task_struct *)0)->pids[0].node) + end + end + + if $t == 0 + printf "no such task\n" + else + task $t + end +end +document taskpid + print informations on a task given its pid +end diff --git a/Documentation/krg-gdbinit b/Documentation/krg-gdbinit new file mode 100644 index 0000000..f58c9b7 --- /dev/null +++ b/Documentation/krg-gdbinit @@ -0,0 +1,54 @@ +define offset_of + print &((struct $arg0 *) 0)->$arg1 +end + +define ps + set $inittask = &init_task + set $mthread = &init_task + set $tasks_off = (size_t)&((struct task_struct*) 0)->tasks + set $thread_group_off = (size_t)&((struct task_struct*) 0)->thread_group + set $cont = 1 + while $cont == 1 + set $athread = $mthread + set $subcont = 1 + while $subcont == 1 + printf "%d %s\n", $athread->pid, (char*)$athread->comm + if (int)$athread->thread_group.next == 0 + set $subcont = 0 + else + set $athread = (struct task_struct*)((char*)$athread->thread_group.next-$thread_group_off) + if $athread == $mthread + set $subcont = 0 + end + end + end + set $mthread = (struct task_struct*)((char*)$mthread->tasks.next-$tasks_off) + if $mthread == $inittask + set $cont = 0 + end + end +end +document ps + list all threads and processes in the system +end + +define dmesg + set $i = 0 + set $end_idx = (log_end - 1) & (log_buf_len - 1) + + while ($i < logged_chars) + set $idx = (log_end - 1 - logged_chars + $i) & (log_buf_len - 1) + + if ($idx + 100 <= $end_idx) || \ + ($end_idx <= $idx && $idx + 100 < log_buf_len) + printf "%.100s", &log_buf[$idx] + set $i = $i + 100 + else + printf "%c", log_buf[$idx] + set $i = $i + 1 + end + end +end +document dmesg + print the kernel ring buffer +end diff --git a/drivers/net/kgdboe.c b/drivers/net/kgdboe.c new file mode 100644 index 0000000..939797a --- /dev/null +++ b/drivers/net/kgdboe.c @@ -0,0 +1,286 @@ +/* + * drivers/net/kgdboe.c + * + * A network interface for GDB. + * Based upon 'gdbserial' by David Grothe <da...@gc...> + * and Scott Foehner <sfo...@en...> + * + * Maintainer: Jason Wessel <jas...@wi...> + * + * 2004 (c) Amit S. Kale <ami...@li...> + * 2004-2005 (c) MontaVista Software, Inc. + * 2005-2008 (c) Wind River Systems, Inc. + * + * Contributors at various stages not listed above: + * San Mehat <net...@bi...>, Robert Walsh <rj...@du...>, + * wangdi <wa...@cl...>, Matt Mackall <mp...@se...>, + * Pavel Machek <pa...@su...>, Jason Wessel <jas...@wi...> + * + * This file is licensed under the terms of the GNU General Public License + * version 2. This program is licensed "as is" without any warranty of any + * kind, whether express or implied. + */ + +#include <linux/kernel.h> +#include <linux/interrupt.h> +#include <linux/string.h> +#include <linux/kgdb.h> +#include <linux/netpoll.h> +#include <linux/init.h> + +#include <asm/atomic.h> + +#define IN_BUF_SIZE 512 /* power of 2, please */ +#define OUT_BUF_SIZE 30 /* We don't want to send too big of a packet. */ +#define MAX_CONFIG_LEN 256 + +static char in_buf[IN_BUF_SIZE], out_buf[OUT_BUF_SIZE]; +static int in_head, in_tail, out_count; +static atomic_t in_count; +/* 0 = unconfigured, 1 = netpoll options parsed, 2 = fully configured. */ +static int configured; +static struct kgdb_io local_kgdb_io_ops; +static int use_dynamic_mac; + +MODULE_DESCRIPTION("KGDB driver for network interfaces"); +MODULE_LICENSE("GPL"); +static char config[MAX_CONFIG_LEN]; +static struct kparam_string kps = { + .string = config, + .maxlen = MAX_CONFIG_LEN, +}; + +static void rx_hook(struct netpoll *np, int port, char *msg, int len, + struct sk_buff *skb) +{ + int i; + + np->remote_port = port; + + /* Copy the MAC address if we need to. */ + if (use_dynamic_mac) { + memcpy(np->remote_mac, eth_hdr(skb)->h_source, + sizeof(np->remote_mac)); + use_dynamic_mac = 0; + } + + /* + * This could be GDB trying to attach. But it could also be GDB + * finishing up a session, with kgdb_connected=0 but GDB sending + * an ACK for the final packet. To make sure we don't try and + * make a breakpoint when GDB is leaving, make sure that if + * !kgdb_connected the only len == 1 packet we allow is ^C. + */ + if (!kgdb_connected && (len != 1 || msg[0] == 3)) + kgdb_schedule_breakpoint(); + + for (i = 0; i < len; i++) { + if (msg[i] == 3) + kgdb_schedule_breakpoint(); + + if (atomic_read(&in_count) >= IN_BUF_SIZE) { + /* buffer overflow, clear it */ + in_head = 0; + in_tail = 0; + atomic_set(&in_count, 0); + break; + } + in_buf[in_head++] = msg[i]; + in_head &= (IN_BUF_SIZE - 1); + atomic_inc(&in_count); + } +} + +static struct netpoll np = { + .dev_name = "eth0", + .name = "kgdboe", + .rx_hook = rx_hook, + .local_port = 6443, + .remote_port = 6442, + .remote_mac = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, +}; + +static void eth_pre_exception_handler(void) +{ + /* Increment the module count when the debugger is active */ + if (!kgdb_connected) + try_module_get(THIS_MODULE); + netpoll_set_trap(1); +} + +static void eth_post_exception_handler(void) +{ + /* decrement the module count when the debugger detaches */ + if (!kgdb_connected) + module_put(THIS_MODULE); + netpoll_set_trap(0); +} + +static int eth_get_char(void) +{ + int chr; + + while (atomic_read(&in_count) == 0) + netpoll_poll(&np); + + chr = in_buf[in_tail++]; + in_tail &= (IN_BUF_SIZE - 1); + atomic_dec(&in_count); + return chr; +} + +static void eth_flush_buf(void) +{ + if (out_count && np.dev) { + netpoll_send_udp(&np, out_buf, out_count); + memset(out_buf, 0, sizeof(out_buf)); + out_count = 0; + } +} + +static void eth_put_char(u8 chr) +{ + out_buf[out_count++] = chr; + if (out_count == OUT_BUF_SIZE) + eth_flush_buf(); +} + +static int option_setup(char *opt) +{ + char opt_scratch[MAX_CONFIG_LEN]; + + configured = 0; + /* If we're being given a new configuration, copy it in. */ + if (opt != config) + strcpy(config, opt); + + if (opt[0] == '\0') + return 1; + + /* But work on a copy as netpoll_parse_options will eat it. */ + strcpy(opt_scratch, opt); + configured = !netpoll_parse_options(&np, opt_scratch); + + use_dynamic_mac = 1; + + return 0; +} +__setup("kgdboe=", option_setup); + +/* With our config string set by some means, configure kgdboe. */ +static int configure_kgdboe(void) +{ + if (option_setup(config)) + return 0; + + if (!configured) { + printk(KERN_ERR "kgdboe: configuration incorrect - kgdboe not " + "loaded.\n"); + printk(KERN_ERR " Usage: kgdboe=[src-port]@[src-ip]/[dev]," + "[tgt-port]@<tgt-ip>/<tgt-macaddr>\n"); + return -EINVAL; + } + + /* Bring it up. */ + if (netpoll_setup(&np)) { + printk(KERN_ERR "kgdboe: netpoll_setup failed kgdboe failed\n"); + return -EINVAL; + } + + if (kgdb_register_io_module(&local_kgdb_io_ops)) { + netpoll_cleanup(&np); + return -EINVAL; + } + + configured = 2; + + return 0; +} + +static int init_kgdboe(void) +{ + int ret; + + /* Already done? */ + if (configured == 2) + return 0; + + /* OK, go ahead and do it. */ + ret = configure_kgdboe(); + + if (configured == 2) + printk(KERN_INFO "kgdboe: debugging over ethernet enabled\n"); + + return ret; +} + +static void cleanup_kgdboe(void) +{ + netpoll_cleanup(&np); + configured = 0; + kgdb_unregister_io_module(&local_kgdb_io_ops); +} + +static int param_set_kgdboe_var(const char *kmessage, struct kernel_param *kp) +{ + char kmessage_save[MAX_CONFIG_LEN]; + int len = strlen(kmessage); + + if (len >= MAX_CONFIG_LEN) { + printk(KERN_ERR "kgdboc: config string too long\n"); + return -ENOSPC; + } + + if (kgdb_connected) { + printk(KERN_ERR "kgdboe: Cannot reconfigure while KGDB is " + "connected.\n"); + return 0; + } + + /* Start the reconfiguration process by saving the old string */ + strncpy(kmessage_save, config, sizeof(kmessage_save)); + + + /* Copy in the new param and strip out invalid characters so we + * can optionally specify the MAC. + */ + strcpy(config, kmessage); + /* Chop out \n char as a result of echo */ + if (config[len - 1] == '\n') + config[len - 1] = '\0'; + + len--; + while (len > 0 && (config[len] < ',' || config[len] > 'f')) { + config[len] = '\0'; + len--; + } + + if (configured == 2) { + cleanup_kgdboe(); + configured = 0; + } + if (config[0] == '\0') + return 0; + + configure_kgdboe(); + + if (configured != 2) + return -EINVAL; + + return 0; +} + +static struct kgdb_io local_kgdb_io_ops = { + .name = "kgdboe", + .read_char = eth_get_char, + .write_char = eth_put_char, + .flush = eth_flush_buf, + .pre_exception = eth_pre_exception_handler, + .post_exception = eth_post_exception_handler +}; + +module_init(init_kgdboe); +module_exit(cleanup_kgdboe); +module_param_call(kgdboe, param_set_kgdboe_var, param_get_string, &kps, 0644); +MODULE_PARM_DESC(kgdboe, "[src-port]@[src-ip]/[dev]," + "[tgt-port]@<tgt-ip>/<tgt-macaddr>"); commit d6e23fb32b8e9765d0d0afa11b4e9959938d872d Author: Marko Obrovac <mar...@in...> Date: Mon Oct 26 16:59:40 2009 +0000 Apply patches that will allow us to manipulate the kgdb stuff over ethernet, rather then over rs232 diff --git a/Documentation/DocBook/kgdb.tmpl b/Documentation/DocBook/kgdb.tmpl index 5cff41a..4010f59 100644 --- a/Documentation/DocBook/kgdb.tmpl +++ b/Documentation/DocBook/kgdb.tmpl @@ -216,6 +216,61 @@ </para> </sect2> </sect1> + <sect1 id="kgdboe"> + <title>Kernel parameter: kgdboe</title> + <para> + The term kgdboe is meant to stand for kgdb over ethernet. To use + kgdboe, the ethernet driver must have implemented the NETPOLL API, + and the kernel must be compiled with NETPOLL support. Also kgdboe + uses unicast udp. This means your debug host needs to be on the + same lan as the target system you wish to debug. + </para> + <para> + NOTE: Even though an ethernet driver may implement the NETPOLL API + it is possible that kgdboe will not work as a robust debug method. + Trying to debug the network stack for instance, would likely hang + the kernel. Also certain IRQ resources cannot be easily shared + between the normal kernel operation and the "polled context" where + the system is stopped by kgdb. Using kgdboe with preemptible IRQ + handlers for the device kgdboe is using is known to have with the + system hanging for instance. + </para> + <para> + The kgdboe parameter string is as follows: + <constant>kgdboe=[src-port]@<src-ip>/[dev],[tgt-port]@<tgt-ip>/[tgt-macaddr]</constant> + where: + <itemizedlist> + <listitem><para>src-port (optional): source for UDP packets (defaults to <constant>6443</constant>)</para></listitem> + <listitem><para>src-ip (optional unless from boot): source IP to use (interface address)</para></listitem> + <listitem><para>dev (optional): network interface (<constant>eth0</constant>)</para></listitem> + <listitem><para>tgt-port (optional): port GDB will use (defaults to <constant>6442</constant>)</para></listitem> + <listitem><para>tgt-ip: IP address GDB will be connecting from</para></listitem> + <listitem><para>tgt-macaddr (optional): ethernet MAC address for logging agent (default is broadcast)</para></listitem> + </itemizedlist> + </para> + <para> + What follows are several examples of how to configure kgdboe in various ways. + <itemizedlist> + <listitem><para>From boot with target ip = 10.0.2.15 and debug host ip = 10.0.2.2</para> + <para><constant>kgdboe=@10.0.2.15/,@10.0.2.2/</constant></para> + </listitem> + <listitem><para>From boot using eth1, with target ip = 10.0.2.15 and debug host ip = 10.0.2.2</para> + <para><constant>kgdboe=@10.0.2.15/eth1,@10.0.2.2/</constant></para> + </listitem> + <listitem><para>As a module, with target ip = 10.0.2.15 and debug host ip = 10.0.2.2. NOTE: The src ip is only required when booting with kgdboe enabled</para> + <para><constant>kgdboe=@/,@10.0.2.2/</constant></para> + </listitem> + </itemizedlist> + </para> + <para> + You can also reconfigure kgdboe dynamically at run time as follows: + <itemizedlist> + <listitem> + <para><constant>echo "@/,@10.0.2.2/" > /sys/module/kgdboe/paramters/kgdboe</constant></para> + </listitem> + </itemizedlist> + </para> + </sect1> <sect1 id="kgdbcon"> <title>Kernel parameter: kgdbcon</title> <para> @@ -240,7 +295,7 @@ </para> <para> IMPORTANT NOTE: Using this option with kgdb over the console - (kgdboc) is not supported. + (kgdboc) or kgdb over ethernet (kgdboe) is not supported. </para> </sect1> </chapter> @@ -273,6 +328,13 @@ (gdb) target remote 192.168.2.2:2012 </programlisting> <para> + Example (kgdb over ethernet): + </para> + <programlisting> + % gdb ./vmlinux + (gdb) target remote udp:192.168.2.2:6443 + </programlisting> + <para> Once connected, you can debug a kernel the way you would debug an application program. </para> diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index fd5cac0..4e36df0 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -1068,6 +1068,13 @@ and is between 256 and 4096 characters. It is defined in the file (only serial suported for now) Format: <serial_device>[,baud] + kgdboe= [HW] Setup the local ip information and host ip + information when the network driver supports + NETPOLL and kgdboe is configured as a built in. + Options are: + [src-port]@<src-ip>/[dev],[tgt-port]@<tgt-ip>/<tgt-mac> + IE: kgdboe=@10.0.1.2/,@10.0.0.1.3/ + kmac= [MIPS] korina ethernet MAC address. Configure the RouterBoard 532 series on-chip Ethernet adapter MAC address. diff --git a/drivers/net/Makefile b/drivers/net/Makefile index a1c25cb..2f80256 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -262,6 +262,7 @@ obj-$(CONFIG_ETRAX_ETHERNET) += cris/ obj-$(CONFIG_ENP2611_MSF_NET) += ixp2000/ obj-$(CONFIG_NETCONSOLE) += netconsole.o +obj-$(CONFIG_KGDBOE) += kgdboe.o obj-$(CONFIG_FS_ENET) += fs_enet/ diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index 6adcc29..8fdd3cb 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h @@ -279,5 +279,6 @@ extern int kgdb_nmicallback(int cpu, void *regs); extern int kgdb_single_step; extern atomic_t kgdb_active; +extern void kgdb_schedule_breakpoint(void); #endif /* _KGDB_H_ */ diff --git a/include/linux/netpoll.h b/include/linux/netpoll.h index 2524267..fec2dd2 100644 --- a/include/linux/netpoll.h +++ b/include/linux/netpoll.h @@ -16,7 +16,7 @@ struct netpoll { struct net_device *dev; char dev_name[IFNAMSIZ]; const char *name; - void (*rx_hook)(struct netpoll *, int, char *, int); + void (*rx_hook)(struct netpoll *, int, char *, int, struct sk_buff *); __be32 local_ip, remote_ip; u16 local_port, remote_port; diff --git a/kernel/kgdb.c b/kernel/kgdb.c index 9147a31..e39f886 100644 --- a/kernel/kgdb.c +++ b/kernel/kgdb.c @@ -123,6 +123,7 @@ atomic_t kgdb_active = ATOMIC_INIT(-1); */ static atomic_t passive_cpu_wait[NR_CPUS]; static atomic_t cpu_in_kgdb[NR_CPUS]; +static atomic_t kgdb_break_tasklet_var; atomic_t kgdb_setting_breakpoint; struct task_struct *kgdb_usethread; @@ -828,6 +829,12 @@ static int kgdb_io_ready(int print_wait) * where KGDB is communicating with an external debugger */ +/* Handle the '!' extended mode request */ +static void gdb_cmd_extended(struct kgdb_state *ks) +{ + strcpy(remcom_out_buffer, "OK"); +} + /* Handle the '?' status packets */ static void gdb_cmd_status(struct kgdb_state *ks) { @@ -1251,6 +1258,9 @@ static int gdb_serial_stub(struct kgdb_state *ks) get_packet(remcom_in_buffer); switch (remcom_in_buffer[0]) { + case '!': /* extended mode */ + gdb_cmd_extended(ks); + break; case '?': /* gdbserial status */ gdb_cmd_status(ks); break; @@ -1588,11 +1598,49 @@ static struct sysrq_key_op sysrq_gdb_op = { }; #endif +static int +kgdb_notify_reboot(struct notifier_block *this, unsigned long code, void *x) +{ + unsigned long flags; + + if (!kgdb_connected) + return 0; + + if (code == SYS_RESTART || code == SYS_HALT || code == SYS_POWER_OFF) { + local_irq_save(flags); + if (kgdb_io_ops->write_char) { + /* Do not use put_packet to avoid hanging + * in case the attached debugger disappeared + * or does not respond timely. + */ + kgdb_io_ops->write_char('$'); + kgdb_io_ops->write_char('X'); + kgdb_io_ops->write_char('0'); + kgdb_io_ops->write_char('0'); + kgdb_io_ops->write_char('#'); + kgdb_io_ops->write_char('b'); + kgdb_io_ops->write_char('8'); + if (kgdb_io_ops->flush) + kgdb_io_ops->flush(); + } + kgdb_connected = 0; + local_irq_restore(flags); + } + return NOTIFY_DONE; +} + +static struct notifier_block kgdb_reboot_notifier = { + .notifier_call = kgdb_notify_reboot, + .next = NULL, + .priority = INT_MAX, +}; + static void kgdb_register_callbacks(void) { if (!kgdb_io_module_registered) { kgdb_io_module_registered = 1; kgdb_arch_init(); + register_reboot_notifier(&kgdb_reboot_notifier); #ifdef CONFIG_MAGIC_SYSRQ register_sysrq_key('g', &sysrq_gdb_op); #endif @@ -1611,6 +1659,7 @@ static void kgdb_unregister_callbacks(void) * break exceptions at the time. */ if (kgdb_io_module_registered) { + unregister_reboot_notifier(&kgdb_reboot_notifier); kgdb_io_module_registered = 0; kgdb_arch_exit(); #ifdef CONFIG_MAGIC_SYSRQ @@ -1623,6 +1672,31 @@ static void kgdb_unregister_callbacks(void) } } +/* + * There are times a tasklet needs to be used vs a compiled in in + * break point so as to cause an exception outside a kgdb I/O module, + * such as is the case with kgdboe, where calling a breakpoint in the + * I/O driver itself would be fatal. + */ +static void kgdb_tasklet_bpt(unsigned long ing) +{ + kgdb_breakpoint(); + atomic_set(&kgdb_break_tasklet_var, 0); +} + +static DECLARE_TASKLET(kgdb_tasklet_breakpoint, kgdb_tasklet_bpt, 0); + +void kgdb_schedule_breakpoint(void) +{ + if (atomic_read(&kgdb_break_tasklet_var) || + atomic_read(&kgdb_active) != -1 || + atomic_read(&kgdb_setting_breakpoint)) + return; + atomic_inc(&kgdb_break_tasklet_var); + tasklet_schedule(&kgdb_tasklet_breakpoint); +} +EXPORT_SYMBOL_GPL(kgdb_schedule_breakpoint); + static void kgdb_initial_breakpoint(void) { kgdb_break_asap = 0; diff --git a/lib/Kconfig.kgdb b/lib/Kconfig.kgdb index 9b5d1d7..fe5010b 100644 --- a/lib/Kconfig.kgdb +++ b/lib/Kconfig.kgdb @@ -27,6 +27,17 @@ config KGDB_SERIAL_CONSOLE Share a serial console with kgdb. Sysrq-g must be used to break in initially. +config KGDBOE + tristate "KGDB: On ethernet" + depends on KGDB + select NETPOLL + select NETPOLL_TRAP + help + Uses the NETPOLL API to communicate with the host GDB via UDP. + In order for this to work, the ethernet interface specified must + support the NETPOLL API, and this must be initialized at boot. + See the documentation for syntax. + config KGDB_TESTS bool "KGDB: internal test suite" default n diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 64f51ee..f703332 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -546,7 +546,8 @@ int __netpoll_rx(struct sk_buff *skb) np->rx_hook(np, ntohs(uh->source), (char *)(uh+1), - ulen - sizeof(struct udphdr)); + ulen - sizeof(struct udphdr), + skb); kfree_skb(skb); return 1; commit a19e999ecf51d928bb1cab259ca1534eeca731b4 Author: Marko Obrovac <mar...@in...> Date: Mon Oct 26 16:55:52 2009 +0000 Fixed a minor semantic bug which prevented us from seeing any debug from kDFS diff --git a/fs/kdfs/debug_kdfs.h b/fs/kdfs/debug_kdfs.h index 51bf3b0..a5a377c 100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@ -40,7 +40,7 @@ #else # define DEBUG(level, format, args...) \ do { \ - if (KDFS_DEBUG_LEVEL <= level || level == DBG_PANIC) { \ + if (KDFS_DEBUG_LEVEL >= level || level == DBG_PANIC) { \ pr_debug("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ current->pid) ; \ pr_debug(format, ## args) ; \ ----------------------------------------------------------------------- Summary of changes: Documentation/DocBook/kgdb.tmpl | 64 ++++++++- Documentation/kernel-parameters.txt | 7 + Documentation/kgdb/kgdboe-reboot | 11 ++ Documentation/kgdb/krg-gdbinit | 122 +++++++++++++++ Documentation/krg-gdbinit | 54 +++++++ drivers/net/Makefile | 1 + drivers/net/kgdboe.c | 286 +++++++++++++++++++++++++++++++++++ fs/kdfs/debug_kdfs.h | 2 +- include/linux/kgdb.h | 1 + include/linux/netpoll.h | 2 +- kernel/kgdb.c | 74 +++++++++ lib/Kconfig.kgdb | 11 ++ net/core/netpoll.c | 3 +- 13 files changed, 634 insertions(+), 4 deletions(-) create mode 100755 Documentation/kgdb/kgdboe-reboot create mode 100644 Documentation/kgdb/krg-gdbinit create mode 100644 Documentation/krg-gdbinit create mode 100644 drivers/net/kgdboe.c hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2009-10-25 11:56:53
|
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 "UNNAMED PROJECT". The branch, master has been updated via 8b361814e9b8a1a41b3fbddaf91b4cdea4115220 (commit) from 86f5386d9026558d5a064668665183a206e35712 (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 8b361814e9b8a1a41b3fbddaf91b4cdea4115220 Author: Marko Obrovac <mar...@in...> Date: Sun Oct 25 11:52:01 2009 +0000 Added the netclient console to the tools directory. NOTE: the patch supplied with the netconsole.tar.gz archive is no longer applicable as the header include/linux/kdb_netconsole.h does not exist any more, meaning we're no longer able to kdb from the netclient utility. Also added netclient.c to the makefile so it compiles and installs together with the other tools. Fixed a semantic typo: mkfs_kdfs.c should be installed as mkfs.kdfs and not mkfs_kdfs diff --git a/scripts/Makefile.in b/scripts/Makefile.in index b55c34b..36284b0 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11 from Makefile.am. +# Makefile.in generated by automake 1.10.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -16,9 +15,8 @@ @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ -pkglibexecdir = $(libexecdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -43,7 +41,6 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -59,47 +56,45 @@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIST_ID = @DIST_ID@ DIST_RELEASE = @DIST_RELEASE@ DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -FGREP = @FGREP@ +F77 = @F77@ +FFLAGS = @FFLAGS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ -NM = @NM@ NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -113,7 +108,8 @@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -151,7 +147,6 @@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lsb = @lsb@ -lt_ECHO = @lt_ECHO@ ltpbase = @ltpbase@ mandir = @mandir@ mkdir_p = @mkdir_p@ @@ -170,7 +165,6 @@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ -top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ vanilla_linux_version = @vanilla_linux_version@ @@ -209,14 +203,14 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --gnu scripts/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu scripts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -234,7 +228,6 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo @@ -264,17 +257,13 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done @@ -305,7 +294,6 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -324,8 +312,6 @@ dvi-am: html: html-am -html-am: - info: info-am info-am: @@ -334,28 +320,18 @@ install-data-am: install-data-local install-dvi: install-dvi-am -install-dvi-am: - install-exec-am: install-html: install-html-am -install-html-am: - install-info: install-info-am -install-info-am: - install-man: install-pdf: install-pdf-am -install-pdf-am: - install-ps: install-ps-am -install-ps-am: - installcheck-am: maintainer-clean: maintainer-clean-am @@ -405,7 +381,6 @@ uninstall-local: dist-hook: rm -rf $(find $(distdir) -name '*~') - # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/tools/Makefile.am b/tools/Makefile.am index 14a786b..4c48a7d 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -11,8 +11,8 @@ sbindir=$(exec-prefix)/sbin dist_bin_SCRIPTS = krg_legacy_scheduler krgboot_helper krginit_helper -bin_PROGRAMS = migrate checkpoint restart krgadm krgcapset krgcr-run krgboot krginit ipccheckpoint ipcrestart -sbin_PROGRAMS = mkfs_kdfs +bin_PROGRAMS = migrate checkpoint restart krgadm krgcapset krgcr-run krgboot krginit ipccheckpoint ipcrestart netclient +sbin_PROGRAMS = mkfs.kdfs INCLUDES = -I@top_srcdir@/libs/include LDADD = @top_builddir@/libs/libkerrighed/libkerrighed.la @top_builddir@/libs/libkrgcb/libkrgcb.la @@ -28,6 +28,7 @@ krginit_SOURCES = krginit.c ipccheckpoint_SOURCES = ipccheckpoint.c ipcrestart_SOURCES = ipcrestart.c mkfs_kdfs_SOURCES = mkfs_kdfs.c +netclient_SOURCES = netclient.c EXTRA_DIST = krginit_helper.conf ----------------------------------------------------------------------- Summary of changes: scripts/Makefile.in | 67 ++++++++++++++++----------------------------------- tools/Makefile.am | 5 ++- 2 files changed, 24 insertions(+), 48 deletions(-) hooks/post-receive -- UNNAMED PROJECT |
From: Marko O. <d0...@us...> - 2009-10-23 16:14:13
|
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, master has been updated via 7f693180912e08278e6f09730fb8a33b12bd8d37 (commit) via e30da12106f8c6a23cd1e6be028d3a64877213d8 (commit) via 9bd901dd87d40089430b5215b9370a91fe5f9a3f (commit) via d98ddf3f65bcd107c0f0edc09f5fcef9e49a03ca (commit) from 9c1e8c28ec4f470c34f4c3754096311e1e1d0067 (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 7f693180912e08278e6f09730fb8a33b12bd8d37 Merge: e30da12 9c1e8c2 Author: Marko Obrovac <mar...@in...> Date: Wed Oct 21 12:36:56 2009 +0000 Merge branch 'master' of ssh://kdfs.git.sourceforge.net/gitroot/kdfs/kernel ----------------------------------------------------------------------- Summary of changes: hooks/post-receive -- kdfs |
From: Marko O. <d0...@us...> - 2009-10-23 16:14:05
|
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 9567af3f521aeecb16c274127db8e39ef9527c48 (commit) via d82e0d38f48cb0ff083354a768029cf92b8018d7 (commit) via bfd7d615a19bbd0d0524784462261f068cb520b2 (commit) via 77085c1bc738310b68f2eb81e7dd682a84ebb944 (commit) via 3e68210e5a57162eb213b7bfad04f8ac53a04f2f (commit) via 925cb2ee96c14f8efbcd91f9bec0f1b3d0a1c5cd (commit) via 5cf9481b874f6096355099576c7fb1f46a3f0a77 (commit) via dcd9c702dec76ab46f4ec5d0ac20b22460aa2256 (commit) via 12b0ff33665490c2ccd757991832753168bae7b9 (commit) via 78fd05d7e0ef29510250bb63f387fe212c2c217b (commit) via dad62b458d0bce44981adee29a5e540eb2907847 (commit) via 448c10668045e7d217149e7bc7a1725730202e5e (commit) via 7795b4846f5cc77bca954e6f8f207dde436ecbb9 (commit) via 9f15d3b58f3f75135f3cf3e88e0094bf75d80c38 (commit) via d88702c37c8cb0c089fa2d839920daa1270bf39a (commit) via 0bf1ac82724db2090d893fbdef7a49a1ebc07ca6 (commit) via a657d43db944e313e4b5975e49c17e0981024f82 (commit) via 77cc1932ed4ca5bc6708e4bbbfa5753fe72da878 (commit) via 629ed1e4c313c1e20b00b5fdc6d5ce0edc635571 (commit) via 42a1a88931fcf91b953109de529a69021bf9f777 (commit) via 7b412f2abfd2b8ae9a13b2cab303167bfd32cd80 (commit) via e30da12106f8c6a23cd1e6be028d3a64877213d8 (commit) via 9bd901dd87d40089430b5215b9370a91fe5f9a3f (commit) via d98ddf3f65bcd107c0f0edc09f5fcef9e49a03ca (commit) from 5d69182d2de672486e8e9a5da934a8dced6996c5 (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 9567af3f521aeecb16c274127db8e39ef9527c48 Author: Marko Obrovac <mar...@in...> Date: Fri Oct 23 16:08:00 2009 +0000 Init kdfs upon kerrighed init. Note: this is "the dirty way". We should try to load it independently (as a module or any other suitable fashion) diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index da2f32e..1c2c87b 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -1483,7 +1483,7 @@ static struct file_system_type kdfs_fs_type = { .kill_sb = kdfs_kill_sb, /* Remove kDFS super block */ }; -int init_kdfs() +int init_kdfs(void) { struct proc_dir_entry *p; int err; @@ -1491,6 +1491,8 @@ int init_kdfs() // TODO Do I need this unique id ? //init_unique_id_root (&file_struct_unique_id_root); + + printk("KDFS KDFS KDFS KDFS KDFS KDFS KDFS KDFS !!!!!!!!!!!!!!!!!!!!!!!"); /* Register the kDFS File System */ err = register_filesystem(&kdfs_fs_type); @@ -1567,6 +1569,7 @@ int init_kdfs() printk("Init Kernel Distributed File System : done\n"); return 0; + } /* TODO: Sync all dirty blocks? */ @@ -2111,3 +2114,4 @@ struct iolinker_struct superblock_io_linker = { .remove_object = kdfs_iol_sb_remove, .sync_object = kdfs_iol_sb_sync_object, }; + diff --git a/kerrighed/hotplug/krginit.c b/kerrighed/hotplug/krginit.c index 02b1cc7..5d9afde 100644 --- a/kerrighed/hotplug/krginit.c +++ b/kerrighed/hotplug/krginit.c @@ -20,6 +20,10 @@ #ifdef CONFIG_KRG_HOTPLUG #include <kerrighed/hotplug.h> #endif +#ifdef CONFIG_KDFS_FS +int init_kdfs(void); +void cleanup_kdfs(void); +#endif void init_node_discovering(void); @@ -409,8 +413,17 @@ int init_kerrighed_upper_layers(void) goto err_sched; #endif +#ifdef CONFIG_KDFS_FS + if (init_kdfs()) + goto err_kdfs; +#endif + return 0; +#ifdef CONFIG_KDFS_FS + cleanup_kdfs(); + err_kdfs: +#endif #ifdef CONFIG_KRG_SCHED cleanup_scheduler(); err_sched: commit d82e0d38f48cb0ff083354a768029cf92b8018d7 Merge: bfd7d61 5d69182 Author: Marko Obrovac <mar...@in...> Date: Wed Oct 21 12:37:16 2009 +0000 Merge branch 'make_kdfs_compile' of ssh://kdfs.git.sourceforge.net/gitroot/kdfs/kernel into make_kdfs_compile commit bfd7d615a19bbd0d0524784462261f068cb520b2 Author: Marko Obrovac <mar...@in...> Date: Tue Oct 20 14:52:38 2009 +0000 [FIX] Change the makefile to conform to new compiling rules (kdfs is now built in the kernel, not a module) diff --git a/fs/kdfs/Makefile b/fs/kdfs/Makefile index ca9d271..f59b146 100644 --- a/fs/kdfs/Makefile +++ b/fs/kdfs/Makefile @@ -1,7 +1 @@ -obj-m += krgbuiltin.o - - -krgbuiltin-objs := physical_fs.o super.o inode.o dir.o file.o address_space.o extent.o cow.o -krgbuiltin-objs += $(krgbuiltin-y) - -EXTRA_CFLAGS += -I$(M) +obj-y := physical_fs.o super.o inode.o dir.o file.o address_space.o extent.o cow.o commit 77085c1bc738310b68f2eb81e7dd682a84ebb944 Author: Marko Obrovac <mar...@in...> Date: Tue Oct 20 14:51:37 2009 +0000 [FIX] fixed name clashes with the kerrighed functions (and marked all the internal functions as internal) diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index 0ae67a8..c299877 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -24,7 +24,7 @@ #define KDFS_PART "KDFS - Native File System Accesses" -void chroot_to_physical_root(struct path *saved_root) +void __change_to_physical_root(struct path *saved_root) { write_lock(¤t->fs->lock); *saved_root = current->fs->root; @@ -32,7 +32,7 @@ void chroot_to_physical_root(struct path *saved_root) write_unlock(¤t->fs->lock); } -void chroot_to_saved_root(const struct path *saved_root) +void __change_to_saved_root(const struct path *saved_root) { struct path root; @@ -43,7 +43,7 @@ void chroot_to_saved_root(const struct path *saved_root) path_put(&root); } -int change_creds(struct cred **overridden, const struct cred **old, +int __change_creds(struct cred **overridden, const struct cred **old, uid_t fsuid, gid_t fsgid) { *overridden = prepare_creds(); @@ -57,7 +57,7 @@ int change_creds(struct cred **overridden, const struct cred **old, return 0; } -void revert_old_creds(struct cred *overridden, const struct cred *old) +void __revert_old_creds(struct cred *overridden, const struct cred *old) { revert_creds(old); put_cred(overridden); @@ -90,11 +90,11 @@ long create_phys_dir(const char *pathname, DEBUG(DBG_INFO, "Create dir %s\n", pathname); - error = change_creds(&overridden_creds, &old_creds, uid, gid); + error = __change_creds(&overridden_creds, &old_creds, uid, gid); if (error) goto out; - chroot_to_physical_root(&saved_path); + __change_to_physical_root(&saved_path); error = path_lookup(pathname, LOOKUP_PARENT, &nd); if (error) @@ -124,8 +124,8 @@ long create_phys_dir(const char *pathname, path_put(&nd.path); out: - chroot_to_saved_root(&saved_path); - revert_old_creds(overridden_creds, old_creds); + __change_to_saved_root(&saved_path); + __revert_old_creds(overridden_creds, old_creds); return error; } @@ -154,11 +154,11 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) DEBUG(DBG_TRACE, "Remove dir %s\n", pathname); - res = change_creds(&overridden_creds, &old_creds, uid, gid); + res = __change_creds(&overridden_creds, &old_creds, uid, gid); if (res) goto out; - chroot_to_physical_root(&saved_path); + __change_to_physical_root(&saved_path); file = filp_open(pathname, O_LARGEFILE|O_RDONLY, 0644); if (IS_ERR(file) && PTR_ERR(file) == -ENOENT) { @@ -184,8 +184,8 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) filp_close(file,current->files); out: - chroot_to_saved_root(&saved_path); - revert_old_creds(overridden_creds, old_creds); + __change_to_saved_root(&saved_path); + __revert_old_creds(overridden_creds, old_creds); return res; } @@ -213,11 +213,11 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ const struct cred *old_creds; struct cred *overridden_creds; - error = change_creds(&overridden_creds, &old_creds, uid, gid); + error = __change_creds(&overridden_creds, &old_creds, uid, gid); if (error) goto out; - chroot_to_physical_root(&saved_path); + __change_to_physical_root(&saved_path); DEBUG(DBG_INFO, "Open physical file %s with flags 0x%08x - mode %o\n", @@ -230,8 +230,8 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ DEBUG(DBG_INFO, "Open physical file %s done : %p\n", filename, file); out: - chroot_to_saved_root(&saved_path); - revert_old_creds(overridden_creds, old_creds); + __change_to_saved_root(&saved_path); + __revert_old_creds(overridden_creds, old_creds); if (error) file = ERR_PTR(error); @@ -417,11 +417,11 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) DEBUG(DBG_TRACE, "Remove file %s\n", filename); - res = change_creds(&overridden_creds, &old_creds, uid, gid); + res = __change_creds(&overridden_creds, &old_creds, uid, gid); if (res) goto out; - chroot_to_physical_root(&saved_path); + __change_to_physical_root(&saved_path); file = filp_open(filename, O_LARGEFILE|O_RDONLY, 0644); @@ -448,8 +448,8 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) DEBUG(DBG_INFO, "After vfs_unlink res = %d\n", res); out: - chroot_to_saved_root(&saved_path); - revert_old_creds(overridden_creds, old_creds); + __change_to_saved_root(&saved_path); + __revert_old_creds(overridden_creds, old_creds); return res; } commit 3e68210e5a57162eb213b7bfad04f8ac53a04f2f Author: Marko Obrovac <mar...@in...> Date: Tue Oct 20 13:38:16 2009 +0000 [FIX] rename include dir from cntr to kddm diff --git a/fs/kdfs/cow.c b/fs/kdfs/cow.c index 862277e..478b814 100644 --- a/fs/kdfs/cow.c +++ b/fs/kdfs/cow.c @@ -10,7 +10,7 @@ #include <linux/pagemap.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "inode.h" #include "address_space.h" diff --git a/fs/kdfs/extent.c b/fs/kdfs/extent.c index b9d0556..4d142e7 100644 --- a/fs/kdfs/extent.c +++ b/fs/kdfs/extent.c @@ -10,7 +10,7 @@ #include <linux/pagemap.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "inode.h" #include "address_space.h" commit 925cb2ee96c14f8efbcd91f9bec0f1b3d0a1c5cd Author: alebre <alebre@debian.localdomain> Date: Tue Oct 20 14:56:48 2009 +0200 [REFACTORING] address_space.c (begin/end write and SetPageLocked) diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index a98c5ab..5b60704 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -96,20 +96,22 @@ int kdfs_readpage(struct file *file, struct page *page) return 0; } +/* TODO Suggested by Adrien for xxxx + * Priority : 3 + * Merge new kdfs_write_begin function with the older kdfs_prepare_write. + */ /* * page has been found or allocated from/in the page cache and locked * However, the data should be pre-read from the storage * Thus, one first-touch can happen. ISSUE, put data in the same page */ -int kdfs_prepare_write (struct file *file, - struct page *page, - unsigned offset, - unsigned _to) +int __kdfs_prepare_write (struct file *file, struct page *page, + unsigned offset, unsigned _to) { struct kdfs_page *k_page = NULL; struct kdfs_inode *k_inode = NULL; - DEBUG (DBG_INFO, "Prepare_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", + DEBUG (DBG_INFO, "begin_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", file->f_dentry->d_name.name, file->f_dentry->d_inode->i_ino, page->index, offset, _to, page_count(page), page->mapping); BUG_ON (page->mapping == NULL); @@ -133,8 +135,36 @@ int kdfs_prepare_write (struct file *file, return 0; } -// TODO cf. http://www.mail-archive.com/git...@vg.../msg03083.html -int kdfs_commit_write(struct file *file, +int kdfs_write_begin (struct file *file, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, + struct page **pagep, void **fsdata) +{ + struct page *page; + pgoff_t index; + unsigned from; + + index = pos >> PAGE_CACHE_SHIFT; + from = pos & (PAGE_CACHE_SIZE - 1); + + page = grab_cache_page_write_begin(mapping, index, flags); + if (!page) + return -ENOMEM; + + *pagep = page; + return __kdfs_prepare_write(file, page, from, from+len); +} + + +/* TODO Suggested by Adrien for xxxx + * Priority : 3 + * Merge new kdfs_write_begin function with the older kdfs_prepare_write. + */ +/* TODO Suggested by Adrien for Adrien, + * an old TODO, ... probably just remove it ;) + * cf. http://www.mail-archive.com/git...@vg.../msg03083.html + */ +int __kdfs_commit_write(struct file *file, struct page *page, unsigned offset, unsigned _to) @@ -170,6 +200,30 @@ int kdfs_commit_write(struct file *file, return 0; } +int kdfs_write_end(struct file *file, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata) +{ + unsigned from = pos & (PAGE_CACHE_SIZE - 1); + + /* zero the stale part of the page if we did a short copy */ + if (copied < len) { + void *kaddr = kmap_atomic(page, KM_USER0); + memset(kaddr + from + copied, 0, len - copied); + flush_dcache_page(page); + kunmap_atomic(kaddr, KM_USER0); + } + + __kdfs_commit_write(file, page, from, from+copied); + + unlock_page(page); + page_cache_release(page); + + return copied; +} + + int kdfs_writepage(struct page *page, struct writeback_control *wbc) { @@ -240,9 +294,9 @@ int kdfs_releasepage(struct page *page, gfp_t mask) } struct address_space_operations kdfs_aops = { - .commit_write = kdfs_commit_write, + .write_begin = kdfs_write_begin, + .write_end = kdfs_write_end, .invalidatepage = kdfs_invalidatepage, - .prepare_write = kdfs_prepare_write, .readpage = kdfs_readpage, .releasepage = kdfs_releasepage, .writepage = kdfs_writepage, @@ -612,7 +666,7 @@ int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t obji struct kdfs_page *k_page = (struct kdfs_page *)objEntry->object; PRINT_FUNCTION_NAME; - SetPageLocked(k_page->page); + trylock_page(k_page->page); DEBUG(DBG_ALERT, "Page count before =%d\n", page_count(k_page->page)); remove_from_page_cache(k_page->page); ClearPagePrivate(k_page->page); @@ -734,7 +788,7 @@ int kdfs_iol_page_remove(void *object, struct kddm_set *set, objid_t objid) * so we need to remove the page from the cache by hand, because * we are not called by the VFS */ - SetPageLocked(k_page->page); + trylock_page(k_page->page); DEBUG(DBG_ALERT, "Page count before =%d\n", page_count(k_page->page)); remove_from_page_cache(k_page->page); ClearPagePrivate(k_page->page); diff --git a/fs/kdfs/address_space.h b/fs/kdfs/address_space.h index 68ca007..5a7ac7a 100644 --- a/fs/kdfs/address_space.h +++ b/fs/kdfs/address_space.h @@ -9,6 +9,7 @@ * @maintainer Adrien Lebre * * Copyright (C) 2006-2007, XtreemOS Consortium. + * Copyright (C) 2008-20xx, XtreemOS Consortium, Ascola Research Group. */ #ifndef __KDFS_ADDR_SPACE__ diff --git a/fs/kdfs/dir.c b/fs/kdfs/dir.c index 3c5a67a..6eb9439 100644 --- a/fs/kdfs/dir.c +++ b/fs/kdfs/dir.c @@ -595,7 +595,7 @@ int kdfs_make_empty(struct kdfs_inode *k_pdir, struct kdfs_inode *k_dir) */ int kdfs_dir_empty(struct kdfs_inode *k_dir) { - DEBUG(DBG_INFO, "Directory size: %llu empty if: %d\n", k_dir->inode->i_size, KDFS_DIRENT_SIZE * 2); + DEBUG(DBG_INFO, "Directory size: %llu empty if: %ld\n", k_dir->inode->i_size, KDFS_DIRENT_SIZE * 2); if (k_dir->inode->i_size > KDFS_DIRENT_SIZE * 2) return 0; return 1; diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 10ec71a..f126cb8 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -180,8 +180,8 @@ struct kdfs_inode *__kdfs_mknod(struct kdfs_inode *k_pdir, break; } - k_nnod->inode->i_uid = current->fsuid; - k_nnod->inode->i_gid = current->fsgid; + k_nnod->inode->i_uid = current_fsuid(); + k_nnod->inode->i_gid = current_fsgid(); if (k_pdir->inode->i_mode & S_ISGID) { k_nnod->inode->i_gid = k_pdir->inode->i_gid; commit 5cf9481b874f6096355099576c7fb1f46a3f0a77 Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 13:38:44 2009 +0200 [FIX] Correct the code using read_inode which is not in the new kernels. Closed ticket #7 diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 0460ec1..a98c5ab 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -825,7 +825,7 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) iput(inode); } else { DEBUG(DBG_INFO, "K_mapping will be retrieve from iget\n"); - inode = iget(k_sb->sb, content_data->ino); + inode = kdfs_getinode(k_sb->sb, content_data->ino); content_data->k_mapping = inode->i_mapping; } if (!content_data->k_mapping) diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 3cf9616..10ec71a 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -1142,7 +1142,7 @@ int kdfs_iol_inode_first_touch(kddm_obj_t *objEntry, if (k_inode->inode) iput(k_inode->inode); else - k_inode->inode = iget(k_sb->sb, objid); + k_inode->inode = kdfs_getinode(k_sb->sb, objid); k_inode->flags = K_INODE_OK; } diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 045c077..da2f32e 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -921,14 +921,14 @@ int kdfs_statfs(struct dentry *dfs, struct kstatfs *buf) * @param inode the VFS inode * */ -void kdfs_read_inode(struct inode *inode) +struct inode *kdfs_getinode(struct super_block *sb, unsigned long ino) { + struct inode *inode = NULL; struct file *file = NULL; char *phys_filename = NULL; struct kdfs_physical_inode phys_inode; PRINT_FUNCTION_NAME ; - ASSERT (inode != NULL) ; /* * TODO PRIORITY 2: Adrien @@ -936,6 +936,11 @@ void kdfs_read_inode(struct inode *inode) * For the moment, the workaround consists in using sb->s_fs_info to * reach it. It is probably not the best and cleanest solution. */ + inode = iget_locked(sb, ino); + if (!inode) + return ERR_PTR(-ENOMEM); + if (!(inode->i_state & I_NEW)) + return inode; /* Retrieve the inode meta file */ phys_filename = kmalloc(PATH_MAX, GFP_KERNEL); @@ -975,7 +980,9 @@ void kdfs_read_inode(struct inode *inode) inode->i_ino, ((struct kdfs_super_block*)inode->i_sb->s_fs_info)->k_opt->part_name); kfree(phys_filename); + unlock_new_inode(inode); PRINT_FUNCTION_EXIT; + return inode; } /* @@ -1254,7 +1261,6 @@ out: static struct super_operations kdfs_sops = { .delete_inode = kdfs_delete_inode, .drop_inode = kdfs_drop_inode, - .read_inode = kdfs_read_inode, .show_options = kdfs_show_options, .statfs = kdfs_statfs, .sync_fs = kdfs_sync_fs, diff --git a/fs/kdfs/super.h b/fs/kdfs/super.h index 36fc1f0..f480a74 100644 --- a/fs/kdfs/super.h +++ b/fs/kdfs/super.h @@ -216,6 +216,7 @@ void cleanup_kdfs(void); void kdfs_getphysicalpath(struct kdfs_super_block *k_sb, unsigned long ino, char *physical_filename); int kdfs_write_inode(struct inode *inode); +struct inode *kdfs_getinode(struct super_block *sb, unsigned long ino); /* Get a free inode id from kdfs_sb partition */ ino_t kdfs_get_freeino(struct kdfs_super_block *k_sb); commit dcd9c702dec76ab46f4ec5d0ac20b22460aa2256 Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 13:27:11 2009 +0200 [FIX] Correct all include paths to kddm.h diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 65ae72f..0460ec1 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -13,7 +13,7 @@ #include <linux/pagemap.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "super.h" #include "inode.h" diff --git a/fs/kdfs/dir.c b/fs/kdfs/dir.c index 644d248..3c5a67a 100644 --- a/fs/kdfs/dir.c +++ b/fs/kdfs/dir.c @@ -13,7 +13,7 @@ #include <linux/buffer_head.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "super.h" #include "inode.h" diff --git a/fs/kdfs/file.c b/fs/kdfs/file.c index ea9898e..a1707bc 100644 --- a/fs/kdfs/file.c +++ b/fs/kdfs/file.c @@ -13,7 +13,7 @@ #include <linux/buffer_head.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "super.h" #include "inode.h" commit 12b0ff33665490c2ccd757991832753168bae7b9 Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 11:04:01 2009 +0200 [FIX] Fix printing of i_version which is u64 diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index ab0c3cd..3cf9616 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -37,7 +37,7 @@ void print_inode_cont(struct inode *node) printk(" i_nlink: %u\n", node->i_nlink); printk(" i_uid: %u\n", node->i_uid); printk(" i_gid: %u\n", node->i_gid); - printk("i_version: %ld\n", node->i_version); + printk("i_version: %llu\n", (unsigned long long)node->i_version); printk(" i_mode: %x\n\n\n", node->i_mode); } commit 78fd05d7e0ef29510250bb63f387fe212c2c217b Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 11:03:09 2009 +0200 [FIX] Fix include path diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 3e991b0..ab0c3cd 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -11,7 +11,7 @@ * Copyright (C) 2006-2007, XtreemOS Consortium. */ -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "super.h" #include "inode.h" commit dad62b458d0bce44981adee29a5e540eb2907847 Author: Marko Obrovac <mar...@in...> Date: Mon Oct 19 12:07:47 2009 +0000 [FIX] Remove unused (and deprecated) super_operations member put_inode (partial ticket #7) diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 2de6c0d..045c077 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -1043,23 +1043,6 @@ int kdfs_write_inode(struct inode *inode) } /* - * Put a kdfs inode - * This function is called by the VFS when someone calls iput() - * - * @author Adrien Lebre - * - * @param inode The VFS inode - * @comment This function is mainly used for debugging purpose. - * From kDFS behavior point of view, it is useless and has probably - * to be simply removed. - */ -void kdfs_put_inode(struct inode *inode) -{ - DEBUG (DBG_INFO, "inode id %ld (i_count = %d)\n", - inode->i_ino, atomic_read(&inode->i_count)); -} - -/* * Drop a kdfs inode from the inode cache * This function is called by the VFS when someone calls iput_final() * @@ -1271,7 +1254,6 @@ out: static struct super_operations kdfs_sops = { .delete_inode = kdfs_delete_inode, .drop_inode = kdfs_drop_inode, - .put_inode = kdfs_put_inode, .read_inode = kdfs_read_inode, .show_options = kdfs_show_options, .statfs = kdfs_statfs, commit 448c10668045e7d217149e7bc7a1725730202e5e Author: Marko Obrovac <mar...@in...> Date: Mon Oct 19 11:52:02 2009 +0000 [ADD] Added kDFS linker and kddm set constants diff --git a/include/kddm/io_linker.h b/include/kddm/io_linker.h index 934a154..41abb51 100644 --- a/include/kddm/io_linker.h +++ b/include/kddm/io_linker.h @@ -64,6 +64,7 @@ enum STRING_LIST_LINKER, KDDM_TEST_LINKER, MM_STRUCT_LINKER, + SB_LINKER, MAX_IO_LINKER, /* MUST always be the last one */ } ; diff --git a/include/kddm/kddm_set.h b/include/kddm/kddm_set.h index 3e3f54b..6853124 100644 --- a/include/kddm/kddm_set.h +++ b/include/kddm/kddm_set.h @@ -106,6 +106,7 @@ enum KDDM_TEST4_LOC, // 68 KDDM_TEST4096, // 69 MM_STRUCT_KDDM_ID, // 70 + KDFS_SB_KDDM_ID, MIN_KDDM_ID, /* MUST always be the last one */ }; commit 7795b4846f5cc77bca954e6f8f207dde436ecbb9 Author: Marko Obrovac <mar...@in...> Date: Sun Oct 18 22:23:21 2009 +0200 [FIX] ProcFS: the proc_root_fs variable is not available any more (and non-existent, for that matter). Instead, file systems should register themselves with the "fs/FS_NAME" name syntax, leaving the parent proc_dir as NULL. Also, the write_proc function should return an int, not a ssize_t. The "owner" field is no longer available as part of the proc_dir_entry structure. Following other file systems' example, it was simple removed from the code (apparently, there's another way of keeping track of processes using a proc entry) [FIX] Fixed a printk - when printing long ints, %ld should be used [FIX] super_operations the signature of umount changed - now there's only one argument - the super_block which should be unmounted. There are still other issues concerning the super_operations structure that need to be solved - see ticket #7 [FIX] simple_set_mnt does not return an error code any more. However, looking at other file systems, they seem just to use it "as-is", so probably we should remove the code below it (which used to handle error cases) diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 8711213..2de6c0d 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -17,7 +17,7 @@ #include <linux/proc_fs.h> #include <linux/seq_file.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "physical_fs.h" #include "super.h" @@ -80,7 +80,7 @@ kdfs_node_t k_rootsb_nodeid = KERRIGHED_NODE_ID_NONE; struct proc_dir_entry *proc_fs_kdfs = NULL; /* Increase the kdfs_gen counter. Used by checkpoint code */ -ssize_t kdfs_proc_inc_gen(struct file *filp, const char __user *buf, +int kdfs_proc_inc_gen(struct file *filp, const char __user *buf, unsigned long len, void *data) { extern unsigned int kdfs_gen; @@ -89,7 +89,7 @@ ssize_t kdfs_proc_inc_gen(struct file *filp, const char __user *buf, } /* Lists the inodes of the local kDFS superblock */ -ssize_t kdfs_proc_inodes_write(struct file *filp, const char __user *buf, +int kdfs_proc_inodes_write(struct file *filp, const char __user *buf, unsigned long len, void *data) { struct inode *inode; @@ -112,7 +112,7 @@ ssize_t kdfs_proc_inodes_write(struct file *filp, const char __user *buf, printk(" Inode %ld, count %d, mode %u, size %lld\n", inode->i_ino, atomic_read(&inode->i_count), inode->i_mode, inode->i_size); printk("Dumping s_files list\n"); list_for_each_entry(file, &k_sb->sb->s_files, f_u.fu_list) - printk(" File with count %d", atomic_read(&file->f_count)); + printk(" File with count %ld", atomic_read(&file->f_count)); } else printk("There is no kDFS superblock file on the current node\n"); @@ -1165,7 +1165,7 @@ void kdfs_delete_inode(struct inode *inode) PRINT_FUNCTION_EXIT; } -void kdfs_umount(struct vfsmount *vfsmnt, int flags) +void kdfs_umount(/*struct vfsmount *vfsmnt, int flags*/struct super_block *sb) { struct kdfs_super_block *k_sb = NULL; struct kdfs_cw_sb *k_cwsb = NULL; @@ -1175,6 +1175,12 @@ void kdfs_umount(struct vfsmount *vfsmnt, int flags) k_sb = kdfs_grabsb(kerrighed_node_id); BUG_ON(k_sb == NULL); + + if (k_sb->sb != sb) { + DEBUG(DBG_INFO, "The super block to umount is not a kdfs one!\n"); + return; + } + BUG_ON(k_sb->inode_bitmap == NULL); sb_bitmap_save(k_sb); @@ -1387,8 +1393,14 @@ int kdfs_get_sb(struct file_system_type *fs_type, int flags, } //TODO PRIORITY 3: Check where this come from (ext2fs super block?) and see why we would (not?) need it //kdfs_sb->sb->s_flags |= MS_ACTIVE; - error = simple_set_mnt(mnt, k_sb->sb); + simple_set_mnt(mnt, k_sb->sb); + /* + * TODO: simple_set_mnt returns void now! Thus, this code + * will never be executed so it becomes useless!!! + * Check whether there are other places where this + * should be checked, i.e. become usefull + */ if (error < 0) { DEBUG(DBG_ALERT, "Can't retrieve KDFS super bloc\n"); // TODO PRIORITY 1: Put some goto to manage all errors @@ -1549,22 +1561,18 @@ int init_kdfs() */ /* Create /proc/fs/kdfs directory */ - proc_fs_kdfs = proc_mkdir("kdfs", proc_root_fs); + proc_fs_kdfs = proc_mkdir("fs/kdfs", NULL); if (proc_fs_kdfs == NULL) return -ENOMEM; - /* owner is used to avoid unloading the module while the entry is in use */ - proc_fs_kdfs->owner = THIS_MODULE; p = create_proc_entry("inodes", S_IFREG|S_IRUGO, proc_fs_kdfs); if (p == NULL) return -ENOMEM; - p->owner = THIS_MODULE; p->write_proc = kdfs_proc_inodes_write; p = create_proc_entry("gen", S_IFREG|S_IRUGO, proc_fs_kdfs); if (p == NULL) return -ENOMEM; - p->owner = THIS_MODULE; p->write_proc = kdfs_proc_inc_gen; #endif @@ -1596,7 +1604,7 @@ void cleanup_kdfs(void) #ifdef __KDFS_PROCDIR_ remove_proc_entry("gen", proc_fs_kdfs); remove_proc_entry("inodes", proc_fs_kdfs); - remove_proc_entry("kdfs", proc_root_fs); + remove_proc_entry("fs/kdfs", NULL); #endif unregister_filesystem(&kdfs_fs_type); commit 9f15d3b58f3f75135f3cf3e88e0094bf75d80c38 Author: Marko Obrovac <mar...@in...> Date: Sun Oct 18 19:23:52 2009 +0200 [FIX] Conform the nameidata structure changes to the newest kernel structure diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index c6a7f47..0ae67a8 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -114,14 +114,14 @@ long create_phys_dir(const char *pathname, lockdep_on(); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { - error = vfs_mkdir(nd.dentry->d_inode, dentry, mode); + error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode); dput(dentry); } lockdep_off(); - mutex_unlock(&nd.dentry->d_inode->i_mutex); + mutex_unlock(&nd.path.dentry->d_inode->i_mutex); lockdep_on(); - path_release(&nd); + path_put(&nd.path); out: chroot_to_saved_root(&saved_path); @@ -208,7 +208,7 @@ out: struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_t gid) { int error = 0; - struct file *file; + struct file *file = NULL; struct path saved_path; const struct cred *old_creds; struct cred *overridden_creds; commit d88702c37c8cb0c089fa2d839920daa1270bf39a Author: Marko Obrovac <mar...@in...> Date: Sun Oct 18 19:02:42 2009 +0200 [FIX] Change to newest kernel structure changes concerning credentials and file system structure changes (tickets #4, #5) diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index 6b91b91..c6a7f47 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -16,12 +16,53 @@ #include <asm/uaccess.h> #include <linux/namei.h> +#include <linux/fs_struct.h> #include "physical_fs.h" #include "debug_kdfs.h" #define KDFS_PART "KDFS - Native File System Accesses" + +void chroot_to_physical_root(struct path *saved_root) +{ + write_lock(¤t->fs->lock); + *saved_root = current->fs->root; + current->fs->root = init_task.fs->root; + write_unlock(¤t->fs->lock); +} + +void chroot_to_saved_root(const struct path *saved_root) +{ + struct path root; + + write_lock(¤t->fs->lock); + root = current->fs->root; + current->fs->root = *saved_root; + write_unlock(¤t->fs->lock); + path_put(&root); +} + +int change_creds(struct cred **overridden, const struct cred **old, + uid_t fsuid, gid_t fsgid) +{ + *overridden = prepare_creds(); + if (!*overridden) + return -ENOMEM; + + (*overridden)->fsuid = fsuid; + (*overridden)->fsgid = fsgid; + *old = override_creds(*overridden); + + return 0; +} + +void revert_old_creds(struct cred *overridden, const struct cred *old) +{ + revert_creds(old); + put_cred(overridden); +} + /* * Create a physical directory * @@ -43,23 +84,18 @@ long create_phys_dir(const char *pathname, int error = 0; struct dentry *dentry; struct nameidata nd; - struct dentry *saved_root; - struct vfsmount *saved_mnt; - uid_t saved_uid; - gid_t saved_gid; + struct path saved_path; + const struct cred *old_creds; + struct cred *overridden_creds; DEBUG(DBG_INFO, "Create dir %s\n", pathname); - saved_mnt = current->fs->rootmnt; - saved_root = current->fs->root; - saved_uid = current_fsuid(); - saved_gid = current_fsgid(); - - current->fs->rootmnt = init_task.fs->rootmnt; - current->fs->root = init_task.fs->root; - current->fsuid = uid; - current->fsgid = gid; - + error = change_creds(&overridden_creds, &old_creds, uid, gid); + if (error) + goto out; + + chroot_to_physical_root(&saved_path); + error = path_lookup(pathname, LOOKUP_PARENT, &nd); if (error) goto out; @@ -88,10 +124,8 @@ long create_phys_dir(const char *pathname, path_release(&nd); out: - current->fsuid = saved_uid; - current->fsgid = saved_gid; - current->fs->rootmnt = saved_mnt; - current->fs->root = saved_root; + chroot_to_saved_root(&saved_path); + revert_old_creds(overridden_creds, old_creds); return error; } @@ -111,26 +145,21 @@ out: long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) { struct file *file = NULL; - struct dentry *dentry; - struct inode *dir; + struct dentry *dentry; + struct inode *dir; long res = 0; - struct dentry *saved_root; - struct vfsmount *saved_mnt; - uid_t saved_uid; - gid_t saved_gid; + struct path saved_path; + const struct cred *old_creds; + struct cred *overridden_creds; DEBUG(DBG_TRACE, "Remove dir %s\n", pathname); - saved_mnt = current->fs->rootmnt; - saved_root = current->fs->root; - saved_uid = current_fsuid(); - saved_gid = current_fsgid(); - - current->fs->rootmnt = init_task.fs->rootmnt; - current->fs->root = init_task.fs->root; - current->fsuid = uid; - current->fsgid = gid; - + res = change_creds(&overridden_creds, &old_creds, uid, gid); + if (res) + goto out; + + chroot_to_physical_root(&saved_path); + file = filp_open(pathname, O_LARGEFILE|O_RDONLY, 0644); if (IS_ERR(file) && PTR_ERR(file) == -ENOENT) { DEBUG(DBG_INFO, "Can't access to phys_dir %s\n", pathname); @@ -155,10 +184,8 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) filp_close(file,current->files); out: - current->fsuid = saved_uid; - current->fsgid = saved_gid; - current->fs->rootmnt = saved_mnt; - current->fs->root = saved_root; + chroot_to_saved_root(&saved_path); + revert_old_creds(overridden_creds, old_creds); return res; } @@ -180,37 +207,35 @@ out: */ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_t gid) { - struct dentry *saved_root; - struct vfsmount *saved_mnt; - uid_t saved_uid; - gid_t saved_gid; + int error = 0; struct file *file; + struct path saved_path; + const struct cred *old_creds; + struct cred *overridden_creds; + + error = change_creds(&overridden_creds, &old_creds, uid, gid); + if (error) + goto out; + + chroot_to_physical_root(&saved_path); DEBUG(DBG_INFO, "Open physical file %s with flags 0x%08x - mode %o\n", filename, flags, mode); - saved_mnt = current->fs->rootmnt; - saved_root = current->fs->root; - saved_uid = current_fsuid(); - saved_gid = current_fsgid(); - - current->fs->rootmnt = init_task.fs->rootmnt; - current->fs->root = init_task.fs->root; - current->fsuid = uid; - current->fsgid = gid; - lockdep_off(); file = filp_open(filename, flags, mode); lockdep_on(); - current->fsuid = saved_uid; - current->fsgid = saved_gid; - current->fs->rootmnt = saved_mnt; - current->fs->root = saved_root; - DEBUG(DBG_INFO, "Open physical file %s done : %p\n", filename, file); +out: + chroot_to_saved_root(&saved_path); + revert_old_creds(overridden_creds, old_creds); + + if (error) + file = ERR_PTR(error); + return file; } @@ -386,22 +411,17 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) struct dentry *dentry; struct inode *dir; int res = 0; - struct dentry *saved_root; - struct vfsmount *saved_mnt; - uid_t saved_uid; - gid_t saved_gid; + struct path saved_path; + const struct cred *old_creds; + struct cred *overridden_creds; DEBUG(DBG_TRACE, "Remove file %s\n", filename); - saved_mnt = current->fs->rootmnt; - saved_root = current->fs->root; - saved_uid = current_fsuid(); - saved_gid = current_fsgid(); - - current->fs->rootmnt = init_task.fs->rootmnt; - current->fs->root = init_task.fs->root; - current->fsuid = uid; - current->fsgid = gid; + res = change_creds(&overridden_creds, &old_creds, uid, gid); + if (res) + goto out; + + chroot_to_physical_root(&saved_path); file = filp_open(filename, O_LARGEFILE|O_RDONLY, 0644); @@ -428,10 +448,8 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) DEBUG(DBG_INFO, "After vfs_unlink res = %d\n", res); out: - current->fsuid = saved_uid; - current->fsgid = saved_gid; - current->fs->rootmnt = saved_mnt; - current->fs->root = saved_root; + chroot_to_saved_root(&saved_path); + revert_old_creds(overridden_creds, old_creds); return res; } commit 0bf1ac82724db2090d893fbdef7a49a1ebc07ca6 Author: Marko Obrovac <mar...@in...> Date: Fri Oct 16 17:05:38 2009 +0000 [MINOR] Fix part (the "read" part) of ticket #3 (nonexisting task_struct members) diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index 689f690..6b91b91 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -52,8 +52,8 @@ long create_phys_dir(const char *pathname, saved_mnt = current->fs->rootmnt; saved_root = current->fs->root; - saved_uid = current->fsuid; - saved_gid = current->fsgid; + saved_uid = current_fsuid(); + saved_gid = current_fsgid(); current->fs->rootmnt = init_task.fs->rootmnt; current->fs->root = init_task.fs->root; @@ -123,8 +123,8 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) saved_mnt = current->fs->rootmnt; saved_root = current->fs->root; - saved_uid = current->fsuid; - saved_gid = current->fsgid; + saved_uid = current_fsuid(); + saved_gid = current_fsgid(); current->fs->rootmnt = init_task.fs->rootmnt; current->fs->root = init_task.fs->root; @@ -192,8 +192,8 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ saved_mnt = current->fs->rootmnt; saved_root = current->fs->root; - saved_uid = current->fsuid; - saved_gid = current->fsgid; + saved_uid = current_fsuid(); + saved_gid = current_fsgid(); current->fs->rootmnt = init_task.fs->rootmnt; current->fs->root = init_task.fs->root; @@ -395,8 +395,8 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) saved_mnt = current->fs->rootmnt; saved_root = current->fs->root; - saved_uid = current->fsuid; - saved_gid = current->fsgid; + saved_uid = current_fsuid(); + saved_gid = current_fsgid(); current->fs->rootmnt = init_task.fs->rootmnt; current->fs->root = init_task.fs->root; commit a657d43db944e313e4b5975e49c17e0981024f82 Author: Marko Obrovac <mar...@in...> Date: Fri Oct 16 16:22:38 2009 +0000 [FIX] Introduce linux/namei.h (struct nameidata) Closed ticket #2 diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index 36273ca..689f690 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -15,6 +15,7 @@ #endif #include <asm/uaccess.h> +#include <linux/namei.h> #include "physical_fs.h" commit 77cc1932ed4ca5bc6708e4bbbfa5753fe72da878 Author: Marko Obrovac <mar...@in...> Date: Fri Oct 16 15:45:34 2009 +0000 [FIX] Conform the debugging to new kerrighed/kernel guidelines diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 59a5b9d..65ae72f 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -77,13 +77,13 @@ int kdfs_readpage(struct file *file, struct page *page) ASSERT(page != NULL); k_inode=kdfs_ilocalfind(page->mapping->host->i_ino); if (k_inode->content_setid == KDDM_SET_UNUSED) - DEBUG (DBG_KDFS_ADDRSPACE, DBG_PANIC, "No contentset associated.... looks really strange (inode %lu, name %s)\n", + DEBUG (DBG_PANIC, "No contentset associated.... looks really strange (inode %lu, name %s)\n", k_inode->inode->i_ino, list_entry(k_inode->inode->i_dentry.next, struct dentry, d_alias)->d_name.name); /* TODO PRIORITY 2: test kdfs_get_page returned value */ k_page = kdfs_get_page(k_inode->content_setid, page->index); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, " Readpage k_page->page : %p and page %p\n", k_page->page, page); + DEBUG(DBG_INFO, " Readpage k_page->page : %p and page %p\n", k_page->page, page); BUG_ON(k_page->page != page); SetPageUptodate(k_page->page); @@ -109,7 +109,7 @@ int kdfs_prepare_write (struct file *file, struct kdfs_page *k_page = NULL; struct kdfs_inode *k_inode = NULL; - DEBUG (DBG_KDFS_ADDRSPACE, DBG_INFO, "Prepare_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", + DEBUG (DBG_INFO, "Prepare_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", file->f_dentry->d_name.name, file->f_dentry->d_inode->i_ino, page->index, offset, _to, page_count(page), page->mapping); BUG_ON (page->mapping == NULL); @@ -117,7 +117,7 @@ int kdfs_prepare_write (struct file *file, k_inode=kdfs_ilocalfind(file->f_dentry->d_inode->i_ino); if(k_inode->content_setid == KDDM_SET_UNUSED){ - DEBUG (DBG_KDFS_ADDRSPACE, DBG_PANIC, "No contentset associated.... looks really strange \n"); + DEBUG (DBG_PANIC, "No contentset associated.... looks really strange \n"); } /* TODO PRIORITY 2: test kdfs_get_page returned value */ @@ -141,7 +141,7 @@ int kdfs_commit_write(struct file *file, { struct kdfs_inode *k_inode = NULL; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "commit_write for page %ld for file %s" + DEBUG(DBG_INFO, "commit_write for page %ld for file %s" "(ino %lu) (from %u to %u) (count = %d)\n", page->index, file->f_dentry->d_name.name, file->f_dentry->d_inode->i_ino, offset, _to, @@ -149,7 +149,7 @@ int kdfs_commit_write(struct file *file, k_inode = kdfs_ilocalfind(file->f_dentry->d_inode->i_ino); if (k_inode->content_setid == KDDM_SET_UNUSED) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_PANIC, "No contentset associated.... looks really strange \n"); + DEBUG(DBG_PANIC, "No contentset associated.... looks really strange \n"); if (((loff_t)page->index * PAGE_SIZE) + _to > k_inode->inode->i_size) i_size_write(k_inode->inode, ((loff_t)page->index * PAGE_SIZE) + _to); @@ -257,19 +257,19 @@ struct address_space_operations kdfs_aops = { struct kdfs_page *kdfs_get_page(kddm_set_id_t set_id, objid_t obj_id) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Get page %ld from set %ld\n", obj_id, set_id); + DEBUG(DBG_INFO, "Get page %ld from set %ld\n", obj_id, set_id); return kddm_get_object(kddm_def_ns, set_id, obj_id); } struct kdfs_page *kdfs_grab_page(kddm_set_id_t set_id, objid_t obj_id) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); + DEBUG(DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); return kddm_grab_object(kddm_def_ns, set_id, obj_id); } struct kdfs_page *kdfs_findlocal_page(kddm_set_id_t set_id, objid_t obj_id) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); + DEBUG(DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); return kddm_find_object(kddm_def_ns, set_id, obj_id); } @@ -280,13 +280,13 @@ void __kdfs_put_page(kddm_set_id_t set_id, objid_t obj_id) void _kdfs_put_page(struct kdfs_page *k_page) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Put page %ld from set %ld\n", k_page->obj_id, k_page->set_id); + DEBUG(DBG_INFO, "Put page %ld from set %ld\n", k_page->obj_id, k_page->set_id); kddm_put_object(kddm_def_ns, k_page->set_id, k_page->obj_id); } void kdfs_mark_page_dirty(kddm_set_id_t set_id, objid_t obj_id) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Sync page %ld from set %lu\n", obj_id, set_id); + DEBUG(DBG_INFO, "Sync page %ld from set %lu\n", obj_id, set_id); kddm_sync_frozen_object(kddm_def_ns, set_id, obj_id); } @@ -328,7 +328,7 @@ kddm_set_t *__create_content_kddm_set(kddm_set_id_t set_id, content_data, sizeof(struct content_iolinker_data), KDDM_FT_LINKED); if (IS_ERR(kddm_set)) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_PANIC, "Can't create content kddm_set for inode %ld\n", k_inode->inode->i_ino); + DEBUG(DBG_PANIC, "Can't create content kddm_set for inode %ld\n", k_inode->inode->i_ino); /* We can free all the memory allocated */ kfree(content_data); @@ -372,7 +372,7 @@ int __local_destroy_content_kddm_set(struct kdfs_inode *k_inode) kddm_set = _local_get_kddm_set(kddm_def_ns, k_inode->content_setid); if (!kddm_set) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "The associated kddm_set for inode %ld hasn't been instantiated\n", k_inode->inode->i_ino); + DEBUG(DBG_INFO, "The associated kddm_set for inode %ld hasn't been instantiated\n", k_inode->inode->i_ino); else{ /* * TODO PRIORITY 1, Adrien / (Renaud kDDM stuff) @@ -426,10 +426,10 @@ 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_KDFS_ADDRSPACE, DBG_INFO, "Before Alloc new page %ld from set %lu \n", objid, set->id); + DEBUG(DBG_INFO, "Before Alloc new page %ld from set %lu \n", objid, set->id); k_page->page = find_get_page(k_mapping, objid); if (!k_page->page) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, + DEBUG(DBG_ALERT, "Can't find page for file/directory = %ld and page id = %ld, So created and locked\n", k_mapping->host->i_ino, objid); k_page->page = find_or_create_page(k_mapping, objid, mapping_gfp_mask(k_mapping) & ~__GFP_FS); @@ -437,7 +437,7 @@ int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) } else k_page->flags = K_PG_ok; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "After Alloc new page %ld from set %lu (page addr=%p count=%d)\n", objid, set->id, k_page->page, page_count(k_page->page)); + DEBUG(DBG_INFO, "After Alloc new page %ld from set %lu (page addr=%p count=%d)\n", objid, set->id, k_page->page, page_count(k_page->page)); k_page->set_id = set->id; k_page->obj_id = objid; @@ -476,13 +476,13 @@ int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, iolinker_data = (struct content_iolinker_data *) set->private_data; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_TRACE, "file/directory = %ld, pageid = %ld gonna to retrieve inode \n", iolinker_data->ino, objid); + DEBUG(DBG_TRACE, "file/directory = %ld, pageid = %ld gonna to retrieve inode \n", iolinker_data->ino, objid); /* WARNING: quite ugly, we should not access to a local inode without locking the corresponding kddm object*/ k_mapping = ((struct content_iolinker_data *) set->private_data)->k_mapping; ASSERT(k_mapping); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_TRACE, "file/directory = %ld, pageid = %ld mapping = %p\n", iolinker_data->ino, objid, k_mapping); + DEBUG(DBG_TRACE, "file/directory = %ld, pageid = %ld mapping = %p\n", iolinker_data->ino, objid, k_mapping); /* Allocate kdfs_page and retrieve page address */ k_page = kmalloc(sizeof(struct kdfs_page), GFP_KERNEL); @@ -500,13 +500,13 @@ int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, k_page->page = find_get_page(k_mapping, objid); if (!k_page->page) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Can't find page for file/directory = %ld and page id = %ld, So created and locked\n", iolinker_data->ino, objid); + DEBUG(DBG_ALERT, "Can't find page for file/directory = %ld and page id = %ld, So created and locked\n", iolinker_data->ino, objid); k_page->page = find_or_create_page(k_mapping, objid, (mapping_gfp_mask(k_mapping)|__GFP_ZERO) & ~__GFP_FS); k_page->flags = K_PG_locked; } else k_page->flags = K_PG_ok; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "After find Page count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "After find Page count=%d\n", page_count(k_page->page)); page_addr = (char *) kmap(k_page->page); pos = (loff_t)objid * PAGE_SIZE; @@ -516,14 +516,14 @@ int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, kunmap(k_page->page); if (!IS_ERR(k_page->page)) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Can't read page for file/directory = %ld and page id = %ld\n", iolinker_data->ino, objid); + DEBUG(DBG_ALERT, "Can't read page for file/directory = %ld and page id = %ld\n", iolinker_data->ino, objid); objEntry->object = (void *) k_page; /* TODO PRIORITY 2: should release in kdfs_put_page instead? */ //page_cache_release(k_page->page); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "After read Page count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "After read Page count=%d\n", page_count(k_page->page)); PRINT_FUNCTION_EXIT; return res; @@ -543,7 +543,7 @@ int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) PRINT_FUNCTION_NAME; k_page = (struct kdfs_page *) objEntry->object; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Entering page count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Entering page count=%d\n", page_count(k_page->page)); /* * Set the private field of the page to get callback when it is @@ -562,7 +562,7 @@ int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) } page_cache_release(k_page->page); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Exiting page count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Exiting page count=%d\n", page_count(k_page->page)); PRINT_FUNCTION_EXIT; return 0; } @@ -587,7 +587,7 @@ int kdfs_iol_page_export (struct rpc_desc *desc, res = rpc_pack(desc, 0, page_addr, PAGE_SIZE); if (res < 0) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "can't pack export page (res=%d)\n", res); + DEBUG(DBG_ALERT, "can't pack export page (res=%d)\n", res); kunmap_atomic(page_addr, KM_USER0); @@ -613,12 +613,12 @@ int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t obji PRINT_FUNCTION_NAME; SetPageLocked(k_page->page); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page count before =%d\n", page_count(k_page->page)); + 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); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); /* * TODO PRIORITY 2: Adrien * Page Count should be probably decremented @@ -675,7 +675,7 @@ int kdfs_iol_page_sync(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) ASSERT(k_page != NULL); ASSERT(k_page->page != NULL); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Try to sync page %ld (page addr %p) of set %lu\n", objid, k_page->page, set->id); + 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)objid * PAGE_SIZE) + k_page->offset; page_addr = (char *) kmap(k_page->page); @@ -707,7 +707,7 @@ int kdfs_iol_page_put(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) ASSERT(objEntry != NULL); k_page = (struct kdfs_page *)objEntry->object; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page count = %d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Page count = %d\n", page_count(k_page->page)); //page_cache_release(k_page->page); @@ -735,12 +735,12 @@ int kdfs_iol_page_remove(void *object, struct kddm_set *set, objid_t objid) * we are not called by the VFS */ SetPageLocked(k_page->page); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page count before =%d\n", page_count(k_page->page)); + 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); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); } PRINT_FUNCTION_EXIT; @@ -776,7 +776,7 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) ASSERT(kddm_set->private_data != NULL); content_data = (struct content_iolinker_data *) kddm_set->private_data; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Instantiate kddm %ld with ino : %ld\n", kddm_set->id, content_data->ino); + DEBUG(DBG_INFO, "Instantiate kddm %ld with ino : %ld\n", kddm_set->id, content_data->ino); if (kddm_set->def_owner == kerrighed_node_id) { content_data->phys_dirname = kmalloc(PATH_MAX, GFP_KERNEL); @@ -811,7 +811,7 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) content_data->current_meta = NULL; } } else { - DEBUG (DBG_KDFS_ADDRSPACE, DBG_INFO, "Nothing TODO, file is not on this node\n"); + DEBUG (DBG_INFO, "Nothing TODO, file is not on this node\n"); content_data->phys_dirname = NULL; content_data->phys_file = NULL; } @@ -820,16 +820,16 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) /* Retrieve the local ref to the k_mapping object */ inode = ilookup(k_sb->sb, content_data->ino); if (inode) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "K_mapping from the cache\n"); + DEBUG(DBG_INFO, "K_mapping from the cache\n"); content_data->k_mapping = inode->i_mapping; iput(inode); } else { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "K_mapping will be retrieve from iget\n"); + DEBUG(DBG_INFO, "K_mapping will be retrieve from iget\n"); inode = iget(k_sb->sb, content_data->ino); content_data->k_mapping = inode->i_mapping; } if (!content_data->k_mapping) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_PANIC, "k_mapping was not cleanly initialized\n"); + DEBUG(DBG_PANIC, "k_mapping was not cleanly initialized\n"); __kdfs_putsb(k_sb); PRINT_FUNCTION_EXIT; diff --git a/fs/kdfs/debug_kdfs.h b/fs/kdfs/debug_kdfs.h index 15df5b1..51bf3b0 100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@ -16,6 +16,7 @@ /* Common headers */ #include <asm-generic/bug.h> #include <linux/err.h> +#include <linux/kernel.h> /* Kerrighed headers (dynamical debugging) */ #include <kerrighed/debug.h> @@ -25,54 +26,24 @@ #define DBG_PANIC 0 #define DBG_ALERT 1 #define DBG_WARNING 2 -#define DBG_TRACE 3 +#define DBG_TRACE 3 #define DBG_INFO 4 -/* DEBUG type */ -#define DBG_KDFS_GENERAL "general" /* General debug */ -#define DBG_KDFS_SUPERBLK "superblock" /* Super Block */ -#define DBG_KDFS_INODE "inode" /* Inode Management */ -#define DBG_KDFS_DIR "dir-mgmt" /* Dir management */ -#define DBG_KDFS_FILE "file-mgmt" /* File management */ -#define DBG_KDFS_ADDRSPACE "addrspace" /* Page management */ -#define DBG_KDFS_NATIVEFS "native-fs" /* Native File System Accesses */ - -static inline struct dentry * init_kdfs_debug(void) -{ -#ifdef NDEBUG - return NULL; -#else - /* The default level is set by the second parameter */ - struct dentry *d = debug_define("kDFS", DBG_PANIC); - - DEBUG_MASK("kDFS", DBG_KDFS_GENERAL); - DEBUG_MASK("kDFS", DBG_KDFS_SUPERBLK); - DEBUG_MASK("kDFS", DBG_KDFS_INODE); - DEBUG_MASK("kDFS", DBG_KDFS_DIR); - DEBUG_MASK("kDFS", DBG_KDFS_FILE); - DEBUG_MASK("kDFS", DBG_KDFS_ADDRSPACE); - DEBUG_MASK("kDFS", DBG_KDFS_NATIVEFS); - - return d; -#endif -} - - -//#define KDFS_DEBUG_LEVEL 4 +#define KDFS_DEBUG_LEVEL 4 #ifdef DEBUG #undef DEBUG #endif #ifdef NDEBUG -# define DEBUG(type, level, format, args...) do {} while(0) +# define DEBUG(level, format, args...) do {} while(0) #else -# define DEBUG(type, level, format, args...) \ +# define DEBUG(level, format, args...) \ do { \ - if (match_debug("kDFS", type, level)) { \ - printk ("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ + if (KDFS_DEBUG_LEVEL <= level || level == DBG_PANIC) { \ + pr_debug("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ current->pid) ; \ - printk (format, ## args) ; \ + pr_debug(format, ## args) ; \ } \ if(level == DBG_PANIC)\ BUG();\ @@ -85,8 +56,8 @@ do { \ /* FUNCTION NAME : ENTER and EXIT */ // TODO: redefine the following macros to take into account debug level ! -#define PRINT_FUNCTION_NAME DEBUG(DBG_KDFS_GENERAL, DBG_TRACE, "%s\n", __PRETTY_FUNCTION__) -#define PRINT_FUNCTION_EXIT DEBUG(DBG_KDFS_GENERAL, DBG_TRACE, "%s exited\n", __PRETTY_FUNCTION__) +#define PRINT_FUNCTION_NAME DEBUG(DBG_TRACE, "%s\n", __PRETTY_FUNCTION__) +#define PRINT_FUNCTION_EXIT DEBUG(DBG_TRACE, "%s exited\n", __PRETTY_FUNCTION__) /* ASSERT and BUG ON */ @@ -101,7 +72,7 @@ do { \ #define ASSERT(expr) \ do {\ if ( !(expr) ) {\ - printk ("PANIC : ASSERT " #expr " failed in %s \ + pr_debug("PANIC : ASSERT " #expr " failed in %s \ line %d\n", __PRETTY_FUNCTION__, __LINE__ ); \ BUG(); \ } \ diff --git a/fs/kdfs/dir.c b/fs/kdfs/dir.c index 1679156..644d248 100644 --- a/fs/kdfs/dir.c +++ b/fs/kdfs/dir.c @@ -59,7 +59,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file struct page *tmp_page = NULL; void *page_addr = NULL ; - DEBUG (DBG_KDFS_DIR, DBG_INFO, + DEBUG (DBG_INFO, "Look up for entry %s in directory %ld\n", filename, dir->inode->i_ino); @@ -75,11 +75,11 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file } /* Parse directory dentries */ - DEBUG (DBG_KDFS_DIR, DBG_INFO, "Start to look inside directory\n"); + DEBUG (DBG_INFO, "Start to look inside directory\n"); do { *k_page = kdfs_grab_page(dir->content_setid, pageid); if (IS_ERR(*k_page)) - DEBUG (DBG_KDFS_DIR, DBG_PANIC, + DEBUG (DBG_PANIC, "Can't grab page %ld for the directory %ld", pageid, dir->content_setid); @@ -89,7 +89,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file /* For each entry contained in the page */ do { - DEBUG (DBG_KDFS_DIR, DBG_INFO, + DEBUG (DBG_INFO, "Grab page %ld:" "page addr %p, dentry_addr %p (file size %lld)\n", pageid, page_addr, dentry_addr, @@ -98,7 +98,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file dir_entry = (struct kdfs_dir_entry *) dentry_addr; /* Did we find the right entry */ - DEBUG (DBG_KDFS_DIR, DBG_INFO, "filelen %d dirfilelen %d, filename %s dirname %s, dirlen %d (dirino %ld)\n", + DEBUG (DBG_INFO, "filelen %d dirfilelen %d, filename %s dirname %s, dirlen %d (dirino %ld)\n", filename_len, dir_entry->name_len, filename, dir_entry->name,dir_entry->rec_len, dir_entry->ino); if (dir_entry->name_len == filename_len && strncmp (dir_entry->name, filename, filename_len) == 0) @@ -122,7 +122,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file } // end if there are some entries - DEBUG (DBG_KDFS_DIR, DBG_INFO, "Look up for file %s in directory %ld : notfound \n", + DEBUG (DBG_INFO, "Look up for file %s in directory %ld : notfound \n", filename, dir->inode->i_ino); // TODO PRIORITY 1: put_kddm_set required a reference on the set. // I have to add a reference inside kdfs_page structure :( @@ -130,7 +130,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file return NULL; found: - DEBUG (DBG_KDFS_DIR, DBG_INFO, + DEBUG (DBG_INFO, "Look up for file %s in directory %ld: found : %p\n", filename, dir->inode->i_ino, dir_entry); return dir_entry; @@ -162,7 +162,7 @@ struct kdfs_dir_entry *kdfs_find_entry(struct kdfs_inode *dir, struct page *tmp_page = NULL; void *page_addr = NULL; - DEBUG(DBG_KDFS_DIR, DBG_INFO, + DEBUG(DBG_INFO, "Look up for entry %s in directory %ld\n", filename, dir->inode->i_ino); @@ -178,12 +178,12 @@ struct kdfs_dir_entry *kdfs_find_entry(struct kdfs_inode *dir, } /* Parse directory dentries */ - DEBUG (DBG_KDFS_DIR, DBG_INFO, + DEBUG (DBG_INFO, "Start to look inside directory \n"); do { *k_page = kdfs_get_page(dir->content_setid, pageid); if (IS_ERR(*k_page)) - DEBUG(DBG_KDFS_DIR, DBG_PANIC, + DEBUG(DBG_PANIC, "Can't get page %ld for the directory %ld\n", pageid, dir->content_setid); @@ -193,14 +193,14 @@ struct kdfs_dir_entry *kdfs_find_entry(struct kdfs_inode *dir, /* For each entry contained in the page */ do { - DEBUG(DBG_KDFS_DIR, DBG_INFO, + DEBUG(DBG_INFO, "page addr %p, dentry_addr %p (file size %lld)\n", page_addr, dentry_addr, dir->inode->i_size); /* Get the directory entry */ dir_entry = (struct kdfs_dir_entry *) dentry_addr; /* Did we find the right entry */ - DEBUG(DBG_KDFS_DIR, DBG_INFO, + DEBUG(DBG_INFO, "filelen %d... [truncated message content] |
From: Marko O. <d0...@us...> - 2009-10-23 14:52:44
|
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 "UNNAMED PROJECT". The branch, master has been updated via 86f5386d9026558d5a064668665183a206e35712 (commit) from 1f222e773991a0b02466bcc8c8d6b75fe2670062 (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 86f5386d9026558d5a064668665183a206e35712 Author: Marko Obrovac <mar...@in...> Date: Fri Oct 23 14:48:26 2009 +0000 Conform mkfs_kdfs to the new kerrighed libraries diff --git a/tools/mkfs_kdfs.c b/tools/mkfs_kdfs.c index c0399eb..7e859fa 100644 --- a/tools/mkfs_kdfs.c +++ b/tools/mkfs_kdfs.c @@ -34,7 +34,7 @@ /* KDDM includes */ #include <krgnodemask.h> -#include <kerrighed_tools.h> +#include <proc.h> /* From "super.h": */ #define KDFS_ROOT_INODEID 1 @@ -101,10 +101,10 @@ void usage() int get_nodeid() { - int nodeid, ret; + int nodeid; - ret = call_kerrighed_services(KSYS_GET_NODE_ID, &nodeid); - if (ret != 0) { + nodeid = get_node_id(); + if (nodeid == -1) { fprintf(stderr, "Error: cannot get node ID\n"); exit(EXIT_FAILURE); } @@ -182,10 +182,6 @@ int main(int argc, char* argv[]) /* TODO PRIORITY 3: Sanitary tests in order to check and valid nodeid */ nodeid = get_nodeid(); - if (nodeid < 0) { - fprintf(stderr, "Error: cannot get Kerrighed node ID\n"); - exit(EXIT_FAILURE); - } sprintf(root_file, "%s/%d", argv[1], nodeid); mkdir(root_file, 0777); ----------------------------------------------------------------------- Summary of changes: tools/mkfs_kdfs.c | 12 ++++-------- 1 files changed, 4 insertions(+), 8 deletions(-) hooks/post-receive -- UNNAMED PROJECT |
From: Marko O. <d0...@us...> - 2009-10-23 13:57:44
|
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 "UNNAMED PROJECT". The branch, master has been updated via 1f222e773991a0b02466bcc8c8d6b75fe2670062 (commit) from ea51d9d6e21a6c9e7f4e671705904d89d965404d (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 1f222e773991a0b02466bcc8c8d6b75fe2670062 Author: Marko Obrovac <mar...@in...> Date: Fri Oct 23 13:53:23 2009 +0000 Move the install dir of mkfs_kdfs from /usr/local to /sbin diff --git a/scripts/Makefile.in b/scripts/Makefile.in index 68761f6..b55c34b 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -1,8 +1,9 @@ -# Makefile.in generated by automake 1.10.2 from Makefile.am. +# Makefile.in generated by automake 1.11 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. @@ -15,8 +16,9 @@ @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c @@ -41,6 +43,7 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -96,6 +99,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ @@ -210,9 +214,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu scripts/Makefile + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu scripts/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -230,6 +234,7 @@ $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo @@ -259,13 +264,17 @@ distdir: $(DISTFILES) if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @@ -296,6 +305,7 @@ clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @@ -314,6 +324,8 @@ dvi-am: html: html-am +html-am: + info: info-am info-am: @@ -322,18 +334,28 @@ install-data-am: install-data-local install-dvi: install-dvi-am +install-dvi-am: + install-exec-am: install-html: install-html-am +install-html-am: + install-info: install-info-am +install-info-am: + install-man: install-pdf: install-pdf-am +install-pdf-am: + install-ps: install-ps-am +install-ps-am: + installcheck-am: maintainer-clean: maintainer-clean-am @@ -383,6 +405,7 @@ uninstall-local: dist-hook: rm -rf $(find $(distdir) -name '*~') + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/tools/Makefile.am b/tools/Makefile.am index 24e0dda..14a786b 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -6,9 +6,13 @@ ### Author: ### Jean Parpaillon <jea...@ke...> ### + +sbindir=$(exec-prefix)/sbin + dist_bin_SCRIPTS = krg_legacy_scheduler krgboot_helper krginit_helper -bin_PROGRAMS = migrate checkpoint restart krgadm krgcapset krgcr-run krgboot krginit ipccheckpoint ipcrestart mkfs_kdfs +bin_PROGRAMS = migrate checkpoint restart krgadm krgcapset krgcr-run krgboot krginit ipccheckpoint ipcrestart +sbin_PROGRAMS = mkfs_kdfs INCLUDES = -I@top_srcdir@/libs/include LDADD = @top_builddir@/libs/libkerrighed/libkerrighed.la @top_builddir@/libs/libkrgcb/libkrgcb.la ----------------------------------------------------------------------- Summary of changes: scripts/Makefile.in | 43 +++++++++++++++++++++++++++++++++---------- tools/Makefile.am | 6 +++++- 2 files changed, 38 insertions(+), 11 deletions(-) hooks/post-receive -- UNNAMED PROJECT |
From: Pierre R. <pr...@us...> - 2009-10-20 21:12:42
|
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 5d69182d2de672486e8e9a5da934a8dced6996c5 (commit) via 9c1e8c28ec4f470c34f4c3754096311e1e1d0067 (commit) via a7dc26744688881c7466fb5fef2e5459d50413a6 (commit) via fbd1f02164c25aa0c84828fe5a27014f208c2b6e (commit) via a49dfc12204314a84686850ecb279a363a05ce35 (commit) via 87b2eecf0f627ffcc2ea8300e0d0781f8e5c9843 (commit) via 9d670d2889578bcd82fb2d985e78508bfc342a49 (commit) via 976e7b299ff27bf6dd46c3dd1ae07815f3fcf1e7 (commit) from 3a01e00aeeeb7e3f4a2026d46598692a0feb4c8f (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 5d69182d2de672486e8e9a5da934a8dced6996c5 Merge: 3a01e00 9c1e8c2 Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 23:00:00 2009 +0200 Merge branch 'master' into make_kdfs_compile ----------------------------------------------------------------------- Summary of changes: arch/x86/include/asm/uaccess.h | 4 ++-- arch/x86/kerrighed/ghost.c | 2 +- ipc/krgipc_mobility.c | 2 ++ kerrighed/epm/sighand.c | 6 ++---- 4 files changed, 7 insertions(+), 7 deletions(-) hooks/post-receive -- kdfs |
From: Pierre R. <pr...@us...> - 2009-10-20 20:59:18
|
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, master has been updated via 9c1e8c28ec4f470c34f4c3754096311e1e1d0067 (commit) via a7dc26744688881c7466fb5fef2e5459d50413a6 (commit) via fbd1f02164c25aa0c84828fe5a27014f208c2b6e (commit) via a49dfc12204314a84686850ecb279a363a05ce35 (commit) via 87b2eecf0f627ffcc2ea8300e0d0781f8e5c9843 (commit) from 9d670d2889578bcd82fb2d985e78508bfc342a49 (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 9c1e8c28ec4f470c34f4c3754096311e1e1d0067 Merge: 9d670d2 a7dc267 Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 22:57:43 2009 +0200 Merge branch 'master' of git://mirrors.git.kernel.org/cluster/kerrighed/kernel commit a7dc26744688881c7466fb5fef2e5459d50413a6 Author: Louis Rilling <lou...@ke...> Date: Tue Oct 20 18:05:06 2009 +0200 [BUGFIX] krg_ns/pid: Always initialize sighand_struct::krg_objid/kddm_obj in execve() Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kerrighed/epm/sighand.c b/kerrighed/epm/sighand.c index ecde20e..7efdff8 100644 --- a/kerrighed/epm/sighand.c +++ b/kerrighed/epm/sighand.c @@ -269,9 +269,6 @@ static void __krg_sighand_alloc(struct task_struct *task, { struct sighand_struct_kddm_object *obj; - if (!task->nsproxy->krg_ns) - return; - /* * Exclude kernel threads and local pids from using sighand_struct kddm * objects. @@ -282,7 +279,8 @@ static void __krg_sighand_alloc(struct task_struct *task, * is being allocated, but we only need to know whether it is NULL or * not, which will be the same after copy_mm. */ - if (!(task_pid_knr(task) & GLOBAL_PID_MASK) + if (!task->nsproxy->krg_ns + || !(task_pid_knr(task) & GLOBAL_PID_MASK) || (task->flags & PF_KTHREAD)) { BUG_ON(krg_current); sig->krg_objid = 0; commit fbd1f02164c25aa0c84828fe5a27014f208c2b6e Author: Louis Rilling <lou...@ke...> Date: Thu Oct 15 12:23:45 2009 +0200 [BUGFIX] x86-32: Fix call to lazy_save_gs() in export_thread_struct() Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/arch/x86/kerrighed/ghost.c b/arch/x86/kerrighed/ghost.c index 2dabe9a..bcaba91 100644 --- a/arch/x86/kerrighed/ghost.c +++ b/arch/x86/kerrighed/ghost.c @@ -112,7 +112,7 @@ int export_thread_struct(struct epm_action *action, savesegment(ds, tsk->thread.ds); #else /* CONFIG_X86_32 */ - lazy_save_gs(tsk, tsk->thread.gs); + lazy_save_gs(tsk->thread.gs); WARN_ON(tsk->thread.vm86_info); #endif /* CONFIG_X86_32 */ commit a49dfc12204314a84686850ecb279a363a05ce35 Author: Louis Rilling <lou...@ke...> Date: Thu Oct 15 12:20:52 2009 +0200 [BUGFIX] x86-32: Fix KRG_FAF version of __put_user_asm_u64() Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h index 396d4a3..5ba660e 100644 --- a/arch/x86/include/asm/uaccess.h +++ b/arch/x86/include/asm/uaccess.h @@ -197,7 +197,7 @@ extern int __get_user_bad(void); " movl $8,(%%esp)\n" \ " pushl %%edx\n" \ " pushl %%eax\n" \ - " lea %2,%%eax\n" \ + " movl %2,%%eax\n" \ " call ruaccess_put_user_asm\n" \ " testl %%eax,%%eax\n" \ " popl %%eax\n" \ @@ -210,7 +210,7 @@ extern int __get_user_bad(void); _ASM_EXTABLE(1b, 4b) \ _ASM_EXTABLE(2b, 5b) \ : "=r" (err) \ - : "A" (x), "r" (addr), "i" (errret), "0" (err) + : "A" (x), "r" (addr), "i" (errret), "0" (err)) #else /* !CONFIG_KRG_FAF */ commit 87b2eecf0f627ffcc2ea8300e0d0781f8e5c9843 Author: Renaud Lottiaux <Ren...@ke...> Date: Tue Oct 20 15:30:20 2009 +0200 [MINOR] Fix compilation warning with hugetlbfs_file_operations. Avoid compilation issue if CONFIG_HUGETLB_PAGE is not set. diff --git a/ipc/krgipc_mobility.c b/ipc/krgipc_mobility.c index 1323544..8c0992c 100644 --- a/ipc/krgipc_mobility.c +++ b/ipc/krgipc_mobility.c @@ -1201,8 +1201,10 @@ int export_full_sysv_shm(ghost_t *ghost, int shmid) goto out_shm_unlock; flag = shp->shm_perm.mode; +#ifdef CONFIG_HUGETLB_PAGE if (shp->shm_file->f_op == &hugetlbfs_file_operations) flag |= SHM_HUGETLB; +#endif /* SHM_NORESERVE not handled */ r = ghost_write(ghost, &flag, sizeof(int)); ----------------------------------------------------------------------- Summary of changes: arch/x86/include/asm/uaccess.h | 4 ++-- arch/x86/kerrighed/ghost.c | 2 +- ipc/krgipc_mobility.c | 2 ++ kerrighed/epm/sighand.c | 6 ++---- 4 files changed, 7 insertions(+), 7 deletions(-) hooks/post-receive -- kdfs |
From: Pierre R. <pr...@us...> - 2009-10-20 20:42:17
|
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, master has been updated discards e30da12106f8c6a23cd1e6be028d3a64877213d8 (commit) discards 9bd901dd87d40089430b5215b9370a91fe5f9a3f (commit) discards d98ddf3f65bcd107c0f0edc09f5fcef9e49a03ca (commit) discards 87b2eecf0f627ffcc2ea8300e0d0781f8e5c9843 (commit) via 9d670d2889578bcd82fb2d985e78508bfc342a49 (commit) via 976e7b299ff27bf6dd46c3dd1ae07815f3fcf1e7 (commit) via 5dbef9949ade74cd4cdd22da26b84a048725d5dd (commit) This update added new revisions after undoing existing revisions. That is to say, the old revision is not a strict subset of the new revision. This situation occurs when you --force push a change and generate a repository containing something like this: * -- * -- B -- O -- O -- O (e30da12106f8c6a23cd1e6be028d3a64877213d8) \ N -- N -- N (9d670d2889578bcd82fb2d985e78508bfc342a49) When this happens we assume that you've already had alert emails for all of the O revisions, and so we here report only the revisions in the N branch from the common base, B. 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 9d670d2889578bcd82fb2d985e78508bfc342a49 Author: Marko Obrovac <d0...@us...> Date: Wed Oct 14 19:25:56 2009 +0200 [TEST] another hook-mail test diff --git a/test b/test deleted file mode 100644 index 741c500..0000000 --- a/test +++ /dev/null @@ -1 +0,0 @@ -this is a git hook test file commit 976e7b299ff27bf6dd46c3dd1ae07815f3fcf1e7 Author: Marko Obrovac <d0...@us...> Date: Wed Oct 14 19:15:37 2009 +0200 [TEST] test the hooks diff --git a/test b/test new file mode 100644 index 0000000..741c500 --- /dev/null +++ b/test @@ -0,0 +1 @@ +this is a git hook test file ----------------------------------------------------------------------- Summary of changes: ipc/krgipc_mobility.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) hooks/post-receive -- kdfs |
From: Pierre R. <pr...@us...> - 2009-10-20 20:42:05
|
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 discards bfd7d615a19bbd0d0524784462261f068cb520b2 (commit) discards 77085c1bc738310b68f2eb81e7dd682a84ebb944 (commit) discards 3e68210e5a57162eb213b7bfad04f8ac53a04f2f (commit) discards 925cb2ee96c14f8efbcd91f9bec0f1b3d0a1c5cd (commit) discards 5cf9481b874f6096355099576c7fb1f46a3f0a77 (commit) discards dcd9c702dec76ab46f4ec5d0ac20b22460aa2256 (commit) discards 12b0ff33665490c2ccd757991832753168bae7b9 (commit) discards 78fd05d7e0ef29510250bb63f387fe212c2c217b (commit) discards dad62b458d0bce44981adee29a5e540eb2907847 (commit) discards 448c10668045e7d217149e7bc7a1725730202e5e (commit) discards 7795b4846f5cc77bca954e6f8f207dde436ecbb9 (commit) discards 9f15d3b58f3f75135f3cf3e88e0094bf75d80c38 (commit) discards d88702c37c8cb0c089fa2d839920daa1270bf39a (commit) discards 0bf1ac82724db2090d893fbdef7a49a1ebc07ca6 (commit) discards a657d43db944e313e4b5975e49c17e0981024f82 (commit) discards 77cc1932ed4ca5bc6708e4bbbfa5753fe72da878 (commit) discards 629ed1e4c313c1e20b00b5fdc6d5ce0edc635571 (commit) discards 42a1a88931fcf91b953109de529a69021bf9f777 (commit) discards 7b412f2abfd2b8ae9a13b2cab303167bfd32cd80 (commit) discards e30da12106f8c6a23cd1e6be028d3a64877213d8 (commit) discards 9bd901dd87d40089430b5215b9370a91fe5f9a3f (commit) discards d98ddf3f65bcd107c0f0edc09f5fcef9e49a03ca (commit) discards 87b2eecf0f627ffcc2ea8300e0d0781f8e5c9843 (commit) via 3a01e00aeeeb7e3f4a2026d46598692a0feb4c8f (commit) via 431f64eadaf0d907981b11167177d3e78333fafc (commit) via 32569709409a6f590c3a367fd3f6f714b6c0d931 (commit) via 683476bab130ad5c1e5821fed314940981247b60 (commit) via 308d9d7359144747056bcfeec4b797d2253d041e (commit) via 3d3a34c2490a0ea96b39ba2acbacfb37b1ddd953 (commit) via 109f85f01d10bf1fd2e3d59f59e49eb0eb62e9ff (commit) via 6332d47e895e0e17ae76521800e1ba6eb54c7a23 (commit) via 2adf3013922a9ca6dffb7e42c2847134a0167274 (commit) via 7d4f4669897ca3bcc7d540c4bf0f81bc4b65268a (commit) via 8f6cb18b661235e591b33504349f031d2021e59a (commit) via 5bd840461f5e33cf9ee0a83751daae473b1407c6 (commit) via 17301662a4431352d1e9a8baa5ef125322363f8a (commit) via a1b5a937506912cc8e339d002ed54e8f3ec2cc34 (commit) via 29ceb8abebd6ea37670ecbf0f5fc19e280bdeb29 (commit) via 04a5f0a443f52df5a415ddbbd8cc33bdbed37c5c (commit) via 5d0d61a6740ae2bed50dc9843d5e68ea36b004e5 (commit) via aae40f37e26d7b3ec7b385a9b958cb1fb5cb0634 (commit) via 730d35668b2dc9d1807f4da4ff060d0ccdeab53c (commit) via 5dbef9949ade74cd4cdd22da26b84a048725d5dd (commit) This update added new revisions after undoing existing revisions. That is to say, the old revision is not a strict subset of the new revision. This situation occurs when you --force push a change and generate a repository containing something like this: * -- * -- B -- O -- O -- O (bfd7d615a19bbd0d0524784462261f068cb520b2) \ N -- N -- N (3a01e00aeeeb7e3f4a2026d46598692a0feb4c8f) When this happens we assume that you've already had alert emails for all of the O revisions, and so we here report only the revisions in the N branch from the common base, B. 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 3a01e00aeeeb7e3f4a2026d46598692a0feb4c8f Author: Marko Obrovac <mar...@in...> Date: Tue Oct 20 14:52:38 2009 +0000 [FIX] Change the makefile to conform to new compiling rules (kdfs is now built in the kernel, not a module) diff --git a/fs/kdfs/Makefile b/fs/kdfs/Makefile index ca9d271..f59b146 100644 --- a/fs/kdfs/Makefile +++ b/fs/kdfs/Makefile @@ -1,7 +1 @@ -obj-m += krgbuiltin.o - - -krgbuiltin-objs := physical_fs.o super.o inode.o dir.o file.o address_space.o extent.o cow.o -krgbuiltin-objs += $(krgbuiltin-y) - -EXTRA_CFLAGS += -I$(M) +obj-y := physical_fs.o super.o inode.o dir.o file.o address_space.o extent.o cow.o commit 431f64eadaf0d907981b11167177d3e78333fafc Author: Marko Obrovac <mar...@in...> Date: Tue Oct 20 14:51:37 2009 +0000 [FIX] fixed name clashes with the kerrighed functions (and marked all the internal functions as internal) diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index 0ae67a8..c299877 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -24,7 +24,7 @@ #define KDFS_PART "KDFS - Native File System Accesses" -void chroot_to_physical_root(struct path *saved_root) +void __change_to_physical_root(struct path *saved_root) { write_lock(¤t->fs->lock); *saved_root = current->fs->root; @@ -32,7 +32,7 @@ void chroot_to_physical_root(struct path *saved_root) write_unlock(¤t->fs->lock); } -void chroot_to_saved_root(const struct path *saved_root) +void __change_to_saved_root(const struct path *saved_root) { struct path root; @@ -43,7 +43,7 @@ void chroot_to_saved_root(const struct path *saved_root) path_put(&root); } -int change_creds(struct cred **overridden, const struct cred **old, +int __change_creds(struct cred **overridden, const struct cred **old, uid_t fsuid, gid_t fsgid) { *overridden = prepare_creds(); @@ -57,7 +57,7 @@ int change_creds(struct cred **overridden, const struct cred **old, return 0; } -void revert_old_creds(struct cred *overridden, const struct cred *old) +void __revert_old_creds(struct cred *overridden, const struct cred *old) { revert_creds(old); put_cred(overridden); @@ -90,11 +90,11 @@ long create_phys_dir(const char *pathname, DEBUG(DBG_INFO, "Create dir %s\n", pathname); - error = change_creds(&overridden_creds, &old_creds, uid, gid); + error = __change_creds(&overridden_creds, &old_creds, uid, gid); if (error) goto out; - chroot_to_physical_root(&saved_path); + __change_to_physical_root(&saved_path); error = path_lookup(pathname, LOOKUP_PARENT, &nd); if (error) @@ -124,8 +124,8 @@ long create_phys_dir(const char *pathname, path_put(&nd.path); out: - chroot_to_saved_root(&saved_path); - revert_old_creds(overridden_creds, old_creds); + __change_to_saved_root(&saved_path); + __revert_old_creds(overridden_creds, old_creds); return error; } @@ -154,11 +154,11 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) DEBUG(DBG_TRACE, "Remove dir %s\n", pathname); - res = change_creds(&overridden_creds, &old_creds, uid, gid); + res = __change_creds(&overridden_creds, &old_creds, uid, gid); if (res) goto out; - chroot_to_physical_root(&saved_path); + __change_to_physical_root(&saved_path); file = filp_open(pathname, O_LARGEFILE|O_RDONLY, 0644); if (IS_ERR(file) && PTR_ERR(file) == -ENOENT) { @@ -184,8 +184,8 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) filp_close(file,current->files); out: - chroot_to_saved_root(&saved_path); - revert_old_creds(overridden_creds, old_creds); + __change_to_saved_root(&saved_path); + __revert_old_creds(overridden_creds, old_creds); return res; } @@ -213,11 +213,11 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ const struct cred *old_creds; struct cred *overridden_creds; - error = change_creds(&overridden_creds, &old_creds, uid, gid); + error = __change_creds(&overridden_creds, &old_creds, uid, gid); if (error) goto out; - chroot_to_physical_root(&saved_path); + __change_to_physical_root(&saved_path); DEBUG(DBG_INFO, "Open physical file %s with flags 0x%08x - mode %o\n", @@ -230,8 +230,8 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ DEBUG(DBG_INFO, "Open physical file %s done : %p\n", filename, file); out: - chroot_to_saved_root(&saved_path); - revert_old_creds(overridden_creds, old_creds); + __change_to_saved_root(&saved_path); + __revert_old_creds(overridden_creds, old_creds); if (error) file = ERR_PTR(error); @@ -417,11 +417,11 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) DEBUG(DBG_TRACE, "Remove file %s\n", filename); - res = change_creds(&overridden_creds, &old_creds, uid, gid); + res = __change_creds(&overridden_creds, &old_creds, uid, gid); if (res) goto out; - chroot_to_physical_root(&saved_path); + __change_to_physical_root(&saved_path); file = filp_open(filename, O_LARGEFILE|O_RDONLY, 0644); @@ -448,8 +448,8 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) DEBUG(DBG_INFO, "After vfs_unlink res = %d\n", res); out: - chroot_to_saved_root(&saved_path); - revert_old_creds(overridden_creds, old_creds); + __change_to_saved_root(&saved_path); + __revert_old_creds(overridden_creds, old_creds); return res; } commit 32569709409a6f590c3a367fd3f6f714b6c0d931 Author: Marko Obrovac <mar...@in...> Date: Tue Oct 20 13:38:16 2009 +0000 [FIX] rename include dir from cntr to kddm diff --git a/fs/kdfs/cow.c b/fs/kdfs/cow.c index 862277e..478b814 100644 --- a/fs/kdfs/cow.c +++ b/fs/kdfs/cow.c @@ -10,7 +10,7 @@ #include <linux/pagemap.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "inode.h" #include "address_space.h" diff --git a/fs/kdfs/extent.c b/fs/kdfs/extent.c index b9d0556..4d142e7 100644 --- a/fs/kdfs/extent.c +++ b/fs/kdfs/extent.c @@ -10,7 +10,7 @@ #include <linux/pagemap.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "inode.h" #include "address_space.h" commit 683476bab130ad5c1e5821fed314940981247b60 Author: alebre <alebre@debian.localdomain> Date: Tue Oct 20 14:56:48 2009 +0200 [REFACTORING] address_space.c (begin/end write and SetPageLocked) diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index a98c5ab..5b60704 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -96,20 +96,22 @@ int kdfs_readpage(struct file *file, struct page *page) return 0; } +/* TODO Suggested by Adrien for xxxx + * Priority : 3 + * Merge new kdfs_write_begin function with the older kdfs_prepare_write. + */ /* * page has been found or allocated from/in the page cache and locked * However, the data should be pre-read from the storage * Thus, one first-touch can happen. ISSUE, put data in the same page */ -int kdfs_prepare_write (struct file *file, - struct page *page, - unsigned offset, - unsigned _to) +int __kdfs_prepare_write (struct file *file, struct page *page, + unsigned offset, unsigned _to) { struct kdfs_page *k_page = NULL; struct kdfs_inode *k_inode = NULL; - DEBUG (DBG_INFO, "Prepare_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", + DEBUG (DBG_INFO, "begin_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", file->f_dentry->d_name.name, file->f_dentry->d_inode->i_ino, page->index, offset, _to, page_count(page), page->mapping); BUG_ON (page->mapping == NULL); @@ -133,8 +135,36 @@ int kdfs_prepare_write (struct file *file, return 0; } -// TODO cf. http://www.mail-archive.com/git...@vg.../msg03083.html -int kdfs_commit_write(struct file *file, +int kdfs_write_begin (struct file *file, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned flags, + struct page **pagep, void **fsdata) +{ + struct page *page; + pgoff_t index; + unsigned from; + + index = pos >> PAGE_CACHE_SHIFT; + from = pos & (PAGE_CACHE_SIZE - 1); + + page = grab_cache_page_write_begin(mapping, index, flags); + if (!page) + return -ENOMEM; + + *pagep = page; + return __kdfs_prepare_write(file, page, from, from+len); +} + + +/* TODO Suggested by Adrien for xxxx + * Priority : 3 + * Merge new kdfs_write_begin function with the older kdfs_prepare_write. + */ +/* TODO Suggested by Adrien for Adrien, + * an old TODO, ... probably just remove it ;) + * cf. http://www.mail-archive.com/git...@vg.../msg03083.html + */ +int __kdfs_commit_write(struct file *file, struct page *page, unsigned offset, unsigned _to) @@ -170,6 +200,30 @@ int kdfs_commit_write(struct file *file, return 0; } +int kdfs_write_end(struct file *file, + struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata) +{ + unsigned from = pos & (PAGE_CACHE_SIZE - 1); + + /* zero the stale part of the page if we did a short copy */ + if (copied < len) { + void *kaddr = kmap_atomic(page, KM_USER0); + memset(kaddr + from + copied, 0, len - copied); + flush_dcache_page(page); + kunmap_atomic(kaddr, KM_USER0); + } + + __kdfs_commit_write(file, page, from, from+copied); + + unlock_page(page); + page_cache_release(page); + + return copied; +} + + int kdfs_writepage(struct page *page, struct writeback_control *wbc) { @@ -240,9 +294,9 @@ int kdfs_releasepage(struct page *page, gfp_t mask) } struct address_space_operations kdfs_aops = { - .commit_write = kdfs_commit_write, + .write_begin = kdfs_write_begin, + .write_end = kdfs_write_end, .invalidatepage = kdfs_invalidatepage, - .prepare_write = kdfs_prepare_write, .readpage = kdfs_readpage, .releasepage = kdfs_releasepage, .writepage = kdfs_writepage, @@ -612,7 +666,7 @@ int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t obji struct kdfs_page *k_page = (struct kdfs_page *)objEntry->object; PRINT_FUNCTION_NAME; - SetPageLocked(k_page->page); + trylock_page(k_page->page); DEBUG(DBG_ALERT, "Page count before =%d\n", page_count(k_page->page)); remove_from_page_cache(k_page->page); ClearPagePrivate(k_page->page); @@ -734,7 +788,7 @@ int kdfs_iol_page_remove(void *object, struct kddm_set *set, objid_t objid) * so we need to remove the page from the cache by hand, because * we are not called by the VFS */ - SetPageLocked(k_page->page); + trylock_page(k_page->page); DEBUG(DBG_ALERT, "Page count before =%d\n", page_count(k_page->page)); remove_from_page_cache(k_page->page); ClearPagePrivate(k_page->page); diff --git a/fs/kdfs/address_space.h b/fs/kdfs/address_space.h index 68ca007..5a7ac7a 100644 --- a/fs/kdfs/address_space.h +++ b/fs/kdfs/address_space.h @@ -9,6 +9,7 @@ * @maintainer Adrien Lebre * * Copyright (C) 2006-2007, XtreemOS Consortium. + * Copyright (C) 2008-20xx, XtreemOS Consortium, Ascola Research Group. */ #ifndef __KDFS_ADDR_SPACE__ diff --git a/fs/kdfs/dir.c b/fs/kdfs/dir.c index 3c5a67a..6eb9439 100644 --- a/fs/kdfs/dir.c +++ b/fs/kdfs/dir.c @@ -595,7 +595,7 @@ int kdfs_make_empty(struct kdfs_inode *k_pdir, struct kdfs_inode *k_dir) */ int kdfs_dir_empty(struct kdfs_inode *k_dir) { - DEBUG(DBG_INFO, "Directory size: %llu empty if: %d\n", k_dir->inode->i_size, KDFS_DIRENT_SIZE * 2); + DEBUG(DBG_INFO, "Directory size: %llu empty if: %ld\n", k_dir->inode->i_size, KDFS_DIRENT_SIZE * 2); if (k_dir->inode->i_size > KDFS_DIRENT_SIZE * 2) return 0; return 1; diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 10ec71a..f126cb8 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -180,8 +180,8 @@ struct kdfs_inode *__kdfs_mknod(struct kdfs_inode *k_pdir, break; } - k_nnod->inode->i_uid = current->fsuid; - k_nnod->inode->i_gid = current->fsgid; + k_nnod->inode->i_uid = current_fsuid(); + k_nnod->inode->i_gid = current_fsgid(); if (k_pdir->inode->i_mode & S_ISGID) { k_nnod->inode->i_gid = k_pdir->inode->i_gid; commit 308d9d7359144747056bcfeec4b797d2253d041e Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 13:38:44 2009 +0200 [FIX] Correct the code using read_inode which is not in the new kernels. Closed ticket #7 diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 0460ec1..a98c5ab 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -825,7 +825,7 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) iput(inode); } else { DEBUG(DBG_INFO, "K_mapping will be retrieve from iget\n"); - inode = iget(k_sb->sb, content_data->ino); + inode = kdfs_getinode(k_sb->sb, content_data->ino); content_data->k_mapping = inode->i_mapping; } if (!content_data->k_mapping) diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 3cf9616..10ec71a 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -1142,7 +1142,7 @@ int kdfs_iol_inode_first_touch(kddm_obj_t *objEntry, if (k_inode->inode) iput(k_inode->inode); else - k_inode->inode = iget(k_sb->sb, objid); + k_inode->inode = kdfs_getinode(k_sb->sb, objid); k_inode->flags = K_INODE_OK; } diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 045c077..da2f32e 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -921,14 +921,14 @@ int kdfs_statfs(struct dentry *dfs, struct kstatfs *buf) * @param inode the VFS inode * */ -void kdfs_read_inode(struct inode *inode) +struct inode *kdfs_getinode(struct super_block *sb, unsigned long ino) { + struct inode *inode = NULL; struct file *file = NULL; char *phys_filename = NULL; struct kdfs_physical_inode phys_inode; PRINT_FUNCTION_NAME ; - ASSERT (inode != NULL) ; /* * TODO PRIORITY 2: Adrien @@ -936,6 +936,11 @@ void kdfs_read_inode(struct inode *inode) * For the moment, the workaround consists in using sb->s_fs_info to * reach it. It is probably not the best and cleanest solution. */ + inode = iget_locked(sb, ino); + if (!inode) + return ERR_PTR(-ENOMEM); + if (!(inode->i_state & I_NEW)) + return inode; /* Retrieve the inode meta file */ phys_filename = kmalloc(PATH_MAX, GFP_KERNEL); @@ -975,7 +980,9 @@ void kdfs_read_inode(struct inode *inode) inode->i_ino, ((struct kdfs_super_block*)inode->i_sb->s_fs_info)->k_opt->part_name); kfree(phys_filename); + unlock_new_inode(inode); PRINT_FUNCTION_EXIT; + return inode; } /* @@ -1254,7 +1261,6 @@ out: static struct super_operations kdfs_sops = { .delete_inode = kdfs_delete_inode, .drop_inode = kdfs_drop_inode, - .read_inode = kdfs_read_inode, .show_options = kdfs_show_options, .statfs = kdfs_statfs, .sync_fs = kdfs_sync_fs, diff --git a/fs/kdfs/super.h b/fs/kdfs/super.h index 36fc1f0..f480a74 100644 --- a/fs/kdfs/super.h +++ b/fs/kdfs/super.h @@ -216,6 +216,7 @@ void cleanup_kdfs(void); void kdfs_getphysicalpath(struct kdfs_super_block *k_sb, unsigned long ino, char *physical_filename); int kdfs_write_inode(struct inode *inode); +struct inode *kdfs_getinode(struct super_block *sb, unsigned long ino); /* Get a free inode id from kdfs_sb partition */ ino_t kdfs_get_freeino(struct kdfs_super_block *k_sb); commit 3d3a34c2490a0ea96b39ba2acbacfb37b1ddd953 Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 13:27:11 2009 +0200 [FIX] Correct all include paths to kddm.h diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 65ae72f..0460ec1 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -13,7 +13,7 @@ #include <linux/pagemap.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "super.h" #include "inode.h" diff --git a/fs/kdfs/dir.c b/fs/kdfs/dir.c index 644d248..3c5a67a 100644 --- a/fs/kdfs/dir.c +++ b/fs/kdfs/dir.c @@ -13,7 +13,7 @@ #include <linux/buffer_head.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "super.h" #include "inode.h" diff --git a/fs/kdfs/file.c b/fs/kdfs/file.c index ea9898e..a1707bc 100644 --- a/fs/kdfs/file.c +++ b/fs/kdfs/file.c @@ -13,7 +13,7 @@ #include <linux/buffer_head.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "super.h" #include "inode.h" commit 109f85f01d10bf1fd2e3d59f59e49eb0eb62e9ff Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 11:04:01 2009 +0200 [FIX] Fix printing of i_version which is u64 diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index ab0c3cd..3cf9616 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -37,7 +37,7 @@ void print_inode_cont(struct inode *node) printk(" i_nlink: %u\n", node->i_nlink); printk(" i_uid: %u\n", node->i_uid); printk(" i_gid: %u\n", node->i_gid); - printk("i_version: %ld\n", node->i_version); + printk("i_version: %llu\n", (unsigned long long)node->i_version); printk(" i_mode: %x\n\n\n", node->i_mode); } commit 6332d47e895e0e17ae76521800e1ba6eb54c7a23 Author: Pierre Riteau <Pie...@ir...> Date: Tue Oct 20 11:03:09 2009 +0200 [FIX] Fix include path diff --git a/fs/kdfs/inode.c b/fs/kdfs/inode.c index 3e991b0..ab0c3cd 100644 --- a/fs/kdfs/inode.c +++ b/fs/kdfs/inode.c @@ -11,7 +11,7 @@ * Copyright (C) 2006-2007, XtreemOS Consortium. */ -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "super.h" #include "inode.h" commit 2adf3013922a9ca6dffb7e42c2847134a0167274 Author: Marko Obrovac <mar...@in...> Date: Mon Oct 19 12:07:47 2009 +0000 [FIX] Remove unused (and deprecated) super_operations member put_inode (partial ticket #7) diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 2de6c0d..045c077 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -1043,23 +1043,6 @@ int kdfs_write_inode(struct inode *inode) } /* - * Put a kdfs inode - * This function is called by the VFS when someone calls iput() - * - * @author Adrien Lebre - * - * @param inode The VFS inode - * @comment This function is mainly used for debugging purpose. - * From kDFS behavior point of view, it is useless and has probably - * to be simply removed. - */ -void kdfs_put_inode(struct inode *inode) -{ - DEBUG (DBG_INFO, "inode id %ld (i_count = %d)\n", - inode->i_ino, atomic_read(&inode->i_count)); -} - -/* * Drop a kdfs inode from the inode cache * This function is called by the VFS when someone calls iput_final() * @@ -1271,7 +1254,6 @@ out: static struct super_operations kdfs_sops = { .delete_inode = kdfs_delete_inode, .drop_inode = kdfs_drop_inode, - .put_inode = kdfs_put_inode, .read_inode = kdfs_read_inode, .show_options = kdfs_show_options, .statfs = kdfs_statfs, commit 7d4f4669897ca3bcc7d540c4bf0f81bc4b65268a Author: Marko Obrovac <mar...@in...> Date: Mon Oct 19 11:52:02 2009 +0000 [ADD] Added kDFS linker and kddm set constants diff --git a/include/kddm/io_linker.h b/include/kddm/io_linker.h index 934a154..41abb51 100644 --- a/include/kddm/io_linker.h +++ b/include/kddm/io_linker.h @@ -64,6 +64,7 @@ enum STRING_LIST_LINKER, KDDM_TEST_LINKER, MM_STRUCT_LINKER, + SB_LINKER, MAX_IO_LINKER, /* MUST always be the last one */ } ; diff --git a/include/kddm/kddm_set.h b/include/kddm/kddm_set.h index 3e3f54b..6853124 100644 --- a/include/kddm/kddm_set.h +++ b/include/kddm/kddm_set.h @@ -106,6 +106,7 @@ enum KDDM_TEST4_LOC, // 68 KDDM_TEST4096, // 69 MM_STRUCT_KDDM_ID, // 70 + KDFS_SB_KDDM_ID, MIN_KDDM_ID, /* MUST always be the last one */ }; commit 8f6cb18b661235e591b33504349f031d2021e59a Author: Marko Obrovac <mar...@in...> Date: Sun Oct 18 22:23:21 2009 +0200 [FIX] ProcFS: the proc_root_fs variable is not available any more (and non-existent, for that matter). Instead, file systems should register themselves with the "fs/FS_NAME" name syntax, leaving the parent proc_dir as NULL. Also, the write_proc function should return an int, not a ssize_t. The "owner" field is no longer available as part of the proc_dir_entry structure. Following other file systems' example, it was simple removed from the code (apparently, there's another way of keeping track of processes using a proc entry) [FIX] Fixed a printk - when printing long ints, %ld should be used [FIX] super_operations the signature of umount changed - now there's only one argument - the super_block which should be unmounted. There are still other issues concerning the super_operations structure that need to be solved - see ticket #7 [FIX] simple_set_mnt does not return an error code any more. However, looking at other file systems, they seem just to use it "as-is", so probably we should remove the code below it (which used to handle error cases) diff --git a/fs/kdfs/super.c b/fs/kdfs/super.c index 8711213..2de6c0d 100644 --- a/fs/kdfs/super.c +++ b/fs/kdfs/super.c @@ -17,7 +17,7 @@ #include <linux/proc_fs.h> #include <linux/seq_file.h> -#include <ctnr/kddm.h> +#include <kddm/kddm.h> #include "physical_fs.h" #include "super.h" @@ -80,7 +80,7 @@ kdfs_node_t k_rootsb_nodeid = KERRIGHED_NODE_ID_NONE; struct proc_dir_entry *proc_fs_kdfs = NULL; /* Increase the kdfs_gen counter. Used by checkpoint code */ -ssize_t kdfs_proc_inc_gen(struct file *filp, const char __user *buf, +int kdfs_proc_inc_gen(struct file *filp, const char __user *buf, unsigned long len, void *data) { extern unsigned int kdfs_gen; @@ -89,7 +89,7 @@ ssize_t kdfs_proc_inc_gen(struct file *filp, const char __user *buf, } /* Lists the inodes of the local kDFS superblock */ -ssize_t kdfs_proc_inodes_write(struct file *filp, const char __user *buf, +int kdfs_proc_inodes_write(struct file *filp, const char __user *buf, unsigned long len, void *data) { struct inode *inode; @@ -112,7 +112,7 @@ ssize_t kdfs_proc_inodes_write(struct file *filp, const char __user *buf, printk(" Inode %ld, count %d, mode %u, size %lld\n", inode->i_ino, atomic_read(&inode->i_count), inode->i_mode, inode->i_size); printk("Dumping s_files list\n"); list_for_each_entry(file, &k_sb->sb->s_files, f_u.fu_list) - printk(" File with count %d", atomic_read(&file->f_count)); + printk(" File with count %ld", atomic_read(&file->f_count)); } else printk("There is no kDFS superblock file on the current node\n"); @@ -1165,7 +1165,7 @@ void kdfs_delete_inode(struct inode *inode) PRINT_FUNCTION_EXIT; } -void kdfs_umount(struct vfsmount *vfsmnt, int flags) +void kdfs_umount(/*struct vfsmount *vfsmnt, int flags*/struct super_block *sb) { struct kdfs_super_block *k_sb = NULL; struct kdfs_cw_sb *k_cwsb = NULL; @@ -1175,6 +1175,12 @@ void kdfs_umount(struct vfsmount *vfsmnt, int flags) k_sb = kdfs_grabsb(kerrighed_node_id); BUG_ON(k_sb == NULL); + + if (k_sb->sb != sb) { + DEBUG(DBG_INFO, "The super block to umount is not a kdfs one!\n"); + return; + } + BUG_ON(k_sb->inode_bitmap == NULL); sb_bitmap_save(k_sb); @@ -1387,8 +1393,14 @@ int kdfs_get_sb(struct file_system_type *fs_type, int flags, } //TODO PRIORITY 3: Check where this come from (ext2fs super block?) and see why we would (not?) need it //kdfs_sb->sb->s_flags |= MS_ACTIVE; - error = simple_set_mnt(mnt, k_sb->sb); + simple_set_mnt(mnt, k_sb->sb); + /* + * TODO: simple_set_mnt returns void now! Thus, this code + * will never be executed so it becomes useless!!! + * Check whether there are other places where this + * should be checked, i.e. become usefull + */ if (error < 0) { DEBUG(DBG_ALERT, "Can't retrieve KDFS super bloc\n"); // TODO PRIORITY 1: Put some goto to manage all errors @@ -1549,22 +1561,18 @@ int init_kdfs() */ /* Create /proc/fs/kdfs directory */ - proc_fs_kdfs = proc_mkdir("kdfs", proc_root_fs); + proc_fs_kdfs = proc_mkdir("fs/kdfs", NULL); if (proc_fs_kdfs == NULL) return -ENOMEM; - /* owner is used to avoid unloading the module while the entry is in use */ - proc_fs_kdfs->owner = THIS_MODULE; p = create_proc_entry("inodes", S_IFREG|S_IRUGO, proc_fs_kdfs); if (p == NULL) return -ENOMEM; - p->owner = THIS_MODULE; p->write_proc = kdfs_proc_inodes_write; p = create_proc_entry("gen", S_IFREG|S_IRUGO, proc_fs_kdfs); if (p == NULL) return -ENOMEM; - p->owner = THIS_MODULE; p->write_proc = kdfs_proc_inc_gen; #endif @@ -1596,7 +1604,7 @@ void cleanup_kdfs(void) #ifdef __KDFS_PROCDIR_ remove_proc_entry("gen", proc_fs_kdfs); remove_proc_entry("inodes", proc_fs_kdfs); - remove_proc_entry("kdfs", proc_root_fs); + remove_proc_entry("fs/kdfs", NULL); #endif unregister_filesystem(&kdfs_fs_type); commit 5bd840461f5e33cf9ee0a83751daae473b1407c6 Author: Marko Obrovac <mar...@in...> Date: Sun Oct 18 19:23:52 2009 +0200 [FIX] Conform the nameidata structure changes to the newest kernel structure diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index c6a7f47..0ae67a8 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -114,14 +114,14 @@ long create_phys_dir(const char *pathname, lockdep_on(); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { - error = vfs_mkdir(nd.dentry->d_inode, dentry, mode); + error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode); dput(dentry); } lockdep_off(); - mutex_unlock(&nd.dentry->d_inode->i_mutex); + mutex_unlock(&nd.path.dentry->d_inode->i_mutex); lockdep_on(); - path_release(&nd); + path_put(&nd.path); out: chroot_to_saved_root(&saved_path); @@ -208,7 +208,7 @@ out: struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_t gid) { int error = 0; - struct file *file; + struct file *file = NULL; struct path saved_path; const struct cred *old_creds; struct cred *overridden_creds; commit 17301662a4431352d1e9a8baa5ef125322363f8a Author: Marko Obrovac <mar...@in...> Date: Sun Oct 18 19:02:42 2009 +0200 [FIX] Change to newest kernel structure changes concerning credentials and file system structure changes (tickets #4, #5) diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index 6b91b91..c6a7f47 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -16,12 +16,53 @@ #include <asm/uaccess.h> #include <linux/namei.h> +#include <linux/fs_struct.h> #include "physical_fs.h" #include "debug_kdfs.h" #define KDFS_PART "KDFS - Native File System Accesses" + +void chroot_to_physical_root(struct path *saved_root) +{ + write_lock(¤t->fs->lock); + *saved_root = current->fs->root; + current->fs->root = init_task.fs->root; + write_unlock(¤t->fs->lock); +} + +void chroot_to_saved_root(const struct path *saved_root) +{ + struct path root; + + write_lock(¤t->fs->lock); + root = current->fs->root; + current->fs->root = *saved_root; + write_unlock(¤t->fs->lock); + path_put(&root); +} + +int change_creds(struct cred **overridden, const struct cred **old, + uid_t fsuid, gid_t fsgid) +{ + *overridden = prepare_creds(); + if (!*overridden) + return -ENOMEM; + + (*overridden)->fsuid = fsuid; + (*overridden)->fsgid = fsgid; + *old = override_creds(*overridden); + + return 0; +} + +void revert_old_creds(struct cred *overridden, const struct cred *old) +{ + revert_creds(old); + put_cred(overridden); +} + /* * Create a physical directory * @@ -43,23 +84,18 @@ long create_phys_dir(const char *pathname, int error = 0; struct dentry *dentry; struct nameidata nd; - struct dentry *saved_root; - struct vfsmount *saved_mnt; - uid_t saved_uid; - gid_t saved_gid; + struct path saved_path; + const struct cred *old_creds; + struct cred *overridden_creds; DEBUG(DBG_INFO, "Create dir %s\n", pathname); - saved_mnt = current->fs->rootmnt; - saved_root = current->fs->root; - saved_uid = current_fsuid(); - saved_gid = current_fsgid(); - - current->fs->rootmnt = init_task.fs->rootmnt; - current->fs->root = init_task.fs->root; - current->fsuid = uid; - current->fsgid = gid; - + error = change_creds(&overridden_creds, &old_creds, uid, gid); + if (error) + goto out; + + chroot_to_physical_root(&saved_path); + error = path_lookup(pathname, LOOKUP_PARENT, &nd); if (error) goto out; @@ -88,10 +124,8 @@ long create_phys_dir(const char *pathname, path_release(&nd); out: - current->fsuid = saved_uid; - current->fsgid = saved_gid; - current->fs->rootmnt = saved_mnt; - current->fs->root = saved_root; + chroot_to_saved_root(&saved_path); + revert_old_creds(overridden_creds, old_creds); return error; } @@ -111,26 +145,21 @@ out: long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) { struct file *file = NULL; - struct dentry *dentry; - struct inode *dir; + struct dentry *dentry; + struct inode *dir; long res = 0; - struct dentry *saved_root; - struct vfsmount *saved_mnt; - uid_t saved_uid; - gid_t saved_gid; + struct path saved_path; + const struct cred *old_creds; + struct cred *overridden_creds; DEBUG(DBG_TRACE, "Remove dir %s\n", pathname); - saved_mnt = current->fs->rootmnt; - saved_root = current->fs->root; - saved_uid = current_fsuid(); - saved_gid = current_fsgid(); - - current->fs->rootmnt = init_task.fs->rootmnt; - current->fs->root = init_task.fs->root; - current->fsuid = uid; - current->fsgid = gid; - + res = change_creds(&overridden_creds, &old_creds, uid, gid); + if (res) + goto out; + + chroot_to_physical_root(&saved_path); + file = filp_open(pathname, O_LARGEFILE|O_RDONLY, 0644); if (IS_ERR(file) && PTR_ERR(file) == -ENOENT) { DEBUG(DBG_INFO, "Can't access to phys_dir %s\n", pathname); @@ -155,10 +184,8 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) filp_close(file,current->files); out: - current->fsuid = saved_uid; - current->fsgid = saved_gid; - current->fs->rootmnt = saved_mnt; - current->fs->root = saved_root; + chroot_to_saved_root(&saved_path); + revert_old_creds(overridden_creds, old_creds); return res; } @@ -180,37 +207,35 @@ out: */ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_t gid) { - struct dentry *saved_root; - struct vfsmount *saved_mnt; - uid_t saved_uid; - gid_t saved_gid; + int error = 0; struct file *file; + struct path saved_path; + const struct cred *old_creds; + struct cred *overridden_creds; + + error = change_creds(&overridden_creds, &old_creds, uid, gid); + if (error) + goto out; + + chroot_to_physical_root(&saved_path); DEBUG(DBG_INFO, "Open physical file %s with flags 0x%08x - mode %o\n", filename, flags, mode); - saved_mnt = current->fs->rootmnt; - saved_root = current->fs->root; - saved_uid = current_fsuid(); - saved_gid = current_fsgid(); - - current->fs->rootmnt = init_task.fs->rootmnt; - current->fs->root = init_task.fs->root; - current->fsuid = uid; - current->fsgid = gid; - lockdep_off(); file = filp_open(filename, flags, mode); lockdep_on(); - current->fsuid = saved_uid; - current->fsgid = saved_gid; - current->fs->rootmnt = saved_mnt; - current->fs->root = saved_root; - DEBUG(DBG_INFO, "Open physical file %s done : %p\n", filename, file); +out: + chroot_to_saved_root(&saved_path); + revert_old_creds(overridden_creds, old_creds); + + if (error) + file = ERR_PTR(error); + return file; } @@ -386,22 +411,17 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) struct dentry *dentry; struct inode *dir; int res = 0; - struct dentry *saved_root; - struct vfsmount *saved_mnt; - uid_t saved_uid; - gid_t saved_gid; + struct path saved_path; + const struct cred *old_creds; + struct cred *overridden_creds; DEBUG(DBG_TRACE, "Remove file %s\n", filename); - saved_mnt = current->fs->rootmnt; - saved_root = current->fs->root; - saved_uid = current_fsuid(); - saved_gid = current_fsgid(); - - current->fs->rootmnt = init_task.fs->rootmnt; - current->fs->root = init_task.fs->root; - current->fsuid = uid; - current->fsgid = gid; + res = change_creds(&overridden_creds, &old_creds, uid, gid); + if (res) + goto out; + + chroot_to_physical_root(&saved_path); file = filp_open(filename, O_LARGEFILE|O_RDONLY, 0644); @@ -428,10 +448,8 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) DEBUG(DBG_INFO, "After vfs_unlink res = %d\n", res); out: - current->fsuid = saved_uid; - current->fsgid = saved_gid; - current->fs->rootmnt = saved_mnt; - current->fs->root = saved_root; + chroot_to_saved_root(&saved_path); + revert_old_creds(overridden_creds, old_creds); return res; } commit a1b5a937506912cc8e339d002ed54e8f3ec2cc34 Author: Marko Obrovac <mar...@in...> Date: Fri Oct 16 17:05:38 2009 +0000 [MINOR] Fix part (the "read" part) of ticket #3 (nonexisting task_struct members) diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index 689f690..6b91b91 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -52,8 +52,8 @@ long create_phys_dir(const char *pathname, saved_mnt = current->fs->rootmnt; saved_root = current->fs->root; - saved_uid = current->fsuid; - saved_gid = current->fsgid; + saved_uid = current_fsuid(); + saved_gid = current_fsgid(); current->fs->rootmnt = init_task.fs->rootmnt; current->fs->root = init_task.fs->root; @@ -123,8 +123,8 @@ long remove_phys_dir(const char *pathname, uid_t uid, gid_t gid) saved_mnt = current->fs->rootmnt; saved_root = current->fs->root; - saved_uid = current->fsuid; - saved_gid = current->fsgid; + saved_uid = current_fsuid(); + saved_gid = current_fsgid(); current->fs->rootmnt = init_task.fs->rootmnt; current->fs->root = init_task.fs->root; @@ -192,8 +192,8 @@ struct file *open_phys_file(char *filename, int flags, int mode, uid_t uid, gid_ saved_mnt = current->fs->rootmnt; saved_root = current->fs->root; - saved_uid = current->fsuid; - saved_gid = current->fsgid; + saved_uid = current_fsuid(); + saved_gid = current_fsgid(); current->fs->rootmnt = init_task.fs->rootmnt; current->fs->root = init_task.fs->root; @@ -395,8 +395,8 @@ int remove_phys_file(const char *filename, uid_t uid, gid_t gid) saved_mnt = current->fs->rootmnt; saved_root = current->fs->root; - saved_uid = current->fsuid; - saved_gid = current->fsgid; + saved_uid = current_fsuid(); + saved_gid = current_fsgid(); current->fs->rootmnt = init_task.fs->rootmnt; current->fs->root = init_task.fs->root; commit 29ceb8abebd6ea37670ecbf0f5fc19e280bdeb29 Author: Marko Obrovac <mar...@in...> Date: Fri Oct 16 16:22:38 2009 +0000 [FIX] Introduce linux/namei.h (struct nameidata) Closed ticket #2 diff --git a/fs/kdfs/physical_fs.c b/fs/kdfs/physical_fs.c index 36273ca..689f690 100644 --- a/fs/kdfs/physical_fs.c +++ b/fs/kdfs/physical_fs.c @@ -15,6 +15,7 @@ #endif #include <asm/uaccess.h> +#include <linux/namei.h> #include "physical_fs.h" commit 04a5f0a443f52df5a415ddbbd8cc33bdbed37c5c Author: Marko Obrovac <mar...@in...> Date: Fri Oct 16 15:45:34 2009 +0000 [FIX] Conform the debugging to new kerrighed/kernel guidelines diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 59a5b9d..65ae72f 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -77,13 +77,13 @@ int kdfs_readpage(struct file *file, struct page *page) ASSERT(page != NULL); k_inode=kdfs_ilocalfind(page->mapping->host->i_ino); if (k_inode->content_setid == KDDM_SET_UNUSED) - DEBUG (DBG_KDFS_ADDRSPACE, DBG_PANIC, "No contentset associated.... looks really strange (inode %lu, name %s)\n", + DEBUG (DBG_PANIC, "No contentset associated.... looks really strange (inode %lu, name %s)\n", k_inode->inode->i_ino, list_entry(k_inode->inode->i_dentry.next, struct dentry, d_alias)->d_name.name); /* TODO PRIORITY 2: test kdfs_get_page returned value */ k_page = kdfs_get_page(k_inode->content_setid, page->index); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, " Readpage k_page->page : %p and page %p\n", k_page->page, page); + DEBUG(DBG_INFO, " Readpage k_page->page : %p and page %p\n", k_page->page, page); BUG_ON(k_page->page != page); SetPageUptodate(k_page->page); @@ -109,7 +109,7 @@ int kdfs_prepare_write (struct file *file, struct kdfs_page *k_page = NULL; struct kdfs_inode *k_inode = NULL; - DEBUG (DBG_KDFS_ADDRSPACE, DBG_INFO, "Prepare_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", + DEBUG (DBG_INFO, "Prepare_write for file %s (ino %ld), page %ld from %d to %d (count = %d, mapping = %p)\n", file->f_dentry->d_name.name, file->f_dentry->d_inode->i_ino, page->index, offset, _to, page_count(page), page->mapping); BUG_ON (page->mapping == NULL); @@ -117,7 +117,7 @@ int kdfs_prepare_write (struct file *file, k_inode=kdfs_ilocalfind(file->f_dentry->d_inode->i_ino); if(k_inode->content_setid == KDDM_SET_UNUSED){ - DEBUG (DBG_KDFS_ADDRSPACE, DBG_PANIC, "No contentset associated.... looks really strange \n"); + DEBUG (DBG_PANIC, "No contentset associated.... looks really strange \n"); } /* TODO PRIORITY 2: test kdfs_get_page returned value */ @@ -141,7 +141,7 @@ int kdfs_commit_write(struct file *file, { struct kdfs_inode *k_inode = NULL; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "commit_write for page %ld for file %s" + DEBUG(DBG_INFO, "commit_write for page %ld for file %s" "(ino %lu) (from %u to %u) (count = %d)\n", page->index, file->f_dentry->d_name.name, file->f_dentry->d_inode->i_ino, offset, _to, @@ -149,7 +149,7 @@ int kdfs_commit_write(struct file *file, k_inode = kdfs_ilocalfind(file->f_dentry->d_inode->i_ino); if (k_inode->content_setid == KDDM_SET_UNUSED) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_PANIC, "No contentset associated.... looks really strange \n"); + DEBUG(DBG_PANIC, "No contentset associated.... looks really strange \n"); if (((loff_t)page->index * PAGE_SIZE) + _to > k_inode->inode->i_size) i_size_write(k_inode->inode, ((loff_t)page->index * PAGE_SIZE) + _to); @@ -257,19 +257,19 @@ struct address_space_operations kdfs_aops = { struct kdfs_page *kdfs_get_page(kddm_set_id_t set_id, objid_t obj_id) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Get page %ld from set %ld\n", obj_id, set_id); + DEBUG(DBG_INFO, "Get page %ld from set %ld\n", obj_id, set_id); return kddm_get_object(kddm_def_ns, set_id, obj_id); } struct kdfs_page *kdfs_grab_page(kddm_set_id_t set_id, objid_t obj_id) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); + DEBUG(DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); return kddm_grab_object(kddm_def_ns, set_id, obj_id); } struct kdfs_page *kdfs_findlocal_page(kddm_set_id_t set_id, objid_t obj_id) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); + DEBUG(DBG_INFO, "Grab page %ld from set %ld\n", obj_id, set_id); return kddm_find_object(kddm_def_ns, set_id, obj_id); } @@ -280,13 +280,13 @@ void __kdfs_put_page(kddm_set_id_t set_id, objid_t obj_id) void _kdfs_put_page(struct kdfs_page *k_page) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Put page %ld from set %ld\n", k_page->obj_id, k_page->set_id); + DEBUG(DBG_INFO, "Put page %ld from set %ld\n", k_page->obj_id, k_page->set_id); kddm_put_object(kddm_def_ns, k_page->set_id, k_page->obj_id); } void kdfs_mark_page_dirty(kddm_set_id_t set_id, objid_t obj_id) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Sync page %ld from set %lu\n", obj_id, set_id); + DEBUG(DBG_INFO, "Sync page %ld from set %lu\n", obj_id, set_id); kddm_sync_frozen_object(kddm_def_ns, set_id, obj_id); } @@ -328,7 +328,7 @@ kddm_set_t *__create_content_kddm_set(kddm_set_id_t set_id, content_data, sizeof(struct content_iolinker_data), KDDM_FT_LINKED); if (IS_ERR(kddm_set)) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_PANIC, "Can't create content kddm_set for inode %ld\n", k_inode->inode->i_ino); + DEBUG(DBG_PANIC, "Can't create content kddm_set for inode %ld\n", k_inode->inode->i_ino); /* We can free all the memory allocated */ kfree(content_data); @@ -372,7 +372,7 @@ int __local_destroy_content_kddm_set(struct kdfs_inode *k_inode) kddm_set = _local_get_kddm_set(kddm_def_ns, k_inode->content_setid); if (!kddm_set) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "The associated kddm_set for inode %ld hasn't been instantiated\n", k_inode->inode->i_ino); + DEBUG(DBG_INFO, "The associated kddm_set for inode %ld hasn't been instantiated\n", k_inode->inode->i_ino); else{ /* * TODO PRIORITY 1, Adrien / (Renaud kDDM stuff) @@ -426,10 +426,10 @@ 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_KDFS_ADDRSPACE, DBG_INFO, "Before Alloc new page %ld from set %lu \n", objid, set->id); + DEBUG(DBG_INFO, "Before Alloc new page %ld from set %lu \n", objid, set->id); k_page->page = find_get_page(k_mapping, objid); if (!k_page->page) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, + DEBUG(DBG_ALERT, "Can't find page for file/directory = %ld and page id = %ld, So created and locked\n", k_mapping->host->i_ino, objid); k_page->page = find_or_create_page(k_mapping, objid, mapping_gfp_mask(k_mapping) & ~__GFP_FS); @@ -437,7 +437,7 @@ int kdfs_iol_page_alloc(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) } else k_page->flags = K_PG_ok; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "After Alloc new page %ld from set %lu (page addr=%p count=%d)\n", objid, set->id, k_page->page, page_count(k_page->page)); + DEBUG(DBG_INFO, "After Alloc new page %ld from set %lu (page addr=%p count=%d)\n", objid, set->id, k_page->page, page_count(k_page->page)); k_page->set_id = set->id; k_page->obj_id = objid; @@ -476,13 +476,13 @@ int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, iolinker_data = (struct content_iolinker_data *) set->private_data; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_TRACE, "file/directory = %ld, pageid = %ld gonna to retrieve inode \n", iolinker_data->ino, objid); + DEBUG(DBG_TRACE, "file/directory = %ld, pageid = %ld gonna to retrieve inode \n", iolinker_data->ino, objid); /* WARNING: quite ugly, we should not access to a local inode without locking the corresponding kddm object*/ k_mapping = ((struct content_iolinker_data *) set->private_data)->k_mapping; ASSERT(k_mapping); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_TRACE, "file/directory = %ld, pageid = %ld mapping = %p\n", iolinker_data->ino, objid, k_mapping); + DEBUG(DBG_TRACE, "file/directory = %ld, pageid = %ld mapping = %p\n", iolinker_data->ino, objid, k_mapping); /* Allocate kdfs_page and retrieve page address */ k_page = kmalloc(sizeof(struct kdfs_page), GFP_KERNEL); @@ -500,13 +500,13 @@ int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, k_page->page = find_get_page(k_mapping, objid); if (!k_page->page) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Can't find page for file/directory = %ld and page id = %ld, So created and locked\n", iolinker_data->ino, objid); + DEBUG(DBG_ALERT, "Can't find page for file/directory = %ld and page id = %ld, So created and locked\n", iolinker_data->ino, objid); k_page->page = find_or_create_page(k_mapping, objid, (mapping_gfp_mask(k_mapping)|__GFP_ZERO) & ~__GFP_FS); k_page->flags = K_PG_locked; } else k_page->flags = K_PG_ok; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "After find Page count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "After find Page count=%d\n", page_count(k_page->page)); page_addr = (char *) kmap(k_page->page); pos = (loff_t)objid * PAGE_SIZE; @@ -516,14 +516,14 @@ int kdfs_iol_page_first_touch(kddm_obj_t *objEntry, kunmap(k_page->page); if (!IS_ERR(k_page->page)) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Can't read page for file/directory = %ld and page id = %ld\n", iolinker_data->ino, objid); + DEBUG(DBG_ALERT, "Can't read page for file/directory = %ld and page id = %ld\n", iolinker_data->ino, objid); objEntry->object = (void *) k_page; /* TODO PRIORITY 2: should release in kdfs_put_page instead? */ //page_cache_release(k_page->page); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "After read Page count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "After read Page count=%d\n", page_count(k_page->page)); PRINT_FUNCTION_EXIT; return res; @@ -543,7 +543,7 @@ int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) PRINT_FUNCTION_NAME; k_page = (struct kdfs_page *) objEntry->object; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Entering page count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Entering page count=%d\n", page_count(k_page->page)); /* * Set the private field of the page to get callback when it is @@ -562,7 +562,7 @@ int kdfs_iol_page_insert(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) } page_cache_release(k_page->page); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Exiting page count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Exiting page count=%d\n", page_count(k_page->page)); PRINT_FUNCTION_EXIT; return 0; } @@ -587,7 +587,7 @@ int kdfs_iol_page_export (struct rpc_desc *desc, res = rpc_pack(desc, 0, page_addr, PAGE_SIZE); if (res < 0) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "can't pack export page (res=%d)\n", res); + DEBUG(DBG_ALERT, "can't pack export page (res=%d)\n", res); kunmap_atomic(page_addr, KM_USER0); @@ -613,12 +613,12 @@ int kdfs_iol_page_invalidate(kddm_obj_t *objEntry, kddm_set_t *set, objid_t obji PRINT_FUNCTION_NAME; SetPageLocked(k_page->page); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page count before =%d\n", page_count(k_page->page)); + 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); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); /* * TODO PRIORITY 2: Adrien * Page Count should be probably decremented @@ -675,7 +675,7 @@ int kdfs_iol_page_sync(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) ASSERT(k_page != NULL); ASSERT(k_page->page != NULL); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Try to sync page %ld (page addr %p) of set %lu\n", objid, k_page->page, set->id); + 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)objid * PAGE_SIZE) + k_page->offset; page_addr = (char *) kmap(k_page->page); @@ -707,7 +707,7 @@ int kdfs_iol_page_put(kddm_obj_t *objEntry, kddm_set_t *set, objid_t objid) ASSERT(objEntry != NULL); k_page = (struct kdfs_page *)objEntry->object; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page count = %d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Page count = %d\n", page_count(k_page->page)); //page_cache_release(k_page->page); @@ -735,12 +735,12 @@ int kdfs_iol_page_remove(void *object, struct kddm_set *set, objid_t objid) * we are not called by the VFS */ SetPageLocked(k_page->page); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page count before =%d\n", page_count(k_page->page)); + 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); - DEBUG(DBG_KDFS_ADDRSPACE, DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); + DEBUG(DBG_ALERT, "Page after count=%d\n", page_count(k_page->page)); } PRINT_FUNCTION_EXIT; @@ -776,7 +776,7 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) ASSERT(kddm_set->private_data != NULL); content_data = (struct content_iolinker_data *) kddm_set->private_data; - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "Instantiate kddm %ld with ino : %ld\n", kddm_set->id, content_data->ino); + DEBUG(DBG_INFO, "Instantiate kddm %ld with ino : %ld\n", kddm_set->id, content_data->ino); if (kddm_set->def_owner == kerrighed_node_id) { content_data->phys_dirname = kmalloc(PATH_MAX, GFP_KERNEL); @@ -811,7 +811,7 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) content_data->current_meta = NULL; } } else { - DEBUG (DBG_KDFS_ADDRSPACE, DBG_INFO, "Nothing TODO, file is not on this node\n"); + DEBUG (DBG_INFO, "Nothing TODO, file is not on this node\n"); content_data->phys_dirname = NULL; content_data->phys_file = NULL; } @@ -820,16 +820,16 @@ int content_instantiate(kddm_set_t *kddm_set, void *private_data, int master) /* Retrieve the local ref to the k_mapping object */ inode = ilookup(k_sb->sb, content_data->ino); if (inode) { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "K_mapping from the cache\n"); + DEBUG(DBG_INFO, "K_mapping from the cache\n"); content_data->k_mapping = inode->i_mapping; iput(inode); } else { - DEBUG(DBG_KDFS_ADDRSPACE, DBG_INFO, "K_mapping will be retrieve from iget\n"); + DEBUG(DBG_INFO, "K_mapping will be retrieve from iget\n"); inode = iget(k_sb->sb, content_data->ino); content_data->k_mapping = inode->i_mapping; } if (!content_data->k_mapping) - DEBUG(DBG_KDFS_ADDRSPACE, DBG_PANIC, "k_mapping was not cleanly initialized\n"); + DEBUG(DBG_PANIC, "k_mapping was not cleanly initialized\n"); __kdfs_putsb(k_sb); PRINT_FUNCTION_EXIT; diff --git a/fs/kdfs/debug_kdfs.h b/fs/kdfs/debug_kdfs.h index 15df5b1..51bf3b0 100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@ -16,6 +16,7 @@ /* Common headers */ #include <asm-generic/bug.h> #include <linux/err.h> +#include <linux/kernel.h> /* Kerrighed headers (dynamical debugging) */ #include <kerrighed/debug.h> @@ -25,54 +26,24 @@ #define DBG_PANIC 0 #define DBG_ALERT 1 #define DBG_WARNING 2 -#define DBG_TRACE 3 +#define DBG_TRACE 3 #define DBG_INFO 4 -/* DEBUG type */ -#define DBG_KDFS_GENERAL "general" /* General debug */ -#define DBG_KDFS_SUPERBLK "superblock" /* Super Block */ -#define DBG_KDFS_INODE "inode" /* Inode Management */ -#define DBG_KDFS_DIR "dir-mgmt" /* Dir management */ -#define DBG_KDFS_FILE "file-mgmt" /* File management */ -#define DBG_KDFS_ADDRSPACE "addrspace" /* Page management */ -#define DBG_KDFS_NATIVEFS "native-fs" /* Native File System Accesses */ - -static inline struct dentry * init_kdfs_debug(void) -{ -#ifdef NDEBUG - return NULL; -#else - /* The default level is set by the second parameter */ - struct dentry *d = debug_define("kDFS", DBG_PANIC); - - DEBUG_MASK("kDFS", DBG_KDFS_GENERAL); - DEBUG_MASK("kDFS", DBG_KDFS_SUPERBLK); - DEBUG_MASK("kDFS", DBG_KDFS_INODE); - DEBUG_MASK("kDFS", DBG_KDFS_DIR); - DEBUG_MASK("kDFS", DBG_KDFS_FILE); - DEBUG_MASK("kDFS", DBG_KDFS_ADDRSPACE); - DEBUG_MASK("kDFS", DBG_KDFS_NATIVEFS); - - return d; -#endif -} - - -//#define KDFS_DEBUG_LEVEL 4 +#define KDFS_DEBUG_LEVEL 4 #ifdef DEBUG #undef DEBUG #endif #ifdef NDEBUG -# define DEBUG(type, level, format, args...) do {} while(0) +# define DEBUG(level, format, args...) do {} while(0) #else -# define DEBUG(type, level, format, args...) \ +# define DEBUG(level, format, args...) \ do { \ - if (match_debug("kDFS", type, level)) { \ - printk ("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ + if (KDFS_DEBUG_LEVEL <= level || level == DBG_PANIC) { \ + pr_debug("%s - (%s) - %d : ", KDFS_PART, __PRETTY_FUNCTION__, \ current->pid) ; \ - printk (format, ## args) ; \ + pr_debug(format, ## args) ; \ } \ if(level == DBG_PANIC)\ BUG();\ @@ -85,8 +56,8 @@ do { \ /* FUNCTION NAME : ENTER and EXIT */ // TODO: redefine the following macros to take into account debug level ! -#define PRINT_FUNCTION_NAME DEBUG(DBG_KDFS_GENERAL, DBG_TRACE, "%s\n", __PRETTY_FUNCTION__) -#define PRINT_FUNCTION_EXIT DEBUG(DBG_KDFS_GENERAL, DBG_TRACE, "%s exited\n", __PRETTY_FUNCTION__) +#define PRINT_FUNCTION_NAME DEBUG(DBG_TRACE, "%s\n", __PRETTY_FUNCTION__) +#define PRINT_FUNCTION_EXIT DEBUG(DBG_TRACE, "%s exited\n", __PRETTY_FUNCTION__) /* ASSERT and BUG ON */ @@ -101,7 +72,7 @@ do { \ #define ASSERT(expr) \ do {\ if ( !(expr) ) {\ - printk ("PANIC : ASSERT " #expr " failed in %s \ + pr_debug("PANIC : ASSERT " #expr " failed in %s \ line %d\n", __PRETTY_FUNCTION__, __LINE__ ); \ BUG(); \ } \ diff --git a/fs/kdfs/dir.c b/fs/kdfs/dir.c index 1679156..644d248 100644 --- a/fs/kdfs/dir.c +++ b/fs/kdfs/dir.c @@ -59,7 +59,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file struct page *tmp_page = NULL; void *page_addr = NULL ; - DEBUG (DBG_KDFS_DIR, DBG_INFO, + DEBUG (DBG_INFO, "Look up for entry %s in directory %ld\n", filename, dir->inode->i_ino); @@ -75,11 +75,11 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file } /* Parse directory dentries */ - DEBUG (DBG_KDFS_DIR, DBG_INFO, "Start to look inside directory\n"); + DEBUG (DBG_INFO, "Start to look inside directory\n"); do { *k_page = kdfs_grab_page(dir->content_setid, pageid); if (IS_ERR(*k_page)) - DEBUG (DBG_KDFS_DIR, DBG_PANIC, + DEBUG (DBG_PANIC, "Can't grab page %ld for the directory %ld", pageid, dir->content_setid); @@ -89,7 +89,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file /* For each entry contained in the page */ do { - DEBUG (DBG_KDFS_DIR, DBG_INFO, + DEBUG (DBG_INFO, "Grab page %ld:" "page addr %p, dentry_addr %p (file size %lld)\n", pageid, page_addr, dentry_addr, @@ -98,7 +98,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file dir_entry = (struct kdfs_dir_entry *) dentry_addr; /* Did we find the right entry */ - DEBUG (DBG_KDFS_DIR, DBG_INFO, "filelen %d dirfilelen %d, filename %s dirname %s, dirlen %d (dirino %ld)\n", + DEBUG (DBG_INFO, "filelen %d dirfilelen %d, filename %s dirname %s, dirlen %d (dirino %ld)\n", filename_len, dir_entry->name_len, filename, dir_entry->name,dir_entry->rec_len, dir_entry->ino); if (dir_entry->name_len == filename_len && strncmp (dir_entry->name, filename, filename_len) == 0) @@ -122,7 +122,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file } // end if there are some entries - DEBUG (DBG_KDFS_DIR, DBG_INFO, "Look up for file %s in directory %ld : notfound \n", + DEBUG (DBG_INFO, "Look up for file %s in directory %ld : notfound \n", filename, dir->inode->i_ino); // TODO PRIORITY 1: put_kddm_set required a reference on the set. // I have to add a reference inside kdfs_page structure :( @@ -130,7 +130,7 @@ struct kdfs_dir_entry *kdfs_grab_entry (struct kdfs_inode *dir, const char *file return NULL; found: - DEBUG (DBG_KDFS_DIR, DBG_INFO, + DEBUG (DBG_INFO, "Look up for file %s in directory %ld: found : %p\n", filename, dir->inode->i_ino, dir_entry); return dir_entry; @@ -162,7 +162,7 @@ struct kdfs_dir_entry *kdfs_find_entry(struct kdfs_inode *dir, struct page *tmp_page = NULL; void *page_addr = NULL; - DEBUG(DBG_KDFS_DIR, DBG_INFO, + DEBUG(DBG_INFO, "Look up for entry %s in directory %ld\n", filename, dir->inode->i_ino); @@ -178,12 +178,12 @@ struct kdfs_dir_entry *kdfs_find_entry(struct kdfs_inode *dir, } /* Parse directory dentries */ - DEBUG (DBG_KDFS_DIR, DBG_INFO, + DEBUG (DBG_INFO, "Start to look inside directory \n"); do { *k_page = kdfs_get_page(dir->content_setid, pageid); if (IS_ERR(*k_page)) - DEBUG(DBG_KDFS_DIR, DBG_PANIC, + DEBUG(DBG_PANIC, "Can't get page %ld for the directory %ld\n", pageid, dir->content_setid); @@ -193,14 +193,14 @@ struct kdfs_dir_entry *kdfs_find_entry(struct kdfs_inode *dir, /* For each entry contained in the page */ do { - DEBUG(DBG_KDFS_DIR, DBG_INFO, + DEBUG(DBG_INFO, "page addr %p, dentry_addr %p (file size %lld)\n", page_addr, dentry_addr, dir->inode->i_size); /* Get the directory entry */ dir_entry = (struct kdfs_dir_entry *) dentry_addr; /* Did we find the right entry */ - DEBUG(DBG_KDFS_DIR, DBG_INFO, + DEBUG(DBG_INFO, "filelen %d dirfilelen %d, filename %s dirname %s, dirlen %d (dirino %ld)\n", filename_len, dir_entry->name_len, filename, dir_entry->name,dir_entry->rec_len, dir_entry->ino); if (dir_entry->name_len == filename_len && @@ -225,7 +225,7 @@ struct kdfs_dir_entry *kdfs_find_entry(struct kdfs_inode *dir, } // end if there are some entries - DEBUG(DBG_KDFS_DIR, DBG_INFO, + DEBUG(DBG_INFO, "Look up for file %s in directory %ld : notfound\n", filename, dir->inod... [truncated message content] |