From: Marko O. <d0...@us...> - 2010-05-10 13:05:26
|
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 09fd7d0746ec22a4e163188aebb7147fb8c61322 (commit) via b01b17376d12023d0952047841175a68345bfd06 (commit) via b3e158fe025b642dda684d4ef957dfe3f581f776 (commit) via e4a490b0744ad5691961332ebc4cad77ad78482d (commit) via f64308ed8be6fc2bb4e88582f9876b789f4895d8 (commit) via 871bdf0117fbeed9df38c82ea2f77c9481338660 (commit) via 635a1af60d16b456bdae220321ba320eb00f19a8 (commit) via 00e3b3880d1edb227c8153d956b2450272fab5c4 (commit) via fe0ed05df1f7927be0e8ace2ad36e556a06f5313 (commit) via 3b2fab03b702dfb7b678c253f1b2983f94800928 (commit) via 41b81992baafff2f9535058662e218c6a9ee27b5 (commit) via 00074f9148ef9b702ee6567a69c5f2ff46113da5 (commit) via c93a67ac1b8f25bc4e31e148c7e9c918defd4b01 (commit) via 86958eac59fef5207bfe0af8109b9dce1c0aaf78 (commit) via d88cfb7a549d6fdc7d6f6961f526e6f4bca1f718 (commit) via 1b7959fafd64616e96566c8ea0a1c9f1a37ce587 (commit) via 20080753bddca03d80d49a482c33521b4d7d2b80 (commit) via faa3ca19c8b9663ef5813d81d30f6f0faf9508c0 (commit) from 762965ebbe2272674107af959aedba5e62ab1dff (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 09fd7d0746ec22a4e163188aebb7147fb8c61322 Author: Marko Obrovac <mar...@in...> Date: Mon May 10 17:04:02 2010 +0200 Some minor changes: change the debug level and some space corrections diff --git a/fs/kdfs/address_space.c b/fs/kdfs/address_space.c index 8034466..b7516c8 100644 --- a/fs/kdfs/address_space.c +++ b/fs/kdfs/address_space.c @@ -152,8 +152,9 @@ int kdfs_write_begin (struct file *file, from = pos & (PAGE_CACHE_SIZE - 1); page = grab_cache_page_write_begin(mapping, index, flags); - if (!page) - return -ENOMEM; + if (!page) { + return -ENOMEM; + } *pagep = page; /* try to write from the beginning of the page (due to possible page overlap) */ diff --git a/fs/kdfs/debug_kdfs.h b/fs/kdfs/debug_kdfs.h index 9b5ddbc..d3859ca 100644 --- a/fs/kdfs/debug_kdfs.h +++ b/fs/kdfs/debug_kdfs.h @@ -29,7 +29,7 @@ #define DBG_TRACE 3 #define DBG_INFO 4 -#define KDFS_DEBUG_LEVEL 1 +#define KDFS_DEBUG_LEVEL 2 #ifdef DEBUG #undef DEBUG commit b01b17376d12023d0952047841175a68345bfd06 Merge: 762965e b3e158f Author: Marko Obrovac <mar...@in...> Date: Mon May 10 17:00:44 2010 +0200 Merge branch 'master' of git://mirrors.git.kernel.org/cluster/kerrighed/kernel into make_kdfs_compile commit b3e158fe025b642dda684d4ef957dfe3f581f776 Author: Louis Rilling <lou...@ke...> Date: Thu May 6 14:46:28 2010 +0200 [BUGFIX] krgepm: Fix double free on import's copy_process() error Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index c5beee4..17daca8 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -28,9 +28,6 @@ DEFINE_TRACE(power_end); int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) { *dst = *src; -#ifdef CONFIG_KRG_EPM - if (!krg_current) -#endif if (src->thread.xstate) { dst->thread.xstate = kmem_cache_alloc(task_xstate_cachep, GFP_KERNEL); diff --git a/arch/x86/kerrighed/ghost.c b/arch/x86/kerrighed/ghost.c index bcaba91..880711f 100644 --- a/arch/x86/kerrighed/ghost.c +++ b/arch/x86/kerrighed/ghost.c @@ -90,7 +90,7 @@ void unimport_thread_info(struct task_struct *task) void free_ghost_thread_info(struct task_struct *ghost) { - __free_thread_info(ghost->stack); + free_thread_info(ghost->stack); } int export_thread_struct(struct epm_action *action, commit e4a490b0744ad5691961332ebc4cad77ad78482d Author: Louis Rilling <lou...@ke...> Date: Tue May 4 18:00:58 2010 +0200 krghotplug: Try to make add verbosity understandable Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kerrighed/hotplug/add.c b/kerrighed/hotplug/add.c index 85ef64f..0a3a41a 100644 --- a/kerrighed/hotplug/add.c +++ b/kerrighed/hotplug/add.c @@ -39,7 +39,7 @@ static void handle_node_add(struct rpc_desc *rpc_desc, void *data, size_t size) ctx = hotplug_ctx_alloc(ns); put_krg_ns(ns); if (!ctx) { - printk("kerrighed: Failed to add nodes!\n"); + printk("kerrighed: [ADD] Failed to add nodes!\n"); return; } ctx->node_set = *(struct hotplug_node_set *)data; @@ -72,7 +72,7 @@ static int do_nodes_add(struct hotplug_context *ctx) ret = krgnodelist_scnprintf(page, PAGE_SIZE, ctx->node_set.v); BUG_ON(ret >= PAGE_SIZE); - printk("kerrighed: Adding nodes %s ...\n", page); + printk("kerrighed: [ADD] Adding nodes %s ...\n", page); free_page((unsigned long)page); @@ -83,7 +83,7 @@ static int do_nodes_add(struct hotplug_context *ctx) */ ret = do_cluster_start(ctx); if (ret) { - printk(KERN_ERR "kerrighed: Adding nodes failed! err=%d\n", + printk(KERN_ERR "kerrighed: [ADD] Adding nodes failed! err=%d\n", ret); return ret; } @@ -92,7 +92,7 @@ static int do_nodes_add(struct hotplug_context *ctx) for_each_online_krgnode(node) rpc_async(NODE_ADD, node, &ctx->node_set, sizeof(ctx->node_set)); - printk("kerrighed: Adding nodes succeeded.\n"); + printk("kerrighed: [ADD] Adding nodes succeeded.\n"); return ret; } diff --git a/kerrighed/hotplug/cluster.c b/kerrighed/hotplug/cluster.c index 8925562..768f25d 100644 --- a/kerrighed/hotplug/cluster.c +++ b/kerrighed/hotplug/cluster.c @@ -617,7 +617,7 @@ static void cluster_start_worker(struct work_struct *work) ret = krgnodelist_scnprintf(page, PAGE_SIZE, cluster_start_ctx->node_set.v); BUG_ON(ret >= PAGE_SIZE); - printk("kerrighed: Cluster start on nodes %s ...\n", page); + printk("kerrighed: [ADD] Setting up new nodes %s ...\n", page); free_page((unsigned long)page); @@ -645,10 +645,10 @@ end: rpc_end(desc, 0); out: if (err) - printk(KERN_ERR "kerrighed: Cluster start failed! err=%d\n", + printk(KERN_ERR "kerrighed: [ADD] Setting up new nodes failed! err=%d\n", err); else - printk("kerrighed: Cluster start succeeded.\n"); + printk("kerrighed: [ADD] Setting up new nodes succeeded.\n"); spin_lock(&cluster_start_lock); hotplug_ctx_put(cluster_start_ctx); cluster_start_ctx = NULL; @@ -671,8 +671,8 @@ int do_cluster_start(struct hotplug_context *ctx) if (!cluster_start_ctx) { r = -EPERM; if (cluster_start_msg.seq_id == ULONG_MAX) { - printk(KERN_WARNING "kerrighed: " - "Max number of cluster start attempts " + printk(KERN_WARNING "kerrighed: [ADD] " + "Max number of add attempts " "reached! You should reboot host.\n"); } else { r = 0; commit f64308ed8be6fc2bb4e88582f9876b789f4895d8 Author: Louis Rilling <lou...@ke...> Date: Mon May 3 18:46:07 2010 +0200 krghotplug: Kill cluster_start() and krg_cluster_autostart() Cluster start should no longer be a user-visible action, and is done by node_ready(), so kill syscalls cluster_start() and related. Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/include/kerrighed/krg_services.h b/include/kerrighed/krg_services.h index b50a4a9..a601c8d 100644 --- a/include/kerrighed/krg_services.h +++ b/include/kerrighed/krg_services.h @@ -69,9 +69,9 @@ #define KSYS_GET_NODES_COUNT _IOR(KERRIGHED_PROC_MAGIC, \ COMM_PROC_BASE + 1, \ int) -#define KSYS_HOTPLUG_START _IOW(KERRIGHED_PROC_MAGIC, \ - COMM_PROC_BASE + 3, \ - __krgnodemask_t) +/* Removed: #define KSYS_HOTPLUG_START _IOW(KERRIGHED_PROC_MAGIC, \ */ +/* COMM_PROC_BASE + 3, \ */ +/* __krgnodemask_t) */ #define KSYS_HOTPLUG_RESTART _IOW(KERRIGHED_PROC_MAGIC, \ COMM_PROC_BASE + 4, \ __krgnodemask_t) @@ -99,8 +99,8 @@ #define KSYS_HOTPLUG_POWEROFF _IOW(KERRIGHED_PROC_MAGIC, \ COMM_PROC_BASE + 12, \ struct __hotplug_node_set) -#define KSYS_HOTPLUG_WAIT_FOR_START _IO(KERRIGHED_PROC_MAGIC, \ - COMM_PROC_BASE + 13) +/* Removed: #define KSYS_HOTPLUG_WAIT_FOR_START _IO(KERRIGHED_PROC_MAGIC, \ */ +/* COMM_PROC_BASE + 13) */ #define KSYS_HOTPLUG_SET_CREATOR _IO(KERRIGHED_PROC_MAGIC, \ COMM_PROC_BASE + 14) #define KSYS_HOTPLUG_READY _IO(KERRIGHED_PROC_MAGIC, \ diff --git a/kerrighed/hotplug/cluster.c b/kerrighed/hotplug/cluster.c index c681b30..8925562 100644 --- a/kerrighed/hotplug/cluster.c +++ b/kerrighed/hotplug/cluster.c @@ -58,11 +58,6 @@ enum { static char clusters_status[KERRIGHED_MAX_CLUSTERS]; -static struct hotplug_context __cluster_autostart_ctx = { - .kref = { ATOMIC_INIT(1) }, -}; -static struct hotplug_context *cluster_autostart_ctx; - static struct hotplug_context *cluster_start_ctx; static struct cluster_start_msg { struct hotplug_node_set node_set; @@ -700,95 +695,6 @@ static void do_cluster_wait_for_start(void) wait_for_completion(&cluster_started); } -static int cluster_start(void *arg) -{ - int r = 0; - struct __hotplug_node_set __node_set; - struct hotplug_context *ctx; - - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; - - if (copy_from_user(&__node_set, arg, sizeof(__node_set))) - return -EFAULT; - - if (!current->nsproxy->krg_ns) - return -EPERM; - - ctx = hotplug_ctx_alloc(current->nsproxy->krg_ns); - ctx->node_set.subclusterid = __node_set.subclusterid; - r = krgnodemask_copy_from_user(&ctx->node_set.v, &__node_set.v); - if (r) - goto out; - - r = do_cluster_start(ctx); - if (!r) - do_cluster_wait_for_start(); - -out: - hotplug_ctx_put(ctx); - return r; -} - -void krg_cluster_autostart(void) -{ - struct krg_namespace *ns; - static int already_start = 0; - int i, nb; - - if (likely(already_start) - || kerrighed_nb_nodes_min < 0) - return; - - ns = find_get_krg_ns(); - if (!ns) - return; - - spin_lock(&cluster_start_lock); - if (cluster_autostart_ctx) { - spin_unlock(&cluster_start_lock); - goto out; - } - cluster_autostart_ctx = &__cluster_autostart_ctx; - spin_unlock(&cluster_start_lock); - - cluster_autostart_ctx->ns = ns; - cluster_autostart_ctx->node_set.subclusterid = 0; - nb = 0; - - krgnodes_clear(cluster_autostart_ctx->node_set.v); - for (i=0; i<KERRIGHED_MAX_NODES; i++) { - if ((universe[i].state == 0 - && i != kerrighed_node_id) - || universe[i].subid != -1) - continue; - - if (i < kerrighed_node_id) - goto abort; - - nb++; - krgnode_set(i, cluster_autostart_ctx->node_set.v); - } - - if (nb >= kerrighed_nb_nodes_min) { - already_start = 1; - do_cluster_start(cluster_autostart_ctx); - } - -abort: - spin_lock(&cluster_start_lock); - cluster_autostart_ctx = NULL; - spin_unlock(&cluster_start_lock); -out: - put_krg_ns(ns); -} - -static int cluster_wait_for_start(void __user *arg) -{ - do_cluster_wait_for_start(); - return 0; -} - static int boot_node_ready(struct krg_namespace *ns) { struct hotplug_context *ctx; @@ -941,11 +847,8 @@ int hotplug_cluster_init(void) } rpc_register_void(CLUSTER_START, handle_cluster_start, 0); - - register_proc_service(KSYS_HOTPLUG_START, cluster_start); + register_proc_service(KSYS_HOTPLUG_READY, node_ready); - register_proc_service(KSYS_HOTPLUG_WAIT_FOR_START, - cluster_wait_for_start); register_proc_service(KSYS_HOTPLUG_SHUTDOWN, cluster_stop); register_proc_service(KSYS_HOTPLUG_RESTART, cluster_restart); register_proc_service(KSYS_HOTPLUG_STATUS, cluster_status); diff --git a/kerrighed/hotplug/node_discovering.c b/kerrighed/hotplug/node_discovering.c index 9340dce..853910f 100644 --- a/kerrighed/hotplug/node_discovering.c +++ b/kerrighed/hotplug/node_discovering.c @@ -14,7 +14,6 @@ struct universe_elem universe[KERRIGHED_MAX_NODES]; void krg_node_reachable(kerrighed_node_t); void krg_node_unreachable(kerrighed_node_t); -void krg_cluster_autostart(void); void krg_node_arrival(kerrighed_node_t nodeid) { @@ -22,7 +21,6 @@ void krg_node_arrival(kerrighed_node_t nodeid) krg_node_reachable(nodeid); #ifdef CONFIG_KRG_HOTPLUG universe[nodeid].state = 1; - krg_cluster_autostart(); #endif } commit 871bdf0117fbeed9df38c82ea2f77c9481338660 Author: Louis Rilling <lou...@ke...> Date: Mon May 3 18:35:52 2010 +0200 krghotplug: Make node_ready() automatically start the cluster In other words, node_ready() brings the current node to online state, either starting a new cluster or adding it to a running cluster depending on how the Kerrighed container was created. Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kerrighed/hotplug/cluster.c b/kerrighed/hotplug/cluster.c index c46ffac..c681b30 100644 --- a/kerrighed/hotplug/cluster.c +++ b/kerrighed/hotplug/cluster.c @@ -789,13 +789,33 @@ static int cluster_wait_for_start(void __user *arg) return 0; } -static int node_ready(void __user *arg) +static int boot_node_ready(struct krg_namespace *ns) { - struct krg_namespace *ns = current->nsproxy->krg_ns; + struct hotplug_context *ctx; + int r; - if (!ns || ns != cluster_init_helper_ns) + if (!capable(CAP_SYS_ADMIN)) return -EPERM; + ctx = hotplug_ctx_alloc(ns); + if (!ctx) + return -ENOMEM; + ctx->node_set.subclusterid = 0; + ctx->node_set.v = krgnodemask_of_node(kerrighed_node_id); + + r = do_cluster_start(ctx); + hotplug_ctx_put(ctx); + + if (!r) + do_cluster_wait_for_start(); + + return r; +} + +static int other_node_ready(struct krg_namespace *ns) +{ + BUG_ON(ns != cluster_init_helper_ns); + if (krg_container_may_conflict(ns)) return -EBUSY; if (krg_container_cleanup(ns)) @@ -805,6 +825,19 @@ static int node_ready(void __user *arg) return 0; } +static int node_ready(void __user *arg) +{ + struct krg_namespace *ns = current->nsproxy->krg_ns; + + if (!ns) + return -EPERM; + + if (!cluster_init_helper_ns) + return boot_node_ready(ns); + else + return other_node_ready(ns); +} + static int cluster_restart(void *arg) { int unused; commit 635a1af60d16b456bdae220321ba320eb00f19a8 Author: Louis Rilling <lou...@ke...> Date: Thu May 6 10:53:22 2010 +0200 [BUGFIX] krgepm: Disable krg_current before waiting in mempool_alloc() Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/mm/mempool.c b/mm/mempool.c index a46eb1b..709cc37 100644 --- a/mm/mempool.c +++ b/mm/mempool.c @@ -205,6 +205,9 @@ void * mempool_alloc(mempool_t *pool, gfp_t gfp_mask) unsigned long flags; wait_queue_t wait; gfp_t gfp_temp; +#ifdef CONFIG_KRG_EPM + struct task_struct *krg_cur; +#endif might_sleep_if(gfp_mask & __GFP_WAIT); @@ -232,6 +235,10 @@ repeat_alloc: if (!(gfp_mask & __GFP_WAIT)) return NULL; +#ifdef CONFIG_KRG_EPM + krg_cur = krg_current; + krg_current = NULL; +#endif /* Now start performing page reclaim */ gfp_temp = gfp_mask; init_wait(&wait); @@ -245,6 +252,9 @@ repeat_alloc: io_schedule_timeout(5*HZ); } finish_wait(&pool->wait, &wait); +#ifdef CONFIG_KRG_EPM + krg_current = krg_cur; +#endif goto repeat_alloc; } commit 00e3b3880d1edb227c8153d956b2450272fab5c4 Author: Louis Rilling <lou...@ke...> Date: Thu Feb 18 17:52:03 2010 +0100 krgipc: Remove unused label Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/ipc/semarray_io_linker.c b/ipc/semarray_io_linker.c index cba842f..9704716 100644 --- a/ipc/semarray_io_linker.c +++ b/ipc/semarray_io_linker.c @@ -228,7 +228,6 @@ int semarray_insert_object (struct kddm_obj * obj_entry, update_local_sem(sem_object->local_sem, &sem_object->imported_sem); -exit: return r; } commit fe0ed05df1f7927be0e8ace2ad36e556a06f5313 Author: Louis Rilling <lou...@ke...> Date: Thu May 6 17:26:04 2010 +0200 Fix warning about goto label defined but not used diff --git a/ipc/msg_io_linker.c b/ipc/msg_io_linker.c index de23a3f..6018149 100644 --- a/ipc/msg_io_linker.c +++ b/ipc/msg_io_linker.c @@ -194,7 +194,6 @@ int msq_insert_object (struct kddm_obj * obj_entry, put_ipc_ns(ns); } -exit: return r; } commit 3b2fab03b702dfb7b678c253f1b2983f94800928 Author: Louis Rilling <lou...@ke...> Date: Tue May 4 17:40:31 2010 +0200 krghotplug: Improve message on container init exec failure Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kerrighed/hotplug/cluster.c b/kerrighed/hotplug/cluster.c index f88c840..c46ffac 100644 --- a/kerrighed/hotplug/cluster.c +++ b/kerrighed/hotplug/cluster.c @@ -441,8 +441,8 @@ static int krg_container_init(void *arg) cluster_init_helper_envp); BUG_ON(!err); printk(KERN_ERR - "kerrighed: Kerrighed container userspace init failed: err=%d\n", - err); + "kerrighed: Could not execute container init '%s': err=%d\n", + cluster_init_helper_path, err); krg_container_abort(err); commit 41b81992baafff2f9535058662e218c6a9ee27b5 Author: Louis Rilling <lou...@ke...> Date: Tue May 4 15:56:22 2010 +0200 [BUGFIX] migration: Fix remote tasks entries displayed with SEE_LOCAL_PROC_STAT Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kerrighed/procfs/proc_pid.c b/kerrighed/procfs/proc_pid.c index 38ba1a2..7591442 100644 --- a/kerrighed/procfs/proc_pid.c +++ b/kerrighed/procfs/proc_pid.c @@ -585,6 +585,10 @@ static int krg_proc_pid_fill_cache(struct file *filp, krg_task_unlock(iter.tgid); return retval; } +#if defined(CONFIG_KRG_EPM) && defined(CONFIG_KRG_CAP) + if (can_use_krg_cap(current, CAP_SEE_LOCAL_PROC_STAT)) + return retval; +#endif if (obj) { proc_task.task_obj = obj; commit 00074f9148ef9b702ee6567a69c5f2ff46113da5 Author: Louis Rilling <lou...@ke...> Date: Tue May 4 15:54:39 2010 +0200 [BUGFIX] migration: Fix procfs crash Signed-off-by: Louis Rilling <lou...@ke...> diff --git a/kerrighed/procfs/proc_pid.c b/kerrighed/procfs/proc_pid.c index 15665a0..38ba1a2 100644 --- a/kerrighed/procfs/proc_pid.c +++ b/kerrighed/procfs/proc_pid.c @@ -575,8 +575,11 @@ static int krg_proc_pid_fill_cache(struct file *filp, obj = krg_task_readlock(iter.tgid); if (iter.task - && ((!obj && iter.task->exit_state != EXIT_MIGRATION) - || obj->task == iter.task)) { +#ifdef CONFIG_KRG_EPM + && ((!obj && iter.task->real_parent != baby_sitter) + || (obj && obj->task == iter.task)) +#endif + ) { /* Task is local and not a remaining part of a migrated task. */ retval = proc_pid_fill_cache(filp, dirent, filldir, iter); krg_task_unlock(iter.tgid); commit c93a67ac1b8f25bc4e31e148c7e9c918defd4b01 Author: Matthieu Fertré <mat...@ke...> Date: Mon Apr 26 15:28:44 2010 +0200 Checkpoint: print the filename in error diff --git a/include/kerrighed/file_stat.h b/include/kerrighed/file_stat.h index c1883d8..f8fb509 100644 --- a/include/kerrighed/file_stat.h +++ b/include/kerrighed/file_stat.h @@ -46,6 +46,10 @@ char *get_phys_filename(struct file *file, char *buffer, bool del_ok); */ char *get_filename(struct file *file, char *buffer); +char *alloc_filename(struct file *file, char **buffer); + +void free_filename(char *buffer); + int can_checkpoint_file(const struct file *file); #endif diff --git a/kerrighed/fs/file_stat.c b/kerrighed/fs/file_stat.c index cdbf147..e98d3eb 100644 --- a/kerrighed/fs/file_stat.c +++ b/kerrighed/fs/file_stat.c @@ -147,6 +147,31 @@ char *get_filename(struct file *file, char *buffer) return get_phys_filename(file, buffer, true); } +char *alloc_filename(struct file *file, char **buffer) +{ + char *file_name; + + *buffer = (char *)__get_free_page(GFP_KERNEL); + if (!*buffer) { + file_name = ERR_PTR(-ENOMEM); + goto exit; + } + + file_name = get_filename(file, *buffer); + if (!file_name) { + file_name = *buffer; + sprintf(file_name, "?"); + } + +exit: + return file_name; +} + +void free_filename(char *buffer) +{ + free_page((unsigned long)buffer); +} + int can_checkpoint_file(const struct file *file) { if (is_socket(file)) { diff --git a/kerrighed/fs/regular_file_mgr.c b/kerrighed/fs/regular_file_mgr.c index 601f21a..86800c0 100644 --- a/kerrighed/fs/regular_file_mgr.c +++ b/kerrighed/fs/regular_file_mgr.c @@ -564,11 +564,24 @@ static int cr_export_now_file(struct epm_action *action, ghost_t *ghost, args->file_args.file); error: - if (r) - ckpt_err(action, r, - "Fail to save file %d of process %d (%s)", - args->file_args.index, - task_pid_knr(task), task->comm); + if (r) { + char *buffer, *filename; + filename = alloc_filename(args->file_args.file, &buffer); + if (!IS_ERR(filename)) { + ckpt_err(action, r, + "Fail to save information needed to reopen " + "file %s as fd %d of process %d (%s)", + filename, args->file_args.index, + task_pid_knr(task), task->comm); + free_filename(buffer); + } else { + ckpt_err(action, r, + "Fail to save information needed to reopen " + "fd %d of process %d (%s)", + args->file_args.index, + task_pid_knr(task), task->comm); + } + } return r; } @@ -589,19 +602,12 @@ int cr_export_user_info_file(struct epm_action *action, ghost_t *ghost, file = export->args.file_args.file; - tmp = (char *) __get_free_page (GFP_KERNEL); - if (!tmp) { - r = -ENOMEM; + file_name = alloc_filename(file, &tmp); + if (IS_ERR(file_name)) { + r = PTR_ERR(file_name); goto exit; } - file_name = get_filename(file, tmp); - - if (!file_name) { - file_name = tmp; - sprintf(file_name, "-"); - } - if (is_socket(file)) r = ghost_printf(ghost, "socket "); @@ -630,7 +636,7 @@ int cr_export_user_info_file(struct epm_action *action, ghost_t *ghost, r = ghost_printf(ghost, "file "); if (r) - goto err_free_page; + goto err_free_filename; if (file->f_objid) /* if the file is shared, there is no host node */ @@ -648,7 +654,7 @@ int cr_export_user_info_file(struct epm_action *action, ghost_t *ghost, nodelen, file_node, keylen, key, file_name, task_pid_knr(task), index); if (r) - goto err_free_page; + goto err_free_filename; list_for_each_entry(_export, &export->next, next) { task = _export->task; @@ -657,13 +663,13 @@ int cr_export_user_info_file(struct epm_action *action, ghost_t *ghost, r = ghost_printf(ghost, ",%d:%d", task_pid_knr(task), index); if (r) - goto err_free_page; + goto err_free_filename; } r = ghost_printf(ghost, "\n"); -err_free_page: - free_page ((unsigned long) tmp); +err_free_filename: + free_filename(tmp); exit: return r; } commit 86958eac59fef5207bfe0af8109b9dce1c0aaf78 Author: Matthieu Fertré <mat...@ke...> Date: Mon Apr 26 09:29:22 2010 +0200 Checkpoint: print the task name (when possible) in case of error. diff --git a/ipc/krgipc_mobility.c b/ipc/krgipc_mobility.c index bd9304a..01bb5c1 100644 --- a/ipc/krgipc_mobility.c +++ b/ipc/krgipc_mobility.c @@ -509,8 +509,8 @@ static int cr_export_now_sysv_sem(struct epm_action *action, ghost_t *ghost, err: if (r) ckpt_err(action, r, - "Fail to save semundos of process %d", - task_pid_knr(task)); + "Fail to save semundos of process %d (%s)", + task_pid_knr(task), task->comm); return r; } diff --git a/kerrighed/epm/application/app_checkpoint.c b/kerrighed/epm/application/app_checkpoint.c index 7ae6eb4..946150f 100644 --- a/kerrighed/epm/application/app_checkpoint.c +++ b/kerrighed/epm/application/app_checkpoint.c @@ -258,10 +258,10 @@ static inline void __chkpt_task_req(struct app_struct *app, task_state_t *tsk) r = PTR_ERR(ghost); ckpt_err(NULL, r, "Fail to create file /var/chkpt/%ld/v%d/task_%d.bin " - "to checkpoint process %d", + "to checkpoint process %d (%s)", app->app_id, app->chkpt_sn, task_pid_knr(task), - task_pid_knr(task)); + task_pid_knr(task), task->comm); __set_task_result(task, r); return; } diff --git a/kerrighed/epm/checkpoint.c b/kerrighed/epm/checkpoint.c index b31b87f..2be523c 100644 --- a/kerrighed/epm/checkpoint.c +++ b/kerrighed/epm/checkpoint.c @@ -164,8 +164,9 @@ static int checkpoint_task(struct epm_action *action, if (r) ckpt_err(action, r, - "Fail to checkpoint process %d", - task_pid_knr(task_to_checkpoint)); + "Fail to checkpoint process %d (%s)", + task_pid_knr(task_to_checkpoint), + task_to_checkpoint->comm); out: return r; } diff --git a/kerrighed/epm/sighand.c b/kerrighed/epm/sighand.c index 75a36a0..d27c28a 100644 --- a/kerrighed/epm/sighand.c +++ b/kerrighed/epm/sighand.c @@ -551,8 +551,9 @@ static int cr_export_now_sighand_struct(struct epm_action *action, r = export_sighand_struct(action, ghost, task); if (r) ckpt_err(action, r, - "Fail to save struct sighand_struct of process %d", - task_pid_knr(task)); + "Fail to save struct sighand_struct " + "of process %d (%s)", + task_pid_knr(task), task->comm); return r; } diff --git a/kerrighed/epm/signal.c b/kerrighed/epm/signal.c index 7686e88..50115ff 100644 --- a/kerrighed/epm/signal.c +++ b/kerrighed/epm/signal.c @@ -1044,8 +1044,8 @@ static int cr_export_now_signal_struct(struct epm_action *action, r = export_signal_struct(action, ghost, task); if (r) ckpt_err(action, r, - "Fail to save struct signal_struct of process %d", - task_pid_knr(task)); + "Fail to save struct signal_struct of process %d (%s)", + task_pid_knr(task), task->comm); return r; } diff --git a/kerrighed/fs/mobility.c b/kerrighed/fs/mobility.c index a2c84c1..0ab37e8 100644 --- a/kerrighed/fs/mobility.c +++ b/kerrighed/fs/mobility.c @@ -1493,8 +1493,8 @@ static int cr_export_now_files_struct(struct epm_action *action, ghost_t *ghost, r = export_files_struct(action, ghost, task); if (r) ckpt_err(action, r, - "Fail to save struct files_struct of process %d", - task_pid_knr(task)); + "Fail to save struct files_struct of process %d (%s)", + task_pid_knr(task), task->comm); return r; } @@ -1556,8 +1556,8 @@ static int cr_export_now_fs_struct(struct epm_action *action, ghost_t *ghost, r = export_fs_struct(action, ghost, task); if (r) ckpt_err(action, r, - "Fail to save struct fs_struct of process %d", - task_pid_knr(task)); + "Fail to save struct fs_struct of process %d (%s)", + task_pid_knr(task), task->comm); return r; } diff --git a/kerrighed/fs/regular_file_mgr.c b/kerrighed/fs/regular_file_mgr.c index c99ef52..601f21a 100644 --- a/kerrighed/fs/regular_file_mgr.c +++ b/kerrighed/fs/regular_file_mgr.c @@ -566,9 +566,9 @@ static int cr_export_now_file(struct epm_action *action, ghost_t *ghost, error: if (r) ckpt_err(action, r, - "Fail to save file %d of process %d", + "Fail to save file %d of process %d (%s)", args->file_args.index, - task_pid_knr(task)); + task_pid_knr(task), task->comm); return r; } diff --git a/kerrighed/mm/mobility.c b/kerrighed/mm/mobility.c index 20112e3..2e5ad87 100644 --- a/kerrighed/mm/mobility.c +++ b/kerrighed/mm/mobility.c @@ -1328,8 +1328,8 @@ static int cr_export_now_mm_struct(struct epm_action *action, ghost_t *ghost, r = export_mm_struct(action, ghost, task); if (r) ckpt_err(action, r, - "Fail to save struct mm_struct of process %d", - task_pid_knr(task)); + "Fail to save struct mm_struct of process %d (%s)", + task_pid_knr(task), task->comm); return r; } commit d88cfb7a549d6fdc7d6f6961f526e6f4bca1f718 Author: Matthieu Fertré <mat...@ke...> Date: Thu Apr 29 10:17:08 2010 +0200 [BUGFIX] Fix FAF write() handling with packet size > PAGE_SIZE Code was wrong if the total size of the data to write was greater than PAGE_SIZE. (It was already wrong before patch to support pwrite()). In addition, the error code path was wrong if copy_from_user() fails on the original node. This patch fixes both issues. diff --git a/kerrighed/fs/faf/faf_hooks.c b/kerrighed/fs/faf/faf_hooks.c index 839c33b..833a378 100644 --- a/kerrighed/fs/faf/faf_hooks.c +++ b/kerrighed/fs/faf/faf_hooks.c @@ -331,10 +331,16 @@ ssize_t krg_faf_write(struct file * file, const char *buf, buf_size = to_send; err = copy_from_user(kbuff, &buf[offset], buf_size); - if (err) { - nr = -EFAULT; + if (err) + buf_size = -EFAULT; + + err = rpc_pack_type(desc, buf_size); + if (err) + goto cancel; + + if (buf_size < 0) /* copy_from_user has failed */ break; - } + err = rpc_pack(desc, 0, kbuff, buf_size); if (err) goto cancel; diff --git a/kerrighed/fs/faf/faf_server.c b/kerrighed/fs/faf/faf_server.c index f8ac68e..05a681e 100644 --- a/kerrighed/fs/faf/faf_server.c +++ b/kerrighed/fs/faf/faf_server.c @@ -294,10 +294,17 @@ void handle_faf_write(struct rpc_desc* desc, void *msgIn, size_t size) file = fget(msg->server_fd); while (to_recv > 0) { - if (to_recv < PAGE_SIZE) - buf_size = to_recv; + err = rpc_unpack_type(desc, buf_size); + if (err) + goto cancel; + + /* copy_from_user has failed on the other side */ + if (buf_size < 0) { + nr_received = buf_size; + break; + } - err = rpc_unpack(desc, 0, buf, to_recv); + err = rpc_unpack(desc, 0, buf, buf_size); if (err) goto cancel; commit 1b7959fafd64616e96566c8ea0a1c9f1a37ce587 Author: Matthieu Fertré <mat...@ke...> Date: Tue Apr 27 16:08:49 2010 +0200 [BUGFIX] ckpt_err() does not evaluate arguments if not in a checkpoint That fixes at least one NULL/bad pointer dereference occuring in import_regular_file_from_krg_desc. diff --git a/include/kerrighed/ghost_helpers.h b/include/kerrighed/ghost_helpers.h index bf2c70c..dd457e8 100644 --- a/include/kerrighed/ghost_helpers.h +++ b/include/kerrighed/ghost_helpers.h @@ -321,10 +321,12 @@ int import_process_set_links(struct epm_action *action, ghost_t *ghost, #endif /* CONFIG_KRG_SCHED */ -void do_ckpt_msg(struct epm_action *action, int err, char *fmt, ...); +void do_ckpt_msg(int err, char *fmt, ...); #define ckpt_err(ctx, err, fmt, args...) do { \ - do_ckpt_msg(ctx, err, "[E @ %s:%d : %d] " fmt, __func__,\ + struct epm_action *_action = ctx; \ + if (!_action || _action->type == EPM_CHECKPOINT) \ + do_ckpt_msg(err, "[E @ %s:%d : %d] " fmt, __func__, \ __LINE__, err, ##args); \ } while (0) diff --git a/kerrighed/epm/application/application.c b/kerrighed/epm/application/application.c index 43552ca..c0d8fba 100644 --- a/kerrighed/epm/application/application.c +++ b/kerrighed/epm/application/application.c @@ -1078,14 +1078,11 @@ exit: return r; } -void do_ckpt_msg(struct epm_action *action, int err, char *fmt, ...) +void do_ckpt_msg(int err, char *fmt, ...) { va_list args; char *buffer; - if (action && action->type != EPM_CHECKPOINT) - return; - va_start(args, fmt); buffer = kvasprintf(GFP_KERNEL, fmt, args); va_end(args); commit 20080753bddca03d80d49a482c33521b4d7d2b80 Author: Matthieu Fertré <mat...@ke...> Date: Tue Apr 27 11:47:50 2010 +0200 krgfaf: Support pread() and pwrite() This is done by moving FAF handling from sys_read/write to vfs_read/write, thus making it available for sys_pread() and sys_pwrite(). In addition, this patch cleans/fixes the error code paths for faf_read/write. diff --git a/fs/read_write.c b/fs/read_write.c index 40ba004..336bc8f 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -315,6 +315,10 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) if (!(file->f_mode & FMODE_READ)) return -EBADF; +#ifdef CONFIG_KRG_FAF + if (file->f_flags & O_FAF_CLT) + return krg_faf_read(file, buf, count, pos); +#endif if (!file->f_op || (!file->f_op->read && !file->f_op->aio_read)) return -EINVAL; if (unlikely(!access_ok(VERIFY_WRITE, buf, count))) @@ -370,6 +374,10 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ if (!(file->f_mode & FMODE_WRITE)) return -EBADF; +#ifdef CONFIG_KRG_FAF + if (file->f_flags & O_FAF_CLT) + return krg_faf_write(file, buf, count, pos); +#endif if (!file->f_op || (!file->f_op->write && !file->f_op->aio_write)) return -EINVAL; if (unlikely(!access_ok(VERIFY_READ, buf, count))) @@ -414,17 +422,7 @@ SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) file = fget_light(fd, &fput_needed); if (file) { -#ifdef CONFIG_KRG_FAF - loff_t pos; - if (file->f_flags & O_FAF_CLT) { - ret = krg_faf_read(file, buf, count); - fput_light(file, fput_needed); - return ret; - } - pos = file_pos_read(file); -#else loff_t pos = file_pos_read(file); -#endif ret = vfs_read(file, buf, count, &pos); file_pos_write(file, pos); fput_light(file, fput_needed); @@ -442,17 +440,7 @@ SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, file = fget_light(fd, &fput_needed); if (file) { -#ifdef CONFIG_KRG_FAF - loff_t pos; - if (file->f_flags & O_FAF_CLT) { - ret = krg_faf_write(file, buf, count); - fput_light(file, fput_needed); - return ret; - } - pos = file_pos_read(file); -#else loff_t pos = file_pos_read(file); -#endif ret = vfs_write(file, buf, count, &pos); file_pos_write(file, pos); fput_light(file, fput_needed); diff --git a/include/kerrighed/faf.h b/include/kerrighed/faf.h index 6640867..966f5f1 100644 --- a/include/kerrighed/faf.h +++ b/include/kerrighed/faf.h @@ -34,9 +34,9 @@ off_t krg_faf_lseek(struct file *file, off_t offset, long krg_faf_llseek(struct file *file, unsigned long offset_high, unsigned long offset_low, loff_t *result, unsigned int origin); -ssize_t krg_faf_read(struct file *file, char *buf, size_t count); +ssize_t krg_faf_read(struct file *file, char *buf, size_t count, loff_t *pos); ssize_t krg_faf_write(struct file *file, const char *buf, - size_t count); + size_t count, loff_t *pos); ssize_t krg_faf_readv(struct file *file, const struct iovec __user *vec, unsigned long vlen, loff_t *pos); ssize_t krg_faf_writev(struct file *file, const struct iovec __user *vec, diff --git a/kerrighed/fs/faf/faf_hooks.c b/kerrighed/fs/faf/faf_hooks.c index 9cdb365..839c33b 100644 --- a/kerrighed/fs/faf/faf_hooks.c +++ b/kerrighed/fs/faf/faf_hooks.c @@ -196,130 +196,179 @@ long krg_faf_llseek (struct file *file, } /** Kerrighed kernel hook for FAF read function. - * @author Renaud Lottiaux + * @author Renaud Lottiaux, Matthieu Fertré * * @param file File to read from. * @param buf Buffer to store data in. * @param count Number of bytes to read. + * @param pos Offset to read from (updated at the end). */ -ssize_t krg_faf_read (struct file * file, - char *buf, - size_t count) +ssize_t krg_faf_read(struct file * file, char *buf, size_t count, loff_t *pos) { faf_client_data_t *data = file->private_data; struct faf_rw_msg msg; ssize_t nr; - long received = 0; + ssize_t received = 0; + loff_t fpos; char *kbuff; int err; - struct rpc_desc* desc; + struct rpc_desc *desc; - kbuff = kmalloc (PAGE_SIZE, GFP_KERNEL); + kbuff = kmalloc(PAGE_SIZE, GFP_KERNEL); if (!kbuff) return -ENOMEM; msg.server_fd = data->server_fd; msg.count = count; + msg.pos = *pos; + nr = -ENOMEM; desc = rpc_begin(RPC_FAF_READ, data->server_id); + if (!desc) + goto out; /* Send read request */ - rpc_pack_type(desc, msg); + err = rpc_pack_type(desc, msg); + if (err) + goto cancel; - nr = unpack_remote_sleep_res_prepare(desc); - if (nr) - goto err; + err = unpack_remote_sleep_res_prepare(desc); + if (err) + goto cancel; /* Get number of bytes to receive */ err = unpack_remote_sleep_res_type(desc, nr); if (err) - nr = err; + goto cancel; + while (nr > 0) { /* Receive file data */ - rpc_unpack(desc, 0, kbuff, nr); - err = copy_to_user (&buf[received], kbuff, nr); + err = rpc_unpack(desc, 0, kbuff, nr); + if (err) + goto cancel; + err = copy_to_user(&buf[received], kbuff, nr); if (err) { nr = -EFAULT; - goto err; + break; } received += nr; err = unpack_remote_sleep_res_type(desc, nr); if (err) - nr = err; + goto cancel; } - if (nr == 0) + + if (!nr) + /* no error occurs when reading */ nr = received; - /* Else, we received an error */ -err: + + /* Receive the updated offset */ + err = rpc_unpack_type(desc, fpos); + if (err) + goto cancel; + *pos = fpos; + +out_end: rpc_end(desc, 0); - kfree (kbuff); +out: + kfree(kbuff); return nr; + +cancel: + rpc_cancel(desc); + if (err > 0) + err = -EPIPE; + nr = err; + goto out_end; } /** Kerrighed kernel hook for FAF write function. - * @author Renaud Lottiaux + * @author Renaud Lottiaux, Matthieu Fertré * * @param file File to write to. * @param buf Buffer of data to write. * @param count Number of bytes to write. + * @param pos Offset to write from (updated at the end). */ -ssize_t krg_faf_write (struct file * file, - const char *buf, - size_t count) +ssize_t krg_faf_write(struct file * file, const char *buf, + size_t count, loff_t *pos) { faf_client_data_t *data = file->private_data; struct faf_rw_msg msg; - ssize_t buf_size = PAGE_SIZE, r; + ssize_t buf_size = PAGE_SIZE, nr; long offset = 0; long to_send = count; + loff_t fpos; char *kbuff; int err; - struct rpc_desc* desc; + struct rpc_desc *desc; - kbuff = kmalloc (PAGE_SIZE, GFP_KERNEL); + kbuff = kmalloc(PAGE_SIZE, GFP_KERNEL); if (!kbuff) return -ENOMEM; msg.server_fd = data->server_fd; msg.count = count; + msg.pos = *pos; + nr = -ENOMEM; desc = rpc_begin(RPC_FAF_WRITE, data->server_id); + if (!desc) + goto out; /* Send write request */ - rpc_pack_type(desc, msg); + err = rpc_pack_type(desc, msg); + if (err) + goto cancel; - r = unpack_remote_sleep_res_prepare(desc); - if (r) - goto err; + err = unpack_remote_sleep_res_prepare(desc); + if (err) + goto cancel; while (to_send > 0) { if (to_send < PAGE_SIZE) buf_size = to_send; - err = copy_from_user (kbuff, &buf[offset], buf_size); + err = copy_from_user(kbuff, &buf[offset], buf_size); if (err) { - r = -EFAULT; - goto err; + nr = -EFAULT; + break; } - rpc_pack(desc, 0, kbuff, buf_size); + err = rpc_pack(desc, 0, kbuff, buf_size); + if (err) + goto cancel; to_send -= buf_size; offset += buf_size; } - err = unpack_remote_sleep_res_type(desc, r); + + err = unpack_remote_sleep_res_type(desc, nr); if (err) - r = err; - else if (r == -EPIPE) + nr = err; + else if (nr == -EPIPE) send_sig(SIGPIPE, current, 0); -err: + /* Receive the updated offset */ + err = rpc_unpack_type(desc, fpos); + if (err) + goto cancel; + *pos = fpos; + +out_end: rpc_end(desc, 0); - kfree (kbuff); +out: + kfree(kbuff); - return r; + return nr; + +cancel: + rpc_cancel(desc); + if (err > 0) + err = -EPIPE; + nr = err; + goto out_end; } ssize_t krg_faf_readv(struct file *file, const struct iovec __user *vec, diff --git a/kerrighed/fs/faf/faf_server.c b/kerrighed/fs/faf/faf_server.c index ce69ff5..f8ac68e 100644 --- a/kerrighed/fs/faf/faf_server.c +++ b/kerrighed/fs/faf/faf_server.c @@ -173,73 +173,108 @@ restore_context(const struct prev_root *prev_root, const struct cred *old_cred) } /** Handler for reading in a FAF open file. - * @author Renaud Lottiaux + * @author Renaud Lottiaux, Matthieu Fertré * * @param from Node sending the request * @param msgIn Request message */ -void handle_faf_read (struct rpc_desc* desc, - void *msgIn, size_t size) +void handle_faf_read(struct rpc_desc* desc, void *msgIn, size_t size) { struct faf_rw_msg *msg = msgIn; + struct file *file = NULL; char *buf = NULL; long buf_size = PAGE_SIZE; ssize_t to_read, r; + loff_t fpos; + int err; - r = remote_sleep_prepare(desc); - if (r) { + err = remote_sleep_prepare(desc); + if (err) { rpc_cancel(desc); return; } + to_read = msg->count; + fpos = msg->pos; + r = -ENOMEM; - buf = kmalloc (PAGE_SIZE, GFP_KERNEL); - if (buf == NULL) - goto exit; + buf = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!buf) + goto error; + + file = fget(msg->server_fd); - to_read = msg->count; while (to_read > 0) { if (to_read < PAGE_SIZE) buf_size = to_read; - r = sys_read (msg->server_fd, buf, buf_size); + r = vfs_read(file, buf, buf_size, &fpos); if (r > 0) { - rpc_pack_type(desc, r); - rpc_pack(desc, 0, buf, r); + err = rpc_pack_type(desc, r); + if (err) + goto cancel; + err = rpc_pack(desc, 0, buf, r); + if (err) + goto cancel; } - /* Check if we have reach the end of the file */ + /* + * Check if we have reach the end of the file + * or if there is an error + */ if (r < buf_size) break; + to_read -= r; } - /* Pack the end of transmission mark (0) */ + +error: + /* + * Pack the end of transmission mark (0) + * or the error returned by vfs_read() + */ if (r > 0) r = 0; - /* else, pack the error value */ -exit: - rpc_pack_type(desc, r); + err = rpc_pack_type(desc, r); + if (err) + goto cancel; + + /* send the updated file position */ + err = rpc_pack_type(desc, fpos); + if (err) + goto cancel; + +out: if (buf) - kfree (buf); + kfree(buf); + if (file) + fput(file); remote_sleep_finish(); + return; + +cancel: + rpc_cancel(desc); + goto out; } /** Handler for writing in a FAF open file. - * @author Renaud Lottiaux + * @author Renaud Lottiaux, Matthieu Fertré * * @param from Node sending the request * @param msgIn Request message */ -void handle_faf_write (struct rpc_desc* desc, - void *msgIn, size_t size) +void handle_faf_write(struct rpc_desc* desc, void *msgIn, size_t size) { struct faf_rw_msg *msg = msgIn; + struct file *file = NULL; long to_recv; char *buf = NULL; ssize_t buf_size = PAGE_SIZE; ssize_t r, nr_received = -ENOMEM; + loff_t fpos; + int err; r = remote_sleep_prepare(desc); if (r) { @@ -247,40 +282,58 @@ void handle_faf_write (struct rpc_desc* desc, return; } - buf = kmalloc (PAGE_SIZE, GFP_KERNEL); - if (buf == NULL) - goto err; + to_recv = msg->count; + fpos = msg->pos; + + buf = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!buf) + goto error; nr_received = 0; - to_recv = msg->count; + + file = fget(msg->server_fd); + while (to_recv > 0) { if (to_recv < PAGE_SIZE) buf_size = to_recv; - if(rpc_unpack(desc, 0, buf, to_recv) == RPC_ECLOSE) { - nr_received = -EPIPE; - goto err; - } - r = sys_write (msg->server_fd, buf, buf_size); + err = rpc_unpack(desc, 0, buf, to_recv); + if (err) + goto cancel; + + r = vfs_write(file, buf, buf_size, &fpos); /* The last write failed. Break the write sequence */ if (r < 0) { nr_received = r; - goto err; + break; } nr_received += r; to_recv -= buf_size; } -err: - rpc_pack_type(desc, nr_received); - if (nr_received < 0) - rpc_cancel(desc); + +error: + err = rpc_pack_type(desc, nr_received); + if (err) + goto cancel; + + /* send the updated file position */ + err = rpc_pack_type(desc, fpos); + if (err) + goto cancel; + +out: if (buf) - kfree (buf); + kfree(buf); + if (file) + fput(file); remote_sleep_finish(); - return; + +cancel: + rpc_cancel(desc); + goto out; } static void handle_faf_readv(struct rpc_desc *desc, void *__msg, size_t size) diff --git a/kerrighed/ghost/file_ghost.c b/kerrighed/ghost/file_ghost.c index b3e643b..2d7c811 100644 --- a/kerrighed/ghost/file_ghost.c +++ b/kerrighed/ghost/file_ghost.c @@ -11,12 +11,10 @@ #include <linux/slab.h> #include <linux/string.h> #include <linux/sched.h> +#include <kerrighed/dvfs.h> #include <kerrighed/ghost.h> #include <kerrighed/file_ghost.h> #include <kerrighed/physical_fs.h> -#ifdef CONFIG_KRG_FAF -#include <kerrighed/faf.h> -#endif /*--------------------------------------------------------------------------* * * @@ -36,9 +34,10 @@ */ int file_ghost_read(ghost_t *ghost, void *buff, size_t length) { - struct file_ghost_data *ghost_data ; + struct file_ghost_data *ghost_data; struct file *file = NULL; - int r = 0 ; + loff_t pos; + int r = 0; BUG_ON(!ghost); BUG_ON(!buff); @@ -48,12 +47,9 @@ int file_ghost_read(ghost_t *ghost, void *buff, size_t length) file = ghost_data->file; BUG_ON(!file); -#ifdef CONFIG_KRG_FAF - if (file->f_flags & O_FAF_CLT) - r = krg_faf_read(file, (char*)buff, length); - else -#endif - r = file->f_op->read(file, (char*)buff, length, &file->f_pos); + pos = file_pos_read(file); + r = vfs_read(file, (char*)buff, length, &pos); + file_pos_write(file, pos); if (r == length) r = 0; @@ -74,9 +70,10 @@ int file_ghost_read(ghost_t *ghost, void *buff, size_t length) */ int file_ghost_write(struct ghost *ghost, const void *buff, size_t length) { - struct file_ghost_data *ghost_data ; + struct file_ghost_data *ghost_data; struct file *file = NULL; - int r = 0 ; + loff_t pos; + int r = 0; BUG_ON(!ghost); BUG_ON(!buff); @@ -87,12 +84,9 @@ int file_ghost_write(struct ghost *ghost, const void *buff, size_t length) file = ghost_data->file; BUG_ON(!file); -#ifdef CONFIG_KRG_FAF - if (file->f_flags & O_FAF_CLT) - r = krg_faf_write(file, (char*)buff, length); - else -#endif - r = file->f_op->write(file, (char*)buff, length, &file->f_pos); + pos = file_pos_read(file); + r = vfs_write(file, (char*)buff, length, &pos); + file_pos_write(file, pos); if (r == length) r = 0; commit faa3ca19c8b9663ef5813d81d30f6f0faf9508c0 Author: Matthieu Fertré <mat...@ke...> Date: Tue Apr 27 13:03:15 2010 +0200 Move file_pos_read/write definitions This is used in next patch. diff --git a/fs/read_write.c b/fs/read_write.c index ef1c3e1..40ba004 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -394,23 +394,17 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_ EXPORT_SYMBOL(vfs_write); +#ifndef CONFIG_KRG_DVFS static inline loff_t file_pos_read(struct file *file) { -#ifdef CONFIG_KRG_DVFS - if (file->f_flags & O_KRG_SHARED) - file->f_pos = krg_file_pos_read(file); -#endif return file->f_pos; } static inline void file_pos_write(struct file *file, loff_t pos) { -#ifdef CONFIG_KRG_DVFS - if (file->f_flags & O_KRG_SHARED) - krg_file_pos_write(file, pos); -#endif file->f_pos = pos; } +#endif SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) { diff --git a/include/kerrighed/dvfs.h b/include/kerrighed/dvfs.h index 87a479b..cc6b606 100644 --- a/include/kerrighed/dvfs.h +++ b/include/kerrighed/dvfs.h @@ -1,5 +1,21 @@ -/** Kerrighed Kernel Hooks **/ +#include <linux/fs.h> +#include <kerrighed/fcntl.h> +/** Kerrighed Kernel Hooks **/ loff_t krg_file_pos_read(struct file *file); void krg_file_pos_write(struct file *file, loff_t pos); void krg_put_file(struct file *file); + +static inline loff_t file_pos_read(struct file *file) +{ + if (file->f_flags & O_KRG_SHARED) + file->f_pos = krg_file_pos_read(file); + return file->f_pos; +} + +static inline void file_pos_write(struct file *file, loff_t pos) +{ + if (file->f_flags & O_KRG_SHARED) + krg_file_pos_write(file, pos); + file->f_pos = pos; +} ----------------------------------------------------------------------- Summary of changes: arch/x86/kernel/process.c | 3 - arch/x86/kerrighed/ghost.c | 2 +- fs/kdfs/address_space.c | 5 +- fs/kdfs/debug_kdfs.h | 2 +- fs/read_write.c | 38 ++------ include/kerrighed/dvfs.h | 18 ++++- include/kerrighed/faf.h | 4 +- include/kerrighed/file_stat.h | 4 + include/kerrighed/ghost_helpers.h | 6 +- include/kerrighed/krg_services.h | 10 +- ipc/krgipc_mobility.c | 4 +- ipc/msg_io_linker.c | 1 - ipc/semarray_io_linker.c | 1 - kerrighed/epm/application/app_checkpoint.c | 4 +- kerrighed/epm/application/application.c | 5 +- kerrighed/epm/checkpoint.c | 5 +- kerrighed/epm/sighand.c | 5 +- kerrighed/epm/signal.c | 4 +- kerrighed/fs/faf/faf_hooks.c | 141 +++++++++++++++++++--------- kerrighed/fs/faf/faf_server.c | 136 +++++++++++++++++++-------- kerrighed/fs/file_stat.c | 25 +++++ kerrighed/fs/mobility.c | 8 +- kerrighed/fs/regular_file_mgr.c | 46 +++++---- kerrighed/ghost/file_ghost.c | 32 +++---- kerrighed/hotplug/add.c | 8 +- kerrighed/hotplug/cluster.c | 122 ++++++------------------ kerrighed/hotplug/node_discovering.c | 2 - kerrighed/mm/mobility.c | 4 +- kerrighed/procfs/proc_pid.c | 11 ++- mm/mempool.c | 10 ++ 30 files changed, 378 insertions(+), 288 deletions(-) hooks/post-receive -- kdfs |