From: ericm Date: Wed, 29 Oct 2003 05:14:23 +0000 (+0000) Subject: merge b_devel -> b_eq: 20031029 X-Git-Tag: v1_7_0_51~2^9~212 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=c65736337e393e3ce966b826c60c7787a1521cdc;p=fs%2Flustre-release.git merge b_devel -> b_eq: 20031029 kerenl pass sanity.sh, liblustre is broken --- diff --git a/lnet/include/linux/kp30.h b/lnet/include/linux/kp30.h index cea5a32..37bf8ce 100644 --- a/lnet/include/linux/kp30.h +++ b/lnet/include/linux/kp30.h @@ -188,6 +188,7 @@ static inline void our_cond_resched(void) if (current->need_resched) schedule (); } +#define work_struct_t struct tq_struct #else @@ -203,6 +204,8 @@ static inline void our_cond_resched(void) { cond_resched(); } +#define work_struct_t struct work_struct + #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) */ #ifdef PORTAL_DEBUG diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index 9db8489..e5447d7 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -139,6 +139,7 @@ typedef struct { /* temporary expedient: limit number of entries in discontiguous MDs */ # define PTL_MTU (512<<10) # define PTL_MD_MAX_IOV 128 +# define PTL_MD_MAX_PAGES min_t(int, PTL_MD_MAX_IOV, PTL_MTU / PAGE_SIZE) struct lib_msg_t { struct list_head msg_list; diff --git a/lnet/klnds/gmlnd/gmlnd.h b/lnet/klnds/gmlnd/gmlnd.h index c7c4c1d..53757ab 100644 --- a/lnet/klnds/gmlnd/gmlnd.h +++ b/lnet/klnds/gmlnd/gmlnd.h @@ -28,6 +28,10 @@ #ifndef __INCLUDE_GMNAL_H__ #define __INCLUDE_GMNAL_H__ +#ifndef EXPORT_SYMTAB +# define EXPORT_SYMTAB +#endif + #include "linux/config.h" #include "linux/module.h" #include "linux/tty.h" @@ -41,9 +45,6 @@ #include "linux/init.h" #include "linux/sem.h" #include "linux/vmalloc.h" -#ifdef MODVERSIONS -#include -#endif #define DEBUG_SUBSYSTEM S_GMNAL @@ -61,6 +62,7 @@ #include "gm_internal.h" + /* * Defines for the API NAL */ diff --git a/lnet/klnds/gmlnd/gmlnd_cb.c b/lnet/klnds/gmlnd/gmlnd_cb.c index 093ee64..6ae91db 100644 --- a/lnet/klnds/gmlnd/gmlnd_cb.c +++ b/lnet/klnds/gmlnd/gmlnd_cb.c @@ -269,22 +269,3 @@ int gmnal_cb_dist(nal_cb_t *nal_cb, ptl_nid_t nid, unsigned long *dist) *dist = 27; return(PTL_OK); } - - - - -EXPORT_SYMBOL(gmnal_cb_send); -EXPORT_SYMBOL(gmnal_cb_send_pages); -EXPORT_SYMBOL(gmnal_cb_recv); -EXPORT_SYMBOL(gmnal_cb_recv_pages); -EXPORT_SYMBOL(gmnal_cb_read); -EXPORT_SYMBOL(gmnal_cb_write); -EXPORT_SYMBOL(gmnal_cb_cli); -EXPORT_SYMBOL(gmnal_cb_sti); -EXPORT_SYMBOL(gmnal_cb_dist); -EXPORT_SYMBOL(gmnal_cb_printf); -EXPORT_SYMBOL(gmnal_cb_map); -EXPORT_SYMBOL(gmnal_cb_unmap); -EXPORT_SYMBOL(gmnal_cb_callback); -EXPORT_SYMBOL(gmnal_cb_free); -EXPORT_SYMBOL(gmnal_cb_malloc); diff --git a/lnet/klnds/qswlnd/qswlnd_cb.c b/lnet/klnds/qswlnd/qswlnd_cb.c index 6e19783..006ea49 100644 --- a/lnet/klnds/qswlnd/qswlnd_cb.c +++ b/lnet/klnds/qswlnd/qswlnd_cb.c @@ -330,12 +330,7 @@ kqswnal_put_idle_tx (kqswnal_tx_t *ktx) list_del (&fwd->kprfd_list); } - if (waitqueue_active (&kqswnal_data.kqn_idletxd_waitq)) /* process? */ - { - /* local sender waiting for tx desc */ - CDEBUG(D_NET,"wakeup process\n"); - wake_up (&kqswnal_data.kqn_idletxd_waitq); - } + wake_up (&kqswnal_data.kqn_idletxd_waitq); spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags); @@ -346,8 +341,7 @@ kqswnal_put_idle_tx (kqswnal_tx_t *ktx) spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags); list_add_tail (&fwd->kprfd_list, &kqswnal_data.kqn_delayedfwds); - if (waitqueue_active (&kqswnal_data.kqn_sched_waitq)) - wake_up (&kqswnal_data.kqn_sched_waitq); + wake_up (&kqswnal_data.kqn_sched_waitq); spin_unlock_irqrestore (&kqswnal_data.kqn_sched_lock, flags); } @@ -514,8 +508,7 @@ kqswnal_launch (kqswnal_tx_t *ktx) spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags); list_add_tail (&ktx->ktx_delayed_list, &kqswnal_data.kqn_delayedtxds); - if (waitqueue_active (&kqswnal_data.kqn_sched_waitq)) - wake_up (&kqswnal_data.kqn_sched_waitq); + wake_up (&kqswnal_data.kqn_sched_waitq); spin_unlock_irqrestore (&kqswnal_data.kqn_sched_lock, flags); return (0); @@ -1244,8 +1237,7 @@ kqswnal_rxhandler(EP_RXD *rxd) spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags); list_add_tail (&krx->krx_list, &kqswnal_data.kqn_readyrxds); - if (waitqueue_active (&kqswnal_data.kqn_sched_waitq)) - wake_up (&kqswnal_data.kqn_sched_waitq); + wake_up (&kqswnal_data.kqn_sched_waitq); spin_unlock_irqrestore (&kqswnal_data.kqn_sched_lock, flags); } diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index c72717d0..3d0c758 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -241,9 +241,8 @@ ksocknal_destroy_route (ksock_route_t *route) void ksocknal_put_route (ksock_route_t *route) { - CDEBUG (D_OTHER, "putting route[%p] -> "LPX64" (%d)\n", - route, route->ksnr_peer->ksnp_nid, - atomic_read (&route->ksnr_refcount)); + CDEBUG (D_OTHER, "putting route[%p] (%d)\n", + route, atomic_read (&route->ksnr_refcount)); LASSERT (atomic_read (&route->ksnr_refcount) > 0); if (!atomic_dec_and_test (&route->ksnr_refcount)) @@ -865,8 +864,7 @@ ksocknal_close_conn_locked (ksock_conn_t *conn, int error) spin_lock (&ksocknal_data.ksnd_reaper_lock); list_add_tail (&conn->ksnc_list, &ksocknal_data.ksnd_deathrow_conns); - if (waitqueue_active (&ksocknal_data.ksnd_reaper_waitq)) - wake_up (&ksocknal_data.ksnd_reaper_waitq); + wake_up (&ksocknal_data.ksnd_reaper_waitq); spin_unlock (&ksocknal_data.ksnd_reaper_lock); } @@ -1008,8 +1006,7 @@ ksocknal_put_conn (ksock_conn_t *conn) spin_lock_irqsave (&ksocknal_data.ksnd_reaper_lock, flags); list_add (&conn->ksnc_list, &ksocknal_data.ksnd_zombie_conns); - if (waitqueue_active (&ksocknal_data.ksnd_reaper_waitq)) - wake_up (&ksocknal_data.ksnd_reaper_waitq); + wake_up (&ksocknal_data.ksnd_reaper_waitq); spin_unlock_irqrestore (&ksocknal_data.ksnd_reaper_lock, flags); } diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index a345ff7..1c73ae8 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -108,6 +108,10 @@ # define sk_socket socket #endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) +# define sk_wmem_queued wmem_queued +#endif + typedef struct /* pool of forwarding buffers */ { spinlock_t fmp_lock; /* serialise */ diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index 65db867..8ce6777 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -179,8 +179,7 @@ ksocknal_put_ltx (ksock_ltx_t *ltx) list_add_tail (<x->ltx_tx.tx_list, ltx->ltx_idle); /* normal tx desc => wakeup anyone blocking for one */ - if (ltx->ltx_idle == &ksocknal_data.ksnd_idle_ltx_list && - waitqueue_active (&ksocknal_data.ksnd_idle_ltx_waitq)) + if (ltx->ltx_idle == &ksocknal_data.ksnd_idle_ltx_list) wake_up (&ksocknal_data.ksnd_idle_ltx_waitq); spin_unlock_irqrestore (&ksocknal_data.ksnd_idle_ltx_lock, flags); @@ -627,8 +626,7 @@ ksocknal_zc_callback (zccd_t *zcd) spin_lock_irqsave (&sched->kss_lock, flags); list_add_tail (&tx->tx_list, &sched->kss_zctxdone_list); - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); spin_unlock_irqrestore (&sched->kss_lock, flags); EXIT; @@ -776,9 +774,7 @@ ksocknal_launch_autoconnect_locked (ksock_route_t *route) list_add_tail (&route->ksnr_connect_list, &ksocknal_data.ksnd_autoconnectd_routes); - - if (waitqueue_active (&ksocknal_data.ksnd_autoconnectd_waitq)) - wake_up (&ksocknal_data.ksnd_autoconnectd_waitq); + wake_up (&ksocknal_data.ksnd_autoconnectd_waitq); spin_unlock_irqrestore (&ksocknal_data.ksnd_autoconnectd_lock, flags); } @@ -867,8 +863,7 @@ ksocknal_queue_tx_locked (ksock_tx_t *tx, ksock_conn_t *conn) list_add_tail (&conn->ksnc_tx_list, &sched->kss_tx_conns); conn->ksnc_tx_scheduled = 1; - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); } spin_unlock_irqrestore (&sched->kss_lock, flags); @@ -1209,9 +1204,7 @@ ksocknal_fmb_callback (void *arg, int error) spin_lock_irqsave (&sched->kss_lock, flags); list_add_tail (&conn->ksnc_rx_list, &sched->kss_rx_conns); - - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); spin_unlock_irqrestore (&sched->kss_lock, flags); } @@ -1684,6 +1677,8 @@ int ksocknal_scheduler (void *arg) kportal_daemonize (name); kportal_blockallsigs (); + current->flags |= PF_MEMALLOC; + #if (CONFIG_SMP && CPU_AFFINITY) if ((cpu_online_map & (1 << id)) != 0) { #if 1 @@ -1797,8 +1792,7 @@ ksocknal_data_ready (struct sock *sk, int n) /* extra ref for scheduler */ atomic_inc (&conn->ksnc_refcount); - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); } spin_unlock_irqrestore (&sched->kss_lock, flags); @@ -1862,8 +1856,7 @@ ksocknal_write_space (struct sock *sk) /* extra ref for scheduler */ atomic_inc (&conn->ksnc_refcount); - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); } spin_unlock_irqrestore (&sched->kss_lock, flags); @@ -2363,7 +2356,7 @@ ksocknal_find_timed_out_conn (ksock_peer_t *peer) } if ((!list_empty (&conn->ksnc_tx_queue) || - conn->ksnc_sock->sk->wmem_queued != 0) && + conn->ksnc_sock->sk->sk_wmem_queued != 0) && time_after_eq (jiffies, conn->ksnc_tx_deadline)) { /* Timed out messages queued for sending, or * messages buffered in the socket's send buffer */ @@ -2371,7 +2364,7 @@ ksocknal_find_timed_out_conn (ksock_peer_t *peer) CERROR ("Timed out TX to "LPX64" %s%d %p\n", peer->ksnp_nid, list_empty (&conn->ksnc_tx_queue) ? "" : "Q ", - conn->ksnc_sock->sk->wmem_queued, conn); + conn->ksnc_sock->sk->sk_wmem_queued, conn); return (conn); } } diff --git a/lnet/klnds/toelnd/toenal_cb.c b/lnet/klnds/toelnd/toenal_cb.c index f92511a..983fa71 100644 --- a/lnet/klnds/toelnd/toenal_cb.c +++ b/lnet/klnds/toelnd/toenal_cb.c @@ -371,7 +371,6 @@ ktoenal_launch_packet (ksock_conn_t *conn, ksock_tx_t *tx) for (;;) { LASSERT (niov <= tx->tx_niov); - LASSERT (iov->iov_len >= 0); if (iov->iov_len >= nob) { diff --git a/lnet/libcfs/debug.c b/lnet/libcfs/debug.c index 77e742f..a42d422 100644 --- a/lnet/libcfs/debug.c +++ b/lnet/libcfs/debug.c @@ -292,10 +292,8 @@ int portals_debug_daemon(void *arg) if (!file || IS_ERR(file)) { CERROR("cannot open %s for logging", debug_daemon_file_path); GOTO(out1, PTR_ERR(file)); - } else { - printk(KERN_ALERT "LustreError: daemon dumping log to %s ... writing ...\n", - debug_daemon_file_path); } + printk(KERN_INFO "daemon dumping log to %s\n", debug_daemon_file_path); debug_daemon_state.overlapped = 0; debug_daemon_state.stopped = 0; @@ -339,8 +337,8 @@ int portals_debug_daemon(void *arg) rc = file->f_op->write(file, debug_buf+start, size, &file->f_pos); if (rc < 0) { - printk(KERN_ALERT - "LustreError: Debug_daemon write error %d\n", rc); + printk(KERN_ALERT "LustreError: Debug_daemon " + "write error %d\n", rc); goto out; } start += rc; @@ -361,16 +359,16 @@ int portals_debug_daemon(void *arg) if (force_flush) { rc = file->f_op->fsync(file, file->f_dentry, 1); if (rc < 0) { - printk(KERN_ALERT - "LustreError: Debug_daemon sync error %d\n", rc); + printk(KERN_ALERT "LustreError: Debug_daemon " + "sync error %d\n", rc); goto out; } if (debug_daemon_state.stopped) - break; + break; debug_daemon_state.lctl_event = 1; wake_up(&debug_daemon_state.lctl); } - wait_event(debug_daemon_state.daemon, + wait_event(debug_daemon_state.daemon, debug_daemon_state.daemon_event); } out: @@ -636,7 +634,7 @@ int portals_debug_mark_buffer(char *text) return -EINVAL; CDEBUG(0, "********************************************************\n"); - CERROR("DEBUG MARKER: %s\n", text); + CWARN("DEBUG MARKER: %s\n", text); CDEBUG(0, "********************************************************\n"); return 0; @@ -650,7 +648,7 @@ int portals_debug_mark_buffer(char *text) __s32 portals_debug_copy_to_user(char *buf, unsigned long len) { int rc; - unsigned long debug_off, i, off, copied; + unsigned long total, debug_off, i, off, copied; unsigned long flags; struct page *page; LIST_HEAD(my_pages); @@ -667,10 +665,10 @@ __s32 portals_debug_copy_to_user(char *buf, unsigned long len) } list_add(&page->list, &my_pages); } - + spin_lock_irqsave(&portals_debug_lock, flags); debug_off = atomic_read(&debug_off_a); - + /* Sigh. If the buffer is empty, then skip to the end. */ if (debug_off == 0 && !debug_wrapped) { spin_unlock_irqrestore(&portals_debug_lock, flags); @@ -678,16 +676,19 @@ __s32 portals_debug_copy_to_user(char *buf, unsigned long len) goto cleanup; } - if (debug_wrapped) + if (debug_wrapped) { off = debug_off + 1; - else + total = debug_size; + } else { off = 0; + total = debug_off; + } copied = 0; list_for_each(pos, &my_pages) { unsigned long to_copy; page = list_entry(pos, struct page, list); - to_copy = min(debug_size - off, PAGE_SIZE); + to_copy = min(total - off, PAGE_SIZE); if (to_copy == 0) { off = 0; to_copy = min(debug_size - off, PAGE_SIZE); @@ -696,9 +697,9 @@ finish_partial: memcpy(kmap(page), debug_buf + off, to_copy); kunmap(page); copied += to_copy; - if (copied >= (debug_wrapped ? debug_size : debug_off)) + if (copied >= total) break; - + off += to_copy; if (off >= debug_size) { off = 0; @@ -728,7 +729,7 @@ finish_partial: break; } rc = copied; - + cleanup: list_for_each_safe(pos, n, &my_pages) { page = list_entry(pos, struct page, list); @@ -786,8 +787,8 @@ portals_debug_msg(int subsys, int mask, char *file, const char *fn, max_nob = debug_size - debug_off + DEBUG_OVERFLOW; if (max_nob <= 0) { spin_unlock_irqrestore(&portals_debug_lock, flags); - printk("LustreError: logic error in portals_debug_msg: <0 bytes" - " to write\n"); + printk("LustreError: logic error in portals_debug_msg: " + "< 0 bytes to write\n"); return; } @@ -799,45 +800,47 @@ portals_debug_msg(int subsys, int mask, char *file, const char *fn, do_gettimeofday(&tv); prefix_nob = snprintf(debug_buf + debug_off, max_nob, - "%06x:%06x:%d:%lu.%06lu :", + "%06x:%06x:%d:%lu.%06lu:%lu:%d:", subsys, mask, smp_processor_id(), - tv.tv_sec, tv.tv_usec); + tv.tv_sec, tv.tv_usec, stack, current->pid); max_nob -= prefix_nob; - if(*(format + strlen(format) - 1) == '\n') - *(format + strlen(format) - 1) = ':'; - - va_start(ap, format); - msg_nob = vsnprintf(debug_buf + debug_off + prefix_nob , - max_nob, format, ap); - max_nob -= msg_nob; - va_end(ap); + if(*(format + strlen(format) - 1) != '\n') + *(format + strlen(format)) = '\n'; #if defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20)) - msg_nob += snprintf(debug_buf + debug_off + prefix_nob + msg_nob, max_nob, - "(%s:%d:%s() %d | %d+%lu)\n", - file, line, fn, current->pid, - current->thread.extern_pid, stack); + msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, + "%d:(%s:%d:%s()) ", + current->thread.extern_pid, file, line, fn); #elif defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) - msg_nob += snprintf(debug_buf + debug_off + prefix_nob + msg_nob, max_nob, - "(%s:%d:%s() %d | %d+%lu)\n", - file, line, fn, current->pid, - current->thread.mode.tt.extern_pid, stack); + msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, + "%d:(%s:%d:%s()) ", + current->thread.mode.tt.extern_pid, file, line, fn); #else - msg_nob += snprintf(debug_buf + debug_off + prefix_nob + msg_nob, max_nob, - "(%s:%d:%s() %d+%lu)\n", - file, line, fn, current->pid, stack); + msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, + ":(%s:%d:%s()) ", + file, line, fn); #endif + va_start(ap, format); + msg_nob += vsnprintf(debug_buf + debug_off + prefix_nob + msg_nob, + max_nob, format, ap); + max_nob -= msg_nob; + va_end(ap); + /* Print to console, while msg is contiguous in debug_buf */ /* NB safely terminated see above */ if ((mask & D_EMERG) != 0) printk(KERN_EMERG "LustreError: %s", debug_buf + debug_off + prefix_nob); - if ((mask & D_ERROR) != 0) - printk(KERN_ERR "LustreError: %s", + else if ((mask & D_ERROR) != 0) + printk(KERN_ERR "LustreError: %s", + debug_buf + debug_off + prefix_nob); + else if ((mask & D_WARNING) != 0) + printk(KERN_WARNING "Lustre: %s", debug_buf + debug_off + prefix_nob); else if (portal_printk) - printk("<%d>LustreError: %s", portal_printk, debug_buf+debug_off+prefix_nob); + printk("<%d>Lustre: %s", portal_printk, + debug_buf+debug_off+prefix_nob); base_offset = debug_off & 0xFFFF; debug_off += prefix_nob + msg_nob; @@ -880,8 +883,8 @@ void portals_run_upcall(char **argv) argc++; LASSERT(argc >= 2); - - rc = call_usermodehelper(argv[0], argv, envp); + + rc = USERMODEHELPER(argv[0], argv, envp); if (rc < 0) { CERROR("Error %d invoking portals upcall %s %s%s%s%s%s%s%s%s; " "check /proc/sys/portals/upcall\n", diff --git a/lnet/libcfs/module.c b/lnet/libcfs/module.c index befb3b1..c51a506 100644 --- a/lnet/libcfs/module.c +++ b/lnet/libcfs/module.c @@ -162,9 +162,12 @@ kportal_notify_router (int gw_nalid, ptl_nid_t gw_nid, int rc; kpr_control_interface_t *ci; + /* No error if router not preset. Sysadmin is allowed to notify + * _everywhere_ when a NID boots or crashes, even if they know + * nothing of the peer. */ ci = (kpr_control_interface_t *)PORTAL_SYMBOL_GET(kpr_control_interface); if (ci == NULL) - return (-ENODEV); + return (0); rc = ci->kprci_notify (gw_nalid, gw_nid, alive, when); diff --git a/lnet/lnet/lib-me.c b/lnet/lnet/lib-me.c index bd1af5b..31ac214 100644 --- a/lnet/lnet/lib-me.c +++ b/lnet/lnet/lib-me.c @@ -44,7 +44,7 @@ int do_PtlMEAttach(nal_cb_t * nal, void *private, void *v_args, void *v_ret) unsigned long flags; lib_me_t *me; - if (args->index_in < 0 || args->index_in >= tbl->size) + if (args->index_in >= tbl->size) return ret->rc = PTL_INV_PTINDEX; /* Should check for valid matchid, but not yet */ diff --git a/lnet/lnet/lib-move.c b/lnet/lnet/lib-move.c index f710476..e73cbb8 100644 --- a/lnet/lnet/lib-move.c +++ b/lnet/lnet/lib-move.c @@ -305,8 +305,6 @@ lib_extract_iov (struct iovec *dst, lib_md_t *md, ptl_size_t frag_len; int dst_niov; - LASSERT (len >= 0); - LASSERT (offset >= 0); LASSERT (offset + len <= md->length); if (len == 0) /* no data => */ @@ -442,8 +440,6 @@ lib_extract_kiov (ptl_kiov_t *dst, lib_md_t *md, ptl_size_t frag_len; int dst_niov; - LASSERT (len >= 0); - LASSERT (offset >= 0); LASSERT (offset + len <= md->length); if (len == 0) /* no data => */ diff --git a/lnet/lnet/lib-ni.c b/lnet/lnet/lib-ni.c index aa30329..9e90576 100644 --- a/lnet/lnet/lib-ni.c +++ b/lnet/lnet/lib-ni.c @@ -27,7 +27,7 @@ #include #include -#define MAX_DIST 18446744073709551615UL +#define MAX_DIST 18446744073709551615ULL int do_PtlNIDebug(nal_cb_t * nal, void *private, void *v_args, void *v_ret) { diff --git a/lnet/router/router.c b/lnet/router/router.c index 32f741f..b5bab2c 100644 --- a/lnet/router/router.c +++ b/lnet/router/router.c @@ -149,14 +149,14 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, int alive, time_t when) { unsigned long flags; - int rc = -ENOENT; + int found; kpr_nal_entry_t *ne = NULL; kpr_gateway_entry_t *ge = NULL; struct timeval now; struct list_head *e; struct list_head *n; - CDEBUG (D_ERROR, "%s notifying [%d] "LPX64": %s\n", + CDEBUG (D_NET, "%s notifying [%d] "LPX64": %s\n", byNal ? "NAL" : "userspace", gateway_nalid, gateway_nid, alive ? "up" : "down"); @@ -177,6 +177,7 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, /* Serialise with lookups (i.e. write lock) */ write_lock_irqsave(&kpr_rwlock, flags); + found = 0; list_for_each_safe (e, n, &kpr_gateways) { ge = list_entry(e, kpr_gateway_entry_t, kpge_list); @@ -185,15 +186,15 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, ge->kpge_nid != gateway_nid) continue; - rc = 0; + found = 1; break; } - if (rc != 0) { + if (!found) { /* gateway not found */ write_unlock_irqrestore(&kpr_rwlock, flags); CDEBUG (D_NET, "Gateway not found\n"); - return (rc); + return (0); } if (when < ge->kpge_timestamp) { @@ -226,25 +227,24 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, } } + found = 0; if (!byNal) { /* userland notified me: notify NAL? */ ne = kpr_find_nal_entry_locked (ge->kpge_nalid); if (ne != NULL) { - if (ne->kpne_shutdown || - ne->kpne_interface.kprni_notify == NULL) { - /* no need to notify */ - ne = NULL; - } else { + if (!ne->kpne_shutdown && + ne->kpne_interface.kprni_notify != NULL) { /* take a ref on this NAL until notifying * it has completed... */ atomic_inc (&ne->kpne_refcount); + found = 1; } } } write_unlock_irqrestore(&kpr_rwlock, flags); - if (ne != NULL) { + if (found) { ne->kpne_interface.kprni_notify (ne->kpne_interface.kprni_arg, gateway_nid, alive); /* 'ne' can disappear now... */ @@ -580,8 +580,10 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, atomic_set (&ge->kpge_weight, 0); PORTAL_ALLOC (re, sizeof (*re)); - if (re == NULL) + if (re == NULL) { + PORTAL_FREE (ge, sizeof (*ge)); return (-ENOMEM); + } re->kpre_lo_nid = lo_nid; re->kpre_hi_nid = hi_nid; diff --git a/lnet/router/router.h b/lnet/router/router.h index 4ace247..ea25439 100644 --- a/lnet/router/router.h +++ b/lnet/router/router.h @@ -71,11 +71,7 @@ typedef struct typedef struct { -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) - struct work_struct kpru_tq; -#else - struct tq_struct kpru_tq; -#endif + work_struct_t kpru_tq; int kpru_nal_id; ptl_nid_t kpru_nid; int kpru_alive; diff --git a/lnet/utils/parser.c b/lnet/utils/parser.c index eccf507..db5292d 100644 --- a/lnet/utils/parser.c +++ b/lnet/utils/parser.c @@ -80,7 +80,7 @@ static int line2args(char *line, char **argv, int maxargs) arg = strtok(line, " \t"); if ( arg ) { - argv[i] = arg; + argv[i] = arg; i++; } else return 0; @@ -110,7 +110,10 @@ int Parser_execarg(int argc, char **argv, command_t cmds[]) cmd = Parser_findargcmd(argv[0], cmds); if ( cmd ) { - return (cmd->pc_func)(argc, argv); + int rc = (cmd->pc_func)(argc, argv); + if (rc == CMD_HELP) + fprintf(stderr, "%s\n", cmd->pc_help); + return rc; } else { printf("Try interactive use without arguments or use one of:\n"); for (cmd = cmds; cmd->pc_name; cmd++) diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c index 5955c54..4beac34 100644 --- a/lnet/utils/portals.c +++ b/lnet/utils/portals.c @@ -204,7 +204,7 @@ ptl_parse_time (time_t *t, char *str) return (0); memset (&tm, 0, sizeof (tm)); - n = sscanf (str, "%d-%d-%d %d:%d:%d", + n = sscanf (str, "%d-%d-%d-%d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); if (n != 6) @@ -1367,7 +1367,7 @@ jt_ptl_notify_router (int argc, char **argv) when = now.tv_sec; } else if (ptl_parse_time (&when, argv[3]) != 0) { fprintf(stderr, "Can't parse time %s\n" - "Please specify either 'YYYY-MM-DD HH:MM:SS'\n" + "Please specify either 'YYYY-MM-DD-HH:MM:SS'\n" "or an absolute unix time in seconds\n", argv[3]); return (-1); } else if (when > now.tv_sec) { diff --git a/lustre/kernel_patches/patches/iopen-2.6.0-test6.patch b/lustre/kernel_patches/patches/iopen-2.6.0-test6.patch index 3d99db8..3c64e1e 100644 --- a/lustre/kernel_patches/patches/iopen-2.6.0-test6.patch +++ b/lustre/kernel_patches/patches/iopen-2.6.0-test6.patch @@ -1,18 +1,15 @@ Documentation/filesystems/ext2.txt | 16 ++ - fs/ext3/Makefile | 2 fs/ext3/inode.c | 3 fs/ext3/iopen.c | 239 +++++++++++++++++++++++++++++++++++++ fs/ext3/iopen.h | 15 ++ fs/ext3/namei.c | 13 ++ - fs/ext3/super.c | 11 + + fs/ext3/super.c | 17 ++ include/linux/ext3_fs.h | 2 - 8 files changed, 300 insertions(+), 1 deletion(-) + 7 files changed, 304 insertions(+), 1 deletion(-) -Index: linux-2.6.0-test6/Documentation/filesystems/ext2.txt -=================================================================== ---- linux-2.6.0-test6.orig/Documentation/filesystems/ext2.txt 2003-10-07 16:19:10.593048704 +0800 -+++ linux-2.6.0-test6/Documentation/filesystems/ext2.txt 2003-10-07 16:19:49.129190320 +0800 -@@ -35,6 +35,22 @@ +--- linux-2.6.0-test6/Documentation/filesystems/ext2.txt~iopen-2.6.0-test6 2002-11-11 06:28:06.000000000 +0300 ++++ linux-2.6.0-test6-alexey/Documentation/filesystems/ext2.txt 2003-10-14 17:03:48.000000000 +0400 +@@ -35,6 +35,22 @@ resgid=n The group ID which may use th sb=n Use alternate superblock at this location. @@ -35,10 +32,8 @@ Index: linux-2.6.0-test6/Documentation/filesystems/ext2.txt grpquota,noquota,quota,usrquota Quota options are silently ignored by ext2. -Index: linux-2.6.0-test6/fs/ext3/inode.c -=================================================================== ---- linux-2.6.0-test6.orig/fs/ext3/inode.c 2003-10-07 16:19:10.595048400 +0800 -+++ linux-2.6.0-test6/fs/ext3/inode.c 2003-10-07 16:19:49.131190016 +0800 +--- linux-2.6.0-test6/fs/ext3/inode.c~iopen-2.6.0-test6 2003-10-14 17:03:47.000000000 +0400 ++++ linux-2.6.0-test6-alexey/fs/ext3/inode.c 2003-10-14 17:03:48.000000000 +0400 @@ -37,6 +37,7 @@ #include #include @@ -47,7 +42,7 @@ Index: linux-2.6.0-test6/fs/ext3/inode.c #include "acl.h" /* -@@ -2479,6 +2480,8 @@ +@@ -2479,6 +2480,8 @@ void ext3_read_inode(struct inode * inod ei->i_acl = EXT3_ACL_NOT_CACHED; ei->i_default_acl = EXT3_ACL_NOT_CACHED; #endif @@ -56,10 +51,8 @@ Index: linux-2.6.0-test6/fs/ext3/inode.c if (ext3_get_inode_loc(inode, &iloc, 0)) goto bad_inode; bh = iloc.bh; -Index: linux-2.6.0-test6/fs/ext3/iopen.c -=================================================================== ---- linux-2.6.0-test6.orig/fs/ext3/iopen.c 2003-10-07 16:19:49.109193360 +0800 -+++ linux-2.6.0-test6/fs/ext3/iopen.c 2003-10-07 16:19:49.132189864 +0800 +--- /dev/null 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.6.0-test6-alexey/fs/ext3/iopen.c 2003-10-14 17:03:48.000000000 +0400 @@ -0,0 +1,239 @@ + + @@ -300,10 +293,8 @@ Index: linux-2.6.0-test6/fs/ext3/iopen.c + + return 1; +} -Index: linux-2.6.0-test6/fs/ext3/iopen.h -=================================================================== ---- linux-2.6.0-test6.orig/fs/ext3/iopen.h 2003-10-07 16:19:49.109193360 +0800 -+++ linux-2.6.0-test6/fs/ext3/iopen.h 2003-10-07 16:19:49.132189864 +0800 +--- /dev/null 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.6.0-test6-alexey/fs/ext3/iopen.h 2003-10-14 17:03:48.000000000 +0400 @@ -0,0 +1,15 @@ +/* + * iopen.h @@ -320,10 +311,8 @@ Index: linux-2.6.0-test6/fs/ext3/iopen.h +extern int ext3_iopen_get_inode(struct inode * inode); + + -Index: linux-2.6.0-test6/fs/ext3/namei.c -=================================================================== ---- linux-2.6.0-test6.orig/fs/ext3/namei.c 2003-10-07 16:19:10.597048096 +0800 -+++ linux-2.6.0-test6/fs/ext3/namei.c 2003-10-07 16:19:49.133189712 +0800 +--- linux-2.6.0-test6/fs/ext3/namei.c~iopen-2.6.0-test6 2003-10-14 17:03:47.000000000 +0400 ++++ linux-2.6.0-test6-alexey/fs/ext3/namei.c 2003-10-14 17:03:48.000000000 +0400 @@ -37,6 +37,7 @@ #include #include @@ -332,7 +321,7 @@ Index: linux-2.6.0-test6/fs/ext3/namei.c #include "acl.h" /* -@@ -970,15 +971,21 @@ +@@ -970,15 +971,21 @@ errout: } #endif @@ -354,7 +343,7 @@ Index: linux-2.6.0-test6/fs/ext3/namei.c bh = ext3_find_entry(dentry, &de); inode = NULL; if (bh) { -@@ -991,6 +998,12 @@ +@@ -991,6 +998,12 @@ static struct dentry *ext3_lookup(struct } if (inode) return d_splice_alias(inode, dentry); @@ -367,11 +356,9 @@ Index: linux-2.6.0-test6/fs/ext3/namei.c d_add(dentry, inode); return NULL; } -Index: linux-2.6.0-test6/fs/ext3/super.c -=================================================================== ---- linux-2.6.0-test6.orig/fs/ext3/super.c 2003-10-07 16:19:10.599047792 +0800 -+++ linux-2.6.0-test6/fs/ext3/super.c 2003-10-07 16:25:14.799680880 +0800 -@@ -534,7 +534,7 @@ +--- linux-2.6.0-test6/fs/ext3/super.c~iopen-2.6.0-test6 2003-10-14 17:03:47.000000000 +0400 ++++ linux-2.6.0-test6-alexey/fs/ext3/super.c 2003-10-14 17:03:48.000000000 +0400 +@@ -534,7 +534,7 @@ enum { Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, Opt_noload, Opt_commit, Opt_journal_update, Opt_journal_inum, Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, @@ -380,7 +367,7 @@ Index: linux-2.6.0-test6/fs/ext3/super.c }; static match_table_t tokens = { -@@ -573,6 +573,9 @@ +@@ -573,6 +573,9 @@ static match_table_t tokens = { {Opt_ignore, "noquota"}, {Opt_ignore, "quota"}, {Opt_ignore, "usrquota"}, @@ -390,7 +377,7 @@ Index: linux-2.6.0-test6/fs/ext3/super.c {Opt_err, NULL} }; -@@ -760,6 +763,18 @@ +@@ -760,6 +763,18 @@ static int parse_options (char * options case Opt_abort: set_opt(sbi->s_mount_opt, ABORT); break; @@ -409,11 +396,9 @@ Index: linux-2.6.0-test6/fs/ext3/super.c case Opt_ignore: break; default: -Index: linux-2.6.0-test6/include/linux/ext3_fs.h -=================================================================== ---- linux-2.6.0-test6.orig/include/linux/ext3_fs.h 2003-10-07 16:19:10.600047640 +0800 -+++ linux-2.6.0-test6/include/linux/ext3_fs.h 2003-10-07 16:19:49.136189256 +0800 -@@ -324,6 +324,8 @@ +--- linux-2.6.0-test6/include/linux/ext3_fs.h~iopen-2.6.0-test6 2003-10-14 17:03:47.000000000 +0400 ++++ linux-2.6.0-test6-alexey/include/linux/ext3_fs.h 2003-10-14 17:03:48.000000000 +0400 +@@ -325,6 +325,8 @@ struct ext3_inode { #define EXT3_MOUNT_NO_UID32 0x2000 /* Disable 32-bit UIDs */ #define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ #define EXT3_MOUNT_POSIX_ACL 0x8000 /* POSIX Access Control Lists */ @@ -422,3 +407,5 @@ Index: linux-2.6.0-test6/include/linux/ext3_fs.h /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ #ifndef _LINUX_EXT2_FS_H + +_ diff --git a/lustre/kernel_patches/patches/netpoll-pcnet32.patch b/lustre/kernel_patches/patches/netpoll-pcnet32.patch new file mode 100644 index 0000000..f0ad313 --- /dev/null +++ b/lustre/kernel_patches/patches/netpoll-pcnet32.patch @@ -0,0 +1,45 @@ + drivers/net/pcnet32.c | 16 ++++++++++++++++ + 1 files changed, 16 insertions(+) + +diff -puN drivers/net/pcnet32.c~kgdbeth-pcnet32-support drivers/net/pcnet32.c +--- linux-2.6.0-test6-mm/drivers/net/pcnet32.c~kgdbeth-pcnet32-support 2003-10-06 00:45:54.000000000 +0400 ++++ linux-2.6.0-test6-mm-alexey/drivers/net/pcnet32.c 2003-10-06 00:54:55.000000000 +0400 +@@ -331,6 +331,9 @@ static int pcnet32_init_ring(struct net + static int pcnet32_start_xmit(struct sk_buff *, struct net_device *); + static int pcnet32_rx(struct net_device *); + static void pcnet32_tx_timeout (struct net_device *dev); ++#ifdef CONFIG_NET_POLL_CONTROLLER ++static void pcnet32_rx_poll(struct net_device *); ++#endif + static irqreturn_t pcnet32_interrupt(int, void *, struct pt_regs *); + static int pcnet32_close(struct net_device *); + static struct net_device_stats *pcnet32_get_stats(struct net_device *); +@@ -806,6 +809,10 @@ pcnet32_probe1(unsigned long ioaddr, uns + dev->tx_timeout = pcnet32_tx_timeout; + dev->watchdog_timeo = (5*HZ); + ++#ifdef CONFIG_NET_POLL_CONTROLLER ++ dev->poll_controller = pcnet32_rx_poll; ++#endif ++ + lp->next = pcnet32_dev; + pcnet32_dev = dev; + +@@ -1152,6 +1159,15 @@ pcnet32_start_xmit(struct sk_buff *skb, + return 0; + } + ++#ifdef CONFIG_NET_POLL_CONTROLLER ++static void pcnet32_rx_poll(struct net_device *dev) ++{ ++ disable_irq(dev->irq); ++ pcnet32_interrupt(dev->irq, (void *)dev, 0); ++ enable_irq(dev->irq); ++} ++#endif ++ + /* The PCNET32 interrupt handler. */ + static irqreturn_t + pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs) + +_ diff --git a/lustre/kernel_patches/patches/uml-2.4.20-fixes-1.patch b/lustre/kernel_patches/patches/uml-2.4.20-fixes-1.patch new file mode 100644 index 0000000..6f4c8e3 --- /dev/null +++ b/lustre/kernel_patches/patches/uml-2.4.20-fixes-1.patch @@ -0,0 +1,215 @@ + arch/um/kernel/process.c | 2 +- + arch/um/kernel/skas/process.c | 26 +++++++++++++------------- + arch/um/kernel/skas/syscall_kern.c | 3 ++- + arch/um/kernel/trap_user.c | 2 +- + arch/um/kernel/tt/syscall_kern.c | 3 ++- + arch/um/kernel/tt/uaccess_user.c | 2 +- + arch/um/kernel/uaccess_user.c | 2 +- + arch/um/link.ld.in | 1 - + 8 files changed, 21 insertions(+), 20 deletions(-) + +Index: linux-2.4.20/arch/um/link.ld.in +=================================================================== +--- linux-2.4.20.orig/arch/um/link.ld.in 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/link.ld.in 2003-10-25 00:36:02.000000000 +0400 +@@ -6,7 +6,6 @@ + { + . = START() + SIZEOF_HEADERS; + +- . = ALIGN(4096); + __binary_start = .; + ifdef(`MODE_TT', ` + .thread_private : { +Index: linux-2.4.20/arch/um/kernel/process.c +=================================================================== +--- linux-2.4.20.orig/arch/um/kernel/process.c 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/kernel/process.c 2003-10-25 00:36:02.000000000 +0400 +@@ -232,7 +232,7 @@ + int n; + + *jmp_ptr = &buf; +- n = setjmp(buf); ++ n = sigsetjmp(buf, 1); + if(n != 0) + return(n); + (*fn)(arg); +Index: linux-2.4.20/arch/um/kernel/skas/process.c +=================================================================== +--- linux-2.4.20.orig/arch/um/kernel/skas/process.c 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/kernel/skas/process.c 2003-10-25 00:36:02.000000000 +0400 +@@ -59,11 +59,11 @@ + int err, syscall_nr, status; + + syscall_nr = PT_SYSCALL_NR(regs->skas.regs); ++ UPT_SYSCALL_NR(regs) = syscall_nr; + if(syscall_nr < 1){ + relay_signal(SIGTRAP, regs); + return; + } +- UPT_SYSCALL_NR(regs) = syscall_nr; + + err = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid); + if(err < 0) +@@ -189,7 +189,7 @@ + *switch_buf_ptr = &switch_buf; + *fork_buf_ptr = &fork_buf; + +- if(setjmp(fork_buf) == 0) ++ if(sigsetjmp(fork_buf, 1) == 0) + new_thread_proc(stack, handler); + + remove_sigstack(); +@@ -201,8 +201,8 @@ + + *switch_buf = &buf; + fork_buf = fb; +- if(setjmp(buf) == 0) +- longjmp(*fork_buf, 1); ++ if(sigsetjmp(buf, 1) == 0) ++ siglongjmp(*fork_buf, 1); + } + + static int move_registers(int int_op, int fp_op, union uml_pt_regs *regs, +@@ -260,8 +260,8 @@ + jmp_buf my_buf, **me_ptr = me, *next_buf = next; + + *me_ptr = &my_buf; +- if(setjmp(my_buf) == 0) +- longjmp(*next_buf, 1); ++ if(sigsetjmp(my_buf, 1) == 0) ++ siglongjmp(*next_buf, 1); + } + + static jmp_buf initial_jmpbuf; +@@ -277,14 +277,14 @@ + int n; + + *fork_buf_ptr = &initial_jmpbuf; +- n = setjmp(initial_jmpbuf); ++ n = sigsetjmp(initial_jmpbuf, 1); + if(n == 0) + new_thread_proc((void *) stack, new_thread_handler); + else if(n == 1) + remove_sigstack(); + else if(n == 2){ + (*cb_proc)(cb_arg); +- longjmp(*cb_back, 1); ++ siglongjmp(*cb_back, 1); + } + else if(n == 3){ + kmalloc_ok = 0; +@@ -294,7 +294,7 @@ + kmalloc_ok = 0; + return(1); + } +- longjmp(**switch_buf, 1); ++ siglongjmp(**switch_buf, 1); + } + + void remove_sigstack(void) +@@ -316,8 +316,8 @@ + cb_back = &here; + + block_signals(); +- if(setjmp(here) == 0) +- longjmp(initial_jmpbuf, 2); ++ if(sigsetjmp(here, 1) == 0) ++ siglongjmp(initial_jmpbuf, 2); + unblock_signals(); + + cb_proc = NULL; +@@ -328,13 +328,13 @@ + void halt_skas(void) + { + block_signals(); +- longjmp(initial_jmpbuf, 3); ++ siglongjmp(initial_jmpbuf, 3); + } + + void reboot_skas(void) + { + block_signals(); +- longjmp(initial_jmpbuf, 4); ++ siglongjmp(initial_jmpbuf, 4); + } + + int new_mm(int from) +Index: linux-2.4.20/arch/um/kernel/skas/syscall_kern.c +=================================================================== +--- linux-2.4.20.orig/arch/um/kernel/skas/syscall_kern.c 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/kernel/skas/syscall_kern.c 2003-10-25 00:36:02.000000000 +0400 +@@ -23,7 +23,8 @@ + nsyscalls++; + syscall = UPT_SYSCALL_NR(®s->regs); + +- if((syscall >= NR_syscalls) || (syscall < 0)) ++ if((syscall >= NR_syscalls) || (syscall < 0) || ++ (sys_call_table[syscall] == NULL)) + res = -ENOSYS; + else res = EXECUTE_SYSCALL(syscall, regs); + +Index: linux-2.4.20/arch/um/kernel/trap_user.c +=================================================================== +--- linux-2.4.20.orig/arch/um/kernel/trap_user.c 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/kernel/trap_user.c 2003-10-25 00:36:02.000000000 +0400 +@@ -125,7 +125,7 @@ + { + jmp_buf *buf = b; + +- longjmp(*buf, val); ++ siglongjmp(*buf, val); + } + + /* +Index: linux-2.4.20/arch/um/kernel/tt/syscall_kern.c +=================================================================== +--- linux-2.4.20.orig/arch/um/kernel/tt/syscall_kern.c 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/kernel/tt/syscall_kern.c 2003-10-25 00:36:02.000000000 +0400 +@@ -113,7 +113,8 @@ + nsyscalls++; + syscall = UPT_SYSCALL_NR(®s->regs); + +- if((syscall >= NR_syscalls) || (syscall < 0)) ++ if((syscall >= NR_syscalls) || (syscall < 0) || ++ (sys_call_table[syscall] == NULL)) + res = -ENOSYS; + else if(honeypot && check_bogosity(regs)) + res = -EFAULT; +Index: linux-2.4.20/arch/um/kernel/tt/uaccess_user.c +=================================================================== +--- linux-2.4.20.orig/arch/um/kernel/tt/uaccess_user.c 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/kernel/tt/uaccess_user.c 2003-10-25 00:36:02.000000000 +0400 +@@ -75,7 +75,7 @@ + jmp_buf jbuf; + + *fault_catcher = &jbuf; +- if(setjmp(jbuf) == 0){ ++ if(sigsetjmp(jbuf, 1) == 0){ + ret = strlen(str) + 1; + } + else { +Index: linux-2.4.20/arch/um/kernel/uaccess_user.c +=================================================================== +--- linux-2.4.20.orig/arch/um/kernel/uaccess_user.c 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/kernel/uaccess_user.c 2003-10-25 00:36:02.000000000 +0400 +@@ -20,7 +20,7 @@ + + jmp_buf jbuf; + *fault_catcher = &jbuf; +- if(setjmp(jbuf) == 0){ ++ if(sigsetjmp(jbuf, 1) == 0){ + (*op)(to, from, n); + ret = 0; + *faulted_out = 0; +Index: linux-2.4.20/arch/um/kernel/tt/ptproxy/sysdep.c +=================================================================== +--- linux-2.4.20.orig/arch/um/kernel/tt/ptproxy/sysdep.c 2003-10-25 00:35:59.000000000 +0400 ++++ linux-2.4.20/arch/um/kernel/tt/ptproxy/sysdep.c 2003-10-25 00:36:23.000000000 +0400 +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include + #include + #include diff --git a/lustre/kernel_patches/pc/ext3-ea-in-inode-2.4.22-rh.pc b/lustre/kernel_patches/pc/ext3-ea-in-inode-2.4.22-rh.pc deleted file mode 100644 index 56f6fdf..0000000 --- a/lustre/kernel_patches/pc/ext3-ea-in-inode-2.4.22-rh.pc +++ /dev/null @@ -1,6 +0,0 @@ -fs/ext3/ialloc.c -fs/ext3/inode.c -fs/ext3/super.c -fs/ext3/xattr.c -include/linux/ext3_fs.h -include/linux/ext3_fs_i.h diff --git a/lustre/kernel_patches/pc/ext3-htree-2.4.22-rh.pc b/lustre/kernel_patches/pc/ext3-htree-2.4.22-rh.pc deleted file mode 100644 index 9734b6d..0000000 --- a/lustre/kernel_patches/pc/ext3-htree-2.4.22-rh.pc +++ /dev/null @@ -1,11 +0,0 @@ -fs/ext3/dir.c -fs/ext3/file.c -fs/ext3/hash.c -fs/ext3/Makefile -fs/ext3/namei.c -fs/ext3/super.c -include/linux/ext3_fs.h -include/linux/ext3_fs_sb.h -include/linux/ext3_jbd.h -include/linux/rbtree.h -lib/rbtree.c diff --git a/lustre/kernel_patches/pc/ext3-orphan_lock-2.4.22-rh.pc b/lustre/kernel_patches/pc/ext3-orphan_lock-2.4.22-rh.pc deleted file mode 100644 index 1b6b9ea..0000000 --- a/lustre/kernel_patches/pc/ext3-orphan_lock-2.4.22-rh.pc +++ /dev/null @@ -1,5 +0,0 @@ -fs/ext3/namei.c -fs/ext3/namei.c.orig -fs/ext3/super.c -include/linux/ext3_fs_sb.h -include/linux/ext3_fs_sb.h.orig diff --git a/lustre/kernel_patches/pc/ext3-wantedi-2.6.pc b/lustre/kernel_patches/pc/ext3-wantedi-2.6.pc deleted file mode 100644 index a9b845a..0000000 --- a/lustre/kernel_patches/pc/ext3-wantedi-2.6.pc +++ /dev/null @@ -1,6 +0,0 @@ -fs/ext3/ialloc.c -fs/ext3/inode.c -fs/ext3/ioctl.c -fs/ext3/namei.c -include/linux/dcache.h -include/linux/ext3_fs.h diff --git a/lustre/kernel_patches/pc/extN-wantedi-2.4.22-rh.pc b/lustre/kernel_patches/pc/extN-wantedi-2.4.22-rh.pc deleted file mode 100644 index a9b845a..0000000 --- a/lustre/kernel_patches/pc/extN-wantedi-2.4.22-rh.pc +++ /dev/null @@ -1,6 +0,0 @@ -fs/ext3/ialloc.c -fs/ext3/inode.c -fs/ext3/ioctl.c -fs/ext3/namei.c -include/linux/dcache.h -include/linux/ext3_fs.h diff --git a/lustre/kernel_patches/pc/iod-stock-exports-2.4.22-rh.pc b/lustre/kernel_patches/pc/iod-stock-exports-2.4.22-rh.pc deleted file mode 100644 index e4eceee..0000000 --- a/lustre/kernel_patches/pc/iod-stock-exports-2.4.22-rh.pc +++ /dev/null @@ -1,3 +0,0 @@ -fs/inode.c -fs/Makefile -mm/page_alloc.c diff --git a/lustre/kernel_patches/pc/nfs_export_kernel-2.4.20-hp.pc b/lustre/kernel_patches/pc/nfs_export_kernel-2.4.20-hp.pc deleted file mode 100644 index e70ab4d..0000000 --- a/lustre/kernel_patches/pc/nfs_export_kernel-2.4.20-hp.pc +++ /dev/null @@ -1,9 +0,0 @@ -fs/file_table.c -fs/inode.c -fs/Makefile -fs/namei.c -fs/nfsd/export.c -fs/nfsd/nfsfh.c -fs/nfsd/vfs.c -include/linux/fs.h -kernel/ksyms.c diff --git a/lustre/kernel_patches/pc/nfs_export_kernel-2.4.20-rh.pc b/lustre/kernel_patches/pc/nfs_export_kernel-2.4.20-rh.pc deleted file mode 100644 index e70ab4d..0000000 --- a/lustre/kernel_patches/pc/nfs_export_kernel-2.4.20-rh.pc +++ /dev/null @@ -1,9 +0,0 @@ -fs/file_table.c -fs/inode.c -fs/Makefile -fs/namei.c -fs/nfsd/export.c -fs/nfsd/nfsfh.c -fs/nfsd/vfs.c -include/linux/fs.h -kernel/ksyms.c diff --git a/lustre/kernel_patches/pc/nfs_export_kernel-2.4.22-rh.pc b/lustre/kernel_patches/pc/nfs_export_kernel-2.4.22-rh.pc deleted file mode 100644 index e70ab4d..0000000 --- a/lustre/kernel_patches/pc/nfs_export_kernel-2.4.22-rh.pc +++ /dev/null @@ -1,9 +0,0 @@ -fs/file_table.c -fs/inode.c -fs/Makefile -fs/namei.c -fs/nfsd/export.c -fs/nfsd/nfsfh.c -fs/nfsd/vfs.c -include/linux/fs.h -kernel/ksyms.c diff --git a/lustre/kernel_patches/pc/socket-exports-2.4.22-rh.pc b/lustre/kernel_patches/pc/socket-exports-2.4.22-rh.pc deleted file mode 100644 index 3277003..0000000 --- a/lustre/kernel_patches/pc/socket-exports-2.4.22-rh.pc +++ /dev/null @@ -1,3 +0,0 @@ -include/linux/socket.h -net/netsyms.c -net/socket.c diff --git a/lustre/kernel_patches/pc/tcp-zero-copy-2.4.22-rh.pc b/lustre/kernel_patches/pc/tcp-zero-copy-2.4.22-rh.pc deleted file mode 100644 index 556327b..0000000 --- a/lustre/kernel_patches/pc/tcp-zero-copy-2.4.22-rh.pc +++ /dev/null @@ -1,5 +0,0 @@ -include/linux/skbuff.h -include/net/tcp.h -net/core/skbuff.c -net/ipv4/tcp.c -net/netsyms.c diff --git a/lustre/kernel_patches/pc/vfs_intent-2.4.22-rh.pc b/lustre/kernel_patches/pc/vfs_intent-2.4.22-rh.pc deleted file mode 100644 index d177a30..0000000 --- a/lustre/kernel_patches/pc/vfs_intent-2.4.22-rh.pc +++ /dev/null @@ -1,12 +0,0 @@ -fs/dcache.c -fs/exec.c -fs/namei.c -fs/namespace.c -fs/open.c -fs/stat.c -include/linux/dcache.h -include/linux/fs.h -include/linux/fs_struct.h -kernel/exit.c -kernel/fork.c -kernel/ksyms.c diff --git a/lustre/kernel_patches/pc/xattr-0.8.54-2.4.22-rh.pc b/lustre/kernel_patches/pc/xattr-0.8.54-2.4.22-rh.pc deleted file mode 100644 index e6edcc6..0000000 --- a/lustre/kernel_patches/pc/xattr-0.8.54-2.4.22-rh.pc +++ /dev/null @@ -1,58 +0,0 @@ -arch/alpha/defconfig -arch/alpha/kernel/entry.S -arch/arm/defconfig -arch/arm/kernel/calls.S -arch/i386/defconfig -arch/ia64/defconfig -arch/m68k/defconfig -arch/mips64/defconfig -arch/mips/defconfig -arch/ppc64/kernel/misc.S -arch/ppc/defconfig -arch/s390/defconfig -arch/s390/kernel/entry.S -arch/s390x/defconfig -arch/s390x/kernel/entry.S -arch/s390x/kernel/wrapper32.S -arch/sparc64/defconfig -arch/sparc/defconfig -Documentation/Configure.help -fs/Config.in -fs/ext2/file.c -fs/ext2/ialloc.c -fs/ext2/inode.c -fs/ext2/Makefile -fs/ext2/namei.c -fs/ext2/super.c -fs/ext2/symlink.c -fs/ext2/xattr.c -fs/ext2/xattr_user.c -fs/ext3/ext3-exports.c -fs/ext3/file.c -fs/ext3/ialloc.c -fs/ext3/inode.c -fs/ext3/Makefile -fs/ext3/namei.c -fs/ext3/super.c -fs/ext3/symlink.c -fs/ext3/xattr.c -fs/ext3/xattr_user.c -fs/jfs/jfs_xattr.h -fs/jfs/xattr.c -fs/Makefile -fs/mbcache.c -include/asm-arm/unistd.h -include/asm-ppc64/unistd.h -include/asm-s390/unistd.h -include/asm-s390x/unistd.h -include/linux/cache_def.h -include/linux/errno.h -include/linux/ext2_fs.h -include/linux/ext2_xattr.h -include/linux/ext3_fs.h -include/linux/ext3_jbd.h -include/linux/ext3_xattr.h -include/linux/fs.h -include/linux/mbcache.h -kernel/ksyms.c -mm/vmscan.c diff --git a/lustre/kernel_patches/series/rh-2.4.22 b/lustre/kernel_patches/series/rh-2.4.22 index 38a0e3a..d1b13dd 100644 --- a/lustre/kernel_patches/series/rh-2.4.22 +++ b/lustre/kernel_patches/series/rh-2.4.22 @@ -21,4 +21,7 @@ jbd-dont-account-blocks-twice.patch jbd-commit-tricks.patch add_page_private.patch socket-exports-2.4.22-rh.patch -nfs_export_kernel-2.4.22-rh +nfs_export_kernel-2.4.22-rh.patch +ext3-ea-in-inode-2.4.22-rh.patch +listman-2.4.20.patch +ext3-trusted_ea-2.4.20.patch diff --git a/lustre/mds/Makefile.mk b/lustre/mds/Makefile.mk index 9e9261f..495bb0d 100644 --- a/lustre/mds/Makefile.mk +++ b/lustre/mds/Makefile.mk @@ -7,5 +7,5 @@ include $(src)/../portals/Kernelenv obj-y += mds.o mds-objs := mds_lov.o handler.o mds_reint.o mds_fs.o lproc_mds.o mds_open.o \ - mds_lib.o mds_unlink_open.o + mds_lib.o mds_unlink_open.o mds_log.o diff --git a/lustre/portals/include/linux/kp30.h b/lustre/portals/include/linux/kp30.h index cea5a32..37bf8ce 100644 --- a/lustre/portals/include/linux/kp30.h +++ b/lustre/portals/include/linux/kp30.h @@ -188,6 +188,7 @@ static inline void our_cond_resched(void) if (current->need_resched) schedule (); } +#define work_struct_t struct tq_struct #else @@ -203,6 +204,8 @@ static inline void our_cond_resched(void) { cond_resched(); } +#define work_struct_t struct work_struct + #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) */ #ifdef PORTAL_DEBUG diff --git a/lustre/portals/include/portals/lib-types.h b/lustre/portals/include/portals/lib-types.h index 9db8489..e5447d7 100644 --- a/lustre/portals/include/portals/lib-types.h +++ b/lustre/portals/include/portals/lib-types.h @@ -139,6 +139,7 @@ typedef struct { /* temporary expedient: limit number of entries in discontiguous MDs */ # define PTL_MTU (512<<10) # define PTL_MD_MAX_IOV 128 +# define PTL_MD_MAX_PAGES min_t(int, PTL_MD_MAX_IOV, PTL_MTU / PAGE_SIZE) struct lib_msg_t { struct list_head msg_list; diff --git a/lustre/portals/knals/gmnal/gmnal.h b/lustre/portals/knals/gmnal/gmnal.h index c7c4c1d..53757ab 100644 --- a/lustre/portals/knals/gmnal/gmnal.h +++ b/lustre/portals/knals/gmnal/gmnal.h @@ -28,6 +28,10 @@ #ifndef __INCLUDE_GMNAL_H__ #define __INCLUDE_GMNAL_H__ +#ifndef EXPORT_SYMTAB +# define EXPORT_SYMTAB +#endif + #include "linux/config.h" #include "linux/module.h" #include "linux/tty.h" @@ -41,9 +45,6 @@ #include "linux/init.h" #include "linux/sem.h" #include "linux/vmalloc.h" -#ifdef MODVERSIONS -#include -#endif #define DEBUG_SUBSYSTEM S_GMNAL @@ -61,6 +62,7 @@ #include "gm_internal.h" + /* * Defines for the API NAL */ diff --git a/lustre/portals/knals/gmnal/gmnal_cb.c b/lustre/portals/knals/gmnal/gmnal_cb.c index 093ee64..6ae91db 100644 --- a/lustre/portals/knals/gmnal/gmnal_cb.c +++ b/lustre/portals/knals/gmnal/gmnal_cb.c @@ -269,22 +269,3 @@ int gmnal_cb_dist(nal_cb_t *nal_cb, ptl_nid_t nid, unsigned long *dist) *dist = 27; return(PTL_OK); } - - - - -EXPORT_SYMBOL(gmnal_cb_send); -EXPORT_SYMBOL(gmnal_cb_send_pages); -EXPORT_SYMBOL(gmnal_cb_recv); -EXPORT_SYMBOL(gmnal_cb_recv_pages); -EXPORT_SYMBOL(gmnal_cb_read); -EXPORT_SYMBOL(gmnal_cb_write); -EXPORT_SYMBOL(gmnal_cb_cli); -EXPORT_SYMBOL(gmnal_cb_sti); -EXPORT_SYMBOL(gmnal_cb_dist); -EXPORT_SYMBOL(gmnal_cb_printf); -EXPORT_SYMBOL(gmnal_cb_map); -EXPORT_SYMBOL(gmnal_cb_unmap); -EXPORT_SYMBOL(gmnal_cb_callback); -EXPORT_SYMBOL(gmnal_cb_free); -EXPORT_SYMBOL(gmnal_cb_malloc); diff --git a/lustre/portals/knals/qswnal/qswnal_cb.c b/lustre/portals/knals/qswnal/qswnal_cb.c index 6e19783..006ea49 100644 --- a/lustre/portals/knals/qswnal/qswnal_cb.c +++ b/lustre/portals/knals/qswnal/qswnal_cb.c @@ -330,12 +330,7 @@ kqswnal_put_idle_tx (kqswnal_tx_t *ktx) list_del (&fwd->kprfd_list); } - if (waitqueue_active (&kqswnal_data.kqn_idletxd_waitq)) /* process? */ - { - /* local sender waiting for tx desc */ - CDEBUG(D_NET,"wakeup process\n"); - wake_up (&kqswnal_data.kqn_idletxd_waitq); - } + wake_up (&kqswnal_data.kqn_idletxd_waitq); spin_unlock_irqrestore (&kqswnal_data.kqn_idletxd_lock, flags); @@ -346,8 +341,7 @@ kqswnal_put_idle_tx (kqswnal_tx_t *ktx) spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags); list_add_tail (&fwd->kprfd_list, &kqswnal_data.kqn_delayedfwds); - if (waitqueue_active (&kqswnal_data.kqn_sched_waitq)) - wake_up (&kqswnal_data.kqn_sched_waitq); + wake_up (&kqswnal_data.kqn_sched_waitq); spin_unlock_irqrestore (&kqswnal_data.kqn_sched_lock, flags); } @@ -514,8 +508,7 @@ kqswnal_launch (kqswnal_tx_t *ktx) spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags); list_add_tail (&ktx->ktx_delayed_list, &kqswnal_data.kqn_delayedtxds); - if (waitqueue_active (&kqswnal_data.kqn_sched_waitq)) - wake_up (&kqswnal_data.kqn_sched_waitq); + wake_up (&kqswnal_data.kqn_sched_waitq); spin_unlock_irqrestore (&kqswnal_data.kqn_sched_lock, flags); return (0); @@ -1244,8 +1237,7 @@ kqswnal_rxhandler(EP_RXD *rxd) spin_lock_irqsave (&kqswnal_data.kqn_sched_lock, flags); list_add_tail (&krx->krx_list, &kqswnal_data.kqn_readyrxds); - if (waitqueue_active (&kqswnal_data.kqn_sched_waitq)) - wake_up (&kqswnal_data.kqn_sched_waitq); + wake_up (&kqswnal_data.kqn_sched_waitq); spin_unlock_irqrestore (&kqswnal_data.kqn_sched_lock, flags); } diff --git a/lustre/portals/knals/socknal/socknal.c b/lustre/portals/knals/socknal/socknal.c index c72717d0..3d0c758 100644 --- a/lustre/portals/knals/socknal/socknal.c +++ b/lustre/portals/knals/socknal/socknal.c @@ -241,9 +241,8 @@ ksocknal_destroy_route (ksock_route_t *route) void ksocknal_put_route (ksock_route_t *route) { - CDEBUG (D_OTHER, "putting route[%p] -> "LPX64" (%d)\n", - route, route->ksnr_peer->ksnp_nid, - atomic_read (&route->ksnr_refcount)); + CDEBUG (D_OTHER, "putting route[%p] (%d)\n", + route, atomic_read (&route->ksnr_refcount)); LASSERT (atomic_read (&route->ksnr_refcount) > 0); if (!atomic_dec_and_test (&route->ksnr_refcount)) @@ -865,8 +864,7 @@ ksocknal_close_conn_locked (ksock_conn_t *conn, int error) spin_lock (&ksocknal_data.ksnd_reaper_lock); list_add_tail (&conn->ksnc_list, &ksocknal_data.ksnd_deathrow_conns); - if (waitqueue_active (&ksocknal_data.ksnd_reaper_waitq)) - wake_up (&ksocknal_data.ksnd_reaper_waitq); + wake_up (&ksocknal_data.ksnd_reaper_waitq); spin_unlock (&ksocknal_data.ksnd_reaper_lock); } @@ -1008,8 +1006,7 @@ ksocknal_put_conn (ksock_conn_t *conn) spin_lock_irqsave (&ksocknal_data.ksnd_reaper_lock, flags); list_add (&conn->ksnc_list, &ksocknal_data.ksnd_zombie_conns); - if (waitqueue_active (&ksocknal_data.ksnd_reaper_waitq)) - wake_up (&ksocknal_data.ksnd_reaper_waitq); + wake_up (&ksocknal_data.ksnd_reaper_waitq); spin_unlock_irqrestore (&ksocknal_data.ksnd_reaper_lock, flags); } diff --git a/lustre/portals/knals/socknal/socknal.h b/lustre/portals/knals/socknal/socknal.h index a345ff7..1c73ae8 100644 --- a/lustre/portals/knals/socknal/socknal.h +++ b/lustre/portals/knals/socknal/socknal.h @@ -108,6 +108,10 @@ # define sk_socket socket #endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) +# define sk_wmem_queued wmem_queued +#endif + typedef struct /* pool of forwarding buffers */ { spinlock_t fmp_lock; /* serialise */ diff --git a/lustre/portals/knals/socknal/socknal_cb.c b/lustre/portals/knals/socknal/socknal_cb.c index 65db867..8ce6777 100644 --- a/lustre/portals/knals/socknal/socknal_cb.c +++ b/lustre/portals/knals/socknal/socknal_cb.c @@ -179,8 +179,7 @@ ksocknal_put_ltx (ksock_ltx_t *ltx) list_add_tail (<x->ltx_tx.tx_list, ltx->ltx_idle); /* normal tx desc => wakeup anyone blocking for one */ - if (ltx->ltx_idle == &ksocknal_data.ksnd_idle_ltx_list && - waitqueue_active (&ksocknal_data.ksnd_idle_ltx_waitq)) + if (ltx->ltx_idle == &ksocknal_data.ksnd_idle_ltx_list) wake_up (&ksocknal_data.ksnd_idle_ltx_waitq); spin_unlock_irqrestore (&ksocknal_data.ksnd_idle_ltx_lock, flags); @@ -627,8 +626,7 @@ ksocknal_zc_callback (zccd_t *zcd) spin_lock_irqsave (&sched->kss_lock, flags); list_add_tail (&tx->tx_list, &sched->kss_zctxdone_list); - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); spin_unlock_irqrestore (&sched->kss_lock, flags); EXIT; @@ -776,9 +774,7 @@ ksocknal_launch_autoconnect_locked (ksock_route_t *route) list_add_tail (&route->ksnr_connect_list, &ksocknal_data.ksnd_autoconnectd_routes); - - if (waitqueue_active (&ksocknal_data.ksnd_autoconnectd_waitq)) - wake_up (&ksocknal_data.ksnd_autoconnectd_waitq); + wake_up (&ksocknal_data.ksnd_autoconnectd_waitq); spin_unlock_irqrestore (&ksocknal_data.ksnd_autoconnectd_lock, flags); } @@ -867,8 +863,7 @@ ksocknal_queue_tx_locked (ksock_tx_t *tx, ksock_conn_t *conn) list_add_tail (&conn->ksnc_tx_list, &sched->kss_tx_conns); conn->ksnc_tx_scheduled = 1; - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); } spin_unlock_irqrestore (&sched->kss_lock, flags); @@ -1209,9 +1204,7 @@ ksocknal_fmb_callback (void *arg, int error) spin_lock_irqsave (&sched->kss_lock, flags); list_add_tail (&conn->ksnc_rx_list, &sched->kss_rx_conns); - - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); spin_unlock_irqrestore (&sched->kss_lock, flags); } @@ -1684,6 +1677,8 @@ int ksocknal_scheduler (void *arg) kportal_daemonize (name); kportal_blockallsigs (); + current->flags |= PF_MEMALLOC; + #if (CONFIG_SMP && CPU_AFFINITY) if ((cpu_online_map & (1 << id)) != 0) { #if 1 @@ -1797,8 +1792,7 @@ ksocknal_data_ready (struct sock *sk, int n) /* extra ref for scheduler */ atomic_inc (&conn->ksnc_refcount); - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); } spin_unlock_irqrestore (&sched->kss_lock, flags); @@ -1862,8 +1856,7 @@ ksocknal_write_space (struct sock *sk) /* extra ref for scheduler */ atomic_inc (&conn->ksnc_refcount); - if (waitqueue_active (&sched->kss_waitq)) - wake_up (&sched->kss_waitq); + wake_up (&sched->kss_waitq); } spin_unlock_irqrestore (&sched->kss_lock, flags); @@ -2363,7 +2356,7 @@ ksocknal_find_timed_out_conn (ksock_peer_t *peer) } if ((!list_empty (&conn->ksnc_tx_queue) || - conn->ksnc_sock->sk->wmem_queued != 0) && + conn->ksnc_sock->sk->sk_wmem_queued != 0) && time_after_eq (jiffies, conn->ksnc_tx_deadline)) { /* Timed out messages queued for sending, or * messages buffered in the socket's send buffer */ @@ -2371,7 +2364,7 @@ ksocknal_find_timed_out_conn (ksock_peer_t *peer) CERROR ("Timed out TX to "LPX64" %s%d %p\n", peer->ksnp_nid, list_empty (&conn->ksnc_tx_queue) ? "" : "Q ", - conn->ksnc_sock->sk->wmem_queued, conn); + conn->ksnc_sock->sk->sk_wmem_queued, conn); return (conn); } } diff --git a/lustre/portals/knals/toenal/toenal_cb.c b/lustre/portals/knals/toenal/toenal_cb.c index f92511a..983fa71 100644 --- a/lustre/portals/knals/toenal/toenal_cb.c +++ b/lustre/portals/knals/toenal/toenal_cb.c @@ -371,7 +371,6 @@ ktoenal_launch_packet (ksock_conn_t *conn, ksock_tx_t *tx) for (;;) { LASSERT (niov <= tx->tx_niov); - LASSERT (iov->iov_len >= 0); if (iov->iov_len >= nob) { diff --git a/lustre/portals/libcfs/debug.c b/lustre/portals/libcfs/debug.c index 77e742f..a42d422 100644 --- a/lustre/portals/libcfs/debug.c +++ b/lustre/portals/libcfs/debug.c @@ -292,10 +292,8 @@ int portals_debug_daemon(void *arg) if (!file || IS_ERR(file)) { CERROR("cannot open %s for logging", debug_daemon_file_path); GOTO(out1, PTR_ERR(file)); - } else { - printk(KERN_ALERT "LustreError: daemon dumping log to %s ... writing ...\n", - debug_daemon_file_path); } + printk(KERN_INFO "daemon dumping log to %s\n", debug_daemon_file_path); debug_daemon_state.overlapped = 0; debug_daemon_state.stopped = 0; @@ -339,8 +337,8 @@ int portals_debug_daemon(void *arg) rc = file->f_op->write(file, debug_buf+start, size, &file->f_pos); if (rc < 0) { - printk(KERN_ALERT - "LustreError: Debug_daemon write error %d\n", rc); + printk(KERN_ALERT "LustreError: Debug_daemon " + "write error %d\n", rc); goto out; } start += rc; @@ -361,16 +359,16 @@ int portals_debug_daemon(void *arg) if (force_flush) { rc = file->f_op->fsync(file, file->f_dentry, 1); if (rc < 0) { - printk(KERN_ALERT - "LustreError: Debug_daemon sync error %d\n", rc); + printk(KERN_ALERT "LustreError: Debug_daemon " + "sync error %d\n", rc); goto out; } if (debug_daemon_state.stopped) - break; + break; debug_daemon_state.lctl_event = 1; wake_up(&debug_daemon_state.lctl); } - wait_event(debug_daemon_state.daemon, + wait_event(debug_daemon_state.daemon, debug_daemon_state.daemon_event); } out: @@ -636,7 +634,7 @@ int portals_debug_mark_buffer(char *text) return -EINVAL; CDEBUG(0, "********************************************************\n"); - CERROR("DEBUG MARKER: %s\n", text); + CWARN("DEBUG MARKER: %s\n", text); CDEBUG(0, "********************************************************\n"); return 0; @@ -650,7 +648,7 @@ int portals_debug_mark_buffer(char *text) __s32 portals_debug_copy_to_user(char *buf, unsigned long len) { int rc; - unsigned long debug_off, i, off, copied; + unsigned long total, debug_off, i, off, copied; unsigned long flags; struct page *page; LIST_HEAD(my_pages); @@ -667,10 +665,10 @@ __s32 portals_debug_copy_to_user(char *buf, unsigned long len) } list_add(&page->list, &my_pages); } - + spin_lock_irqsave(&portals_debug_lock, flags); debug_off = atomic_read(&debug_off_a); - + /* Sigh. If the buffer is empty, then skip to the end. */ if (debug_off == 0 && !debug_wrapped) { spin_unlock_irqrestore(&portals_debug_lock, flags); @@ -678,16 +676,19 @@ __s32 portals_debug_copy_to_user(char *buf, unsigned long len) goto cleanup; } - if (debug_wrapped) + if (debug_wrapped) { off = debug_off + 1; - else + total = debug_size; + } else { off = 0; + total = debug_off; + } copied = 0; list_for_each(pos, &my_pages) { unsigned long to_copy; page = list_entry(pos, struct page, list); - to_copy = min(debug_size - off, PAGE_SIZE); + to_copy = min(total - off, PAGE_SIZE); if (to_copy == 0) { off = 0; to_copy = min(debug_size - off, PAGE_SIZE); @@ -696,9 +697,9 @@ finish_partial: memcpy(kmap(page), debug_buf + off, to_copy); kunmap(page); copied += to_copy; - if (copied >= (debug_wrapped ? debug_size : debug_off)) + if (copied >= total) break; - + off += to_copy; if (off >= debug_size) { off = 0; @@ -728,7 +729,7 @@ finish_partial: break; } rc = copied; - + cleanup: list_for_each_safe(pos, n, &my_pages) { page = list_entry(pos, struct page, list); @@ -786,8 +787,8 @@ portals_debug_msg(int subsys, int mask, char *file, const char *fn, max_nob = debug_size - debug_off + DEBUG_OVERFLOW; if (max_nob <= 0) { spin_unlock_irqrestore(&portals_debug_lock, flags); - printk("LustreError: logic error in portals_debug_msg: <0 bytes" - " to write\n"); + printk("LustreError: logic error in portals_debug_msg: " + "< 0 bytes to write\n"); return; } @@ -799,45 +800,47 @@ portals_debug_msg(int subsys, int mask, char *file, const char *fn, do_gettimeofday(&tv); prefix_nob = snprintf(debug_buf + debug_off, max_nob, - "%06x:%06x:%d:%lu.%06lu :", + "%06x:%06x:%d:%lu.%06lu:%lu:%d:", subsys, mask, smp_processor_id(), - tv.tv_sec, tv.tv_usec); + tv.tv_sec, tv.tv_usec, stack, current->pid); max_nob -= prefix_nob; - if(*(format + strlen(format) - 1) == '\n') - *(format + strlen(format) - 1) = ':'; - - va_start(ap, format); - msg_nob = vsnprintf(debug_buf + debug_off + prefix_nob , - max_nob, format, ap); - max_nob -= msg_nob; - va_end(ap); + if(*(format + strlen(format) - 1) != '\n') + *(format + strlen(format)) = '\n'; #if defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20)) - msg_nob += snprintf(debug_buf + debug_off + prefix_nob + msg_nob, max_nob, - "(%s:%d:%s() %d | %d+%lu)\n", - file, line, fn, current->pid, - current->thread.extern_pid, stack); + msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, + "%d:(%s:%d:%s()) ", + current->thread.extern_pid, file, line, fn); #elif defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) - msg_nob += snprintf(debug_buf + debug_off + prefix_nob + msg_nob, max_nob, - "(%s:%d:%s() %d | %d+%lu)\n", - file, line, fn, current->pid, - current->thread.mode.tt.extern_pid, stack); + msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, + "%d:(%s:%d:%s()) ", + current->thread.mode.tt.extern_pid, file, line, fn); #else - msg_nob += snprintf(debug_buf + debug_off + prefix_nob + msg_nob, max_nob, - "(%s:%d:%s() %d+%lu)\n", - file, line, fn, current->pid, stack); + msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, + ":(%s:%d:%s()) ", + file, line, fn); #endif + va_start(ap, format); + msg_nob += vsnprintf(debug_buf + debug_off + prefix_nob + msg_nob, + max_nob, format, ap); + max_nob -= msg_nob; + va_end(ap); + /* Print to console, while msg is contiguous in debug_buf */ /* NB safely terminated see above */ if ((mask & D_EMERG) != 0) printk(KERN_EMERG "LustreError: %s", debug_buf + debug_off + prefix_nob); - if ((mask & D_ERROR) != 0) - printk(KERN_ERR "LustreError: %s", + else if ((mask & D_ERROR) != 0) + printk(KERN_ERR "LustreError: %s", + debug_buf + debug_off + prefix_nob); + else if ((mask & D_WARNING) != 0) + printk(KERN_WARNING "Lustre: %s", debug_buf + debug_off + prefix_nob); else if (portal_printk) - printk("<%d>LustreError: %s", portal_printk, debug_buf+debug_off+prefix_nob); + printk("<%d>Lustre: %s", portal_printk, + debug_buf+debug_off+prefix_nob); base_offset = debug_off & 0xFFFF; debug_off += prefix_nob + msg_nob; @@ -880,8 +883,8 @@ void portals_run_upcall(char **argv) argc++; LASSERT(argc >= 2); - - rc = call_usermodehelper(argv[0], argv, envp); + + rc = USERMODEHELPER(argv[0], argv, envp); if (rc < 0) { CERROR("Error %d invoking portals upcall %s %s%s%s%s%s%s%s%s; " "check /proc/sys/portals/upcall\n", diff --git a/lustre/portals/libcfs/module.c b/lustre/portals/libcfs/module.c index befb3b1..c51a506 100644 --- a/lustre/portals/libcfs/module.c +++ b/lustre/portals/libcfs/module.c @@ -162,9 +162,12 @@ kportal_notify_router (int gw_nalid, ptl_nid_t gw_nid, int rc; kpr_control_interface_t *ci; + /* No error if router not preset. Sysadmin is allowed to notify + * _everywhere_ when a NID boots or crashes, even if they know + * nothing of the peer. */ ci = (kpr_control_interface_t *)PORTAL_SYMBOL_GET(kpr_control_interface); if (ci == NULL) - return (-ENODEV); + return (0); rc = ci->kprci_notify (gw_nalid, gw_nid, alive, when); diff --git a/lustre/portals/portals/lib-me.c b/lustre/portals/portals/lib-me.c index bd1af5b..31ac214 100644 --- a/lustre/portals/portals/lib-me.c +++ b/lustre/portals/portals/lib-me.c @@ -44,7 +44,7 @@ int do_PtlMEAttach(nal_cb_t * nal, void *private, void *v_args, void *v_ret) unsigned long flags; lib_me_t *me; - if (args->index_in < 0 || args->index_in >= tbl->size) + if (args->index_in >= tbl->size) return ret->rc = PTL_INV_PTINDEX; /* Should check for valid matchid, but not yet */ diff --git a/lustre/portals/portals/lib-move.c b/lustre/portals/portals/lib-move.c index f710476..e73cbb8 100644 --- a/lustre/portals/portals/lib-move.c +++ b/lustre/portals/portals/lib-move.c @@ -305,8 +305,6 @@ lib_extract_iov (struct iovec *dst, lib_md_t *md, ptl_size_t frag_len; int dst_niov; - LASSERT (len >= 0); - LASSERT (offset >= 0); LASSERT (offset + len <= md->length); if (len == 0) /* no data => */ @@ -442,8 +440,6 @@ lib_extract_kiov (ptl_kiov_t *dst, lib_md_t *md, ptl_size_t frag_len; int dst_niov; - LASSERT (len >= 0); - LASSERT (offset >= 0); LASSERT (offset + len <= md->length); if (len == 0) /* no data => */ diff --git a/lustre/portals/portals/lib-ni.c b/lustre/portals/portals/lib-ni.c index aa30329..9e90576 100644 --- a/lustre/portals/portals/lib-ni.c +++ b/lustre/portals/portals/lib-ni.c @@ -27,7 +27,7 @@ #include #include -#define MAX_DIST 18446744073709551615UL +#define MAX_DIST 18446744073709551615ULL int do_PtlNIDebug(nal_cb_t * nal, void *private, void *v_args, void *v_ret) { diff --git a/lustre/portals/router/router.c b/lustre/portals/router/router.c index 32f741f..b5bab2c 100644 --- a/lustre/portals/router/router.c +++ b/lustre/portals/router/router.c @@ -149,14 +149,14 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, int alive, time_t when) { unsigned long flags; - int rc = -ENOENT; + int found; kpr_nal_entry_t *ne = NULL; kpr_gateway_entry_t *ge = NULL; struct timeval now; struct list_head *e; struct list_head *n; - CDEBUG (D_ERROR, "%s notifying [%d] "LPX64": %s\n", + CDEBUG (D_NET, "%s notifying [%d] "LPX64": %s\n", byNal ? "NAL" : "userspace", gateway_nalid, gateway_nid, alive ? "up" : "down"); @@ -177,6 +177,7 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, /* Serialise with lookups (i.e. write lock) */ write_lock_irqsave(&kpr_rwlock, flags); + found = 0; list_for_each_safe (e, n, &kpr_gateways) { ge = list_entry(e, kpr_gateway_entry_t, kpge_list); @@ -185,15 +186,15 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, ge->kpge_nid != gateway_nid) continue; - rc = 0; + found = 1; break; } - if (rc != 0) { + if (!found) { /* gateway not found */ write_unlock_irqrestore(&kpr_rwlock, flags); CDEBUG (D_NET, "Gateway not found\n"); - return (rc); + return (0); } if (when < ge->kpge_timestamp) { @@ -226,25 +227,24 @@ kpr_do_notify (int byNal, int gateway_nalid, ptl_nid_t gateway_nid, } } + found = 0; if (!byNal) { /* userland notified me: notify NAL? */ ne = kpr_find_nal_entry_locked (ge->kpge_nalid); if (ne != NULL) { - if (ne->kpne_shutdown || - ne->kpne_interface.kprni_notify == NULL) { - /* no need to notify */ - ne = NULL; - } else { + if (!ne->kpne_shutdown && + ne->kpne_interface.kprni_notify != NULL) { /* take a ref on this NAL until notifying * it has completed... */ atomic_inc (&ne->kpne_refcount); + found = 1; } } } write_unlock_irqrestore(&kpr_rwlock, flags); - if (ne != NULL) { + if (found) { ne->kpne_interface.kprni_notify (ne->kpne_interface.kprni_arg, gateway_nid, alive); /* 'ne' can disappear now... */ @@ -580,8 +580,10 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, atomic_set (&ge->kpge_weight, 0); PORTAL_ALLOC (re, sizeof (*re)); - if (re == NULL) + if (re == NULL) { + PORTAL_FREE (ge, sizeof (*ge)); return (-ENOMEM); + } re->kpre_lo_nid = lo_nid; re->kpre_hi_nid = hi_nid; diff --git a/lustre/portals/router/router.h b/lustre/portals/router/router.h index 4ace247..ea25439 100644 --- a/lustre/portals/router/router.h +++ b/lustre/portals/router/router.h @@ -71,11 +71,7 @@ typedef struct typedef struct { -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) - struct work_struct kpru_tq; -#else - struct tq_struct kpru_tq; -#endif + work_struct_t kpru_tq; int kpru_nal_id; ptl_nid_t kpru_nid; int kpru_alive; diff --git a/lustre/portals/utils/parser.c b/lustre/portals/utils/parser.c index eccf507..db5292d 100644 --- a/lustre/portals/utils/parser.c +++ b/lustre/portals/utils/parser.c @@ -80,7 +80,7 @@ static int line2args(char *line, char **argv, int maxargs) arg = strtok(line, " \t"); if ( arg ) { - argv[i] = arg; + argv[i] = arg; i++; } else return 0; @@ -110,7 +110,10 @@ int Parser_execarg(int argc, char **argv, command_t cmds[]) cmd = Parser_findargcmd(argv[0], cmds); if ( cmd ) { - return (cmd->pc_func)(argc, argv); + int rc = (cmd->pc_func)(argc, argv); + if (rc == CMD_HELP) + fprintf(stderr, "%s\n", cmd->pc_help); + return rc; } else { printf("Try interactive use without arguments or use one of:\n"); for (cmd = cmds; cmd->pc_name; cmd++) diff --git a/lustre/portals/utils/portals.c b/lustre/portals/utils/portals.c index 5955c54..4beac34 100644 --- a/lustre/portals/utils/portals.c +++ b/lustre/portals/utils/portals.c @@ -204,7 +204,7 @@ ptl_parse_time (time_t *t, char *str) return (0); memset (&tm, 0, sizeof (tm)); - n = sscanf (str, "%d-%d-%d %d:%d:%d", + n = sscanf (str, "%d-%d-%d-%d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); if (n != 6) @@ -1367,7 +1367,7 @@ jt_ptl_notify_router (int argc, char **argv) when = now.tv_sec; } else if (ptl_parse_time (&when, argv[3]) != 0) { fprintf(stderr, "Can't parse time %s\n" - "Please specify either 'YYYY-MM-DD HH:MM:SS'\n" + "Please specify either 'YYYY-MM-DD-HH:MM:SS'\n" "or an absolute unix time in seconds\n", argv[3]); return (-1); } else if (when > now.tv_sec) { diff --git a/lustre/tests/ll_sparseness_verify.c b/lustre/tests/ll_sparseness_verify.c index 568a1f3..574f064 100644 --- a/lustre/tests/ll_sparseness_verify.c +++ b/lustre/tests/ll_sparseness_verify.c @@ -1,5 +1,10 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: + * + * The companion to ll_sparseness_write; walk all the bytes in the file. + * the bytes at the offsets specified on the command line must be '+', as + * previously written by ll_sparseness_write. All other bytes must be + * 0. */ #include #include @@ -10,229 +15,88 @@ #include #include #include +#include #define BUFSIZE (1024*1024) -int compfunc(const void *x, const void *y) -{ - if (*(unsigned int *)x < *(unsigned int *)y) { - return -1; - } else if (*(unsigned int *)x == *(unsigned int *)y) { - return 0; - } else { - return 1; - } -} - -/* sort offsets and delete redundant data in offsets - * no return - */ -void collapse_redundant(unsigned *offsets, int offsetcount) -{ - int i, j; - qsort(offsets, offsetcount, sizeof(unsigned int), compfunc); - - /* collapse the redundant offsets */ - for (i = 0; i < offsetcount - 1; i++) { - if (offsets[i] == offsets[i + 1]) { - for (j = i; j < offsetcount; j++) { - offsets[j] = offsets[j + 1]; - } - offsetcount--; - } - } -} - -/* verify the sparse pwrite from page(0) to page(filesize / BUFSIZE) - * if sucess return last verified page number else return (-1) - */ -int verify_content(int fd, int filesize, unsigned int *offsets, - int O_number) +void error(char *fmt, ...) { - int i , j; - char *filebuf; - int focus = 0; - int p_number; - - filebuf = (char*) malloc(BUFSIZE); - - p_number = filesize / BUFSIZE; - for (j = 0; j < p_number ; j++) { - - i = read(fd, filebuf, BUFSIZE); - - if (i != BUFSIZE) { - fprintf(stderr, - "Reading file fails (%s), returning (%d)\n", - strerror(errno), i); - free(filebuf); - return -1; - } - - /* check the position that should hold '+' - * If correct, change it to 0 in the buffer */ - for (; focus < O_number; focus++) { - if (offsets[focus] < (j + 1) * BUFSIZE - 1) { - if (filebuf[offsets[focus] % BUFSIZE] != '+') { - fprintf(stderr, - "Bad content, should \ - be '+' at %d.\n", - offsets[focus]); - free(filebuf); - return -1; - } else { - /* '+', change it to 0 for comparison */ - filebuf[offsets[focus] % BUFSIZE] = 0; - } - } - } - - /* Hopefully '+' should have been changed to 0 - * Thus, we should not encounter any strange character */ - for (i = 0; i < BUFSIZE; i++) { - if (filebuf[i] != 0) { - fprintf(stderr, - "Bad content, should be 0 at %d.\n", - i + j * BUFSIZE); - free(filebuf); - return -1; - } - } - } - - free(filebuf); - return focus; + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + exit(1); } -/* verify the sparse pwrite with last page - * if sucess return 0 else return 1 - */ -int verify_tail(int fd, int filesize, unsigned int *offsets, - int O_number, int focus) +int compare_offsets(const void *a, const void *b) { - int i; - char *filebuf; - int p_number; - - filebuf = (char*) malloc(BUFSIZE); - - /* The last page */ - p_number = filesize % BUFSIZE; - i = read(fd, filebuf, p_number); - if (i != p_number) { - fprintf(stderr, "Reading file fails (%s), returning (%d)\n", - strerror(errno), i); - free(filebuf); - return 1; - } - for (; focus < O_number; focus++) { - if (offsets[focus] < filesize) { - if (filebuf[offsets[focus] % BUFSIZE] != '+') { - fprintf(stderr, - "Bad content, should be '+' at %d.\n", - offsets[focus]); - free(filebuf); - return 1; - } else { - /* '+', change it to 0 for later comparison */ - filebuf[offsets[focus]%BUFSIZE] = 0; - } - } else { - fprintf(stderr, - "Error: File size <= offset %d\n", - offsets[focus]); - free(filebuf); - return 1; - } - } - - for (i = 0; i < p_number; i++) { - if (filebuf[i] != 0) { - fprintf(stderr, "Bad content, should be 0 at %d.\n", - filesize - (p_number - i) - 1); - free(filebuf); - return 1; - } - } - - free(filebuf); - return 0; + off_t *A = (off_t *)a; + off_t *B = (off_t *)b; + return *A - *B; } -/* Function: verify the sparse pwrite (bug 1222): the charaters at - * should be '+', and all other characters should be 0 - * Return: 0 success - * 1 failure*/ -int verify(char *filename, unsigned int *offsets, int O_number) +int main(int argc, char **argv) { - int status; - unsigned int size; + unsigned int num_offsets, cur_off = 0, i; + off_t *offsets, pos = 0, end_of_buf = 0; + char *end, *buf; + struct stat st; + ssize_t ret; int fd; - struct stat Fstat; - - status = stat(filename, &Fstat); - if (status == -1) { - fprintf(stderr, "No such file named as %s.\n", filename); - return 1; - } - size = Fstat.st_size; - - /* Because we always have '+' just before EOF, - * qsorted offsets[] should have the (filesize-1) at the end */ - if (size != offsets[O_number - 1] + 1) { - fprintf(stderr, - "Error: the final character not in the offset?\n"); - return 1; - } - - /* now we check the integrity of the file */ - fd = open(filename, O_RDONLY); - if (fd == -1) { - fprintf(stderr, "Openning %s fails (%s)\n", - filename, strerror(errno)); - return 1; - } - if((status = verify_content(fd, size, offsets, O_number)) < 0) { - close(fd); - return status ; - } + if (argc < 3) + error("Usage: %s [ offset ... ]\n", + argv[0]); - return verify_tail(fd, size, offsets, O_number, status); -} + fd = open(argv[1], O_RDONLY); + if (fd < 0) + error("couldn't open %s: %s\n", argv[1], strerror(errno)); -/* verify the sparse pwrite file with the charaters at - * should be '+', and all other characters should be 0 - */ -int main(int argc, char**argv) -{ - int i; - char *filename; - char *end; - int O_number; - unsigned int *offsets; + buf = malloc(BUFSIZE); + if (buf == NULL) + error("can't allocate buffer\n"); - if (argc < 3) { - fprintf(stderr, - "Usage: %s [ offset ... ]\n", - argv[0]); - exit(1); + num_offsets = argc - 2; + offsets = calloc(sizeof(offsets[0]), num_offsets); + for (i = 0; i < num_offsets; i++) { + offsets[i] = strtoul(argv[i + 2], &end, 10); + if (*end) + error("couldn't parse offset '%s'\n", argv[i + 2]); } + qsort(offsets, num_offsets, sizeof(offsets[0]), compare_offsets); + + if (fstat(fd, &st) < 0) + error("stat: %s\n", strerror(errno)); + + for (i = 0; pos < st.st_size; i++, pos++) { + if (pos == end_of_buf) { + ret = read(fd, buf, BUFSIZE); + if (ret < 0) + error("read(): %s\n", strerror(errno)); + end_of_buf = pos + ret; + if (end_of_buf > st.st_size) + error("read %d bytes past file size?\n", + end_of_buf - st.st_size); + i = 0; + } - filename = argv[1]; - O_number = argc - 2; - offsets = (unsigned int *) malloc(sizeof(unsigned int) * O_number); - for (i = 0; i < O_number; i++) { - offsets[i] = strtoul(argv[i + 2], &end, 10); - if (*end) { - fprintf(stderr, - " parameter should be integer\n"); - exit(1); + /* check for 0 when we aren't at a given offset */ + if (cur_off >= num_offsets || pos != offsets[cur_off]) { + if (buf[i] != 0) + error("found char 0x%x at pos %lu instead of " + "0x0\n", buf[i], (long)pos); + continue; } - } - collapse_redundant(offsets, O_number); + /* the command line asks us to check for + at this offset */ + if (buf[i] != '+') + error("found char 0x%x at pos %lu instead of " + "'.'\n", buf[i], (long)pos); - return verify(filename,offsets,O_number); + /* skip over duplicate offset arguments */ + while (cur_off < num_offsets && offsets[cur_off] == pos) + cur_off++; + } + /* don't bother freeing or closing.. */ + return 0; } - diff --git a/lustre/tests/write_disjoint.c b/lustre/tests/write_disjoint.c new file mode 100644 index 0000000..16774c8 --- /dev/null +++ b/lustre/tests/write_disjoint.c @@ -0,0 +1,161 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Each loop does 3 things: + * - rank 0 truncates to 0 + * - all ranks agree on a random chunk size + * - all ranks race to write their pattern to their chunk of the file + * - rank 0 makes sure that the resulting file size is ranks * chunk size + * - rank 0 makes sure that everyone's patterns went to the right place + * + * compile: mpicc -g -Wall -o write_disjoint write_disjoint.c + * run: mpirun -np N -machlist write_disjoint + * or: pdsh -w write_disjoint + * or: prun -n N [-N M] write_disjoint + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mpi.h" + + +#define FILENAME "/mnt/lustre/write_disjoint" +#define CHUNK_MAX_SIZE 123456 + +int rprintf(int rank, int loop, const char *fmt, ...) +{ + va_list ap; + + printf("rank %d, loop %d: ", rank, loop); + + va_start(ap, fmt); + + vprintf(fmt, ap); + + MPI_Finalize(); + exit(1); +} + +int main (int argc, char *argv[]) { + int i, n, fd, chunk_size, file_size; + int rank, noProcessors, done; + off_t offset; + char **chunk_buf; + char *read_buf; + struct stat stat_buf; + ssize_t ret; + + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &noProcessors); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + chunk_buf = malloc(noProcessors * sizeof(chunk_buf[0])); + for (i=0; i < noProcessors; i++) { + chunk_buf[i] = malloc(CHUNK_MAX_SIZE); + memset(chunk_buf[i], 'A'+ i, CHUNK_MAX_SIZE); + } + read_buf = malloc(noProcessors * CHUNK_MAX_SIZE); + + if (rank == 0) { + fd = open(FILENAME, O_WRONLY|O_CREAT|O_TRUNC, 0666); + if (fd < 0) + rprintf(rank, -1, "open() returned %s\n", + strerror(errno)); + } + MPI_Barrier(MPI_COMM_WORLD); + + fd = open(FILENAME, O_RDWR); + if (fd < 0) + rprintf(rank, -1, "open() returned %s\n", strerror(errno)); + + for (n=0; n < 1000 ; n++) { + /* reset the environment */ + if (rank == 0) { + ret = truncate(FILENAME, 0); + if (ret != 0) + rprintf(rank, n, "truncate() returned %s\n", + strerror(errno) ); + } + chunk_size = rand() % CHUNK_MAX_SIZE; + + if (n % 1000 == 0 && rank == 0) + printf("loop %d: chunk_size %d\n", n, chunk_size); + + MPI_Barrier(MPI_COMM_WORLD); + + /* Do the race */ + offset = rank * chunk_size; + lseek(fd, offset, SEEK_SET); + + done = 0; + do { + ret = write(fd, chunk_buf[rank]+done, chunk_size-done); + if (ret < 0) + rprintf(rank, n, "write() returned %s\n", + strerror(errno)); + done += ret; + } while (done != chunk_size); + + MPI_Barrier(MPI_COMM_WORLD); + + /* Check the result */ + if (rank == 0) { + lseek(fd, 0, SEEK_SET); + + /* quick check */ + stat(FILENAME, &stat_buf); + file_size = stat_buf.st_size; + if (file_size != chunk_size * noProcessors) + rprintf(rank, n, "invalid file size %d" + " instead of %d\n", file_size, + chunk_size * noProcessors); + + done = 0; + do { + ret = read(fd, read_buf + done, + (chunk_size * noProcessors) - done); + if (ret < 0) + rprintf(rank, n, "read returned %s\n", + strerror(errno)); + + done += ret; + } while (done != chunk_size * noProcessors); + + for (i = 0; i < noProcessors; i++) { + char command[4096]; + int j; + if (!memcmp(read_buf + (i * chunk_size), + chunk_buf[i], chunk_size)) + continue; + + printf("rank %d, loop %d: chunk %d corrupted " + "with chunk_size %d\n", rank, n, i, + chunk_size); + printf("(ranks: page boundry, chunk boundry, " + "page boundry)\n"); + for (j = 1 ; j < noProcessors; j++) { + int b = j * chunk_size; + printf("\t%c -> %c: %d %d %d\n", + 'A' + j - 1, 'A' + j, + b & ~(4096-1), b, + (b + 4096) & ~(4096-1)); + } + + sprintf(command, "od -Ad -a %s", FILENAME); + system(command); + MPI_Finalize(); + exit(1); + } + } + } + + printf("Finished after %d loops\n", n); + MPI_Finalize(); + return 0; +} diff --git a/lustre/utils/lfind b/lustre/utils/lfind new file mode 100755 index 0000000..ae62017 --- /dev/null +++ b/lustre/utils/lfind @@ -0,0 +1,3 @@ +#!/bin/bash +PATH=`dirname $0`:$PATH +lfs find "$@" diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index ba81d02..b22745a 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -34,14 +34,15 @@ #include "parser.h" -extern int op_create_file(char *name, long stripe_size, int stripe_offset, +extern int op_create_file(char *name, long stripe_size, int stripe_offset, int stripe_count); -extern int op_find(char *path, struct obd_uuid *obduuid, int recursive, +extern int op_find(char *path, struct obd_uuid *obduuid, int recursive, int verbose, int quiet); /* all functions */ static int lfs_setstripe(int argc, char **argv); static int lfs_find(int argc, char **argv); +static int lfs_getstripe(int argc, char **argv); /* all avaialable commands */ command_t cmdlist[] = { @@ -54,6 +55,9 @@ command_t cmdlist[] = { {"find", lfs_find, 0, "blah...\n" "usage: find [--obd ] [--quiet | --verbose] [--recursive] ..."}, + {"getstripe", lfs_getstripe, 0, + "blah...\n" + "usage:getstripe "}, {"help", Parser_help, 0, "help"}, {"exit", Parser_quit, 0, "quit"}, {"quit", Parser_quit, 0, "quit"}, @@ -62,43 +66,43 @@ command_t cmdlist[] = { /* functions */ static int lfs_setstripe(int argc, char **argv) -{ +{ int result; long st_size; int st_offset, st_count; - char *end; - - if (argc != 5) - return CMD_HELP; - - // get the stripe size - st_size = strtoul(argv[2], &end, 0); - if (*end != '\0') { - fprintf(stderr, "error: %s: bad stripe size '%s'\n", + char *end; + + if (argc != 5) + return CMD_HELP; + + // get the stripe size + st_size = strtoul(argv[2], &end, 0); + if (*end != '\0') { + fprintf(stderr, "error: %s: bad stripe size '%s'\n", argv[0], argv[2]); - return CMD_HELP; - } - // get the stripe offset - st_offset = strtoul(argv[3], &end, 0); - if (*end != '\0') { - fprintf(stderr, "error: %s: bad stripe offset '%s'\n", + return CMD_HELP; + } + // get the stripe offset + st_offset = strtoul(argv[3], &end, 0); + if (*end != '\0') { + fprintf(stderr, "error: %s: bad stripe offset '%s'\n", argv[0], argv[3]); - return CMD_HELP; - } - // get the stripe count - st_count = strtoul(argv[4], &end, 0); - if (*end != '\0') { - fprintf(stderr, "error: %s: bad stripe count '%s'\n", + return CMD_HELP; + } + // get the stripe count + st_count = strtoul(argv[4], &end, 0); + if (*end != '\0') { + fprintf(stderr, "error: %s: bad stripe count '%s'\n", argv[0], argv[4]); - return CMD_HELP; - } + return CMD_HELP; + } - result = op_create_file(argv[1], st_size, st_offset, st_count); + result = op_create_file(argv[1], st_size, st_offset, st_count); if (result) fprintf(stderr, "error: %s: create stripe file failed\n", argv[0]); - return result; + return result; } static int lfs_find(int argc, char **argv) @@ -113,54 +117,75 @@ static int lfs_find(int argc, char **argv) char short_opts[] = "ho:qrv"; int quiet, verbose, recursive, c, rc; struct obd_uuid *obduuid = NULL; - + optind = 0; quiet = verbose = recursive = 0; - while ((c = getopt_long(argc, argv, short_opts, + while ((c = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { - switch (c) { - case 'o': - if (obduuid) { - fprintf(stderr, "error: %s: only one obduuid allowed", - argv[0]); - return CMD_HELP; - } - obduuid = (struct obd_uuid *)optarg; - break; - case 'q': - quiet++; - verbose = 0; - break; + switch (c) { + case 'o': + if (obduuid) { + fprintf(stderr, + "error: %s: only one obduuid allowed", + argv[0]); + return CMD_HELP; + } + obduuid = (struct obd_uuid *)optarg; + break; + case 'q': + quiet++; + verbose = 0; + break; case 'r': recursive = 1; break; - case 'v': - verbose++; - quiet = 0; - break; - case '?': + case 'v': + verbose++; + quiet = 0; + break; + case '?': return CMD_HELP; break; - default: - fprintf(stderr, "error: %s: option '%s' unrecognized\n", - argv[0], argv[optind - 1]); + default: + fprintf(stderr, "error: %s: option '%s' unrecognized\n", + argv[0], argv[optind - 1]); return CMD_HELP; break; - } - } + } + } - if (optind >= argc) + if (optind >= argc) return CMD_HELP; do { rc = op_find(argv[optind], obduuid, recursive, verbose, quiet); - } while (++optind < argc && !rc); + } while (++optind < argc && !rc); if (rc) fprintf(stderr, "error: %s: find failed\n", argv[0]); return rc; } +static int lfs_getstripe(int argc, char **argv) +{ + struct obd_uuid *obduuid = NULL; + int rc; + + if (argc != 2) + return CMD_HELP; + + optind = 1; + + do { + rc = op_find(argv[optind], obduuid, 0, 0, 0); + } while (++optind < argc && !rc); + + if (rc) + fprintf(stderr, "error: %s: getstripe failed for %s\n", + argv[0], argv[1]); + + return rc; +} int main(int argc, char **argv) { diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c index d0451ba..78091ef 100644 --- a/lustre/utils/liblustreapi.c +++ b/lustre/utils/liblustreapi.c @@ -43,52 +43,53 @@ #include #include #include -#include -#include +#include #include static void err_msg(char *fmt, ...) { - va_list args; - int tmp_errno = errno; + va_list args; + int tmp_errno = errno; - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - fprintf(stderr, ": %s (%d)\n", strerror(tmp_errno), tmp_errno); + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + fprintf(stderr, ": %s (%d)\n", strerror(tmp_errno), tmp_errno); } int op_create_file(char *name, long stripe_size, int stripe_offset, - int stripe_count) + int stripe_count) { - struct lov_mds_md a_striping; - int fd, result = 0; - - /* Initialize IOCTL striping pattern structure */ - a_striping.lmm_magic = LOV_MAGIC; - a_striping.lmm_stripe_size = stripe_size; - a_striping.lmm_stripe_offset = stripe_offset; - a_striping.lmm_stripe_count = stripe_count; - - fd = open(name, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644); - if (fd < 0) { - err_msg("unable to open '%s'",name); - result = -errno; - } - else if (ioctl(fd, LL_IOC_LOV_SETSTRIPE, &a_striping)) { - char *errmsg = "stripe already set"; - if (errno != EEXIST && errno != EALREADY) - errmsg = strerror(errno); - - fprintf(stderr, "error on ioctl for '%s' (%d): %s\n", - name, fd, errmsg); - result = -errno; - } - else if (close(fd) < 0) { - err_msg("error on close for '%s' (%d)", name, fd); - result = -errno; - } - return result; + struct lov_user_md lum = { 0 }; + int fd, rc = 0; + + /* Initialize IOCTL striping pattern structure */ + lum.lmm_magic = LOV_USER_MAGIC; + lum.lmm_stripe_size = stripe_size; + lum.lmm_stripe_offset = stripe_offset; + lum.lmm_stripe_count = stripe_count; + + fd = open(name, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644); + if (fd < 0) { + err_msg("unable to open '%s'",name); + rc = -errno; + return rc; + } + if (ioctl(fd, LL_IOC_LOV_SETSTRIPE, &lum)) { + char *errmsg = "stripe already set"; + if (errno != EEXIST && errno != EALREADY) + errmsg = strerror(errno); + + fprintf(stderr, "error on ioctl for '%s' (%d): %s\n", + name, fd, errmsg); + rc = -errno; + } + if (close(fd) < 0) { + err_msg("error on close for '%s' (%d)", name, fd); + if (rc == 0) + rc = -errno; + } + return rc; } @@ -103,7 +104,7 @@ struct find_param { char *buf; int buflen; struct obd_uuid *uuids; - struct lov_mds_md *lmm; + struct lov_user_md *lum; int got_uuids; int obdindex; int max_ost_count; @@ -115,53 +116,50 @@ struct find_param { static int prepare_find(struct find_param *param) { - int datalen, desclen; - int cfglen, lmmlen; + int datalen, desclen; + int cfglen, lumlen; int max_ost_count = MAX_LOV_UUID_COUNT; - - datalen = size_round(sizeof(struct obd_ioctl_data)); - desclen = size_round(sizeof(struct lov_desc)); - param->uuidslen = size_round(max_ost_count * sizeof(struct obd_uuid)); - cfglen = datalen + desclen + param->uuidslen; - lmmlen = lov_mds_md_size(max_ost_count); - if (cfglen > lmmlen) - param->buflen = cfglen; - else - param->buflen = lmmlen; - - /* XXX max ioctl buffer size currently hardcoded to 8192 */ - if (param->buflen > 8192) { - int nuuids, remaining, nluoinfos; - - param->buflen = 8192; - nuuids = (param->buflen - datalen - desclen) / sizeof(struct obd_uuid); - param->uuidslen = size_round(nuuids * sizeof(struct obd_uuid)); - remaining = nuuids * sizeof(struct obd_uuid); - if (param->uuidslen > remaining) - nuuids--; - nluoinfos = (param->buflen - sizeof(struct lov_mds_md)) / - sizeof(*(param->lmm->lmm_objects)); - if (nuuids > nluoinfos) - max_ost_count = nluoinfos; - else - max_ost_count = nuuids; - - cfglen = datalen + desclen + param->uuidslen; - lmmlen = lov_mds_md_size(max_ost_count); - } - - if ((param->buf = malloc(param->buflen)) == NULL) { - err_msg("unable to allocate %d bytes of memory for ioctl's", - param->buflen); - return 1; - } - - param->lmm = (struct lov_mds_md *)param->buf; - param->uuids = (struct obd_uuid *)param->buf; + + datalen = size_round(sizeof(param->data)); + desclen = size_round(sizeof(param->desc)); + param->uuidslen = size_round(max_ost_count * sizeof(*param->uuids)); + cfglen = datalen + desclen + param->uuidslen; + lumlen = lov_mds_md_size(max_ost_count); + if (cfglen > lumlen) + param->buflen = cfglen; + else + param->buflen = lumlen; + + /* XXX max ioctl buffer size currently hardcoded to 8192 */ + if (param->buflen > 8192) { + int nuuids, remaining; + + param->buflen = 8192; + nuuids = (param->buflen - datalen - desclen) / + sizeof(*param->uuids); + param->uuidslen = size_round(nuuids * sizeof(*param->uuids)); + remaining = nuuids * sizeof(*param->uuids); + if (param->uuidslen > remaining) + nuuids--; + max_ost_count = nuuids; + while ((lumlen=lov_mds_md_size(max_ost_count)) > param->buflen) + --max_ost_count; + + cfglen = datalen + desclen + param->uuidslen; + } + + if ((param->buf = malloc(param->buflen)) == NULL) { + err_msg("unable to allocate %d bytes of memory for ioctl's", + param->buflen); + return ENOMEM; + } + + param->lum = (struct lov_user_md *)param->buf; + param->uuids = (struct obd_uuid *)param->buf; param->got_uuids = 0; param->obdindex = OBD_NOT_FOUND; param->max_ost_count = max_ost_count; - + return 0; } @@ -173,14 +171,14 @@ static void cleanup_find(struct find_param *param) free(param->buf); } -static void get_obd_uuids(DIR *dir, char *dname, struct find_param *param) +static int get_obd_uuids(DIR *dir, char *dname, struct find_param *param) { - int obdcount; - struct obd_uuid *uuidp; - int rc, i; + int obdcount; + struct obd_uuid *uuidp; + int rc, i; param->got_uuids = 1; - memset(¶m->data, 0, sizeof(struct obd_ioctl_data)); + memset(¶m->data, 0, sizeof(param->data)); param->data.ioc_inllen1 = sizeof(struct lov_desc); param->data.ioc_inlbuf1 = (char *)¶m->desc; param->data.ioc_inllen2 = param->uuidslen; @@ -191,23 +189,23 @@ static void get_obd_uuids(DIR *dir, char *dname, struct find_param *param) if (obd_ioctl_pack(¶m->data, ¶m->buf, param->buflen)) { fprintf(stderr, "internal buffer error from %s\n", dname); - return; + return (param->obduuid ? EINVAL : 0); } rc = ioctl(dirfd(dir), OBD_IOC_LOV_GET_CONFIG, param->buf); if (rc) { err_msg("error getting LOV config from %s", dname); - return; + return (param->obduuid ? errno : 0); } if (obd_ioctl_unpack(¶m->data, param->buf, param->buflen)) { err_msg("invalid reply from ioctl from %s", dname); - return; + return (param->obduuid ? EINVAL : 0); } obdcount = param->desc.ld_tgt_count; if (obdcount == 0) - return; + return 0; if (param->obduuid) { for (i = 0, uuidp = param->uuids; i < obdcount; i++, uuidp++) { @@ -217,93 +215,118 @@ static void get_obd_uuids(DIR *dir, char *dname, struct find_param *param) break; } } - - if (param->obdindex == OBD_NOT_FOUND) - return; } else if (!param->quiet) { printf("OBDS:\n"); for (i = 0, uuidp = param->uuids; i < obdcount; i++, uuidp++) printf("%4d: %s\n", i, uuidp->uuid); } + + return 0; } -static void process_file(DIR *dir, char *dname, char *fname, struct find_param *param) +void lov_dump_user_lmm_v1(struct lov_user_md_v1 *lum, char *dname, char *fname, + int obdindex, int quiet, int header, int body) { - int rc, i; + int i; - strncpy((char *)param->lmm, fname, param->buflen); + if (obdindex != OBD_NOT_FOUND) { + for (i = 0; i < lum->lmm_stripe_count; i++) { + if (obdindex == lum->lmm_objects[i].l_ost_idx) { + printf("%s/%s\n", dname, fname); + break; + } + } + } else if (!quiet) { + printf("%s/%s\n", dname, fname); + } - rc = ioctl(dirfd(dir), IOC_MDC_GETSTRIPE, (void *)param->lmm); - if (rc) { - if (errno == ENODATA) { - if (!param->obduuid && !param->quiet) - fprintf(stderr, - "%s/%s has no stripe info\n", - dname, fname); - } else if (errno == EISDIR) { - fprintf(stderr, "process_file on directory %s/%s!\n", - dname, fname); - /* - add fname to directory list; - */ - } else { - err_msg("IOC_MDC_GETSTRIPE ioctl failed"); - } - return; - } + if (header) { + printf("lmm_magic: 0x%80X\n", lum->lmm_magic); + printf("lmm_object_gr: "LPX64"\n", lum->lmm_object_gr); + printf("lmm_object_id: "LPX64"\n", lum->lmm_object_id); + printf("lmm_stripe_count: %u\n", (int)lum->lmm_stripe_count); + printf("lmm_stripe_size: %u\n", lum->lmm_stripe_size); + printf("lmm_stripe_pattern: %x\n", lum->lmm_pattern); + } - if ((param->obduuid && param->lmm->lmm_objects[param->obdindex].l_object_id) || - (!param->obduuid && !param->quiet)) - printf("%s/%s\n", dname, fname); + if (body) { + long long oid; - if (param->verbose) { - printf("lmm_magic: 0x%x\n", param->lmm->lmm_magic); - printf("lmm_object_id: "LPX64"\n", param->lmm->lmm_object_id); - printf("lmm_stripe_offset: %u\n", (int)param->lmm->lmm_stripe_offset); - printf("lmm_stripe_count: %u\n", (int)param->lmm->lmm_stripe_count); - printf("lmm_stripe_size: %u\n", (int)param->lmm->lmm_stripe_size); - printf("lmm_ost_count: %u\n", param->lmm->lmm_ost_count); - printf("lmm_stripe_pattern: %d\n", param->lmm->lmm_magic & 0xf); + if (!quiet) + printf("\tobdidx\t\t objid\t\tobjid\t\t group\n"); + + for (i = 0; i < lum->lmm_stripe_count; i++) { + int idx = lum->lmm_objects[i].l_ost_idx; + oid = lum->lmm_objects[i].l_object_id; + printf("\t%6u\t%14llu\t%#13llx\t%14lld%s\n", idx, oid, + oid, lum->lmm_objects[i].l_object_gr, + obdindex == idx ? " *" : ""); + } + printf("\n"); } +} - if (param->verbose || !param->obduuid) { - long long oid; - int ost = param->lmm->lmm_stripe_offset; - int header = !param->quiet; - - /* FIXME: temporary fix for bug 1612 */ - if (param->lmm->lmm_ost_count == 0) { - oid = param->lmm->lmm_object_id; - if (header) - printf("\tobdidx\t\t objid\t\tobjid\n"); - printf("\t%6u\t%14llu\t%#13llx\n", 0, oid, oid); - } else - for (i = 0; i < param->lmm->lmm_ost_count; i++, ost++) { - ost %= param->lmm->lmm_ost_count; - if ((oid = param->lmm->lmm_objects[ost].l_object_id)) { - if (header) { - printf("\tobdidx\t\t objid\t\tobjid\n"); - header = 0; - } - printf("\t%6u\t%14llu\t%#13llx%s\n", ost, - oid, oid, param->obdindex == ost ? " *" : ""); - } - } - printf("\n"); - } +void lov_dump_user_lmm(struct find_param *param, char *dname, char *fname) +{ + switch(*(__u32 *)param->lum) { /* lum->lmm_magic */ + case LOV_USER_MAGIC_V1: + lov_dump_user_lmm_v1(param->lum, dname, fname, param->obdindex, + param->quiet, param->verbose, + (param->verbose || !param->obduuid)); + break; + default: + printf("unknown lmm_magic: 0x%08X\n", *(__u32 *)param->lum); + return; + } } +static int process_file(DIR *dir, char *dname, char *fname, + struct find_param *param) +{ + int rc; -static void process_dir(DIR *dir, char *dname, struct find_param *param) + strncpy((char *)param->lum, fname, param->buflen); + + rc = ioctl(dirfd(dir), IOC_MDC_GETSTRIPE, (void *)param->lum); + if (rc) { + if (errno == ENODATA) { + if (!param->obduuid && !param->quiet) + fprintf(stderr, + "%s/%s has no stripe info\n", + dname, fname); + rc = 0; + } else if (errno == EISDIR) { + fprintf(stderr, "process_file on directory %s/%s!\n", + dname, fname); + /* add fname to directory list; */ + rc = errno; + } else { + err_msg("IOC_MDC_GETSTRIPE ioctl failed"); + rc = errno; + } + return rc; + } + + lov_dump_user_lmm(param, dname, fname); + + return 0; +} + + +static int process_dir(DIR *dir, char *dname, struct find_param *param) { - struct dirent64 *dirp; + struct dirent64 *dirp; DIR *subdir; - char path[1024]; + char path[1024]; + int rc; - if (!param->got_uuids) - get_obd_uuids(dir, dname, param); + if (!param->got_uuids) { + rc = get_obd_uuids(dir, dname, param); + if (rc) + return rc; + } - /* Handle the contents of the directory */ + /* Handle the contents of the directory */ while ((dirp = readdir64(dir)) != NULL) { if (!strcmp(dirp->d_name, ".") || !strcmp(dirp->d_name, "..")) continue; @@ -311,12 +334,12 @@ static void process_dir(DIR *dir, char *dname, struct find_param *param) switch (dirp->d_type) { case DT_UNKNOWN: err_msg("\"%s\" is UNKNOWN type %d", dirp->d_name, - dirp->d_type); + dirp->d_type); /* If we cared we could stat the file to determine * type and continue on here, but we don't since we * know d_type should be valid for lustre and this * tool only makes sense for lustre filesystems. */ - return; + return EINVAL; break; case DT_DIR: if (!param->recursive) @@ -327,24 +350,31 @@ static void process_dir(DIR *dir, char *dname, struct find_param *param) subdir = opendir(path); if (subdir == NULL) { err_msg("\"%.40s\" opendir failed", path); - break; + return errno; } - process_dir(subdir, path, param); + rc = process_dir(subdir, path, param); closedir(subdir); + if (rc) + return rc; break; case DT_REG: - process_file(dir, dname, dirp->d_name, param); + rc = process_file(dir, dname, dirp->d_name, param); + if (rc) + return rc; break; default: break; } } + + return 0; } -static void process_path(char *path, struct find_param *param) +static int process_path(char *path, struct find_param *param) { char *fname, *dname; DIR *dir; + int rc = 0; fname = strrchr(path, '/'); if (fname != NULL && fname[1] == '\0') { @@ -353,13 +383,14 @@ static void process_path(char *path, struct find_param *param) dir = opendir(path); if (dir == NULL) { err_msg("\"%.40s\" opendir failed", path); + rc = errno; } else { - process_dir(dir, path, param); + rc = process_dir(dir, path, param); closedir(dir); } } else if ((dir = opendir(path)) != NULL) { /* No trailing '/', but it is still a dir */ - process_dir(dir, path, param); + rc = process_dir(dir, path, param); closedir(dir); } else { /* It must be a file (or other non-directory) */ @@ -374,18 +405,22 @@ static void process_path(char *path, struct find_param *param) dir = opendir(dname); if (dir == NULL) { err_msg("\"%.40s\" opendir failed", dname); + rc = errno; } else { if (!param->got_uuids) - get_obd_uuids(dir, dname, param); - process_file(dir, dname, fname, param); + rc = get_obd_uuids(dir, dname, param); + if (rc == 0) + rc = process_file(dir, dname, fname, param); closedir(dir); } } + + return rc; } -int op_find(char *path, struct obd_uuid *obduuid, int recursive, - int verbose, int quiet) +int op_find(char *path, struct obd_uuid *obduuid, int recursive, + int verbose, int quiet) { struct find_param param; int ret = 0; @@ -395,12 +430,12 @@ int op_find(char *path, struct obd_uuid *obduuid, int recursive, param.verbose = verbose; param.quiet = quiet; if (obduuid) { - param.obduuid = (struct obd_uuid*)malloc(sizeof(struct obd_uuid)); + param.obduuid = malloc(sizeof(*obduuid)); if (param.obduuid == NULL) { - ret = 1; + ret = ENOMEM; goto out; } - memcpy(param.obduuid, obduuid, sizeof(struct obd_uuid)); + memcpy(param.obduuid, obduuid, sizeof(*obduuid)); } ret = prepare_find(¶m); @@ -412,4 +447,4 @@ out: cleanup_find(¶m); return ret; } - + diff --git a/lustre/utils/lstripe b/lustre/utils/lstripe new file mode 100755 index 0000000..51ebd79 --- /dev/null +++ b/lustre/utils/lstripe @@ -0,0 +1,3 @@ +#!/bin/bash +PATH=`dirname $0`:$PATH +lfs setstripe "$@" diff --git a/lustre/utils/lwizard b/lustre/utils/lwizard index a46f58f..89ceb20 100755 --- a/lustre/utils/lwizard +++ b/lustre/utils/lwizard @@ -104,99 +104,81 @@ in_list() return 1 } -# read line from stdin -read_ln() -{ - local substr=$1 - local default_value - local answer - - unset ANS - - [ $# -gt 1 ] && default_value=$2 - [ $# -gt 2 ] && answer=$3 - - while [ -z "$ANS" ]; do - echo -n "$substr" - [ "$default_value" ] && echo -n " ($default_value)" - echo -n ": " - read ANS - [ -z "$ANS" -a "$default_value" ] && ANS=$default_value - if [ "$ANS" -a "$answer" ] ; then - in_list "$ANS" "$ANSWER" || ANS="" - fi - done - - return 0 -} #ask user some questions to add a device add_device() { - local first - local hostname - - [ $# -gt 2 ] && first=$3 - - if [ -z "$first" ] ; then - read_ln "Do you want to add another $1 (yes/no)?" "no" "$ANSWER" - else - ANS="yes" - fi - - [ "$ANS" = "no" ] && return 1 + local hostnames + local device echo "Creating $1 \"$1$2\"..." - read_ln "Please enter $1$2's hostname" - hostname=$ANS - read_ln "Please enter $1$2's device" - - device=$ANS - - DEVICE="$hostname:$device:$2:$1$2" + echo -n "Please enter the hostname(s) for $1$2: " + read hostnames + + if [ -z "$hostnames" ] ; then + return 1 + fi + + for hostname in $hostnames ; do + device= + while [ -z "$device" ] ; do + echo -n "Please enter the $1$2 device for ${hostname}: " + read device + done + newdev="$hostname:$device:$2:$1$2:$CURRENT_MDS:$CURRENT_LOV" + DEVICE_LIST="$DEVICE_LIST $newdev" + done return 0 } +cur_mds_id=1 + # get mds information add_mds() { - local id=1 - local host_name - - while :; do - add_device "mds" "$id" "first" || break - in_list "$DEVICE" "$MDS_LIST" && continue - MDS_LIST="$MDS_LIST $DEVICE" #add mds to MDS_LIST - ((id++)) - break - done + CURRENT_LOV= + CURRENT_MDS= + add_device "mds" "$cur_mds_id" || return 1 + CURRENT_LOV="lov$cur_mds_id" + CURRENT_MDS="mds$cur_mds_id" + DEVICE_LIST="$DEVICE_LIST *:*:lov:$CURRENT_LOV:$CURRENT_MDS:" + + (( cur_mds_id++ )) return 0 } +cur_ost_id=1 + # ask user to add ost add_ost() { - local first="first" - local id=1 - - while :; do - add_device "ost" "$id" "$first" || break - in_list "$DEVICE" "$OST_LIST" && continue - OST_LIST="$OST_LIST $DEVICE" #add ost to MDS_LIST - ((id++)) - first="" - done + # We have to add one... + while ! add_device "ost" "$cur_ost_id" ; do + true + done + (( cur_ost_id++ )) + + # ...and maybe more + while add_device "ost" "$cur_ost_id" ; do + (( cur_ost_id++ )) + done return 0 } +cur_cli_id=1 + # ask user to add client to lustre add_client() { - read_ln "Please enter the mountpoint for your clients" "$DEFAULT_MNTPT" - CLIENT_LIST="*:$ANS:client:client" + echo -n "Please enter the clients' mountpoint (/mnt/lustre): " + read mtpt + [ -z "$mtpt" ] && mtpt="/mnt/lustre" + newdev="*:$mtpt:client:client$cur_cli_id:$CURRENT_MDS:$CURRENT_LOV" + DEVICE_LIST="$DEVICE_LIST $newdev" + (( cur_cli_id++ )) return 0 } @@ -224,49 +206,49 @@ get_name_in_list() DEVICE=$(echo $1 | awk -F: '{ print $2 }') DEVICE_ID=$(echo $1 | awk -F: '{ print $3 }') DEVICE_NAME=$(echo $1 | awk -F: '{ print $4 }') + DEVICE_MDS=$(echo $1 | awk -F: '{ print $5 }') + DEVICE_LOV=$(echo $1 | awk -F: '{ print $6 }') } # following user input to create xml config file create_config() { - local mds_name local config_file=$1 - for mds in $MDS_LIST ; do - get_name_in_list $mds - echo -n " $DEVICE_NAME" - add_node "$HOST_NAME" "$config_file" || return 1 - $LMC -m "$config_file" --add mds --node "$HOST_NAME" \ - --mds "$DEVICE_NAME" \ - --nid "$HOST_NAME" --fstype "$DEFAULT_FSTYPE" \ - --dev "$DEVICE" || return 1 - - mds_name="$DEVICE_NAME" - done - - #add lov information FIXME --stripe_sz and - #--stripe_cnt should be input by user - echo -n " lov1" - $LMC -m "$config_file" --add lov --lov lov1 --mds "$mds_name" \ - --stripe_sz "$STRIPE_SIZE" --stripe_cnt "$STRIPE_CNT" \ - --stripe_pattern "$STRIPE_PATTERN" || return 1 - - for ost in $OST_LIST ; do - get_name_in_list $ost + for device in $DEVICE_LIST ; do + get_name_in_list $device echo -n " $DEVICE_NAME" - add_node "$HOST_NAME" "$config_file" || return 1 - $LMC -m "$config_file" --add ost --node "$HOST_NAME" \ - --ost "$DEVICE_NAME" \ - --lov lov1 --fstype "$DEFAULT_FSTYPE" \ - --dev "$DEVICE" || return 1 - done - - for client in $CLIENT_LIST ; do - get_name_in_list $client - echo -n " $DEVICE_NAME" - add_node "client" "$config_file" || return 1 - $LMC -m "$config_file" --add mtpt --nod client \ - --mds "$mds_name" --lov lov1 --path "$DEVICE" || return 1 + case $DEVICE_NAME in + mds*) + add_node "$HOST_NAME" "$config_file" || return 1 + $LMC -m "$config_file" --add mds --node "$HOST_NAME" \ + --mds "$DEVICE_NAME" \ + --nid "$HOST_NAME" --fstype "$DEFAULT_FSTYPE" \ + --dev "$DEVICE" || return 1 + ;; + lov*) + $LMC -m "$config_file" --add lov \ + --lov "$DEVICE_NAME" \ + --mds "$DEVICE_MDS" \ + --stripe_sz "$STRIPE_SIZE" \ + --stripe_cnt "$STRIPE_CNT" \ + --stripe_pattern "$STRIPE_PATTERN" || return 1 + ;; + ost*) + add_node "$HOST_NAME" "$config_file" || return 1 + $LMC -m "$config_file" --add ost --node "$HOST_NAME" \ + --ost "$DEVICE_NAME" \ + --lov "$DEVICE_LOV" --fstype "$DEFAULT_FSTYPE" \ + --dev "$DEVICE" || return 1 + ;; + client*) + add_node "$DEVICE_NAME" "$config_file" || return 1 + $LMC -m "$config_file" --add mtpt \ + --node "$DEVICE_NAME" \ + --mds "$DEVICE_MDS" \ + --lov "$DEVICE_LOV" --path "$DEVICE" || return 1 + ;; + esac done echo return 0 @@ -293,17 +275,15 @@ This script will help you create a Lustre configuration file. EOF -#add mds to lustre -unset $MDS_LIST -add_mds || fatal 1 "Cannot add mds to your lustre" - -#add ost to lustre -unset $OST_LIST -add_ost || fatal 1 "Cannot add ost to your lustre" +CURRENT_LOV= +MDS_LIST= +OST_LIST= +CLIENT_LIST= -#add client to lustre -unset $CLIENT_LIST -add_client || fatal 1 "Cannot add client to your lustre" +while add_mds ; do + add_ost + add_client +done rm -f "$TMP_CONFIG_FILE" echo -n "Saving configuration to $CONFIG_FILE:"