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