Whamcloud - gitweb
Branch b1_4_mountconf
authornathan <nathan>
Tue, 20 Sep 2005 23:33:07 +0000 (23:33 +0000)
committernathan <nathan>
Tue, 20 Sep 2005 23:33:07 +0000 (23:33 +0000)
b=8341
update b1_4_mountconf from b1_4_newconfig: now with LNET

270 files changed:
ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-rhel4.patch
ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch
ldiskfs/kernel_patches/patches/ext3-map_inode_page-2.6-suse.patch
ldiskfs/kernel_patches/patches/ext3-mballoc2-2.6-suse.patch
ldiskfs/kernel_patches/patches/ext3-mballoc2-2.6.9-rhel4.patch
ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series
ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series
ldiskfs/ldiskfs/autoMakefile.am
lustre/ChangeLog
lustre/LICENSE
lustre/autoMakefile.am
lustre/autoconf/lustre-core.m4
lustre/autoconf/lustre-version.ac
lustre/doc/lconf.8
lustre/doc/lconf.lyx
lustre/doc/lctl.8
lustre/doc/lctl.lyx
lustre/doc/lmc.1
lustre/doc/lmc.lyx
lustre/doc/quota_hld.lyx [deleted file]
lustre/include/Makefile.am
lustre/include/liblustre.h
lustre/include/linux/Makefile.am
lustre/include/linux/lustre_commit_confd.h
lustre/include/linux/lustre_compat25.h
lustre/include/linux/lustre_debug.h
lustre/include/linux/lustre_disk.h
lustre/include/linux/lustre_dlm.h
lustre/include/linux/lustre_fsfilt.h
lustre/include/linux/lustre_idl.h
lustre/include/linux/lustre_lib.h
lustre/include/linux/lustre_lite.h
lustre/include/linux/lustre_log.h
lustre/include/linux/lustre_mds.h
lustre/include/linux/lustre_net.h
lustre/include/linux/lustre_quota.h
lustre/include/linux/lustre_ucache.h
lustre/include/linux/lvfs.h
lustre/include/linux/obd.h
lustre/include/linux/obd_class.h
lustre/include/linux/obd_support.h
lustre/include/lustre/Makefile.am
lustre/include/lustre/lustre_user.h
lustre/include/lustre/types.h [new file with mode: 0644]
lustre/kernel_patches/kernel_configs/kernel-2.6.5-2.6-suse-i686-bigsmp.config
lustre/kernel_patches/kernel_configs/kernel-2.6.5-2.6-suse-i686-smp.config
lustre/kernel_patches/kernel_configs/kernel-2.6.5-2.6-suse-i686.config
lustre/kernel_patches/kernel_configs/kernel-2.6.5-2.6-suse-ia64-smp.config
lustre/kernel_patches/kernel_configs/kernel-2.6.5-2.6-suse-ia64.config
lustre/kernel_patches/kernel_configs/kernel-2.6.5-2.6-suse-x86_64-smp.config
lustre/kernel_patches/kernel_configs/kernel-2.6.5-2.6-suse-x86_64.config
lustre/kernel_patches/kernel_configs/kernel-2.6.9-2.6-rhel4-x86_64-smp.config
lustre/kernel_patches/kernel_configs/kernel-2.6.9-2.6-rhel4-x86_64.config
lustre/kernel_patches/kernel_configs/uml_2.6.0_test3.config
lustre/kernel_patches/patches/ext3-ea-in-inode-2.6-rhel4.patch
lustre/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch
lustre/kernel_patches/patches/ext3-extents-2.4.21-chaos.patch
lustre/kernel_patches/patches/ext3-extents-2.4.21-suse2.patch
lustre/kernel_patches/patches/ext3-extents-2.4.24.patch
lustre/kernel_patches/patches/ext3-extents-2.4.29.patch
lustre/kernel_patches/patches/ext3-ialloc-2.4.21-suse2.patch [new file with mode: 0644]
lustre/kernel_patches/patches/ext3-map_inode_page-2.4.21-suse2.patch
lustre/kernel_patches/patches/ext3-map_inode_page-2.6-suse.patch
lustre/kernel_patches/patches/ext3-map_inode_page.patch
lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch
lustre/kernel_patches/patches/ext3-mballoc2-2.6-suse.patch
lustre/kernel_patches/patches/ext3-mballoc2-2.6.9-rhel4.patch
lustre/kernel_patches/patches/kjournald_affinity.patch [new file with mode: 0644]
lustre/kernel_patches/patches/lustre-version-revert_suse.patch [new file with mode: 0644]
lustre/kernel_patches/patches/lustre_version.patch
lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch
lustre/kernel_patches/patches/qsnet-suse-2.6.patch
lustre/kernel_patches/patches/sd_iostats-2.4.21-chaos.patch
lustre/kernel_patches/patches/sd_iostats-2.6-rhel4.patch
lustre/kernel_patches/patches/sd_iostats-2.6-suse.patch
lustre/kernel_patches/patches/vfs_intent-2.6-suse.patch
lustre/kernel_patches/patches/vfs_nointent-2.6-rhel4.patch
lustre/kernel_patches/patches/vfs_nointent-2.6-suse.patch
lustre/kernel_patches/series/2.6-suse-lnxi.series [deleted file]
lustre/kernel_patches/series/2.6-suse-newer.series [new file with mode: 0644]
lustre/kernel_patches/series/ldiskfs-2.6-rhel4.series
lustre/kernel_patches/series/ldiskfs-2.6-suse.series
lustre/kernel_patches/series/rhel-2.4.21
lustre/kernel_patches/series/suse-2.4.21-cray
lustre/kernel_patches/series/vanilla-2.4.29
lustre/kernel_patches/targets/2.6-suse.target.in
lustre/kernel_patches/which_patch
lustre/ldiskfs/autoMakefile.am
lustre/ldlm/l_lock.c
lustre/ldlm/ldlm_extent.c
lustre/ldlm/ldlm_flock.c
lustre/ldlm/ldlm_lib.c
lustre/ldlm/ldlm_lock.c
lustre/ldlm/ldlm_lockd.c
lustre/ldlm/ldlm_plain.c
lustre/ldlm/ldlm_request.c
lustre/ldlm/ldlm_resource.c
lustre/liblustre/Makefile.am
lustre/liblustre/dir.c
lustre/liblustre/file.c
lustre/liblustre/genlib.sh
lustre/liblustre/llite_lib.c
lustre/liblustre/llite_lib.h
lustre/liblustre/lutil.c
lustre/liblustre/namei.c
lustre/liblustre/rw.c
lustre/liblustre/super.c
lustre/liblustre/tests/echo_test.c
lustre/liblustre/tests/recovery_small.c
lustre/liblustre/tests/replay_ost_single.c
lustre/liblustre/tests/replay_single.c
lustre/liblustre/tests/sanity.c
lustre/llite/dcache.c
lustre/llite/dir.c
lustre/llite/file.c
lustre/llite/llite_close.c
lustre/llite/llite_internal.h
lustre/llite/llite_lib.c
lustre/llite/namei.c
lustre/llite/rw.c
lustre/llite/special.c
lustre/lov/lov_log.c
lustre/lov/lov_merge.c
lustre/lov/lov_obd.c
lustre/lov/lov_offset.c
lustre/lov/lov_pack.c
lustre/lov/lov_qos.c
lustre/lov/lov_request.c
lustre/lov/lproc_lov.c
lustre/lvfs/Makefile.in
lustre/lvfs/autoMakefile.am
lustre/lvfs/fsfilt_ext3.c
lustre/lvfs/lvfs_internal.h
lustre/lvfs/lvfs_linux.c
lustre/lvfs/upcall_cache.c [new file with mode: 0644]
lustre/mdc/lproc_mdc.c
lustre/mdc/mdc_internal.h
lustre/mdc/mdc_lib.c
lustre/mdc/mdc_locks.c
lustre/mdc/mdc_reint.c
lustre/mdc/mdc_request.c
lustre/mds/commit_confd.c
lustre/mds/handler.c
lustre/mds/lproc_mds.c
lustre/mds/mds_fs.c
lustre/mds/mds_internal.h
lustre/mds/mds_lib.c
lustre/mds/mds_log.c
lustre/mds/mds_lov.c
lustre/mds/mds_open.c
lustre/mds/mds_reint.c
lustre/mds/mds_unlink_open.c
lustre/obdclass/class_obd.c
lustre/obdclass/debug.c
lustre/obdclass/genops.c
lustre/obdclass/llog.c
lustre/obdclass/llog_cat.c
lustre/obdclass/llog_ioctl.c
lustre/obdclass/llog_lvfs.c
lustre/obdclass/llog_obd.c
lustre/obdclass/llog_swab.c
lustre/obdclass/llog_test.c
lustre/obdclass/lprocfs_status.c
lustre/obdclass/lustre_handles.c
lustre/obdclass/lustre_peer.c
lustre/obdclass/obd_config.c
lustre/obdclass/obdo.c
lustre/obdclass/statfs_pack.c
lustre/obdclass/sysctl.c
lustre/obdecho/echo.c
lustre/obdecho/echo_client.c
lustre/obdecho/lproc_echo.c
lustre/obdfilter/filter.c
lustre/obdfilter/filter_internal.h
lustre/obdfilter/filter_io.c
lustre/obdfilter/filter_io_24.c
lustre/obdfilter/filter_io_26.c
lustre/obdfilter/filter_log.c
lustre/obdfilter/filter_lvb.c
lustre/obdfilter/filter_san.c
lustre/obdfilter/lproc_obdfilter.c
lustre/osc/lproc_osc.c
lustre/osc/osc_create.c
lustre/osc/osc_internal.h
lustre/osc/osc_lib.c
lustre/osc/osc_request.c
lustre/ost/lproc_ost.c
lustre/ost/ost_handler.c
lustre/ost/ost_internal.h
lustre/ptlrpc/client.c
lustre/ptlrpc/connection.c
lustre/ptlrpc/events.c
lustre/ptlrpc/import.c
lustre/ptlrpc/llog_client.c
lustre/ptlrpc/llog_net.c
lustre/ptlrpc/llog_server.c
lustre/ptlrpc/lproc_ptlrpc.c
lustre/ptlrpc/niobuf.c
lustre/ptlrpc/pack_generic.c
lustre/ptlrpc/pers.c
lustre/ptlrpc/pinger.c
lustre/ptlrpc/ptlrpc_internal.h
lustre/ptlrpc/ptlrpc_module.c
lustre/ptlrpc/ptlrpcd.c
lustre/ptlrpc/recov_thread.c
lustre/ptlrpc/recover.c
lustre/ptlrpc/service.c
lustre/scripts/bdev-io-survey.sh
lustre/scripts/lustre
lustre/scripts/lustrefs
lustre/tests/2ost.sh
lustre/tests/Makefile.am
lustre/tests/acceptance-metadata-double.sh
lustre/tests/acceptance-metadata-parallel.sh
lustre/tests/acceptance-metadata-single.sh
lustre/tests/acceptance-small.sh
lustre/tests/cobd.sh
lustre/tests/conf-sanity.sh
lustre/tests/echo.sh
lustre/tests/flock.c [new file with mode: 0644]
lustre/tests/flock_test.c [new file with mode: 0644]
lustre/tests/insanity.sh
lustre/tests/liblustre_sanity_uml.sh
lustre/tests/ll_dirstripe_verify.c
lustre/tests/llmountcleanup.sh
lustre/tests/llrmount.sh
lustre/tests/local.sh
lustre/tests/lov.sh
lustre/tests/mkdirdeep.c
lustre/tests/oos.sh
lustre/tests/random-reads.c [new file with mode: 0644]
lustre/tests/recovery-small.sh
lustre/tests/replay-dual.sh
lustre/tests/replay-ost-single.sh
lustre/tests/replay-single.sh
lustre/tests/routed.sh
lustre/tests/runas.c
lustre/tests/rundbench
lustre/tests/runfailure-net
lustre/tests/runiozone
lustre/tests/runregression-mds.sh
lustre/tests/runregression-net.sh
lustre/tests/sanity-ldlm.sh [deleted file]
lustre/tests/sanity.sh
lustre/tests/sanityN.sh
lustre/tests/statmany.c
lustre/tests/test-framework.sh
lustre/tests/test-lwizard.sh
lustre/tests/uml.sh
lustre/tests/wantedi.c
lustre/tests/write_disjoint.c
lustre/tests/writemany.c
lustre/utils/.cvsignore
lustre/utils/Lustre/lustredb.py
lustre/utils/Makefile.am
lustre/utils/l_getgroups.c
lustre/utils/lconf
lustre/utils/lctl.c
lustre/utils/lfs.c
lustre/utils/liblustreapi.c
lustre/utils/llanalyze
lustre/utils/llmount.c
lustre/utils/lmc
lustre/utils/lustre_cfg.c
lustre/utils/mkfs_lustre.c
lustre/utils/obd.c
lustre/utils/obdctl.c
lustre/utils/obdctl.h
lustre/utils/wirecheck.c
lustre/utils/wiretest.c

index 3d554e4..9d5bee1 100644 (file)
@@ -18,7 +18,7 @@ Index: linux-stage/fs/ext3/inode.c
 ===================================================================
 --- linux-stage.orig/fs/ext3/inode.c   2005-02-25 16:47:04.415976672 +0200
 +++ linux-stage/fs/ext3/inode.c        2005-02-25 16:50:40.756087976 +0200
-@@ -2274,7 +2274,7 @@
+@@ -2274,7 +2274,7 @@ static unsigned long ext3_get_inode_bloc
   * trying to determine the inode's location on-disk and no read need be
   * performed.
   */
@@ -27,7 +27,7 @@ Index: linux-stage/fs/ext3/inode.c
                                struct ext3_iloc *iloc, int in_mem)
  {
        unsigned long block;
-@@ -2484,6 +2484,11 @@
+@@ -2484,6 +2484,11 @@ void ext3_read_inode(struct inode * inod
                ei->i_data[block] = raw_inode->i_block[block];
        INIT_LIST_HEAD(&ei->i_orphan);
  
@@ -39,7 +39,7 @@ Index: linux-stage/fs/ext3/inode.c
        if (S_ISREG(inode->i_mode)) {
                inode->i_op = &ext3_file_inode_operations;
                inode->i_fop = &ext3_file_operations;
-@@ -2619,6 +2624,9 @@
+@@ -2619,6 +2624,9 @@ static int ext3_do_update_inode(handle_t
        } else for (block = 0; block < EXT3_N_BLOCKS; block++)
                raw_inode->i_block[block] = ei->i_data[block];
  
@@ -49,6 +49,16 @@ Index: linux-stage/fs/ext3/inode.c
        BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
        rc = ext3_journal_dirty_metadata(handle, bh);
        if (!err)
+@@ -2849,7 +2857,8 @@ ext3_reserve_inode_write(handle_t *handl
+ {
+       int err = 0;
+       if (handle) {
+-              err = ext3_get_inode_loc(inode, iloc, 1);
++              err = ext3_get_inode_loc(inode, iloc, EXT3_I(inode)->i_state &
++                                                      EXT3_STATE_NEW);
+               if (!err) {
+                       BUFFER_TRACE(iloc->bh, "get_write_access");
+                       err = ext3_journal_get_write_access(handle, iloc->bh);
 Index: linux-stage/fs/ext3/xattr.c
 ===================================================================
 --- linux-stage.orig/fs/ext3/xattr.c   2005-02-25 16:47:04.422975608 +0200
@@ -112,7 +122,7 @@ Index: linux-stage/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOENT;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc, 1);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -241,7 +251,7 @@ Index: linux-stage/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return 0;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc, 1);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -379,7 +389,7 @@ Index: linux-stage/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return ret;
 +
-+      err = ext3_get_inode_loc(inode, &iloc, 1);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return -EIO;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -510,7 +520,7 @@ Index: linux-stage/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOSPC;
 +
-+      err = ext3_get_inode_loc(inode, &iloc, 1);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return err;
 +      raw_inode = ext3_raw_inode(&iloc);
index 439a08e..19f153d 100644 (file)
@@ -50,6 +50,16 @@ Index: linux-2.6.0/fs/ext3/inode.c
        BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
        rc = ext3_journal_dirty_metadata(handle, bh);
        if (!err)
+@@ -2849,7 +2857,8 @@ ext3_reserve_inode_write(handle_t *handl
+ {
+       int err = 0;
+       if (handle) {
+-              err = ext3_get_inode_loc(inode, iloc, 1);
++              err = ext3_get_inode_loc(inode, iloc, EXT3_I(inode)->i_state &
++                                                      EXT3_STATE_NEW);
+               if (!err) {
+                       BUFFER_TRACE(iloc->bh, "get_write_access");
+                       err = ext3_journal_get_write_access(handle, iloc->bh);
 Index: linux-2.6.0/fs/ext3/xattr.c
 ===================================================================
 --- linux-2.6.0.orig/fs/ext3/xattr.c   2003-12-30 08:33:13.000000000 +0300
@@ -113,7 +123,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOENT;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc, 1);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -242,7 +252,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return 0;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc, 1);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -379,7 +389,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return ret;
 +
-+      err = ext3_get_inode_loc(inode, &iloc, 1);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return -EIO;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -510,7 +520,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOSPC;
 +
-+      err = ext3_get_inode_loc(inode, &iloc, 1);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return err;
 +      raw_inode = ext3_raw_inode(&iloc);
index 91063b3..d2af494 100644 (file)
@@ -6,7 +6,7 @@ Index: linux-2.6.0/fs/ext3/inode.c
 ===================================================================
 --- linux-2.6.0.orig/fs/ext3/inode.c   2003-12-31 00:33:49.000000000 +0300
 +++ linux-2.6.0/fs/ext3/inode.c        2003-12-31 01:14:17.000000000 +0300
-@@ -3136,3 +3136,58 @@
+@@ -3136,3 +3136,62 @@
                ret = ret2;
        return ret;
  }
@@ -28,8 +28,9 @@ Index: linux-2.6.0/fs/ext3/inode.c
 +                blocks[i] = ext3_bmap(inode->i_mapping, iblock);
 +                if (blocks[i] == 0) {
 +                        failed++;
-+                        created[i] = -1;
-+                } else {
++                      if (created)
++                              created[i] = -1;
++              } else if (created) {
 +                        created[i] = 0;
 +                }
 +        }
@@ -53,18 +54,21 @@ Index: linux-2.6.0/fs/ext3/inode.c
 +                               "block %ld\n", iblock);
 +                        goto out;
 +                }
++              /* Unmap any metadata buffers from the block mapping, to avoid
++               * data corruption due to direct-write from Lustre being
++               * clobbered by a later flush of the blockdev metadata buffer.*/
 +                if (buffer_new(&dummy))
 +                        unmap_underlying_metadata(dummy.b_bdev,
-+                                                      dummy.b_blocknr);
++                                                      dummy.b_blocknr);
 +                blocks[i] = dummy.b_blocknr;
-+                created[i] = 1;
++              if (created)
++                      created[i] = 1;
 +        }
 +
 + out:
 +      ext3_journal_stop(handle);
 +        return rc;
 +}
-+
 Index: linux-2.6.0/fs/ext3/super.c
 ===================================================================
 --- linux-2.6.0.orig/fs/ext3/super.c   2003-12-31 00:33:49.000000000 +0300
index d38fb54..ae22210 100644 (file)
@@ -1,7 +1,7 @@
-Index: linux-2.6.5-suse/fs/ext3/mballoc.c
+Index: linux-stage/fs/ext3/mballoc.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/mballoc.c    2005-03-02 22:42:20.659360368 +0300
-+++ linux-2.6.5-suse/fs/ext3/mballoc.c 2005-03-11 16:13:13.000000000 +0300
+--- linux-stage.orig/fs/ext3/mballoc.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-stage/fs/ext3/mballoc.c      2005-07-28 16:10:14.951971768 -0400
 @@ -0,0 +1,1864 @@
 +/*
 + * Copyright(c) 2003, 2004, 2005, Cluster File Systems, Inc, info@clusterfs.com
@@ -1850,27 +1850,27 @@ Index: linux-2.6.5-suse/fs/ext3/mballoc.c
 +}
 +
 +
-+extern void ext3_free_blocks_old(handle_t *, struct inode *,
-+                              unsigned long, unsigned long);
-+void ext3_free_blocks(handle_t *handle, struct inode * inode,
++extern void ext3_free_blocks_old(handle_t *handle, struct inode *inode,
++                               unsigned long block, unsigned long count);
++void ext3_free_blocks(handle_t *handle, struct inode *inode,
 +                      unsigned long block, unsigned long count, int metadata)
 +{
 +      int freed;
 +
-+      if (!test_opt(inode->i_sb, MBALLOC))
++      if (!test_opt(inode->i_sb, MBALLOC) ||
++          EXT3_SB(inode->i_sb)->s_buddy_blocks == NULL)
 +              ext3_free_blocks_old(handle, inode, block, count);
 +      else {
-+              ext3_mb_free_blocks(handle, inode, block, count, metadata, &freed);
++              ext3_mb_free_blocks(handle, inode, block,count,metadata,&freed);
 +              if (freed)
 +                      DQUOT_FREE_BLOCK(inode, freed);
 +      }
 +      return;
 +}
-+
-Index: linux-2.6.5-suse/fs/ext3/super.c
+Index: linux-stage/fs/ext3/super.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/super.c      2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/super.c   2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/super.c   2005-07-28 16:09:49.624822080 -0400
++++ linux-stage/fs/ext3/super.c        2005-07-28 16:10:14.952971616 -0400
 @@ -389,6 +389,7 @@
        struct ext3_super_block *es = sbi->s_es;
        int i;
@@ -1921,10 +1921,10 @@ Index: linux-2.6.5-suse/fs/ext3/super.c
  
        return 0;
  
-Index: linux-2.6.5-suse/fs/ext3/Makefile
+Index: linux-stage/fs/ext3/Makefile
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/Makefile     2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/Makefile  2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/Makefile  2005-07-28 16:09:49.623822232 -0400
++++ linux-stage/fs/ext3/Makefile       2005-07-28 16:10:14.953971464 -0400
 @@ -5,7 +5,7 @@
  obj-$(CONFIG_EXT3_FS) += ext3.o
  
@@ -1934,10 +1934,10 @@ Index: linux-2.6.5-suse/fs/ext3/Makefile
  
  ext3-$(CONFIG_EXT3_FS_XATTR)   += xattr.o xattr_user.o xattr_trusted.o
  ext3-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o
-Index: linux-2.6.5-suse/fs/ext3/balloc.c
+Index: linux-stage/fs/ext3/balloc.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/balloc.c     2005-02-02 00:55:47.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/balloc.c  2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/balloc.c  2005-07-28 16:09:46.411310608 -0400
++++ linux-stage/fs/ext3/balloc.c       2005-07-28 16:10:14.954971312 -0400
 @@ -78,7 +78,7 @@
   *
   * Return buffer_head on success or NULL in case of failure.
@@ -1965,10 +1965,10 @@ Index: linux-2.6.5-suse/fs/ext3/balloc.c
                        unsigned long goal, int *errp)
  {
        struct buffer_head *bitmap_bh = NULL;
-Index: linux-2.6.5-suse/fs/ext3/namei.c
+Index: linux-stage/fs/ext3/namei.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/namei.c      2005-02-26 18:40:19.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/namei.c   2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/namei.c   2005-07-28 16:09:48.092055096 -0400
++++ linux-stage/fs/ext3/namei.c        2005-07-28 16:10:14.955971160 -0400
 @@ -1640,7 +1640,7 @@
   * If the create succeeds, we fill in the inode information
   * with d_instantiate(). 
@@ -1978,10 +1978,10 @@ Index: linux-2.6.5-suse/fs/ext3/namei.c
                struct nameidata *nd)
  {
        handle_t *handle; 
-Index: linux-2.6.5-suse/fs/ext3/inode.c
+Index: linux-stage/fs/ext3/inode.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/inode.c      2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/inode.c   2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/inode.c   2005-07-28 16:09:49.622822384 -0400
++++ linux-stage/fs/ext3/inode.c        2005-07-28 16:10:14.958970704 -0400
 @@ -572,7 +572,7 @@
                ext3_journal_forget(handle, branch[i].bh);
        }
@@ -2000,7 +2000,7 @@ Index: linux-2.6.5-suse/fs/ext3/inode.c
        return err;
  }
  
-@@ -1830,7 +1830,7 @@
+@@ -1835,7 +1835,7 @@
                }
        }
  
@@ -2009,7 +2009,7 @@ Index: linux-2.6.5-suse/fs/ext3/inode.c
  }
  
  /**
-@@ -2001,7 +2001,7 @@
+@@ -2006,7 +2006,7 @@
                                ext3_journal_test_restart(handle, inode);
                        }
  
@@ -2018,11 +2018,11 @@ Index: linux-2.6.5-suse/fs/ext3/inode.c
  
                        if (parent_bh) {
                                /*
-Index: linux-2.6.5-suse/fs/ext3/extents.c
+Index: linux-stage/fs/ext3/extents.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/extents.c    2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/extents.c 2005-02-26 18:40:26.000000000 +0300
-@@ -774,7 +774,7 @@
+--- linux-stage.orig/fs/ext3/extents.c 2005-07-28 16:09:49.619822840 -0400
++++ linux-stage/fs/ext3/extents.c      2005-07-28 16:10:14.960970400 -0400
+@@ -771,7 +771,7 @@
                for (i = 0; i < depth; i++) {
                        if (!ablocks[i])
                                continue;
@@ -2031,8 +2031,8 @@ Index: linux-2.6.5-suse/fs/ext3/extents.c
                }
        }
        kfree(ablocks);
-@@ -1431,7 +1431,7 @@
-                       path->p_idx->ei_leaf);
+@@ -1428,7 +1428,7 @@
+                 path->p_idx->ei_leaf);
        bh = sb_find_get_block(tree->inode->i_sb, path->p_idx->ei_leaf);
        ext3_forget(handle, 1, tree->inode, bh, path->p_idx->ei_leaf);
 -      ext3_free_blocks(handle, tree->inode, path->p_idx->ei_leaf, 1);
@@ -2040,7 +2040,7 @@ Index: linux-2.6.5-suse/fs/ext3/extents.c
        return err;
  }
  
-@@ -1919,10 +1919,12 @@
+@@ -1913,10 +1913,12 @@
        int needed = ext3_remove_blocks_credits(tree, ex, from, to);
        handle_t *handle = ext3_journal_start(tree->inode, needed);
        struct buffer_head *bh;
@@ -2054,7 +2054,7 @@ Index: linux-2.6.5-suse/fs/ext3/extents.c
        if (from >= ex->ee_block && to == ex->ee_block + ex->ee_len - 1) {
                /* tail removal */
                unsigned long num, start;
-@@ -1934,7 +1936,7 @@
+@@ -1928,7 +1930,7 @@
                        bh = sb_find_get_block(tree->inode->i_sb, start + i);
                        ext3_forget(handle, 0, tree->inode, bh, start + i);
                }
@@ -2062,12 +2062,12 @@ Index: linux-2.6.5-suse/fs/ext3/extents.c
 +              ext3_free_blocks(handle, tree->inode, start, num, metadata);
        } else if (from == ex->ee_block && to <= ex->ee_block + ex->ee_len - 1) {
                printk("strange request: removal %lu-%lu from %u:%u\n",
-                       from, to, ex->ee_block, ex->ee_len);
-Index: linux-2.6.5-suse/fs/ext3/xattr.c
+                      from, to, ex->ee_block, ex->ee_len);
+Index: linux-stage/fs/ext3/xattr.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/xattr.c      2005-02-26 18:40:22.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/xattr.c   2005-02-26 18:40:26.000000000 +0300
-@@ -1366,7 +1366,7 @@
+--- linux-stage.orig/fs/ext3/xattr.c   2005-07-28 16:09:48.855938968 -0400
++++ linux-stage/fs/ext3/xattr.c        2005-07-28 16:10:43.588618336 -0400
+@@ -1371,7 +1371,7 @@
                        new_bh = sb_getblk(sb, block);
                        if (!new_bh) {
  getblk_failed:
@@ -2076,7 +2076,7 @@ Index: linux-2.6.5-suse/fs/ext3/xattr.c
                                error = -EIO;
                                goto cleanup;
                        }
-@@ -1408,7 +1408,7 @@
+@@ -1411,7 +1411,7 @@
                if (HDR(old_bh)->h_refcount == cpu_to_le32(1)) {
                        /* Free the old block. */
                        ea_bdebug(old_bh, "freeing");
@@ -2085,19 +2085,19 @@ Index: linux-2.6.5-suse/fs/ext3/xattr.c
  
                        /* ext3_forget() calls bforget() for us, but we
                           let our caller release old_bh, so we need to
-@@ -1504,7 +1504,7 @@
-       lock_buffer(bh);
-       if (HDR(bh)->h_refcount == cpu_to_le32(1)) {
-               ext3_xattr_cache_remove(bh);
+@@ -1519,7 +1519,7 @@
+                       mb_cache_entry_free(ce);
+                       ce = NULL;
+               }
 -              ext3_free_blocks(handle, inode, EXT3_I(inode)->i_file_acl, 1);
 +              ext3_free_blocks(handle, inode, EXT3_I(inode)->i_file_acl, 1, 1);
                get_bh(bh);
                ext3_forget(handle, 1, inode, bh, EXT3_I(inode)->i_file_acl);
        } else {
-Index: linux-2.6.5-suse/include/linux/ext3_fs.h
+Index: linux-stage/include/linux/ext3_fs.h
 ===================================================================
---- linux-2.6.5-suse.orig/include/linux/ext3_fs.h      2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/include/linux/ext3_fs.h   2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/include/linux/ext3_fs.h   2005-07-28 16:09:49.626821776 -0400
++++ linux-stage/include/linux/ext3_fs.h        2005-07-28 16:10:14.962970096 -0400
 @@ -57,6 +57,14 @@
  #define ext3_debug(f, a...)   do {} while (0)
  #endif
@@ -2121,7 +2121,7 @@ Index: linux-2.6.5-suse/include/linux/ext3_fs.h
  
  /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
  #ifndef clear_opt
-@@ -698,7 +707,7 @@
+@@ -700,7 +709,7 @@
  extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group);
  extern int ext3_new_block (handle_t *, struct inode *, unsigned long, int *);
  extern void ext3_free_blocks (handle_t *, struct inode *, unsigned long,
@@ -2130,7 +2130,7 @@ Index: linux-2.6.5-suse/include/linux/ext3_fs.h
  extern unsigned long ext3_count_free_blocks (struct super_block *);
  extern void ext3_check_blocks_bitmap (struct super_block *);
  extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb,
-@@ -820,6 +829,37 @@
+@@ -822,6 +831,37 @@
  extern int ext3_ext_ioctl(struct inode *inode, struct file *filp,
                          unsigned int cmd, unsigned long arg);
  
@@ -2168,10 +2168,10 @@ Index: linux-2.6.5-suse/include/linux/ext3_fs.h
  #endif        /* __KERNEL__ */
  
  #define EXT3_IOC_CREATE_INUM                  _IOW('f', 5, long)
-Index: linux-2.6.5-suse/include/linux/ext3_fs_sb.h
+Index: linux-stage/include/linux/ext3_fs_sb.h
 ===================================================================
---- linux-2.6.5-suse.orig/include/linux/ext3_fs_sb.h   2005-02-26 18:40:20.000000000 +0300
-+++ linux-2.6.5-suse/include/linux/ext3_fs_sb.h        2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/include/linux/ext3_fs_sb.h        2005-07-28 16:09:48.346016488 -0400
++++ linux-stage/include/linux/ext3_fs_sb.h     2005-07-28 16:10:14.963969944 -0400
 @@ -23,10 +23,30 @@
  #define EXT_INCLUDE
  #include <linux/blockgroup_lock.h>
index 24b2595..c8b3e48 100644 (file)
@@ -4,7 +4,7 @@ Index: linux-stage/fs/ext3/mballoc.c
 +++ linux-stage/fs/ext3/mballoc.c      2005-02-25 17:28:41.859307576 +0200
 @@ -0,0 +1,1861 @@
 +/*
-+ * Copyright (c) 2003, Cluster File Systems, Inc, info@clusterfs.com
++ * Copyright(c) 2003, 2004, 2005, Cluster File Systems, Inc, info@clusterfs.com
 + * Written by Alex Tomas <alex@clusterfs.com>
 + *
 + * This program is free software; you can redistribute it and/or modify
@@ -110,7 +110,7 @@ Index: linux-stage/fs/ext3/mballoc.c
 +      struct super_block *ac_sb;
 +
 +      /* search goals */
-+struct ext3_free_extent ac_g_ex;
++      struct ext3_free_extent ac_g_ex;
 +      
 +      /* the best found extent */
 +      struct ext3_free_extent ac_b_ex;
@@ -471,7 +471,7 @@ Index: linux-stage/fs/ext3/mballoc.c
 +}
 +
 +static int mb_find_extent(struct ext3_buddy *e3b, int order, int block,
-+                              int needed, struct ext3_free_extent *ex)
++                        int needed, struct ext3_free_extent *ex)
 +{
 +      int next, max, ord;
 +      void *buddy;
@@ -1849,17 +1849,17 @@ Index: linux-stage/fs/ext3/mballoc.c
 +      return ret;
 +}
 +
-+void ext3_free_blocks(handle_t *handle, struct inode * inode,
-+                      unsigned long block, unsigned long count, int metadata)
++void ext3_free_blocks(handle_t *handle, struct inode *inode,
++                    unsigned long block, unsigned long count, int metadata)
 +{
-+      struct super_block *sb;
 +      int freed;
 +
-+      sb = inode->i_sb;
-+      if (!test_opt(sb, MBALLOC))
-+              ext3_free_blocks_sb(handle, sb, block, count, &freed);
++      if (!test_opt(inode->i_sb, MBALLOC) ||
++          EXT3_SB(inode->i_sb)->s_buddy_blocks == NULL)
++              ext3_free_blocks_sb(handle, inode->i_sb, block, count, &freed);
 +      else
-+              ext3_mb_free_blocks(handle, inode, block, count, metadata, &freed);
++              ext3_mb_free_blocks(handle, inode, block,count,metadata,&freed);
++
 +      if (freed)
 +              DQUOT_FREE_BLOCK(inode, freed);
 +      return;
index 0980162..8e76197 100644 (file)
@@ -9,4 +9,5 @@ ext3-include-fixes-2.6-rhel4.patch
 ext3-extents-2.6.9-rhel4.patch
 ext3-mballoc2-2.6.9-rhel4.patch 
 ext3-nlinks-2.6.7.patch
-ext3-htree-dot-2.6.patch
+ext3-htree-dot-2.6.patch 
+ext3-ialloc-2.6.patch
index c44eea3..2584c1d 100644 (file)
@@ -10,4 +10,5 @@ ext3-extents-2.6.5.patch
 ext3-mballoc2-2.6-suse.patch
 ext3-nlinks-2.6.7.patch
 ext3-rename-reserve-2.6-suse.patch
-ext3-htree-dot-2.6.5-suse.patch
+ext3-htree-dot-2.6.5-suse.patch 
+ext3-ialloc-2.6.patch
index 53ca41e..0eff073 100644 (file)
@@ -38,7 +38,7 @@ sources: $(ext3_sources) $(ext3_headers) $(linux_headers) $(series)
        cp $(ext3_sources) $(ext3_headers) $(ext3_extra) linux-stage/fs/ext3
        cp $(linux_headers) linux-stage/include/linux
 if USE_QUILT
-       cd linux-stage && quilt setup -l ../$(series) -d ../$(patches)
+       cd linux-stage && quilt setup -d ../$(patches) ../$(series)
        cd linux-stage && quilt push -a -q
 else
        @echo -n "Applying ext3 patches:"
index 0fb9dff..20c2804 100644 (file)
 tbd         Cluster File Systems, Inc. <info@clusterfs.com>
-       * version 1.4.4
+       * version 1.4.6
        * bug fixes
 
+Severity   : major
+Frequency  : rare
+Bugzilla   : 7407
+Description: Running on many-way SMP OSTs can trigger oops in llcd_send()
+Details    : A race between allocating a new llcd and re-getting the llcd_lock
+            allowed another thread to grab newly-allocated llcd.
+
+Severity   : enhancement
+Bugzilla   : 7116
+Description: 2.6 OST async journal commit and locking fix to improve performance
+Details    : The filter_direct_io()+filter_commitrw_write() journal commits for
+            2.6 kernels are now async as they already were in 2.4 kernels so
+            that they can commit concurrently with the network bulk transfer.
+            For block-allocated files the filter allocation semaphore is held
+            to avoid filesystem fragmentation during allocation.  BKL lock
+            removed for 2.6 xattr operations where it is no longer needed.
+
 Severity   : minor
-Frequency  : Clusters with multiple interfaces not on the same subnet
-Bugzilla   : 5541
-Description: Nodes will repeatedly try to reconnect to an interface which it
-             cannot reach and report an error to the log.
-Details    : Extra peer list entries will be created by lconf with some peers
-             unreachable.  lconf now validates the peer before adding it.
+Frequency  : rare
+Bugzilla   : 8320
+Description: lconf incorrectly determined whether two IP networks could talk
+Details    : In some more complicated routing and multiple-network
+            configurations, lconf will avoid trying to make a network
+            connection to a disjoint part of the IP space.  It was doing the
+            math incorrectly for one set of cases.
 
 Severity   : major
-Frequency  : Only if a default stripe is set on the filesystem root.
-Bugzilla   : 6367
-Description: Setting a default stripe on the filesystem root prevented the
-             filesystem from being remounted.
-Details    : The client was sending extra request flags in the root getattr
-             request and did not allocate a reply buffer for the dir EA.
+Frequency  : rare
+Bugzilla   : 7359
+Description: Fix for potential infinite loop processing records in an llog.
+Details    : If an llog record is corrupted/zeroed, it is possible to loop
+            forever in llog_process().  Validate the llog record length
+            and skip the remainder of the block on error.
+
+Severity   : minor
+Frequency  : occasional (liblustre only)
+Bugzilla   : 6363
+Description: liblustre could not open files whose last component is a symlink
+Details    : sysio_path_walk() would incorrectly pass the open intent to
+            intermediate path components.
+
+Severity   : minor
+Frequency  : rare (liblustre only with non-standard tuning)
+Bugzilla   : 7201 (7350)
+Description: Tuning the MDC DLM LRU size to zero triggers client LASSERT
+Details    : llu_lookup_finish_locks() tries to set lock data on a lock
+            after it has been released, only do this for referenced locks
+
+Severity   : enhancement
+Bugzilla   : 7328
+Description: specifying an (invalid) directory default stripe_size of -1
+            would reset the directory default striping
+Details    : stripe_size -1 was used internally to signal directory stripe
+            removal, now use "all default" to signal dir stripe removal
+            as a directory striping of "all default" is not useful
+
+Severity   : minor
+Frequency  : common for large clusters running liblustre clients
+Bugzilla   : 7198
+Description: doing an ls when liblustre clients are running is slow
+Details    : sending a glimpse AST to a liblustre client waits for every AST
+            to time out, as liblustre clients will not respond.  Since they
+            cannot cache data we refresh the OST lock LVB from disk instead.
+
+------------------------------------------------------------------------------
+
+08-26-2005  Cluster File Systems, Inc. <info@clusterfs.com>
+       * version 1.4.5
+       * bug fixes
 
 Severity   : major
-Frequency  : occasional, higher if lots of files are accessed by one client
-Bugzilla   : 6159, 6097
-Description: Client trips assertion regarding lsm mismatch/magic
-Details    : While revalidating inodes the VFS looks up inodes with ifind()
-             and in rare cases can find an inode that is being freed.
-             The ll_test_inode() code will free the lsm during ifind()
-             when it finds an existing inode and then the VFS later attaches
-             this free lsm to a new inode.
+Frequency  : rare
+Bugzilla   : 7264
+Description: Mounting an ldiskfs file system with mballoc may crash OST node.
+Details    : ldiskfs mballoc code may reference an uninitialized buddy struct
+            at startup during orphan unlinking.  Instead, skip buddy update
+            before setup, as it will be regenerated after recovery is complete.
 
 Severity   : minor
-Frequency  : occasional
-Description: While starting a server, the fsfilt_ext3 module could not be 
-             loaded.
-Details    : CFS's improved ext3 filesystem is named ldiskfs for 2.6
-             kernels.  Previously, lconf would still use the ext3 name
-             when trying to load modules.  Now, it will correctly use
-             ext3 on 2.4 and ldiskfs on 2.6.
+Frequency  : rare
+Bugzilla   : 7039
+Description: If an OST is inactive, its locks might reference stale inodes.
+Details    : lov_change_cbdata() must iterate over all namespaces, even if
+            they are inactive to clear inode references from the lock.
 
 Severity   : enhancement
-Description: The default stripe count has been changed to 1
-Details    : The interpretation of the default stripe count (0, to lfs
-             or lmc) has been changed to mean striping across a single
-             OST, rather than all available.  For general usage we have
-             found a stripe count of 1 or 2 works best.
+Frequency  : occasional, if non-standard max_dirty_mb used
+Bugzilla   : 7138
+Description: Client will block write RPCs if not enough grant
+Details    : If a client has max_dirty_mb smaller than max_rpcs_in_flight,
+            then the client will block writes while waiting for another RPC
+            to complete instead of consuming its dirty limit.  With change
+            we get improved performance when max_dirty_mb is small.
+
+Severity   : enhancement
+Bugzilla   : 3389, 6253
+Description: Add support for supplementary groups on the MDS.
+Details    : The MDS has an upcall /proc/fs/lustre/mds/{mds}/group_upcall
+            (set to /usr/sbin/l_getgroups if enabled) which will do MDS-side
+            lookups for user supplementary groups into a cache.
+
+Severity   : minor
+Bugzilla   : 7278
+Description: O_CREAT|O_EXCL open flags in liblustre always return -EEXIST
+Details    : Make libsysio to not enforce O_EXCL by clearing the flag,
+             for liblustre O_EXCL is enforced by MDS.
+
+Severity   : minor
+Bugzilla   : 6455
+Description: readdir never returns NULL in liblustre.
+Details    : Corrected llu_iop_getdirentries logic, to return offset of next
+             dentry in struct dirent.
+
+Severity   : minor
+Bugzilla   : 7137
+Frequency  : liblustre only, depends on application IO pattern
+Description: liblustre clients evicted if not contacting servers
+Details    : Don't put liblustre clients into the ping_evictor list, so
+             they will not be evicted by the pinger ever.
+
+Severity   : enhancement
+Bugzilla   : 6902
+Description: Add ability to evict clients by NID from MDS.
+Details    : By echoing "nid:$NID" string into
+             /proc/fs/lustre/mds/.../evict_client client with nid that equals to
+             $NID would be instantly evicted from this MDS and from all active
+             OSTs connected to it.
+
+Severity   : minor
+Bugzilla   : 7198
+Description: Do not query file size twice, somewhat slowing stat(2) calls.
+Details    : lookup_it_finish() used to query file size from OSTs that was not
+             needed.
+
+Severity   : minor
+Bugzilla   : 6237
+Description: service threads change working directory to that of init
+Details    : Starting lustre service threads may pin the working directory
+             of the parent thread, making that filesystem busy.  Threads
+             now change to the working directory of init to avoid this.
+
+Severity   : minor
+Bugzilla   : 6827
+Frequency  : during shutdown only
+Description: shutdown with a failed MDS or OST can cause unmount to hang
+Details    : Don't resend DISCONNECT messages in ptlrpc_disconnect_import()
+             if server is down.
+
+Severity   : minor
+Bugzilla   : 7331
+Frequency  : 2.6 only
+Description: chmod/chown may include an extra supplementary group
+Details    : ll{,u}_mdc_pack_op_data() does not properly initialize the
+             supplementary group and if none is specified this is used.
+
+Severity   : minor
+Bugzilla   : 5479 (6816)
+Frequency  : rare
+Description: Racing open + rm can assert client in mdc_set_open_replay_data()
+Details    : If lookup is in progress on a file that is unlinked we might try
+             to revalidate the inode and fail in revalidate after lookup is
+             complete and ll_file_open() enqueues the open again but
+             it_open_error() was not checking DISP_OPEN_OPEN errors correctly.
+
+------------------------------------------------------------------------------
+
+2005-08-08  Cluster File Systems, Inc. <info@clusterfs.com>
+       * version 1.4.4
+       * bug fixes
 
 Severity   : major
-Frequency  : occasional
-Bugzilla   : 6409, 6834
-Description: Creating files with an explicit stripe count may lead to
-             a failed assertion on the MDS
-Details    : If some OSTs are full or unavailable, creating files may
-             trigger a failed assertion on the MDS.  Now, Lustre will
-             try to use other servers or return an error to the
-             client.
+Frequency  : rare (only unsupported configurations with a node running as an 
+             OST and a client)
+Bugzilla   : 6514, 5137
+Description: Mounting a Lustre file system on a node running as an OST could
+             lead to deadlocks
+Details    : OSTs now allocate memory needed to write out data at
+             startup, instead of when needed, to avoid having to
+             allocate memory in possibly low memory situations.
+             Specifically, if the file system is mounted on on OST,
+             memory pressure could force it to try to write out data,
+             which it needed to allocate memory to do.  Due to the low
+             memory, it would be unable to do so and the node would
+             become unresponsive.
+
+Severity   : enhancement
+Bugzilla   : 7015
+Description: Addition of lconf --service command line option
+Details    : lconf now accepts a '--service <arg>' option, which is
+             shorthand for 'lconf --group <arg> --select <arg>=<hostname>'
+
+Severity   : enhancement
+Bugzilla   : 6101
+Description: Failover mode is now the default for OSTs.
+Details    : By default, OSTs will now run in failover mode.  To return to
+             the old behaviour, add '--failout' to the lmc line for OSTs.
+
+Severity   : enhancement
+Bugzilla   : 1693
+Description: Health checks are now provided for MDS and OSTs
+Details    : Additional detailed health check information on MSD and OSTs   
+             is now provided through the procfs health_check value.
 
 Severity   : minor
-Frequency  : occasional
-Bugzilla   : 6469
-Description: Multiple concurrent overlapping read+write on multiple SMP nodes
-             caused lock timeout during readahead (since 1.4.2).
-Details    : Processes doing readahead might match a lock that hasn't been
-             granted yet if there are overlapping and conflicting lock
-             requests.  The readahead process waits on ungranted lock
-            (original lock is CBPENDING), while OST waits for that process
-            to cancel CBPENDING read lock and eventually evicts client.
+Frequency  : occasional, depends on IO load
+Bugzilla   : 4466
+Description: Disk fragmentation on the OSTs could eventually cause slowdowns
+             after numerous create/delete cycles
+Details    : The ext3 inode allocation policy would not allocate new inodes
+             very well on the OSTs because there are no new directories
+             being created.  Instead we look for groups with free space if
+             the parent directories are nearly full.
+
+Severity   : major
+Bugzilla   : 6302
+Frequency  : rare
+Description: Network or server problems during mount may cause partially
+             mounted clients instead of returning an error.
+Details    : The config llog parsing code may overwrite the error return
+             code during mount error handling, returning success instead
+             of an error.
+
+Severity   : minor
+Bugzilla   : 6266
+Frequency  : rare (liblustre)
+Description: fsx running with liblustre complained that using truncate() to
+             extend the file doesn't work.  This patch corrects that issue.
+Details    : This is the liblustre equivalent of the fix for bug 6196.  Fixes
+             ATTR_SIZE and lsm use in llu_setattr_raw.
+
+Severity   : critical
+Bugzilla   : 6866
+Frequency  : rare, only 2.6 kernels
+Description: Unusual file access patterns on the MDS may result in inode
+             data being lost in very rare circumstances.
+Details    : Bad interaction between the ea-in-inode patch and the "no-read"
+             code in the 2.6 kernel caused the inode and/or EA data not to
+             be read from disk, causing single-file corruption.
+
+Severity   : critical
+Bugzilla   : 6998
+Frequency  : rare, only 2.6 filesystems using extents
+Description: Heavy concurrent write and delete load may cause data corruption.
+Details    : It was possible under high-load situations to have an extent
+             metadata block in the block device cache from a just-unlinked
+             file overwrite a newly-allocated data block.  We now unmap any
+             metadata buffers that alias just-allocated data blocks.
+
+Severity   : minor
+Bugzilla   : 7241
+Frequency  : filesystems with default stripe_count larger than 77 
+Description: lconf+mke2fs fail when formatting filesystem with > 77 stripes
+Details    : lconf specifies an inode size of 4096 bytes when the default
+             stripe_count is larger than 77.  This conflicts with the default
+             inode density of 1 per 4096 bytes.  Allocate smaller inodes in
+             this case to avoid pinning too much memory for large EAs.
 
 ------------------------------------------------------------------------------
 
-2005-06-20  Cluster File Systems, Inc. <info@clusterfs.com>
+2005-07-07  Cluster File Systems, Inc. <info@clusterfs.com>
        * version 1.4.3
        * bug fixes
 
@@ -164,7 +358,108 @@ Description: NFSD failed occasionally when looking up a path component
 Details    : NFSD is looking up ".." which was broken in ext3 directories
              that had grown large enough to become hashed.
 
-------------------------------------------------------------------------------
+Severity   : minor
+Frequency  : Clusters with multiple interfaces not on the same subnet
+Bugzilla   : 5541
+Description: Nodes will repeatedly try to reconnect to an interface which it
+             cannot reach and report an error to the log.
+Details    : Extra peer list entries will be created by lconf with some peers
+             unreachable.  lconf now validates the peer before adding it.
+
+Severity   : major
+Frequency  : Only if a default stripe is set on the filesystem root.
+Bugzilla   : 6367
+Description: Setting a default stripe on the filesystem root prevented the
+             filesystem from being remounted.
+Details    : The client was sending extra request flags in the root getattr
+             request and did not allocate a reply buffer for the dir EA.
+
+Severity   : major
+Frequency  : occasional, higher if lots of files are accessed by one client
+Bugzilla   : 6159, 6097
+Description: Client trips assertion regarding lsm mismatch/magic
+Details    : While revalidating inodes the VFS looks up inodes with ifind()
+             and in rare cases can find an inode that is being freed.
+             The ll_test_inode() code will free the lsm during ifind()
+             when it finds an existing inode and then the VFS later attaches
+             this free lsm to a new inode.
+
+Severity   : major
+Frequency  : rare
+Bugzilla   : 6422, 7030
+Description: MDS deadlock between mkdir and client eviction
+Details    : Creating a new file via mkdir or mknod (starting a transaction
+             and getting the ns lock) can deadlock with client eviction
+             (gets ns lock and trying to finish a synchronous transaction).
+
+Severity   : minor
+Frequency  : occasional
+Description: While starting a server, the fsfilt_ext3 module could not be 
+             loaded.
+Details    : CFS's improved ext3 filesystem is named ldiskfs for 2.6
+             kernels.  Previously, lconf would still use the ext3 name
+             when trying to load modules.  Now, it will correctly use
+             ext3 on 2.4 and ldiskfs on 2.6.
+
+Severity   : enhancement
+Description: The default stripe count has been changed to 1
+Details    : The interpretation of the default stripe count (0, to lfs
+             or lmc) has been changed to mean striping across a single
+             OST, rather than all available.  For general usage we have
+             found a stripe count of 1 or 2 works best.
+
+Severity   : enhancement
+Description: Add support for compiling against Cray portals.
+Details    : Conditional compiling for some areas that are different
+             on Cray Portals.
+
+Severity   : major
+Frequency  : occasional
+Bugzilla   : 6409, 6834
+Description: Creating files with an explicit stripe count may lead to
+             a failed assertion on the MDS
+Details    : If some OSTs are full or unavailable, creating files may
+             trigger a failed assertion on the MDS.  Now, Lustre will
+             try to use other servers or return an error to the
+             client.
+
+Severity   : minor
+Frequency  : occasional
+Bugzilla   : 6469
+Description: Multiple concurrent overlapping read+write on multiple SMP nodes
+             caused lock timeout during readahead (since 1.4.2).
+Details    : Processes doing readahead might match a lock that hasn't been
+             granted yet if there are overlapping and conflicting lock
+             requests.  The readahead process waits on ungranted lock
+             (original lock is CBPENDING), while OST waits for that process
+             to cancel CBPENDING read lock and eventually evicts client.
+
+Severity   : enhancement
+Bugzilla   : 6931
+Description: Initial enabling of flock support for clients
+Details    : Implements fcntl advisory locking and file status functions.
+            This feature is provided as an optional mount flag (default
+            off), and is NOT CURRENTLY SUPPORTED.  Not all types of record
+            locking are implemented yet, and those that are are not guaranteed
+            to be completely correct in production environments.
+            mount -t lustre -o [flock|noflock] ...
+
+Severity   : major
+Frequency  : occasional
+Bugzilla   : 6198
+Description: OSTs running 2.4 kernels but with extents enabled might trip an
+             assertion in the ext3 JBD (journaling) layer.
+Details    : The b_committed_data struct is protected by the big kernel lock
+             in 2.4 kernels, serializing journal_commit_transaction() and
+             ext3_get_block_handle->ext3_new_block->find_next_usable_block()
+             access to this struct.  In 2.6 kernels there is finer grained
+             locking to improve SMP performance of the JBD layer.
+
+Severity   : minor
+Bugzilla   : 6147
+Description: Changes the "SCSI I/O Stats" kernel patch to default to "enabled"
+
+-----------------------------------------------------------------------------
 
 2005-05-05  Cluster File Systems, Inc. <info@clusterfs.com>
        * version 1.4.2
index 6c14df9..edb73cd 100644 (file)
@@ -1,18 +1,18 @@
-Each file in this distribution should contain a header stating the
-copyright owner(s), and the licensing terms for that module.  Some
-files are not eligible for copyright protection, and contain neither.
-
-There are many files which may be covered by a separate Evaluation
-License Agreement that you may have signed before downloading this
-software.  If you did not sign such an agreement, or if the file does
-not mention that license, then you can redistribute and/or modify it
-under the terms of version 2 of the GNU General Public License.
-Each file is very clear about which license is applicable.
-
-In any case, Lustre is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied warranty
-of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-license text for more details.
+Each file in this distribution contains a header stating the copyright
+owner(s), and the licensing terms for that file.  Some files are not
+eligible for copyright protection, and contain neither.
+
+There are many files which may be covered by a separate license that
+you signed or otherwise agreed to before downloading this software.
+If you did not agree to such an agreement, or if the file does not
+mention that license, then you can redistribute and/or modify it under
+the terms of version 2 of the GNU General Public License.  Each file
+is very clear about which license is applicable.
+
+In any case, Lustre is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the license
+text for more details.
 
 Reproduced below is the GNU General Public License version 2, and
 Linus's clarifying statement from the Linux kernel source code:
index 91ca0e1..75132e2 100644 (file)
@@ -32,7 +32,8 @@ endif
 SUBDIRS += $(LIBLUSTRE_SUBDIRS)
 endif
 
-DIST_SUBDIRS := $(ALWAYS_SUBDIRS) $(SERVER_SUBDIRS) $(CLIENT_SUBDIRS) $(LIBLUSTRE_SUBDIRS)
+DIST_SUBDIRS := $(ALWAYS_SUBDIRS) $(SERVER_SUBDIRS) $(CLIENT_SUBDIRS)  \
+       $(LIBLUSTRE_SUBDIRS)
 
 EXTRA_DIST = BUGS FDL kernel_patches
 
@@ -62,7 +63,7 @@ CSTKO=/tmp/checkstack.orig
 
 checkstack:
        [ -f ${CSTK} -a ! -s ${CSTKO} ] && mv ${CSTK} ${CSTKO} || true
-       for i in ${SUBDIRS} portals/knals/*; do                              \
+       for i in ${SUBDIRS} lnet/klnds/*; do                                 \
                MOD=$$i/`basename $$i`.o;                                    \
                [ -f $$MOD ] && objdump -d $$MOD | perl tests/checkstack.pl; \
        done | sort -nr > ${CSTK}
index e1f502f..2b3db18 100644 (file)
@@ -65,7 +65,7 @@ LB_LINUX_CONFIG([EXT3_FS_XATTR],[$1],[$3])
 # If we have (and can build) fshooks.h
 #
 AC_DEFUN([LC_FSHOOKS],
-[AC_CHECK_FILE([$LINUX/include/linux/fshooks.h],[
+[LB_CHECK_FILE([$LINUX/include/linux/fshooks.h],[
        AC_MSG_CHECKING([if fshooks.h can be compiled])
        LB_LINUX_TRY_COMPILE([
                #include <linux/fshooks.h>
@@ -303,21 +303,13 @@ fi
 #
 # LC_CONFIG_BACKINGFS
 #
-# whether to use extN or ldiskfs instead of ext3
+# whether to use ldiskfs instead of ext3
 #
 AC_DEFUN([LC_CONFIG_BACKINGFS],
 [
 BACKINGFS='ext3'
 
-# LLNL patches their ext3 and calls it extN
-AC_MSG_CHECKING([whether to use extN])
-AC_ARG_ENABLE([extN],
-       AC_HELP_STRING([--enable-extN],
-                       [use extN instead of ext3 for lustre backend]),
-       [BACKINGFS='extN'],[enable_extN='no'])
-AC_MSG_RESULT([$enable_extN])
-
-# SuSE gets ldiskfs
+# 2.6 gets ldiskfs
 AC_MSG_CHECKING([whether to enable ldiskfs])
 AC_ARG_ENABLE([ldiskfs],
        AC_HELP_STRING([--enable-ldiskfs],
@@ -456,17 +448,30 @@ AC_DEFUN([LC_CONFIG_LIBLUSTRE],
 AC_ARG_ENABLE([liblustre],
        AC_HELP_STRING([--disable-liblustre],
                        [disable building of Lustre library]),
-       [],[enable_liblustre="no"])
+       [],[enable_liblustre=$with_sysio])
 AC_MSG_RESULT([$enable_liblustre])
 # only build sysio if liblustre is built
 with_sysio="$enable_liblustre"
 
+AC_MSG_CHECKING([whether to build liblustre tests])
+AC_ARG_ENABLE([liblustre-tests],
+       AC_HELP_STRING([--enable-liblustre-tests],
+                       [enable liblustre tests, if --disable-tests is used]),
+       [],[enable_liblustre_tests=$enable_tests])
+if test x$enable_liblustre != xyes ; then
+   enable_liblustre_tests='no'
+fi
+AC_MSG_RESULT([$enable_liblustre_tests])
+
 AC_MSG_CHECKING([whether to build mpitests])
 AC_ARG_ENABLE([mpitests],
        AC_HELP_STRING([--enable-mpitests],
                        [build liblustre mpi tests]),
        [],[enable_mpitests=no])
 AC_MSG_RESULT([$enable_mpitests])
+
+AC_MSG_NOTICE([Enabling Lustre configure options for libsysio])
+ac_configure_args="$ac_configure_args --with-lustre-hack --with-sockets"
 ])
 
 #
@@ -482,6 +487,7 @@ AC_CHECK_HEADERS([asm/page.h sys/user.h stdint.h])
 
 # include/lustre/lustre_user.h
 # See note there re: __ASM_X86_64_PROCESSOR_H
+AC_CHECK_HEADERS([linux/quota.h])
 
 AC_CHECK_TYPES([struct if_dqinfo],[],[],[
 #define __ASM_X86_64_PROCESSOR_H
@@ -511,10 +517,8 @@ AC_CHECK_FUNCS([inet_ntoa])
 #
 AC_DEFUN([LC_CONDITIONALS],
 [AM_CONDITIONAL(LIBLUSTRE, test x$enable_liblustre = xyes)
-AM_CONDITIONAL(EXTN, test x$enable_extN = xyes)
 AM_CONDITIONAL(LDISKFS, test x$enable_ldiskfs = xyes)
 AM_CONDITIONAL(USE_QUILT, test x$QUILT != xno)
-AM_CONDITIONAL(LIBLUSTRE, test x$enable_liblustre = xyes)
 AM_CONDITIONAL(LIBLUSTRE_TESTS, test x$enable_liblustre_tests = xyes)
 AM_CONDITIONAL(MPITESTS, test x$enable_mpitests = xyes, Build MPI Tests)
 AM_CONDITIONAL(CLIENT, test x$enable_client = xyes)
index b3d7ec7..37704bb 100644 (file)
@@ -1 +1 @@
-m4_define([LUSTRE_VERSION],[1.4.3.3])
+m4_define([LUSTRE_VERSION],[1.4.5])
index aa16c34..6143c6b 100644 (file)
@@ -1,4 +1,4 @@
-.TH lconf 1 "2003 Oct 8" Lustre "configuration utilities"
+.TH lconf 1 "2004 Sep 16" Lustre "configuration utilities"
 .SH NAME
 lconf \- Lustre filesystem configuration utility
 .SH SYNOPSIS
@@ -14,12 +14,24 @@ lconf \- Lustre filesystem configuration utility
 The arguments that can be used for lconf are:
 .PP
 .TP
+--client_uuid <uuid> 
+The failed client (required for recovery).
+.TP
+--clientoptions <options> 
+Additional options for Lustre.
+.TP
 --config <arg> 
 Cluster configuration name used for LDAP query
 .TP
+--conn_uuid <uuid> 
+The failed connection (required for recovery).
+.TP
 --d|--cleanup 
 Unconfigure a node. The same config and --node argument used for configuration needs to be used for cleanup as well. This will attempt to undo all of the configuration steps done by lconf, including unloading the kernel modules.
 .TP
+--debug_path <path> 
+Path to save debug dumps.
+.TP
 --dump <file> 
 Dump the kernel debug log to the specified file before portals is unloaded during cleanup.
 .TP
@@ -41,6 +53,9 @@ Full name of gdb debug script. Default is /tmp/ogdb.
 --group <arg> 
 The group of devices to cleanup/configure.
 .TP
+--group_upcall <arg> 
+Pathname to the MDS upcall to resolve secondary group membership.  Defaults to NONE, meaning that the MDS will use whatever group the client supplies, but this is limited to a single supplementary group.
+.TP
 -h,--help 
 Print help.
 .TP
@@ -68,6 +83,12 @@ Perform configuration of devices and services up to level given. level can take
 --minlevel <level> 
 Specify the minimum level of services to configure/cleanup. Default is 0.
 .TP
+--mkfsoptions <options> 
+Specify additional options for the mk*fs command line.
+.TP
+--mountfsoptions <options> 
+Specify additional options for mount fs command line. Mount options will be passed by this argument. For example, extents are to be enabled by adding ",extents" to the --mountfsoptions option. "errors=remount-ro" and "asyncdel" can also be added to it.
+.TP
 --node node_name 
 Specify a specific node to configure. By default, lconf will search for nodes with the local hostname and 'localhost'. When --node is used, only node_name is searched for. If a matching node is not found in the config, then lconf exits with an error.
 .TP
@@ -80,12 +101,24 @@ Only setup devices and services, do not load modules.
 --nosetup 
 Only load modules, do not configure devices or services.
 .TP
+--portals <path> 
+Specify portals source directory. If this is a relative path, then it is assumed to be relative to lustre.
+.TP
 --portals_upcall <path> 
 Specify the location of the Portals upcall scripts used by the client for recovery
 .TP
 --ptldebug debug-level 
 This options can be used to set the required debug level.
 .TP
+--record 
+Write config information on mds.
+.TP
+--record_log <arg> 
+Specify the name of config record log.
+.TP
+--record_device <arg> 
+Specify MDS device name that will record the config commands.
+.TP
 --recover <arg> 
 Recover a device.
 .TP
@@ -95,9 +128,15 @@ Reformat all the devices. This is essential on the first time the file system is
 --select <arg> 
 Select a particular node for a service 
 .TP
+--service <arg>
+Shorthand for --group <arg> --select <arg>=<hostname>
+.TP
 --subsystem <arg> 
 Set the portals debug subsystem.
 .TP
+--tgt_uuid <uuid> 
+Specify the failed target (required for recovery).
+.TP
 --timeout <arg> 
 Set the recovery timeout period.
 .TP
index 1c6d878..2846f48 100644 (file)
@@ -56,10 +56,22 @@ This program configures a node following directives in the <XML-config-file>.
  on an LDAP server that can be reached from all the cluster nodes.
 \layout Description
 
+--client_uuid\SpecialChar ~
+<uuid> The failed client (required for recovery).
+\layout Description
+
+--clientoptions\SpecialChar ~
+<options> Additional options for Lustre.
+\layout Description
+
 --config\SpecialChar ~
 <arg> Cluster configuration name used for LDAP query
 \layout Description
 
+--conn_uuid\SpecialChar ~
+<uuid> The failed connection (required for recovery).
+\layout Description
+
 --d|--cleanup Unconfigure a node.
  The same config and 
 \emph on 
@@ -70,6 +82,10 @@ This program configures a node following directives in the <XML-config-file>.
  including unloading the kernel modules.
 \layout Description
 
+--debug_path\SpecialChar ~
+<path> Path to save debug dumps.
+\layout Description
+
 --dump\SpecialChar ~
 <file> Dump the kernel debug log to the specified file before portals
  is unloaded during cleanup.
@@ -106,6 +122,12 @@ This program configures a node following directives in the <XML-config-file>.
 <arg> The group of devices to cleanup/configure.
 \layout Description
 
+--group_upcall\SpecialChar ~
+<arg> Pathname to the MDS upcall to resolve secondary group membership.
+ Defaults to NONE, meaning that the MDS will use whatever group the client
+ supplies, but this is limited to a single supplementary group.
+\layout Description
+
 -h,--help Print help.
 \layout Description
 
@@ -160,6 +182,43 @@ When used in conjunction with cleanup, services are torn down up to a certain
  Default is 0.
 \layout Description
 
+--mkfsoptions\SpecialChar ~
+<options> Specify additional options for the mk*fs command
+ line.
+\layout Description
+
+--mountfsoptions\SpecialChar ~
+<options> Specify additional options for mount fs command
+ line.
+ Mount options will be passed by this argument.
+ For example, extents are to be enabled by adding 
+\begin_inset Quotes eld
+\end_inset 
+
+,extents
+\begin_inset Quotes erd
+\end_inset 
+
+ to the --mountfsoptions option.
+\begin_inset Quotes eld
+\end_inset 
+
+errors=remount-ro
+\begin_inset Quotes erd
+\end_inset 
+
+ and 
+\begin_inset Quotes eld
+\end_inset 
+
+asyncdel
+\begin_inset Quotes erd
+\end_inset 
+
+ can also be added to it.
+\layout Description
+
 --node\SpecialChar ~
 node_name Specify a specific node to configure.
  By default, lconf will search for nodes with the local hostname and 'localhost'.
@@ -190,6 +249,11 @@ node_name
 --nosetup Only load modules, do not configure devices or services.
 \layout Description
 
+--portals\SpecialChar ~
+<path> Specify portals source directory.
+ If this is a relative path, then it is assumed to be relative to lustre.
+\layout Description
+
 --portals_upcall\SpecialChar ~
 <path> Specify the location of the Portals upcall scripts
  used by the client for recovery
@@ -201,6 +265,18 @@ level This options can be used to set the required debug
  level.
 \layout Description
 
+--record Write config information on mds.
+\layout Description
+
+--record_log\SpecialChar ~
+<arg> Specify the name of config record log.
+\layout Description
+
+--record_device\SpecialChar ~
+<arg> Specify MDS device name that will record the config
+ commands.
+\layout Description
+
 --recover\SpecialChar ~
 <arg> Recover a device.
 \layout Description
@@ -213,10 +289,17 @@ level This options can be used to set the required debug
 <arg> Select a particular node for a service 
 \layout Description
 
+--single_socket Specify socknal option: only use one socket instead of bundle.
+\layout Description
+
 --subsystem\SpecialChar ~
 <arg> Set the portals debug subsystem.
 \layout Description
 
+--tgt_uuid\SpecialChar ~
+<uuid> Specify the failed target (required for recovery).
+\layout Description
+
 --timeout\SpecialChar ~
 <arg> Set the recovery timeout period.
 \layout Description
index 264fe27..58e5a80 100644 (file)
@@ -35,18 +35,48 @@ To get a complete listing of available commands, type help at the lctl prompt.
 For non-interactive single-threaded use, one uses the second invocation, which runs command after connecting to the device. 
 
 .B Network Configuration
+.TP
+--net <tcp/elan/myrinet> <command> 
+Indicate the network type to be used for the operation.
 .TP 
 network <tcp/elans/myrinet> 
 Indicate what kind of network applies for the configuration commands that follow.
+.TP
+interface_list 
+Print the interface entries.
+.TP
+add_interface <ip> [netmask] 
+Add an interface entry.
+.TP
+del_interface [ip] 
+Delete an interface entry.
+.TP
+peer_list 
+Print the peer entries.
+.TP
+add_peer <nid> <host> <port> 
+Add a peer entry.
+.TP
+del_peer [<nid>] [<host>] [ks] 
+Remove a peer entry.
+.TP
+conn_list 
+Print all the connected remote nid.
 .TP 
 connect [[<hostname> <port>] | <elan id>] 
 This will establish a connection to a remote network network id given by the hostname/port combination, or the elan id.
 .TP 
 disconnect <nid> 
 Disconnect from a remote nid.
+.TP
+active_tx 
+This command should print active transmits, and it is only used for elan network type.
 .TP 
 mynid [nid] 
 Informs the socknal of the local nid. It defaults to hostname for tcp networks and is automatically setup for elan/myrinet networks.
+.TP
+shownid 
+Print the local NID.
 .TP 
 add_uuid <uuid> <nid> 
 Associate a given UUID with an nid.
@@ -62,32 +92,26 @@ Add an entry to the routing table for the given target.
 .TP 
 del_route <target> 
 Delete an entry for the target from the routing table.
+.TP
+set_route <gateway> <up/down> [<time>] 
+Enable/disable routes via the given gateway in the protals routing table. <time> is used to tell when a gateway comes back online.
 .TP 
 route_list 
 Print the complete routing table.
-.TP 
-recv_mem [size] 
-Set the socket receive buffer size; if the size is omitted, the default size for the buffer is printed.
-.TP 
-send_mem [size] 
-Set send buffer size for the socket; if size is omitted, the default size for the buffer is printed.
-.TP 
-nagle [on/off] 
-Enable/disable nagle; omitting the argument will cause the default value to be printed.
-.TP 
-fail nid|all [count] 
-Fail/restore communications. Ommiting tha count implies fail indefinitely, count of zero indicates that communication should be restored. A non-zero count indicates the number of portals messages to be dropped after which the communication is restored.
+.TP
+fail nid|_all_ [count] 
+Fail/restore communications. Omitting the count implies fail indefinitely, count of zero indicates that communication should be restored. A non-zero count indicates the number of portals messages to be dropped after which the communication is restored. The argument "nid" is used to specify the gateway, which is one peer of the communication.
 .PP
 .B Device Selection
 .TP 
 newdev 
 Create a new device.
 .TP 
-name2dev 
-This command can be used to determine a device number for the given device name.
-.TP 
 device 
 This will select the specified OBD device.  All other commands depend on the device being set. 
+.TP
+cfg_device <$name> 
+Set current device being configured to <$name>.
 .TP 
 device_list 
 Show all the devices.
@@ -114,6 +138,21 @@ Write LOV configuration to an MDS device.
 .TP 
 lov_getconfig lov-uuid 
 Read LOV configuration from an MDS device. Returns default-stripe-count, default-stripe-size, offset, pattern, and a list of OST UUID's.
+.TP
+record cfg-uuid-name 
+Record commands that follow in log.
+.TP
+endrecord 
+Stop recording.
+.TP
+parse config-uuid-name 
+Parse the log of recorded commands for this config.
+.TP
+dump_log config-uuid-name 
+Print log of recorded commands for this config to kernel debug log.
+.TP
+clear_log config-name 
+Delete current config log of recorded commands.
 .PP
 .B Device Operations
 .TP 
@@ -183,6 +222,33 @@ Set stripe info for an echo client
 .TP 
 unset_stripe <objid> 
 Unset stripe info for an echo client object.
+.TP
+del_mount_option profile 
+Delete a specified profile.
+.TP
+set_timeout <secs> 
+Set the timeout(obd_timeout) for server to wait before failing recovery.
+.TP
+set_lustre_upcall </full/path/to/upcall> 
+Set the lustre upcall(obd_lustre_upcall) via the lustre.upcall sysctl.
+.TP
+llog_catlist 
+List all catalog logs on current device.
+.TP
+llog_info <$logname|#oid#ogr#ogen> 
+Print log header information. 
+.TP
+llog_print <$logname|#oid#ogr#ogen> [from] [to] 
+Print log content information. It will print all records from index 1 by default.
+.TP
+llog_check <$logname|#oid#ogr#ogen> [from] [to] 
+Check log content information. It will check all records from index 1 by default.
+.TP
+llog_cancel <catalog id|catalog name> <log id> <index> 
+Cancel one record in log.
+.TP
+llog_remove <catalog id|catalog name> <log id> 
+Remove one log from catalog, erase it from disk.
 .PP
 .B Debug
 .TP 
@@ -209,9 +275,18 @@ Show specific type of messages.
 .TP 
 debug_list <subs/types> 
 List all the subsystem and debug types.
+.TP
+modules <path> 
+Provide gdb-friendly module information.
 .TP 
 panic 
 Force the kernel to panic.
+.TP
+lwt start/stop [file] 
+Light-weight tracing.
+.TP
+memhog <page count> [<gfp flags>] 
+Memory pressure testing.
 .PP
 .B Control
 .TP 
index b921b40..087a2cd 100644 (file)
@@ -1,5 +1,5 @@
-#LyX 1.2 created this file. For more info see http://www.lyx.org/
-\lyxformat 220
+#LyX 1.3 created this file. For more info see http://www.lyx.org/
+\lyxformat 221
 \textclass amsart-plain
 \language english
 \inputencoding auto
@@ -132,7 +132,7 @@ help
 \family default 
 \size default 
  at the lctl prompt.
 To get basic help on the meaning and syntax of a command, type 
+ To get basic help on the meaning and syntax of a command, type 
 \family typewriter 
 \size small 
 help command
@@ -165,9 +165,9 @@ command
 --device The device number to be used for the operation.
  The value of devno is an integer, normally found by calling 
 \emph on 
-lctl name2dev 
+lctl device_list/dl
 \emph default 
-on a device name.
+.
  
 \layout Description
 
@@ -183,10 +183,10 @@ option is used as above.
 
 --ignore_errors\SpecialChar ~
 |\SpecialChar ~
-ignore_errors Ignore errors during script processing
+ignore_errors Ignore errors that occur during script processing.
 \layout Description
 
-dump Save ioctls to a file 
+dump Save ioctl buffer to file.
 \layout LyX-Code
 
 \layout Description
@@ -196,26 +196,86 @@ Configuration
 \begin_deeper 
 \layout Description
 
+--net\SpecialChar ~
+
+\series bold 
+<tcp/elan/myrinet>
+\series default 
+\SpecialChar ~
+
+\series bold 
+<command> 
+\series default 
+Indicate the network type to be used for the operation.
+\layout Description
+
 network\SpecialChar ~
 <tcp/elans/myrinet> Indicate what kind of network applies for the
  configuration commands that follow.
 \layout Description
 
+interface_list Print the interface entries.
+\layout Description
+
+add_interface\SpecialChar ~
+
+\series bold 
+<
+\series default 
+ip>\SpecialChar ~
+[netmask] Add an interface entry.
+\layout Description
+
+del_interface\SpecialChar ~
+[ip] Delete an interface entry.
+\layout Description
+
+peer_list Print the peer entries.
+\layout Description
+
+add_peer\SpecialChar ~
+
+\series bold 
+<
+\series default 
+nid>\SpecialChar ~
+
+\series bold 
+<
+\series default 
+host>\SpecialChar ~
+
+\series bold 
+<
+\series default 
+port> 
+\series bold 
+Add a peer entry.
+\layout Description
+
+del_peer\SpecialChar ~
+[
+\series bold 
+<
+\series default 
+nid>]\SpecialChar ~
+[
+\series bold 
+<
+\series default 
+host>]\SpecialChar ~
+[ks] Remove a peer entry.
+\layout Description
+
 connect\SpecialChar ~
-[[<hostname>\SpecialChar ~
-<port>]\SpecialChar ~
-|\SpecialChar ~
-<elan\SpecialChar ~
-id>] This will establish a connection to
- a remote network network 
-\emph on 
-id
-\emph default 
- given by the hostname/port combination, or the elan 
+<hostname>\SpecialChar ~
+<port>\SpecialChar ~
+[iIOC] This will establish a connection to a remote
+ network, network 
 \emph on 
 id
 \emph default 
-.
+ given by the hostname/port combination.
 \layout Description
 
 disconnect\SpecialChar ~
@@ -226,6 +286,10 @@ nid
 .
 \layout Description
 
+active_tx This command should print active transmits, and it is only used
+ for elan network type.
+\layout Description
+
 mynid\SpecialChar ~
 [nid] Informs the socknal of the local 
 \emph on 
@@ -236,15 +300,20 @@ nid
  elan/myrinet networks.
 \layout Description
 
+shownid Print the local NID.
+\layout Description
+
 add_uuid\SpecialChar ~
 <uuid>\SpecialChar ~
-<nid> Associate a given UUID with an 
+<nid>\SpecialChar ~
+<net_type> Associate a given UUID with an 
 \emph on 
 nid.
 \layout Description
 
 close_uuid\SpecialChar ~
-<uuid> Disconnect a UUID.
+<uuid>\SpecialChar ~
+<net_type> Disconnect a UUID.
 \layout Description
 
 del_uuid\SpecialChar ~
@@ -254,43 +323,52 @@ del_uuid\SpecialChar ~
 add_route\SpecialChar ~
 <gateway>\SpecialChar ~
 <target>\SpecialChar ~
-[target] Add an entry to the routing table for
- the given target.
+[<target>] Add an entry to the portals routing
+ table for the given target.
+ The arguments should be nid.
+ If only one <target> is provided, this command should only add the route
+ for this target.
+ But, if both of the <target>s are provides, this command should add the
+ route for all the target in the range specified by the two targets(from
+ low nid to high nid).
 \layout Description
 
 del_route\SpecialChar ~
-<target> Delete an entry for the target from the routing table.
-\layout Description
-
-route_list Print the complete routing table.
-\layout Description
-
-recv_mem\SpecialChar ~
-[size] Set the socket 
-\emph on 
-receive
-\emph default 
- buffer size; if the size is omitted, the default size for the buffer is
- printed.
+<gateway>\SpecialChar ~
+[<target>]\SpecialChar ~
+[<target>] Delete the route entry for the given
+ targets from the portals routing table.
+ The arguments should be nid.
 \layout Description
 
-send_mem\SpecialChar ~
-[size] Set send buffer size for the socket; if size is omitted,
- the default size for the buffer is printed.
+set_route\SpecialChar ~
+<gateway>\SpecialChar ~
+<up/down>\SpecialChar ~
+[<time>] Enable/disable routes via the given
+ gateway in the protals routing table.
+ <time> is used to tell when a gateway comes back online.
 \layout Description
 
-nagle\SpecialChar ~
-[on/off] Enable/disable nagle; omitting the argument will cause the
- default value to be printed.
+route_list Print the complete portals routing table.
 \layout Description
 
 fail\SpecialChar ~
-nid|all\SpecialChar ~
+nid|_all_\SpecialChar ~
 [count] Fail/restore communications.
- Ommiting tha count implies fail indefinitely, count of zero indicates that
+ Omitting the count implies fail indefinitely, count of zero indicates that
  communication should be restored.
  A non-zero count indicates the number of portals messages to be dropped
  after which the communication is restored.
+ The argument 
+\begin_inset Quotes eld
+\end_inset 
+
+nid
+\begin_inset Quotes erd
+\end_inset 
+
+ is used to specify the gateway, which is one peer of the communication.
 \end_deeper 
 \layout Description
 
@@ -302,18 +380,21 @@ Selection
 newdev Create a new device.
 \layout Description
 
-name2dev This command can be used to determine a device number for the given
- device name.
+device\SpecialChar ~
+<%name|$name|devno> This will select the specified OBD device.
+  All other commands depend on the device being set.
 \layout Description
 
-device This will select the specified OBD device.
-  All other commands depend on the device being set.
+cfg_device\SpecialChar ~
+<$name> Set current device being configured to <$name>.
 \layout Description
 
 device_list Show all the devices.
 \layout Description
 
+dl The same as device_list.
+\layout Description
+
 lustre_build_version Print the Lustre build version.
 \end_deeper 
 \layout Description
@@ -350,27 +431,47 @@ setup\SpecialChar ~
  
 \layout Description
 
-cleanup Cleanup a previously setup device.
+cleanup\SpecialChar ~
+[force|failover] Cleanup a previously setup device.
 \layout Description
 
 detach Remove driver (and name and UUID) from the current device.
 \layout Description
 
-lov_setconfig\SpecialChar ~
+lov_setup\SpecialChar ~
 lov-uuid\SpecialChar ~
 stripe-count\SpecialChar ~
-default-stripe-size\SpecialChar ~
+stripe-size\SpecialChar ~
 offset\SpecialChar ~
 pattern\SpecialChar ~
 UUID1\SpecialChar ~
-[UUID2...]
Write LOV configuration to an MDS device.
+[UUID2...] Write
+ LOV configuration to an MDS device.
 \layout Description
 
 lov_getconfig\SpecialChar ~
 lov-uuid Read LOV configuration from an MDS device.
- Returns default-stripe-count, default-stripe-size, offset, pattern, and
- a list of OST UUID's.
+ Returns stripe-count, stripe-size, offset, pattern, and a list of OST UUID's.
+\layout Description
+
+record\SpecialChar ~
+cfg-uuid-name Record commands that follow in log.
+\layout Description
+
+endrecord Stop recording
+\layout Description
+
+parse\SpecialChar ~
+config-uuid-name Parse the log of recorded commands for this config.
+\layout Description
+
+dump_log\SpecialChar ~
+config-uuid-name Print log of recorded commands for this config
+ to kernel debug log.
+\layout Description
+
+clear_log\SpecialChar ~
+config-name Delete current config log of recorded commands.
 \end_deeper 
 \layout Description
 
@@ -417,7 +518,9 @@ setattr\SpecialChar ~
 create\SpecialChar ~
 [num\SpecialChar ~
 [mode\SpecialChar ~
-[verbose]]] Create the specified number 
+[verbose\SpecialChar ~
+[lsm\SpecialChar ~
+data]]]] Create the specified number 
 \emph on 
 <num>
 \emph default 
@@ -493,11 +596,24 @@ writes
  per I/O).
 \layout Description
 
+get_stripe\SpecialChar ~
+objid Show stripe info for an echo client object.
+\layout Description
+
+set_stripe\SpecialChar ~
+<objid>[=width!count[@offset]\SpecialChar ~
+[:id:id....] Set stripe info for an echo
+ client object.
+\layout Description
+
+unset_stripe\SpecialChar ~
+<objid> Unset stripe info for an echo client object.
+\layout Description
+
 test_ldlm Perform lock manager test.
 \layout Description
 
 ldlm_regress_start\SpecialChar ~
-%s\SpecialChar ~
 [numthreads\SpecialChar ~
 [refheld\SpecialChar ~
 [numres\SpecialChar ~
@@ -508,48 +624,101 @@ ldlm_regress_start\SpecialChar ~
 ldlm_regress_stop Stop lock manager stress test.
 \layout Description
 
-dump_ldlm Dump all lock manager state, this is very useful for debugging
+dump_ldlm Dump all lock manager state, this is very useful for debugging.
 \layout Description
 
-activate Activate an import
+activate Activate an import.
 \layout Description
 
-deacttivate De-activate an import
+deactivate De-activate an import.
 \layout Description
 
 recover\SpecialChar ~
-<connection UUID> 
+[<connection\SpecialChar ~
+UUID>] Pass the information of the new target and initialize
+ the connection to this target.
 \layout Description
 
 lookup\SpecialChar ~
 <directory>\SpecialChar ~
-<file>
+<file> Print some information of the given file.
 \layout Description
 
-notransno Disable sending of committed transnumber updates
+notransno Disable sending of committed transnumber updates.
 \layout Description
 
-readonly Disable writes to the underlying device
+readonly Disable writes to the underlying device.
 \layout Description
 
-abort_recovery Abort recovery on MDS device
+abort_recovery Abort recovery on MDS device.
 \layout Description
 
-mount_option Dump mount options to a file
+start\SpecialChar ~
+<profilename> Setup mds/ost from the llog file.
 \layout Description
 
-get_stripe show stripe info for an echo client object.
+mount_option\SpecialChar ~
+profile\SpecialChar ~
+osc_name\SpecialChar ~
+[mdc_name] Add a new profile to lustre.
 \layout Description
 
-set_stripe\SpecialChar ~
-<objid>[\SpecialChar ~
-width!count[@offset]\SpecialChar ~
-[:id:id....] set stripe info for an echo
- client
+del_mount_option\SpecialChar ~
+profile Delete a specified profile.
 \layout Description
 
-unset_stripe\SpecialChar ~
-<objid> unset stripe info for an echo client object.
+set_timeout\SpecialChar ~
+<secs> Set the timeout(
+\emph on 
+obd_timeout
+\emph default 
+) for server to wait before failing recovery.
+\layout Description
+
+set_lustre_upcall\SpecialChar ~
+</full/path/to/upcall> Set the lustre upcall(obd_lustre_upcall)
+ via the lustre.upcall sysctl.
+\layout Description
+
+llog_catlist List all catalog logs on current device.
+\layout Description
+
+llog_info\SpecialChar ~
+<$logname|#oid#ogr#ogen> Print log header information.
+\layout Description
+
+llog_print\SpecialChar ~
+<$logname|#oid#ogr#ogen>\SpecialChar ~
+[from]\SpecialChar ~
+[to] Print log content information.
+ It will print all records from index 1 by default.
+\layout Description
+
+llog_check\SpecialChar ~
+<$logname|#oid#ogr#ogen>\SpecialChar ~
+[from]\SpecialChar ~
+[to] Check log content information.
+ It will check all records from index 1 by default.
+\layout Description
+
+llog_cancel\SpecialChar ~
+<catalog\SpecialChar ~
+id|catalog\SpecialChar ~
+name>\SpecialChar ~
+<log\SpecialChar ~
+id>\SpecialChar ~
+<index> Cancel one record in log.
+\layout Description
+
+llog_remove\SpecialChar ~
+<catalog\SpecialChar ~
+id|catalog\SpecialChar ~
+name>\SpecialChar ~
+<log\SpecialChar ~
+id> Remove one log from catalog, erase
+ it from disk.
 \end_deeper 
 \layout Description
 
@@ -557,25 +726,32 @@ Debug
 \begin_deeper 
 \layout Description
 
-debug_daemon debug daemon control and dump to a file
+debug_daemon\SpecialChar ~
+[start\SpecialChar ~
+file\SpecialChar ~
+<#MB>|stop|pause|continue] Debug daemon control and
+ dump to a file.
 \layout Description
 
 debug_kernel\SpecialChar ~
 [file]\SpecialChar ~
-[raw] Get Lustre debug buffer from kernel and dump to a 
+[raw] Get Lustre debug buffer from kernel and dump to a
 \emph on 
 file
 \emph default 
 .
 \layout Description
 
+dk The same as debug_kernel.
+\layout Description
+
 debug_file\SpecialChar ~
 <input>\SpecialChar ~
 [output]\SpecialChar ~
 Convert kernel-dumped debug log from binary to plain text format.
  
 \emph on 
-outputusage
+output
 \emph default 
 .
 \layout Description
@@ -604,7 +780,23 @@ debug_list\SpecialChar ~
 <subs/types> List all the subsystem and debug types.
 \layout Description
 
+modules\SpecialChar ~
+<path> Provide gdb-friendly module information.
+\layout Description
+
 panic Force the kernel to panic.
+\layout Description
+
+lwt\SpecialChar ~
+start/stop\SpecialChar ~
+[file] Light-weight tracing.
+\layout Description
+
+memhog\SpecialChar ~
+<page\SpecialChar ~
+count>\SpecialChar ~
+[<gfp\SpecialChar ~
+flags>] Memory pressure testing.
 \end_deeper 
 \layout Description
 
index accc973..0377c33 100644 (file)
@@ -1,4 +1,4 @@
-.TH lmc 1 "2003 Oct 8" Lustre "configuration utilities"
+.TH lmc 1 "2004 Sep 16" Lustre "configuration utilities"
 .SH NAME
 lmc \- Lustre configuration maker
 .SH SYNOPSIS
@@ -50,6 +50,15 @@ Specify the location of the Portals upcall scripts used by the client for recove
 .TP
 --upcall <path> 
 Specify the location of both (Lustre and Portals) upcall scripts used by the client for recovery.
+.TP
+--group_upcall <path> 
+Specify the location of the group upcall scripts used by the MDS for determiningsupplementary group membership.
+.TP
+--ptldebug <debug_level>
+Set the portals debug level.
+.TP
+--subsystem <subsystem_name>
+Specify which Lustre subsystems have debug output recorded in the log.
 .PP
 .B --add net 
 Adds a network device descriptor for the given node, with parameters as indicated.
@@ -64,7 +73,11 @@ This can be tcp, elan, or gm.
 --nid nid 
 The network id, e.g. ElanID or IP address as used by Portals. If nid is '*', then the local address of the interface with specified nettype is will be substituted when the node is configured with lconf. An nid of '*' should be used only for the generic client configuration.
 .TP
+--cluster_id id
+Specify the cluster ID.
+.TP
 --hostaddr addr
+Specify the host address, which will be transfered to the real host address by lconf.
 .TP
 --router 
 Optional flag to mark this node as a router.
@@ -96,17 +109,39 @@ Specify MDS uuid.
 --dev <pathname> 
 Path of device on local system. If the is a file, then a loop device is created and used as the block device.
 .TP
+--backdev <pathname>
+Path of the device for backing storage on local system.
+.TP
 --size <size> 
 Optional argument indicating the size (in KB) of the device to be created (used typically for loop devices).
 .TP
 --node <nodename> 
 Adds an MDS to the specified node. This requires a --node argument, and it must not be a profile node.
 .TP
---fstype extN|ext3 
+--fstype ldiskfs|ext3 
 Optional argument used to specify the file system type. Default is ext3.
+For 2.6 kernels the ldiskfs filesystem must be used.
+.TP
+--inode_size <size> 
+Specify new inode size for underlying ext3 file system.  Must be a power of 2
+between 128 and 4096.  The default inode size is selected based on the default
+number of stripes specified for the filesystem.
+.TP
+--group_upcall <pathname> 
+The group upcall program to call for resolving a user's secondary groups.
+The default value is NONE, which means that the MDS will use whatever
+supplementary group is passed from the client.  The supplied upcall is
+/usr/sbin/l_getgroups, which gets groups from the MDS's /etc/group file
+based on the client-supplied UID.
+.TP
+--mkfsoptions <options> 
+Optional argument to mkfs.
+.TP
+--mountfsoptions <options> 
+Optional argument to mount fs. Mount options will be passed by this argument. For example, extents are to be enabled by adding ",extents" to the --mountfsoptions option. "errors=remount-ro" and "asyncdel" can also be added to it.
 .TP
 --journal_size <size> 
-Optional arguement to specify the journal size for the ext2/ext3 file system. The size should be in the units expected by mkfs, so for ext3 it should be in MB. If this is option is not used, the ext2/ext3 filesystem will be configured with the default journal size.
+Optional arguement to specify the journal size for the ext3 file system. The size should be in the units expected by mkfs, so for ext3 it should be in MB. If this is option is not used, the ext3 filesystem will be configured with the default journal size.
 .PP
 .B --add lov 
 Creates an LOV with the specified parameters. The mds_name must already exist in the descriptor.
@@ -118,10 +153,10 @@ Common name for the LOV
 Common name for the MDS
 .TP
 --stripe_sz <size>
-Stripe size
+Specify the stripe size in bytes.  This much data is written to each stripe before starting to write in the next stripe.  Default is 1048576.
 .TP
 --stripe_cnt <count> 
-A value of 0 for this means to stripe on all available OSTs. Default is 0.
+A value of 0 for this means to use the currently optimal number of stripes.  Default is 1 stripe per file.
 .TP
 --stripe_pattern <pattern> 
 Only Pattern 0 (RAID 0) is supported currently.
@@ -135,6 +170,9 @@ Assign a name to the OST device.
 --node <nodename> 
 Node on which the OST service is run, can not be a profile node.
 .TP
+--failout
+Disable failover support on OST.
+.TP
 --failover
 Enable failover support on OST.
 .TP
@@ -156,8 +194,17 @@ Specify the UUID of the OST device.
 --fstype 
 extN|ext3 Optional arguement used to specify the file system type. Default is ext3.
 .TP
+--inode_size <size> 
+Specify new inode size for underlying ext3 file system.
+.TP
+--mkfsoptions <options> 
+Optional argument to mkfs.
+.TP
+--mountfsoptions <options> 
+Optional argument to mount fs. Mount options will be passed by this argument. For example, extents are to be enabled by adding ",extents" to the --mountfsoptions option. "errors=remount-ro" and "asyncdel" can also be added to it.
+.TP
 --journal_size <size> 
-Optional arguement to specify the journal size for the ext2/ext3 file system. The size should be in the units expected by mkfs, so for ext3 it should be in MB. If this is option is not used, the ext2/ext3 filesystem will be configured with the default journal size.
+Optional arguement to specify the journal size for the ext3 file system. The size should be in the units expected by mkfs, so for ext3 it should be in MB. If this is option is not used, the ext3 filesystem will be configured with a journal size dependent upon how large the filesystem is.
 .PP
 .B --add mtpt 
 Creates a mount-point on the specified node. Either an LOV or OSC name can be used.
@@ -180,14 +227,17 @@ Creates a static route through a gateway to a specific nid or a range of nid's.
 --node node 
 Node to add the route to.
 .TP
---router
+--router 
 Optional flag to mark a node as router.
 .TP
 --gw nid 
 The nid of the gateway (must be a local interface or a peer).
 .TP
---tgt nid 
-For a specific route, this is the target nid.
+--gateway_cluster_id id 
+Specify the id of the cluster, to which the gateway belongs.
+.TP
+--target_cluster_id id 
+Specify the id of the cluster, to which the target of the route belongs.
 .TP
 --lo nid 
 For a range route, this is the lo value nid.
@@ -210,7 +260,23 @@ Send output to the file. If the file exists, it will be overwritten.
 .TP
 --merge filename 
 Add the new element to an existing file. 
+.TP
+--reference 
+Print short reference for commands.
+.TP
+--verbose 
+Print system commands as they are run.
+.TP
+--batch filename 
+Used to execute lmc commands in batch mode.
 .SH EXAMPLES
-Real life examples are given in the Lustre-conf manual page.
+.TP
+.B lmc --node adev3 --add net --nid adev3 --cluster_id 0x1000 --nettype tcp --hostaddr adev3-eth0 --port 988
+.TP
+.B lmc --node adev3 --add net --nid adev3 --cluster_id 0x2000 --nettype tcp --hostaddr adev3-eth1 --port 989
+Used to add a Lustre node to a specified Lustre cluster through a network interface. In this example, Lustre node adev3 has been added to 2 Lustre clusters whose cluster_id are 0x1000 and 0x2000 separately through 2 network interface cards: adev3-eth0 and adev3-eth1. adev3 would listen in some specified port(s) to prepare for possible connection requests from nodes in these two clusters.
+.TP
+.B lmc --node adev3 --add route --nettype tcp --gw 5 --gateway_cluster_id 0x1000 --target_cluster_id 0x1000 --lo 4 --hi 7
+Used to add a route entry for a Lustre node. Here Lustre node adev3 is told it has a new route entry that now it could send packets to Lustre nodes whose nids is from 4 to 7 with the help of Lustre gateway node whose nid is 5. Besides, Lustre gateway node is in cluster whose id is 0x1000 and target of the route belongs to cluster whose id is also 0x1000. The network in this route path is a tcp network.
 .SH BUGS
 None are known.
index bb6ca2b..aa44852 100644 (file)
@@ -119,11 +119,7 @@ net
 \series default 
 ,
 \series bold 
-\series default 
-or
-\series bold 
- echo_client.
+ echo_client, or cobd.
  
 \series default 
 We describe the arguments required for the addition of each 
@@ -172,6 +168,20 @@ The arguments required are:
 --upcall\SpecialChar ~
 <path> Specify the location of both (Lustre and Portals) upcall
  scripts used by the client for recovery
+\layout Description
+
+--group_upcall\SpecialChar ~
+<path> Specify the location of the group upcall scripts used by the MDS
+ for determiningsupplementary group membership
+\layout Description
+
+--ptldebug\SpecialChar ~
+<debug_level> Set the portals debug level.
+\layout Description
+
+--subsytem\SpecialChar ~
+<subsystem_name> Specify which Lustre subsystems have debug output
+ recorded in the log.
 \end_deeper 
 \layout Description
 
@@ -195,7 +205,7 @@ The arguments required are:
 \layout Description
 
 --nettype\SpecialChar ~
-<type> This can be 
+<type> Specify the network type.This can be 
 \series bold 
 tcp, elan, gm.
 \layout Description
@@ -231,7 +241,13 @@ client
  configuration.
 \layout Description
 
---hostaddr addr
+--cluster_id\SpecialChar ~
+id Specify the cluster ID.
+\layout Description
+
+--hostaddr\SpecialChar ~
+addr Specify the host address.
+ lconf will transfer it to the real host address.
 \layout Description
 
 --router Optional flag to mark this node as a router
@@ -272,7 +288,14 @@ name> Name of the node on which the MDS resides
 \layout Description
 
 --mds\SpecialChar ~
-<mds_name> 
+<mds_name> Specify MDS name.
+\layout Description
+
+--mdsuuid\SpecialChar ~
+<uuid> Specify MDS uuid.
+\layout Description
+
+--failover Enable failover support on MDS.
 \layout Description
 
 --dev\SpecialChar ~
@@ -295,20 +318,61 @@ name> Name of the node on which the MDS resides
 \layout Description
 
 --fstype\SpecialChar ~
-extN|ext3 Optional argument used to specify the file system type.
- Default is ext3.
+ldiskfs|ext3 Optional argument used to specify the file system type.
+ Default is ext3.  For 2.6 kernels the ldiskfs filesystem must be used.
+\layout Description
+
+--inode_size\SpecialChar ~
+<size> Specify new inode size for underlying ext3 file system.  Must be a
+ power of 2 between 128 and 4096.  The default inode size is selected based
+ on the default number of stripes specified for the filesystem.
+\layout Description
+
+--group_upcall\SpecialChar ~
+<pathname> The group upcall program to call for resolving a user's secondary
+ groups.  The default value is NONE, which means that the MDS will use whatever
+ supplementary group is passed from the client.  The supplied upcall is
+ /usr/sbin/l_getgroups, which gets groups from the MDS's /etc/group file
+ based on the client-supplied UID.
+
+--mkfsoptions\SpecialChar ~
+<options> Optional argument to mkfs.
+\layout Description
+
+--mountfsoptions\SpecialChar ~
+<options> Optional argument to mount fs.
+ Mount options will be passed by this argument.
+ For example, extents are to be enabled by adding ",extents" to the --mountfsopt
+ions option.
+\begin_inset Quotes eld
+\end_inset 
+
+errors=remount-ro
+\begin_inset Quotes erd
+\end_inset 
+
+ and 
+\begin_inset Quotes eld
+\end_inset 
+
+asyncdel
+\begin_inset Quotes erd
+\end_inset 
+
+ can also be added to it.
 \layout Description
 
 --journal_size\SpecialChar ~
 <size> Optional arguement to specify the journal size for
- the ext2/ext3 file system.
+ the ext3 file system.
  The size should be in the units expected by 
 \series bold 
 mkfs
 \series default 
 , so for ext3 it should be in MB.
- If this is option is not used, the ext2/ext3 filesystem will be configured
- with the default journal size.
+ If this is option is not used, the ext3 filesystem will be configured
+ with a journal size dependent upon how large the filesystem is.
 \end_deeper 
 \layout Description
 
@@ -323,21 +387,21 @@ mds_name
 \layout Description
 
 --lov\SpecialChar ~
-<name>
+<name> Specify LOV name.
 \layout Description
 
 --mds\SpecialChar ~
-<name>
+<name> Specify the mds name.
 \layout Description
 
 --stripe_sz\SpecialChar ~
-<size>
+<size> Specify the stripe size in bytes.  This much data is written to each
+ stripe before starting to write in the next stripe.  Default is 1048576.
 \layout Description
 
 --stripe_cnt\SpecialChar ~
-<count> A value of 0 for this means to stripe on all available
- OSTs.
- Default is 0.
+<count> A value of 0 for this means to use the currently optimal number
+ of stripes.  Default is 1 stripe per file.
 \layout Description
 
 --stripe_pattern\SpecialChar ~
@@ -360,6 +424,9 @@ ost Creates an OBD, OST, and OSC.
  node.
 \layout Description
 
+--failover Enable failover support on OST.
+\layout Description
+
 --dev\SpecialChar ~
 <pathname> Path of device on local system.
  If this is a file, then a loop device is created and used as the block
@@ -371,8 +438,8 @@ ost Creates an OBD, OST, and OSC.
  to be created (used typically for loop devices).
 \layout Description
 
---obdtype\SpecialChar ~
-obdfilter|obdecho 
+--osdtype\SpecialChar ~
+obdfilter|obdecho Specify the type of OSD.
 \layout Description
 
 --lov\SpecialChar ~
@@ -391,16 +458,48 @@ extN|ext3 Optional arguement used to specify the file system type.
  Default is ext3.
 \layout Description
 
+--inode_size\SpecialChar ~
+<size> Specify new inode size for underlying ext3 file system.
+\layout Description
+
+--mkfsoptions\SpecialChar ~
+<options> Optional argument to mkfs.
+\layout Description
+
+--mountfsoptions\SpecialChar ~
+<options> Optional argument to mount fs.
+ Mount options will be passed by this argument.
+ For example, extents are to be enabled by adding ",extents" to the --mountfsopt
+ions option.
+\begin_inset Quotes eld
+\end_inset 
+
+errors=remount-ro
+\begin_inset Quotes erd
+\end_inset 
+
+ and 
+\begin_inset Quotes eld
+\end_inset 
+
+asyncdel
+\begin_inset Quotes erd
+\end_inset 
+
+ can also be added to it.
+\layout Description
+
 --journal_size\SpecialChar ~
 <size> Optional arguement to specify the journal size for
- the ext2/ext3 file system.
+ the ext3 file system.
  The size should be in the units expected by 
 \series bold 
 mkfs
 \series default 
 , so for ext3 it should be in MB.
- If this is option is not used, the ext2/ext3 filesystem will be configured
- with the default journal size.
+ If this is option is not used, the ext3 filesystem will be configured
+ with a journal size dependent upon how large the filesystem is.
 \end_deeper 
 \layout Description
 
@@ -419,19 +518,23 @@ mtpt
 \layout Description
 
 --path\SpecialChar ~
-/mnt/path\SpecialChar ~
-
+/mnt/path Specify the mountpoint for Lustre.
 \layout Description
 
 --mds\SpecialChar ~
-mds_name 
+mds_name Specify the mds name, which will provide service for this
+ client.
 \layout Description
 
 --ost\SpecialChar ~
 ost_name\SpecialChar ~
 |\SpecialChar ~
 --lov\SpecialChar ~
-lov_name
+lov_name Specify the ost or lov, which will provide service
+ for this client.
+\layout Description
+
+--clientoptions Specify the options for Lustre, such as async.
 \end_deeper 
 \layout Description
 
@@ -452,6 +555,9 @@ nid
 node Node to add the route to.
 \layout Description
 
+--router Optional flag to mark a node as router.
+\layout Description
+
 --gw\SpecialChar ~
 nid The 
 \emph on 
@@ -460,10 +566,14 @@ nid
  of the gateway (must be a local interface or a peer).
 \layout Description
 
---tgt\SpecialChar ~
-nid For a specific route, this is the target 
-\emph on 
-nid.
+--gateway_cluster_id\SpecialChar ~
+id Specify the id of the cluster, to which the gateway
+ belongs.
+\layout Description
+
+--target_cluster_id\SpecialChar ~
+id Specify the id of the cluster, to which the target
+ of the route belongs.
 \layout Description
 
 --lo\SpecialChar ~
@@ -486,13 +596,27 @@ echo-client Used for testing purpose only.
 \layout Description
 
 --node\SpecialChar ~
-node
+nodename
+\emph on 
+\emph default 
+Node on which the echo-client resides.
+\end_deeper 
+\layout Description
+
+--add\SpecialChar ~
+mgmt Management/monitoring service.
+\begin_deeper 
+\layout Description
+
+--node\SpecialChar ~
+nodename
 \emph on 
  
+\emph default 
+Node on which the mgmt service resides.
 \layout Description
 
---obd\SpecialChar ~
-obd_name 
 \end_deeper 
 \layout List
 \labelwidthstring 00.00.0000
@@ -502,6 +626,16 @@ obd_name
 Options
 \layout Description
 
+--reference Print short reference for commands.
+\layout Description
+
+--verbose Print system commands as they are run.
+\layout Description
+
+--batch\SpecialChar ~
+filename Used to execute lmc commands in batch mode.
+\layout Description
+
 --output\SpecialChar ~
 filename Send output to the file.
  If the file exists, it will be overwritten.
@@ -517,9 +651,51 @@ Add the new element to an existing file.
 \layout Subsection
 
 EXAMPLES
+\layout Subsubsection
+
+--add net
+\layout Standard
+
+
+\series bold 
+lmc --node adev3 --add net --nid adev3 --cluster_id 0x1000 --nettype tcp
+ --hostaddr adev3-eth0 --port 988
+\layout Standard
+
+
+\series bold 
+lmc --node adev3 --add net --nid adev3 --cluster_id 0x2000 --nettype tcp
+ --hostaddr adev3-eth1 --port 989
+\series default 
+\emph on 
+\layout Standard
+
+Used to add a Lustre node to a specified Lustre cluster through a network
+ interface.
+ In this example, Lustre node adev3 has been added to 2 Lustre clusters
+ whose cluster_id are 0x1000 and 0x2000 separately through 2 network interface
+ cards: adev3-eth0 and adev3-eth1.
+ adev3 would listen in some specified port(s) to prepare for possible connection
+ requests from nodes in these two clusters.
+\layout Subsubsection
+
+--add route
+\layout Standard
+
+
+\series bold 
+lmc --node adev3 --add route --nettype tcp --gw 5 --gateway_cluster_id 0x1000
+ --target_cluster_id 0x1000 --lo 4 --hi 7
 \layout Standard
 
-Real life examples are given in the Lustre-conf manual page.
+Used to add a route entry for a Lustre node.
+ Here Lustre node adev3 is told it has a new route entry that now it could
+ send packets to Lustre nodes whose nids is from 4 to 7 with the help of
+ Lustre gateway node whose nid is 5.
+ Besides, Lustre gateway node is in cluster whose id is 0x1000 and target
+ of the route belongs to cluster whose id is also 0x1000.
+ The network in this route path is a tcp network.
 \layout Subsection
 
 BUGS
diff --git a/lustre/doc/quota_hld.lyx b/lustre/doc/quota_hld.lyx
deleted file mode 100644 (file)
index 86d1096..0000000
+++ /dev/null
@@ -1,1231 +0,0 @@
-#LyX 1.3 created this file. For more info see http://www.lyx.org/
-\lyxformat 221
-\textclass article
-\language english
-\inputencoding auto
-\fontscheme times
-\graphics default
-\paperfontsize default
-\spacing single 
-\papersize Default
-\paperpackage a4
-\use_geometry 0
-\use_amsmath 0
-\use_natbib 0
-\use_numerical_citations 0
-\paperorientation portrait
-\secnumdepth 3
-\tocdepth 3
-\paragraph_separation skip
-\defskip medskip
-\quotes_language english
-\quotes_times 2
-\papercolumns 1
-\papersides 1
-\paperpagestyle default
-
-\layout Title
-
-Quota For Lustre
-\layout Section
-
-From Engineering Requirements Specification
-\layout Enumerate
-
-Lustre can operate and enforce disk block quota and file quota.
-\layout Enumerate
-
-Hard and soft quota are supported
-\layout Enumerate
-
-Central management tools enable setting limits for users and initializing
- quota check operations
-\layout Enumerate
-
-Quota are only needed for Linux 2.6
-\layout Section
-
-Specification of subsystems
-\layout Description
-
-Definition: An 
-\emph on 
-operational quota file
-\emph default 
- is a quota database containing limits for some uid's and gid's which is
- being used to enforce quota.
- An 
-\emph on 
-administrative quota file
-\emph default 
- is a similar database, but it is used for recovery and soft quota or administra
-tive purposes.
-\layout Subsection
-
-Master & slaves
-\layout Standard
-
-A node is a master 
-\series bold 
-for a uid or gid 
-\series default 
-if the node holds the cluster wide limits (hard, soft, files, blocks & gracetime
-s) for that uid or gid in an administrative quota file.
- The administrative quota file is similar to normal ext3 quota file.
- The data structures and code for an administrative quota file API will
- be copied from the Linux VFS to ldiskfs and amended.
- Slave nodes (all other servers) only consider hard quota and only have
- operational quota files.
-\layout Standard
-
-Note that a node may be a master for some uid's, gid's and a slave for others.
- Masters also have an operational quota file for enforcing hard quota .
- Master 
-\series bold 
-observe soft limits in the administrative file, based on grace times
-\series default 
-.
-\layout Subsection
-
-Acquire / release protocol
-\layout Standard
-
-The master administrative quota file has two kinds of limits: total limits
- and limit acquired by all servers (administrative usage).
- Totoal limits are set by user, administrative usage is initialized to zero
- and it's amended when master/slaves acquire or release quota.
-\layout Standard
-
-Quota slaves can acquire from the master and release to the master qunits
- of disk space (>100MB typically, see ERS).
- Slaves do this to increase / lower their hard limits of operational file.
- Upon acquiring quota from a master the master's administrative usage are
- increased.
- Master can acqurie/release qunits, just like slaves, except that it is
- done locally.
-\layout Standard
-
-On the master only, soft limits are enforced in obd layer based on the administr
-ative quota file.
- Once administrative usage >= administrative soft limit, the timer is activated.
-\layout Subsection
-
-Chown Operations
-\layout Standard
-
-All objects associated with a file will have their owners set to that of
- the MDS inode.
- These chown operations occur in connection with file creation and chowning
- on the MDS and are asynchronous.
- There will also be enough space in the records to set an EA on the objects
- indicating the originating MDS, fileset and storage id of the inode.
- The arguments will contain the following - but the final format of the
- packet sent is subject to approval by management (it may be larger):
-\layout LyX-Code
-
-struct object_setattr_args {
-\layout LyX-Code
-
-      __u64 osa_mds_id;     /* to identify MDS */
-\layout LyX-Code
-
-      __u64 osa_fileset_id; /* part of the fid, tbd */
-\layout LyX-Code
-
-      __u64 osa_ino;    /* inode number on mds */
-\layout LyX-Code
-
-      __u64 osa_gen;    /* inode generation on mds */
-\layout LyX-Code
-
-      __u32 osa_uid;    /* owner of the file */
-\layout LyX-Code
-
-      __u32 osa_gid;    /* group of the file */
-\layout LyX-Code
-
-      __u64 osa_mds_transno;/* for recovery of mds rollback */
-\layout LyX-Code
-
-      __u64 osa_mds_last_committed;
-\layout LyX-Code
-
-      __u32 osa_mds_prev_uid; /* to undo things that didn't complete on
- the MDS */
-\layout LyX-Code
-
-      __u32 osa_mds_prev_gid;
-\layout LyX-Code
-
-} 
-\layout Subsection
-
-Recovery
-\layout Standard
-
-A recovery protocol for limits involves
-\layout Description
-
-Master\SpecialChar ~
-recovery re-writing the operational limits on the master node, based
- on the cluster-wide limits as found in the administrative quota file 
-\layout Description
-
-Slave\SpecialChar ~
-recovery completing aborted release operations on slaves.
-\layout Standard
-
-Chown operations for objects will use llog recovery on the MDS (as it is
- used for unlinks).
-\layout Standard
-
-MDS chown operations that are lost are not recovered at this point - but
- arguments to do so in the future are passed as above.
- The recovery from this is fairly simple: the OST writes log operations
- for each chown operation containing the MDS transaction number and undo
- information.
- The MDS reports last committed transactions to the OST.
- During normal use these lead to cancellations of records leading up to
- that transaction.
- During recovery, all llog records following the record containing the transacti
-on number will be used to undo the OST chown/chgrp operations.
-\layout Standard
-
-For new files, removal of objects does already take place.
-\layout Subsection
-
-Configuration
-\layout Standard
-
-A configuration protocol will initiate quota check operations, turn quota
- on, and set limits.
- All commands will be issued through lfs.
-\layout Subsection
-
-Disk fs handling
-\layout Standard
-
-Disk file systems track quota usage.
- An interface between OSS and MDS and disk file systems will enable a check
- and adjustment of disk file system quota limits before operations proceed.
- Every node will try to acquire quota before proceeding.
- Every node will release quota after finishing.
- Acquire and release calls are tuned to anticipate use.
- Disk fs quota check handling will be possibly on busy file systems.
-\layout Section
-
-Use cases
-\layout Standard
-
-Each use case is an interaction between a 
-\begin_inset Quotes eld
-\end_inset 
-
-user
-\begin_inset Quotes erd
-\end_inset 
-
- and 
-\begin_inset Quotes eld
-\end_inset 
-
-system
-\begin_inset Quotes erd
-\end_inset 
-
-.
- For each use case we describe what subsystem forms the 
-\begin_inset Quotes eld
-\end_inset 
-
-user
-\begin_inset Quotes erd
-\end_inset 
-
- and the 
-\begin_inset Quotes eld
-\end_inset 
-
-system
-\begin_inset Quotes erd
-\end_inset 
-
-.
- Use the logical components indicated in sections 3.1-3.4 below to describe
- the use cases.
- The purpose is to check that each of the use cases at a high level appears
- to execute successfully by using the components listed under 3.1-3.4.
- In some of the scenarios (e.g.
- 3.2 multiple use scenarios should be described, e.g.
- how is the slave-master protocol involved and how is the client - oss protocol
- involved).
-\layout Subsection
-
-Initialization operation
-\layout Subsubsection
-
-Changing owners 
-\layout Standard
-
-The following operations are done on a client:
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator get root priviliges on the file system
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator run `find <mnt> -type f | xargs lchog`
-\begin_deeper 
-\layout Enumerate
-
-<mnt> is mount point
-\layout Enumerate
-
-
-\emph on 
-lchog
-\emph default 
- is a small utility to do chown/chgrp, its usage: 
-\begin_deeper 
-\layout Standard
-
-
-\emph on 
-lchog [-i] FILE...
-
-\emph default 
-\layout Description
-
-
-\emph on 
--i
-\emph default 
- ignore ENOENT error
-\end_deeper 
-\end_deeper 
-\layout List
-\labelwidthstring 00.00.0000
-
-System 
-\emph on 
-lchog
-\emph default 
- will abort if change failed, and then report error, indicating what was
- searched etc.
- Generally user cannot ignore the error, and should fix it and redo the
- above before the next operation, except that user can set 
-\emph on 
--i
-\emph default 
- option for 
-\emph on 
-lchog
-\emph default 
- to ignore ENOENT error.
-\layout Subsubsection
-
-Mounting existing file systems with quota support
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator file systems on all server nodes should be mounted with quota
- support, this can be done by running
-\emph on 
- lconf
-\emph default 
- on all nodes: 
-\emph on 
-lconf --mountfsoptions quota ...,
-\emph default 
- if the file system has already been mounted, it should be umounted first.
-\layout List
-\labelwidthstring 00.00.0000
-
-System all needed modules are loaded, and file systems are mounted with
- quota support.
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator run `lfs quotacheck`, it will initiate quota check on all
- MDS' and OSTs one by one.
-\layout List
-\labelwidthstring 00.00.0000
-
-System on each node ``quotacheck'' will walk through the diskfs.
- When the check finishes, it will report the check status to the initiator.
- If it failed, the error is listed.
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator user should fix the errors and recheck the specified nodes
- before preceeding to the next step.
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator run `lfs quotaon`, it will initiate quotaon on all MDS' and
- OSTs one by one.
-\layout List
-\labelwidthstring 00.00.0000
-
-System each node will start to check/handle quota.
- The status will be reported back to the initiator.
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator user should fix the errors if there are.
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator run `lfs setquota`, it will set limits on the corresponding
- MDS master for the specified uid/gid.
-\layout List
-\labelwidthstring 00.00.0000
-
-System if it's the first time to set limits, master will initialize quota
- on all slaves, otherwise only modify the quota of itself.
- Moreover, the limit info is saved in recovery quota file on master.
-
-\series bold 
-\series default 
-The status will be reported to initiator.
-\layout List
-\labelwidthstring 00.00.0000
-
-Administrator if some nodes failed, generally user should not ignore the
- errors.
-\layout Subsubsection
-
-a new file system to a state where it is using quota
-\layout Standard
-
-Like above, but only need three steps: `lfs quotacheck`, `lfs quotaon` and
- `lfs setquota`.
-\layout Subsection
-
-Normal use block quota
-\layout Standard
-
-Demonstrate how quota are acquired and released during normal use through
- sequences of the API's and network calls defined in this document.
-\layout Standard
-
-
-\series bold 
-DESCRIBE CASES WHERE
-\layout Enumerate
-
-A USER DOES THIS OR THAT: WHAT are the system responses
-\layout Enumerate
-
-The client does this or that: what are the OSS & MDS responses
-\layout Enumerate
-
-The OST does this or that, what are the obdfilter / diskfs reponses
-\layout Subsubsection
-
-Acquire quota
-\layout List
-\labelwidthstring 00.00.0000
-
-User issues file write operation.
-\layout List
-\labelwidthstring 00.00.0000
-
-System performs write successfully and returns the written bytes.
-\newline 
-
-\layout List
-\labelwidthstring 00.00.0000
-
-Client makes IO requests to OSS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS acquires qunit if needed.
-\layout List
-\labelwidthstring 00.00.0000
-
-Master increase usage in adminstrative file then reply to OSS with granted
- qunit.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS updates local operational quota file, performs write operation and replies
- client the ~noquota flag.
-\newline 
-
-\layout List
-\labelwidthstring 00.00.0000
-
-OST calls obd_commitrw to commit write.
-\layout List
-\labelwidthstring 00.00.0000
-
-Obdfilter if not enough qunit, acquire qunit by dqacq rpc from master, updates
- local operational quota file after dqacq reply, then performs normal direct
- write.
-\layout Subsubsection
-
-
-\begin_inset LatexCommand \label{release-quota}
-
-\end_inset 
-
-Release quota
-\layout List
-\labelwidthstring 00.00.0000
-
-User issues truncate or unlink operation.
-\layout List
-\labelwidthstring 00.00.0000
-
-System performs the truncate/unlink operation and returns error code.
-\newline 
-
-\layout List
-\labelwidthstring 00.00.0000
-
-Client makes OST_PUNCH or OST_DESTROY requests to OSS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS performs truncate/unlink on objects.
- release qunit to Master if needed.
-\layout List
-\labelwidthstring 00.00.0000
-
-Master decrease usage in administrative file and reply to OSS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS updates local operational quota file.
-\newline 
-
-\layout List
-\labelwidthstring 00.00.0000
-
-OST calls obd_destroy/obd_punch.
-\layout List
-\labelwidthstring 00.00.0000
-
-Obdfilter performs unlink/truncate on objects, if there is qunit to be released,
- release qunit by dqrel rpc to master then updates local operational quota
- file.
-\layout Subsection
-
-Running out of block quota
-\layout List
-\labelwidthstring 00.00.0000
-
-User issues file write operation.
-\layout List
-\labelwidthstring 00.00.0000
-
-System write fails and return EDQUOT.
- (but the pages in cache will be written successfully)
-\newline 
-
-\layout List
-\labelwidthstring 00.00.0000
-
-Client makes IO requests to OSS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS acquires qunit from master.
-\layout List
-\labelwidthstring 00.00.0000
-
-Master reply noquota to OSS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS fs write fails, rewrites pages from client cache forcibly, replies client
- the noquota flag and error code.
-\newline 
-
-\layout List
-\labelwidthstring 00.00.0000
-
-OST calls obd_commitrw to commit write.
-\layout List
-\labelwidthstring 00.00.0000
-
-Obdfilter acquiring qunit fails, then performs normal direct write and fails,
- and then rewrites the pages from client cache, returns error code and noquota
- flag to OST.
-\layout Subsection
-
-Freeing space to get under quota
-\layout Standard
-
-The release steps are the same as those in 
-\begin_inset LatexCommand \ref{release-quota}
-
-\end_inset 
-
-3.2.2.
-\layout List
-\labelwidthstring 00.00.0000
-
-User issues file write operation.
-\layout List
-\labelwidthstring 00.00.0000
-
-Client makes synchronous write rpc to OSS if there is noquota flag.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS performs fs write successfully, return client ~noquota flag.
-\layout List
-\labelwidthstring 00.00.0000
-
-Client clears noquota flag for this uid/gid.
-\layout Subsection
-
-Enforcing soft quota
-\layout Subsubsection
-
-Start soft quota timer
-\layout List
-\labelwidthstring 00.00.0000
-
-User issues file write/create operations.
-\layout List
-\labelwidthstring 00.00.0000
-
-System returns successfully.
-\newline 
-
-\layout List
-\labelwidthstring 00.00.0000
-
-Client makes file write/create requests to OSS/MDS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS/MDS sends dqacq rpcs to get more quota from master.
-\layout List
-\labelwidthstring 00.00.0000
-
-Master starts the timer once administrative usage >= administrative soft
- limit and grants qunit to OSS/MDS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS/MDS write/create succeeds.
-\layout Subsubsection
-
-Soft quota timer goes off
-\layout List
-\labelwidthstring 00.00.0000
-
-User issues file write/create operations.
-\layout List
-\labelwidthstring 00.00.0000
-
-System returns EDQUOT.
-\newline 
-
-\layout List
-\labelwidthstring 00.00.0000
-
-Client makes file write/create requests to OSS/MDS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS/MDS sends dqacq rpcs to get more quota from master.
-\layout List
-\labelwidthstring 00.00.0000
-
-Master returns noquota to OSS/MDS.
-\layout List
-\labelwidthstring 00.00.0000
-
-OSS/MDS write/create fails and returns error code to Client.
-\layout Subsubsection
-
-Stop soft quota timer
-\layout Standard
-
-The release steps are the same as those in 
-\begin_inset LatexCommand \ref{release-quota}
-
-\end_inset 
-
-3.2.2.
-\layout List
-\labelwidthstring 00.00.0000
-
-Slave calls dqrel rpc to release extra quota.
-\layout List
-\labelwidthstring 00.00.0000
-
-Master stops the timer once administrative usage < administrative soft limit.
-\layout Subsection
-
-File quota on the MDS 
-\layout Standard
-
-For CMD, it is similiar to block quota described above.
- For b1_4, it is completely managed by MDS locally.
-\layout Subsection
-
-Listing quota
-\layout List
-\labelwidthstring 00.00.0000
-
-User runs 'lfs quota', it will make an rpc to the corresponding MDS master
- for the specified uid/gid.
-\layout List
-\labelwidthstring 00.00.0000
-
-System displays usage & limits related to quota for the uid/gid on all nodes
- in the cluster.
- if some nodes failed, reports the error to user.
-\layout List
-\labelwidthstring 00.00.0000
-
-User generally can ignore the errors.
-\layout Subsection
-
-Recovery of quota 
-\layout Standard
-
-
-\series bold 
-just describe interaction initiator - response, no internals
-\layout Subsubsection
-
-Slave recovery 
-\layout List
-\labelwidthstring 00.00.0000
-
-Slave releases unreasonably high limits to master.
-\layout List
-\labelwidthstring 00.00.0000
-
-Master updates adminstrative quota file and reply to slave.
-\layout List
-\labelwidthstring 00.00.0000
-
-Slave updates local operational quota file.
-\layout Subsubsection
-
-Master recovery
-\layout List
-\labelwidthstring 00.00.0000
-
-Master enquires all slaves' operational limits by issuing a new RPC.
-
-\series bold 
-\layout List
-\labelwidthstring 00.00.0000
-
-Slave replies with limit.
-\layout List
-\labelwidthstring 00.00.0000
-
-Master updates administrative quota file.
-\layout Section
-
-State considerations
-\layout Subsection
-
-Node state
-\layout Subsection
-
-Context state
-\layout Section
-
-Logic specification
-\layout Standard
-
-The quota implementation falls into a few, almost separate, components.
-\layout Standard
-
-
-\series bold 
-ORDER OF IMPLEMENTATION
-\layout Enumerate
-
-Administrative utilities, with sufficient flexibility to create unit test
- cases 
-\layout Enumerate
-
-Administrative quota file implementation
-\layout Enumerate
-
-OSS enforcement of quota (can be tested separately)
-\layout Enumerate
-
-client - OSS protocol
-\layout Enumerate
-
-quota context
-\layout Enumerate
-
-quota acquire release protocol
-\layout Enumerate
-
-MDS-OST setattr calls
-\layout Enumerate
-
-comprehensive testing of use cases
-\layout Enumerate
-
-recovery protocol
-\layout Enumerate
-
-soft limit
-\layout Subsection
-
-Administrative utilities
-\layout Standard
-
-For all of the following commands it is probably useful to define a single
- datastructure that has enough fields to hold all the data that needs to
- be transfered.
-\layout Description
-
-Top\SpecialChar ~
-priority
-\layout Enumerate
-
-All utilities are either:
-\begin_deeper 
-\layout Enumerate
-
-file system ioctls - where non-standard Lustre specific info is needed (e.g.
- listing)
-\layout Enumerate
-
-standard quotactl interfaces
-\end_deeper 
-\layout Enumerate
-
-A lustre obd_iocontrol will allow an MDS to initiate quota check or quotaon
- operations on all OST's.
- It should be possible to issue this ioctl as a file system ioctl on a client,
- or giving an MDS device on an MDS.
-\series bold 
-NOTE: 
-\series default 
-This rpc can be the same as the master to slave recovery enquiry rpc defined
- below.
-\layout Enumerate
-
-an obd_iocontrol and special lfs is needed to display usage & limits related
- to quota for a uid/gid on all nodes in the cluster.
- This needs to be added to lfs and need to be a command that can be issued
- from a file system client.
-\layout Enumerate
-
-a command is needed to set the limits for a uid/gid, perhaps based on a
- template.
- The limits need to be set on the master and in the limit database.
- All slaves need to be notified that quota tracking for the uid/gid is now
- in effect (perhaps by increasing quota limits on the node to a non-zero
- value).
- Similarly it should be possible to disable quota for a uid / gid.
-\layout Enumerate
-
-Documentation for all of these will be implemented as manual page extensions
- and as part of the Lustre Users Guide.
-\layout Enumerate
-
-A chown.chgrp utility.
- Build a small c utility that stats a file and then issues the chown/chgrp
- system call to change the ownder/group on the file.
- This is issued from a client, in conjunction with running a find command
- to initialize ownership.
- This can only be run after the MDS has been changed to incorporate part
- 3.3
-\layout Subsection
-
-Adminstrative quota file & disk file system quota
-\layout Enumerate
-
-The administrative quota file will be a quota file similar to ext3 based
- quota files with the usual VFS determined tree format.
-\layout Enumerate
-
-The VFS quota api will be adapted to enable the administrative commands
- to create quota files by name and operate on them without sb (super block)
- or dquot quota context arguments as required.
-\layout Enumerate
-
-
-\series bold 
-(Design this, but implementation is second priority) 
-\series default 
-Quota check will be adapted to handle checking on a live file system, as
- follows:
-\begin_deeper 
-\layout Enumerate
-
-if inodes are not checked in sequence order (1,2,3, etc) the following is
- probably not possible.
-\layout Enumerate
-
-block all operations on an inode while it is being 
-\begin_inset Quotes eld
-\end_inset 
-
-checked
-\begin_inset Quotes erd
-\end_inset 
-
-.
-\layout Enumerate
-
-account for quota on inodes that are already checked
-\layout Enumerate
-
-do not account on inodes that are not yet checked
-\end_deeper 
-\layout Subsection
-
-OSS enforcement
-\layout Enumerate
-
-The direct I/O and truncate calls on the OSS will enforce quota
-\layout Subsection
-
-Client OST/MDT protocol
-\layout Standard
-
-The following component can initially be implemented based on quota status
- codes returned by the disk file system.
- In due course the status of quota will be determined by the acquire calls
- made in the OST or obdfilter.
-\layout Enumerate
-
-All writes functions executed on OST's track quota for newly allocated space.
-\layout Enumerate
-
-If a client flushes a page cache to an OST the data will be written (even
- if quota are exceeded).
- The mount flags allowing root to squash quota should be used for this.
-\layout Enumerate
-
-If a client exceeds quota, a return code will indicate that the for that
- further writes for files owned by that uid/gid must now be done synchronously.
-\layout Enumerate
-
-If quota limits on the OSS are sufficient again, through removal of files
- or enlarging limits, the flag must be cleared.
-\layout Enumerate
-
-For MDC file quota are currently handled synchronously on the server.
-\layout Subsection
-
-Quota context and server quota enforcement
-\layout Enumerate
-
-The MDS will automatically track block quota associated with directories.
- It is important the llog files are owned by root users and not subject
- to quota
-\layout Enumerate
-
-For root root owned files, Lustre quota should not be enabled (there are
- too many administratively controlled root-owned files right now).
-\layout Enumerate
-
-There will be an active 
-\series bold 
-quota context
-\series default 
- for a uid or gid for which quota operations are in progress.
- Processes acquiring quota will find the context for that user or group
- and wait on the context intelligently and not all fire RPC's to the master.
- The context should also intelligently handle recovery operations running
- concurrently with normal quota use.
-\layout Subsection
-
-Slave to Master acquire / release protocol
-\layout Enumerate
-
-Tunables
-\begin_deeper 
-\layout Enumerate
-
-All servers will have tunables for qunits and early acquisition of more
- qunits.
-\layout Enumerate
-
-The tunables can be set to configurable values through lconf, one set of
- values for slave behavior, one for master behavior each separated for OSS
- nodes, one for MDS nodes, as part of the configuration zeroconfig llog.
-\layout Enumerate
-
-The tunables can also be adjusted dynamically in /proc.
-\layout Enumerate
-
-Adjusting through proc only is not acceptable.
-\end_deeper 
-\layout Enumerate
-
-There will be a function that determines the master node for a given uid
- or gid.
- For the 1.4 branch this function is always returning the MDS, but it will
- be designed to make it easy to adapt to clustered metadata.
-\layout Enumerate
-
-There will be dqacq and dqrel rpc's initiated by slave nodes.
- The code will be organized so that it can be run on slave OSS and slave
- MDS nodes without modification.
- These functions will increase / decreate the local limits and administrative
- usage on master.
-\layout Enumerate
-
-A unit test program will run a collection of not less than 3 slaves and
- a master through a sequence of interesting acquisitions and releases.
-\layout Subsection
-
-Full integration and system testing
-\layout Enumerate
-
-Full unit tests for all components.
-\layout Enumerate
-
-Demonstrate successful handling of recovery from exceeding soft and hard
- limits.
-\layout Subsection
-
-MDS - OST setattr calls
-\layout Enumerate
-
-When the MDS creates or chown a file it will queue an asynchronous obd_setattr
- rpc to the RPC that:
-\begin_deeper 
-\layout Enumerate
-
-changes the owner/group of the objects for the file.
-\layout Enumerate
-
-transfers the storage id (ask Yury for data type) to the OSS (this is in
- the create case only).
- It writes the storage id in an EA.
-\end_deeper 
-\layout Enumerate
-
-The obd_setattr calls will be journaled almost exactly like mds_unlink calls
- in an llog (except that for unlink presently the client unlinks the objects)
- and records will be canceled when the setattr commands commit to disk on
- the OST.
-\layout Enumerate
-
-The obd_setattr rpc's will be queued on an RPC set for asynchronous completion,
- i.e.
- the MDS will reply to the client without waiting for the result.
- The simple strategy (
-\begin_inset Quotes eld
-\end_inset 
-
-chown, even if user goes over quota
-\begin_inset Quotes erd
-\end_inset 
-
-, see ERS) will be followed.
-\layout Enumerate
-
-For this part not more than 4 (four) lines of code may be added to mds_open.
- Adding 0 lines to this function (the longest in Lustre) would be better.
-\layout Enumerate
-
-Demonstrate handling recovery of 300,000 orphaned chown operations while
- the cluster is in use already.
-\layout Subsection
-
-Server Node Recovery
-\layout Standard
-
-Note: in CMD nodes will be slaves for some uids and masters for others.
- The algorithm outlined here handles the general case.
-\layout Enumerate
-
-Nodes will recovery quota asynchronously, ie.
- they will start normal operations, without waiting for quota recovery to
- complete.
-\layout Enumerate
-
-
-\series bold 
-Slave recovery initiation:
-\begin_deeper 
-\layout Enumerate
-
-Slave recovery is initiated on a per-connection basis
-\begin_deeper 
-\layout Enumerate
-
-Upon obtaining a new connection to a server node that can be a master during
- normal operations
-\layout Enumerate
-
-Upon entering normal operations while connections are present 
-\end_deeper 
-\layout Enumerate
-
-The recovery is aborted if a connection fails.
-\layout Enumerate
-
-A collection of threads is needed to handle this recovery
-\layout Enumerate
-
-The quota file handling should be sufficiently concurrent that multiple
- connections can recover in parallel
-\end_deeper 
-\layout Enumerate
-
-
-\series bold 
-Slave recovery:
-\series default 
-\begin_deeper 
-\layout Enumerate
-
-During normal use the node will iterate through all the users and groups
- in the operational quota file.
-\layout Enumerate
-
-If the connection is not one to the master for this uid/gid go to the next
- uid/gid.
-\layout Enumerate
-
-If such a uid/gid is also found in the node's administrative quota file,
- this node is the master for that id and this id will be skipped, else continue
-\series bold 
-.
-\layout Enumerate
-
-Release unreasonably high limits for this uid/gid.
-\layout Enumerate
-
-The contexts used for updating quota from the filter should be design so
- that these releases can be made concurrent with normal use.
-\end_deeper 
-\layout Enumerate
-
-
-\series bold 
-Master recovery initiation
-\begin_deeper 
-\layout Enumerate
-
-Master recovery requires connections to all other servers, it is initiated:
-\begin_deeper 
-\layout Enumerate
-
-If upon entering normal operations all connections are present
-\layout Enumerate
-
-If during normal operation all connections reach a usable state
-\end_deeper 
-\layout Enumerate
-
-It is aborted if any connection fails during master recovery
-\end_deeper 
-\layout Enumerate
-
-
-\series bold 
-Master recovery:
-\begin_deeper 
-\layout Enumerate
-
-During normal use the master will iterate through the administrative quota
- file.
-\layout Enumerate
-
-It will lock quota operations on the master for that uid.
-\layout Enumerate
-
-For each uid/gid found it will make 
-\series bold 
-a new quota related master to slave 
-\series default 
-RPC to all other servers and ask for the current limit (and usage).
-\layout Enumerate
-
-If a response is obtained from all nodes, the operational limit on the master
- node is updated so that the sum of all operational limits is the clusterwide
- administrative limit.
-\layout Enumerate
-
-If a response is not obtained from all servers, abort.
-\end_deeper 
-\layout Subsection
-
-Soft Limits
-\layout Standard
-
-Soft quota is not enforced in fs layer on master or slave.
- It's only enforced in obd layer on Master:
-\layout Enumerate
-
-The grace time and soft start time will be kept in adminstrative file.
-\layout Enumerate
-
-Master monitor the administrative usage on each qunit acquire/release handling:
- log the soft start time once the administrative usage >= administrative
- soft limit, clear the soft start time once the administrative usage < administr
-ative soft limit.
-\layout Enumerate
-
-Master will reject any qunit acquire request if soft start time + grace
- time < current time.
-\layout Standard
-
-Make sure we have unit tests and integration and system tests that verify
- this comprehensively.
-\layout Section
-
-Changelog
-\layout Description
-
-2005/01/29 First draft.
- Based on review of Zhaohongs writings and ERS.
-\layout Description
-
-2005/02/06 Second draft, much more detail to aid the team
-\the_end
index f2c2d76..00c4db7 100644 (file)
@@ -5,5 +5,5 @@
 # See the file COPYING in this distribution
 
 SUBDIRS = linux lustre
-EXTRA_DIST = ioctl.h liblustre.h 
+EXTRA_DIST = ioctl.h liblustre.h
 
index 382021e..f88243a 100644 (file)
@@ -62,7 +62,7 @@
 #include <fcntl.h>
 
 #include <libcfs/list.h>
-#include <portals/p30.h>
+#include <lnet/lnet.h>
 #include <libcfs/kp30.h>
 
 /* definitions for liblustre */
@@ -89,6 +89,9 @@ typedef unsigned short umode_t;
 #ifndef smp_processor_id
 #define smp_processor_id() 0
 #endif
+#ifndef smp_num_cpus
+#define smp_num_cpus 1
+#endif
 
 /* always adopt 2.5 definitions */
 #define KERNEL_VERSION(a,b,c) ((a)*100+(b)*10+c)
@@ -723,7 +726,7 @@ int     cap_get_flag(cap_t, cap_value_t, cap_flag_t, cap_flag_value_t *);
 /* log related */
 static inline int llog_init_commit_master(void) { return 0; }
 static inline int llog_cleanup_commit_master(int force) { return 0; }
-static inline void portals_run_lbug_upcall(char *file, const char *fn,
+static inline void libcfs_run_lbug_upcall(char *file, const char *fn,
                                            const int l){}
 
 /* completion */
index f0d145f..aa0153d 100644 (file)
@@ -15,4 +15,4 @@ EXTRA_DIST = lprocfs_status.h lustre_debug.h lustre_ha.h lustre_lib.h \
   lustre_export.h lustre_log.h obd_echo.h \
   lustre_compat25.h lustre_fsfilt.h lustre_import.h lustre_mds.h obd.h \
   lvfs.h lvfs_linux.h lustre_cfg.h lustre_lite.h  lustre_idl.h \
-  lustre_quota.h
+  lustre_quota.h lustre_ucache.h
index 81a4286..fa1cb35 100644 (file)
@@ -15,7 +15,7 @@ struct llog_canceld_ctxt {
         struct list_head           llcd_list;  /* free or pending struct list */
         struct llog_ctxt          *llcd_ctxt;
         struct llog_commit_master *llcd_lcm;
-        int                        llcd_tries; /* number of tries to send */
+        int                        llcd_size;
         int                        llcd_cookiebytes;
         struct llog_cookie         llcd_cookies[0];
 };
index 35a7cde..28c2092 100644 (file)
 
 #include <libcfs/linux/portals_compat25.h>
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4)
+#define NGROUPS_SMALL           NGROUPS
+#define NGROUPS_PER_BLOCK       ((int)(EXEC_PAGESIZE / sizeof(gid_t)))
+
+struct group_info {
+        int        ngroups;
+        atomic_t   usage;
+        gid_t      small_block[NGROUPS_SMALL];
+        int        nblocks;
+        gid_t     *blocks[0];
+};
+#define current_ngroups current->ngroups
+#define current_groups current->groups
+
+struct group_info *groups_alloc(int gidsetsize);
+void groups_free(struct group_info *ginfo);
+#else /* >= 2.6.4 */
+
+#define current_ngroups current->group_info->ngroups
+#define current_groups current->group_info->small_block
+
+#endif
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 
 /*
@@ -88,11 +111,10 @@ static inline int cleanup_group_info(void)
 {
         struct group_info *ginfo;
 
-        ginfo = groups_alloc(2);
+        ginfo = groups_alloc(0);
         if (!ginfo)
                 return -ENOMEM;
 
-        ginfo->ngroups = 0;
         set_current_groups(ginfo);
         put_group_info(ginfo);
 
@@ -142,7 +164,6 @@ static inline int cleanup_group_info(void)
 #endif
 #define KDEVT_INIT(val)                 (val)
 #define ext3_xattr_set_handle           ext3_xattr_set
-#define extN_xattr_set_handle           extN_xattr_set
 #define try_module_get                  __MOD_INC_USE_COUNT
 #define module_put                      __MOD_DEC_USE_COUNT
 #define LTIME_S(time)                   (time)
index e550272..a554739 100644 (file)
@@ -30,7 +30,7 @@
 do { if (index > ASSERT_MAX_SIZE_MB << (20 - PAGE_SHIFT)) {             \
         CERROR("bad page index %lu > %Lu\n", index,                     \
                ASSERT_MAX_SIZE_MB << (20 - PAGE_SHIFT));                \
-        portal_debug = ~0UL;                                            \
+        libcfs_debug = ~0UL;                                            \
         OP;                                                             \
 }} while(0)
 
@@ -38,7 +38,7 @@ do { if (index > ASSERT_MAX_SIZE_MB << (20 - PAGE_SHIFT)) {             \
 do { if (offset > ASSERT_MAX_SIZE_MB << 20) {                           \
         CERROR("bad file offset %Lu > %Lu\n", offset,                   \
                ASSERT_MAX_SIZE_MB << 20);                               \
-        portal_debug = ~0UL;                                            \
+        libcfs_debug = ~0UL;                                            \
         OP;                                                             \
 }} while(0)
 
index 91ae67d..bbc3979 100644 (file)
@@ -28,7 +28,7 @@
 #define _LUSTRE_DISK_H
 
 #include <linux/types.h>
-#include <portals/types.h>
+#include <lnet/types.h>
 
 
 /****************** persistent mount data *********************/
@@ -66,8 +66,8 @@ static inline char *mt_str(enum ldd_mount_type mt)
 }
 
 struct host_desc {
-        ptl_nid_t primary; 
-        ptl_nid_t backup;
+        lnet_nid_t primary; 
+        lnet_nid_t backup;
 };
 
 struct lustre_disk_data {
@@ -76,8 +76,10 @@ struct lustre_disk_data {
         char      ldd_fsname[64];            /* filesystem this server is part of */
         char      ldd_svname[64];            /* this server's name (lustre-mdt0001) */
         char      ldd_mount_opts[128];       /* target fs mount opts */
+        //fixme just make this a string
         struct host_desc    ldd_mgmtnid;     /* mgmt nid; lmd can override */
         enum ldd_mount_type ldd_mount_type;  /* target fs type LDD_MT_* */
+        //server failover list - must pass to mgs when we first register
 };
         
 #define IS_MDT(data)   ((data)->ldd_flags & LDD_F_SV_TYPE_MDT)
@@ -123,9 +125,7 @@ struct mkfs_opts {
         char  mo_loopdev[128];          /* in case a loop dev is needed */
         long  mo_device_sz;
         int   mo_flags; 
-        /* Below here is required for mdt,ost,or client logs */
-        struct host_desc mo_hostnid;    /* server nid + failover - need to know
-                                           for client log */
+        /* Below here is required for writing mdt,ost,or client logs */
         int   mo_stripe_sz;
         int   mo_stripe_count;
         int   mo_stripe_pattern;
index fcc9a74..5fb0019 100644 (file)
@@ -68,18 +68,13 @@ typedef enum {
 #define LDLM_FL_WARN           0x008000 /* see ldlm_cli_cancel_unused */
 #define LDLM_FL_DISCARD_DATA   0x010000 /* discard (no writeback) on cancel */
 
-#define LDLM_FL_NO_TIMEOUT    0x020000 /* Blocked by CW lock - wait
-                                           indefinitely */
+#define LDLM_FL_NO_TIMEOUT     0x020000 /* Blocked by group lock - wait
+                                         * indefinitely */
 
 /* file & record locking */
 #define LDLM_FL_BLOCK_NOWAIT   0x040000 // server told not to wait if blocked
 #define LDLM_FL_TEST_LOCK      0x080000 // return blocking lock
 
-/* These are flags that are mapped into the flags and ASTs of blocking locks */
-#define LDLM_AST_DISCARD_DATA  0x80000000 /* Add FL_DISCARD to blocking ASTs */
-/* Flags sent in AST lock_flags to be mapped into the receiving lock. */
-#define LDLM_AST_FLAGS         (LDLM_FL_DISCARD_DATA)
-
 /* XXX FIXME: This is being added to b_size as a low-risk fix to the fact that
  * the LVB filling happens _after_ the lock has been granted, so another thread
  * can match before the LVB has been updated.  As a dirty hack, we set
@@ -101,6 +96,11 @@ typedef enum {
 /* Don't drop lock covering mmapped file in LRU */
 #define LDLM_FL_NO_LRU         0x400000
 
+/* These are flags that are mapped into the flags and ASTs of blocking locks */
+#define LDLM_AST_DISCARD_DATA  0x80000000 /* Add FL_DISCARD to blocking ASTs */
+/* Flags sent in AST lock_flags to be mapped into the receiving lock. */
+#define LDLM_AST_FLAGS         (LDLM_FL_DISCARD_DATA)
+
 /* The blocking callback is overloaded to perform two functions.  These flags
  * indicate which operation should be performed. */
 #define LDLM_CB_BLOCKING    1
@@ -267,7 +267,7 @@ struct ldlm_resource {
         struct list_head       lr_converting;
         struct list_head       lr_waiting;
         ldlm_mode_t            lr_most_restr;
-        ldlm_type_t            lr_type; /* LDLM_PLAIN or LDLM_EXTENT */
+        ldlm_type_t            lr_type; /* LDLM_{PLAIN,EXTENT,FLOCK} */
         struct ldlm_resource  *lr_root;
         struct ldlm_res_id     lr_name;
         atomic_t               lr_refcount;
index 2cc850e..b82effc 100644 (file)
@@ -155,8 +155,7 @@ static inline void *fsfilt_start(struct obd_device *obd, struct inode *inode,
         return fsfilt_start_log(obd, inode, op, oti, 0);
 }
 
-static inline void *fsfilt_brw_start_log(struct obd_device *obd,
-                                         int objcount,
+static inline void *fsfilt_brw_start_log(struct obd_device *obd, int objcount,
                                          struct fsfilt_objinfo *fso,
                                          int niocount, struct niobuf_local *nb,
                                          struct obd_trans_info *oti, int logs)
@@ -351,11 +350,8 @@ static inline int fsfilt_map_inode_pages(struct obd_device *obd,
                                                   created, create, sem);
 }
 
-static inline int fs_prep_san_write(struct obd_device *obd,
-                                    struct inode *inode,
-                                    long *blocks,
-                                    int nblocks,
-                                    loff_t newsize)
+static inline int fs_prep_san_write(struct obd_device *obd, struct inode *inode,
+                                    long *blocks, int nblocks, loff_t newsize)
 {
         return obd->obd_fsops->fs_prep_san_write(inode, blocks,
                                                  nblocks, newsize);
index b0cb0ed..0d1673b 100644 (file)
 #ifndef _LUSTRE_IDL_H_
 #define _LUSTRE_IDL_H_
 
+#ifdef HAVE_ASM_TYPES_H
+#include <asm/types.h>
+#else
+#include <lustre/types.h>
+#endif
+
 #ifdef __KERNEL__
-# include <asm/types.h>
 # include <linux/types.h>
-# include <linux/fs.h> /* to check for FMODE_EXEC, lest we redefine */
+# include <linux/fs.h>    /* to check for FMODE_EXEC, dev_t, lest we redefine */
 #else
 #ifdef __CYGWIN__
 # include <sys/types.h>
 #else
-# include <asm/types.h>
 # include <stdint.h>
 #endif
 #endif
@@ -421,6 +425,7 @@ extern void lustre_swab_obd_statfs (struct obd_statfs *os);
 #define OBD_BRW_FROM_GRANT      0x20 /* the osc manages this under llite */
 #define OBD_BRW_GRANTED         0x40 /* the ost manages this */
 #define OBD_BRW_DROP            0x80 /* drop the page after IO */
+#define OBD_BRW_NOQUOTA        0x100
 
 #define OBD_OBJECT_EOF 0xffffffffffffffffULL
 
@@ -447,8 +452,6 @@ extern void lustre_swab_niobuf_remote (struct niobuf_remote *nbr);
 
 /* request structure for OST's */
 
-#define OST_REQ_HAS_OA1  0x1
-
 struct ost_body {
         struct  obdo oa;
 };
@@ -822,9 +825,9 @@ struct ldlm_extent {
 struct ldlm_flock {
         __u64 start;
         __u64 end;
-        __u64 blocking_export;
-        pid_t blocking_pid;
-        pid_t pid;
+        __u64 blocking_export;  /* not actually used over the wire */
+        __u32 blocking_pid;     /* not actually used over the wire */
+        __u32 pid;
 };
 
 /* it's important that the fields of the ldlm_extent structure match
index 3cd0fb3..d0621f1 100644 (file)
 #endif
 #endif
 
-#ifndef LPU64
-/* x86_64 defines __u64 as "long" in userspace, but "long long" in the kernel */
-#if defined(__x86_64__) && defined(__KERNEL__)
-# define LPU64 "%Lu"
-# define LPD64 "%Ld"
-# define LPX64 "%#Lx"
-# define LPSZ  "%lu"
-# define LPSSZ "%ld"
-#elif (BITS_PER_LONG == 32 || __WORDSIZE == 32)
-# define LPU64 "%Lu"
-# define LPD64 "%Ld"
-# define LPX64 "%#Lx"
-# define LPSZ  "%u"
-# define LPSSZ "%d"
-#elif (BITS_PER_LONG == 64 || __WORDSIZE == 64)
-# define LPU64 "%lu"
-# define LPD64 "%ld"
-# define LPX64 "%#lx"
-# define LPSZ  "%lu"
-# define LPSSZ "%ld"
-#endif
-#ifndef LPU64
-# error "No word size defined"
-#endif
-#endif
-
 /* target.c */
 struct ptlrpc_request;
 struct recovd_data;
@@ -261,8 +235,8 @@ static inline int obd_ioctl_is_invalid(struct obd_ioctl_data *data)
                 CERROR("OBD ioctl: plen2 set but NULL pointer\n");
                 return 1;
         }
-        if (obd_ioctl_packlen(data) != data->ioc_len) {
-                CERROR("OBD ioctl: packlen exceeds ioc_len (%d != %d)\n",
+        if (obd_ioctl_packlen(data) > data->ioc_len) {
+                CERROR("OBD ioctl: packlen exceeds ioc_len (%d > %d)\n",
                        obd_ioctl_packlen(data), data->ioc_len);
                 return 1;
         }
@@ -492,7 +466,7 @@ static inline void obd_ioctl_freedata(char *buf, int len)
 #define ECHO_IOC_CANCEL                _IOWR('f', 203, long)
 
 /* XXX _IOWR('f', 250, long) has been defined in
- * portals/include/libcfs/kp30.h for debug, don't use it
+ * lnet/include/libcfs/kp30.h for debug, don't use it
  */
 
 /* Until such time as we get_info the per-stripe maximum from the OST,
index 094eafe..968187a 100644 (file)
@@ -72,6 +72,7 @@ enum {
 #define LLAP_FROM_COOKIE(c)                                                    \
         (LASSERT(((struct ll_async_page *)(c))->llap_magic == LLAP_MAGIC),     \
          (struct ll_async_page *)(c))
+
 #define LL_MAX_BLKSIZE          (4UL * 1024 * 1024)
 
 #include <lustre/lustre_user.h>
index 3b1ebc6..215e6a0 100644 (file)
@@ -78,14 +78,14 @@ struct llog_fill_rec_data {
 /* llog.c  -  general API */
 typedef int (*llog_cb_t)(struct llog_handle *, struct llog_rec_hdr *, void *);
 typedef int (*llog_fill_rec_cb_t)(struct llog_rec_hdr *rec, void *data);
+extern struct llog_handle *llog_alloc_handle(void);
 int llog_init_handle(struct llog_handle *handle, int flags,
                      struct obd_uuid *uuid);
+extern void llog_free_handle(struct llog_handle *handle);
 int llog_process(struct llog_handle *loghandle, llog_cb_t cb,
                  void *data, void *catdata);
-extern struct llog_handle *llog_alloc_handle(void);
-extern void llog_free_handle(struct llog_handle *handle);
-extern int llog_close(struct llog_handle *cathandle);
 extern int llog_cancel_rec(struct llog_handle *loghandle, int index);
+extern int llog_close(struct llog_handle *cathandle);
 
 /* llog_cat.c   -  catalog api */
 struct llog_process_data {
@@ -233,7 +233,7 @@ static inline int llog_gen_lt(struct llog_gen a, struct llog_gen b)
 static inline int llog_obd2ops(struct llog_ctxt *ctxt,
                                struct llog_operations **lop)
 {
-       if (ctxt == NULL)
+        if (ctxt == NULL)
                 return -ENOTCONN;
 
         *lop = ctxt->loc_logops;
index 6f784c6..e032129 100644 (file)
@@ -40,19 +40,14 @@ struct lustre_md {
         struct lov_stripe_md *lsm;
 };
 
-struct ll_uctxt {
-        __u32 gid1;
-        __u32 gid2;
-};
-
 struct mdc_op_data {
-        struct ll_fid fid1;
-        struct ll_fid fid2;
-        struct ll_uctxt ctxt;
-        __u64 mod_time;
-        const char *name;
-        int namelen;
-        __u32 create_mode;
+        struct ll_fid    fid1;
+        struct ll_fid    fid2;
+        __u64            mod_time;
+        const char      *name;
+        int              namelen;
+        __u32            create_mode;
+        __u32            suppgids[2];
 };
 
 struct mds_update_record {
@@ -73,15 +68,9 @@ struct mds_update_record {
         __u64 ur_time;
         __u32 ur_mode;
         __u32 ur_flags;
+        struct lvfs_grp_hash_entry *ur_grp_entry;
 };
 
-#define ur_fsuid    ur_uc.luc_fsuid
-#define ur_fsgid    ur_uc.luc_fsgid
-#define ur_cap      ur_uc.luc_cap
-#define ur_suppgid1 ur_uc.luc_suppgid1
-#define ur_suppgid2 ur_uc.luc_suppgid2
-#define ur_umask    ur_uc.luc_umask
-
 #define MDS_LR_SERVER_SIZE    512
 
 #define MDS_LR_CLIENT_START  8192
@@ -161,11 +150,10 @@ int it_open_error(int phase, struct lookup_intent *it);
 void mdc_set_lock_data(__u64 *lockh, void *data);
 int mdc_change_cbdata(struct obd_export *exp, struct ll_fid *fid, 
                       ldlm_iterator_t it, void *data);
-int mdc_intent_lock(struct obd_export *exp, struct ll_uctxt *, 
-                    struct ll_fid *parent, 
-                    const char *name, int len, void *lmm, int lmmsize,
-                    struct ll_fid *child,
-                    struct lookup_intent *, int, 
+int mdc_intent_lock(struct obd_export *exp,
+                    struct mdc_op_data *,
+                    void *lmm, int lmmsize,
+                    struct lookup_intent *, int,
                     struct ptlrpc_request **reqp,
                     ldlm_blocking_callback cb_blocking);
 int mdc_enqueue(struct obd_export *exp,
@@ -207,7 +195,7 @@ int mdc_readpage(struct obd_export *exp, struct ll_fid *mdc_fid, __u64 offset,
                  struct page *, struct ptlrpc_request **);
 int mdc_create(struct obd_export *exp, struct mdc_op_data *op_data,
                const void *data, int datalen, int mode, __u32 uid, __u32 gid,
-               __u64 rdev, struct ptlrpc_request **request);
+               __u32 cap_effective, __u64 rdev,struct ptlrpc_request **request);
 int mdc_unlink(struct obd_export *exp, struct mdc_op_data *data,
                struct ptlrpc_request **request);
 int mdc_link(struct obd_export *exp, struct mdc_op_data *data,
index 1191f1a..55e7245 100644 (file)
 
 #include <libcfs/kp30.h>
 // #include <linux/obd.h>
-#include <portals/p30.h>
+#include <lnet/lnet.h>
 #include <linux/lustre_idl.h>
 #include <linux/lustre_ha.h>
 #include <linux/lustre_import.h>
 #include <linux/lprocfs_status.h>
 
 /* MD flags we _always_ use */
-#define PTLRPC_MD_OPTIONS  (PTL_MD_EVENT_START_DISABLE | \
-                            PTL_MD_LUSTRE_COMPLETION_SEMANTICS)
+#define PTLRPC_MD_OPTIONS  0
 
-/* Define some large-ish maxima for bulk I/O 
- * CAVEAT EMPTOR, with multinet (i.e. gateways forwarding between networks)
+/* Define maxima for bulk I/O 
+ * CAVEAT EMPTOR, with multinet (i.e. routers forwarding between networks)
  * these limits are system wide and not interface-local. */
-#define PTLRPC_MAX_BRW_SIZE     (1 << 20)
-#define PTLRPC_MAX_BRW_PAGES    512
-
-/* ...reduce to fit... */
-
-#if CRAY_PORTALS
-/* include a cray header here if relevant
- * NB liblustre SIZE/PAGES is affected too, but it merges contiguous
- * chunks, so FTTB, it always used contiguous MDs */
-#else
-# include <portals/lib-types.h>
-#endif
-
-#if (defined(PTL_MTU) && (PTL_MTU < PTLRPC_MAX_BRW_SIZE))
-# undef  PTLRPC_MAX_BRW_SIZE
-# define PTLRPC_MAX_BRW_SIZE  PTL_MTU
-#endif
-#if (defined(PTL_MD_MAX_IOV) && (PTL_MD_MAX_IOV < PTLRPC_MAX_BRW_PAGES ))
-# undef  PTLRPC_MAX_BRW_PAGES
-# define PTLRPC_MAX_BRW_PAGES PTL_MD_MAX_IOV
-#endif
-
-/* ...and make consistent... */
+#define PTLRPC_MAX_BRW_SIZE     PTL_MTU
+#define PTLRPC_MAX_BRW_PAGES    (PTLRPC_MAX_BRW_SIZE/PAGE_SIZE)
 
+/* When PAGE_SIZE is a constant, we can check our arithmetic here with cpp! */
 #ifdef __KERNEL__
-#if (PTLRPC_MAX_BRW_SIZE > PTLRPC_MAX_BRW_PAGES * PAGE_SIZE)
-# undef  PTLRPC_MAX_BRW_SIZE
-# define PTLRPC_MAX_BRW_SIZE   (PTLRPC_MAX_BRW_PAGES * PAGE_SIZE)
-#else
-# undef  PTLRPC_MAX_BRW_PAGES
-# define PTLRPC_MAX_BRW_PAGES  (PTLRPC_MAX_BRW_SIZE / PAGE_SIZE)
-#endif
-
-#if ((PTLRPC_MAX_BRW_PAGES & (PTLRPC_MAX_BRW_PAGES - 1)) != 0)
-#error "PTLRPC_MAX_BRW_PAGES isn't a power of two"
-#endif
-#else /* !__KERNEL__ */
-/* PAGE_SIZE isn't a constant, can't use CPP on it.  We assume that the
- * limit is on the number of pages for large pages, which is currently true. */
-# undef  PTLRPC_MAX_BRW_PAGES
-# define PTLRPC_MAX_BRW_PAGES  (PTLRPC_MAX_BRW_SIZE / PAGE_SIZE)
+# if ((PTLRPC_MAX_BRW_PAGES & (PTLRPC_MAX_BRW_PAGES - 1)) != 0)
+#  error "PTLRPC_MAX_BRW_PAGES isn't a power of two"
+# endif
+# if (PTLRPC_MAX_BRW_SIZE != (PTLRPC_MAX_BRW_PAGES * PAGE_SIZE))
+#  error "PTLRPC_MAX_BRW_SIZE isn't PTLRPC_MAX_BRW_PAGES * PAGE_SIZE"
+# endif
+# if (PTLRPC_MAX_BRW_SIZE > PTL_MTU)
+#  error "PTLRPC_MAX_BRW_SIZE too big"
+# endif
+# if (PTLRPC_MAX_BRW_PAGES > PTL_MD_MAX_IOV)
+#  error "PTLRPC_MAX_BRW_PAGES too big"
+# endif
 #endif /* __KERNEL__ */
 
 /* Size over which to OBD_VMALLOC() rather than OBD_ALLOC() service request
 #define LDLM_NBUFS       64
 #define LDLM_BUFSIZE    (8 * 1024)
 #define LDLM_MAXREQSIZE (5 * 1024)
+#define LDLM_MAXREPSIZE (1024)
 
 #define MGT_MAX_THREADS 8UL
 #define MGT_NUM_THREADS max(min_t(unsigned long, num_physpages / 8192, \
                                   MDT_MAX_THREADS), 2UL)
 #define MDS_NBUFS       (64 * smp_num_cpus)
 #define MDS_BUFSIZE     (8 * 1024)
-/* Assume file name length = FNAME_MAX = 256 (true for extN).
+/* Assume file name length = FNAME_MAX = 256 (true for ext3).
  *        path name length = PATH_MAX = 4096
  *        LOV MD size max  = EA_MAX = 4000
  * symlink:  FNAME_MAX + PATH_MAX  <- largest
  * except in the open case where there are a large number of OSTs in a LOV.
  */
 #define MDS_MAXREQSIZE  (5 * 1024)
+#define MDS_MAXREPSIZE  (9 * 1024)
 
 #define OST_MAX_THREADS 36UL
 #define OST_NUM_THREADS max(min_t(unsigned long, num_physpages / 8192, \
                                   OST_MAX_THREADS), 2UL)
 #define OST_NBUFS       (64 * smp_num_cpus)
 #define OST_BUFSIZE     (8 * 1024)
-/* OST_MAXREQSIZE ~= 1640 bytes =
- * lustre_msg + obdo + 16 * obd_ioobj + 64 * niobuf_remote
+/* OST_MAXREQSIZE ~= 4768 bytes =
+ * lustre_msg + obdo + 16 * obd_ioobj + 256 * niobuf_remote
  *
  * - single object with 16 pages is 512 bytes
  * - OST_MAXREQSIZE must be at least 1 page of cookies plus some spillover
  */
 #define OST_MAXREQSIZE  (5 * 1024)
+#define OST_MAXREPSIZE  (9 * 1024)
 
 #define PTLBD_NUM_THREADS        4
 #define PTLBD_NBUFS      64
 
 struct ptlrpc_connection {
         struct list_head        c_link;
-        ptl_process_id_t        c_peer;
+        lnet_process_id_t        c_peer;
         struct obd_uuid         c_remote_uuid;
         atomic_t                c_refcount;
 };
@@ -243,7 +221,7 @@ struct ptlrpc_bulk_desc;
  * ptlrpc callback & work item stuff
  */
 struct ptlrpc_cb_id {
-        void   (*cbid_fn)(ptl_event_t *ev);     /* specific callback fn */
+        void   (*cbid_fn)(lnet_event_t *ev);     /* specific callback fn */
         void    *cbid_arg;                      /* additional arg */
 };
 
@@ -259,18 +237,19 @@ struct ptlrpc_reply_state {
         struct list_head       rs_debug_list;
 #endif
         /* updates to following flag serialised by srv_request_lock */
-        unsigned int           rs_difficult:1;   /* ACK/commit stuff */
-        unsigned int           rs_scheduled:1;   /* being handled? */
-        unsigned int           rs_scheduled_ever:1; /* any schedule attempts? */
-        unsigned int           rs_handled:1;     /* been handled yet? */
-        unsigned int           rs_on_net:1;      /* reply_out_callback pending? */
+        unsigned int           rs_difficult:1;     /* ACK/commit stuff */
+        unsigned int           rs_scheduled:1;     /* being handled? */
+        unsigned int           rs_scheduled_ever:1;/* any schedule attempts? */
+        unsigned int           rs_handled:1;  /* been handled yet? */
+        unsigned int           rs_on_net:1;   /* reply_out_callback pending? */
+        unsigned int           rs_prealloc:1; /* rs from prealloc list */
 
         int                    rs_size;
         __u64                  rs_transno;
         __u64                  rs_xid;
         struct obd_export     *rs_export;
         struct ptlrpc_service *rs_service;
-        ptl_handle_md_t        rs_md_h;
+        lnet_handle_md_t       rs_md_h;
         atomic_t               rs_refcount;
 
         /* locks awaiting client reply ACK */
@@ -281,6 +260,8 @@ struct ptlrpc_reply_state {
         struct lustre_msg      rs_msg;
 };
 
+struct ptlrpc_thread;
+
 enum rq_phase {
         RQ_PHASE_NEW         = 0xebc0de00,
         RQ_PHASE_RPC         = 0xebc0de01,
@@ -289,6 +270,13 @@ enum rq_phase {
         RQ_PHASE_COMPLETE    = 0xebc0de04,
 };
 
+struct ptlrpc_request_pool {
+        spinlock_t prp_lock;
+        struct list_head prp_req_list;    /* list of ptlrpc_request structs */
+        int prp_rq_size;
+        void (*prp_populate)(struct ptlrpc_request_pool *, int);
+};
+        
 struct ptlrpc_request {
         int rq_type; /* one of PTL_RPC_MSG_* */
         struct list_head rq_list;
@@ -304,6 +292,8 @@ struct ptlrpc_request {
         enum rq_phase rq_phase; /* one of RQ_PHASE_* */
         atomic_t rq_refcount;   /* client-side refcount for SENT race */
 
+        struct ptlrpc_thread *rq_svc_thread; /* initial thread servicing req */
+
         int rq_request_portal;  /* XXX FIXME bug 249 */
         int rq_reply_portal;    /* XXX FIXME bug 249 */
 
@@ -328,23 +318,24 @@ struct ptlrpc_request {
         enum lustre_imp_state rq_send_state;
 
         /* client+server request */
-        ptl_handle_md_t      rq_req_md_h;
+        lnet_handle_md_t      rq_req_md_h;
         struct ptlrpc_cb_id  rq_req_cbid;
 
         /* server-side... */
         struct timeval       rq_arrival_time;       /* request arrival time */
         struct ptlrpc_reply_state *rq_reply_state;  /* separated reply state */
         struct ptlrpc_request_buffer_desc *rq_rqbd; /* incoming request buffer*/
-#if CRAY_PORTALS
-        ptl_uid_t            rq_uid;            /* peer uid, used in MDS only */
+#if CRAY_XT3
+# error "Need to get the uid from the event?"
+        __u32                rq_uid;            /* peer uid, used in MDS only */
 #endif
         
         /* client-only incoming reply */
-        ptl_handle_md_t      rq_reply_md_h;
+        lnet_handle_md_t      rq_reply_md_h;
         wait_queue_head_t    rq_reply_waitq;
         struct ptlrpc_cb_id  rq_reply_cbid;
 
-        ptl_process_id_t   rq_peer;
+        lnet_process_id_t   rq_peer;
         struct obd_export *rq_export;
         struct obd_import *rq_import;
 
@@ -361,6 +352,8 @@ struct ptlrpc_request {
         void *rq_interpret_reply;               /* Async completion handler */
         union ptlrpc_async_args rq_async_args;  /* Async completion context */
         void *rq_ptlrpcd_data;
+        struct ptlrpc_request_pool *rq_pool;    /* Pool if request from
+                                                   preallocated list */
 };
 
 static inline const char *
@@ -455,19 +448,24 @@ struct ptlrpc_bulk_desc {
         __u64                  bd_last_xid;
 
         struct ptlrpc_cb_id    bd_cbid;         /* network callback info */
-        ptl_handle_md_t        bd_md_h;         /* associated MD */
+        lnet_handle_md_t        bd_md_h;         /* associated MD */
         
-#if (!CRAY_PORTALS && defined(__KERNEL__))
-        ptl_kiov_t             bd_iov[0];
+#if defined(__KERNEL__)
+        lnet_kiov_t             bd_iov[0];
 #else
-        ptl_md_iovec_t         bd_iov[0];
+        lnet_md_iovec_t         bd_iov[0];
 #endif
 };
 
 struct ptlrpc_thread {
-        struct list_head t_link;
+
+        struct list_head t_link; /* active threads for service, from svc->srv_threads */
 
         __u32 t_flags;
+
+        void *t_data; /* thread-private data (preallocated memory) */
+
+        unsigned int t_id; /* service thread index, from ptlrpc_start_threads */
         wait_queue_head_t t_ctl_waitq;
 };
 
@@ -475,7 +473,7 @@ struct ptlrpc_request_buffer_desc {
         struct list_head       rqbd_list;
         struct list_head       rqbd_reqs;
         struct ptlrpc_service *rqbd_service;
-        ptl_handle_md_t        rqbd_md_h;
+        lnet_handle_md_t       rqbd_md_h;
         int                    rqbd_refcount;
         char                  *rqbd_buffer;
         struct ptlrpc_cb_id    rqbd_cbid;
@@ -488,6 +486,7 @@ typedef void (*svcreq_printfn_t)(void *, struct ptlrpc_request *);
 struct ptlrpc_service {
         struct list_head srv_list;              /* chain thru all services */
         int              srv_max_req_size;      /* biggest request to receive */
+        int              srv_max_reply_size;    /* biggest reply to send */
         int              srv_buf_size;          /* size of individual buffers */
         int              srv_nbuf_per_group;    /* # buffers to allocate in 1 group */
         int              srv_nbufs;             /* total # req buffer descs allocated */
@@ -496,6 +495,7 @@ struct ptlrpc_service {
         int              srv_n_active_reqs;     /* # reqs being served */
         int              srv_rqbd_timeout;      /* timeout before re-posting reqs */
         int              srv_watchdog_timeout; /* soft watchdog timeout, in ms */
+        int              srv_num_threads;      /*# of threads to start/started*/
 
         __u32 srv_req_portal;
         __u32 srv_rep_portal;
@@ -514,7 +514,7 @@ struct ptlrpc_service {
         int               srv_nrqbd_receiving;  /* # posted request buffers */
         int               srv_n_history_rqbds;  /* # request buffers in history */
         int               srv_max_history_rqbds; /* max # request buffers in history */
-        
+
         atomic_t          srv_outstanding_replies;
         struct list_head  srv_active_replies;   /* all the active replies */
         struct list_head  srv_reply_queue;      /* replies waiting for service */
@@ -531,29 +531,46 @@ struct ptlrpc_service {
 
         struct proc_dir_entry   *srv_procroot;
         struct lprocfs_stats    *srv_stats;
+
+        /* List of free reply_states */
+        struct list_head srv_free_rs_list;
+        /* waitq to run, when adding stuff to srv_free_rs_list */
+        wait_queue_head_t srv_free_rs_waitq;
+        
+        /*
+         * if non-NULL called during thread creation (ptlrpc_start_thread())
+         * to initialize service specific per-thread state.
+         */
+        int (*srv_init)(struct ptlrpc_thread *thread);
+        /*
+         * if non-NULL called during thread shutdown (ptlrpc_main()) to
+         * destruct state created by ->srv_init().
+         */
+        void (*srv_done)(struct ptlrpc_thread *thread);
+
+        //struct ptlrpc_srv_ni srv_interfaces[0];
 };
 
 /* ptlrpc/events.c */
-extern ptl_handle_ni_t  ptlrpc_ni_h;
-extern ptl_handle_eq_t  ptlrpc_eq_h;
-extern int ptlrpc_uuid_to_peer(struct obd_uuid *uuid, ptl_process_id_t *peer);
-extern void request_out_callback (ptl_event_t *ev);
-extern void reply_in_callback(ptl_event_t *ev);
-extern void client_bulk_callback (ptl_event_t *ev);
-extern void request_in_callback(ptl_event_t *ev);
-extern void reply_out_callback(ptl_event_t *ev);
-extern void server_bulk_callback (ptl_event_t *ev);
+extern lnet_handle_eq_t ptlrpc_eq_h;
+extern int ptlrpc_uuid_to_peer(struct obd_uuid *uuid, lnet_process_id_t *peer);
+extern void request_out_callback (lnet_event_t *ev);
+extern void reply_in_callback(lnet_event_t *ev);
+extern void client_bulk_callback (lnet_event_t *ev);
+extern void request_in_callback(lnet_event_t *ev);
+extern void reply_out_callback(lnet_event_t *ev);
+extern void server_bulk_callback (lnet_event_t *ev);
 
 /* ptlrpc/connection.c */
 void ptlrpc_dump_connections(void);
 void ptlrpc_readdress_connection(struct ptlrpc_connection *, struct obd_uuid *);
-struct ptlrpc_connection *ptlrpc_get_connection(ptl_process_id_t peer,
+struct ptlrpc_connection *ptlrpc_get_connection(lnet_process_id_t peer,
                                                 struct obd_uuid *uuid);
 int ptlrpc_put_connection(struct ptlrpc_connection *c);
 struct ptlrpc_connection *ptlrpc_connection_addref(struct ptlrpc_connection *);
 void ptlrpc_init_connection(void);
 void ptlrpc_cleanup_connection(void);
-extern ptl_pid_t ptl_get_pid(void);
+extern lnet_pid_t ptl_get_pid(void);
 
 /* ptlrpc/niobuf.c */
 int ptlrpc_start_bulk_transfer(struct ptlrpc_bulk_desc *desc);
@@ -636,8 +653,16 @@ void ptlrpc_set_add_req(struct ptlrpc_request_set *, struct ptlrpc_request *);
 void ptlrpc_set_add_new_req(struct ptlrpc_request_set *,
                             struct ptlrpc_request *);
 
+void ptlrpc_free_rq_pool(struct ptlrpc_request_pool *pool);
+void ptlrpc_add_rqs_to_pool(struct ptlrpc_request_pool *pool, int num_rq);
+struct ptlrpc_request_pool *ptlrpc_init_rq_pool(int, int,
+                                                void (*populate_pool)(struct ptlrpc_request_pool *, int));
 struct ptlrpc_request *ptlrpc_prep_req(struct obd_import *imp, int opcode,
                                        int count, int *lengths, char **bufs);
+struct ptlrpc_request *ptlrpc_prep_req_pool(struct obd_import *imp, int opcode,
+                                            int count, int *lengths,
+                                            char **bufs,
+                                            struct ptlrpc_request_pool *pool);
 void ptlrpc_free_req(struct ptlrpc_request *request);
 void ptlrpc_req_finished(struct ptlrpc_request *request);
 void ptlrpc_req_finished_with_imp_lock(struct ptlrpc_request *request);
@@ -661,19 +686,22 @@ void ptlrpc_save_lock (struct ptlrpc_request *req,
 void ptlrpc_commit_replies (struct obd_device *obd);
 void ptlrpc_schedule_difficult_reply (struct ptlrpc_reply_state *rs);
 struct ptlrpc_service *ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size,
+                                       int max_reply_size,
                                        int req_portal, int rep_portal,
                                        int watchdog_timeout, /* in ms */
                                        svc_handler_t, char *name,
                                        struct proc_dir_entry *proc_entry,
-                                       svcreq_printfn_t);
+                                       svcreq_printfn_t, int num_threads);
 void ptlrpc_stop_all_threads(struct ptlrpc_service *svc);
-int ptlrpc_start_n_threads(struct obd_device *dev, struct ptlrpc_service *svc,
-                           int cnt, char *base_name);
+
+int ptlrpc_start_threads(struct obd_device *dev, struct ptlrpc_service *svc,
+                         char *base_name);
 int ptlrpc_start_thread(struct obd_device *dev, struct ptlrpc_service *svc,
-                        char *name);
+                        char *name, int id);
 int ptlrpc_unregister_service(struct ptlrpc_service *service);
 int liblustre_check_services (void *arg);
 void ptlrpc_daemonize(void);
+int ptlrpc_service_health_check(struct ptlrpc_service *);
 
 
 struct ptlrpc_svc_data {
@@ -699,6 +727,7 @@ void lustre_free_reply_state(struct ptlrpc_reply_state *rs);
 int lustre_msg_size(int count, int *lengths);
 int lustre_unpack_msg(struct lustre_msg *m, int len);
 void *lustre_msg_buf(struct lustre_msg *m, int n, int minlen);
+int lustre_msg_buflen(struct lustre_msg *m, int n);
 char *lustre_msg_string (struct lustre_msg *m, int n, int max_len);
 void *lustre_swab_buf(struct lustre_msg *, int n, int minlen, void *swabber);
 void *lustre_swab_reqbuf (struct ptlrpc_request *req, int n, int minlen,
index 6e0355a..a28c618 100644 (file)
@@ -94,4 +94,4 @@ struct quotacheck_info {
 #define LL_DQUOT_OFF(sb) do {} while(0)
 
 #endif /*!HAVE_QUOTA_SUPPORT */
-#endif                          /* _LUSTRE_QUOTA_H */
+#endif /* _LUSTRE_QUOTA_H */
index ac89de5..db28cef 100644 (file)
 #define UC_CACHE_CLEAR_INVALID(i)   (i)->ue_flags &= ~UC_CACHE_INVALID
 #define UC_CACHE_CLEAR_EXPIRED(i)   (i)->ue_flags &= ~UC_CACHE_EXPIRED
 
-struct upcall_cache;
-
 struct upcall_cache_entry {
         struct list_head        ue_hash;
-        atomic_t                ue_refcount;
         __u64                   ue_key;
-        struct upcall_cache    *ue_cache;
+        __u64                   ue_primary;
+        struct group_info      *ue_group_info;
+        atomic_t                ue_refcount;
         int                     ue_flags;
         wait_queue_head_t       ue_waitq;
         unsigned long           ue_acquire_expire;
         unsigned long           ue_expire;
 };
 
-#define UC_CACHE_UPCALL_MAXPATH (1024)
+#define UC_CACHE_HASH_SIZE        (128)
+#define UC_CACHE_HASH_INDEX(id)   ((id) & (UC_CACHE_HASH_SIZE - 1))
+#define UC_CACHE_UPCALL_MAXPATH   (1024UL)
 
 struct upcall_cache {
-        struct list_head       *uc_hashtable;
-        int                     uc_hashsize;
-        rwlock_t                uc_hashlock;
+        struct list_head        uc_hashtable[UC_CACHE_HASH_SIZE];
+        spinlock_t              uc_lock;
 
-        char                   *uc_name;
+        char                    uc_name[40];            /* for upcall */
         char                    uc_upcall[UC_CACHE_UPCALL_MAXPATH];
-        unsigned long           uc_acquire_expire;   /* max acquire time */
-        unsigned long           uc_entry_expire;     /* max entry life time */
-        unsigned long           uc_err_entry_expire; /* err entry life time */
-
-        /* functions */
-        unsigned int                (*hash)(struct upcall_cache *, __u64);
-        struct upcall_cache_entry*  (*alloc_entry)(struct upcall_cache *, __u64);
-        void                        (*free_entry)(struct upcall_cache *,
-                                                  struct upcall_cache_entry *);
-        int                         (*make_upcall)(struct upcall_cache *,
-                                                   struct upcall_cache_entry *);
-        int                         (*parse_downcall)(struct upcall_cache *,
-                                                      struct upcall_cache_entry *,
-                                                      void *args);
+        unsigned long           uc_acquire_expire;      /* jiffies */
+        unsigned long           uc_entry_expire;        /* jiffies */
 };
 
-void upcall_cache_init_entry(struct upcall_cache *cache,
-                             struct upcall_cache_entry *entry,
-                             __u64 key);
-struct upcall_cache_entry *
-upcall_cache_get_entry(struct upcall_cache *cache, __u64 key);
-void upcall_cache_put_entry(struct upcall_cache_entry *entry);
-int upcall_cache_downcall(struct upcall_cache *cache, __u64 key, void *args);
-void upcall_cache_flush_one(struct upcall_cache *cache, __u64 key);
+struct upcall_cache_entry *upcall_cache_get_entry(struct upcall_cache *hash,
+                                                  __u64 key, __u32 primary,
+                                                  __u32 ngroups, __u32 *groups);
+void upcall_cache_put_entry(struct upcall_cache *hash,
+                            struct upcall_cache_entry *entry);
+int upcall_cache_downcall(struct upcall_cache *hash, __u32 err, __u64 key,
+                          __u32 primary, __u32 ngroups, __u32 *groups);
 void upcall_cache_flush_idle(struct upcall_cache *cache);
 void upcall_cache_flush_all(struct upcall_cache *cache);
+struct upcall_cache *upcall_cache_init(const char *name);
+void upcall_cache_cleanup(struct upcall_cache *hash);
 
 #endif /* _UPCALL_CACHE_H */
index 99d1868..967efc5 100644 (file)
         #define __LVFS_H__
 
 #include <libcfs/kp30.h>
+#include <linux/lustre_ucache.h>
 
 #define LL_FID_NAMELEN (16 + 1 + 8 + 1)
 
 #if defined __KERNEL__
+#include <linux/lustre_compat25.h>
 #include <linux/lvfs_linux.h>
-#endif 
+#else
+struct group_info { /* unused */ };
+#endif
 
 #ifdef LIBLUSTRE
 #include <lvfs_user_fs.h>
 #endif
 
 /* simple.c */
+
 struct lvfs_ucred {
+        struct upcall_cache_entry *luc_uce;
         __u32 luc_fsuid;
         __u32 luc_fsgid;
         __u32 luc_cap;
@@ -54,14 +60,19 @@ struct lvfs_callback_ops {
 #define OBD_RUN_CTXT_MAGIC      0xC0FFEEAA
 #define OBD_CTXT_DEBUG          /* development-only debugging */
 struct lvfs_run_ctxt {
-        struct vfsmount *pwdmnt;
-        struct dentry   *pwd;
-        mm_segment_t     fs;
-        struct lvfs_ucred luc;
-        int              ngroups;
+        struct vfsmount         *pwdmnt;
+        struct dentry           *pwd;
+        mm_segment_t             fs;
+        struct lvfs_ucred        luc;
+        int                      ngroups;
         struct lvfs_callback_ops cb_ops;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
+        struct group_info       *group_info;
+#else
+        struct group_info        group_info;
+#endif
 #ifdef OBD_CTXT_DEBUG
-        __u32            magic;
+        __u32                    magic;
 #endif
 };
 
index d26fd50..1f8316f 100644 (file)
@@ -130,7 +130,6 @@ struct obd_async_page_ops {
         int  (*ap_refresh_count)(void *data, int cmd);
         void (*ap_fill_obdo)(void *data, int cmd, struct obdo *oa);
         void (*ap_completion)(void *data, int cmd, struct obdo *oa, int rc);
-        void (*ap_get_ucred)(void *data, struct lvfs_ucred *ouc);
 };
 
 /* the `oig' is passed down from a caller of obd rw methods.  the callee
@@ -212,6 +211,24 @@ struct filter_obd {
         int fo_r_in_flight; /* protected by fo_stats_lock */
         int fo_w_in_flight; /* protected by fo_stats_lock */
 
+        /*
+         * per-filter pool of kiobuf's allocated by filter_common_setup() and
+         * torn down by filter_cleanup(). Contains OST_NUM_THREADS elements of
+         * which ->fo_iobuf_count were allocated.
+         *
+         * This pool contains kiobuf used by
+         * filter_{prep,commit}rw_{read,write}() and is shared by all OST
+         * threads.
+         *
+         * Locking: none, each OST thread uses only one element, determined by
+         * its "ordinal number", ->t_id.
+         *
+         * This is (void *) array, because 2.4 and 2.6 use different iobuf
+         * structures.
+         */
+        void                   **fo_iobuf_pool;
+        int                      fo_iobuf_count;
+
         struct obd_histogram     fo_r_pages;
         struct obd_histogram     fo_w_pages;
         struct obd_histogram     fo_read_rpc_hist;
@@ -300,6 +317,7 @@ struct client_obd {
         /* used by quotacheck */
         spinlock_t               cl_qchk_lock;
         int                      cl_qchk_stat; /* quotacheck stat of the peer */
+        struct ptlrpc_request_pool *cl_rq_pool; /* emergency pool of requests */
 };
 
 /*a light client obd for mount-conf */
@@ -359,9 +377,11 @@ struct mds_obd {
         struct file                     *mds_lov_objid_filp;
         unsigned long                   *mds_client_bitmap;
         struct semaphore                 mds_orphan_recovery_sem;
+        struct upcall_cache             *mds_group_hash;
         struct lustre_quota_info         mds_quota_info;
         struct lustre_quota_ctxt         mds_quota_ctxt;
         atomic_t                         mds_quotachecking;
+        struct semaphore                 mds_health_sem;
 };
 
 struct echo_obd {
@@ -403,6 +423,7 @@ struct recovd_obd {
 struct ost_obd {
         struct ptlrpc_service *ost_service;
         struct ptlrpc_service *ost_create_service;
+        struct semaphore       ost_health_sem;
 };
 
 struct echo_client_obd {
@@ -460,6 +481,9 @@ struct obd_trans_info {
         struct llog_cookie       oti_onecookie;
         struct llog_cookie      *oti_logcookies;
         int                      oti_numcookies;
+
+        /* initial thread handling transaction */
+        struct ptlrpc_thread    *oti_thread; 
 };
 
 static inline void oti_alloc_cookies(struct obd_trans_info *oti,int num_cookies)
@@ -520,7 +544,7 @@ struct obd_device {
         int                     obd_minor;
         unsigned int obd_attached:1, obd_set_up:1, obd_recovering:1,
                 obd_abort_recovery:1, obd_replayable:1, obd_no_transno:1,
-                obd_no_recov:1, obd_stopping:1, obd_starting:1, 
+                obd_no_recov:1, obd_stopping:1, obd_starting:1,
                 obd_force:1, obd_fail:1;
         atomic_t                obd_refcount;
         wait_queue_head_t       obd_refcount_waitq;
@@ -730,6 +754,8 @@ struct obd_ops {
         int (*o_notify)(struct obd_device *obd, struct obd_device *watched,
                         int active);
 
+        int (*o_health_check)(struct obd_device *);
+
         /* quota methods */
         int (*o_quotacheck)(struct obd_export *, struct obd_quotactl *);
         int (*o_quotactl)(struct obd_export *, struct obd_quotactl *);
@@ -738,6 +764,10 @@ struct obd_ops {
          * NOTE: If adding ops, add another LPROCFS_OBD_OP_INIT() line
          * to lprocfs_alloc_obd_stats() in obdclass/lprocfs_status.c.
          * Also, add a wrapper function in include/linux/obd_class.h.
+         *
+         * Also note that if you add it to the END, you also have to change
+         * the num_stats calculation.
+         *
          */
 };
 
index 9475cea..fa15eca 100644 (file)
@@ -92,6 +92,9 @@ void ping_evictor_stop(void);
 
 char *obd_export_nid2str(struct obd_export *exp);
 
+int obd_export_evict_by_nid(struct obd_device *obd, char *nid);
+int obd_export_evict_by_uuid(struct obd_device *obd, char *uuid);
+
 /* config.c */
 int class_process_config(struct lustre_cfg *lcfg);
 int class_attach(struct lustre_cfg *lcfg);
@@ -585,9 +588,12 @@ static inline int
 obd_lvfs_open_llog(struct obd_export *exp, __u64 id_ino, struct dentry *dentry)
 {
         LASSERT(exp->exp_obd);
-
+        CERROR("FIXME what's the story here?  This needs to be an obd fn?\n");
+#if 0
         return lvfs_open_llog(&exp->exp_obd->obd_lvfs_ctxt, id_ino, 
                               dentry, exp->exp_obd);
+#endif
+        return 0;
 }
 
 #ifndef time_before
@@ -1052,6 +1058,31 @@ static inline int obd_quotactl(struct obd_export *exp,
         RETURN(rc);
 }
 
+static inline int obd_health_check(struct obd_device *obd)
+{
+        /* returns: 0 on healthy
+         *         >0 on unhealthy + reason code/flag
+         *            however the only suppored reason == 1 right now
+         *            We'll need to define some better reasons
+         *            or flags in the future.
+         *         <0 on error
+         */
+        int rc;
+        ENTRY;
+
+        /* don't use EXP_CHECK_OP, because NULL method is normal here */
+        if (obd == NULL || !OBT(obd)) {
+                CERROR("cleaned up obd\n");
+                RETURN(-EOPNOTSUPP);
+        }
+        if (!obd->obd_set_up || obd->obd_stopping)
+                RETURN(0);
+        if (!OBP(obd, health_check))
+                RETURN(0);
+
+        rc = OBP(obd, health_check)(obd);
+        RETURN(rc);
+}
 
 static inline int obd_register_observer(struct obd_device *obd,
                                         struct obd_device *observer)
@@ -1112,7 +1143,7 @@ typedef __u8 class_uuid_t[16];
 void class_uuid_unparse(class_uuid_t in, struct obd_uuid *out);
 
 /* lustre_peer.c    */
-int lustre_uuid_to_peer(char *uuid, ptl_nid_t *peer_nid);
+int lustre_uuid_to_peer(char *uuid, lnet_nid_t *peer_nid, int index);
 int class_add_uuid(char *uuid, __u64 nid);
 int class_del_uuid (char *uuid);
 void class_init_uuidlist(void);
index e65cdd7..cbbeeda 100644 (file)
@@ -40,6 +40,7 @@ extern unsigned int obd_dump_on_timeout;
 extern unsigned int obd_timeout;          /* seconds */
 #define PING_INTERVAL max(obd_timeout / 4, 1U)
 extern unsigned int ldlm_timeout;
+extern unsigned int obd_health_check_timeout;
 extern char obd_lustre_upcall[128];
 extern unsigned int obd_sync_filter;
 extern wait_queue_head_t obd_race_waitq;
@@ -293,7 +294,7 @@ static inline void OBD_FAIL_WRITE(int id, struct super_block *sb)
 # endif
 #endif  /* __KERNEL__ */
 
-extern atomic_t portal_kmemory;
+extern atomic_t libcfs_kmemory;
 
 #if defined(LUSTRE_UTILS) /* this version is for utils only */
 #define OBD_ALLOC_GFP(ptr, size, gfp_mask)                                    \
@@ -316,7 +317,7 @@ do {                                                                          \
                 CERROR("kmalloc of '" #ptr "' (%d bytes) failed at %s:%d\n",  \
                        (int)(size), __FILE__, __LINE__);                      \
                 CERROR("%d total bytes allocated by Lustre, %d by Portals\n", \
-                       atomic_read(&obd_memory), atomic_read(&portal_kmemory));\
+                       atomic_read(&obd_memory), atomic_read(&libcfs_kmemory));\
         } else {                                                              \
                 memset(ptr, 0, size);                                         \
                 atomic_add(size, &obd_memory);                                \
@@ -334,6 +335,8 @@ do {                                                                          \
 
 #define OBD_ALLOC(ptr, size) OBD_ALLOC_GFP(ptr, size, OBD_GFP_MASK)
 #define OBD_ALLOC_WAIT(ptr, size) OBD_ALLOC_GFP(ptr, size, GFP_KERNEL)
+#define OBD_ALLOC_PTR(ptr) OBD_ALLOC(ptr, sizeof *(ptr))
+#define OBD_ALLOC_PTR_WAIT(ptr) OBD_ALLOC_WAIT(ptr, sizeof *(ptr))
 
 #ifdef __arch_um__
 # define OBD_VMALLOC(ptr, size) OBD_ALLOC(ptr, size)
@@ -345,7 +348,7 @@ do {                                                                          \
                 CERROR("vmalloc of '" #ptr "' (%d bytes) failed at %s:%d\n",  \
                        (int)(size), __FILE__, __LINE__);                      \
                 CERROR("%d total bytes allocated by Lustre, %d by Portals\n", \
-                       atomic_read(&obd_memory), atomic_read(&portal_kmemory));\
+                       atomic_read(&obd_memory), atomic_read(&libcfs_kmemory));\
         } else {                                                              \
                 memset(ptr, 0, size);                                         \
                 atomic_add(size, &obd_memory);                                \
@@ -411,7 +414,7 @@ do {                                                                          \
                 CERROR("slab-alloc of '"#ptr"' (%d bytes) failed at %s:%d\n", \
                        (int)(size), __FILE__, __LINE__);                      \
                 CERROR("%d total bytes allocated by Lustre, %d by Portals\n", \
-                       atomic_read(&obd_memory), atomic_read(&portal_kmemory));\
+                       atomic_read(&obd_memory), atomic_read(&libcfs_kmemory));\
         } else {                                                              \
                 memset(ptr, 0, size);                                         \
                 atomic_add(size, &obd_memory);                                \
@@ -422,6 +425,8 @@ do {                                                                          \
         }                                                                     \
 } while (0)
 
+#define OBD_FREE_PTR(ptr) OBD_FREE(ptr, sizeof *(ptr))
+
 #define OBD_SLAB_FREE(ptr, slab, size)                                        \
 do {                                                                          \
         LASSERT(ptr);                                                         \
index 6faa7cd..1580bde 100644 (file)
@@ -4,7 +4,7 @@
 # See the file COPYING in this distribution
 
 if UTILS
-pkginclude_HEADERS = lustre_user.h liblustreapi.h
+pkginclude_HEADERS = lustre_user.h liblustreapi.h types.h
 endif
 
-EXTRA_DIST = lustre_user.h liblustreapi.h
+EXTRA_DIST = lustre_user.h liblustreapi.h types.h
index 9c4b9e5..6446634 100644 (file)
@@ -8,7 +8,16 @@
 
 #ifndef _LUSTRE_USER_H
 #define _LUSTRE_USER_H
+
+#ifdef HAVE_ASM_TYPES_H
 #include <asm/types.h>
+#else
+#include <lustre/types.h>
+#endif
+
+#ifdef HAVE_LINUX_QUOTA_H
+#include <linux/quota.h>
+#endif
 
 /*
  * asm-x86_64/processor.h on some SLES 9 distros seems to use
@@ -17,7 +26,6 @@
  */
 #define __ASM_X86_64_PROCESSOR_H
 
-#include <linux/quota.h>
 #ifdef __KERNEL__
 #include <linux/string.h>
 #else
@@ -141,6 +149,17 @@ struct if_quotacheck {
         int                     stat;
 };
 
+#define MDS_GRP_DOWNCALL_MAGIC 0x6d6dd620
+
+struct mds_grp_downcall_data {
+        __u32           mgd_magic;
+        __u32           mgd_err;
+        __u32           mgd_uid;
+        __u32           mgd_gid;
+        __u32           mgd_ngroups;
+        __u32           mgd_groups[0];
+};
+
 #ifndef __KERNEL__
 #define NEED_QUOTA_DEFS
 #else
@@ -213,4 +232,31 @@ struct if_quotactl {
         struct obd_uuid         obd_uuid;
 };
 
+#ifndef LPU64
+/* x86_64 defines __u64 as "long" in userspace, but "long long" in the kernel */
+#if defined(__x86_64__) && defined(__KERNEL__)
+# define LPU64 "%Lu"
+# define LPD64 "%Ld"
+# define LPX64 "%#Lx"
+# define LPSZ  "%lu"
+# define LPSSZ "%ld"
+#elif (BITS_PER_LONG == 32 || __WORDSIZE == 32)
+# define LPU64 "%Lu"
+# define LPD64 "%Ld"
+# define LPX64 "%#Lx"
+# define LPSZ  "%u"
+# define LPSSZ "%d"
+#elif (BITS_PER_LONG == 64 || __WORDSIZE == 64)
+# define LPU64 "%lu"
+# define LPD64 "%ld"
+# define LPX64 "%#lx"
+# define LPSZ  "%lu"
+# define LPSSZ "%ld"
+#endif
+#endif /* !LPU64 */
+
+#ifndef offsetof
+# define offsetof(typ,memb)     ((unsigned long)((char *)&(((typ *)0)->memb)))
+#endif
+
 #endif /* _LUSTRE_USER_H */
diff --git a/lustre/include/lustre/types.h b/lustre/include/lustre/types.h
new file mode 100644 (file)
index 0000000..5389d37
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef _LUSTRE_TYPES_H
+#define _LUSTRE_TYPES_H
+
+typedef unsigned short umode_t;
+
+#if (!defined(_LINUX_TYPES_H) && !defined(_BLKID_TYPES_H) && \
+       !defined(_EXT2_TYPES_H) && !defined(_I386_TYPES_H))
+
+/*
+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
+ * header files exported to user space
+ */
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+#endif
index beb776a..a84f323 100644 (file)
@@ -38,6 +38,7 @@ CONFIG_CKRM_TYPE_TASKCLASS=y
 CONFIG_CKRM_RES_NUMTASKS=m
 CONFIG_CKRM_CPU_SCHEDULE=y
 # CONFIG_CKRM_CPU_SCHEDULE_AT_BOOT is not set
+CONFIG_CKRM_RES_BLKIO=y
 CONFIG_CKRM_TYPE_SOCKETCLASS=y
 CONFIG_CKRM_RBCE=m
 CONFIG_CKRM_CRBCE=m
@@ -49,6 +50,7 @@ CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -65,6 +67,7 @@ CONFIG_STOP_MACHINE=y
 #
 # Processor type and features
 #
+CONFIG_MEM_MIRROR=y
 # CONFIG_X86_PC is not set
 # CONFIG_X86_ELAN is not set
 # CONFIG_X86_VOYAGER is not set
@@ -144,16 +147,6 @@ CONFIG_BOOT_IOREMAP=y
 CONFIG_REGPARM=y
 
 #
-# Performance-monitoring counters support
-#
-CONFIG_PERFCTR=y
-CONFIG_KPERFCTR=y
-# CONFIG_PERFCTR_DEBUG is not set
-# CONFIG_PERFCTR_INIT_TESTS is not set
-CONFIG_PERFCTR_VIRTUAL=y
-CONFIG_PERFCTR_GLOBAL=y
-
-#
 # Special options
 #
 CONFIG_PROC_MM=y
@@ -333,24 +326,16 @@ CONFIG_MTD_CFI_NOSWAP=y
 # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_GEOMETRY is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
 CONFIG_MTD_CFI_INTELEXT=m
 CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_AMDSTD_RETRY=0
 CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 CONFIG_MTD_ABSENT=m
+CONFIG_MTD_OBSOLETE_CHIPS=y
+CONFIG_MTD_AMDSTD=m
+CONFIG_MTD_SHARP=m
+CONFIG_MTD_JEDEC=m
 
 #
 # Mapping drivers for chip access
@@ -359,11 +344,13 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 CONFIG_MTD_PHYSMAP=m
 CONFIG_MTD_PHYSMAP_START=0x8000000
 CONFIG_MTD_PHYSMAP_LEN=0x4000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=4
+CONFIG_MTD_PHYSMAP_BUSWIDTH=2
 CONFIG_MTD_SC520CDP=m
+CONFIG_MTD_OCTAGON=m
+CONFIG_MTD_VMAX=m
 CONFIG_MTD_SCx200_DOCFLASH=m
 CONFIG_MTD_AMD76XROM=m
-CONFIG_MTD_ICHXROM=m
+CONFIG_MTD_ICH2ROM=m
 CONFIG_MTD_SCB2_FLASH=m
 CONFIG_MTD_L440GX=m
 CONFIG_MTD_PCI=m
@@ -375,7 +362,6 @@ CONFIG_MTD_PMC551=m
 CONFIG_MTD_PMC551_BUGFIX=y
 # CONFIG_MTD_PMC551_DEBUG is not set
 CONFIG_MTD_SLRAM=m
-# CONFIG_MTD_PHRAM is not set
 CONFIG_MTD_MTDRAM=m
 CONFIG_MTDRAM_TOTAL_SIZE=4096
 CONFIG_MTDRAM_ERASE_SIZE=128
@@ -388,7 +374,6 @@ CONFIG_MTD_DOC2000=m
 CONFIG_MTD_DOC2001=m
 CONFIG_MTD_DOC2001PLUS=m
 CONFIG_MTD_DOCPROBE=m
-CONFIG_MTD_DOCECC=m
 CONFIG_MTD_DOCPROBE_ADVANCED=y
 CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
 CONFIG_MTD_DOCPROBE_HIGH=y
@@ -400,27 +385,6 @@ CONFIG_MTD_DOCPROBE_55AA=y
 CONFIG_MTD_NAND=m
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 CONFIG_MTD_NAND_IDS=m
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-
-#
-# Bluesmoke - error detection and reporting (RAS)
-#
-CONFIG_BLUESMOKE=m
-
-#
-# Reporting subsystems
-#
-# CONFIG_BLUESMOKE_DEBUG is not set
-CONFIG_BLUESMOKE_MM_EDAC=m
-
-#
-# Bluesmoke system controller/chipset support
-#
-CONFIG_BLUESMOKE_AMD76X=m
-# CONFIG_BLUESMOKE_E7XXX is not set
-# CONFIG_BLUESMOKE_E752X is not set
-# CONFIG_BLUESMOKE_I82875P is not set
-CONFIG_BLUESMOKE_K8=m
 
 #
 # Parallel port support
@@ -591,6 +555,7 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
 CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
@@ -616,6 +581,7 @@ CONFIG_SCSI_FC_ATTRS=m
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
+CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_7000FASST=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AHA152X=m
@@ -637,7 +603,6 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-# CONFIG_SCSI_AIC79XX_NEW is not set
 CONFIG_SCSI_DPT_I2O=m
 CONFIG_SCSI_ADVANSYS=m
 CONFIG_SCSI_IN2000=m
@@ -646,11 +611,17 @@ CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_MEGARAID_LEGACY=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
+CONFIG_SCSI_PATA_PDC2027X=m
 CONFIG_SCSI_SATA_PROMISE=m
+CONFIG_SCSI_SATA_QSTOR=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
+CONFIG_SCSI_SATA_ULI=m
 CONFIG_SCSI_SATA_VIA=m
 CONFIG_SCSI_SATA_VITESSE=m
 CONFIG_SCSI_BUSLOGIC=m
@@ -697,7 +668,6 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
-CONFIG_SCSI_QLA6322=m
 CONFIG_SCSI_QLA2XXX_FAILOVER=y
 CONFIG_SCSI_QLA4XXX=m
 CONFIG_SCSI_QLA4XXX_FAILOVER=y
@@ -748,10 +718,11 @@ CONFIG_MD_RAID6=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
 CONFIG_DM_CRYPT=m
-CONFIG_DM_MULTIPATH=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 CONFIG_DM_FLAKEY=m
 CONFIG_BLK_DEV_DM_BBR=m
 
@@ -900,6 +871,7 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
@@ -926,6 +898,7 @@ CONFIG_IP_NF_MATCH_STATE=m
 CONFIG_IP_NF_MATCH_CONNTRACK=m
 CONFIG_IP_NF_MATCH_OWNER=m
 CONFIG_IP_NF_MATCH_PHYSDEV=m
+CONFIG_IP_NF_MATCH_SCTP=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_NAT=m
@@ -945,6 +918,7 @@ CONFIG_IP_NF_TARGET_TOS=m
 CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_TTL=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
@@ -1211,8 +1185,6 @@ CONFIG_ACENIC=m
 CONFIG_DL2K=m
 CONFIG_E1000=m
 CONFIG_E1000_NAPI=y
-CONFIG_E1000_NEW=m
-CONFIG_E1000_NEW_NAPI=y
 CONFIG_NS83820=m
 CONFIG_HAMACHI=m
 CONFIG_YELLOWFIN=m
@@ -1221,9 +1193,7 @@ CONFIG_SIS190=m
 CONFIG_SK98LIN=m
 CONFIG_TIGON3=m
 CONFIG_NET_BROADCOM=m
-CONFIG_NET_BROADCOM_NEW=m
 CONFIG_NET_BCM44=m
-CONFIG_TIGON3_NEW=m
 
 #
 # Ethernet (10000 Mbit)
@@ -1324,7 +1294,6 @@ CONFIG_EIP=m
 CONFIG_RMS=m
 CONFIG_JTAG=m
 CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
 CONFIG_RCPCI=m
 CONFIG_SHAPER=m
 CONFIG_NETCONSOLE=m
@@ -1993,6 +1962,7 @@ CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
 CONFIG_SENSORS_LM90=m
 CONFIG_SENSORS_VIA686A=m
+CONFIG_SENSORS_VT1211=m
 CONFIG_SENSORS_W83781D=m
 CONFIG_SENSORS_W83L785TS=m
 CONFIG_SENSORS_W83627HF=m
@@ -2296,6 +2266,7 @@ CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
 
 #
 # ALSA USB devices
@@ -2611,11 +2582,13 @@ CONFIG_JFS_DMAPI=y
 CONFIG_JFS_STATISTICS=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
+CONFIG_XFS_EXPORT=y
 CONFIG_XFS_RT=y
 CONFIG_XFS_QUOTA=m
 CONFIG_XFS_DMAPI=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
+CONFIG_OCFS2_FS=m
 CONFIG_MINIX_FS=y
 CONFIG_ROMFS_FS=m
 CONFIG_DMAPI=m
@@ -2658,6 +2631,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
 CONFIG_RELAYFS_FS=m
 # CONFIG_KLOG_CHANNEL is not set
 
@@ -2842,6 +2816,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
 
 #
 # IBM Crypto Hardware support
@@ -2885,7 +2860,7 @@ CONFIG_ZLIB_DEFLATE=m
 #
 CONFIG_SUSE_KERNEL=y
 CONFIG_CFGNAME="bigsmp"
-CONFIG_RELEASE="7.141"
+CONFIG_RELEASE="7.191"
 CONFIG_X86_SMP=y
 CONFIG_X86_HT=y
 CONFIG_X86_BIOS_REBOOT=y
index f0a8a4b..a84f323 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_CLEAN_COMPILE=y
 #
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_SYSCTL=y
 CONFIG_LOG_BUF_SHIFT=17
@@ -35,6 +36,9 @@ CONFIG_CKRM=y
 CONFIG_RCFS_FS=m
 CONFIG_CKRM_TYPE_TASKCLASS=y
 CONFIG_CKRM_RES_NUMTASKS=m
+CONFIG_CKRM_CPU_SCHEDULE=y
+# CONFIG_CKRM_CPU_SCHEDULE_AT_BOOT is not set
+CONFIG_CKRM_RES_BLKIO=y
 CONFIG_CKRM_TYPE_SOCKETCLASS=y
 CONFIG_CKRM_RBCE=m
 CONFIG_CKRM_CRBCE=m
@@ -46,6 +50,7 @@ CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -62,6 +67,7 @@ CONFIG_STOP_MACHINE=y
 #
 # Processor type and features
 #
+CONFIG_MEM_MIRROR=y
 # CONFIG_X86_PC is not set
 # CONFIG_X86_ELAN is not set
 # CONFIG_X86_VOYAGER is not set
@@ -188,6 +194,8 @@ CONFIG_APM_DISPLAY_BLANK=y
 # CONFIG_APM_RTC_IS_GMT is not set
 CONFIG_APM_ALLOW_INTS=y
 # CONFIG_APM_REAL_MODE_POWER_OFF is not set
+CONFIG_IOPROC=y
+CONFIG_PTRACK=y
 
 #
 # CPU Frequency scaling
@@ -264,6 +272,7 @@ CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM=y
 CONFIG_HOTPLUG_PCI_IBM=m
 CONFIG_HOTPLUG_PCI_AMD=m
 CONFIG_HOTPLUG_PCI_ACPI=m
+CONFIG_HOTPLUG_PCI_ACPI_IBM=m
 CONFIG_HOTPLUG_PCI_CPCI=y
 CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
 CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
@@ -293,10 +302,8 @@ CONFIG_FW_LOADER=m
 #
 CONFIG_MTD=m
 # CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_PARTITIONS=m
+# CONFIG_MTD_PARTITIONS is not set
 CONFIG_MTD_CONCAT=m
-CONFIG_MTD_REDBOOT_PARTS=m
-CONFIG_MTD_CMDLINE_PARTS=m
 
 #
 # User Modules And Translation Layers
@@ -338,20 +345,13 @@ CONFIG_MTD_PHYSMAP=m
 CONFIG_MTD_PHYSMAP_START=0x8000000
 CONFIG_MTD_PHYSMAP_LEN=0x4000000
 CONFIG_MTD_PHYSMAP_BUSWIDTH=2
-CONFIG_MTD_PNC2000=m
 CONFIG_MTD_SC520CDP=m
-CONFIG_MTD_NETSC520=m
-CONFIG_MTD_SBC_GXX=m
-CONFIG_MTD_ELAN_104NC=m
 CONFIG_MTD_OCTAGON=m
 CONFIG_MTD_VMAX=m
 CONFIG_MTD_SCx200_DOCFLASH=m
 CONFIG_MTD_AMD76XROM=m
 CONFIG_MTD_ICH2ROM=m
 CONFIG_MTD_SCB2_FLASH=m
-CONFIG_MTD_NETtel=m
-CONFIG_MTD_DILNETPC=m
-CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000
 CONFIG_MTD_L440GX=m
 CONFIG_MTD_PCI=m
 
@@ -451,7 +451,6 @@ CONFIG_PARIDE_ON26=m
 CONFIG_BLK_CPQ_DA=m
 CONFIG_BLK_CPQ_CISS_DA=m
 CONFIG_CISS_SCSI_TAPE=y
-CONFIG_BLK_CPQ_CISS_DA_NEW=m
 CONFIG_BLK_DEV_DAC960=m
 CONFIG_BLK_DEV_UMEM=m
 CONFIG_BLK_DEV_LOOP=y
@@ -556,6 +555,8 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
+CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
 CONFIG_BLK_DEV_SR=m
@@ -580,6 +581,7 @@ CONFIG_SCSI_FC_ATTRS=m
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
+CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_7000FASST=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AHA152X=m
@@ -601,7 +603,7 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-# CONFIG_SCSI_AIC79XX_NEW is not set
+CONFIG_SCSI_DPT_I2O=m
 CONFIG_SCSI_ADVANSYS=m
 CONFIG_SCSI_IN2000=m
 CONFIG_MEGARAID_NEWGEN=y
@@ -609,11 +611,17 @@ CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_MEGARAID_LEGACY=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
+CONFIG_SCSI_PATA_PDC2027X=m
 CONFIG_SCSI_SATA_PROMISE=m
+CONFIG_SCSI_SATA_QSTOR=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
+CONFIG_SCSI_SATA_ULI=m
 CONFIG_SCSI_SATA_VIA=m
 CONFIG_SCSI_SATA_VITESSE=m
 CONFIG_SCSI_BUSLOGIC=m
@@ -660,7 +668,6 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
-CONFIG_SCSI_QLA6322=m
 CONFIG_SCSI_QLA2XXX_FAILOVER=y
 CONFIG_SCSI_QLA4XXX=m
 CONFIG_SCSI_QLA4XXX_FAILOVER=y
@@ -711,10 +718,11 @@ CONFIG_MD_RAID6=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
 CONFIG_DM_CRYPT=m
-CONFIG_DM_MULTIPATH=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 CONFIG_DM_FLAKEY=m
 CONFIG_BLK_DEV_DM_BBR=m
 
@@ -863,6 +871,7 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
@@ -889,6 +898,7 @@ CONFIG_IP_NF_MATCH_STATE=m
 CONFIG_IP_NF_MATCH_CONNTRACK=m
 CONFIG_IP_NF_MATCH_OWNER=m
 CONFIG_IP_NF_MATCH_PHYSDEV=m
+CONFIG_IP_NF_MATCH_SCTP=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_NAT=m
@@ -908,6 +918,7 @@ CONFIG_IP_NF_TARGET_TOS=m
 CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_TTL=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
@@ -1174,8 +1185,6 @@ CONFIG_ACENIC=m
 CONFIG_DL2K=m
 CONFIG_E1000=m
 CONFIG_E1000_NAPI=y
-CONFIG_E1000_NEW=m
-CONFIG_E1000_NEW_NAPI=y
 CONFIG_NS83820=m
 CONFIG_HAMACHI=m
 CONFIG_YELLOWFIN=m
@@ -1184,9 +1193,7 @@ CONFIG_SIS190=m
 CONFIG_SK98LIN=m
 CONFIG_TIGON3=m
 CONFIG_NET_BROADCOM=m
-CONFIG_NET_BROADCOM_NEW=m
 CONFIG_NET_BCM44=m
-CONFIG_TIGON3_NEW=m
 
 #
 # Ethernet (10000 Mbit)
@@ -1275,8 +1282,18 @@ CONFIG_SKISA=m
 CONFIG_PROTEON=m
 CONFIG_ABYSS=m
 CONFIG_SMCTR=m
+
+#
+# Quadrics QsNet
+#
+CONFIG_QSNET=m
+CONFIG_ELAN3=m
+CONFIG_ELAN4=m
+CONFIG_EP=m
+CONFIG_EIP=m
+CONFIG_RMS=m
+CONFIG_JTAG=m
 CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
 CONFIG_RCPCI=m
 CONFIG_SHAPER=m
 CONFIG_NETCONSOLE=m
@@ -1682,6 +1699,7 @@ CONFIG_KEYBOARD_SUNKBD=m
 # CONFIG_KEYBOARD_LKKBD is not set
 CONFIG_KEYBOARD_XTKBD=m
 CONFIG_KEYBOARD_NEWTON=m
+# CONFIG_KEYBOARD_POSFILTER is not set
 CONFIG_INPUT_MOUSE=y
 CONFIG_MOUSE_PS2=y
 CONFIG_MOUSE_SERIAL=m
@@ -1944,6 +1962,7 @@ CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
 CONFIG_SENSORS_LM90=m
 CONFIG_SENSORS_VIA686A=m
+CONFIG_SENSORS_VT1211=m
 CONFIG_SENSORS_W83781D=m
 CONFIG_SENSORS_W83L785TS=m
 CONFIG_SENSORS_W83627HF=m
@@ -2247,6 +2266,7 @@ CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
 
 #
 # ALSA USB devices
@@ -2562,11 +2582,13 @@ CONFIG_JFS_DMAPI=y
 CONFIG_JFS_STATISTICS=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
+CONFIG_XFS_EXPORT=y
 CONFIG_XFS_RT=y
 CONFIG_XFS_QUOTA=m
 CONFIG_XFS_DMAPI=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
+CONFIG_OCFS2_FS=m
 CONFIG_MINIX_FS=y
 CONFIG_ROMFS_FS=m
 CONFIG_DMAPI=m
@@ -2609,6 +2631,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
 CONFIG_RELAYFS_FS=m
 # CONFIG_KLOG_CHANNEL is not set
 
@@ -2793,6 +2816,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
 
 #
 # IBM Crypto Hardware support
@@ -2836,7 +2860,7 @@ CONFIG_ZLIB_DEFLATE=m
 #
 CONFIG_SUSE_KERNEL=y
 CONFIG_CFGNAME="bigsmp"
-CONFIG_RELEASE="SLES9_SP1_BRANCH_2004110217390391"
+CONFIG_RELEASE="7.191"
 CONFIG_X86_SMP=y
 CONFIG_X86_HT=y
 CONFIG_X86_BIOS_REBOOT=y
index beb776a..a84f323 100644 (file)
@@ -38,6 +38,7 @@ CONFIG_CKRM_TYPE_TASKCLASS=y
 CONFIG_CKRM_RES_NUMTASKS=m
 CONFIG_CKRM_CPU_SCHEDULE=y
 # CONFIG_CKRM_CPU_SCHEDULE_AT_BOOT is not set
+CONFIG_CKRM_RES_BLKIO=y
 CONFIG_CKRM_TYPE_SOCKETCLASS=y
 CONFIG_CKRM_RBCE=m
 CONFIG_CKRM_CRBCE=m
@@ -49,6 +50,7 @@ CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -65,6 +67,7 @@ CONFIG_STOP_MACHINE=y
 #
 # Processor type and features
 #
+CONFIG_MEM_MIRROR=y
 # CONFIG_X86_PC is not set
 # CONFIG_X86_ELAN is not set
 # CONFIG_X86_VOYAGER is not set
@@ -144,16 +147,6 @@ CONFIG_BOOT_IOREMAP=y
 CONFIG_REGPARM=y
 
 #
-# Performance-monitoring counters support
-#
-CONFIG_PERFCTR=y
-CONFIG_KPERFCTR=y
-# CONFIG_PERFCTR_DEBUG is not set
-# CONFIG_PERFCTR_INIT_TESTS is not set
-CONFIG_PERFCTR_VIRTUAL=y
-CONFIG_PERFCTR_GLOBAL=y
-
-#
 # Special options
 #
 CONFIG_PROC_MM=y
@@ -333,24 +326,16 @@ CONFIG_MTD_CFI_NOSWAP=y
 # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_GEOMETRY is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
 CONFIG_MTD_CFI_INTELEXT=m
 CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_AMDSTD_RETRY=0
 CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 CONFIG_MTD_ABSENT=m
+CONFIG_MTD_OBSOLETE_CHIPS=y
+CONFIG_MTD_AMDSTD=m
+CONFIG_MTD_SHARP=m
+CONFIG_MTD_JEDEC=m
 
 #
 # Mapping drivers for chip access
@@ -359,11 +344,13 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 CONFIG_MTD_PHYSMAP=m
 CONFIG_MTD_PHYSMAP_START=0x8000000
 CONFIG_MTD_PHYSMAP_LEN=0x4000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=4
+CONFIG_MTD_PHYSMAP_BUSWIDTH=2
 CONFIG_MTD_SC520CDP=m
+CONFIG_MTD_OCTAGON=m
+CONFIG_MTD_VMAX=m
 CONFIG_MTD_SCx200_DOCFLASH=m
 CONFIG_MTD_AMD76XROM=m
-CONFIG_MTD_ICHXROM=m
+CONFIG_MTD_ICH2ROM=m
 CONFIG_MTD_SCB2_FLASH=m
 CONFIG_MTD_L440GX=m
 CONFIG_MTD_PCI=m
@@ -375,7 +362,6 @@ CONFIG_MTD_PMC551=m
 CONFIG_MTD_PMC551_BUGFIX=y
 # CONFIG_MTD_PMC551_DEBUG is not set
 CONFIG_MTD_SLRAM=m
-# CONFIG_MTD_PHRAM is not set
 CONFIG_MTD_MTDRAM=m
 CONFIG_MTDRAM_TOTAL_SIZE=4096
 CONFIG_MTDRAM_ERASE_SIZE=128
@@ -388,7 +374,6 @@ CONFIG_MTD_DOC2000=m
 CONFIG_MTD_DOC2001=m
 CONFIG_MTD_DOC2001PLUS=m
 CONFIG_MTD_DOCPROBE=m
-CONFIG_MTD_DOCECC=m
 CONFIG_MTD_DOCPROBE_ADVANCED=y
 CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
 CONFIG_MTD_DOCPROBE_HIGH=y
@@ -400,27 +385,6 @@ CONFIG_MTD_DOCPROBE_55AA=y
 CONFIG_MTD_NAND=m
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 CONFIG_MTD_NAND_IDS=m
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-
-#
-# Bluesmoke - error detection and reporting (RAS)
-#
-CONFIG_BLUESMOKE=m
-
-#
-# Reporting subsystems
-#
-# CONFIG_BLUESMOKE_DEBUG is not set
-CONFIG_BLUESMOKE_MM_EDAC=m
-
-#
-# Bluesmoke system controller/chipset support
-#
-CONFIG_BLUESMOKE_AMD76X=m
-# CONFIG_BLUESMOKE_E7XXX is not set
-# CONFIG_BLUESMOKE_E752X is not set
-# CONFIG_BLUESMOKE_I82875P is not set
-CONFIG_BLUESMOKE_K8=m
 
 #
 # Parallel port support
@@ -591,6 +555,7 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
 CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
@@ -616,6 +581,7 @@ CONFIG_SCSI_FC_ATTRS=m
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
+CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_7000FASST=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AHA152X=m
@@ -637,7 +603,6 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-# CONFIG_SCSI_AIC79XX_NEW is not set
 CONFIG_SCSI_DPT_I2O=m
 CONFIG_SCSI_ADVANSYS=m
 CONFIG_SCSI_IN2000=m
@@ -646,11 +611,17 @@ CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_MEGARAID_LEGACY=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
+CONFIG_SCSI_PATA_PDC2027X=m
 CONFIG_SCSI_SATA_PROMISE=m
+CONFIG_SCSI_SATA_QSTOR=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
+CONFIG_SCSI_SATA_ULI=m
 CONFIG_SCSI_SATA_VIA=m
 CONFIG_SCSI_SATA_VITESSE=m
 CONFIG_SCSI_BUSLOGIC=m
@@ -697,7 +668,6 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
-CONFIG_SCSI_QLA6322=m
 CONFIG_SCSI_QLA2XXX_FAILOVER=y
 CONFIG_SCSI_QLA4XXX=m
 CONFIG_SCSI_QLA4XXX_FAILOVER=y
@@ -748,10 +718,11 @@ CONFIG_MD_RAID6=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
 CONFIG_DM_CRYPT=m
-CONFIG_DM_MULTIPATH=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 CONFIG_DM_FLAKEY=m
 CONFIG_BLK_DEV_DM_BBR=m
 
@@ -900,6 +871,7 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
@@ -926,6 +898,7 @@ CONFIG_IP_NF_MATCH_STATE=m
 CONFIG_IP_NF_MATCH_CONNTRACK=m
 CONFIG_IP_NF_MATCH_OWNER=m
 CONFIG_IP_NF_MATCH_PHYSDEV=m
+CONFIG_IP_NF_MATCH_SCTP=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_NAT=m
@@ -945,6 +918,7 @@ CONFIG_IP_NF_TARGET_TOS=m
 CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_TTL=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
@@ -1211,8 +1185,6 @@ CONFIG_ACENIC=m
 CONFIG_DL2K=m
 CONFIG_E1000=m
 CONFIG_E1000_NAPI=y
-CONFIG_E1000_NEW=m
-CONFIG_E1000_NEW_NAPI=y
 CONFIG_NS83820=m
 CONFIG_HAMACHI=m
 CONFIG_YELLOWFIN=m
@@ -1221,9 +1193,7 @@ CONFIG_SIS190=m
 CONFIG_SK98LIN=m
 CONFIG_TIGON3=m
 CONFIG_NET_BROADCOM=m
-CONFIG_NET_BROADCOM_NEW=m
 CONFIG_NET_BCM44=m
-CONFIG_TIGON3_NEW=m
 
 #
 # Ethernet (10000 Mbit)
@@ -1324,7 +1294,6 @@ CONFIG_EIP=m
 CONFIG_RMS=m
 CONFIG_JTAG=m
 CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
 CONFIG_RCPCI=m
 CONFIG_SHAPER=m
 CONFIG_NETCONSOLE=m
@@ -1993,6 +1962,7 @@ CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
 CONFIG_SENSORS_LM90=m
 CONFIG_SENSORS_VIA686A=m
+CONFIG_SENSORS_VT1211=m
 CONFIG_SENSORS_W83781D=m
 CONFIG_SENSORS_W83L785TS=m
 CONFIG_SENSORS_W83627HF=m
@@ -2296,6 +2266,7 @@ CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
 
 #
 # ALSA USB devices
@@ -2611,11 +2582,13 @@ CONFIG_JFS_DMAPI=y
 CONFIG_JFS_STATISTICS=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
+CONFIG_XFS_EXPORT=y
 CONFIG_XFS_RT=y
 CONFIG_XFS_QUOTA=m
 CONFIG_XFS_DMAPI=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
+CONFIG_OCFS2_FS=m
 CONFIG_MINIX_FS=y
 CONFIG_ROMFS_FS=m
 CONFIG_DMAPI=m
@@ -2658,6 +2631,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
 CONFIG_RELAYFS_FS=m
 # CONFIG_KLOG_CHANNEL is not set
 
@@ -2842,6 +2816,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
 
 #
 # IBM Crypto Hardware support
@@ -2885,7 +2860,7 @@ CONFIG_ZLIB_DEFLATE=m
 #
 CONFIG_SUSE_KERNEL=y
 CONFIG_CFGNAME="bigsmp"
-CONFIG_RELEASE="7.141"
+CONFIG_RELEASE="7.191"
 CONFIG_X86_SMP=y
 CONFIG_X86_HT=y
 CONFIG_X86_BIOS_REBOOT=y
index 48f481b..b27e735 100644 (file)
@@ -35,6 +35,7 @@ CONFIG_CKRM_TYPE_TASKCLASS=y
 CONFIG_CKRM_RES_NUMTASKS=m
 CONFIG_CKRM_CPU_SCHEDULE=y
 # CONFIG_CKRM_CPU_SCHEDULE_AT_BOOT is not set
+CONFIG_CKRM_RES_BLKIO=y
 CONFIG_CKRM_TYPE_SOCKETCLASS=y
 CONFIG_CKRM_RBCE=m
 CONFIG_CKRM_CRBCE=m
@@ -47,6 +48,7 @@ CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -95,9 +97,12 @@ CONFIG_NR_CPUS=128
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_IA32_SUPPORT=y
 CONFIG_COMPAT=y
+CONFIG_IA64_MCA_RECOVERY=m
 CONFIG_PERFMON=y
 CONFIG_IA64_PALINFO=y
 CONFIG_EFI_VARS=y
+CONFIG_IOPROC=y
+CONFIG_PTRACK=y
 CONFIG_BINFMT_ELF=y
 CONFIG_BINFMT_MISC=m
 
@@ -123,8 +128,6 @@ CONFIG_ACPI_POWER=y
 CONFIG_ACPI_PCI=y
 CONFIG_ACPI_SYSTEM=y
 CONFIG_ACPI_INITRD=y
-CONFIG_IOPROC=y
-CONFIG_PTRACK=y
 
 #
 # Bus options (PCI, PCMCIA)
@@ -196,24 +199,16 @@ CONFIG_MTD_CFI_NOSWAP=y
 # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_GEOMETRY is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
 CONFIG_MTD_CFI_INTELEXT=m
 CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_AMDSTD_RETRY=0
 CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 CONFIG_MTD_ABSENT=m
+CONFIG_MTD_OBSOLETE_CHIPS=y
+CONFIG_MTD_AMDSTD=m
+CONFIG_MTD_SHARP=m
+CONFIG_MTD_JEDEC=m
 
 #
 # Mapping drivers for chip access
@@ -222,7 +217,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 CONFIG_MTD_PHYSMAP=m
 CONFIG_MTD_PHYSMAP_START=0x8000000
 CONFIG_MTD_PHYSMAP_LEN=0x4000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+CONFIG_MTD_PHYSMAP_BUSWIDTH=2
 CONFIG_MTD_PCI=m
 
 #
@@ -232,7 +227,6 @@ CONFIG_MTD_PMC551=m
 CONFIG_MTD_PMC551_BUGFIX=y
 # CONFIG_MTD_PMC551_DEBUG is not set
 CONFIG_MTD_SLRAM=m
-# CONFIG_MTD_PHRAM is not set
 CONFIG_MTD_MTDRAM=m
 CONFIG_MTDRAM_TOTAL_SIZE=4096
 CONFIG_MTDRAM_ERASE_SIZE=128
@@ -245,7 +239,6 @@ CONFIG_MTD_DOC2000=m
 CONFIG_MTD_DOC2001=m
 CONFIG_MTD_DOC2001PLUS=m
 CONFIG_MTD_DOCPROBE=m
-CONFIG_MTD_DOCECC=m
 CONFIG_MTD_DOCPROBE_ADVANCED=y
 CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
 CONFIG_MTD_DOCPROBE_HIGH=y
@@ -257,12 +250,6 @@ CONFIG_MTD_DOCPROBE_55AA=y
 CONFIG_MTD_NAND=m
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 CONFIG_MTD_NAND_IDS=m
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-
-#
-# Bluesmoke - error detection and reporting (RAS)
-#
-# CONFIG_BLUESMOKE is not set
 
 #
 # Parallel port support
@@ -402,6 +389,7 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
 CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
@@ -427,6 +415,7 @@ CONFIG_SCSI_FC_ATTRS=m
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
+CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AACRAID=m
 CONFIG_SCSI_AIC7XXX=m
@@ -445,18 +434,23 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-# CONFIG_SCSI_AIC79XX_NEW is not set
 CONFIG_SCSI_ADVANSYS=m
 CONFIG_MEGARAID_NEWGEN=y
 CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_MEGARAID_LEGACY=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
+CONFIG_SCSI_PATA_PDC2027X=m
 CONFIG_SCSI_SATA_PROMISE=m
+CONFIG_SCSI_SATA_QSTOR=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
+CONFIG_SCSI_SATA_ULI=m
 CONFIG_SCSI_SATA_VIA=m
 CONFIG_SCSI_SATA_VITESSE=m
 # CONFIG_SCSI_BUSLOGIC is not set
@@ -489,7 +483,6 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
-CONFIG_SCSI_QLA6322=m
 CONFIG_SCSI_QLA2XXX_FAILOVER=y
 CONFIG_SCSI_QLA4XXX=m
 CONFIG_SCSI_QLA4XXX_FAILOVER=y
@@ -516,10 +509,11 @@ CONFIG_MD_RAID6=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
 CONFIG_DM_CRYPT=m
-CONFIG_DM_MULTIPATH=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 CONFIG_DM_FLAKEY=m
 CONFIG_BLK_DEV_DM_BBR=m
 
@@ -668,6 +662,7 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
@@ -694,6 +689,7 @@ CONFIG_IP_NF_MATCH_STATE=m
 CONFIG_IP_NF_MATCH_CONNTRACK=m
 CONFIG_IP_NF_MATCH_OWNER=m
 CONFIG_IP_NF_MATCH_PHYSDEV=m
+CONFIG_IP_NF_MATCH_SCTP=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_NAT=m
@@ -713,6 +709,7 @@ CONFIG_IP_NF_TARGET_TOS=m
 CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_TTL=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
@@ -936,8 +933,6 @@ CONFIG_ACENIC=m
 CONFIG_DL2K=m
 CONFIG_E1000=m
 CONFIG_E1000_NAPI=y
-CONFIG_E1000_NEW=m
-CONFIG_E1000_NEW_NAPI=y
 CONFIG_NS83820=m
 CONFIG_HAMACHI=m
 CONFIG_YELLOWFIN=m
@@ -946,9 +941,7 @@ CONFIG_R8169=m
 CONFIG_SK98LIN=m
 CONFIG_TIGON3=m
 CONFIG_NET_BROADCOM=m
-CONFIG_NET_BROADCOM_NEW=m
 CONFIG_NET_BCM44=m
-CONFIG_TIGON3_NEW=m
 
 #
 # Ethernet (10000 Mbit)
@@ -1041,7 +1034,6 @@ CONFIG_EIP=m
 CONFIG_RMS=m
 CONFIG_JTAG=m
 CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
 CONFIG_SHAPER=m
 CONFIG_NETCONSOLE=m
 
@@ -1455,8 +1447,9 @@ CONFIG_STALDRV=y
 CONFIG_SGI_L1_SERIAL=y
 CONFIG_SGI_L1_SERIAL_CONSOLE=y
 CONFIG_FETCHOP=m
-CONFIG_SGI_IOC4_SERIAL=m
 CONFIG_SGI_SNSC=y
+CONFIG_SGI_TIOCX=y
+CONFIG_SGI_MBCS=m
 
 #
 # Serial drivers
@@ -1543,6 +1536,7 @@ CONFIG_AGP_HP_ZX1=m
 CONFIG_SYNCLINK_CS=m
 CONFIG_RAW_DRIVER=m
 CONFIG_MAX_RAW_DEVS=4096
+CONFIG_HANGCHECK_TIMER=m
 CONFIG_MMTIMER=m
 CONFIG_VTUNE=m
 
@@ -1614,6 +1608,7 @@ CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
 # CONFIG_SENSORS_LM90 is not set
 CONFIG_SENSORS_VIA686A=m
+CONFIG_SENSORS_VT1211=m
 CONFIG_SENSORS_W83781D=m
 # CONFIG_SENSORS_W83L785TS is not set
 CONFIG_SENSORS_W83627HF=m
@@ -1853,6 +1848,7 @@ CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
 
 #
 # ALSA USB devices
@@ -2117,11 +2113,13 @@ CONFIG_REISERFS_FS_SECURITY=y
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
+CONFIG_XFS_EXPORT=y
 CONFIG_XFS_RT=y
 CONFIG_XFS_QUOTA=m
 CONFIG_XFS_DMAPI=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
+CONFIG_OCFS2_FS=m
 CONFIG_MINIX_FS=y
 CONFIG_ROMFS_FS=m
 CONFIG_DMAPI=m
@@ -2164,6 +2162,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
 CONFIG_RELAYFS_FS=m
 # CONFIG_KLOG_CHANNEL is not set
 
@@ -2359,6 +2358,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
 
 #
 # Cryptographic options
index 48f481b..b27e735 100644 (file)
@@ -35,6 +35,7 @@ CONFIG_CKRM_TYPE_TASKCLASS=y
 CONFIG_CKRM_RES_NUMTASKS=m
 CONFIG_CKRM_CPU_SCHEDULE=y
 # CONFIG_CKRM_CPU_SCHEDULE_AT_BOOT is not set
+CONFIG_CKRM_RES_BLKIO=y
 CONFIG_CKRM_TYPE_SOCKETCLASS=y
 CONFIG_CKRM_RBCE=m
 CONFIG_CKRM_CRBCE=m
@@ -47,6 +48,7 @@ CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -95,9 +97,12 @@ CONFIG_NR_CPUS=128
 CONFIG_HAVE_DEC_LOCK=y
 CONFIG_IA32_SUPPORT=y
 CONFIG_COMPAT=y
+CONFIG_IA64_MCA_RECOVERY=m
 CONFIG_PERFMON=y
 CONFIG_IA64_PALINFO=y
 CONFIG_EFI_VARS=y
+CONFIG_IOPROC=y
+CONFIG_PTRACK=y
 CONFIG_BINFMT_ELF=y
 CONFIG_BINFMT_MISC=m
 
@@ -123,8 +128,6 @@ CONFIG_ACPI_POWER=y
 CONFIG_ACPI_PCI=y
 CONFIG_ACPI_SYSTEM=y
 CONFIG_ACPI_INITRD=y
-CONFIG_IOPROC=y
-CONFIG_PTRACK=y
 
 #
 # Bus options (PCI, PCMCIA)
@@ -196,24 +199,16 @@ CONFIG_MTD_CFI_NOSWAP=y
 # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_GEOMETRY is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
 CONFIG_MTD_CFI_INTELEXT=m
 CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_AMDSTD_RETRY=0
 CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 CONFIG_MTD_ABSENT=m
+CONFIG_MTD_OBSOLETE_CHIPS=y
+CONFIG_MTD_AMDSTD=m
+CONFIG_MTD_SHARP=m
+CONFIG_MTD_JEDEC=m
 
 #
 # Mapping drivers for chip access
@@ -222,7 +217,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 CONFIG_MTD_PHYSMAP=m
 CONFIG_MTD_PHYSMAP_START=0x8000000
 CONFIG_MTD_PHYSMAP_LEN=0x4000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+CONFIG_MTD_PHYSMAP_BUSWIDTH=2
 CONFIG_MTD_PCI=m
 
 #
@@ -232,7 +227,6 @@ CONFIG_MTD_PMC551=m
 CONFIG_MTD_PMC551_BUGFIX=y
 # CONFIG_MTD_PMC551_DEBUG is not set
 CONFIG_MTD_SLRAM=m
-# CONFIG_MTD_PHRAM is not set
 CONFIG_MTD_MTDRAM=m
 CONFIG_MTDRAM_TOTAL_SIZE=4096
 CONFIG_MTDRAM_ERASE_SIZE=128
@@ -245,7 +239,6 @@ CONFIG_MTD_DOC2000=m
 CONFIG_MTD_DOC2001=m
 CONFIG_MTD_DOC2001PLUS=m
 CONFIG_MTD_DOCPROBE=m
-CONFIG_MTD_DOCECC=m
 CONFIG_MTD_DOCPROBE_ADVANCED=y
 CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
 CONFIG_MTD_DOCPROBE_HIGH=y
@@ -257,12 +250,6 @@ CONFIG_MTD_DOCPROBE_55AA=y
 CONFIG_MTD_NAND=m
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 CONFIG_MTD_NAND_IDS=m
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-
-#
-# Bluesmoke - error detection and reporting (RAS)
-#
-# CONFIG_BLUESMOKE is not set
 
 #
 # Parallel port support
@@ -402,6 +389,7 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
 CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
@@ -427,6 +415,7 @@ CONFIG_SCSI_FC_ATTRS=m
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
+CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AACRAID=m
 CONFIG_SCSI_AIC7XXX=m
@@ -445,18 +434,23 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-# CONFIG_SCSI_AIC79XX_NEW is not set
 CONFIG_SCSI_ADVANSYS=m
 CONFIG_MEGARAID_NEWGEN=y
 CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_MEGARAID_LEGACY=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
+CONFIG_SCSI_PATA_PDC2027X=m
 CONFIG_SCSI_SATA_PROMISE=m
+CONFIG_SCSI_SATA_QSTOR=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
+CONFIG_SCSI_SATA_ULI=m
 CONFIG_SCSI_SATA_VIA=m
 CONFIG_SCSI_SATA_VITESSE=m
 # CONFIG_SCSI_BUSLOGIC is not set
@@ -489,7 +483,6 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
-CONFIG_SCSI_QLA6322=m
 CONFIG_SCSI_QLA2XXX_FAILOVER=y
 CONFIG_SCSI_QLA4XXX=m
 CONFIG_SCSI_QLA4XXX_FAILOVER=y
@@ -516,10 +509,11 @@ CONFIG_MD_RAID6=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
 CONFIG_DM_CRYPT=m
-CONFIG_DM_MULTIPATH=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 CONFIG_DM_FLAKEY=m
 CONFIG_BLK_DEV_DM_BBR=m
 
@@ -668,6 +662,7 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
@@ -694,6 +689,7 @@ CONFIG_IP_NF_MATCH_STATE=m
 CONFIG_IP_NF_MATCH_CONNTRACK=m
 CONFIG_IP_NF_MATCH_OWNER=m
 CONFIG_IP_NF_MATCH_PHYSDEV=m
+CONFIG_IP_NF_MATCH_SCTP=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_NAT=m
@@ -713,6 +709,7 @@ CONFIG_IP_NF_TARGET_TOS=m
 CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_TTL=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
@@ -936,8 +933,6 @@ CONFIG_ACENIC=m
 CONFIG_DL2K=m
 CONFIG_E1000=m
 CONFIG_E1000_NAPI=y
-CONFIG_E1000_NEW=m
-CONFIG_E1000_NEW_NAPI=y
 CONFIG_NS83820=m
 CONFIG_HAMACHI=m
 CONFIG_YELLOWFIN=m
@@ -946,9 +941,7 @@ CONFIG_R8169=m
 CONFIG_SK98LIN=m
 CONFIG_TIGON3=m
 CONFIG_NET_BROADCOM=m
-CONFIG_NET_BROADCOM_NEW=m
 CONFIG_NET_BCM44=m
-CONFIG_TIGON3_NEW=m
 
 #
 # Ethernet (10000 Mbit)
@@ -1041,7 +1034,6 @@ CONFIG_EIP=m
 CONFIG_RMS=m
 CONFIG_JTAG=m
 CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
 CONFIG_SHAPER=m
 CONFIG_NETCONSOLE=m
 
@@ -1455,8 +1447,9 @@ CONFIG_STALDRV=y
 CONFIG_SGI_L1_SERIAL=y
 CONFIG_SGI_L1_SERIAL_CONSOLE=y
 CONFIG_FETCHOP=m
-CONFIG_SGI_IOC4_SERIAL=m
 CONFIG_SGI_SNSC=y
+CONFIG_SGI_TIOCX=y
+CONFIG_SGI_MBCS=m
 
 #
 # Serial drivers
@@ -1543,6 +1536,7 @@ CONFIG_AGP_HP_ZX1=m
 CONFIG_SYNCLINK_CS=m
 CONFIG_RAW_DRIVER=m
 CONFIG_MAX_RAW_DEVS=4096
+CONFIG_HANGCHECK_TIMER=m
 CONFIG_MMTIMER=m
 CONFIG_VTUNE=m
 
@@ -1614,6 +1608,7 @@ CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
 # CONFIG_SENSORS_LM90 is not set
 CONFIG_SENSORS_VIA686A=m
+CONFIG_SENSORS_VT1211=m
 CONFIG_SENSORS_W83781D=m
 # CONFIG_SENSORS_W83L785TS is not set
 CONFIG_SENSORS_W83627HF=m
@@ -1853,6 +1848,7 @@ CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
 
 #
 # ALSA USB devices
@@ -2117,11 +2113,13 @@ CONFIG_REISERFS_FS_SECURITY=y
 # CONFIG_JFS_FS is not set
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
+CONFIG_XFS_EXPORT=y
 CONFIG_XFS_RT=y
 CONFIG_XFS_QUOTA=m
 CONFIG_XFS_DMAPI=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
+CONFIG_OCFS2_FS=m
 CONFIG_MINIX_FS=y
 CONFIG_ROMFS_FS=m
 CONFIG_DMAPI=m
@@ -2164,6 +2162,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
 CONFIG_RELAYFS_FS=m
 # CONFIG_KLOG_CHANNEL is not set
 
@@ -2359,6 +2358,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
 
 #
 # Cryptographic options
index 0730819..31b93e4 100644 (file)
@@ -9,6 +9,7 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
 CONFIG_X86_CMPXCHG=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_HPET_TIMER=y
+CONFIG_X86_PM_TIMER=y
 CONFIG_HPET_EMULATE_RTC=y
 CONFIG_GENERIC_ISA_DMA=y
 
@@ -44,6 +45,7 @@ CONFIG_CKRM_TYPE_TASKCLASS=y
 CONFIG_CKRM_RES_NUMTASKS=m
 CONFIG_CKRM_CPU_SCHEDULE=y
 # CONFIG_CKRM_CPU_SCHEDULE_AT_BOOT is not set
+CONFIG_CKRM_RES_BLKIO=y
 CONFIG_CKRM_TYPE_SOCKETCLASS=y
 CONFIG_CKRM_RBCE=m
 CONFIG_CKRM_CRBCE=m
@@ -55,6 +57,7 @@ CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -98,16 +101,6 @@ CONFIG_SWIOTLB=y
 CONFIG_X86_MCE=y
 
 #
-# Performance-monitoring counters support
-#
-CONFIG_PERFCTR=m
-CONFIG_KPERFCTR=y
-# CONFIG_PERFCTR_DEBUG is not set
-# CONFIG_PERFCTR_INIT_TESTS is not set
-CONFIG_PERFCTR_VIRTUAL=y
-CONFIG_PERFCTR_GLOBAL=y
-
-#
 # Power management options
 #
 CONFIG_PM=y
@@ -137,8 +130,6 @@ CONFIG_ACPI_POWER=y
 CONFIG_ACPI_PCI=y
 CONFIG_ACPI_SYSTEM=y
 CONFIG_ACPI_INITRD=y
-CONFIG_IOPROC=y
-CONFIG_PTRACK=y
 
 #
 # CPU Frequency scaling
@@ -162,6 +153,8 @@ CONFIG_X86_POWERNOW_K8_ACPI=y
 # CONFIG_X86_SPEEDSTEP_CENTRINO is not set
 CONFIG_X86_ACPI_CPUFREQ=m
 # CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
+CONFIG_IOPROC=y
+CONFIG_PTRACK=y
 
 #
 # Bus options (PCI etc.)
@@ -208,7 +201,6 @@ CONFIG_IA32_AOUT=y
 CONFIG_COMPAT=y
 CONFIG_SYSVIPC_COMPAT=y
 CONFIG_UID16=y
-CONFIG_KEXEC=y
 
 #
 # Device Drivers
@@ -249,24 +241,16 @@ CONFIG_MTD_CFI_NOSWAP=y
 # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_GEOMETRY is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
 CONFIG_MTD_CFI_INTELEXT=m
 CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_AMDSTD_RETRY=0
 CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 CONFIG_MTD_ABSENT=m
+CONFIG_MTD_OBSOLETE_CHIPS=y
+CONFIG_MTD_AMDSTD=m
+CONFIG_MTD_SHARP=m
+CONFIG_MTD_JEDEC=m
 
 #
 # Mapping drivers for chip access
@@ -275,11 +259,13 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 CONFIG_MTD_PHYSMAP=m
 CONFIG_MTD_PHYSMAP_START=0x8000000
 CONFIG_MTD_PHYSMAP_LEN=0x4000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=4
+CONFIG_MTD_PHYSMAP_BUSWIDTH=2
 # CONFIG_MTD_SC520CDP is not set
+CONFIG_MTD_OCTAGON=m
+CONFIG_MTD_VMAX=m
 CONFIG_MTD_SCx200_DOCFLASH=m
 CONFIG_MTD_AMD76XROM=m
-CONFIG_MTD_ICHXROM=m
+CONFIG_MTD_ICH2ROM=m
 CONFIG_MTD_SCB2_FLASH=m
 # CONFIG_MTD_L440GX is not set
 CONFIG_MTD_PCI=m
@@ -291,7 +277,6 @@ CONFIG_MTD_PMC551=m
 CONFIG_MTD_PMC551_BUGFIX=y
 # CONFIG_MTD_PMC551_DEBUG is not set
 CONFIG_MTD_SLRAM=m
-CONFIG_MTD_PHRAM=m
 CONFIG_MTD_MTDRAM=m
 CONFIG_MTDRAM_TOTAL_SIZE=4096
 CONFIG_MTDRAM_ERASE_SIZE=128
@@ -304,7 +289,6 @@ CONFIG_MTD_DOC2000=m
 CONFIG_MTD_DOC2001=m
 CONFIG_MTD_DOC2001PLUS=m
 CONFIG_MTD_DOCPROBE=m
-CONFIG_MTD_DOCECC=m
 CONFIG_MTD_DOCPROBE_ADVANCED=y
 CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
 CONFIG_MTD_DOCPROBE_HIGH=y
@@ -316,27 +300,6 @@ CONFIG_MTD_DOCPROBE_55AA=y
 CONFIG_MTD_NAND=m
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 CONFIG_MTD_NAND_IDS=m
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-
-#
-# Bluesmoke - error detection and reporting (RAS)
-#
-CONFIG_BLUESMOKE=m
-
-#
-# Reporting subsystems
-#
-# CONFIG_BLUESMOKE_DEBUG is not set
-CONFIG_BLUESMOKE_MM_EDAC=m
-
-#
-# Bluesmoke system controller/chipset support
-#
-CONFIG_BLUESMOKE_AMD76X=m
-# CONFIG_BLUESMOKE_E7XXX is not set
-# CONFIG_BLUESMOKE_E752X is not set
-# CONFIG_BLUESMOKE_I82875P is not set
-CONFIG_BLUESMOKE_K8=m
 
 #
 # Parallel port support
@@ -483,6 +446,7 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
 CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
@@ -508,6 +472,7 @@ CONFIG_SCSI_FC_ATTRS=m
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
+CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AACRAID=m
 CONFIG_SCSI_AIC7XXX=m
@@ -526,18 +491,23 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-CONFIG_SCSI_AIC79XX_NEW=m
 CONFIG_SCSI_ADVANSYS=m
 CONFIG_MEGARAID_NEWGEN=y
 CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_MEGARAID_LEGACY=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
+CONFIG_SCSI_PATA_PDC2027X=m
 CONFIG_SCSI_SATA_PROMISE=m
+CONFIG_SCSI_SATA_QSTOR=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
+CONFIG_SCSI_SATA_ULI=m
 CONFIG_SCSI_SATA_VIA=m
 CONFIG_SCSI_SATA_VITESSE=m
 CONFIG_SCSI_BUSLOGIC=m
@@ -574,7 +544,6 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
-CONFIG_SCSI_QLA6322=m
 CONFIG_SCSI_QLA2XXX_FAILOVER=y
 CONFIG_SCSI_QLA4XXX=m
 CONFIG_SCSI_QLA4XXX_FAILOVER=y
@@ -601,10 +570,11 @@ CONFIG_MD_RAID6=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
 CONFIG_DM_CRYPT=m
-CONFIG_DM_MULTIPATH=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 CONFIG_DM_FLAKEY=m
 CONFIG_BLK_DEV_DM_BBR=m
 
@@ -756,6 +726,7 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
@@ -782,6 +753,7 @@ CONFIG_IP_NF_MATCH_STATE=m
 CONFIG_IP_NF_MATCH_CONNTRACK=m
 CONFIG_IP_NF_MATCH_OWNER=m
 CONFIG_IP_NF_MATCH_PHYSDEV=m
+CONFIG_IP_NF_MATCH_SCTP=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_NAT=m
@@ -801,6 +773,7 @@ CONFIG_IP_NF_TARGET_TOS=m
 CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_TTL=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
@@ -1017,8 +990,6 @@ CONFIG_ACENIC=m
 CONFIG_DL2K=m
 CONFIG_E1000=m
 CONFIG_E1000_NAPI=y
-CONFIG_E1000_NEW=m
-CONFIG_E1000_NEW_NAPI=y
 CONFIG_NS83820=m
 CONFIG_HAMACHI=m
 CONFIG_YELLOWFIN=m
@@ -1027,9 +998,7 @@ CONFIG_SIS190=m
 CONFIG_SK98LIN=m
 CONFIG_TIGON3=m
 CONFIG_NET_BROADCOM=m
-CONFIG_NET_BROADCOM_NEW=m
 CONFIG_NET_BCM44=m
-CONFIG_TIGON3_NEW=m
 
 #
 # Ethernet (10000 Mbit)
@@ -1123,7 +1092,6 @@ CONFIG_EIP=m
 CONFIG_RMS=m
 CONFIG_JTAG=m
 CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
 CONFIG_SHAPER=m
 CONFIG_NETCONSOLE=m
 
@@ -1661,6 +1629,7 @@ CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
 CONFIG_SENSORS_LM90=m
 CONFIG_SENSORS_VIA686A=m
+CONFIG_SENSORS_VT1211=m
 CONFIG_SENSORS_W83781D=m
 CONFIG_SENSORS_W83L785TS=m
 CONFIG_SENSORS_W83627HF=m
@@ -1921,6 +1890,7 @@ CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
 
 #
 # ALSA USB devices
@@ -2232,11 +2202,13 @@ CONFIG_JFS_DMAPI=y
 CONFIG_JFS_STATISTICS=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
+CONFIG_XFS_EXPORT=y
 CONFIG_XFS_RT=y
 CONFIG_XFS_QUOTA=m
 CONFIG_XFS_DMAPI=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
+CONFIG_OCFS2_FS=m
 CONFIG_MINIX_FS=y
 CONFIG_ROMFS_FS=m
 CONFIG_DMAPI=m
@@ -2279,6 +2251,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
 CONFIG_RELAYFS_FS=m
 # CONFIG_KLOG_CHANNEL is not set
 
@@ -2458,6 +2431,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
 
 #
 # Cryptographic options
index 0730819..31b93e4 100644 (file)
@@ -9,6 +9,7 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
 CONFIG_X86_CMPXCHG=y
 CONFIG_EARLY_PRINTK=y
 CONFIG_HPET_TIMER=y
+CONFIG_X86_PM_TIMER=y
 CONFIG_HPET_EMULATE_RTC=y
 CONFIG_GENERIC_ISA_DMA=y
 
@@ -44,6 +45,7 @@ CONFIG_CKRM_TYPE_TASKCLASS=y
 CONFIG_CKRM_RES_NUMTASKS=m
 CONFIG_CKRM_CPU_SCHEDULE=y
 # CONFIG_CKRM_CPU_SCHEDULE_AT_BOOT is not set
+CONFIG_CKRM_RES_BLKIO=y
 CONFIG_CKRM_TYPE_SOCKETCLASS=y
 CONFIG_CKRM_RBCE=m
 CONFIG_CKRM_CRBCE=m
@@ -55,6 +57,7 @@ CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
 CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 
 #
@@ -98,16 +101,6 @@ CONFIG_SWIOTLB=y
 CONFIG_X86_MCE=y
 
 #
-# Performance-monitoring counters support
-#
-CONFIG_PERFCTR=m
-CONFIG_KPERFCTR=y
-# CONFIG_PERFCTR_DEBUG is not set
-# CONFIG_PERFCTR_INIT_TESTS is not set
-CONFIG_PERFCTR_VIRTUAL=y
-CONFIG_PERFCTR_GLOBAL=y
-
-#
 # Power management options
 #
 CONFIG_PM=y
@@ -137,8 +130,6 @@ CONFIG_ACPI_POWER=y
 CONFIG_ACPI_PCI=y
 CONFIG_ACPI_SYSTEM=y
 CONFIG_ACPI_INITRD=y
-CONFIG_IOPROC=y
-CONFIG_PTRACK=y
 
 #
 # CPU Frequency scaling
@@ -162,6 +153,8 @@ CONFIG_X86_POWERNOW_K8_ACPI=y
 # CONFIG_X86_SPEEDSTEP_CENTRINO is not set
 CONFIG_X86_ACPI_CPUFREQ=m
 # CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
+CONFIG_IOPROC=y
+CONFIG_PTRACK=y
 
 #
 # Bus options (PCI etc.)
@@ -208,7 +201,6 @@ CONFIG_IA32_AOUT=y
 CONFIG_COMPAT=y
 CONFIG_SYSVIPC_COMPAT=y
 CONFIG_UID16=y
-CONFIG_KEXEC=y
 
 #
 # Device Drivers
@@ -249,24 +241,16 @@ CONFIG_MTD_CFI_NOSWAP=y
 # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
 # CONFIG_MTD_CFI_GEOMETRY is not set
-CONFIG_MTD_MAP_BANK_WIDTH_1=y
-CONFIG_MTD_MAP_BANK_WIDTH_2=y
-CONFIG_MTD_MAP_BANK_WIDTH_4=y
-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-CONFIG_MTD_CFI_I1=y
-CONFIG_MTD_CFI_I2=y
-# CONFIG_MTD_CFI_I4 is not set
-# CONFIG_MTD_CFI_I8 is not set
 CONFIG_MTD_CFI_INTELEXT=m
 CONFIG_MTD_CFI_AMDSTD=m
-CONFIG_MTD_CFI_AMDSTD_RETRY=0
 CONFIG_MTD_CFI_STAA=m
-CONFIG_MTD_CFI_UTIL=m
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 CONFIG_MTD_ABSENT=m
+CONFIG_MTD_OBSOLETE_CHIPS=y
+CONFIG_MTD_AMDSTD=m
+CONFIG_MTD_SHARP=m
+CONFIG_MTD_JEDEC=m
 
 #
 # Mapping drivers for chip access
@@ -275,11 +259,13 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
 CONFIG_MTD_PHYSMAP=m
 CONFIG_MTD_PHYSMAP_START=0x8000000
 CONFIG_MTD_PHYSMAP_LEN=0x4000000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=4
+CONFIG_MTD_PHYSMAP_BUSWIDTH=2
 # CONFIG_MTD_SC520CDP is not set
+CONFIG_MTD_OCTAGON=m
+CONFIG_MTD_VMAX=m
 CONFIG_MTD_SCx200_DOCFLASH=m
 CONFIG_MTD_AMD76XROM=m
-CONFIG_MTD_ICHXROM=m
+CONFIG_MTD_ICH2ROM=m
 CONFIG_MTD_SCB2_FLASH=m
 # CONFIG_MTD_L440GX is not set
 CONFIG_MTD_PCI=m
@@ -291,7 +277,6 @@ CONFIG_MTD_PMC551=m
 CONFIG_MTD_PMC551_BUGFIX=y
 # CONFIG_MTD_PMC551_DEBUG is not set
 CONFIG_MTD_SLRAM=m
-CONFIG_MTD_PHRAM=m
 CONFIG_MTD_MTDRAM=m
 CONFIG_MTDRAM_TOTAL_SIZE=4096
 CONFIG_MTDRAM_ERASE_SIZE=128
@@ -304,7 +289,6 @@ CONFIG_MTD_DOC2000=m
 CONFIG_MTD_DOC2001=m
 CONFIG_MTD_DOC2001PLUS=m
 CONFIG_MTD_DOCPROBE=m
-CONFIG_MTD_DOCECC=m
 CONFIG_MTD_DOCPROBE_ADVANCED=y
 CONFIG_MTD_DOCPROBE_ADDRESS=0x0000
 CONFIG_MTD_DOCPROBE_HIGH=y
@@ -316,27 +300,6 @@ CONFIG_MTD_DOCPROBE_55AA=y
 CONFIG_MTD_NAND=m
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 CONFIG_MTD_NAND_IDS=m
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-
-#
-# Bluesmoke - error detection and reporting (RAS)
-#
-CONFIG_BLUESMOKE=m
-
-#
-# Reporting subsystems
-#
-# CONFIG_BLUESMOKE_DEBUG is not set
-CONFIG_BLUESMOKE_MM_EDAC=m
-
-#
-# Bluesmoke system controller/chipset support
-#
-CONFIG_BLUESMOKE_AMD76X=m
-# CONFIG_BLUESMOKE_E7XXX is not set
-# CONFIG_BLUESMOKE_E752X is not set
-# CONFIG_BLUESMOKE_I82875P is not set
-CONFIG_BLUESMOKE_K8=m
 
 #
 # Parallel port support
@@ -483,6 +446,7 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
 CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
@@ -508,6 +472,7 @@ CONFIG_SCSI_FC_ATTRS=m
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
+CONFIG_SCSI_3W_9XXX=m
 CONFIG_SCSI_ACARD=m
 CONFIG_SCSI_AACRAID=m
 CONFIG_SCSI_AIC7XXX=m
@@ -526,18 +491,23 @@ CONFIG_AIC79XX_RESET_DELAY_MS=15000
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 CONFIG_AIC79XX_REG_PRETTY_PRINT=y
-CONFIG_SCSI_AIC79XX_NEW=m
 CONFIG_SCSI_ADVANSYS=m
 CONFIG_MEGARAID_NEWGEN=y
 CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_MEGARAID_LEGACY=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
+CONFIG_SCSI_PATA_PDC2027X=m
 CONFIG_SCSI_SATA_PROMISE=m
+CONFIG_SCSI_SATA_QSTOR=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
+CONFIG_SCSI_SATA_ULI=m
 CONFIG_SCSI_SATA_VIA=m
 CONFIG_SCSI_SATA_VITESSE=m
 CONFIG_SCSI_BUSLOGIC=m
@@ -574,7 +544,6 @@ CONFIG_SCSI_QLA22XX=m
 CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
-CONFIG_SCSI_QLA6322=m
 CONFIG_SCSI_QLA2XXX_FAILOVER=y
 CONFIG_SCSI_QLA4XXX=m
 CONFIG_SCSI_QLA4XXX_FAILOVER=y
@@ -601,10 +570,11 @@ CONFIG_MD_RAID6=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
 CONFIG_DM_CRYPT=m
-CONFIG_DM_MULTIPATH=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
+CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_EMC=m
 CONFIG_DM_FLAKEY=m
 CONFIG_BLK_DEV_DM_BBR=m
 
@@ -756,6 +726,7 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
@@ -782,6 +753,7 @@ CONFIG_IP_NF_MATCH_STATE=m
 CONFIG_IP_NF_MATCH_CONNTRACK=m
 CONFIG_IP_NF_MATCH_OWNER=m
 CONFIG_IP_NF_MATCH_PHYSDEV=m
+CONFIG_IP_NF_MATCH_SCTP=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
 CONFIG_IP_NF_NAT=m
@@ -801,6 +773,7 @@ CONFIG_IP_NF_TARGET_TOS=m
 CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
+CONFIG_IP_NF_TARGET_TTL=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
 CONFIG_IP_NF_TARGET_LOG=m
 CONFIG_IP_NF_TARGET_ULOG=m
@@ -1017,8 +990,6 @@ CONFIG_ACENIC=m
 CONFIG_DL2K=m
 CONFIG_E1000=m
 CONFIG_E1000_NAPI=y
-CONFIG_E1000_NEW=m
-CONFIG_E1000_NEW_NAPI=y
 CONFIG_NS83820=m
 CONFIG_HAMACHI=m
 CONFIG_YELLOWFIN=m
@@ -1027,9 +998,7 @@ CONFIG_SIS190=m
 CONFIG_SK98LIN=m
 CONFIG_TIGON3=m
 CONFIG_NET_BROADCOM=m
-CONFIG_NET_BROADCOM_NEW=m
 CONFIG_NET_BCM44=m
-CONFIG_TIGON3_NEW=m
 
 #
 # Ethernet (10000 Mbit)
@@ -1123,7 +1092,6 @@ CONFIG_EIP=m
 CONFIG_RMS=m
 CONFIG_JTAG=m
 CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
 CONFIG_SHAPER=m
 CONFIG_NETCONSOLE=m
 
@@ -1661,6 +1629,7 @@ CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
 CONFIG_SENSORS_LM90=m
 CONFIG_SENSORS_VIA686A=m
+CONFIG_SENSORS_VT1211=m
 CONFIG_SENSORS_W83781D=m
 CONFIG_SENSORS_W83L785TS=m
 CONFIG_SENSORS_W83627HF=m
@@ -1921,6 +1890,7 @@ CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
 
 #
 # ALSA USB devices
@@ -2232,11 +2202,13 @@ CONFIG_JFS_DMAPI=y
 CONFIG_JFS_STATISTICS=y
 CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
+CONFIG_XFS_EXPORT=y
 CONFIG_XFS_RT=y
 CONFIG_XFS_QUOTA=m
 CONFIG_XFS_DMAPI=y
 CONFIG_XFS_SECURITY=y
 CONFIG_XFS_POSIX_ACL=y
+CONFIG_OCFS2_FS=m
 CONFIG_MINIX_FS=y
 CONFIG_ROMFS_FS=m
 CONFIG_DMAPI=m
@@ -2279,6 +2251,7 @@ CONFIG_TMPFS=y
 CONFIG_HUGETLBFS=y
 CONFIG_HUGETLB_PAGE=y
 CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
 CONFIG_RELAYFS_FS=m
 # CONFIG_KLOG_CHANNEL is not set
 
@@ -2458,6 +2431,7 @@ CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
 
 #
 # Cryptographic options
index 9d35318..68b5200 100644 (file)
@@ -1,28 +1,40 @@
 #
 # Automatically generated make config: don't edit
+# Linux kernel version: 2.6.9-prep
+# Tue Aug  2 15:46:19 2005
 #
+CONFIG_X86_64=y
+CONFIG_64BIT=y
+CONFIG_X86=y
 CONFIG_MMU=y
-CONFIG_SMP=y
-# CONFIG_HOTPLUG_CPU is not set
-CONFIG_LOCALVERSION=""
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_X86_CMPXCHG=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_HPET_TIMER=y
+CONFIG_HPET_EMULATE_RTC=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
 
 #
 # General setup
 #
+CONFIG_LOCALVERSION=""
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
 CONFIG_LOG_BUF_SHIFT=17
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
@@ -33,9 +45,10 @@ CONFIG_EPOLL=y
 CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_VOLUNTARY=y
-CONFIG_POSIX_MQUEUE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SHMEM=y
+# CONFIG_TINY_SHMEM is not set
 
 #
 # Loadable module support
@@ -45,42 +58,140 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_UNLOAD is not set
 CONFIG_OBSOLETE_MODPARM=y
 CONFIG_MODVERSIONS=y
-CONFIG_KMOD=y
 CONFIG_MODULE_SIG=y
 # CONFIG_MODULE_SIG_FORCE is not set
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Processor type and features
+#
+# CONFIG_MK8 is not set
+# CONFIG_MPSC is not set
+CONFIG_GENERIC_CPU=y
+CONFIG_X86_L1_CACHE_BYTES=128
+CONFIG_X86_L1_CACHE_SHIFT=7
+CONFIG_X86_TSC=y
+CONFIG_X86_GOOD_APIC=y
+CONFIG_MICROCODE=m
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+CONFIG_X86_HT=y
+CONFIG_X86_IO_APIC=y
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_MTRR=y
+CONFIG_SMP=y
+# CONFIG_PREEMPT is not set
+CONFIG_SCHED_SMT=y
+CONFIG_K8_NUMA=y
+CONFIG_DISCONTIGMEM=y
+CONFIG_NUMA=y
+CONFIG_HAVE_DEC_LOCK=y
+CONFIG_NR_CPUS=8
+CONFIG_GART_IOMMU=y
+CONFIG_SWIOTLB=y
+CONFIG_X86_MCE=y
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_SOFTWARE_SUSPEND is not set
+
+#
+# ACPI (Advanced Configuration and Power Interface) Support
+#
+CONFIG_ACPI=y
+CONFIG_ACPI_BOOT=y
+CONFIG_ACPI_INTERPRETER=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_SLEEP_PROC_FS=y
+CONFIG_ACPI_AC=m
+CONFIG_ACPI_BATTERY=m
+CONFIG_ACPI_BUTTON=m
+CONFIG_ACPI_FAN=y
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_THERMAL=y
+CONFIG_ACPI_ASUS=m
+CONFIG_ACPI_TOSHIBA=m
+CONFIG_ACPI_BLACKLIST_YEAR=2001
+# CONFIG_ACPI_DEBUG is not set
+CONFIG_ACPI_BUS=y
+CONFIG_ACPI_EC=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_PCI=y
+CONFIG_ACPI_SYSTEM=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+# CONFIG_CPU_FREQ_PROC_INTF is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+# CONFIG_CPU_FREQ_24_API is not set
+CONFIG_CPU_FREQ_TABLE=y
 
 #
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+# CPUFreq processor drivers
+#
+CONFIG_X86_POWERNOW_K8=y
+CONFIG_X86_POWERNOW_K8_ACPI=y
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+CONFIG_X86_ACPI_CPUFREQ=y
+# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
+
+#
+# Bus options (PCI etc.)
 #
 CONFIG_PCI=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+# CONFIG_UNORDERED_IO is not set
 CONFIG_PCI_MSI=y
 CONFIG_PCI_LEGACY_PROC=y
 # CONFIG_PCI_NAMES is not set
-CONFIG_ISA=y
-# CONFIG_EISA is not set
-# CONFIG_MCA is not set
-# CONFIG_SCx200 is not set
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
 # CONFIG_PCMCIA_DEBUG is not set
-CONFIG_YENTA=y
+CONFIG_YENTA=m
 CONFIG_CARDBUS=y
-# CONFIG_I82092 is not set
-CONFIG_I82365=m
 CONFIG_PD6729=m
+# CONFIG_I82092 is not set
 CONFIG_TCIC=m
-CONFIG_PCMCIA_PROBE=y
 
 #
-# Executable file formats
+# PCI Hotplug Support
+#
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HOTPLUG_PCI_FAKE is not set
+CONFIG_HOTPLUG_PCI_ACPI=m
+CONFIG_HOTPLUG_PCI_ACPI_IBM=m
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+CONFIG_HOTPLUG_PCI_PCIE=m
+# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set
+CONFIG_HOTPLUG_PCI_SHPC=m
+# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set
+
+#
+# Executable file formats / Emulations
 #
 CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_AOUT is not set
 CONFIG_BINFMT_MISC=y
+CONFIG_IA32_EMULATION=y
+# CONFIG_IA32_AOUT is not set
+CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
+CONFIG_UID16=y
+CONFIG_KEXEC=y
 
 #
 # Device Drivers
@@ -89,18 +200,23 @@ CONFIG_BINFMT_MISC=y
 #
 # Generic Driver Options
 #
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
 
 #
 # Memory Technology Devices (MTD)
 #
 CONFIG_MTD=m
 # CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_PARTITIONS=m
+CONFIG_MTD_PARTITIONS=y
 CONFIG_MTD_CONCAT=m
 CONFIG_MTD_REDBOOT_PARTS=m
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
 CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_PARTITIONS=y
+
 #
 # User Modules And Translation Layers
 #
@@ -119,13 +235,24 @@ CONFIG_MTD_CFI=m
 CONFIG_MTD_JEDECPROBE=m
 CONFIG_MTD_GEN_PROBE=m
 # CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
 CONFIG_MTD_CFI_INTELEXT=m
 CONFIG_MTD_CFI_AMDSTD=m
+CONFIG_MTD_CFI_AMDSTD_RETRY=3
 CONFIG_MTD_CFI_STAA=m
+CONFIG_MTD_CFI_UTIL=m
 CONFIG_MTD_RAM=m
 CONFIG_MTD_ROM=m
 CONFIG_MTD_ABSENT=m
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
 
 #
 # Mapping drivers for chip access
@@ -135,23 +262,19 @@ CONFIG_MTD_ABSENT=m
 # CONFIG_MTD_PNC2000 is not set
 CONFIG_MTD_SC520CDP=m
 CONFIG_MTD_NETSC520=m
-CONFIG_MTD_SBC_GXX=m
-CONFIG_MTD_ELAN_104NC=m
 CONFIG_MTD_SCx200_DOCFLASH=m
 # CONFIG_MTD_AMD76XROM is not set
 # CONFIG_MTD_SCB2_FLASH is not set
 # CONFIG_MTD_NETtel is not set
 # CONFIG_MTD_DILNETPC is not set
 # CONFIG_MTD_L440GX is not set
-# CONFIG_MTD_PCI is not set
 
 #
 # Self-contained MTD device drivers
 #
 # CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_PMC551_BUGFIX is not set
-# CONFIG_MTD_PMC551_DEBUG is not set
 # CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
 CONFIG_MTD_MTDRAM=m
 CONFIG_MTDRAM_TOTAL_SIZE=4096
 CONFIG_MTDRAM_ERASE_SIZE=128
@@ -163,9 +286,6 @@ CONFIG_MTDRAM_ERASE_SIZE=128
 # CONFIG_MTD_DOC2000 is not set
 # CONFIG_MTD_DOC2001 is not set
 # CONFIG_MTD_DOC2001PLUS is not set
-CONFIG_MTD_DOCPROBE=m
-# CONFIG_MTD_DOCPROBE_ADVANCED is not set
-CONFIG_MTD_DOCPROBE_ADDRESS=0
 
 #
 # NAND Flash Device Drivers
@@ -173,15 +293,7 @@ CONFIG_MTD_DOCPROBE_ADDRESS=0
 CONFIG_MTD_NAND=m
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 CONFIG_MTD_NAND_IDS=m
-
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-CONFIG_MTD_CFI_AMDSTD_RETRY=3
-# CONFIG_MTD_ICHXROM is not set
-# CONFIG_MTD_PHRAM is not set
 # CONFIG_MTD_NAND_DISKONCHIP is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-
 
 #
 # Parallel port support
@@ -199,20 +311,11 @@ CONFIG_PARPORT_1284=y
 #
 # Plug and Play support
 #
-CONFIG_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-# CONFIG_ISAPNP is not set
-# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
 #
 CONFIG_BLK_DEV_FD=m
-# CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 CONFIG_BLK_CPQ_DA=m
 CONFIG_BLK_CPQ_CISS_DA=m
@@ -222,46 +325,41 @@ CONFIG_BLK_DEV_DAC960=m
 CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_CRYPTOLOOP=m
 CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_SX8=m
+# CONFIG_BLK_DEV_UB is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=16384
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_BLK_DEV_ATIIXP=y
-CONFIG_BLK_DEV_DELKIN=y
-CONFIG_BLK_DEV_IT8212=y
 CONFIG_LBD=y
-# CONFIG_DCSSBLK is not set
-
+CONFIG_DISKDUMP=m
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
-CONFIG_IDE_GENERIC=y
-# CONFIG_HPT34X_AUTODMA is not set
-
 CONFIG_BLK_DEV_IDE=y
 
 #
 # Please see Documentation/ide.txt for help/info on IDE drives
 #
+# CONFIG_BLK_DEV_IDE_SATA is not set
 # CONFIG_BLK_DEV_HD_IDE is not set
 CONFIG_BLK_DEV_IDEDISK=y
 CONFIG_IDEDISK_MULTI_MODE=y
 CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_DELKIN=m
 CONFIG_BLK_DEV_IDECD=y
 # CONFIG_BLK_DEV_IDETAPE is not set
 CONFIG_BLK_DEV_IDEFLOPPY=y
 CONFIG_BLK_DEV_IDESCSI=m
 # CONFIG_IDE_TASK_IOCTL is not set
 # CONFIG_IDE_TASKFILE_IO is not set
-# CONFIG_BLK_DEV_IDE_SATA is not set
 
 #
 # IDE chipset support/bugfixes
 #
+CONFIG_IDE_GENERIC=y
 # CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
-CONFIG_BLK_DEV_IDEPNP=y
 CONFIG_BLK_DEV_IDEPCI=y
 CONFIG_IDEPCI_SHARE_IRQ=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
@@ -276,15 +374,18 @@ CONFIG_BLK_DEV_AEC62XX=y
 CONFIG_BLK_DEV_ALI15X3=y
 # CONFIG_WDC_ALI15X3 is not set
 CONFIG_BLK_DEV_AMD74XX=y
+CONFIG_BLK_DEV_ATIIXP=y
 CONFIG_BLK_DEV_CMD64X=y
 CONFIG_BLK_DEV_TRIFLEX=y
 CONFIG_BLK_DEV_CY82C693=y
 CONFIG_BLK_DEV_CS5520=y
 CONFIG_BLK_DEV_CS5530=y
 CONFIG_BLK_DEV_HPT34X=y
+# CONFIG_HPT34X_AUTODMA is not set
 CONFIG_BLK_DEV_HPT366=y
 # CONFIG_BLK_DEV_SC1200 is not set
 CONFIG_BLK_DEV_PIIX=y
+CONFIG_BLK_DEV_IT8212=y
 # CONFIG_BLK_DEV_NS87415 is not set
 CONFIG_BLK_DEV_PDC202XX_OLD=y
 # CONFIG_PDC202XX_BURST is not set
@@ -296,7 +397,7 @@ CONFIG_BLK_DEV_SIS5513=y
 CONFIG_BLK_DEV_SLC90E66=y
 # CONFIG_BLK_DEV_TRM290 is not set
 CONFIG_BLK_DEV_VIA82CXXX=y
-# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_IDEDMA_IVB is not set
 CONFIG_IDEDMA_AUTO=y
@@ -312,6 +413,8 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
+CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
 CONFIG_BLK_DEV_SR=m
@@ -324,24 +427,23 @@ CONFIG_CHR_DEV_SG=m
 # CONFIG_SCSI_MULTI_LUN is not set
 CONFIG_SCSI_CONSTANTS=y
 CONFIG_SCSI_LOGGING=y
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_SCSI_FC_ATTRS=y
+
+#
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=m
+CONFIG_SCSI_FC_ATTRS=m
 
 #
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
 CONFIG_SCSI_3W_9XXX=m
-# CONFIG_SCSI_7000FASST is not set
 CONFIG_SCSI_ACARD=m
-CONFIG_SCSI_AHA152X=m
-# CONFIG_SCSI_AHA1542 is not set
 CONFIG_SCSI_AACRAID=m
 CONFIG_SCSI_AIC7XXX=m
 CONFIG_AIC7XXX_CMDS_PER_DEVICE=4
 CONFIG_AIC7XXX_RESET_DELAY_MS=15000
-# CONFIG_AIC7XXX_PROBE_EISA_VL is not set
-# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set
 # CONFIG_AIC7XXX_DEBUG_ENABLE is not set
 CONFIG_AIC7XXX_DEBUG_MASK=0
 # CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set
@@ -349,68 +451,47 @@ CONFIG_SCSI_AIC7XXX_OLD=m
 CONFIG_SCSI_AIC79XX=m
 CONFIG_AIC79XX_CMDS_PER_DEVICE=4
 CONFIG_AIC79XX_RESET_DELAY_MS=15000
-# CONFIG_AIC79XX_BUILD_FIRMWARE is not set
 # CONFIG_AIC79XX_ENABLE_RD_STRM is not set
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 # CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_IN2000 is not set
 CONFIG_MEGARAID_NEWGEN=y
 CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
 CONFIG_SCSI_SATA_PROMISE=m
-CONFIG_SCSI_SATA_VIA=m
-CONFIG_BLK_DEV_SX8=m
-CONFIG_SCSI_SATA_VITESSE=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
-CONFIG_SCSI_SATA_SX4=m
-CONFIG_SCSI_SATA_NV=m
-CONFIG_SCSI_SATA_AHCI=m
-
+CONFIG_SCSI_SATA_VIA=m
+CONFIG_SCSI_SATA_VITESSE=m
 # CONFIG_SCSI_BUSLOGIC is not set
-CONFIG_SCSI_INITIO=m
-# CONFIG_SCSI_OMIT_FLASHPOINT is not set
-# CONFIG_SCSI_CPQFCTS is not set
 # CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DTC3280 is not set
 # CONFIG_SCSI_EATA is not set
 # CONFIG_SCSI_EATA_PIO is not set
+CONFIG_SCSI_LPFC=m
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 CONFIG_SCSI_GDTH=m
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
 CONFIG_SCSI_IPS=m
+CONFIG_SCSI_INITIO=m
 # CONFIG_SCSI_INIA100 is not set
 CONFIG_SCSI_PPA=m
 CONFIG_SCSI_IMM=m
 # CONFIG_SCSI_IZIP_EPP16 is not set
 # CONFIG_SCSI_IZIP_SLOW_CTR is not set
-# CONFIG_SCSI_NCR53C406A is not set
 CONFIG_SCSI_SYM53C8XX_2=m
 CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
-# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
 CONFIG_SCSI_QLOGIC_1280=m
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_DC390T is not set
 CONFIG_SCSI_QLA2XXX=m
 CONFIG_SCSI_QLA21XX=m
 CONFIG_SCSI_QLA22XX=m
@@ -418,26 +499,17 @@ CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
 CONFIG_SCSI_QLA6322=m
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_DPT_I2O is not set
-
-CONFIG_SCSI_LPFC=m
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_DEBUG is not set
 
 #
 # PCMCIA SCSI adapter support
 #
-# CONFIG_PCMCIA_AHA152X is not set
 # CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
 # CONFIG_PCMCIA_QLOGIC is not set
 # CONFIG_PCMCIA_SYM53C500 is not set
 
-
-#
-# Old CD-ROM drivers (not SCSI, not IDE)
-#
-# CONFIG_CD_NO_IDESCSI is not set
-
 #
 # Multi-device support (RAID and LVM)
 #
@@ -446,15 +518,15 @@ CONFIG_BLK_DEV_MD=y
 CONFIG_MD_LINEAR=m
 CONFIG_MD_RAID0=m
 CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
 CONFIG_MD_RAID5=m
 CONFIG_MD_RAID6=m
-CONFIG_MD_RAID10=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
+CONFIG_DM_CRYPT=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
-CONFIG_DM_CRYPT=m
 
 #
 # Fusion MPT device support
@@ -465,39 +537,18 @@ CONFIG_FUSION_CTL=m
 CONFIG_FUSION_LAN=m
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
 #
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-CONFIG_IEEE1394_OUI_DB=y
-
-#
-# Device Drivers
-#
-# CONFIG_IEEE1394_PCILYNX is not set
-CONFIG_IEEE1394_OHCI1394=m
-
-#
-# Protocol Drivers
-#
-CONFIG_IEEE1394_VIDEO1394=m
-CONFIG_IEEE1394_SBP2=m
-# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-CONFIG_IEEE1394_DV1394=m
-CONFIG_IEEE1394_RAWIO=m
-CONFIG_IEEE1394_CMP=m
-CONFIG_IEEE1394_AMDTP=m
-# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
-
-#
 # I2O device support
 #
 CONFIG_I2O=m
+CONFIG_I2O_CONFIG=m
+CONFIG_I2O_BLOCK=m
+CONFIG_I2O_SCSI=m
+CONFIG_I2O_PROC=m
 
 #
 # Networking support
@@ -513,7 +564,6 @@ CONFIG_NETLINK_DEV=y
 CONFIG_UNIX=y
 CONFIG_NET_KEY=m
 CONFIG_INET=y
-CONFIG_INET_TUNNEL=m
 CONFIG_IP_MULTICAST=y
 CONFIG_IP_ADVANCED_ROUTER=y
 CONFIG_IP_MULTIPLE_TABLES=y
@@ -532,14 +582,7 @@ CONFIG_SYN_COOKIES=y
 CONFIG_INET_AH=m
 CONFIG_INET_ESP=m
 CONFIG_INET_IPCOMP=m
-CONFIG_NETCONSOLE=m
-# CONFIG_NETPOLL_RX is not set
-CONFIG_NETPOLL_TRAP=y
-CONFIG_NET_POLL_CONTROLLER=y
-CONFIG_NETDUMP=m
-CONFIG_DISKDUMP=m
-CONFIG_SCSI_DUMP=m
-CONFIG_SD_IOSTATS=y
+CONFIG_INET_TUNNEL=m
 
 #
 # IP: Virtual Server Configuration
@@ -547,10 +590,18 @@ CONFIG_SD_IOSTATS=y
 CONFIG_IP_VS=m
 # CONFIG_IP_VS_DEBUG is not set
 CONFIG_IP_VS_TAB_BITS=12
+
+#
+# IPVS transport protocol load balancing support
+#
 CONFIG_IP_VS_PROTO_TCP=y
 CONFIG_IP_VS_PROTO_UDP=y
 CONFIG_IP_VS_PROTO_ESP=y
 CONFIG_IP_VS_PROTO_AH=y
+
+#
+# IPVS scheduler
+#
 CONFIG_IP_VS_RR=m
 CONFIG_IP_VS_WRR=m
 CONFIG_IP_VS_LC=m
@@ -561,17 +612,18 @@ CONFIG_IP_VS_DH=m
 CONFIG_IP_VS_SH=m
 CONFIG_IP_VS_SED=m
 CONFIG_IP_VS_NQ=m
-CONFIG_IP_VS_FTP=m
-
 
+#
+# IPVS application helper
+#
+CONFIG_IP_VS_FTP=m
 CONFIG_IPV6=m
 CONFIG_IPV6_PRIVACY=y
 CONFIG_INET6_AH=m
 CONFIG_INET6_ESP=m
 CONFIG_INET6_IPCOMP=m
+CONFIG_INET6_TUNNEL=m
 CONFIG_IPV6_TUNNEL=m
-# CONFIG_DECNET is not set
-CONFIG_BRIDGE=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
 CONFIG_BRIDGE_NETFILTER=y
@@ -580,14 +632,14 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_ACCT=y
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
 CONFIG_IP_NF_AMANDA=m
 CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_RAW=m
 CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_COMMENT=m
 CONFIG_IP_NF_MATCH_LIMIT=m
 CONFIG_IP_NF_MATCH_IPRANGE=m
 CONFIG_IP_NF_MATCH_MAC=m
@@ -610,15 +662,18 @@ CONFIG_IP_NF_MATCH_PHYSDEV=m
 CONFIG_IP_NF_MATCH_ADDRTYPE=m
 CONFIG_IP_NF_MATCH_REALM=m
 CONFIG_IP_NF_MATCH_SCTP=m
+CONFIG_IP_NF_MATCH_COMMENT=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_TCPMSS=m
 CONFIG_IP_NF_NAT=m
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
 CONFIG_IP_NF_TARGET_REDIRECT=m
 CONFIG_IP_NF_TARGET_NETMAP=m
 CONFIG_IP_NF_TARGET_SAME=m
-CONFIG_IP_NF_TARGET_NOTRACK=m
 CONFIG_IP_NF_NAT_LOCAL=y
 CONFIG_IP_NF_NAT_SNMP_BASIC=m
 CONFIG_IP_NF_NAT_IRC=m
@@ -631,14 +686,11 @@ CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_TARGET_NOTRACK=m
 CONFIG_IP_NF_ARPTABLES=m
 CONFIG_IP_NF_ARPFILTER=m
 CONFIG_IP_NF_ARP_MANGLE=m
-CONFIG_IP_NF_CT_ACCT=y
-CONFIG_IP_NF_CT_PROTO_SCTP=m
 # CONFIG_IP_NF_COMPAT_IPCHAINS is not set
 # CONFIG_IP_NF_COMPAT_IPFWADM is not set
 
@@ -667,7 +719,6 @@ CONFIG_IP6_NF_MANGLE=m
 CONFIG_IP6_NF_TARGET_MARK=m
 CONFIG_IP6_NF_RAW=m
 
-
 #
 # Bridge: Netfilter Configuration
 #
@@ -703,33 +754,36 @@ CONFIG_IP_SCTP=m
 # CONFIG_SCTP_HMAC_SHA1 is not set
 CONFIG_SCTP_HMAC_MD5=y
 CONFIG_ATM=m
+CONFIG_ATM_CLIP=m
+# CONFIG_ATM_CLIP_NO_ICMP is not set
+CONFIG_ATM_LANE=m
+# CONFIG_ATM_MPOA is not set
+CONFIG_ATM_BR2684=m
+# CONFIG_ATM_BR2684_IPFILTER is not set
+CONFIG_BRIDGE=m
 CONFIG_VLAN_8021Q=m
-CONFIG_LLC=m
+# CONFIG_DECNET is not set
+CONFIG_LLC=y
 # CONFIG_LLC2 is not set
 # CONFIG_IPX is not set
-# CONFIG_IPX_INTERN is not set
 # CONFIG_ATALK is not set
-# CONFIG_DEV_APPLETALK is not set
-# CONFIG_LTPC is not set
-# CONFIG_COPS is not set
-CONFIG_COPS_DAYNA=y
-CONFIG_COPS_TANGENT=y
-# CONFIG_IPDDP is not set
-CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 CONFIG_NET_DIVERT=y
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_HW_FLOWCONTROL is not set
 
 #
 # QoS and/or fair queueing
 #
 CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CLK_JIFFIES=y
+# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
+# CONFIG_NET_SCH_CLK_CPU is not set
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_ATM=m
 CONFIG_NET_SCH_PRIO=m
 CONFIG_NET_SCH_RED=m
 CONFIG_NET_SCH_SFQ=m
@@ -737,9 +791,8 @@ CONFIG_NET_SCH_TEQL=m
 CONFIG_NET_SCH_TBF=m
 CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
-CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_SCH_HFSC=m
 CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_QOS=y
 CONFIG_NET_ESTIMATOR=y
 CONFIG_NET_CLS=y
@@ -748,72 +801,69 @@ CONFIG_NET_CLS_ROUTE4=m
 CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
-CONFIG_NET_CLS_RSVP=m
-CONFIG_NET_CLS_RSVP6=m
-CONFIG_NET_CLS_POLICE=y
-# CONFIG_NET_ACT_POLICE is not set
 CONFIG_CLS_U32_PERF=y
 CONFIG_NET_CLS_IND=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_CLS_ACT is not set
+CONFIG_NET_CLS_POLICE=y
 
 #
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
-CONFIG_NETDEVICES=y
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=m
-CONFIG_ETHERTAP=m
-# CONFIG_NET_SB1000 is not set
-
-#
-# ATM
-# 
-CONFIG_ATM_CLIP=m
-CONFIG_ATM_LANE=m
-CONFIG_ATM_BR2684=m
-CONFIG_NET_SCH_ATM=m
-CONFIG_ATM_TCP=m
-CONFIG_ATM_LANAI=m
-CONFIG_ATM_ENI=m
-CONFIG_ATM_FIRESTREAM=m
-# CONFIG_ATM_ZATM is not set
-CONFIG_ATM_IDT77252=m
-CONFIG_ATM_AMBASSADOR=m
-CONFIG_ATM_HORIZON=m
-CONFIG_ATM_FORE200E_MAYBE=m
-CONFIG_ATM_HE=m
-CONFIG_PPPOATM=m
-CONFIG_ATM_NICSTAR=m
-# CONFIG_ATM_IA is not set
-
-
-# CONFIG_ATM_CLIP_NO_ICMP is not set
-# CONFIG_ATM_MPOA is not set
-# CONFIG_ATM_BR2684_IPFILTER is not set
-# CONFIG_ATM_ENI_DEBUG is not set
-# CONFIG_ATM_ENI_TUNE_BURST is not set
-# CONFIG_ATM_ZATM_DEBUG is not set
-# CONFIG_ATM_IDT77252_DEBUG is not set
-# CONFIG_ATM_IDT77252_RCV_ALL is not set
-# CONFIG_ATM_AMBASSADOR_DEBUG is not set
-# CONFIG_ATM_HORIZON_DEBUG is not set
-# CONFIG_ATM_FORE200E_PCA is not set
-# CONFIG_ATM_HE_USE_SUNI is not set
-# CONFIG_ATM_NICSTAR_USE_SUNI is not set
-# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set
-# CONFIG_ATM_IA_DEBUG is not set
-
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+CONFIG_NETPOLL_TRAP=y
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_CMTP=m
+CONFIG_BT_HIDP=m
 
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUSB=m
+CONFIG_BT_HCIUSB_SCO=y
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_BCSP_TXCRC=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_TUX=m
 
+#
+# TUX options
+#
+CONFIG_TUX_EXTCGI=y
+# CONFIG_TUX_EXTENDED_LOG is not set
+# CONFIG_TUX_DEBUG is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+CONFIG_BONDING=m
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+CONFIG_ETHERTAP=m
 
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
 
 #
 # Ethernet (10 or 100Mbit)
@@ -823,23 +873,8 @@ CONFIG_MII=m
 CONFIG_HAPPYMEAL=m
 CONFIG_SUNGEM=m
 CONFIG_NET_VENDOR_3COM=y
-# CONFIG_EL1 is not set
-# CONFIG_EL2 is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_EL16 is not set
-# CONFIG_EL3 is not set
-# CONFIG_3C515 is not set
 CONFIG_VORTEX=m
 CONFIG_TYPHOON=m
-# CONFIG_LANCE is not set
-CONFIG_NET_VENDOR_SMC=y
-# CONFIG_WD80x3 is not set
-# CONFIG_ULTRA is not set
-CONFIG_SMC9194=m
-CONFIG_NET_VENDOR_RACAL=y
-# CONFIG_NI52 is not set
-# CONFIG_NI65 is not set
 
 #
 # Tulip family network device support
@@ -847,51 +882,28 @@ CONFIG_NET_VENDOR_RACAL=y
 CONFIG_NET_TULIP=y
 CONFIG_DE2104X=m
 CONFIG_TULIP=m
-# CONFIG_TULIP_NAPI is not set
-
 # CONFIG_TULIP_MWI is not set
 CONFIG_TULIP_MMIO=y
-# CONFIG_NI5010 is not set
-# CONFIG_PCMCIA_XIRTULIP is not set
+# CONFIG_TULIP_NAPI is not set
 CONFIG_DE4X5=m
 CONFIG_WINBOND_840=m
 CONFIG_DM9102=m
 CONFIG_PCMCIA_XIRCOM=m
-# CONFIG_AT1700 is not set
-# CONFIG_DEPCA is not set
 # CONFIG_HP100 is not set
-# CONFIG_NET_ISA is not set
-CONFIG_EWRK3=m
-CONFIG_E2100=m
-CONFIG_EEXPRESS=m
-CONFIG_EEXPRESS_PRO=m
-CONFIG_HPLAN_PLUS=m
-CONFIG_HPLAN=m
-CONFIG_LP486E=m
-CONFIG_ETH16I=m
-CONFIG_NE2000=m
-CONFIG_ZNET=m
-CONFIG_SEEQ8005=m
-CONFIG_LNE390=m
-CONFIG_NE3210=m
-CONFIG_ES3210=m
 CONFIG_NET_PCI=y
 CONFIG_PCNET32=m
 CONFIG_AMD8111_ETH=m
 CONFIG_AMD8111E_NAPI=y
 CONFIG_ADAPTEC_STARFIRE=m
 CONFIG_ADAPTEC_STARFIRE_NAPI=y
-# CONFIG_AC3200 is not set
-CONFIG_APRICOT=m
 CONFIG_B44=m
-# CONFIG_CS89x0 is not set
+CONFIG_FORCEDETH=m
 # CONFIG_DGRS is not set
 CONFIG_EEPRO100=m
 # CONFIG_EEPRO100_PIO is not set
 CONFIG_E100=m
 CONFIG_E100_NAPI=y
 CONFIG_FEALNX=m
-CONFIG_FORCEDETH=m
 CONFIG_NATSEMI=m
 CONFIG_NE2K_PCI=m
 CONFIG_8139CP=m
@@ -903,15 +915,8 @@ CONFIG_8139TOO_8129=y
 CONFIG_SIS900=m
 CONFIG_EPIC100=m
 # CONFIG_SUNDANCE is not set
-# CONFIG_SUNDANCE_MMIO is not set
-CONFIG_TLAN=m
 CONFIG_VIA_RHINE=m
 CONFIG_VIA_RHINE_MMIO=y
-CONFIG_VIA_VELOCITY=m
-CONFIG_NET_POCKET=y
-# CONFIG_ATP is not set
-# CONFIG_DE600 is not set
-# CONFIG_DE620 is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -927,6 +932,7 @@ CONFIG_NS83820=m
 CONFIG_R8169=m
 CONFIG_R8169_NAPI=y
 CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
 CONFIG_TIGON3=m
 
 #
@@ -936,21 +942,16 @@ CONFIG_IXGB=m
 CONFIG_IXGB_NAPI=y
 CONFIG_S2IO=m
 CONFIG_S2IO_NAPI=y
-CONFIG_FDDI=y
-# CONFIG_DEFXX is not set
-# CONFIG_SKFP is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PLIP is not set
-CONFIG_PPP=m
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_IPPP_FILTER=y
-# CONFIG_PPP_BSDCOMP is not set
-CONFIG_PPPOE=m
-# CONFIG_SLIP is not set
+
+#
+# Token Ring devices
+#
+CONFIG_TR=y
+CONFIG_IBMOL=m
+CONFIG_3C359=m
+CONFIG_TMS380TR=m
+CONFIG_TMSPCI=m
+CONFIG_ABYSS=m
 
 #
 # Wireless LAN (non-hamradio)
@@ -961,8 +962,6 @@ CONFIG_NET_RADIO=y
 # Obsolete Wireless cards support (pre-802.11)
 #
 # CONFIG_STRIP is not set
-# CONFIG_ARLAN is not set
-CONFIG_WAVELAN=m
 CONFIG_PCMCIA_WAVELAN=m
 CONFIG_PCMCIA_NETWAVE=m
 
@@ -978,21 +977,18 @@ CONFIG_IEEE80211=m
 # CONFIG_IEEE80211_DEBUG is not set
 CONFIG_IEEE80211_CRYPT=m
 CONFIG_IEEE80211_WPA=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
 CONFIG_IEEE80211_CRYPT_TKIP=m
 CONFIG_IPW2100=m
 # CONFIG_IPW_DEBUG is not set
 CONFIG_IPW2100_PROMISC=y
 # CONFIG_IPW2100_LEGACY_FW_LOAD is not set
 CONFIG_IPW2200=m
-CONFIG_AIRO=m
 CONFIG_HERMES=m
 CONFIG_PLX_HERMES=m
 CONFIG_TMD_HERMES=m
 CONFIG_PCI_HERMES=m
 CONFIG_ATMEL=m
 CONFIG_PCI_ATMEL=m
-CONFIG_PRISM54=m
 
 #
 # Wireless 802.11b Pcmcia/Cardbus cards support
@@ -1001,32 +997,12 @@ CONFIG_PCMCIA_HERMES=m
 CONFIG_AIRO_CS=m
 CONFIG_PCMCIA_ATMEL=m
 CONFIG_PCMCIA_WL3501=m
-CONFIG_NET_WIRELESS=y
 
 #
-# Token Ring devices
-#
-CONFIG_TR=y
-CONFIG_IBMOL=m
-CONFIG_3C359=m
-CONFIG_TMS380TR=m
-CONFIG_TMSPCI=m
-CONFIG_ABYSS=m
-CONFIG_IBMTR=m
-CONFIG_IBMLS=m
-CONFIG_SKISA=m
-CONFIG_PROTEON=m
-CONFIG_SMCTR=m
-CONFIG_PCMCIA_IBMTR=m
-
-
-CONFIG_NET_FC=y
-# CONFIG_SHAPER is not set
-
-#
-# Wan interfaces
+# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
 #
-# CONFIG_WAN is not set
+CONFIG_PRISM54=m
+CONFIG_NET_WIRELESS=y
 
 #
 # PCMCIA network device support
@@ -1042,138 +1018,108 @@ CONFIG_PCMCIA_XIRC2PS=m
 CONFIG_PCMCIA_AXNET=m
 
 #
-# Amateur Radio support
+# Wan interfaces
 #
-# CONFIG_HAMRADIO is not set
+# CONFIG_WAN is not set
 
 #
-# IrDA (infrared) support
-#
-# CONFIG_IRDA is not set
-# CONFIG_IRDA is not set
-# CONFIG_IRDA_DEBUG is not set
-CONFIG_IRLAN=m
-CONFIG_IRNET=m
-CONFIG_IRCOMM=m
-# CONFIG_IRDA_ULTRA is not set
-CONFIG_IRDA_CACHE_LAST_LSAP=y
-CONFIG_IRDA_FAST_RR=y
-CONFIG_IRTTY_SIR=m
-CONFIG_DONGLE=y
-CONFIG_ESI_DONGLE=m
-CONFIG_ACTISYS_DONGLE=m
-CONFIG_TEKRAM_DONGLE=m
-CONFIG_IRPORT_SIR=m
-# CONFIG_DONGLE_OLD is not set
-CONFIG_LITELINK_DONGLE=m
-CONFIG_MA600_DONGLE=m
-CONFIG_GIRBIL_DONGLE=m
-CONFIG_MCP2120_DONGLE=m
-CONFIG_OLD_BELKIN_DONGLE=m
-CONFIG_ACT200L_DONGLE=m
-
-CONFIG_USB_IRDA=m
-CONFIG_NSC_FIR=m
-CONFIG_SIGMATEL_FIR=m
-# CONFIG_WINBOND_FIR is not set
-# CONFIG_TOSHIBA_FIR is not set
-# CONFIG_SMC_IRCC_FIR is not set
-# CONFIG_ALI_FIR is not set
-# CONFIG_VLSI_FIR is not set
-# CONFIG_VIA_FIR is not set
-
-
-
-#
-# Bluetooth support
+# ATM drivers
 #
-CONFIG_BT=m
-CONFIG_BT_L2CAP=m
-CONFIG_BT_SCO=m
-CONFIG_BT_CMTP=m
-CONFIG_BT_RFCOMM=m
-CONFIG_BT_RFCOMM_TTY=y
-CONFIG_BT_BNEP=m
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-CONFIG_BT_HIDP=m
+CONFIG_ATM_TCP=m
+CONFIG_ATM_LANAI=m
+CONFIG_ATM_ENI=m
+# CONFIG_ATM_ENI_DEBUG is not set
+# CONFIG_ATM_ENI_TUNE_BURST is not set
+CONFIG_ATM_FIRESTREAM=m
+# CONFIG_ATM_ZATM is not set
+CONFIG_ATM_IDT77252=m
+# CONFIG_ATM_IDT77252_DEBUG is not set
+# CONFIG_ATM_IDT77252_RCV_ALL is not set
+CONFIG_ATM_IDT77252_USE_SUNI=y
+CONFIG_ATM_AMBASSADOR=m
+# CONFIG_ATM_AMBASSADOR_DEBUG is not set
+CONFIG_ATM_HORIZON=m
+# CONFIG_ATM_HORIZON_DEBUG is not set
+CONFIG_ATM_FORE200E_MAYBE=m
+# CONFIG_ATM_FORE200E_PCA is not set
+CONFIG_ATM_HE=m
+# CONFIG_ATM_HE_USE_SUNI is not set
+CONFIG_FDDI=y
+# CONFIG_DEFXX is not set
+# CONFIG_SKFP is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+# CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPPOE=m
+CONFIG_PPPOATM=m
+# CONFIG_SLIP is not set
+CONFIG_NET_FC=y
+# CONFIG_SHAPER is not set
+CONFIG_NETCONSOLE=m
+CONFIG_NETDUMP=m
 
 #
-# Bluetooth device drivers
+# ISDN subsystem
 #
-CONFIG_BT_HCIUSB=m
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_BCSP_TXCRC=y
-CONFIG_BT_HCIDTL1=m
-CONFIG_BT_HCIBT3C=m
-CONFIG_BT_HCIBLUECARD=m
-CONFIG_BT_HCIBTUART=m
-CONFIG_BT_HCIVHCI=m
-CONFIG_BT_HCIUSB_SCO=y
-CONFIG_BT_HCIBCM203X=m
-CONFIG_BT_HCIBFUSB=m
-CONFIG_USB_BLUETOOTH_TTY=m
+CONFIG_ISDN=m
 
 #
-# ISDN subsystem
+# Old ISDN4Linux
 #
-
-CONFIG_ISDN=m
 CONFIG_ISDN_I4L=m
-CONFIG_ISDN_DRV_AVMB1_B1ISA=m
-CONFIG_ISDN_DRV_AVMB1_B1PCI=m
-CONFIG_ISDN_DRV_AVMB1_T1ISA=m
-CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
-CONFIG_ISDN_DRV_AVMB1_T1PCI=m
-CONFIG_ISDN_DRV_AVMB1_C4=m
-
 CONFIG_ISDN_PPP=y
 CONFIG_ISDN_PPP_VJ=y
 CONFIG_ISDN_MPP=y
+CONFIG_IPPP_FILTER=y
 # CONFIG_ISDN_PPP_BSDCOMP is not set
+CONFIG_ISDN_AUDIO=y
 CONFIG_ISDN_TTY_FAX=y
-CONFIG_DE_AOC=y
 
-CONFIG_ISDN_AUDIO=y
+#
+# ISDN feature submodules
+#
 
-CONFIG_ISDN_DRV_HISAX=m
-CONFIG_ISDN_DRV_ICN=m
-CONFIG_ISDN_DRV_PCBIT=m
-CONFIG_ISDN_DRV_SC=m
-CONFIG_ISDN_DRV_ACT2000=m
-CONFIG_ISDN_DRV_TPAM=m
-CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
-CONFIG_ISDN_DRV_AVMB1_AVM_CS=m
+#
+# ISDN4Linux hardware drivers
+#
 
-CONFIG_ISDN_CAPI_CAPIDRV=m
+#
+# Passive cards
+#
+CONFIG_ISDN_DRV_HISAX=m
 
+#
+# D-channel protocol features
+#
 CONFIG_HISAX_EURO=y
+CONFIG_DE_AOC=y
+CONFIG_HISAX_NO_SENDCOMPLETE=y
+CONFIG_HISAX_NO_LLC=y
+CONFIG_HISAX_NO_KEYPAD=y
 CONFIG_HISAX_1TR6=y
 CONFIG_HISAX_NI1=y
 CONFIG_HISAX_MAX_CARDS=8
-CONFIG_HISAX_16_0=y
+
+#
+# HiSax supported cards
+#
 CONFIG_HISAX_16_3=y
 CONFIG_HISAX_TELESPCI=y
 CONFIG_HISAX_S0BOX=y
-CONFIG_HISAX_AVM_A1=y
 CONFIG_HISAX_FRITZPCI=y
 CONFIG_HISAX_AVM_A1_PCMCIA=y
 CONFIG_HISAX_ELSA=y
-CONFIG_HISAX_IX1MICROR2=y
 CONFIG_HISAX_DIEHLDIVA=y
-CONFIG_HISAX_ASUSCOM=y
-CONFIG_HISAX_TELEINT=y
-CONFIG_HISAX_HFCS=y
 CONFIG_HISAX_SEDLBAUER=y
-CONFIG_HISAX_SPORTSTER=y
-CONFIG_HISAX_MIC=y
 CONFIG_HISAX_NETJET=y
 CONFIG_HISAX_NETJET_U=y
 CONFIG_HISAX_NICCY=y
-CONFIG_HISAX_ISURF=y
-CONFIG_HISAX_HSTSAPHIR=y
 CONFIG_HISAX_BKM_A4T=y
 CONFIG_HISAX_SCT_QUADRO=y
 CONFIG_HISAX_GAZEL=y
@@ -1182,21 +1128,27 @@ CONFIG_HISAX_W6692=y
 CONFIG_HISAX_HFC_SX=y
 CONFIG_HISAX_ENTERNOW_PCI=y
 # CONFIG_HISAX_DEBUG is not set
-CONFIG_HISAX_AVM_A1_CS=m
-CONFIG_HISAX_ST5481=m
-CONFIG_HISAX_HFCUSB=m
-CONFIG_HISAX_FRITZ_PCIPNP=m
-CONFIG_HISAX_NO_SENDCOMPLETE=y
-CONFIG_HISAX_NO_LLC=y
-CONFIG_HISAX_NO_KEYPAD=y
+
+#
+# HiSax PCMCIA card service modules
+#
 CONFIG_HISAX_SEDLBAUER_CS=m
 CONFIG_HISAX_ELSA_CS=m
+CONFIG_HISAX_AVM_A1_CS=m
 CONFIG_HISAX_TELES_CS=m
 
-CONFIG_ISDN_DRV_LOOP=m
-CONFIG_HYSDN=m
-CONFIG_HYSDN_CAPI=y
+#
+# HiSax sub driver modules
+#
+CONFIG_HISAX_ST5481=m
+CONFIG_HISAX_HFCUSB=m
+CONFIG_HISAX_FRITZ_PCIPNP=m
+CONFIG_HISAX_HDLC=y
 
+#
+# Active cards
+#
+CONFIG_ISDN_DRV_TPAM=m
 
 #
 # CAPI subsystem
@@ -1207,6 +1159,7 @@ CONFIG_ISDN_CAPI_MIDDLEWARE=y
 CONFIG_ISDN_CAPI_CAPI20=m
 CONFIG_ISDN_CAPI_CAPIFS_BOOL=y
 CONFIG_ISDN_CAPI_CAPIFS=m
+CONFIG_ISDN_CAPI_CAPIDRV=m
 
 #
 # CAPI hardware drivers
@@ -1221,12 +1174,6 @@ CONFIG_CAPI_AVM=y
 # Active Eicon DIVA Server cards
 #
 # CONFIG_CAPI_EICON is not set
-CONFIG_ISDN_DIVAS=m
-CONFIG_ISDN_DIVAS_BRIPCI=y
-CONFIG_ISDN_DIVAS_PRIPCI=y
-CONFIG_ISDN_DIVAS_DIVACAPI=m
-CONFIG_ISDN_DIVAS_USERIDI=m
-CONFIG_ISDN_DIVAS_MAINT=m
 
 #
 # Telephony Support
@@ -1254,21 +1201,14 @@ CONFIG_INPUT_EVDEV=y
 # Input I/O drivers
 #
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=m
-CONFIG_GAMEPORT_NS558=m
-CONFIG_GAMEPORT_L4=m
-CONFIG_GAMEPORT_EMU10K1=m
-CONFIG_GAMEPORT_VORTEX=m
-CONFIG_GAMEPORT_FM801=m
-CONFIG_GAMEPORT_CS461x=m
+CONFIG_SOUND_GAMEPORT=y
 CONFIG_SERIO=y
 CONFIG_SERIO_I8042=y
 CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_RAW is not set
-
 # CONFIG_SERIO_CT82C710 is not set
 # CONFIG_SERIO_PARKBD is not set
 # CONFIG_SERIO_PCIPS2 is not set
+# CONFIG_SERIO_RAW is not set
 
 #
 # Input Device Drivers
@@ -1276,32 +1216,15 @@ CONFIG_SERIO_SERPORT=y
 CONFIG_INPUT_KEYBOARD=y
 CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_LKKBD is not set
 CONFIG_INPUT_MOUSE=y
 CONFIG_MOUSE_PS2=y
 CONFIG_MOUSE_SERIAL=m
-CONFIG_MOUSE_INPORT=m
-CONFIG_MOUSE_ATIXL=y
-CONFIG_MOUSE_LOGIBM=m
-CONFIG_MOUSE_PC110PAD=m
 CONFIG_MOUSE_VSXXXAA=m
 CONFIG_INPUT_JOYSTICK=y
-# CONFIG_JOYSTICK_ANALOG is not set
-# CONFIG_JOYSTICK_A3D is not set
-# CONFIG_JOYSTICK_ADI is not set
-# CONFIG_JOYSTICK_COBRA is not set
-# CONFIG_JOYSTICK_GF2K is not set
-# CONFIG_JOYSTICK_GRIP is not set
-# CONFIG_JOYSTICK_GRIP_MP is not set
-# CONFIG_JOYSTICK_GUILLEMOT is not set
-# CONFIG_JOYSTICK_INTERACT is not set
-# CONFIG_JOYSTICK_SIDEWINDER is not set
-# CONFIG_JOYSTICK_TMDC is not set
 # CONFIG_JOYSTICK_IFORCE is not set
-# CONFIG_JOYSTICK_IFORCE_USB=y
-# CONFIG_JOYSTICK_IFORCE_232=y
 # CONFIG_JOYSTICK_WARRIOR is not set
 # CONFIG_JOYSTICK_MAGELLAN is not set
 # CONFIG_JOYSTICK_SPACEORB is not set
@@ -1311,12 +1234,11 @@ CONFIG_INPUT_JOYSTICK=y
 # CONFIG_JOYSTICK_DB9 is not set
 # CONFIG_JOYSTICK_GAMECON is not set
 # CONFIG_JOYSTICK_TURBOGRAFX is not set
-CONFIG_JOYSTICK_JOYDUMP=m
 CONFIG_INPUT_TOUCHSCREEN=y
 CONFIG_TOUCHSCREEN_GUNZE=m
 CONFIG_INPUT_MISC=y
 CONFIG_INPUT_PCSPKR=m
-CONFIG_INPUT_UINPUT=m 
+CONFIG_INPUT_UINPUT=m
 
 #
 # Character devices
@@ -1326,12 +1248,11 @@ CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
 CONFIG_SERIAL_NONSTANDARD=y
 # CONFIG_ROCKETPORT is not set
+# CONFIG_CYCLADES is not set
 # CONFIG_SYNCLINK is not set
 # CONFIG_SYNCLINKMP is not set
 CONFIG_N_HDLC=m
 CONFIG_STALDRV=y
-# CONFIG_FTAPE is not set
-# CONFIG_IBM_ASM is not set
 
 #
 # Serial drivers
@@ -1347,20 +1268,6 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
 CONFIG_SERIAL_8250_DETECT_IRQ=y
 CONFIG_SERIAL_8250_MULTIPORT=y
 CONFIG_SERIAL_8250_RSA=y
-# CONFIG_COMPUTONE is not set
-# CONFIG_CYCLADES is not set
-# CONFIG_DIGIEPCA is not set
-# CONFIG_DIGI is not set
-# CONFIG_ESPSERIAL is not set
-# CONFIG_MOXA_INTELLIO is not set
-# CONFIG_MOXA_SMARTIO is not set
-# CONFIG_ISI is not set
-# CONFIG_RISCOM8 is not set
-# CONFIG_SPECIALIX is not set
-# CONFIG_SX is not set
-# CONFIG_RIO is not set
-# CONFIG_STALLION is not set
-# CONFIG_ISTALLION is not set
 
 #
 # Non-8250 serial port support
@@ -1369,12 +1276,91 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 # CONFIG_LEGACY_PTYS is not set
+CONFIG_CRASH=m
 CONFIG_PRINTER=m
 CONFIG_LP_CONSOLE=y
 CONFIG_PPDEV=m
 # CONFIG_TIPAR is not set
 
 #
+# IPMI
+#
+CONFIG_IPMI_HANDLER=m
+# CONFIG_IPMI_PANIC_EVENT is not set
+CONFIG_IPMI_DEVICE_INTERFACE=m
+CONFIG_IPMI_SI=m
+CONFIG_IPMI_WATCHDOG=m
+CONFIG_IPMI_POWEROFF=m
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_ACQUIRE_WDT=m
+CONFIG_ADVANTECH_WDT=m
+CONFIG_ALIM1535_WDT=m
+CONFIG_ALIM7101_WDT=m
+CONFIG_SC520_WDT=m
+CONFIG_EUROTECH_WDT=m
+CONFIG_IB700_WDT=m
+CONFIG_WAFER_WDT=m
+CONFIG_I8XX_TCO=m
+CONFIG_SC1200_WDT=m
+# CONFIG_SCx200_WDT is not set
+# CONFIG_60XX_WDT is not set
+CONFIG_CPU5_WDT=m
+CONFIG_W83627HF_WDT=m
+CONFIG_W83877F_WDT=m
+CONFIG_MACHZ_WDT=m
+
+#
+# PCI-based Watchdog Cards
+#
+CONFIG_PCIPCWATCHDOG=m
+CONFIG_WDTPCI=m
+CONFIG_WDT_501_PCI=y
+
+#
+# USB-based Watchdog Cards
+#
+CONFIG_USBPCWATCHDOG=m
+CONFIG_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+CONFIG_RTC=y
+CONFIG_DTLK=m
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+CONFIG_AGP=y
+CONFIG_AGP_AMD64=y
+CONFIG_AGP_INTEL_MCH=y
+CONFIG_DRM=y
+# CONFIG_DRM_TDFX is not set
+CONFIG_DRM_R128=m
+CONFIG_DRM_RADEON=m
+CONFIG_DRM_MGA=m
+# CONFIG_DRM_SIS is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_MWAVE is not set
+CONFIG_RAW_DRIVER=y
+# CONFIG_HPET is not set
+CONFIG_MAX_RAW_DEVS=8192
+CONFIG_HANGCHECK_TIMER=m
+
+#
 # I2C support
 #
 CONFIG_I2C=m
@@ -1383,14 +1369,15 @@ CONFIG_I2C_CHARDEV=m
 #
 # I2C Algorithms
 #
-# CONFIG_I2C_DEBUG_ALGO is not set
 CONFIG_I2C_ALGOBIT=m
 CONFIG_I2C_ALGOPCF=m
+CONFIG_I2C_ALGOPCA=m
 
 #
 # I2C Hardware Bus support
 #
 CONFIG_I2C_ALI1535=m
+CONFIG_I2C_ALI1563=m
 CONFIG_I2C_ALI15X3=m
 CONFIG_I2C_AMD756=m
 CONFIG_I2C_AMD8111=m
@@ -1398,7 +1385,8 @@ CONFIG_I2C_I801=m
 CONFIG_I2C_I810=m
 CONFIG_I2C_ISA=m
 CONFIG_I2C_NFORCE2=m
-CONFIG_I2C_PIIX4=m
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
 CONFIG_I2C_PROSAVAGE=m
 CONFIG_I2C_SAVAGE4=m
 # CONFIG_SCx200_ACB is not set
@@ -1408,151 +1396,60 @@ CONFIG_I2C_SIS96X=m
 CONFIG_I2C_VIA=m
 CONFIG_I2C_VIAPRO=m
 CONFIG_I2C_VOODOO3=m
-# CONFIG_I2C_ELEKTOR is not set
-CONFIG_I2C_PARPORT=m
-CONFIG_I2C_PARPORT_LIGHT=m
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-# CONFIG_I2C_PARPORT is not set
-CONFIG_I2C_ALI1563=m
-# CONFIG_I2C_PARPORT_LIGHT is not set
-CONFIG_I2C_ALGOPCA=m
 # CONFIG_I2C_PCA_ISA is not set
-
 
 #
-# I2C Hardware Sensors Chip support
+# Hardware Sensors Chip support
 #
 CONFIG_I2C_SENSOR=m
 CONFIG_SENSORS_ADM1021=m
-CONFIG_SENSORS_EEPROM=m
+CONFIG_SENSORS_ADM1025=m
+CONFIG_SENSORS_ADM1031=m
+CONFIG_SENSORS_ASB100=m
+CONFIG_SENSORS_DS1621=m
+CONFIG_SENSORS_FSCHER=m
+CONFIG_SENSORS_GL518SM=m
 CONFIG_SENSORS_IT87=m
 CONFIG_SENSORS_LM75=m
+CONFIG_SENSORS_LM77=m
 CONFIG_SENSORS_LM78=m
 CONFIG_SENSORS_LM80=m
 CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
+CONFIG_SENSORS_LM90=m
+CONFIG_SENSORS_MAX1619=m
+CONFIG_SENSORS_SMSC47M1=m
 CONFIG_SENSORS_VIA686A=m
 CONFIG_SENSORS_W83781D=m
-CONFIG_SENSORS_ASB100=m
-CONFIG_SENSORS_LM90=m
 CONFIG_SENSORS_W83L785TS=m
-CONFIG_SENSORS_FSCHER=m
-CONFIG_SENSORS_GL518SM=m
-CONFIG_SENSORS_DS1621=m
 CONFIG_SENSORS_W83627HF=m
-CONFIG_SENSORS_PCF8574=m
-CONFIG_SENSORS_PCF8591=m
-CONFIG_SENSORS_RTC8564=m
-CONFIG_SENSORS_MAX1619=m
-CONFIG_SENSORS_ADM1025=m
-CONFIG_SENSORS_ADM1031=m
-CONFIG_SENSORS_LM77=m
-CONFIG_SENSORS_SMSC47M1=m
-
-# CONFIG_W1 is not set
-
-#
-# Mice
-#
-CONFIG_CRASH=m
-
-#
-# IPMI
-#
-CONFIG_IPMI_HANDLER=m
-# CONFIG_IPMI_PANIC_EVENT is not set
-CONFIG_IPMI_DEVICE_INTERFACE=m
-CONFIG_IPMI_WATCHDOG=m
-CONFIG_IPMI_SI=m
-CONFIG_IPMI_POWEROFF=m
 
 #
-# Watchdog Cards
+# Other I2C Chip support
 #
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-CONFIG_SOFT_WATCHDOG=m
-CONFIG_WDT=m
-# CONFIG_WDT_501 is not set
-CONFIG_WDTPCI=m
-CONFIG_WDT_501_PCI=y
-CONFIG_PCWATCHDOG=m
-CONFIG_ACQUIRE_WDT=m
-CONFIG_ADVANTECH_WDT=m
-CONFIG_EUROTECH_WDT=m
-CONFIG_IB700_WDT=m
-CONFIG_I8XX_TCO=m
-# CONFIG_MIXCOMWD is not set
-# CONFIG_SCx200_WDT is not set
-# CONFIG_60XX_WDT is not set
-CONFIG_W83877F_WDT=m
-CONFIG_W83627HF_WDT=m
-CONFIG_MACHZ_WDT=m
-CONFIG_SC520_WDT=m
-CONFIG_ALIM7101_WDT=m
-CONFIG_ALIM1535_WDT=m
-CONFIG_SC1200_WDT=m
-CONFIG_WAFER_WDT=m
-CONFIG_CPU5_WDT=m
-CONFIG_PCIPCWATCHDOG=m
-CONFIG_USBPCWATCHDOG=m
-
-
-CONFIG_HW_RANDOM=m
-# CONFIG_NVRAM is not set
-CONFIG_RTC=y
-CONFIG_DTLK=m
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-# CONFIG_SONYPI is not set
+CONFIG_SENSORS_EEPROM=m
+CONFIG_SENSORS_PCF8574=m
+CONFIG_SENSORS_PCF8591=m
+CONFIG_SENSORS_RTC8564=m
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
 
 #
-# Ftape, the floppy tape device driver
+# Dallas's 1-wire bus
 #
-CONFIG_AGP=y
-CONFIG_AGP_ALI=y
-CONFIG_AGP_ATI=y
-CONFIG_AGP_AMD=y
-CONFIG_AGP_AMD64=y
-CONFIG_AGP_INTEL=y
-CONFIG_AGP_INTEL_MCH=y
-CONFIG_AGP_NVIDIA=y
-CONFIG_AGP_SIS=y
-CONFIG_AGP_SWORKS=y
-CONFIG_AGP_VIA=y
-CONFIG_AGP_EFFICEON=y
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_GAMMA is not set
-CONFIG_DRM_R128=m
-CONFIG_DRM_RADEON=m
-CONFIG_DRM_I810=m
-CONFIG_DRM_I830=m
-CONFIG_DRM_MGA=m
-# CONFIG_DRM_SIS is not set
-CONFIG_DRM_I915=m
-
-
+# CONFIG_W1 is not set
 
 #
-# PCMCIA character devices
+# Misc devices
 #
-# CONFIG_SYNCLINK_CS is not set
-
-
-
-# CONFIG_MWAVE is not set
-CONFIG_RAW_DRIVER=y
-CONFIG_MAX_RAW_DEVS=8192
-CONFIG_HANGCHECK_TIMER=m
+# CONFIG_IBM_ASM is not set
 
 #
 # Multimedia devices
 #
-# CONFIG_VIDEO_DEV is not set
+CONFIG_VIDEO_DEV=m
 
 #
 # Video For Linux
@@ -1562,168 +1459,74 @@ CONFIG_HANGCHECK_TIMER=m
 # Video Adapters
 #
 # CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_PMS is not set
 # CONFIG_VIDEO_BWQCAM is not set
 # CONFIG_VIDEO_CQCAM is not set
 # CONFIG_VIDEO_W9966 is not set
 # CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA_PP is not set
-# CONFIG_VIDEO_CPIA_USB is not set
+# CONFIG_VIDEO_SAA5246A is not set
 # CONFIG_VIDEO_SAA5249 is not set
 # CONFIG_TUNER_3036 is not set
 # CONFIG_VIDEO_STRADIS is not set
 # CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_ZORAN_BUZ is not set
-# CONFIG_VIDEO_ZORAN_DC10 is not set
-# CONFIG_VIDEO_ZORAN_DC30 is not set
-# CONFIG_VIDEO_ZORAN_LML33 is not set
-# CONFIG_VIDEO_ZORAN_LML33R10 is not set
-# CONFIG_VIDEO_MEYE is not set
 # CONFIG_VIDEO_SAA7134 is not set
 # CONFIG_VIDEO_MXB is not set
 # CONFIG_VIDEO_DPC is not set
 # CONFIG_VIDEO_HEXIUM_ORION is not set
 # CONFIG_VIDEO_HEXIUM_GEMINI is not set
 # CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_SAA5246A is not set
 CONFIG_VIDEO_OVCAMCHIP=m
 
-
 #
 # Radio Adapters
 #
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
 # CONFIG_RADIO_GEMTEK_PCI is not set
 # CONFIG_RADIO_MAXIRADIO is not set
 # CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MIROPCM20 is not set
-# CONFIG_RADIO_MIROPCM20_RDS is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_TYPHOON_PROC_FS=y
-# CONFIG_RADIO_ZOLTRIX is not set
-
 
 #
 # Digital Video Broadcasting Devices
 #
 # CONFIG_DVB is not set
-CONFIG_DVB_CORE=m
-
-#
-# Supported Frontend Modules
-#
-CONFIG_DVB_STV0299=m
-# CONFIG_DVB_SP887X is not set
-# CONFIG_DVB_ALPS_TDLB7 is not set
-CONFIG_DVB_ALPS_TDMB7=m
-CONFIG_DVB_ATMEL_AT76C651=m
-CONFIG_DVB_CX24110=m
-CONFIG_DVB_GRUNDIG_29504_491=m
-CONFIG_DVB_GRUNDIG_29504_401=m
-CONFIG_DVB_MT312=m
-CONFIG_DVB_VES1820=m
-CONFIG_DVB_VES1X93=m
-CONFIG_DVB_TWINHAN_DST=m
-CONFIG_DVB_TTUSB_DEC=m
-CONFIG_DVB_BT8XX=m
-# CONFIG_DVB_TDA1004X is not set
-CONFIG_DVB_NXT6000=m
-
-#
-# Supported SAA7146 based PCI Adapters
-#
-CONFIG_DVB_AV7110=m
-CONFIG_DVB_AV7110_OSD=y
-# CONFIG_DVB_AV7110_FIRMWARE is not set
-CONFIG_DVB_BUDGET=m
-CONFIG_DVB_BUDGET_CI=m
-CONFIG_DVB_BUDGET_AV=m
-CONFIG_DVB_BUDGET_PATCH=m
-
-#
-# Supported USB Adapters
-#
-CONFIG_DVB_TTUSB_BUDGET=m
-
-#
-# Supported FlexCopII (B2C2) Adapters
-#
-CONFIG_DVB_B2C2_SKYSTAR=m
-CONFIG_VIDEO_SAA7146=m
-CONFIG_VIDEO_SAA7146_VV=m
-CONFIG_VIDEO_VIDEOBUF=m
-CONFIG_VIDEO_TUNER=m
-CONFIG_VIDEO_BUF=m
-CONFIG_VIDEO_BTCX=m
 
 #
 # Graphics support
 #
 CONFIG_FB=y
+CONFIG_FB_MODE_HELPERS=y
+CONFIG_FB_CIRRUS=m
+# CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 CONFIG_FB_VGA16=m
 CONFIG_FB_VESA=y
 CONFIG_VIDEO_SELECT=y
 # CONFIG_FB_HGA is not set
 CONFIG_FB_RIVA=m
-# CONFIG_FB_RIVA_DEBUG is not set
 # CONFIG_FB_RIVA_I2C is not set
-CONFIG_FB_I810=m
-CONFIG_FB_I810_GTF=y
+# CONFIG_FB_RIVA_DEBUG is not set
 # CONFIG_FB_MATROX is not set
-CONFIG_FB_MATROX_MILLENIUM=y
-CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_FB_MATROX_G450=y
-CONFIG_FB_MATROX_G100=y
-CONFIG_FB_MATROX_I2C=m
-CONFIG_FB_MATROX_MAVEN=m
-CONFIG_FB_MATROX_MULTIHEAD=y
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_RADEON_DEBUG is not set
 # CONFIG_FB_RADEON_OLD is not set
-CONFIG_FB_RADEON_I2C=y
+# CONFIG_FB_RADEON is not set
 # CONFIG_FB_ATY128 is not set
 # CONFIG_FB_ATY is not set
-CONFIG_FB_ATY_CT=y
-CONFIG_FB_ATY_GX=y
-# CONFIG_FB_ATY_XL_INIT is not set
 # CONFIG_FB_SIS is not set
-CONFIG_FB_SIS_300=y
-CONFIG_FB_SIS_315=y
-# CONFIG_FB_NEOMAGIC is not set
 # CONFIG_FB_NEOMAGIC is not set
+CONFIG_FB_KYRO=m
 # CONFIG_FB_3DFX is not set
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_TRIDENT is not set
 # CONFIG_FB_VIRTUAL is not set
-CONFIG_FB_KYRO=m
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_PM2_FIFO_DISCONNECT is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_HGA_ACCEL is not set
-# CONFIG_FB_3DFX_ACCEL is not set
-# CONFIG_FB_TRIDENT_ACCEL is not set
-CONFIG_FB_CIRRUS=m
 
 #
 # Console display driver support
 #
 CONFIG_VGA_CONSOLE=y
-# CONFIG_MDA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 # CONFIG_FONTS is not set
-
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
 
 #
 # Logo configuration
@@ -1742,20 +1545,27 @@ CONFIG_SOUND=m
 # Advanced Linux Sound Architecture
 #
 CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_HWDEP=m
+CONFIG_SND_RAWMIDI=m
 CONFIG_SND_SEQUENCER=m
 CONFIG_SND_SEQ_DUMMY=m
 CONFIG_SND_OSSEMUL=y
 CONFIG_SND_MIXER_OSS=m
 CONFIG_SND_PCM_OSS=m
 CONFIG_SND_SEQUENCER_OSS=y
+CONFIG_SND_BIT32_EMUL=m
 CONFIG_SND_RTCTIMER=m
 # CONFIG_SND_VERBOSE_PRINTK is not set
 # CONFIG_SND_DEBUG is not set
-CONFIG_SND_BIT32_EMUL=y
 
 #
 # Generic devices
 #
+CONFIG_SND_MPU401_UART=m
+CONFIG_SND_OPL3_LIB=m
+CONFIG_SND_VX_LIB=m
 CONFIG_SND_DUMMY=m
 CONFIG_SND_VIRMIDI=m
 CONFIG_SND_MTPAV=m
@@ -1763,47 +1573,23 @@ CONFIG_SND_MTPAV=m
 CONFIG_SND_MPU401=m
 
 #
-# ISA devices
-#
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SB16_CSP=y
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-
-#
 # PCI devices
 #
+CONFIG_SND_AC97_CODEC=m
 CONFIG_SND_ALI5451=m
+CONFIG_SND_ATIIXP=m
+CONFIG_SND_ATIIXP_MODEM=m
+CONFIG_SND_AU8810=m
+CONFIG_SND_AU8820=m
+CONFIG_SND_AU8830=m
 CONFIG_SND_AZT3328=m
+CONFIG_SND_BT87X=m
 CONFIG_SND_CS46XX=m
 CONFIG_SND_CS46XX_NEW_DSP=y
 CONFIG_SND_CS4281=m
 CONFIG_SND_EMU10K1=m
 CONFIG_SND_KORG1212=m
+CONFIG_SND_MIXART=m
 CONFIG_SND_NM256=m
 CONFIG_SND_RME32=m
 CONFIG_SND_RME96=m
@@ -1819,23 +1605,14 @@ CONFIG_SND_ES1938=m
 CONFIG_SND_ES1968=m
 CONFIG_SND_MAESTRO3=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_ICE1712=m
 CONFIG_SND_ICE1724=m
 CONFIG_SND_INTEL8X0=m
+CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
-CONFIG_SND_BT87X=m
-CONFIG_SND_ATIIXP=m
-CONFIG_SND_ATIIXP_MODEM=m
-CONFIG_SND_AU8810=m
-CONFIG_SND_AU8820=m
-CONFIG_SND_AU8830=m
-CONFIG_SND_MIXART=m
-CONFIG_SND_FM801_TEA575X=m
-CONFIG_SND_INTEL8X0M=m
-CONFIG_SND_PDAUDIOCF=m
-
 
 #
 # ALSA USB devices
@@ -1846,15 +1623,11 @@ CONFIG_SND_USB_USX2Y=m
 #
 # PCMCIA devices
 #
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_VXP440 is not set
 
 #
 # Open Sound System
 #
 # CONFIG_SOUND_PRIME is not set
-# CONFIG_SOUND_BT878 is not set
-# CONFIG_SOUND_CMPCI is not set
 
 #
 # USB support
@@ -1869,6 +1642,7 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 CONFIG_USB_SUSPEND=y
+# CONFIG_USB_OTG is not set
 
 #
 # USB Host Controller Drivers
@@ -1890,9 +1664,9 @@ CONFIG_USB_UHCI_HCD=m
 CONFIG_USB_MIDI=m
 CONFIG_USB_ACM=m
 CONFIG_USB_PRINTER=m
-# CONFIG_BLK_DEV_UB is not set
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_RW_DETECT=y
 CONFIG_USB_STORAGE_DATAFAB=y
 CONFIG_USB_STORAGE_FREECOM=y
 CONFIG_USB_STORAGE_ISD200=y
@@ -1901,7 +1675,6 @@ CONFIG_USB_STORAGE_HP8200e=y
 CONFIG_USB_STORAGE_SDDR09=y
 CONFIG_USB_STORAGE_SDDR55=y
 CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_USB_STORAGE_RW_DETECT=y
 
 #
 # USB Human Interface Devices (HID)
@@ -1912,18 +1685,15 @@ CONFIG_HID_FF=y
 CONFIG_HID_PID=y
 CONFIG_LOGITECH_FF=y
 CONFIG_THRUSTMASTER_FF=y
-CONFIG_USB_HIDDEV=y
-
-#
-# USB HID Boot Protocol drivers
-#
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_MOUSE is not set
+CONFIG_USB_HIDDEV=y
 CONFIG_USB_AIPTEK=m
 CONFIG_USB_WACOM=m
 CONFIG_USB_KBTAB=m
 CONFIG_USB_POWERMATE=m
+CONFIG_USB_MTOUCH=m
+CONFIG_USB_EGALAX=m
 CONFIG_USB_XPAD=m
+CONFIG_USB_ATI_REMOTE=m
 
 #
 # USB Imaging devices
@@ -1942,8 +1712,10 @@ CONFIG_USB_IBMCAM=m
 CONFIG_USB_KONICAWC=m
 CONFIG_USB_OV511=m
 CONFIG_USB_SE401=m
-CONFIG_USB_STV680=m
 CONFIG_USB_SN9C102=m
+CONFIG_USB_STV680=m
+CONFIG_USB_W9968CF=m
+CONFIG_USB_PWC=m
 
 #
 # USB Network adaptors
@@ -1953,11 +1725,11 @@ CONFIG_USB_KAWETH=m
 CONFIG_USB_PEGASUS=m
 CONFIG_USB_RTL8150=m
 CONFIG_USB_USBNET=m
-CONFIG_USB_SPEEDTOUCH=m
 
 #
 # USB Host-to-Host Cables
 #
+CONFIG_USB_ALI_M5632=y
 CONFIG_USB_AN2720=y
 CONFIG_USB_BELKIN=y
 CONFIG_USB_GENESYS=y
@@ -2019,40 +1791,38 @@ CONFIG_USB_SERIAL_SAFE_PADDED=y
 CONFIG_USB_SERIAL_CYBERJACK=m
 CONFIG_USB_SERIAL_XIRCOM=m
 CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_SERIAL_WHITEHEAT=m
 CONFIG_USB_EZUSB=y
-CONFIG_USB_EMI62=m
-CONFIG_USB_LED=m
-CONFIG_USB_G_SERIAL=m
-
 
 #
 # USB Miscellaneous drivers
 #
+CONFIG_USB_EMI62=m
 # CONFIG_USB_EMI26 is not set
 # CONFIG_USB_TIGL is not set
 CONFIG_USB_AUERSWALD=m
 CONFIG_USB_RIO500=m
-CONFIG_USB_LCD=m
-CONFIG_USB_TEST=m
-# CONFIG_USB_GADGET is not set
-# CONFIG_USB_GADGET_PXA2XX is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_SA1100 is not set
-CONFIG_USB_ZERO=m
-CONFIG_USB_ETH=m
-CONFIG_USB_GADGETFS=m
-CONFIG_USB_W9968CF=m
-CONFIG_USB_PWC=m
 CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_FILE_STORAGE=m
-# CONFIG_USB_FILE_STORAGE_TEST is not set
-CONFIG_USB_MTOUCH=m
-CONFIG_USB_ATI_REMOTE=m
-CONFIG_USB_ALI_M5632=y
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
 # CONFIG_USB_CYTHERM is not set
-CONFIG_USB_EGALAX=m
 CONFIG_USB_PHIDGETSERVO=m
+CONFIG_USB_TEST=m
+
+#
+# USB ATM/DSL drivers
+#
+CONFIG_USB_ATM=m
+CONFIG_USB_SPEEDTOUCH=m
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# Firmware Drivers
+#
+CONFIG_EDD=m
 
 #
 # File systems
@@ -2069,20 +1839,9 @@ CONFIG_JBD=m
 # CONFIG_JBD_DEBUG is not set
 CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_CHECK is not set
-CONFIG_REISERFS_PROC_INFO=y
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
 # CONFIG_JFS_FS is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_STATISTICS is not set
-CONFIG_JFS_POSIX_ACL=y
+CONFIG_FS_POSIX_ACL=y
 # CONFIG_XFS_FS is not set
-# CONFIG_XFS_RT is not set
-CONFIG_XFS_QUOTA=y
-CONFIG_XFS_POSIX_ACL=y
-CONFIG_XFS_SECURITY=y
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
 CONFIG_QUOTA=y
@@ -2100,6 +1859,7 @@ CONFIG_JOLIET=y
 CONFIG_ZISOFS=y
 CONFIG_ZISOFS_FS=y
 CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
 
 #
 # DOS/FAT/NT Filesystems
@@ -2116,6 +1876,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
 # CONFIG_DEVFS_FS is not set
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
@@ -2129,27 +1890,27 @@ CONFIG_RAMFS=y
 #
 # Miscellaneous filesystems
 #
-# CONFIG_ADFS_FS is not seta
+# CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
-# uses sleepon and needs a major update
 CONFIG_HFS_FS=m
 CONFIG_HFSPLUS_FS=m
 # CONFIG_BEFS_FS is not set
-# CONFIG_BEFS_DEBUG is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
 CONFIG_JFFS2_FS=m
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_NAND=y
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
 CONFIG_CRAMFS=m
 CONFIG_VXFS_FS=m
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
-# CONFIG_QNX4FS_RW is not set
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is not set
-# CONFIG_UFS_FS_WRITE is not set
 
 #
 # Network File Systems
@@ -2176,17 +1937,8 @@ CONFIG_CIFS=m
 CONFIG_CIFS_XATTR=y
 CONFIG_CIFS_POSIX=y
 # CONFIG_NCP_FS is not set
-CONFIG_NCPFS_PACKET_SIGNING=y
-CONFIG_NCPFS_IOCTL_LOCKING=y
-CONFIG_NCPFS_STRONG=y
-CONFIG_NCPFS_NFS_NS=y
-CONFIG_NCPFS_OS2_NS=y
-CONFIG_NCPFS_SMALLDOS=y
-CONFIG_NCPFS_NLS=y
-CONFIG_NCPFS_EXTRAS=y
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
-# CONFIG_RXRPC is not set
 
 #
 # Partition Types
@@ -2207,11 +1959,11 @@ CONFIG_SGI_PARTITION=y
 # CONFIG_ULTRIX_PARTITION is not set
 CONFIG_SUN_PARTITION=y
 CONFIG_EFI_PARTITION=y
-CONFIG_NLS=y
 
 #
 # Native Language Support
 #
+CONFIG_NLS=y
 CONFIG_NLS_DEFAULT="utf8"
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_CODEPAGE_737=m
@@ -2236,6 +1988,7 @@ CONFIG_NLS_CODEPAGE_874=m
 CONFIG_NLS_ISO8859_8=m
 CONFIG_NLS_CODEPAGE_1250=m
 CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=m
 CONFIG_NLS_ISO8859_2=m
 CONFIG_NLS_ISO8859_3=m
@@ -2250,7 +2003,6 @@ CONFIG_NLS_ISO8859_15=m
 CONFIG_NLS_KOI8_R=m
 CONFIG_NLS_KOI8_U=m
 CONFIG_NLS_UTF8=m
-CONFIG_NLS_ASCII=y
 
 #
 # Profiling support
@@ -2259,27 +2011,17 @@ CONFIG_PROFILING=y
 CONFIG_OPROFILE=m
 
 #
-# Tux
-#
-CONFIG_TUX=m
-CONFIG_TUX_EXTCGI=y
-# CONFIG_TUX_EXTENDED_LOG is not set
-# CONFIG_TUX_DEBUG is not set
-
-
-#
 # Kernel hacking
 #
 CONFIG_DEBUG_KERNEL=y
-# CONFIG_DEBUG_SLAB is not set
 CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_SLAB is not set
 CONFIG_DEBUG_SPINLOCK=y
-CONFIG_DEBUG_HIGHMEM=y
-# CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_SPINLOCK_SLEEP=y
-# CONFIG_FRAME_POINTER is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_INFO is not set
+CONFIG_INIT_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_IOMMU_DEBUG is not set
 
 #
 # Security options
@@ -2290,13 +2032,11 @@ CONFIG_SECURITY_CAPABILITIES=y
 # CONFIG_SECURITY_ROOTPLUG is not set
 CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
+CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
 CONFIG_SECURITY_SELINUX_DISABLE=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 CONFIG_SECURITY_SELINUX_AVC_STATS=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
-CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
 
 #
 # Cryptographic options
@@ -2309,6 +2049,7 @@ CONFIG_CRYPTO_MD5=m
 CONFIG_CRYPTO_SHA1=y
 CONFIG_CRYPTO_SHA256=m
 CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
 CONFIG_CRYPTO_DES=m
 CONFIG_CRYPTO_BLOWFISH=m
 CONFIG_CRYPTO_TWOFISH=m
@@ -2316,317 +2057,22 @@ CONFIG_CRYPTO_SERPENT=m
 CONFIG_CRYPTO_AES=m
 CONFIG_CRYPTO_CAST5=m
 CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_TEA=m
 CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_DEFLATE=m
 CONFIG_CRYPTO_MICHAEL_MIC=m
-# CONFIG_CRYPTO_TEST is not set
-CONFIG_LIBCRC32C=m
 CONFIG_CRYPTO_CRC32C=m
+# CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_SIGNATURE=y
 CONFIG_CRYPTO_SIGNATURE_DSA=y
 CONFIG_CRYPTO_MPILIB=y
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_WP512=m
 
 #
 # Library routines
 #
-CONFIG_CRC32=m
 CONFIG_CRC_CCITT=m
-
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=m
-CONFIG_PC=y
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_ATALK is not set
-# CONFIG_DEV_APPLETALK is not set
-# CONFIG_LTPC is not set
-# CONFIG_COPS is not set
-# CONFIG_IPX is not set
-# CONFIG_IPDDP is not set
-# CONFIG_IRDA is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_ISAPNP is not set
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_EL1 is not set
-# CONFIG_EL2 is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_WD80x3 is not set
-# CONFIG_IRDA is not set
-# CONFIG_GAMEPORT is not set
-# CONFIG_DVB is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SB16_CSP=y
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_BINFMT_AOUT is not set
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_GAMMA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_MWAVE is not set
-# CONFIG_ROCKETPORT is not set
-# CONFIG_R3964 is not set
-# CONFIG_TIPAR is not set
-# CONFIG_JOYSTICK_ANALOG is not set
-# CONFIG_JOYSTICK_A3D is not set
-# CONFIG_JOYSTICK_ADI is not set
-# CONFIG_JOYSTICK_COBRA is not set
-# CONFIG_JOYSTICK_GF2K is not set
-# CONFIG_JOYSTICK_GRIP is not set
-# CONFIG_JOYSTICK_GRIP_MP is not set
-# CONFIG_JOYSTICK_GUILLEMOT is not set
-# CONFIG_JOYSTICK_INTERACT is not set
-# CONFIG_JOYSTICK_SIDEWINDER is not set
-# CONFIG_JOYSTICK_TMDC is not set
-# CONFIG_JOYSTICK_IFORCE is not set
-# CONFIG_JOYSTICK_IFORCE_USB=y
-# CONFIG_JOYSTICK_IFORCE_232=y
-# CONFIG_JOYSTICK_WARRIOR is not set
-# CONFIG_JOYSTICK_MAGELLAN is not set
-# CONFIG_JOYSTICK_SPACEORB is not set
-# CONFIG_JOYSTICK_SPACEBALL is not set
-# CONFIG_JOYSTICK_STINGER is not set
-# CONFIG_JOYSTICK_TWIDDLER is not set
-# CONFIG_JOYSTICK_DB9 is not set
-# CONFIG_JOYSTICK_GAMECON is not set
-# CONFIG_JOYSTICK_TURBOGRAFX is not set
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MIROPCM20 is not set
-# CONFIG_RADIO_MIROPCM20_RDS is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_TYPHOON_PROC_FS=y
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_PLIP is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_AHA1542 is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_QLOGIC_ISP is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_BWQCAM is not set
-# CONFIG_VIDEO_CQCAM is not set
-# CONFIG_VIDEO_W9966 is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA_PP is not set
-# CONFIG_VIDEO_CPIA_USB is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_ZORAN_BUZ is not set
-# CONFIG_VIDEO_ZORAN_DC10 is not set
-# CONFIG_VIDEO_ZORAN_DC30 is not set
-# CONFIG_VIDEO_ZORAN_LML33 is not set
-# CONFIG_VIDEO_ZORAN_LML33R10 is not set
-# CONFIG_VIDEO_MEYE is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_I82092 is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_ULTRA is not set
-# CONFIG_SKFP is not set
-# CONFIG_DE600 is not set
-# CONFIG_DE620 is not set
-# CONFIG_CS89x0 is not set
-# CONFIG_DGRS is not set
-# CONFIG_AC3200 is not set
-# CONFIG_NI52 is not set
-# CONFIG_NI65 is not set
-# CONFIG_LANCE is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_EL16 is not set
-# CONFIG_EL3 is not set
-# CONFIG_3C515 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_HP100 is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_NET_SB1000 is not set
-# CONFIG_DEPCA is not set
-# CONFIG_ATP is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_INFTL is not set
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-# CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-# CONFIG_MTD_PCI is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_HGA_ACCEL is not set
-# CONFIG_FB_3DFX_ACCEL is not set
-# CONFIG_FB_TRIDENT_ACCEL is not set
-# CONFIG_SCSI_DC390T is not set
-CONFIG_AUDIT=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_I2C_PCA_ISA is not set
-CONFIG_RAW_DRIVER=y
-# CONFIG_MTD_SCB2_FLASH is not set
-CONFIG_UID16=y
-# CONFIG_MK8 is not set
-# CONFIG_MPSC is not set
-CONFIG_GENERIC_CPU=y
-CONFIG_X86_MSR=y
-CONFIG_X86_CPUID=y
-CONFIG_MTRR=y
-CONFIG_NUMA=y
-CONFIG_K8_NUMA=y
-CONFIG_NR_CPUS=8
-CONFIG_GART_IOMMU=y
-CONFIG_X86_POWERNOW_K8=y
-CONFIG_IA32_EMULATION=y
-# CONFIG_IA32_AOUT is not set
-CONFIG_INIT_DEBUG=y
-# CONFIG_IOMMU_DEBUG is not set
-# CONFIG_CHECKING is not set
-CONFIG_MICROCODE=m 
-CONFIG_SWIOTLB=y
-CONFIG_X86_PM_TIMER=y
-CONFIG_I2O=m
-CONFIG_I2O_BLOCK=m
-CONFIG_I2O_SCSI=m
-CONFIG_I2O_PROC=m
-CONFIG_I2O_CONFIG=y
-CONFIG_TUX=m
-# CONFIG_UNORDERED_IO is not set
-# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
-CONFIG_X86_ACPI_CPUFREQ=y
-# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_SCHED_SMT=y
-# CONFIG_SOFTWARE_SUSPEND is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_CPU_FREQ=y
-# CONFIG_CPU_FREQ_PROC_INTF is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=m
-CONFIG_CPU_FREQ_GOV_USERSPACE=m
-CONFIG_CPU_FREQ_GOV_ONDEMAND=m
-# CONFIG_CPU_FREQ_24_API is not set
-CONFIG_CPU_FREQ_TABLE=y
-CONFIG_ACPI=y
-CONFIG_ACPI_BOOT=y
-CONFIG_ACPI_INTERPRETER=y
-CONFIG_ACPI_SLEEP=y
-CONFIG_ACPI_AC=m
-CONFIG_ACPI_BATTERY=m
-CONFIG_ACPI_BUTTON=m
-CONFIG_ACPI_FAN=y
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_THERMAL=y
-CONFIG_ACPI_ASUS=m
-CONFIG_ACPI_TOSHIBA=m
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_BUS=y
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_PCI=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_ACPI_NUMA=y
-CONFIG_ACPI_BLACKLIST_YEAR=2001
-# CONFIG_SCHEDSTATS is not set
-CONFIG_EDD=m
-CONFIG_PCI_BIOS=y
-CONFIG_PCI_MMCONFIG=y
-CONFIG_KEXEC=y
-CONFIG_NETDUMP=m
-CONFIG_CRASH=m
-CONFIG_HOTPLUG_PCI=y
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-CONFIG_HOTPLUG_PCI_COMPAQ=m
-# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
-CONFIG_HOTPLUG_PCI_IBM=m
-CONFIG_HOTPLUG_PCI_ACPI=m 
-CONFIG_HOTPLUG_PCI_ACPI_IBM=m
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-CONFIG_HOTPLUG_PCI_PCIE=m
-# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set
-CONFIG_HOTPLUG_PCI_SHPC=m
-# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set
-# CONFIG_HOTPLUG_PCI_SHPC_PHPRM_LEGACY is not set
-# CONFIG_HPET is not set
-CONFIG_PM=y
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT=m
-CONFIG_IEEE80211_WPA=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-CONFIG_IPW2100=m
-# CONFIG_IPW_DEBUG is not set
-CONFIG_IPW2100_PROMISC=y
-# CONFIG_IPW2100_LEGACY_FW_LOAD is not set
-CONFIG_IPW2200=m
index 2c33da7..68b5200 100644 (file)
@@ -1,28 +1,40 @@
 #
 # Automatically generated make config: don't edit
+# Linux kernel version: 2.6.9-prep
+# Tue Aug  2 15:46:19 2005
 #
+CONFIG_X86_64=y
+CONFIG_64BIT=y
+CONFIG_X86=y
 CONFIG_MMU=y
-# CONFIG_SMP is not set
-# CONFIG_HOTPLUG_CPU is not set
-CONFIG_LOCALVERSION=""
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_X86_CMPXCHG=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_HPET_TIMER=y
+CONFIG_HPET_EMULATE_RTC=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_IOMAP=y
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
 CONFIG_CLEAN_COMPILE=y
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
 
 #
 # General setup
 #
+CONFIG_LOCALVERSION=""
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 CONFIG_SYSCTL=y
+CONFIG_AUDIT=y
+CONFIG_AUDITSYSCALL=y
 CONFIG_LOG_BUF_SHIFT=17
+CONFIG_HOTPLUG=y
 # CONFIG_IKCONFIG is not set
 # CONFIG_EMBEDDED is not set
 CONFIG_KALLSYMS=y
@@ -33,9 +45,10 @@ CONFIG_EPOLL=y
 CONFIG_IOSCHED_NOOP=y
 CONFIG_IOSCHED_AS=y
 CONFIG_IOSCHED_DEADLINE=y
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_VOLUNTARY=y
-CONFIG_POSIX_MQUEUE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SHMEM=y
+# CONFIG_TINY_SHMEM is not set
 
 #
 # Loadable module support
@@ -45,42 +58,140 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_UNLOAD is not set
 CONFIG_OBSOLETE_MODPARM=y
 CONFIG_MODVERSIONS=y
-CONFIG_KMOD=y
 CONFIG_MODULE_SIG=y
 # CONFIG_MODULE_SIG_FORCE is not set
+CONFIG_KMOD=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Processor type and features
+#
+# CONFIG_MK8 is not set
+# CONFIG_MPSC is not set
+CONFIG_GENERIC_CPU=y
+CONFIG_X86_L1_CACHE_BYTES=128
+CONFIG_X86_L1_CACHE_SHIFT=7
+CONFIG_X86_TSC=y
+CONFIG_X86_GOOD_APIC=y
+CONFIG_MICROCODE=m
+CONFIG_X86_MSR=y
+CONFIG_X86_CPUID=y
+CONFIG_X86_HT=y
+CONFIG_X86_IO_APIC=y
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_MTRR=y
+CONFIG_SMP=y
+# CONFIG_PREEMPT is not set
+CONFIG_SCHED_SMT=y
+CONFIG_K8_NUMA=y
+CONFIG_DISCONTIGMEM=y
+CONFIG_NUMA=y
+CONFIG_HAVE_DEC_LOCK=y
+CONFIG_NR_CPUS=8
+CONFIG_GART_IOMMU=y
+CONFIG_SWIOTLB=y
+CONFIG_X86_MCE=y
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_SOFTWARE_SUSPEND is not set
+
+#
+# ACPI (Advanced Configuration and Power Interface) Support
+#
+CONFIG_ACPI=y
+CONFIG_ACPI_BOOT=y
+CONFIG_ACPI_INTERPRETER=y
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_SLEEP_PROC_FS=y
+CONFIG_ACPI_AC=m
+CONFIG_ACPI_BATTERY=m
+CONFIG_ACPI_BUTTON=m
+CONFIG_ACPI_FAN=y
+CONFIG_ACPI_PROCESSOR=y
+CONFIG_ACPI_THERMAL=y
+CONFIG_ACPI_ASUS=m
+CONFIG_ACPI_TOSHIBA=m
+CONFIG_ACPI_BLACKLIST_YEAR=2001
+# CONFIG_ACPI_DEBUG is not set
+CONFIG_ACPI_BUS=y
+CONFIG_ACPI_EC=y
+CONFIG_ACPI_POWER=y
+CONFIG_ACPI_PCI=y
+CONFIG_ACPI_SYSTEM=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+# CONFIG_CPU_FREQ_PROC_INTF is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+# CONFIG_CPU_FREQ_24_API is not set
+CONFIG_CPU_FREQ_TABLE=y
+
+#
+# CPUFreq processor drivers
+#
+CONFIG_X86_POWERNOW_K8=y
+CONFIG_X86_POWERNOW_K8_ACPI=y
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+CONFIG_X86_ACPI_CPUFREQ=y
+# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
 
 #
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+# Bus options (PCI etc.)
 #
 CONFIG_PCI=y
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_MMCONFIG=y
+# CONFIG_UNORDERED_IO is not set
 CONFIG_PCI_MSI=y
 CONFIG_PCI_LEGACY_PROC=y
 # CONFIG_PCI_NAMES is not set
-CONFIG_ISA=y
-# CONFIG_EISA is not set
-# CONFIG_MCA is not set
-# CONFIG_SCx200 is not set
-CONFIG_HOTPLUG=y
 
 #
 # PCMCIA/CardBus support
 #
 CONFIG_PCMCIA=m
 # CONFIG_PCMCIA_DEBUG is not set
-CONFIG_YENTA=y
+CONFIG_YENTA=m
 CONFIG_CARDBUS=y
-# CONFIG_I82092 is not set
-CONFIG_I82365=m
 CONFIG_PD6729=m
+# CONFIG_I82092 is not set
 CONFIG_TCIC=m
-CONFIG_PCMCIA_PROBE=y
 
 #
-# Executable file formats
+# PCI Hotplug Support
+#
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HOTPLUG_PCI_FAKE is not set
+CONFIG_HOTPLUG_PCI_ACPI=m
+CONFIG_HOTPLUG_PCI_ACPI_IBM=m
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+CONFIG_HOTPLUG_PCI_PCIE=m
+# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set
+CONFIG_HOTPLUG_PCI_SHPC=m
+# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set
+
+#
+# Executable file formats / Emulations
 #
 CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_AOUT is not set
 CONFIG_BINFMT_MISC=y
+CONFIG_IA32_EMULATION=y
+# CONFIG_IA32_AOUT is not set
+CONFIG_COMPAT=y
+CONFIG_SYSVIPC_COMPAT=y
+CONFIG_UID16=y
+CONFIG_KEXEC=y
 
 #
 # Device Drivers
@@ -89,18 +200,23 @@ CONFIG_BINFMT_MISC=y
 #
 # Generic Driver Options
 #
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
 
 #
 # Memory Technology Devices (MTD)
 #
 CONFIG_MTD=m
 # CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_PARTITIONS=m
+CONFIG_MTD_PARTITIONS=y
 CONFIG_MTD_CONCAT=m
 CONFIG_MTD_REDBOOT_PARTS=m
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
 CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_PARTITIONS=y
+
 #
 # User Modules And Translation Layers
 #
@@ -119,13 +235,24 @@ CONFIG_MTD_CFI=m
 CONFIG_MTD_JEDECPROBE=m
 CONFIG_MTD_GEN_PROBE=m
 # CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
 CONFIG_MTD_CFI_INTELEXT=m
 CONFIG_MTD_CFI_AMDSTD=m
+CONFIG_MTD_CFI_AMDSTD_RETRY=3
 CONFIG_MTD_CFI_STAA=m
+CONFIG_MTD_CFI_UTIL=m
 CONFIG_MTD_RAM=m
 CONFIG_MTD_ROM=m
 CONFIG_MTD_ABSENT=m
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
 
 #
 # Mapping drivers for chip access
@@ -135,23 +262,19 @@ CONFIG_MTD_ABSENT=m
 # CONFIG_MTD_PNC2000 is not set
 CONFIG_MTD_SC520CDP=m
 CONFIG_MTD_NETSC520=m
-CONFIG_MTD_SBC_GXX=m
-CONFIG_MTD_ELAN_104NC=m
 CONFIG_MTD_SCx200_DOCFLASH=m
 # CONFIG_MTD_AMD76XROM is not set
 # CONFIG_MTD_SCB2_FLASH is not set
 # CONFIG_MTD_NETtel is not set
 # CONFIG_MTD_DILNETPC is not set
 # CONFIG_MTD_L440GX is not set
-# CONFIG_MTD_PCI is not set
 
 #
 # Self-contained MTD device drivers
 #
 # CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_PMC551_BUGFIX is not set
-# CONFIG_MTD_PMC551_DEBUG is not set
 # CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
 CONFIG_MTD_MTDRAM=m
 CONFIG_MTDRAM_TOTAL_SIZE=4096
 CONFIG_MTDRAM_ERASE_SIZE=128
@@ -163,9 +286,6 @@ CONFIG_MTDRAM_ERASE_SIZE=128
 # CONFIG_MTD_DOC2000 is not set
 # CONFIG_MTD_DOC2001 is not set
 # CONFIG_MTD_DOC2001PLUS is not set
-CONFIG_MTD_DOCPROBE=m
-# CONFIG_MTD_DOCPROBE_ADVANCED is not set
-CONFIG_MTD_DOCPROBE_ADDRESS=0
 
 #
 # NAND Flash Device Drivers
@@ -173,15 +293,7 @@ CONFIG_MTD_DOCPROBE_ADDRESS=0
 CONFIG_MTD_NAND=m
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 CONFIG_MTD_NAND_IDS=m
-
-# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
-# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
-CONFIG_MTD_CFI_AMDSTD_RETRY=3
-# CONFIG_MTD_ICHXROM is not set
-# CONFIG_MTD_PHRAM is not set
 # CONFIG_MTD_NAND_DISKONCHIP is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-
 
 #
 # Parallel port support
@@ -199,20 +311,11 @@ CONFIG_PARPORT_1284=y
 #
 # Plug and Play support
 #
-CONFIG_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-# CONFIG_ISAPNP is not set
-# CONFIG_PNPBIOS is not set
 
 #
 # Block devices
 #
 CONFIG_BLK_DEV_FD=m
-# CONFIG_BLK_DEV_XD is not set
 # CONFIG_PARIDE is not set
 CONFIG_BLK_CPQ_DA=m
 CONFIG_BLK_CPQ_CISS_DA=m
@@ -222,46 +325,41 @@ CONFIG_BLK_DEV_DAC960=m
 CONFIG_BLK_DEV_LOOP=m
 CONFIG_BLK_DEV_CRYPTOLOOP=m
 CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_SX8=m
+# CONFIG_BLK_DEV_UB is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=16384
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_BLK_DEV_ATIIXP=y
-CONFIG_BLK_DEV_DELKIN=y
-CONFIG_BLK_DEV_IT8212=y
 CONFIG_LBD=y
-# CONFIG_DCSSBLK is not set
-
+CONFIG_DISKDUMP=m
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
-CONFIG_IDE_GENERIC=y
-# CONFIG_HPT34X_AUTODMA is not set
-
 CONFIG_BLK_DEV_IDE=y
 
 #
 # Please see Documentation/ide.txt for help/info on IDE drives
 #
+# CONFIG_BLK_DEV_IDE_SATA is not set
 # CONFIG_BLK_DEV_HD_IDE is not set
 CONFIG_BLK_DEV_IDEDISK=y
 CONFIG_IDEDISK_MULTI_MODE=y
 CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_DELKIN=m
 CONFIG_BLK_DEV_IDECD=y
 # CONFIG_BLK_DEV_IDETAPE is not set
 CONFIG_BLK_DEV_IDEFLOPPY=y
 CONFIG_BLK_DEV_IDESCSI=m
 # CONFIG_IDE_TASK_IOCTL is not set
 # CONFIG_IDE_TASKFILE_IO is not set
-# CONFIG_BLK_DEV_IDE_SATA is not set
 
 #
 # IDE chipset support/bugfixes
 #
+CONFIG_IDE_GENERIC=y
 # CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
-CONFIG_BLK_DEV_IDEPNP=y
 CONFIG_BLK_DEV_IDEPCI=y
 CONFIG_IDEPCI_SHARE_IRQ=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
@@ -276,15 +374,18 @@ CONFIG_BLK_DEV_AEC62XX=y
 CONFIG_BLK_DEV_ALI15X3=y
 # CONFIG_WDC_ALI15X3 is not set
 CONFIG_BLK_DEV_AMD74XX=y
+CONFIG_BLK_DEV_ATIIXP=y
 CONFIG_BLK_DEV_CMD64X=y
 CONFIG_BLK_DEV_TRIFLEX=y
 CONFIG_BLK_DEV_CY82C693=y
 CONFIG_BLK_DEV_CS5520=y
 CONFIG_BLK_DEV_CS5530=y
 CONFIG_BLK_DEV_HPT34X=y
+# CONFIG_HPT34X_AUTODMA is not set
 CONFIG_BLK_DEV_HPT366=y
 # CONFIG_BLK_DEV_SC1200 is not set
 CONFIG_BLK_DEV_PIIX=y
+CONFIG_BLK_DEV_IT8212=y
 # CONFIG_BLK_DEV_NS87415 is not set
 CONFIG_BLK_DEV_PDC202XX_OLD=y
 # CONFIG_PDC202XX_BURST is not set
@@ -296,7 +397,7 @@ CONFIG_BLK_DEV_SIS5513=y
 CONFIG_BLK_DEV_SLC90E66=y
 # CONFIG_BLK_DEV_TRM290 is not set
 CONFIG_BLK_DEV_VIA82CXXX=y
-# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_IDEDMA_IVB is not set
 CONFIG_IDEDMA_AUTO=y
@@ -312,6 +413,8 @@ CONFIG_SCSI_PROC_FS=y
 # SCSI support type (disk, tape, CD-ROM)
 #
 CONFIG_BLK_DEV_SD=m
+CONFIG_SCSI_DUMP=m
+CONFIG_SD_IOSTATS=y
 CONFIG_CHR_DEV_ST=m
 CONFIG_CHR_DEV_OSST=m
 CONFIG_BLK_DEV_SR=m
@@ -324,24 +427,23 @@ CONFIG_CHR_DEV_SG=m
 # CONFIG_SCSI_MULTI_LUN is not set
 CONFIG_SCSI_CONSTANTS=y
 CONFIG_SCSI_LOGGING=y
-CONFIG_SCSI_SPI_ATTRS=y
-CONFIG_SCSI_FC_ATTRS=y
+
+#
+# SCSI Transport Attributes
+#
+CONFIG_SCSI_SPI_ATTRS=m
+CONFIG_SCSI_FC_ATTRS=m
 
 #
 # SCSI low-level drivers
 #
 CONFIG_BLK_DEV_3W_XXXX_RAID=m
 CONFIG_SCSI_3W_9XXX=m
-# CONFIG_SCSI_7000FASST is not set
 CONFIG_SCSI_ACARD=m
-CONFIG_SCSI_AHA152X=m
-# CONFIG_SCSI_AHA1542 is not set
 CONFIG_SCSI_AACRAID=m
 CONFIG_SCSI_AIC7XXX=m
 CONFIG_AIC7XXX_CMDS_PER_DEVICE=4
 CONFIG_AIC7XXX_RESET_DELAY_MS=15000
-# CONFIG_AIC7XXX_PROBE_EISA_VL is not set
-# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set
 # CONFIG_AIC7XXX_DEBUG_ENABLE is not set
 CONFIG_AIC7XXX_DEBUG_MASK=0
 # CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set
@@ -349,68 +451,47 @@ CONFIG_SCSI_AIC7XXX_OLD=m
 CONFIG_SCSI_AIC79XX=m
 CONFIG_AIC79XX_CMDS_PER_DEVICE=4
 CONFIG_AIC79XX_RESET_DELAY_MS=15000
-# CONFIG_AIC79XX_BUILD_FIRMWARE is not set
 # CONFIG_AIC79XX_ENABLE_RD_STRM is not set
 # CONFIG_AIC79XX_DEBUG_ENABLE is not set
 CONFIG_AIC79XX_DEBUG_MASK=0
 # CONFIG_AIC79XX_REG_PRETTY_PRINT is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_IN2000 is not set
 CONFIG_MEGARAID_NEWGEN=y
 CONFIG_MEGARAID_MM=m
 CONFIG_MEGARAID_MAILBOX=m
 CONFIG_SCSI_SATA=y
+CONFIG_SCSI_SATA_AHCI=m
 CONFIG_SCSI_SATA_SVW=m
 CONFIG_SCSI_ATA_PIIX=m
+CONFIG_SCSI_SATA_NV=m
 CONFIG_SCSI_SATA_PROMISE=m
-CONFIG_SCSI_SATA_VIA=m
-CONFIG_BLK_DEV_SX8=m
-CONFIG_SCSI_SATA_VITESSE=m
+CONFIG_SCSI_SATA_SX4=m
 CONFIG_SCSI_SATA_SIL=m
 CONFIG_SCSI_SATA_SIS=m
-CONFIG_SCSI_SATA_SX4=m
-CONFIG_SCSI_SATA_NV=m
-CONFIG_SCSI_SATA_AHCI=m
-
+CONFIG_SCSI_SATA_VIA=m
+CONFIG_SCSI_SATA_VITESSE=m
 # CONFIG_SCSI_BUSLOGIC is not set
-CONFIG_SCSI_INITIO=m
-# CONFIG_SCSI_OMIT_FLASHPOINT is not set
-# CONFIG_SCSI_CPQFCTS is not set
 # CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DTC3280 is not set
 # CONFIG_SCSI_EATA is not set
 # CONFIG_SCSI_EATA_PIO is not set
+CONFIG_SCSI_LPFC=m
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
 CONFIG_SCSI_GDTH=m
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
 CONFIG_SCSI_IPS=m
+CONFIG_SCSI_INITIO=m
 # CONFIG_SCSI_INIA100 is not set
 CONFIG_SCSI_PPA=m
 CONFIG_SCSI_IMM=m
 # CONFIG_SCSI_IZIP_EPP16 is not set
 # CONFIG_SCSI_IZIP_SLOW_CTR is not set
-# CONFIG_SCSI_NCR53C406A is not set
 CONFIG_SCSI_SYM53C8XX_2=m
 CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_IPR is not set
 # CONFIG_SCSI_QLOGIC_ISP is not set
 # CONFIG_SCSI_QLOGIC_FC is not set
-# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
 CONFIG_SCSI_QLOGIC_1280=m
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_DC390T is not set
 CONFIG_SCSI_QLA2XXX=m
 CONFIG_SCSI_QLA21XX=m
 CONFIG_SCSI_QLA22XX=m
@@ -418,26 +499,17 @@ CONFIG_SCSI_QLA2300=m
 CONFIG_SCSI_QLA2322=m
 CONFIG_SCSI_QLA6312=m
 CONFIG_SCSI_QLA6322=m
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_DPT_I2O is not set
-
-CONFIG_SCSI_LPFC=m
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_DEBUG is not set
 
 #
 # PCMCIA SCSI adapter support
 #
-# CONFIG_PCMCIA_AHA152X is not set
 # CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
 # CONFIG_PCMCIA_QLOGIC is not set
 # CONFIG_PCMCIA_SYM53C500 is not set
 
-
-#
-# Old CD-ROM drivers (not SCSI, not IDE)
-#
-# CONFIG_CD_NO_IDESCSI is not set
-
 #
 # Multi-device support (RAID and LVM)
 #
@@ -446,15 +518,15 @@ CONFIG_BLK_DEV_MD=y
 CONFIG_MD_LINEAR=m
 CONFIG_MD_RAID0=m
 CONFIG_MD_RAID1=m
+CONFIG_MD_RAID10=m
 CONFIG_MD_RAID5=m
 CONFIG_MD_RAID6=m
-CONFIG_MD_RAID10=m
 CONFIG_MD_MULTIPATH=m
 CONFIG_BLK_DEV_DM=m
+CONFIG_DM_CRYPT=m
 CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
-CONFIG_DM_CRYPT=m
 
 #
 # Fusion MPT device support
@@ -465,39 +537,18 @@ CONFIG_FUSION_CTL=m
 CONFIG_FUSION_LAN=m
 
 #
-# IEEE 1394 (FireWire) support (EXPERIMENTAL)
+# IEEE 1394 (FireWire) support
 #
 # CONFIG_IEEE1394 is not set
 
 #
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-CONFIG_IEEE1394_OUI_DB=y
-
-#
-# Device Drivers
-#
-# CONFIG_IEEE1394_PCILYNX is not set
-CONFIG_IEEE1394_OHCI1394=m
-
-#
-# Protocol Drivers
-#
-CONFIG_IEEE1394_VIDEO1394=m
-CONFIG_IEEE1394_SBP2=m
-# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-CONFIG_IEEE1394_DV1394=m
-CONFIG_IEEE1394_RAWIO=m
-CONFIG_IEEE1394_CMP=m
-CONFIG_IEEE1394_AMDTP=m
-# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
-
-#
 # I2O device support
 #
 CONFIG_I2O=m
+CONFIG_I2O_CONFIG=m
+CONFIG_I2O_BLOCK=m
+CONFIG_I2O_SCSI=m
+CONFIG_I2O_PROC=m
 
 #
 # Networking support
@@ -513,7 +564,6 @@ CONFIG_NETLINK_DEV=y
 CONFIG_UNIX=y
 CONFIG_NET_KEY=m
 CONFIG_INET=y
-CONFIG_INET_TUNNEL=m
 CONFIG_IP_MULTICAST=y
 CONFIG_IP_ADVANCED_ROUTER=y
 CONFIG_IP_MULTIPLE_TABLES=y
@@ -532,14 +582,7 @@ CONFIG_SYN_COOKIES=y
 CONFIG_INET_AH=m
 CONFIG_INET_ESP=m
 CONFIG_INET_IPCOMP=m
-CONFIG_NETCONSOLE=m
-# CONFIG_NETPOLL_RX is not set
-CONFIG_NETPOLL_TRAP=y
-CONFIG_NET_POLL_CONTROLLER=y
-CONFIG_NETDUMP=m
-CONFIG_DISKDUMP=m
-CONFIG_SCSI_DUMP=m
-CONFIG_SD_IOSTATS=y
+CONFIG_INET_TUNNEL=m
 
 #
 # IP: Virtual Server Configuration
@@ -547,10 +590,18 @@ CONFIG_SD_IOSTATS=y
 CONFIG_IP_VS=m
 # CONFIG_IP_VS_DEBUG is not set
 CONFIG_IP_VS_TAB_BITS=12
+
+#
+# IPVS transport protocol load balancing support
+#
 CONFIG_IP_VS_PROTO_TCP=y
 CONFIG_IP_VS_PROTO_UDP=y
 CONFIG_IP_VS_PROTO_ESP=y
 CONFIG_IP_VS_PROTO_AH=y
+
+#
+# IPVS scheduler
+#
 CONFIG_IP_VS_RR=m
 CONFIG_IP_VS_WRR=m
 CONFIG_IP_VS_LC=m
@@ -561,17 +612,18 @@ CONFIG_IP_VS_DH=m
 CONFIG_IP_VS_SH=m
 CONFIG_IP_VS_SED=m
 CONFIG_IP_VS_NQ=m
-CONFIG_IP_VS_FTP=m
-
 
+#
+# IPVS application helper
+#
+CONFIG_IP_VS_FTP=m
 CONFIG_IPV6=m
 CONFIG_IPV6_PRIVACY=y
 CONFIG_INET6_AH=m
 CONFIG_INET6_ESP=m
 CONFIG_INET6_IPCOMP=m
+CONFIG_INET6_TUNNEL=m
 CONFIG_IPV6_TUNNEL=m
-# CONFIG_DECNET is not set
-CONFIG_BRIDGE=m
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
 CONFIG_BRIDGE_NETFILTER=y
@@ -580,14 +632,14 @@ CONFIG_BRIDGE_NETFILTER=y
 # IP: Netfilter Configuration
 #
 CONFIG_IP_NF_CONNTRACK=m
+CONFIG_IP_NF_CT_ACCT=y
+CONFIG_IP_NF_CT_PROTO_SCTP=m
 CONFIG_IP_NF_FTP=m
 CONFIG_IP_NF_IRC=m
 CONFIG_IP_NF_TFTP=m
 CONFIG_IP_NF_AMANDA=m
 CONFIG_IP_NF_QUEUE=m
-CONFIG_IP_NF_RAW=m
 CONFIG_IP_NF_IPTABLES=m
-CONFIG_IP_NF_MATCH_COMMENT=m
 CONFIG_IP_NF_MATCH_LIMIT=m
 CONFIG_IP_NF_MATCH_IPRANGE=m
 CONFIG_IP_NF_MATCH_MAC=m
@@ -610,15 +662,18 @@ CONFIG_IP_NF_MATCH_PHYSDEV=m
 CONFIG_IP_NF_MATCH_ADDRTYPE=m
 CONFIG_IP_NF_MATCH_REALM=m
 CONFIG_IP_NF_MATCH_SCTP=m
+CONFIG_IP_NF_MATCH_COMMENT=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_TARGET_TCPMSS=m
 CONFIG_IP_NF_NAT=m
 CONFIG_IP_NF_NAT_NEEDED=y
 CONFIG_IP_NF_TARGET_MASQUERADE=m
 CONFIG_IP_NF_TARGET_REDIRECT=m
 CONFIG_IP_NF_TARGET_NETMAP=m
 CONFIG_IP_NF_TARGET_SAME=m
-CONFIG_IP_NF_TARGET_NOTRACK=m
 CONFIG_IP_NF_NAT_LOCAL=y
 CONFIG_IP_NF_NAT_SNMP_BASIC=m
 CONFIG_IP_NF_NAT_IRC=m
@@ -631,14 +686,11 @@ CONFIG_IP_NF_TARGET_ECN=m
 CONFIG_IP_NF_TARGET_DSCP=m
 CONFIG_IP_NF_TARGET_MARK=m
 CONFIG_IP_NF_TARGET_CLASSIFY=m
-CONFIG_IP_NF_TARGET_LOG=m
-CONFIG_IP_NF_TARGET_ULOG=m
-CONFIG_IP_NF_TARGET_TCPMSS=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_TARGET_NOTRACK=m
 CONFIG_IP_NF_ARPTABLES=m
 CONFIG_IP_NF_ARPFILTER=m
 CONFIG_IP_NF_ARP_MANGLE=m
-CONFIG_IP_NF_CT_ACCT=y
-CONFIG_IP_NF_CT_PROTO_SCTP=m
 # CONFIG_IP_NF_COMPAT_IPCHAINS is not set
 # CONFIG_IP_NF_COMPAT_IPFWADM is not set
 
@@ -667,7 +719,6 @@ CONFIG_IP6_NF_MANGLE=m
 CONFIG_IP6_NF_TARGET_MARK=m
 CONFIG_IP6_NF_RAW=m
 
-
 #
 # Bridge: Netfilter Configuration
 #
@@ -703,33 +754,36 @@ CONFIG_IP_SCTP=m
 # CONFIG_SCTP_HMAC_SHA1 is not set
 CONFIG_SCTP_HMAC_MD5=y
 CONFIG_ATM=m
+CONFIG_ATM_CLIP=m
+# CONFIG_ATM_CLIP_NO_ICMP is not set
+CONFIG_ATM_LANE=m
+# CONFIG_ATM_MPOA is not set
+CONFIG_ATM_BR2684=m
+# CONFIG_ATM_BR2684_IPFILTER is not set
+CONFIG_BRIDGE=m
 CONFIG_VLAN_8021Q=m
-CONFIG_LLC=m
+# CONFIG_DECNET is not set
+CONFIG_LLC=y
 # CONFIG_LLC2 is not set
 # CONFIG_IPX is not set
-# CONFIG_IPX_INTERN is not set
 # CONFIG_ATALK is not set
-# CONFIG_DEV_APPLETALK is not set
-# CONFIG_LTPC is not set
-# CONFIG_COPS is not set
-CONFIG_COPS_DAYNA=y
-CONFIG_COPS_TANGENT=y
-# CONFIG_IPDDP is not set
-CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
 CONFIG_NET_DIVERT=y
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
-# CONFIG_NET_HW_FLOWCONTROL is not set
 
 #
 # QoS and/or fair queueing
 #
 CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CLK_JIFFIES=y
+# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
+# CONFIG_NET_SCH_CLK_CPU is not set
 CONFIG_NET_SCH_CBQ=m
 CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_ATM=m
 CONFIG_NET_SCH_PRIO=m
 CONFIG_NET_SCH_RED=m
 CONFIG_NET_SCH_SFQ=m
@@ -737,9 +791,8 @@ CONFIG_NET_SCH_TEQL=m
 CONFIG_NET_SCH_TBF=m
 CONFIG_NET_SCH_GRED=m
 CONFIG_NET_SCH_DSMARK=m
-CONFIG_NET_SCH_INGRESS=m
-CONFIG_NET_SCH_HFSC=m
 CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_SCH_INGRESS=m
 CONFIG_NET_QOS=y
 CONFIG_NET_ESTIMATOR=y
 CONFIG_NET_CLS=y
@@ -748,72 +801,69 @@ CONFIG_NET_CLS_ROUTE4=m
 CONFIG_NET_CLS_ROUTE=y
 CONFIG_NET_CLS_FW=m
 CONFIG_NET_CLS_U32=m
-CONFIG_NET_CLS_RSVP=m
-CONFIG_NET_CLS_RSVP6=m
-CONFIG_NET_CLS_POLICE=y
-# CONFIG_NET_ACT_POLICE is not set
 CONFIG_CLS_U32_PERF=y
 CONFIG_NET_CLS_IND=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
 # CONFIG_NET_CLS_ACT is not set
+CONFIG_NET_CLS_POLICE=y
 
 #
 # Network testing
 #
 # CONFIG_NET_PKTGEN is not set
-CONFIG_NETDEVICES=y
-
-#
-# ARCnet devices
-#
-# CONFIG_ARCNET is not set
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-# CONFIG_EQUALIZER is not set
-CONFIG_TUN=m
-CONFIG_ETHERTAP=m
-# CONFIG_NET_SB1000 is not set
-
-#
-# ATM
-# 
-CONFIG_ATM_CLIP=m
-CONFIG_ATM_LANE=m
-CONFIG_ATM_BR2684=m
-CONFIG_NET_SCH_ATM=m
-CONFIG_ATM_TCP=m
-CONFIG_ATM_LANAI=m
-CONFIG_ATM_ENI=m
-CONFIG_ATM_FIRESTREAM=m
-# CONFIG_ATM_ZATM is not set
-CONFIG_ATM_IDT77252=m
-CONFIG_ATM_AMBASSADOR=m
-CONFIG_ATM_HORIZON=m
-CONFIG_ATM_FORE200E_MAYBE=m
-CONFIG_ATM_HE=m
-CONFIG_PPPOATM=m
-CONFIG_ATM_NICSTAR=m
-# CONFIG_ATM_IA is not set
-
-
-# CONFIG_ATM_CLIP_NO_ICMP is not set
-# CONFIG_ATM_MPOA is not set
-# CONFIG_ATM_BR2684_IPFILTER is not set
-# CONFIG_ATM_ENI_DEBUG is not set
-# CONFIG_ATM_ENI_TUNE_BURST is not set
-# CONFIG_ATM_ZATM_DEBUG is not set
-# CONFIG_ATM_IDT77252_DEBUG is not set
-# CONFIG_ATM_IDT77252_RCV_ALL is not set
-# CONFIG_ATM_AMBASSADOR_DEBUG is not set
-# CONFIG_ATM_HORIZON_DEBUG is not set
-# CONFIG_ATM_FORE200E_PCA is not set
-# CONFIG_ATM_HE_USE_SUNI is not set
-# CONFIG_ATM_NICSTAR_USE_SUNI is not set
-# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set
-# CONFIG_ATM_IA_DEBUG is not set
-
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+CONFIG_NETPOLL_TRAP=y
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_CMTP=m
+CONFIG_BT_HIDP=m
 
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUSB=m
+CONFIG_BT_HCIUSB_SCO=y
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_BCSP_TXCRC=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_TUX=m
 
+#
+# TUX options
+#
+CONFIG_TUX_EXTCGI=y
+# CONFIG_TUX_EXTENDED_LOG is not set
+# CONFIG_TUX_DEBUG is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+CONFIG_BONDING=m
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+CONFIG_ETHERTAP=m
 
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
 
 #
 # Ethernet (10 or 100Mbit)
@@ -823,23 +873,8 @@ CONFIG_MII=m
 CONFIG_HAPPYMEAL=m
 CONFIG_SUNGEM=m
 CONFIG_NET_VENDOR_3COM=y
-# CONFIG_EL1 is not set
-# CONFIG_EL2 is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_EL16 is not set
-# CONFIG_EL3 is not set
-# CONFIG_3C515 is not set
 CONFIG_VORTEX=m
 CONFIG_TYPHOON=m
-# CONFIG_LANCE is not set
-CONFIG_NET_VENDOR_SMC=y
-# CONFIG_WD80x3 is not set
-# CONFIG_ULTRA is not set
-CONFIG_SMC9194=m
-CONFIG_NET_VENDOR_RACAL=y
-# CONFIG_NI52 is not set
-# CONFIG_NI65 is not set
 
 #
 # Tulip family network device support
@@ -847,51 +882,28 @@ CONFIG_NET_VENDOR_RACAL=y
 CONFIG_NET_TULIP=y
 CONFIG_DE2104X=m
 CONFIG_TULIP=m
-# CONFIG_TULIP_NAPI is not set
-
 # CONFIG_TULIP_MWI is not set
 CONFIG_TULIP_MMIO=y
-# CONFIG_NI5010 is not set
-# CONFIG_PCMCIA_XIRTULIP is not set
+# CONFIG_TULIP_NAPI is not set
 CONFIG_DE4X5=m
 CONFIG_WINBOND_840=m
 CONFIG_DM9102=m
 CONFIG_PCMCIA_XIRCOM=m
-# CONFIG_AT1700 is not set
-# CONFIG_DEPCA is not set
 # CONFIG_HP100 is not set
-# CONFIG_NET_ISA is not set
-CONFIG_EWRK3=m
-CONFIG_E2100=m
-CONFIG_EEXPRESS=m
-CONFIG_EEXPRESS_PRO=m
-CONFIG_HPLAN_PLUS=m
-CONFIG_HPLAN=m
-CONFIG_LP486E=m
-CONFIG_ETH16I=m
-CONFIG_NE2000=m
-CONFIG_ZNET=m
-CONFIG_SEEQ8005=m
-CONFIG_LNE390=m
-CONFIG_NE3210=m
-CONFIG_ES3210=m
 CONFIG_NET_PCI=y
 CONFIG_PCNET32=m
 CONFIG_AMD8111_ETH=m
 CONFIG_AMD8111E_NAPI=y
 CONFIG_ADAPTEC_STARFIRE=m
 CONFIG_ADAPTEC_STARFIRE_NAPI=y
-# CONFIG_AC3200 is not set
-CONFIG_APRICOT=m
 CONFIG_B44=m
-# CONFIG_CS89x0 is not set
+CONFIG_FORCEDETH=m
 # CONFIG_DGRS is not set
 CONFIG_EEPRO100=m
 # CONFIG_EEPRO100_PIO is not set
 CONFIG_E100=m
 CONFIG_E100_NAPI=y
 CONFIG_FEALNX=m
-CONFIG_FORCEDETH=m
 CONFIG_NATSEMI=m
 CONFIG_NE2K_PCI=m
 CONFIG_8139CP=m
@@ -903,15 +915,8 @@ CONFIG_8139TOO_8129=y
 CONFIG_SIS900=m
 CONFIG_EPIC100=m
 # CONFIG_SUNDANCE is not set
-# CONFIG_SUNDANCE_MMIO is not set
-CONFIG_TLAN=m
 CONFIG_VIA_RHINE=m
 CONFIG_VIA_RHINE_MMIO=y
-CONFIG_VIA_VELOCITY=m
-CONFIG_NET_POCKET=y
-# CONFIG_ATP is not set
-# CONFIG_DE600 is not set
-# CONFIG_DE620 is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -927,6 +932,7 @@ CONFIG_NS83820=m
 CONFIG_R8169=m
 CONFIG_R8169_NAPI=y
 CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
 CONFIG_TIGON3=m
 
 #
@@ -936,21 +942,16 @@ CONFIG_IXGB=m
 CONFIG_IXGB_NAPI=y
 CONFIG_S2IO=m
 CONFIG_S2IO_NAPI=y
-CONFIG_FDDI=y
-# CONFIG_DEFXX is not set
-# CONFIG_SKFP is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PLIP is not set
-CONFIG_PPP=m
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_IPPP_FILTER=y
-# CONFIG_PPP_BSDCOMP is not set
-CONFIG_PPPOE=m
-# CONFIG_SLIP is not set
+
+#
+# Token Ring devices
+#
+CONFIG_TR=y
+CONFIG_IBMOL=m
+CONFIG_3C359=m
+CONFIG_TMS380TR=m
+CONFIG_TMSPCI=m
+CONFIG_ABYSS=m
 
 #
 # Wireless LAN (non-hamradio)
@@ -961,8 +962,6 @@ CONFIG_NET_RADIO=y
 # Obsolete Wireless cards support (pre-802.11)
 #
 # CONFIG_STRIP is not set
-# CONFIG_ARLAN is not set
-CONFIG_WAVELAN=m
 CONFIG_PCMCIA_WAVELAN=m
 CONFIG_PCMCIA_NETWAVE=m
 
@@ -978,21 +977,18 @@ CONFIG_IEEE80211=m
 # CONFIG_IEEE80211_DEBUG is not set
 CONFIG_IEEE80211_CRYPT=m
 CONFIG_IEEE80211_WPA=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
 CONFIG_IEEE80211_CRYPT_TKIP=m
 CONFIG_IPW2100=m
 # CONFIG_IPW_DEBUG is not set
 CONFIG_IPW2100_PROMISC=y
 # CONFIG_IPW2100_LEGACY_FW_LOAD is not set
 CONFIG_IPW2200=m
-CONFIG_AIRO=m
 CONFIG_HERMES=m
 CONFIG_PLX_HERMES=m
 CONFIG_TMD_HERMES=m
 CONFIG_PCI_HERMES=m
 CONFIG_ATMEL=m
 CONFIG_PCI_ATMEL=m
-CONFIG_PRISM54=m
 
 #
 # Wireless 802.11b Pcmcia/Cardbus cards support
@@ -1001,32 +997,12 @@ CONFIG_PCMCIA_HERMES=m
 CONFIG_AIRO_CS=m
 CONFIG_PCMCIA_ATMEL=m
 CONFIG_PCMCIA_WL3501=m
-CONFIG_NET_WIRELESS=y
 
 #
-# Token Ring devices
+# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
 #
-CONFIG_TR=y
-CONFIG_IBMOL=m
-CONFIG_3C359=m
-CONFIG_TMS380TR=m
-CONFIG_TMSPCI=m
-CONFIG_ABYSS=m
-CONFIG_IBMTR=m
-CONFIG_IBMLS=m
-CONFIG_SKISA=m
-CONFIG_PROTEON=m
-CONFIG_SMCTR=m
-CONFIG_PCMCIA_IBMTR=m
-
-
-CONFIG_NET_FC=y
-# CONFIG_SHAPER is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
+CONFIG_PRISM54=m
+CONFIG_NET_WIRELESS=y
 
 #
 # PCMCIA network device support
@@ -1042,138 +1018,108 @@ CONFIG_PCMCIA_XIRC2PS=m
 CONFIG_PCMCIA_AXNET=m
 
 #
-# Amateur Radio support
+# Wan interfaces
 #
-# CONFIG_HAMRADIO is not set
+# CONFIG_WAN is not set
 
 #
-# IrDA (infrared) support
+# ATM drivers
 #
-# CONFIG_IRDA is not set
-# CONFIG_IRDA is not set
-# CONFIG_IRDA_DEBUG is not set
-CONFIG_IRLAN=m
-CONFIG_IRNET=m
-CONFIG_IRCOMM=m
-# CONFIG_IRDA_ULTRA is not set
-CONFIG_IRDA_CACHE_LAST_LSAP=y
-CONFIG_IRDA_FAST_RR=y
-CONFIG_IRTTY_SIR=m
-CONFIG_DONGLE=y
-CONFIG_ESI_DONGLE=m
-CONFIG_ACTISYS_DONGLE=m
-CONFIG_TEKRAM_DONGLE=m
-CONFIG_IRPORT_SIR=m
-# CONFIG_DONGLE_OLD is not set
-CONFIG_LITELINK_DONGLE=m
-CONFIG_MA600_DONGLE=m
-CONFIG_GIRBIL_DONGLE=m
-CONFIG_MCP2120_DONGLE=m
-CONFIG_OLD_BELKIN_DONGLE=m
-CONFIG_ACT200L_DONGLE=m
-
-CONFIG_USB_IRDA=m
-CONFIG_NSC_FIR=m
-CONFIG_SIGMATEL_FIR=m
-# CONFIG_WINBOND_FIR is not set
-# CONFIG_TOSHIBA_FIR is not set
-# CONFIG_SMC_IRCC_FIR is not set
-# CONFIG_ALI_FIR is not set
-# CONFIG_VLSI_FIR is not set
-# CONFIG_VIA_FIR is not set
-
-
-
-#
-# Bluetooth support
-#
-CONFIG_BT=m
-CONFIG_BT_L2CAP=m
-CONFIG_BT_SCO=m
-CONFIG_BT_CMTP=m
-CONFIG_BT_RFCOMM=m
-CONFIG_BT_RFCOMM_TTY=y
-CONFIG_BT_BNEP=m
-CONFIG_BT_BNEP_MC_FILTER=y
-CONFIG_BT_BNEP_PROTO_FILTER=y
-CONFIG_BT_HIDP=m
+CONFIG_ATM_TCP=m
+CONFIG_ATM_LANAI=m
+CONFIG_ATM_ENI=m
+# CONFIG_ATM_ENI_DEBUG is not set
+# CONFIG_ATM_ENI_TUNE_BURST is not set
+CONFIG_ATM_FIRESTREAM=m
+# CONFIG_ATM_ZATM is not set
+CONFIG_ATM_IDT77252=m
+# CONFIG_ATM_IDT77252_DEBUG is not set
+# CONFIG_ATM_IDT77252_RCV_ALL is not set
+CONFIG_ATM_IDT77252_USE_SUNI=y
+CONFIG_ATM_AMBASSADOR=m
+# CONFIG_ATM_AMBASSADOR_DEBUG is not set
+CONFIG_ATM_HORIZON=m
+# CONFIG_ATM_HORIZON_DEBUG is not set
+CONFIG_ATM_FORE200E_MAYBE=m
+# CONFIG_ATM_FORE200E_PCA is not set
+CONFIG_ATM_HE=m
+# CONFIG_ATM_HE_USE_SUNI is not set
+CONFIG_FDDI=y
+# CONFIG_DEFXX is not set
+# CONFIG_SKFP is not set
+# CONFIG_HIPPI is not set
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+# CONFIG_PPP_BSDCOMP is not set
+CONFIG_PPPOE=m
+CONFIG_PPPOATM=m
+# CONFIG_SLIP is not set
+CONFIG_NET_FC=y
+# CONFIG_SHAPER is not set
+CONFIG_NETCONSOLE=m
+CONFIG_NETDUMP=m
 
 #
-# Bluetooth device drivers
+# ISDN subsystem
 #
-CONFIG_BT_HCIUSB=m
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=y
-CONFIG_BT_HCIUART_BCSP_TXCRC=y
-CONFIG_BT_HCIDTL1=m
-CONFIG_BT_HCIBT3C=m
-CONFIG_BT_HCIBLUECARD=m
-CONFIG_BT_HCIBTUART=m
-CONFIG_BT_HCIVHCI=m
-CONFIG_BT_HCIUSB_SCO=y
-CONFIG_BT_HCIBCM203X=m
-CONFIG_BT_HCIBFUSB=m
-CONFIG_USB_BLUETOOTH_TTY=m
+CONFIG_ISDN=m
 
 #
-# ISDN subsystem
+# Old ISDN4Linux
 #
-
-CONFIG_ISDN=m
 CONFIG_ISDN_I4L=m
-CONFIG_ISDN_DRV_AVMB1_B1ISA=m
-CONFIG_ISDN_DRV_AVMB1_B1PCI=m
-CONFIG_ISDN_DRV_AVMB1_T1ISA=m
-CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m
-CONFIG_ISDN_DRV_AVMB1_T1PCI=m
-CONFIG_ISDN_DRV_AVMB1_C4=m
-
 CONFIG_ISDN_PPP=y
 CONFIG_ISDN_PPP_VJ=y
 CONFIG_ISDN_MPP=y
+CONFIG_IPPP_FILTER=y
 # CONFIG_ISDN_PPP_BSDCOMP is not set
+CONFIG_ISDN_AUDIO=y
 CONFIG_ISDN_TTY_FAX=y
-CONFIG_DE_AOC=y
 
-CONFIG_ISDN_AUDIO=y
+#
+# ISDN feature submodules
+#
 
-CONFIG_ISDN_DRV_HISAX=m
-CONFIG_ISDN_DRV_ICN=m
-CONFIG_ISDN_DRV_PCBIT=m
-CONFIG_ISDN_DRV_SC=m
-CONFIG_ISDN_DRV_ACT2000=m
-CONFIG_ISDN_DRV_TPAM=m
-CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y
-CONFIG_ISDN_DRV_AVMB1_AVM_CS=m
+#
+# ISDN4Linux hardware drivers
+#
 
-CONFIG_ISDN_CAPI_CAPIDRV=m
+#
+# Passive cards
+#
+CONFIG_ISDN_DRV_HISAX=m
 
+#
+# D-channel protocol features
+#
 CONFIG_HISAX_EURO=y
+CONFIG_DE_AOC=y
+CONFIG_HISAX_NO_SENDCOMPLETE=y
+CONFIG_HISAX_NO_LLC=y
+CONFIG_HISAX_NO_KEYPAD=y
 CONFIG_HISAX_1TR6=y
 CONFIG_HISAX_NI1=y
 CONFIG_HISAX_MAX_CARDS=8
-CONFIG_HISAX_16_0=y
+
+#
+# HiSax supported cards
+#
 CONFIG_HISAX_16_3=y
 CONFIG_HISAX_TELESPCI=y
 CONFIG_HISAX_S0BOX=y
-CONFIG_HISAX_AVM_A1=y
 CONFIG_HISAX_FRITZPCI=y
 CONFIG_HISAX_AVM_A1_PCMCIA=y
 CONFIG_HISAX_ELSA=y
-CONFIG_HISAX_IX1MICROR2=y
 CONFIG_HISAX_DIEHLDIVA=y
-CONFIG_HISAX_ASUSCOM=y
-CONFIG_HISAX_TELEINT=y
-CONFIG_HISAX_HFCS=y
 CONFIG_HISAX_SEDLBAUER=y
-CONFIG_HISAX_SPORTSTER=y
-CONFIG_HISAX_MIC=y
 CONFIG_HISAX_NETJET=y
 CONFIG_HISAX_NETJET_U=y
 CONFIG_HISAX_NICCY=y
-CONFIG_HISAX_ISURF=y
-CONFIG_HISAX_HSTSAPHIR=y
 CONFIG_HISAX_BKM_A4T=y
 CONFIG_HISAX_SCT_QUADRO=y
 CONFIG_HISAX_GAZEL=y
@@ -1182,21 +1128,27 @@ CONFIG_HISAX_W6692=y
 CONFIG_HISAX_HFC_SX=y
 CONFIG_HISAX_ENTERNOW_PCI=y
 # CONFIG_HISAX_DEBUG is not set
-CONFIG_HISAX_AVM_A1_CS=m
-CONFIG_HISAX_ST5481=m
-CONFIG_HISAX_HFCUSB=m
-CONFIG_HISAX_FRITZ_PCIPNP=m
-CONFIG_HISAX_NO_SENDCOMPLETE=y
-CONFIG_HISAX_NO_LLC=y
-CONFIG_HISAX_NO_KEYPAD=y
+
+#
+# HiSax PCMCIA card service modules
+#
 CONFIG_HISAX_SEDLBAUER_CS=m
 CONFIG_HISAX_ELSA_CS=m
+CONFIG_HISAX_AVM_A1_CS=m
 CONFIG_HISAX_TELES_CS=m
 
-CONFIG_ISDN_DRV_LOOP=m
-CONFIG_HYSDN=m
-CONFIG_HYSDN_CAPI=y
+#
+# HiSax sub driver modules
+#
+CONFIG_HISAX_ST5481=m
+CONFIG_HISAX_HFCUSB=m
+CONFIG_HISAX_FRITZ_PCIPNP=m
+CONFIG_HISAX_HDLC=y
 
+#
+# Active cards
+#
+CONFIG_ISDN_DRV_TPAM=m
 
 #
 # CAPI subsystem
@@ -1207,6 +1159,7 @@ CONFIG_ISDN_CAPI_MIDDLEWARE=y
 CONFIG_ISDN_CAPI_CAPI20=m
 CONFIG_ISDN_CAPI_CAPIFS_BOOL=y
 CONFIG_ISDN_CAPI_CAPIFS=m
+CONFIG_ISDN_CAPI_CAPIDRV=m
 
 #
 # CAPI hardware drivers
@@ -1221,12 +1174,6 @@ CONFIG_CAPI_AVM=y
 # Active Eicon DIVA Server cards
 #
 # CONFIG_CAPI_EICON is not set
-CONFIG_ISDN_DIVAS=m
-CONFIG_ISDN_DIVAS_BRIPCI=y
-CONFIG_ISDN_DIVAS_PRIPCI=y
-CONFIG_ISDN_DIVAS_DIVACAPI=m
-CONFIG_ISDN_DIVAS_USERIDI=m
-CONFIG_ISDN_DIVAS_MAINT=m
 
 #
 # Telephony Support
@@ -1254,21 +1201,14 @@ CONFIG_INPUT_EVDEV=y
 # Input I/O drivers
 #
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=m
-CONFIG_GAMEPORT_NS558=m
-CONFIG_GAMEPORT_L4=m
-CONFIG_GAMEPORT_EMU10K1=m
-CONFIG_GAMEPORT_VORTEX=m
-CONFIG_GAMEPORT_FM801=m
-CONFIG_GAMEPORT_CS461x=m
+CONFIG_SOUND_GAMEPORT=y
 CONFIG_SERIO=y
 CONFIG_SERIO_I8042=y
 CONFIG_SERIO_SERPORT=y
-# CONFIG_SERIO_RAW is not set
-
 # CONFIG_SERIO_CT82C710 is not set
 # CONFIG_SERIO_PARKBD is not set
 # CONFIG_SERIO_PCIPS2 is not set
+# CONFIG_SERIO_RAW is not set
 
 #
 # Input Device Drivers
@@ -1276,32 +1216,15 @@ CONFIG_SERIO_SERPORT=y
 CONFIG_INPUT_KEYBOARD=y
 CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
 # CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_LKKBD is not set
 CONFIG_INPUT_MOUSE=y
 CONFIG_MOUSE_PS2=y
 CONFIG_MOUSE_SERIAL=m
-CONFIG_MOUSE_INPORT=m
-CONFIG_MOUSE_ATIXL=y
-CONFIG_MOUSE_LOGIBM=m
-CONFIG_MOUSE_PC110PAD=m
 CONFIG_MOUSE_VSXXXAA=m
 CONFIG_INPUT_JOYSTICK=y
-# CONFIG_JOYSTICK_ANALOG is not set
-# CONFIG_JOYSTICK_A3D is not set
-# CONFIG_JOYSTICK_ADI is not set
-# CONFIG_JOYSTICK_COBRA is not set
-# CONFIG_JOYSTICK_GF2K is not set
-# CONFIG_JOYSTICK_GRIP is not set
-# CONFIG_JOYSTICK_GRIP_MP is not set
-# CONFIG_JOYSTICK_GUILLEMOT is not set
-# CONFIG_JOYSTICK_INTERACT is not set
-# CONFIG_JOYSTICK_SIDEWINDER is not set
-# CONFIG_JOYSTICK_TMDC is not set
 # CONFIG_JOYSTICK_IFORCE is not set
-# CONFIG_JOYSTICK_IFORCE_USB=y
-# CONFIG_JOYSTICK_IFORCE_232=y
 # CONFIG_JOYSTICK_WARRIOR is not set
 # CONFIG_JOYSTICK_MAGELLAN is not set
 # CONFIG_JOYSTICK_SPACEORB is not set
@@ -1311,12 +1234,11 @@ CONFIG_INPUT_JOYSTICK=y
 # CONFIG_JOYSTICK_DB9 is not set
 # CONFIG_JOYSTICK_GAMECON is not set
 # CONFIG_JOYSTICK_TURBOGRAFX is not set
-CONFIG_JOYSTICK_JOYDUMP=m
 CONFIG_INPUT_TOUCHSCREEN=y
 CONFIG_TOUCHSCREEN_GUNZE=m
 CONFIG_INPUT_MISC=y
 CONFIG_INPUT_PCSPKR=m
-CONFIG_INPUT_UINPUT=m 
+CONFIG_INPUT_UINPUT=m
 
 #
 # Character devices
@@ -1326,12 +1248,11 @@ CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
 CONFIG_SERIAL_NONSTANDARD=y
 # CONFIG_ROCKETPORT is not set
+# CONFIG_CYCLADES is not set
 # CONFIG_SYNCLINK is not set
 # CONFIG_SYNCLINKMP is not set
 CONFIG_N_HDLC=m
 CONFIG_STALDRV=y
-# CONFIG_FTAPE is not set
-# CONFIG_IBM_ASM is not set
 
 #
 # Serial drivers
@@ -1347,20 +1268,6 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
 CONFIG_SERIAL_8250_DETECT_IRQ=y
 CONFIG_SERIAL_8250_MULTIPORT=y
 CONFIG_SERIAL_8250_RSA=y
-# CONFIG_COMPUTONE is not set
-# CONFIG_CYCLADES is not set
-# CONFIG_DIGIEPCA is not set
-# CONFIG_DIGI is not set
-# CONFIG_ESPSERIAL is not set
-# CONFIG_MOXA_INTELLIO is not set
-# CONFIG_MOXA_SMARTIO is not set
-# CONFIG_ISI is not set
-# CONFIG_RISCOM8 is not set
-# CONFIG_SPECIALIX is not set
-# CONFIG_SX is not set
-# CONFIG_RIO is not set
-# CONFIG_STALLION is not set
-# CONFIG_ISTALLION is not set
 
 #
 # Non-8250 serial port support
@@ -1369,12 +1276,91 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 # CONFIG_LEGACY_PTYS is not set
+CONFIG_CRASH=m
 CONFIG_PRINTER=m
 CONFIG_LP_CONSOLE=y
 CONFIG_PPDEV=m
 # CONFIG_TIPAR is not set
 
 #
+# IPMI
+#
+CONFIG_IPMI_HANDLER=m
+# CONFIG_IPMI_PANIC_EVENT is not set
+CONFIG_IPMI_DEVICE_INTERFACE=m
+CONFIG_IPMI_SI=m
+CONFIG_IPMI_WATCHDOG=m
+CONFIG_IPMI_POWEROFF=m
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_ACQUIRE_WDT=m
+CONFIG_ADVANTECH_WDT=m
+CONFIG_ALIM1535_WDT=m
+CONFIG_ALIM7101_WDT=m
+CONFIG_SC520_WDT=m
+CONFIG_EUROTECH_WDT=m
+CONFIG_IB700_WDT=m
+CONFIG_WAFER_WDT=m
+CONFIG_I8XX_TCO=m
+CONFIG_SC1200_WDT=m
+# CONFIG_SCx200_WDT is not set
+# CONFIG_60XX_WDT is not set
+CONFIG_CPU5_WDT=m
+CONFIG_W83627HF_WDT=m
+CONFIG_W83877F_WDT=m
+CONFIG_MACHZ_WDT=m
+
+#
+# PCI-based Watchdog Cards
+#
+CONFIG_PCIPCWATCHDOG=m
+CONFIG_WDTPCI=m
+CONFIG_WDT_501_PCI=y
+
+#
+# USB-based Watchdog Cards
+#
+CONFIG_USBPCWATCHDOG=m
+CONFIG_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+CONFIG_RTC=y
+CONFIG_DTLK=m
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+CONFIG_AGP=y
+CONFIG_AGP_AMD64=y
+CONFIG_AGP_INTEL_MCH=y
+CONFIG_DRM=y
+# CONFIG_DRM_TDFX is not set
+CONFIG_DRM_R128=m
+CONFIG_DRM_RADEON=m
+CONFIG_DRM_MGA=m
+# CONFIG_DRM_SIS is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_MWAVE is not set
+CONFIG_RAW_DRIVER=y
+# CONFIG_HPET is not set
+CONFIG_MAX_RAW_DEVS=8192
+CONFIG_HANGCHECK_TIMER=m
+
+#
 # I2C support
 #
 CONFIG_I2C=m
@@ -1383,14 +1369,15 @@ CONFIG_I2C_CHARDEV=m
 #
 # I2C Algorithms
 #
-# CONFIG_I2C_DEBUG_ALGO is not set
 CONFIG_I2C_ALGOBIT=m
 CONFIG_I2C_ALGOPCF=m
+CONFIG_I2C_ALGOPCA=m
 
 #
 # I2C Hardware Bus support
 #
 CONFIG_I2C_ALI1535=m
+CONFIG_I2C_ALI1563=m
 CONFIG_I2C_ALI15X3=m
 CONFIG_I2C_AMD756=m
 CONFIG_I2C_AMD8111=m
@@ -1398,7 +1385,8 @@ CONFIG_I2C_I801=m
 CONFIG_I2C_I810=m
 CONFIG_I2C_ISA=m
 CONFIG_I2C_NFORCE2=m
-CONFIG_I2C_PIIX4=m
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
 CONFIG_I2C_PROSAVAGE=m
 CONFIG_I2C_SAVAGE4=m
 # CONFIG_SCx200_ACB is not set
@@ -1408,151 +1396,60 @@ CONFIG_I2C_SIS96X=m
 CONFIG_I2C_VIA=m
 CONFIG_I2C_VIAPRO=m
 CONFIG_I2C_VOODOO3=m
-# CONFIG_I2C_ELEKTOR is not set
-CONFIG_I2C_PARPORT=m
-CONFIG_I2C_PARPORT_LIGHT=m
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-# CONFIG_I2C_PARPORT is not set
-CONFIG_I2C_ALI1563=m
-# CONFIG_I2C_PARPORT_LIGHT is not set
-CONFIG_I2C_ALGOPCA=m
 # CONFIG_I2C_PCA_ISA is not set
-
 
 #
-# I2C Hardware Sensors Chip support
+# Hardware Sensors Chip support
 #
 CONFIG_I2C_SENSOR=m
 CONFIG_SENSORS_ADM1021=m
-CONFIG_SENSORS_EEPROM=m
+CONFIG_SENSORS_ADM1025=m
+CONFIG_SENSORS_ADM1031=m
+CONFIG_SENSORS_ASB100=m
+CONFIG_SENSORS_DS1621=m
+CONFIG_SENSORS_FSCHER=m
+CONFIG_SENSORS_GL518SM=m
 CONFIG_SENSORS_IT87=m
 CONFIG_SENSORS_LM75=m
+CONFIG_SENSORS_LM77=m
 CONFIG_SENSORS_LM78=m
 CONFIG_SENSORS_LM80=m
 CONFIG_SENSORS_LM83=m
 CONFIG_SENSORS_LM85=m
+CONFIG_SENSORS_LM90=m
+CONFIG_SENSORS_MAX1619=m
+CONFIG_SENSORS_SMSC47M1=m
 CONFIG_SENSORS_VIA686A=m
 CONFIG_SENSORS_W83781D=m
-CONFIG_SENSORS_ASB100=m
-CONFIG_SENSORS_LM90=m
 CONFIG_SENSORS_W83L785TS=m
-CONFIG_SENSORS_FSCHER=m
-CONFIG_SENSORS_GL518SM=m
-CONFIG_SENSORS_DS1621=m
 CONFIG_SENSORS_W83627HF=m
-CONFIG_SENSORS_PCF8574=m
-CONFIG_SENSORS_PCF8591=m
-CONFIG_SENSORS_RTC8564=m
-CONFIG_SENSORS_MAX1619=m
-CONFIG_SENSORS_ADM1025=m
-CONFIG_SENSORS_ADM1031=m
-CONFIG_SENSORS_LM77=m
-CONFIG_SENSORS_SMSC47M1=m
-
-# CONFIG_W1 is not set
 
 #
-# Mice
+# Other I2C Chip support
 #
-CONFIG_CRASH=m
-
-#
-# IPMI
-#
-CONFIG_IPMI_HANDLER=m
-# CONFIG_IPMI_PANIC_EVENT is not set
-CONFIG_IPMI_DEVICE_INTERFACE=m
-CONFIG_IPMI_WATCHDOG=m
-CONFIG_IPMI_SI=m
-CONFIG_IPMI_POWEROFF=m
-
-#
-# Watchdog Cards
-#
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-CONFIG_SOFT_WATCHDOG=m
-CONFIG_WDT=m
-# CONFIG_WDT_501 is not set
-CONFIG_WDTPCI=m
-CONFIG_WDT_501_PCI=y
-CONFIG_PCWATCHDOG=m
-CONFIG_ACQUIRE_WDT=m
-CONFIG_ADVANTECH_WDT=m
-CONFIG_EUROTECH_WDT=m
-CONFIG_IB700_WDT=m
-CONFIG_I8XX_TCO=m
-# CONFIG_MIXCOMWD is not set
-# CONFIG_SCx200_WDT is not set
-# CONFIG_60XX_WDT is not set
-CONFIG_W83877F_WDT=m
-CONFIG_W83627HF_WDT=m
-CONFIG_MACHZ_WDT=m
-CONFIG_SC520_WDT=m
-CONFIG_ALIM7101_WDT=m
-CONFIG_ALIM1535_WDT=m
-CONFIG_SC1200_WDT=m
-CONFIG_WAFER_WDT=m
-CONFIG_CPU5_WDT=m
-CONFIG_PCIPCWATCHDOG=m
-CONFIG_USBPCWATCHDOG=m
-
-
-CONFIG_HW_RANDOM=m
-# CONFIG_NVRAM is not set
-CONFIG_RTC=y
-CONFIG_DTLK=m
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-# CONFIG_SONYPI is not set
+CONFIG_SENSORS_EEPROM=m
+CONFIG_SENSORS_PCF8574=m
+CONFIG_SENSORS_PCF8591=m
+CONFIG_SENSORS_RTC8564=m
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
 
 #
-# Ftape, the floppy tape device driver
+# Dallas's 1-wire bus
 #
-CONFIG_AGP=y
-CONFIG_AGP_ALI=y
-CONFIG_AGP_ATI=y
-CONFIG_AGP_AMD=y
-CONFIG_AGP_AMD64=y
-CONFIG_AGP_INTEL=y
-CONFIG_AGP_INTEL_MCH=y
-CONFIG_AGP_NVIDIA=y
-CONFIG_AGP_SIS=y
-CONFIG_AGP_SWORKS=y
-CONFIG_AGP_VIA=y
-CONFIG_AGP_EFFICEON=y
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_GAMMA is not set
-CONFIG_DRM_R128=m
-CONFIG_DRM_RADEON=m
-CONFIG_DRM_I810=m
-CONFIG_DRM_I830=m
-CONFIG_DRM_MGA=m
-# CONFIG_DRM_SIS is not set
-CONFIG_DRM_I915=m
-
-
+# CONFIG_W1 is not set
 
 #
-# PCMCIA character devices
+# Misc devices
 #
-# CONFIG_SYNCLINK_CS is not set
-
-
-
-# CONFIG_MWAVE is not set
-CONFIG_RAW_DRIVER=y
-CONFIG_MAX_RAW_DEVS=8192
-CONFIG_HANGCHECK_TIMER=m
+# CONFIG_IBM_ASM is not set
 
 #
 # Multimedia devices
 #
-# CONFIG_VIDEO_DEV is not set
+CONFIG_VIDEO_DEV=m
 
 #
 # Video For Linux
@@ -1562,168 +1459,74 @@ CONFIG_HANGCHECK_TIMER=m
 # Video Adapters
 #
 # CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_PMS is not set
 # CONFIG_VIDEO_BWQCAM is not set
 # CONFIG_VIDEO_CQCAM is not set
 # CONFIG_VIDEO_W9966 is not set
 # CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA_PP is not set
-# CONFIG_VIDEO_CPIA_USB is not set
+# CONFIG_VIDEO_SAA5246A is not set
 # CONFIG_VIDEO_SAA5249 is not set
 # CONFIG_TUNER_3036 is not set
 # CONFIG_VIDEO_STRADIS is not set
 # CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_ZORAN_BUZ is not set
-# CONFIG_VIDEO_ZORAN_DC10 is not set
-# CONFIG_VIDEO_ZORAN_DC30 is not set
-# CONFIG_VIDEO_ZORAN_LML33 is not set
-# CONFIG_VIDEO_ZORAN_LML33R10 is not set
-# CONFIG_VIDEO_MEYE is not set
 # CONFIG_VIDEO_SAA7134 is not set
 # CONFIG_VIDEO_MXB is not set
 # CONFIG_VIDEO_DPC is not set
 # CONFIG_VIDEO_HEXIUM_ORION is not set
 # CONFIG_VIDEO_HEXIUM_GEMINI is not set
 # CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_SAA5246A is not set
 CONFIG_VIDEO_OVCAMCHIP=m
 
-
 #
 # Radio Adapters
 #
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
 # CONFIG_RADIO_GEMTEK_PCI is not set
 # CONFIG_RADIO_MAXIRADIO is not set
 # CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MIROPCM20 is not set
-# CONFIG_RADIO_MIROPCM20_RDS is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_TYPHOON_PROC_FS=y
-# CONFIG_RADIO_ZOLTRIX is not set
-
 
 #
 # Digital Video Broadcasting Devices
 #
 # CONFIG_DVB is not set
-CONFIG_DVB_CORE=m
-
-#
-# Supported Frontend Modules
-#
-CONFIG_DVB_STV0299=m
-# CONFIG_DVB_SP887X is not set
-# CONFIG_DVB_ALPS_TDLB7 is not set
-CONFIG_DVB_ALPS_TDMB7=m
-CONFIG_DVB_ATMEL_AT76C651=m
-CONFIG_DVB_CX24110=m
-CONFIG_DVB_GRUNDIG_29504_491=m
-CONFIG_DVB_GRUNDIG_29504_401=m
-CONFIG_DVB_MT312=m
-CONFIG_DVB_VES1820=m
-CONFIG_DVB_VES1X93=m
-CONFIG_DVB_TWINHAN_DST=m
-CONFIG_DVB_TTUSB_DEC=m
-CONFIG_DVB_BT8XX=m
-# CONFIG_DVB_TDA1004X is not set
-CONFIG_DVB_NXT6000=m
-
-#
-# Supported SAA7146 based PCI Adapters
-#
-CONFIG_DVB_AV7110=m
-CONFIG_DVB_AV7110_OSD=y
-# CONFIG_DVB_AV7110_FIRMWARE is not set
-CONFIG_DVB_BUDGET=m
-CONFIG_DVB_BUDGET_CI=m
-CONFIG_DVB_BUDGET_AV=m
-CONFIG_DVB_BUDGET_PATCH=m
-
-#
-# Supported USB Adapters
-#
-CONFIG_DVB_TTUSB_BUDGET=m
-
-#
-# Supported FlexCopII (B2C2) Adapters
-#
-CONFIG_DVB_B2C2_SKYSTAR=m
-CONFIG_VIDEO_SAA7146=m
-CONFIG_VIDEO_SAA7146_VV=m
-CONFIG_VIDEO_VIDEOBUF=m
-CONFIG_VIDEO_TUNER=m
-CONFIG_VIDEO_BUF=m
-CONFIG_VIDEO_BTCX=m
 
 #
 # Graphics support
 #
 CONFIG_FB=y
+CONFIG_FB_MODE_HELPERS=y
+CONFIG_FB_CIRRUS=m
+# CONFIG_FB_PM2 is not set
 # CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_ASILIANT is not set
 # CONFIG_FB_IMSTT is not set
 CONFIG_FB_VGA16=m
 CONFIG_FB_VESA=y
 CONFIG_VIDEO_SELECT=y
 # CONFIG_FB_HGA is not set
 CONFIG_FB_RIVA=m
-# CONFIG_FB_RIVA_DEBUG is not set
 # CONFIG_FB_RIVA_I2C is not set
-CONFIG_FB_I810=m
-CONFIG_FB_I810_GTF=y
+# CONFIG_FB_RIVA_DEBUG is not set
 # CONFIG_FB_MATROX is not set
-CONFIG_FB_MATROX_MILLENIUM=y
-CONFIG_FB_MATROX_MYSTIQUE=y
-CONFIG_FB_MATROX_G450=y
-CONFIG_FB_MATROX_G100=y
-CONFIG_FB_MATROX_I2C=m
-CONFIG_FB_MATROX_MAVEN=m
-CONFIG_FB_MATROX_MULTIHEAD=y
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_RADEON_DEBUG is not set
 # CONFIG_FB_RADEON_OLD is not set
-CONFIG_FB_RADEON_I2C=y
+# CONFIG_FB_RADEON is not set
 # CONFIG_FB_ATY128 is not set
 # CONFIG_FB_ATY is not set
-CONFIG_FB_ATY_CT=y
-CONFIG_FB_ATY_GX=y
-# CONFIG_FB_ATY_XL_INIT is not set
 # CONFIG_FB_SIS is not set
-CONFIG_FB_SIS_300=y
-CONFIG_FB_SIS_315=y
-# CONFIG_FB_NEOMAGIC is not set
 # CONFIG_FB_NEOMAGIC is not set
+CONFIG_FB_KYRO=m
 # CONFIG_FB_3DFX is not set
 # CONFIG_FB_VOODOO1 is not set
 # CONFIG_FB_TRIDENT is not set
 # CONFIG_FB_VIRTUAL is not set
-CONFIG_FB_KYRO=m
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_PM2_FIFO_DISCONNECT is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_HGA_ACCEL is not set
-# CONFIG_FB_3DFX_ACCEL is not set
-# CONFIG_FB_TRIDENT_ACCEL is not set
-CONFIG_FB_CIRRUS=m
 
 #
 # Console display driver support
 #
 CONFIG_VGA_CONSOLE=y
-# CONFIG_MDA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 # CONFIG_FONTS is not set
-
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
 
 #
 # Logo configuration
@@ -1742,20 +1545,27 @@ CONFIG_SOUND=m
 # Advanced Linux Sound Architecture
 #
 CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_HWDEP=m
+CONFIG_SND_RAWMIDI=m
 CONFIG_SND_SEQUENCER=m
 CONFIG_SND_SEQ_DUMMY=m
 CONFIG_SND_OSSEMUL=y
 CONFIG_SND_MIXER_OSS=m
 CONFIG_SND_PCM_OSS=m
 CONFIG_SND_SEQUENCER_OSS=y
+CONFIG_SND_BIT32_EMUL=m
 CONFIG_SND_RTCTIMER=m
 # CONFIG_SND_VERBOSE_PRINTK is not set
 # CONFIG_SND_DEBUG is not set
-CONFIG_SND_BIT32_EMUL=y
 
 #
 # Generic devices
 #
+CONFIG_SND_MPU401_UART=m
+CONFIG_SND_OPL3_LIB=m
+CONFIG_SND_VX_LIB=m
 CONFIG_SND_DUMMY=m
 CONFIG_SND_VIRMIDI=m
 CONFIG_SND_MTPAV=m
@@ -1763,47 +1573,23 @@ CONFIG_SND_MTPAV=m
 CONFIG_SND_MPU401=m
 
 #
-# ISA devices
-#
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SB16_CSP=y
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-
-#
 # PCI devices
 #
+CONFIG_SND_AC97_CODEC=m
 CONFIG_SND_ALI5451=m
+CONFIG_SND_ATIIXP=m
+CONFIG_SND_ATIIXP_MODEM=m
+CONFIG_SND_AU8810=m
+CONFIG_SND_AU8820=m
+CONFIG_SND_AU8830=m
 CONFIG_SND_AZT3328=m
+CONFIG_SND_BT87X=m
 CONFIG_SND_CS46XX=m
 CONFIG_SND_CS46XX_NEW_DSP=y
 CONFIG_SND_CS4281=m
 CONFIG_SND_EMU10K1=m
 CONFIG_SND_KORG1212=m
+CONFIG_SND_MIXART=m
 CONFIG_SND_NM256=m
 CONFIG_SND_RME32=m
 CONFIG_SND_RME96=m
@@ -1819,23 +1605,14 @@ CONFIG_SND_ES1938=m
 CONFIG_SND_ES1968=m
 CONFIG_SND_MAESTRO3=m
 CONFIG_SND_FM801=m
+CONFIG_SND_FM801_TEA575X=m
 CONFIG_SND_ICE1712=m
 CONFIG_SND_ICE1724=m
 CONFIG_SND_INTEL8X0=m
+CONFIG_SND_INTEL8X0M=m
 CONFIG_SND_SONICVIBES=m
 CONFIG_SND_VIA82XX=m
 CONFIG_SND_VX222=m
-CONFIG_SND_BT87X=m
-CONFIG_SND_ATIIXP=m
-CONFIG_SND_ATIIXP_MODEM=m
-CONFIG_SND_AU8810=m
-CONFIG_SND_AU8820=m
-CONFIG_SND_AU8830=m
-CONFIG_SND_MIXART=m
-CONFIG_SND_FM801_TEA575X=m
-CONFIG_SND_INTEL8X0M=m
-CONFIG_SND_PDAUDIOCF=m
-
 
 #
 # ALSA USB devices
@@ -1846,15 +1623,11 @@ CONFIG_SND_USB_USX2Y=m
 #
 # PCMCIA devices
 #
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_VXP440 is not set
 
 #
 # Open Sound System
 #
 # CONFIG_SOUND_PRIME is not set
-# CONFIG_SOUND_BT878 is not set
-# CONFIG_SOUND_CMPCI is not set
 
 #
 # USB support
@@ -1869,6 +1642,7 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 CONFIG_USB_SUSPEND=y
+# CONFIG_USB_OTG is not set
 
 #
 # USB Host Controller Drivers
@@ -1890,9 +1664,9 @@ CONFIG_USB_UHCI_HCD=m
 CONFIG_USB_MIDI=m
 CONFIG_USB_ACM=m
 CONFIG_USB_PRINTER=m
-# CONFIG_BLK_DEV_UB is not set
 CONFIG_USB_STORAGE=m
 # CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_RW_DETECT=y
 CONFIG_USB_STORAGE_DATAFAB=y
 CONFIG_USB_STORAGE_FREECOM=y
 CONFIG_USB_STORAGE_ISD200=y
@@ -1901,7 +1675,6 @@ CONFIG_USB_STORAGE_HP8200e=y
 CONFIG_USB_STORAGE_SDDR09=y
 CONFIG_USB_STORAGE_SDDR55=y
 CONFIG_USB_STORAGE_JUMPSHOT=y
-CONFIG_USB_STORAGE_RW_DETECT=y
 
 #
 # USB Human Interface Devices (HID)
@@ -1912,18 +1685,15 @@ CONFIG_HID_FF=y
 CONFIG_HID_PID=y
 CONFIG_LOGITECH_FF=y
 CONFIG_THRUSTMASTER_FF=y
-CONFIG_USB_HIDDEV=y
-
-#
-# USB HID Boot Protocol drivers
-#
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_MOUSE is not set
+CONFIG_USB_HIDDEV=y
 CONFIG_USB_AIPTEK=m
 CONFIG_USB_WACOM=m
 CONFIG_USB_KBTAB=m
 CONFIG_USB_POWERMATE=m
+CONFIG_USB_MTOUCH=m
+CONFIG_USB_EGALAX=m
 CONFIG_USB_XPAD=m
+CONFIG_USB_ATI_REMOTE=m
 
 #
 # USB Imaging devices
@@ -1942,8 +1712,10 @@ CONFIG_USB_IBMCAM=m
 CONFIG_USB_KONICAWC=m
 CONFIG_USB_OV511=m
 CONFIG_USB_SE401=m
-CONFIG_USB_STV680=m
 CONFIG_USB_SN9C102=m
+CONFIG_USB_STV680=m
+CONFIG_USB_W9968CF=m
+CONFIG_USB_PWC=m
 
 #
 # USB Network adaptors
@@ -1953,11 +1725,11 @@ CONFIG_USB_KAWETH=m
 CONFIG_USB_PEGASUS=m
 CONFIG_USB_RTL8150=m
 CONFIG_USB_USBNET=m
-CONFIG_USB_SPEEDTOUCH=m
 
 #
 # USB Host-to-Host Cables
 #
+CONFIG_USB_ALI_M5632=y
 CONFIG_USB_AN2720=y
 CONFIG_USB_BELKIN=y
 CONFIG_USB_GENESYS=y
@@ -2019,40 +1791,38 @@ CONFIG_USB_SERIAL_SAFE_PADDED=y
 CONFIG_USB_SERIAL_CYBERJACK=m
 CONFIG_USB_SERIAL_XIRCOM=m
 CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_SERIAL_WHITEHEAT=m
 CONFIG_USB_EZUSB=y
-CONFIG_USB_EMI62=m
-CONFIG_USB_LED=m
-CONFIG_USB_G_SERIAL=m
-
 
 #
 # USB Miscellaneous drivers
 #
+CONFIG_USB_EMI62=m
 # CONFIG_USB_EMI26 is not set
 # CONFIG_USB_TIGL is not set
 CONFIG_USB_AUERSWALD=m
 CONFIG_USB_RIO500=m
-CONFIG_USB_LCD=m
-CONFIG_USB_TEST=m
-# CONFIG_USB_GADGET is not set
-# CONFIG_USB_GADGET_PXA2XX is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_SA1100 is not set
-CONFIG_USB_ZERO=m
-CONFIG_USB_ETH=m
-CONFIG_USB_GADGETFS=m
-CONFIG_USB_W9968CF=m
-CONFIG_USB_PWC=m
 CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_FILE_STORAGE=m
-# CONFIG_USB_FILE_STORAGE_TEST is not set
-CONFIG_USB_MTOUCH=m
-CONFIG_USB_ATI_REMOTE=m
-CONFIG_USB_ALI_M5632=y
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
 # CONFIG_USB_CYTHERM is not set
-CONFIG_USB_EGALAX=m
 CONFIG_USB_PHIDGETSERVO=m
+CONFIG_USB_TEST=m
+
+#
+# USB ATM/DSL drivers
+#
+CONFIG_USB_ATM=m
+CONFIG_USB_SPEEDTOUCH=m
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# Firmware Drivers
+#
+CONFIG_EDD=m
 
 #
 # File systems
@@ -2069,20 +1839,9 @@ CONFIG_JBD=m
 # CONFIG_JBD_DEBUG is not set
 CONFIG_FS_MBCACHE=y
 # CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_CHECK is not set
-CONFIG_REISERFS_PROC_INFO=y
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
 # CONFIG_JFS_FS is not set
-# CONFIG_JFS_DEBUG is not set
-# CONFIG_JFS_STATISTICS is not set
-CONFIG_JFS_POSIX_ACL=y
+CONFIG_FS_POSIX_ACL=y
 # CONFIG_XFS_FS is not set
-# CONFIG_XFS_RT is not set
-CONFIG_XFS_QUOTA=y
-CONFIG_XFS_POSIX_ACL=y
-CONFIG_XFS_SECURITY=y
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
 CONFIG_QUOTA=y
@@ -2100,6 +1859,7 @@ CONFIG_JOLIET=y
 CONFIG_ZISOFS=y
 CONFIG_ZISOFS_FS=y
 CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
 
 #
 # DOS/FAT/NT Filesystems
@@ -2116,6 +1876,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_SYSFS=y
 # CONFIG_DEVFS_FS is not set
 CONFIG_DEVPTS_FS_XATTR=y
 CONFIG_DEVPTS_FS_SECURITY=y
@@ -2129,27 +1890,27 @@ CONFIG_RAMFS=y
 #
 # Miscellaneous filesystems
 #
-# CONFIG_ADFS_FS is not seta
+# CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
-# uses sleepon and needs a major update
 CONFIG_HFS_FS=m
 CONFIG_HFSPLUS_FS=m
 # CONFIG_BEFS_FS is not set
-# CONFIG_BEFS_DEBUG is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
 CONFIG_JFFS2_FS=m
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_NAND=y
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
 CONFIG_CRAMFS=m
 CONFIG_VXFS_FS=m
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
-# CONFIG_QNX4FS_RW is not set
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is not set
-# CONFIG_UFS_FS_WRITE is not set
 
 #
 # Network File Systems
@@ -2176,17 +1937,8 @@ CONFIG_CIFS=m
 CONFIG_CIFS_XATTR=y
 CONFIG_CIFS_POSIX=y
 # CONFIG_NCP_FS is not set
-CONFIG_NCPFS_PACKET_SIGNING=y
-CONFIG_NCPFS_IOCTL_LOCKING=y
-CONFIG_NCPFS_STRONG=y
-CONFIG_NCPFS_NFS_NS=y
-CONFIG_NCPFS_OS2_NS=y
-CONFIG_NCPFS_SMALLDOS=y
-CONFIG_NCPFS_NLS=y
-CONFIG_NCPFS_EXTRAS=y
 # CONFIG_CODA_FS is not set
 # CONFIG_AFS_FS is not set
-# CONFIG_RXRPC is not set
 
 #
 # Partition Types
@@ -2207,11 +1959,11 @@ CONFIG_SGI_PARTITION=y
 # CONFIG_ULTRIX_PARTITION is not set
 CONFIG_SUN_PARTITION=y
 CONFIG_EFI_PARTITION=y
-CONFIG_NLS=y
 
 #
 # Native Language Support
 #
+CONFIG_NLS=y
 CONFIG_NLS_DEFAULT="utf8"
 CONFIG_NLS_CODEPAGE_437=y
 CONFIG_NLS_CODEPAGE_737=m
@@ -2236,6 +1988,7 @@ CONFIG_NLS_CODEPAGE_874=m
 CONFIG_NLS_ISO8859_8=m
 CONFIG_NLS_CODEPAGE_1250=m
 CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=y
 CONFIG_NLS_ISO8859_1=m
 CONFIG_NLS_ISO8859_2=m
 CONFIG_NLS_ISO8859_3=m
@@ -2250,7 +2003,6 @@ CONFIG_NLS_ISO8859_15=m
 CONFIG_NLS_KOI8_R=m
 CONFIG_NLS_KOI8_U=m
 CONFIG_NLS_UTF8=m
-CONFIG_NLS_ASCII=y
 
 #
 # Profiling support
@@ -2259,27 +2011,17 @@ CONFIG_PROFILING=y
 CONFIG_OPROFILE=m
 
 #
-# Tux
-#
-CONFIG_TUX=m
-CONFIG_TUX_EXTCGI=y
-# CONFIG_TUX_EXTENDED_LOG is not set
-# CONFIG_TUX_DEBUG is not set
-
-
-#
 # Kernel hacking
 #
 CONFIG_DEBUG_KERNEL=y
-# CONFIG_DEBUG_SLAB is not set
 CONFIG_MAGIC_SYSRQ=y
+# CONFIG_DEBUG_SLAB is not set
 CONFIG_DEBUG_SPINLOCK=y
-CONFIG_DEBUG_HIGHMEM=y
-# CONFIG_DEBUG_INFO is not set
 CONFIG_DEBUG_SPINLOCK_SLEEP=y
-# CONFIG_FRAME_POINTER is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_INFO is not set
+CONFIG_INIT_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_IOMMU_DEBUG is not set
 
 #
 # Security options
@@ -2290,13 +2032,11 @@ CONFIG_SECURITY_CAPABILITIES=y
 # CONFIG_SECURITY_ROOTPLUG is not set
 CONFIG_SECURITY_SELINUX=y
 CONFIG_SECURITY_SELINUX_BOOTPARAM=y
+CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
 CONFIG_SECURITY_SELINUX_DISABLE=y
 CONFIG_SECURITY_SELINUX_DEVELOP=y
 CONFIG_SECURITY_SELINUX_AVC_STATS=y
 # CONFIG_SECURITY_SELINUX_MLS is not set
-CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
 
 #
 # Cryptographic options
@@ -2309,6 +2049,7 @@ CONFIG_CRYPTO_MD5=m
 CONFIG_CRYPTO_SHA1=y
 CONFIG_CRYPTO_SHA256=m
 CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
 CONFIG_CRYPTO_DES=m
 CONFIG_CRYPTO_BLOWFISH=m
 CONFIG_CRYPTO_TWOFISH=m
@@ -2316,318 +2057,22 @@ CONFIG_CRYPTO_SERPENT=m
 CONFIG_CRYPTO_AES=m
 CONFIG_CRYPTO_CAST5=m
 CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_TEA=m
 CONFIG_CRYPTO_ARC4=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_DEFLATE=m
 CONFIG_CRYPTO_MICHAEL_MIC=m
-# CONFIG_CRYPTO_TEST is not set
-CONFIG_LIBCRC32C=m
 CONFIG_CRYPTO_CRC32C=m
+# CONFIG_CRYPTO_TEST is not set
+CONFIG_CRYPTO_SIGNATURE=y
 CONFIG_CRYPTO_SIGNATURE_DSA=y
 CONFIG_CRYPTO_MPILIB=y
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_WP512=m
 
 #
 # Library routines
 #
-CONFIG_CRC32=m
 CONFIG_CRC_CCITT=m
-
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=m
-CONFIG_PC=y
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_ATALK is not set
-# CONFIG_DEV_APPLETALK is not set
-# CONFIG_LTPC is not set
-# CONFIG_COPS is not set
-# CONFIG_IPX is not set
-# CONFIG_IPDDP is not set
-# CONFIG_IRDA is not set
-# CONFIG_NCP_FS is not set
-# CONFIG_ISAPNP is not set
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_EL1 is not set
-# CONFIG_EL2 is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_WD80x3 is not set
-# CONFIG_IRDA is not set
-# CONFIG_GAMEPORT is not set
-# CONFIG_DVB is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SB16_CSP=y
-# CONFIG_SND_WAVEFRONT is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-# CONFIG_WAN_ROUTER is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_BINFMT_AOUT is not set
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_GAMMA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_BLK_DEV_UMEM is not set
-# CONFIG_MWAVE is not set
-# CONFIG_ROCKETPORT is not set
-# CONFIG_R3964 is not set
-# CONFIG_TIPAR is not set
-# CONFIG_JOYSTICK_ANALOG is not set
-# CONFIG_JOYSTICK_A3D is not set
-# CONFIG_JOYSTICK_ADI is not set
-# CONFIG_JOYSTICK_COBRA is not set
-# CONFIG_JOYSTICK_GF2K is not set
-# CONFIG_JOYSTICK_GRIP is not set
-# CONFIG_JOYSTICK_GRIP_MP is not set
-# CONFIG_JOYSTICK_GUILLEMOT is not set
-# CONFIG_JOYSTICK_INTERACT is not set
-# CONFIG_JOYSTICK_SIDEWINDER is not set
-# CONFIG_JOYSTICK_TMDC is not set
-# CONFIG_JOYSTICK_IFORCE is not set
-# CONFIG_JOYSTICK_IFORCE_USB=y
-# CONFIG_JOYSTICK_IFORCE_232=y
-# CONFIG_JOYSTICK_WARRIOR is not set
-# CONFIG_JOYSTICK_MAGELLAN is not set
-# CONFIG_JOYSTICK_SPACEORB is not set
-# CONFIG_JOYSTICK_SPACEBALL is not set
-# CONFIG_JOYSTICK_STINGER is not set
-# CONFIG_JOYSTICK_TWIDDLER is not set
-# CONFIG_JOYSTICK_DB9 is not set
-# CONFIG_JOYSTICK_GAMECON is not set
-# CONFIG_JOYSTICK_TURBOGRAFX is not set
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_RADIO_MIROPCM20 is not set
-# CONFIG_RADIO_MIROPCM20_RDS is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_TYPHOON_PROC_FS=y
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_VIDEO_DEV is not set
-# CONFIG_PLIP is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_AHA1542 is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_QLOGIC_ISP is not set
-# CONFIG_VIDEO_BT848 is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_BWQCAM is not set
-# CONFIG_VIDEO_CQCAM is not set
-# CONFIG_VIDEO_W9966 is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA_PP is not set
-# CONFIG_VIDEO_CPIA_USB is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_STRADIS is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_ZORAN is not set
-# CONFIG_VIDEO_ZORAN_BUZ is not set
-# CONFIG_VIDEO_ZORAN_DC10 is not set
-# CONFIG_VIDEO_ZORAN_DC30 is not set
-# CONFIG_VIDEO_ZORAN_LML33 is not set
-# CONFIG_VIDEO_ZORAN_LML33R10 is not set
-# CONFIG_VIDEO_MEYE is not set
-# CONFIG_VIDEO_SAA7134 is not set
-# CONFIG_VIDEO_MXB is not set
-# CONFIG_VIDEO_DPC is not set
-# CONFIG_VIDEO_HEXIUM_ORION is not set
-# CONFIG_VIDEO_HEXIUM_GEMINI is not set
-# CONFIG_VIDEO_CX88 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_I82092 is not set
-# CONFIG_YELLOWFIN is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_ULTRA is not set
-# CONFIG_SKFP is not set
-# CONFIG_DE600 is not set
-# CONFIG_DE620 is not set
-# CONFIG_CS89x0 is not set
-# CONFIG_DGRS is not set
-# CONFIG_AC3200 is not set
-# CONFIG_NI52 is not set
-# CONFIG_NI65 is not set
-# CONFIG_LANCE is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_EL16 is not set
-# CONFIG_EL3 is not set
-# CONFIG_3C515 is not set
-# CONFIG_HAMACHI is not set
-# CONFIG_HP100 is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_NET_SB1000 is not set
-# CONFIG_DEPCA is not set
-# CONFIG_ATP is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_INFTL is not set
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-# CONFIG_MTD_PMC551 is not set
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-# CONFIG_MTD_PCI is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_HGA_ACCEL is not set
-# CONFIG_FB_3DFX_ACCEL is not set
-# CONFIG_FB_TRIDENT_ACCEL is not set
-# CONFIG_SCSI_DC390T is not set
-CONFIG_AUDIT=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_I2C_PCA_ISA is not set
-CONFIG_RAW_DRIVER=y
-# CONFIG_MTD_SCB2_FLASH is not set
-CONFIG_UID16=y
-# CONFIG_MK8 is not set
-# CONFIG_MPSC is not set
-CONFIG_GENERIC_CPU=y
-CONFIG_X86_MSR=y
-CONFIG_X86_CPUID=y
-CONFIG_MTRR=y
-CONFIG_NUMA=y
-CONFIG_K8_NUMA=y
-CONFIG_NR_CPUS=8
-CONFIG_GART_IOMMU=y
-CONFIG_X86_POWERNOW_K8=y
-CONFIG_IA32_EMULATION=y
-# CONFIG_IA32_AOUT is not set
-CONFIG_INIT_DEBUG=y
-# CONFIG_IOMMU_DEBUG is not set
-# CONFIG_CHECKING is not set
-CONFIG_MICROCODE=m 
-CONFIG_SWIOTLB=y
-CONFIG_X86_PM_TIMER=y
-CONFIG_I2O=m
-CONFIG_I2O_BLOCK=m
-CONFIG_I2O_SCSI=m
-CONFIG_I2O_PROC=m
-CONFIG_I2O_CONFIG=y
-CONFIG_TUX=m
-# CONFIG_UNORDERED_IO is not set
-# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
-CONFIG_X86_ACPI_CPUFREQ=y
-# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_SCHED_SMT=y
-# CONFIG_SOFTWARE_SUSPEND is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_CPU_FREQ=y
-# CONFIG_CPU_FREQ_PROC_INTF is not set
-# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
-CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
-CONFIG_CPU_FREQ_GOV_POWERSAVE=m
-CONFIG_CPU_FREQ_GOV_USERSPACE=m
-CONFIG_CPU_FREQ_GOV_ONDEMAND=m
-# CONFIG_CPU_FREQ_24_API is not set
-CONFIG_CPU_FREQ_TABLE=y
-CONFIG_ACPI=y
-CONFIG_ACPI_BOOT=y
-CONFIG_ACPI_INTERPRETER=y
-CONFIG_ACPI_SLEEP=y
-CONFIG_ACPI_AC=m
-CONFIG_ACPI_BATTERY=m
-CONFIG_ACPI_BUTTON=m
-CONFIG_ACPI_FAN=y
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_THERMAL=y
-CONFIG_ACPI_ASUS=m
-CONFIG_ACPI_TOSHIBA=m
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_BUS=y
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_PCI=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_ACPI_NUMA=y
-CONFIG_ACPI_BLACKLIST_YEAR=2001
-# CONFIG_SCHEDSTATS is not set
-CONFIG_EDD=m
-CONFIG_PCI_BIOS=y
-CONFIG_PCI_MMCONFIG=y
-CONFIG_KEXEC=y
-CONFIG_NETDUMP=m
-CONFIG_CRASH=m
-CONFIG_HOTPLUG_PCI=y
-# CONFIG_HOTPLUG_PCI_FAKE is not set
-CONFIG_HOTPLUG_PCI_COMPAQ=m
-# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set
-CONFIG_HOTPLUG_PCI_IBM=m
-CONFIG_HOTPLUG_PCI_ACPI=m 
-CONFIG_HOTPLUG_PCI_ACPI_IBM=m
-# CONFIG_HOTPLUG_PCI_CPCI is not set
-CONFIG_HOTPLUG_PCI_PCIE=m
-# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set
-CONFIG_HOTPLUG_PCI_SHPC=m
-# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set
-# CONFIG_HOTPLUG_PCI_SHPC_PHPRM_LEGACY is not set
-# CONFIG_HPET is not set
-CONFIG_PM=y
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT=m
-CONFIG_IEEE80211_WPA=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-CONFIG_IPW2100=m
-# CONFIG_IPW_DEBUG is not set
-CONFIG_IPW2100_PROMISC=y
-# CONFIG_IPW2100_LEGACY_FW_LOAD is not set
-CONFIG_IPW2200=m
-# CONFIG_SMP is not set
index f933188..f6c97b8 100644 (file)
@@ -25,7 +25,7 @@ CONFIG_NEST_LEVEL=0
 CONFIG_KERNEL_HALF_GIGS=1
 # CONFIG_HIGHMEM is not set
 # CONFIG_PROC_MM is not set
-CONFIG_KERNEL_STACK_ORDER=2
+CONFIG_KERNEL_STACK_ORDER=3
 
 #
 # Code maturity level options
index 3d554e4..9d5bee1 100644 (file)
@@ -18,7 +18,7 @@ Index: linux-stage/fs/ext3/inode.c
 ===================================================================
 --- linux-stage.orig/fs/ext3/inode.c   2005-02-25 16:47:04.415976672 +0200
 +++ linux-stage/fs/ext3/inode.c        2005-02-25 16:50:40.756087976 +0200
-@@ -2274,7 +2274,7 @@
+@@ -2274,7 +2274,7 @@ static unsigned long ext3_get_inode_bloc
   * trying to determine the inode's location on-disk and no read need be
   * performed.
   */
@@ -27,7 +27,7 @@ Index: linux-stage/fs/ext3/inode.c
                                struct ext3_iloc *iloc, int in_mem)
  {
        unsigned long block;
-@@ -2484,6 +2484,11 @@
+@@ -2484,6 +2484,11 @@ void ext3_read_inode(struct inode * inod
                ei->i_data[block] = raw_inode->i_block[block];
        INIT_LIST_HEAD(&ei->i_orphan);
  
@@ -39,7 +39,7 @@ Index: linux-stage/fs/ext3/inode.c
        if (S_ISREG(inode->i_mode)) {
                inode->i_op = &ext3_file_inode_operations;
                inode->i_fop = &ext3_file_operations;
-@@ -2619,6 +2624,9 @@
+@@ -2619,6 +2624,9 @@ static int ext3_do_update_inode(handle_t
        } else for (block = 0; block < EXT3_N_BLOCKS; block++)
                raw_inode->i_block[block] = ei->i_data[block];
  
@@ -49,6 +49,16 @@ Index: linux-stage/fs/ext3/inode.c
        BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
        rc = ext3_journal_dirty_metadata(handle, bh);
        if (!err)
+@@ -2849,7 +2857,8 @@ ext3_reserve_inode_write(handle_t *handl
+ {
+       int err = 0;
+       if (handle) {
+-              err = ext3_get_inode_loc(inode, iloc, 1);
++              err = ext3_get_inode_loc(inode, iloc, EXT3_I(inode)->i_state &
++                                                      EXT3_STATE_NEW);
+               if (!err) {
+                       BUFFER_TRACE(iloc->bh, "get_write_access");
+                       err = ext3_journal_get_write_access(handle, iloc->bh);
 Index: linux-stage/fs/ext3/xattr.c
 ===================================================================
 --- linux-stage.orig/fs/ext3/xattr.c   2005-02-25 16:47:04.422975608 +0200
@@ -112,7 +122,7 @@ Index: linux-stage/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOENT;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc, 1);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -241,7 +251,7 @@ Index: linux-stage/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return 0;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc, 1);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -379,7 +389,7 @@ Index: linux-stage/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return ret;
 +
-+      err = ext3_get_inode_loc(inode, &iloc, 1);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return -EIO;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -510,7 +520,7 @@ Index: linux-stage/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOSPC;
 +
-+      err = ext3_get_inode_loc(inode, &iloc, 1);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return err;
 +      raw_inode = ext3_raw_inode(&iloc);
index 439a08e..19f153d 100644 (file)
@@ -50,6 +50,16 @@ Index: linux-2.6.0/fs/ext3/inode.c
        BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata");
        rc = ext3_journal_dirty_metadata(handle, bh);
        if (!err)
+@@ -2849,7 +2857,8 @@ ext3_reserve_inode_write(handle_t *handl
+ {
+       int err = 0;
+       if (handle) {
+-              err = ext3_get_inode_loc(inode, iloc, 1);
++              err = ext3_get_inode_loc(inode, iloc, EXT3_I(inode)->i_state &
++                                                      EXT3_STATE_NEW);
+               if (!err) {
+                       BUFFER_TRACE(iloc->bh, "get_write_access");
+                       err = ext3_journal_get_write_access(handle, iloc->bh);
 Index: linux-2.6.0/fs/ext3/xattr.c
 ===================================================================
 --- linux-2.6.0.orig/fs/ext3/xattr.c   2003-12-30 08:33:13.000000000 +0300
@@ -113,7 +123,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOENT;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc, 1);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -242,7 +252,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return 0;
 +
-+      ret = ext3_get_inode_loc(inode, &iloc, 1);
++      ret = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (ret)
 +              return ret;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -379,7 +389,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return ret;
 +
-+      err = ext3_get_inode_loc(inode, &iloc, 1);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return -EIO;
 +      raw_inode = ext3_raw_inode(&iloc);
@@ -510,7 +520,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c
 +      if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE)
 +              return -ENOSPC;
 +
-+      err = ext3_get_inode_loc(inode, &iloc, 1);
++      err = ext3_get_inode_loc(inode, &iloc, 0);
 +      if (err)
 +              return err;
 +      raw_inode = ext3_raw_inode(&iloc);
index 5ef713b..68e52bb 100644 (file)
@@ -2,7 +2,7 @@ Index: linux-2.4.21-rhel/fs/ext3/extents.c
 ===================================================================
 --- linux-2.4.21-rhel.orig/fs/ext3/extents.c   2005-03-02 22:42:20.659360368 +0300
 +++ linux-2.4.21-rhel/fs/ext3/extents.c        2005-03-04 02:34:52.000000000 +0300
-@@ -0,0 +1,2312 @@
+@@ -0,0 +1,2318 @@
 +/*
 + * Copyright(c) 2003, 2004, 2005, Cluster File Systems, Inc, info@clusterfs.com
 + * Written by Alex Tomas <alex@clusterfs.com>
@@ -171,7 +171,9 @@ Index: linux-2.4.21-rhel/fs/ext3/extents.c
 +              goal = bg_start + colour;
 +      }
 +
++      lock_kernel();
 +      newblock = ext3_new_block(handle, inode, goal, 0, 0, err);
++      unlock_kernel();
 +      return newblock;
 +}
 +
@@ -1965,7 +1967,9 @@ Index: linux-2.4.21-rhel/fs/ext3/extents.c
 +              ex->ee_len = 1;
 +              /* allocate new block for the extent */
 +              goal = ext3_ext_find_goal(inode, path, ex->ee_block);
++              lock_kernel();
 +              ex->ee_start = ext3_new_block(handle, inode, goal, 0, 0, err);
++              unlock_kernel();
 +              if (ex->ee_start == 0) {
 +                      /* error occured: restore old extent */
 +                      ex->ee_start = newblock;
@@ -2071,7 +2075,9 @@ Index: linux-2.4.21-rhel/fs/ext3/extents.c
 +
 +      /* allocate new block */
 +      goal = ext3_ext_find_goal(inode, path, iblock);
++      lock_kernel();
 +      newblock = ext3_new_block(handle, inode, goal, 0, 0, &err);
++      unlock_kernel();
 +      if (!newblock)
 +              goto out2;
 +      ext_debug(&tree, "allocate new block: goal %d, found %d\n",
index 53cb38e..fb7d2cb 100644 (file)
@@ -2,7 +2,7 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c
 ===================================================================
 --- linux-2.4.21-suse2.orig/fs/ext3/extents.c  2003-01-30 13:24:37.000000000 +0300
 +++ linux-2.4.21-suse2/fs/ext3/extents.c       2004-11-03 00:34:45.404241880 +0300
-@@ -0,0 +1,2303 @@
+@@ -0,0 +1,2309 @@
 +/*
 + * Copyright(c) 2003, 2004, 2005, Cluster File Systems, Inc, info@clusterfs.com
 + * Written by Alex Tomas <alex@clusterfs.com>
@@ -171,7 +171,9 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c
 +              goal = bg_start + colour;
 +      }
 +
++      lock_kernel();
 +      newblock = ext3_new_block(handle, inode, goal, 0, 0, err);
++      unlock_kernel();
 +      return newblock;
 +}
 +
@@ -1965,7 +1967,9 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c
 +              ex->ee_len = 1;
 +              /* allocate new block for the extent */
 +              goal = ext3_ext_find_goal(inode, path, ex->ee_block);
++              lock_kernel();
 +              ex->ee_start = ext3_new_block(handle, inode, goal, 0, 0, err);
++              unlock_kernel();
 +              if (ex->ee_start == 0) {
 +                      /* error occured: restore old extent */
 +                      ex->ee_start = newblock;
@@ -2071,7 +2075,9 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c
 +
 +      /* allocate new block */
 +      goal = ext3_ext_find_goal(inode, path, iblock);
++      lock_kernel();
 +      newblock = ext3_new_block(handle, inode, goal, 0, 0, &err);
++      unlock_kernel();
 +      if (!newblock)
 +              goto out2;
 +      ext_debug(&tree, "allocate new block: goal %d, found %d\n",
index 3364139..7246be1 100644 (file)
@@ -2,7 +2,7 @@ Index: linux-2.4.24/fs/ext3/extents.c
 ===================================================================
 --- linux-2.4.24.orig/fs/ext3/extents.c        2003-01-30 13:24:37.000000000 +0300
 +++ linux-2.4.24/fs/ext3/extents.c     2004-11-03 00:36:44.894076664 +0300
-@@ -0,0 +1,2302 @@
+@@ -0,0 +1,2308 @@
 +/*
 + * Copyright(c) 2003, 2004, 2005, Cluster File Systems, Inc, info@clusterfs.com
 + * Written by Alex Tomas <alex@clusterfs.com>
@@ -171,7 +171,9 @@ Index: linux-2.4.24/fs/ext3/extents.c
 +              goal = bg_start + colour;
 +      }
 +
++      lock_kernel();
 +      newblock = ext3_new_block(handle, inode, goal, 0, 0, err);
++      unlock_kernel();
 +      return newblock;
 +}
 +
@@ -1964,7 +1966,9 @@ Index: linux-2.4.24/fs/ext3/extents.c
 +              ex->ee_len = 1;
 +              /* allocate new block for the extent */
 +              goal = ext3_ext_find_goal(inode, path, ex->ee_block);
++              lock_kernel();
 +              ex->ee_start = ext3_new_block(handle, inode, goal, 0, 0, err);
++              unlock_kernel();
 +              if (ex->ee_start == 0) {
 +                      /* error occured: restore old extent */
 +                      ex->ee_start = newblock;
@@ -2070,7 +2074,9 @@ Index: linux-2.4.24/fs/ext3/extents.c
 +
 +      /* allocate new block */
 +      goal = ext3_ext_find_goal(inode, path, iblock);
++      lock_kernel();
 +      newblock = ext3_new_block(handle, inode, goal, 0, 0, &err);
++      unlock_kernel();
 +      if (!newblock)
 +              goto out2;
 +      ext_debug(&tree, "allocate new block: goal %d, found %d\n",
index 11acf5c..d030f04 100644 (file)
@@ -2,7 +2,7 @@ Index: linux-2.4.29/fs/ext3/extents.c
 ===================================================================
 --- linux-2.4.29.orig/fs/ext3/extents.c        2005-05-03 16:52:08.723069952 +0300
 +++ linux-2.4.29/fs/ext3/extents.c     2005-05-03 16:52:08.802057944 +0300
-@@ -0,0 +1,2302 @@
+@@ -0,0 +1,2308 @@
 +/*
 + * Copyright(c) 2003, 2004, 2005, Cluster File Systems, Inc, info@clusterfs.com
 + * Written by Alex Tomas <alex@clusterfs.com>
@@ -171,7 +171,9 @@ Index: linux-2.4.29/fs/ext3/extents.c
 +              goal = bg_start + colour;
 +      }
 +
++      lock_kernel();
 +      newblock = ext3_new_block(handle, inode, goal, 0, 0, err);
++      unlock_kernel();
 +      return newblock;
 +}
 +
@@ -1964,7 +1966,9 @@ Index: linux-2.4.29/fs/ext3/extents.c
 +              ex->ee_len = 1;
 +              /* allocate new block for the extent */
 +              goal = ext3_ext_find_goal(inode, path, ex->ee_block);
++              lock_kernel();
 +              ex->ee_start = ext3_new_block(handle, inode, goal, 0, 0, err);
++              unlock_kernel();
 +              if (ex->ee_start == 0) {
 +                      /* error occured: restore old extent */
 +                      ex->ee_start = newblock;
@@ -2070,7 +2074,9 @@ Index: linux-2.4.29/fs/ext3/extents.c
 +
 +      /* allocate new block */
 +      goal = ext3_ext_find_goal(inode, path, iblock);
++      lock_kernel();
 +      newblock = ext3_new_block(handle, inode, goal, 0, 0, &err);
++      unlock_kernel();
 +      if (!newblock)
 +              goto out2;
 +      ext_debug(&tree, "allocate new block: goal %d, found %d\n",
diff --git a/lustre/kernel_patches/patches/ext3-ialloc-2.4.21-suse2.patch b/lustre/kernel_patches/patches/ext3-ialloc-2.4.21-suse2.patch
new file mode 100644 (file)
index 0000000..acd404e
--- /dev/null
@@ -0,0 +1,237 @@
+Index: linux-2.4.21-suse2/fs/ext3/ialloc.c
+===================================================================
+--- linux-2.4.21-suse2.orig/fs/ext3/ialloc.c   2005-08-04 09:14:23.000000000 -0600
++++ linux-2.4.21-suse2/fs/ext3/ialloc.c        2005-08-04 09:17:49.000000000 -0600
+@@ -328,19 +328,140 @@
+  * directories already is chosen.
+  *
+  * For other inodes, search forward from the parent directory's block
+- * group to find a free inode.
++ * group to find a free inode in a group with some free blocks.
+  */
++static int find_group_dir(struct super_block *sb, const struct inode *parent,
++                        struct ext3_group_desc **best_desc,
++                        struct buffer_head **best_bh)
++{
++      struct ext3_sb_info *sbi = EXT3_SB(sb);
++      int ngroups = sbi->s_groups_count;
++      int avefreei;
++      struct ext3_group_desc *desc;
++      struct buffer_head *bh;
++      int group, best_group = -1, ndir_best = 999999999;
++
++      *best_desc = NULL;
++      *best_bh = NULL;
++
++      avefreei = le32_to_cpu(sbi->s_es->s_free_inodes_count) / ngroups;
++
++      for (group = 0; group < ngroups; group++) {
++              desc = ext3_get_group_desc(sb, group, &bh);
++              if (!desc || !desc->bg_free_inodes_count)
++                      continue;
++              if (le16_to_cpu(desc->bg_free_inodes_count) < avefreei)
++                      continue;
++              if (le16_to_cpu(desc->bg_used_dirs_count) > ndir_best)
++                      continue;
++              if (!*best_desc ||
++                  (le16_to_cpu(desc->bg_free_blocks_count) >
++                   le16_to_cpu((*best_desc)->bg_free_blocks_count))) {
++                      *best_bh = bh;
++                      *best_desc = desc;
++                      best_group = group;
++                      ndir_best = le16_to_cpu(desc->bg_used_dirs_count);
++              }
++      }
++
++      return best_group;
++}
++
++static int find_group_other(struct super_block *sb, const struct inode *parent,
++                          struct ext3_group_desc **best_desc,
++                          struct buffer_head **best_bh)
++{
++      struct ext3_sb_info *sbi = EXT3_SB(sb);
++      int parent_group = EXT3_I(parent)->i_block_group;
++      int ngroups = sbi->s_groups_count;
++      int avefreeb;
++      struct ext3_group_desc *desc;
++      struct buffer_head *bh;
++      int group, i, best_group = -1;
++
++      *best_desc = NULL;
++      *best_bh = NULL;
++
++      /*
++       * Try to place the inode in its parent directory
++       */
++      group = parent_group;
++      desc = ext3_get_group_desc (sb, group, &bh);
++      if (desc && le16_to_cpu(desc->bg_free_inodes_count) &&
++          le16_to_cpu(desc->bg_free_blocks_count)) {
++              *best_desc = desc;
++              *best_bh = bh;
++              return group;
++      }
++
++      /*
++       * We're going to place this inode in a different blockgroup from its
++       * parent.  We want to cause files in a common directory to all land in
++       * the same blockgroup if it has space.  But we want files which are
++       * in a different directory which shares a blockgroup with our parent
++       * to land in a different blockgroup.
++       *
++       * So add our directory's i_ino into the starting point for the hash.
++       */
++      group = (group + parent->i_ino) % ngroups;
++
++      avefreeb = le32_to_cpu(sbi->s_es->s_free_blocks_count) /
++              sbi->s_groups_count / ngroups;
++
++      /*
++       * Use a quadratic hash to find a group with a free inode and some free
++       * blocks.
++       */
++      for (i = 1; i < ngroups; i <<= 1) {
++              group += i;
++              if (group >= ngroups)
++                      group -= ngroups;
++              desc = ext3_get_group_desc(sb, group, &bh);
++              if (!desc || !desc->bg_free_inodes_count)
++                      continue;
++              if (le16_to_cpu(desc->bg_free_blocks_count) > avefreeb) {
++                      *best_bh = bh;
++                      *best_desc = desc;
++                      return group;
++              }
++      }
++
++      /*
++       * That failed: try linear search for a group with free inodes and
++       * preferrably free blocks, returning as soon as we find a good one.
++       */
++      group = sbi->s_last_group;
++      for (i = 0; i < ngroups; i++) {
++              if (++group >= ngroups)
++                      group = 0;
++              desc = ext3_get_group_desc(sb, group, &bh);
++              if (!desc || !desc->bg_free_inodes_count)
++                      continue;
++              if (!*best_desc ||
++                  (le16_to_cpu(desc->bg_free_blocks_count) >
++                   le16_to_cpu((*best_desc)->bg_free_blocks_count))) {
++                      *best_bh = bh;
++                      *best_desc = desc;
++                      best_group = group;
++                      if (le16_to_cpu(desc->bg_free_blocks_count) >= avefreeb)
++                              break;
++              }
++      }
++      sbi->s_last_group = best_group;
++
++      return best_group;
++}
++
+ struct inode * ext3_new_inode(handle_t *handle, const struct inode * dir,
+                             int mode, unsigned long goal)
+ {
+       struct super_block * sb;
+       struct buffer_head * bh;
+       struct buffer_head * bh2;
+-      int i, j, avefreei;
++      int i, j;
+       struct inode * inode;
+       int bitmap_nr;
+       struct ext3_group_desc * gdp;
+-      struct ext3_group_desc * tmp;
+       struct ext3_super_block * es;
+       struct ext3_iloc iloc;
+       int err = 0;
+@@ -392,72 +513,10 @@
+       }
+ repeat:
+-      gdp = NULL;
+-      i = 0;
+-
+-      if (S_ISDIR(mode)) {
+-              avefreei = le32_to_cpu(es->s_free_inodes_count) /
+-                      sb->u.ext3_sb.s_groups_count;
+-              if (!gdp) {
+-                      for (j = 0; j < sb->u.ext3_sb.s_groups_count; j++) {
+-                              struct buffer_head *temp_buffer;
+-                              tmp = ext3_get_group_desc (sb, j, &temp_buffer);
+-                              if (tmp &&
+-                                  le16_to_cpu(tmp->bg_free_inodes_count) &&
+-                                  le16_to_cpu(tmp->bg_free_inodes_count) >=
+-                                                      avefreei) {
+-                                      if (!gdp || (le16_to_cpu(tmp->bg_free_blocks_count) >
+-                                              le16_to_cpu(gdp->bg_free_blocks_count))) {
+-                                              i = j;
+-                                              gdp = tmp;
+-                                              bh2 = temp_buffer;
+-                                      }
+-                              }
+-                      }
+-              }
+-      } else {
+-              /*
+-               * Try to place the inode in its parent directory
+-               */
+-              i = dir->u.ext3_i.i_block_group;
+-              tmp = ext3_get_group_desc (sb, i, &bh2);
+-              if (tmp && le16_to_cpu(tmp->bg_free_inodes_count))
+-                      gdp = tmp;
+-              else
+-              {
+-                      /*
+-                       * Use a quadratic hash to find a group with a
+-                       * free inode
+-                       */
+-                      for (j = 1; j < sb->u.ext3_sb.s_groups_count; j <<= 1) {
+-                              i += j;
+-                              if (i >= sb->u.ext3_sb.s_groups_count)
+-                                      i -= sb->u.ext3_sb.s_groups_count;
+-                              tmp = ext3_get_group_desc (sb, i, &bh2);
+-                              if (tmp &&
+-                                  le16_to_cpu(tmp->bg_free_inodes_count)) {
+-                                      gdp = tmp;
+-                                      break;
+-                              }
+-                      }
+-              }
+-              if (!gdp) {
+-                      /*
+-                       * That failed: try linear search for a free inode
+-                       */
+-                      i = dir->u.ext3_i.i_block_group + 1;
+-                      for (j = 2; j < sb->u.ext3_sb.s_groups_count; j++) {
+-                              if (++i >= sb->u.ext3_sb.s_groups_count)
+-                                      i = 0;
+-                              tmp = ext3_get_group_desc (sb, i, &bh2);
+-                              if (tmp &&
+-                                  le16_to_cpu(tmp->bg_free_inodes_count)) {
+-                                      gdp = tmp;
+-                                      break;
+-                              }
+-                      }
+-              }
+-      }
++      if (S_ISDIR(mode))
++              i = find_group_dir(sb, dir, &gdp, &bh2);
++      else
++              i = find_group_other(sb, dir, &gdp, &bh2);
+       err = -ENOSPC;
+       if (!gdp)
+Index: linux-2.4.21-suse2/include/linux/ext3_fs_sb.h
+===================================================================
+--- linux-2.4.21-suse2.orig/include/linux/ext3_fs_sb.h 2005-08-04 09:14:21.000000000 -0600
++++ linux-2.4.21-suse2/include/linux/ext3_fs_sb.h      2005-08-04 09:19:32.000000000 -0600
+@@ -45,6 +45,7 @@
+       unsigned long s_gdb_count;      /* Number of group descriptor blocks */
+       unsigned long s_desc_per_block; /* Number of group descriptors per block */
+       unsigned long s_groups_count;   /* Number of groups in the fs */
++      unsigned long s_last_group;     /* Last group used for inode allocation */
+       struct buffer_head * s_sbh;     /* Buffer containing the super block */
+       struct ext3_super_block * s_es; /* Pointer to the super block in the buffer */
+       struct buffer_head ** s_group_desc;
index f952079..76f5e21 100644 (file)
@@ -18,7 +18,7 @@ Index: linux-2.4.21-suse2/fs/ext3/inode.c
                if (ret)
                        break;
  
-@@ -3105,3 +3105,75 @@
+@@ -3105,3 +3105,80 @@
                ret = ret2;
        return ret;
  }
@@ -53,8 +53,9 @@ Index: linux-2.4.21-suse2/fs/ext3/inode.c
 +                blocks[i] = ext3_bmap(inode->i_mapping, iblock);
 +                if (blocks[i] == 0) {
 +                        failed++;
-+                        created[i] = -1;
-+                } else {
++                      if (created)
++                              created[i] = -1;
++              } else if (created) {
 +                        created[i] = 0;
 +                }
 +        }
@@ -82,10 +83,14 @@ Index: linux-2.4.21-suse2/fs/ext3/inode.c
 +                               "allocating block %ld\n", rc, iblock);
 +                        goto out;
 +                }
++              /* Unmap any metadata buffers from the block mapping, to avoid
++               * data corruption due to direct-write from Lustre being
++               * clobbered by a later flush of the blockdev metadata buffer.*/
 +                if (buffer_new(&bh))
 +                        unmap_underlying_metadata(&bh);
 +                blocks[i] = bh.b_blocknr;
-+                created[i] = 1;
++              if (created)
++                      created[i] = 1;
 +        }
 +
 + out:
index 91063b3..d2af494 100644 (file)
@@ -6,7 +6,7 @@ Index: linux-2.6.0/fs/ext3/inode.c
 ===================================================================
 --- linux-2.6.0.orig/fs/ext3/inode.c   2003-12-31 00:33:49.000000000 +0300
 +++ linux-2.6.0/fs/ext3/inode.c        2003-12-31 01:14:17.000000000 +0300
-@@ -3136,3 +3136,58 @@
+@@ -3136,3 +3136,62 @@
                ret = ret2;
        return ret;
  }
@@ -28,8 +28,9 @@ Index: linux-2.6.0/fs/ext3/inode.c
 +                blocks[i] = ext3_bmap(inode->i_mapping, iblock);
 +                if (blocks[i] == 0) {
 +                        failed++;
-+                        created[i] = -1;
-+                } else {
++                      if (created)
++                              created[i] = -1;
++              } else if (created) {
 +                        created[i] = 0;
 +                }
 +        }
@@ -53,18 +54,21 @@ Index: linux-2.6.0/fs/ext3/inode.c
 +                               "block %ld\n", iblock);
 +                        goto out;
 +                }
++              /* Unmap any metadata buffers from the block mapping, to avoid
++               * data corruption due to direct-write from Lustre being
++               * clobbered by a later flush of the blockdev metadata buffer.*/
 +                if (buffer_new(&dummy))
 +                        unmap_underlying_metadata(dummy.b_bdev,
-+                                                      dummy.b_blocknr);
++                                                      dummy.b_blocknr);
 +                blocks[i] = dummy.b_blocknr;
-+                created[i] = 1;
++              if (created)
++                      created[i] = 1;
 +        }
 +
 + out:
 +      ext3_journal_stop(handle);
 +        return rc;
 +}
-+
 Index: linux-2.6.0/fs/ext3/super.c
 ===================================================================
 --- linux-2.6.0.orig/fs/ext3/super.c   2003-12-31 00:33:49.000000000 +0300
index 675dc95..4dda8d4 100644 (file)
@@ -9,7 +9,7 @@ Index: lum/fs/ext3/inode.c
 ===================================================================
 --- lum.orig/fs/ext3/inode.c   Sat Nov 22 16:38:51 2003
 +++ lum/fs/ext3/inode.c        Fri Nov 28 00:37:18 2003
-@@ -2979,3 +2979,75 @@
+@@ -2979,3 +2979,80 @@
                ret = ret2;
        return ret;
  }
@@ -44,9 +44,10 @@ Index: lum/fs/ext3/inode.c
 +                blocks[i] = ext3_bmap(inode->i_mapping, iblock);
 +                if (blocks[i] == 0) {
 +                        failed++;
-+                        created[i] = -1;
-+                } else {
-+                        created[i] = 0;
++                      if (created)
++                              created[i] = -1;
++              } else if (created) {
++                      created[i] = 0;
 +                }
 +        }
 +
@@ -73,10 +74,14 @@ Index: lum/fs/ext3/inode.c
 +                               "allocating block %ld\n", rc, iblock);
 +                        goto out;
 +                }
++              /* Unmap any metadata buffers from the block mapping, to avoid
++               * data corruption due to direct-write from Lustre being
++               * clobbered by a later flush of the blockdev metadata buffer.*/
 +                if (buffer_new(&bh))
 +                        unmap_underlying_metadata(&bh);
 +                blocks[i] = bh.b_blocknr;
-+                created[i] = 1;
++              if (created)
++                      created[i] = 1;
 +        }
 +
 + out:
index 5c8ba4c..ca1c4a7 100644 (file)
@@ -27,7 +27,7 @@ Index: linux-2.4.18-p4smp/fs/ext3/inode.c
 ===================================================================
 --- linux-2.4.18-p4smp.orig/fs/ext3/inode.c    Thu Nov 27 22:18:40 2003
 +++ linux-2.4.18-p4smp/fs/ext3/inode.c Thu Nov 27 22:20:36 2003
-@@ -3004,3 +3004,75 @@
+@@ -3004,3 +3004,80 @@
                ret = ret2;
        return ret;
  }
@@ -35,15 +35,15 @@ Index: linux-2.4.18-p4smp/fs/ext3/inode.c
 +/* copied from fs/buffer.c */
 +static void unmap_underlying_metadata(struct buffer_head * bh)
 +{
-+        struct buffer_head *old_bh;
++      struct buffer_head *old_bh;
 +
-+        old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size);
-+        if (old_bh) {
-+                mark_buffer_clean(old_bh);
-+                wait_on_buffer(old_bh);
-+                clear_bit(BH_Req, &old_bh->b_state);
-+                __brelse(old_bh);
-+        }
++      old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size);
++      if (old_bh) {
++              mark_buffer_clean(old_bh);
++              wait_on_buffer(old_bh);
++              clear_bit(BH_Req, &old_bh->b_state);
++              __brelse(old_bh);
++      }
 +}
 +
 +int ext3_map_inode_page(struct inode *inode, struct page *page,
@@ -62,8 +62,9 @@ Index: linux-2.4.18-p4smp/fs/ext3/inode.c
 +                blocks[i] = ext3_bmap(inode->i_mapping, iblock);
 +                if (blocks[i] == 0) {
 +                        failed++;
-+                        created[i] = -1;
-+                } else {
++                      if (created)
++                              created[i] = -1;
++              } else if (created) {
 +                        created[i] = 0;
 +                }
 +        }
@@ -91,10 +92,14 @@ Index: linux-2.4.18-p4smp/fs/ext3/inode.c
 +                               "allocating block %ld\n", rc, iblock);
 +                        goto out;
 +                }
++              /* Unmap any metadata buffers from the block mapping, to avoid
++               * data corruption due to direct-write from Lustre being
++               * clobbered by a later flush of the blockdev metadata buffer.*/
 +                if (buffer_new(&bh))
 +                        unmap_underlying_metadata(&bh);
 +                blocks[i] = bh.b_blocknr;
-+                created[i] = 1;
++              if (created)
++                      created[i] = 1;
 +        }
 +
 + out:
index d38fb54..ae22210 100644 (file)
@@ -1,7 +1,7 @@
-Index: linux-2.6.5-suse/fs/ext3/mballoc.c
+Index: linux-stage/fs/ext3/mballoc.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/mballoc.c    2005-03-02 22:42:20.659360368 +0300
-+++ linux-2.6.5-suse/fs/ext3/mballoc.c 2005-03-11 16:13:13.000000000 +0300
+--- linux-stage.orig/fs/ext3/mballoc.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-stage/fs/ext3/mballoc.c      2005-07-28 16:10:14.951971768 -0400
 @@ -0,0 +1,1864 @@
 +/*
 + * Copyright(c) 2003, 2004, 2005, Cluster File Systems, Inc, info@clusterfs.com
@@ -1850,27 +1850,27 @@ Index: linux-2.6.5-suse/fs/ext3/mballoc.c
 +}
 +
 +
-+extern void ext3_free_blocks_old(handle_t *, struct inode *,
-+                              unsigned long, unsigned long);
-+void ext3_free_blocks(handle_t *handle, struct inode * inode,
++extern void ext3_free_blocks_old(handle_t *handle, struct inode *inode,
++                               unsigned long block, unsigned long count);
++void ext3_free_blocks(handle_t *handle, struct inode *inode,
 +                      unsigned long block, unsigned long count, int metadata)
 +{
 +      int freed;
 +
-+      if (!test_opt(inode->i_sb, MBALLOC))
++      if (!test_opt(inode->i_sb, MBALLOC) ||
++          EXT3_SB(inode->i_sb)->s_buddy_blocks == NULL)
 +              ext3_free_blocks_old(handle, inode, block, count);
 +      else {
-+              ext3_mb_free_blocks(handle, inode, block, count, metadata, &freed);
++              ext3_mb_free_blocks(handle, inode, block,count,metadata,&freed);
 +              if (freed)
 +                      DQUOT_FREE_BLOCK(inode, freed);
 +      }
 +      return;
 +}
-+
-Index: linux-2.6.5-suse/fs/ext3/super.c
+Index: linux-stage/fs/ext3/super.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/super.c      2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/super.c   2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/super.c   2005-07-28 16:09:49.624822080 -0400
++++ linux-stage/fs/ext3/super.c        2005-07-28 16:10:14.952971616 -0400
 @@ -389,6 +389,7 @@
        struct ext3_super_block *es = sbi->s_es;
        int i;
@@ -1921,10 +1921,10 @@ Index: linux-2.6.5-suse/fs/ext3/super.c
  
        return 0;
  
-Index: linux-2.6.5-suse/fs/ext3/Makefile
+Index: linux-stage/fs/ext3/Makefile
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/Makefile     2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/Makefile  2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/Makefile  2005-07-28 16:09:49.623822232 -0400
++++ linux-stage/fs/ext3/Makefile       2005-07-28 16:10:14.953971464 -0400
 @@ -5,7 +5,7 @@
  obj-$(CONFIG_EXT3_FS) += ext3.o
  
@@ -1934,10 +1934,10 @@ Index: linux-2.6.5-suse/fs/ext3/Makefile
  
  ext3-$(CONFIG_EXT3_FS_XATTR)   += xattr.o xattr_user.o xattr_trusted.o
  ext3-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o
-Index: linux-2.6.5-suse/fs/ext3/balloc.c
+Index: linux-stage/fs/ext3/balloc.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/balloc.c     2005-02-02 00:55:47.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/balloc.c  2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/balloc.c  2005-07-28 16:09:46.411310608 -0400
++++ linux-stage/fs/ext3/balloc.c       2005-07-28 16:10:14.954971312 -0400
 @@ -78,7 +78,7 @@
   *
   * Return buffer_head on success or NULL in case of failure.
@@ -1965,10 +1965,10 @@ Index: linux-2.6.5-suse/fs/ext3/balloc.c
                        unsigned long goal, int *errp)
  {
        struct buffer_head *bitmap_bh = NULL;
-Index: linux-2.6.5-suse/fs/ext3/namei.c
+Index: linux-stage/fs/ext3/namei.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/namei.c      2005-02-26 18:40:19.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/namei.c   2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/namei.c   2005-07-28 16:09:48.092055096 -0400
++++ linux-stage/fs/ext3/namei.c        2005-07-28 16:10:14.955971160 -0400
 @@ -1640,7 +1640,7 @@
   * If the create succeeds, we fill in the inode information
   * with d_instantiate(). 
@@ -1978,10 +1978,10 @@ Index: linux-2.6.5-suse/fs/ext3/namei.c
                struct nameidata *nd)
  {
        handle_t *handle; 
-Index: linux-2.6.5-suse/fs/ext3/inode.c
+Index: linux-stage/fs/ext3/inode.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/inode.c      2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/inode.c   2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/fs/ext3/inode.c   2005-07-28 16:09:49.622822384 -0400
++++ linux-stage/fs/ext3/inode.c        2005-07-28 16:10:14.958970704 -0400
 @@ -572,7 +572,7 @@
                ext3_journal_forget(handle, branch[i].bh);
        }
@@ -2000,7 +2000,7 @@ Index: linux-2.6.5-suse/fs/ext3/inode.c
        return err;
  }
  
-@@ -1830,7 +1830,7 @@
+@@ -1835,7 +1835,7 @@
                }
        }
  
@@ -2009,7 +2009,7 @@ Index: linux-2.6.5-suse/fs/ext3/inode.c
  }
  
  /**
-@@ -2001,7 +2001,7 @@
+@@ -2006,7 +2006,7 @@
                                ext3_journal_test_restart(handle, inode);
                        }
  
@@ -2018,11 +2018,11 @@ Index: linux-2.6.5-suse/fs/ext3/inode.c
  
                        if (parent_bh) {
                                /*
-Index: linux-2.6.5-suse/fs/ext3/extents.c
+Index: linux-stage/fs/ext3/extents.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/extents.c    2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/extents.c 2005-02-26 18:40:26.000000000 +0300
-@@ -774,7 +774,7 @@
+--- linux-stage.orig/fs/ext3/extents.c 2005-07-28 16:09:49.619822840 -0400
++++ linux-stage/fs/ext3/extents.c      2005-07-28 16:10:14.960970400 -0400
+@@ -771,7 +771,7 @@
                for (i = 0; i < depth; i++) {
                        if (!ablocks[i])
                                continue;
@@ -2031,8 +2031,8 @@ Index: linux-2.6.5-suse/fs/ext3/extents.c
                }
        }
        kfree(ablocks);
-@@ -1431,7 +1431,7 @@
-                       path->p_idx->ei_leaf);
+@@ -1428,7 +1428,7 @@
+                 path->p_idx->ei_leaf);
        bh = sb_find_get_block(tree->inode->i_sb, path->p_idx->ei_leaf);
        ext3_forget(handle, 1, tree->inode, bh, path->p_idx->ei_leaf);
 -      ext3_free_blocks(handle, tree->inode, path->p_idx->ei_leaf, 1);
@@ -2040,7 +2040,7 @@ Index: linux-2.6.5-suse/fs/ext3/extents.c
        return err;
  }
  
-@@ -1919,10 +1919,12 @@
+@@ -1913,10 +1913,12 @@
        int needed = ext3_remove_blocks_credits(tree, ex, from, to);
        handle_t *handle = ext3_journal_start(tree->inode, needed);
        struct buffer_head *bh;
@@ -2054,7 +2054,7 @@ Index: linux-2.6.5-suse/fs/ext3/extents.c
        if (from >= ex->ee_block && to == ex->ee_block + ex->ee_len - 1) {
                /* tail removal */
                unsigned long num, start;
-@@ -1934,7 +1936,7 @@
+@@ -1928,7 +1930,7 @@
                        bh = sb_find_get_block(tree->inode->i_sb, start + i);
                        ext3_forget(handle, 0, tree->inode, bh, start + i);
                }
@@ -2062,12 +2062,12 @@ Index: linux-2.6.5-suse/fs/ext3/extents.c
 +              ext3_free_blocks(handle, tree->inode, start, num, metadata);
        } else if (from == ex->ee_block && to <= ex->ee_block + ex->ee_len - 1) {
                printk("strange request: removal %lu-%lu from %u:%u\n",
-                       from, to, ex->ee_block, ex->ee_len);
-Index: linux-2.6.5-suse/fs/ext3/xattr.c
+                      from, to, ex->ee_block, ex->ee_len);
+Index: linux-stage/fs/ext3/xattr.c
 ===================================================================
---- linux-2.6.5-suse.orig/fs/ext3/xattr.c      2005-02-26 18:40:22.000000000 +0300
-+++ linux-2.6.5-suse/fs/ext3/xattr.c   2005-02-26 18:40:26.000000000 +0300
-@@ -1366,7 +1366,7 @@
+--- linux-stage.orig/fs/ext3/xattr.c   2005-07-28 16:09:48.855938968 -0400
++++ linux-stage/fs/ext3/xattr.c        2005-07-28 16:10:43.588618336 -0400
+@@ -1371,7 +1371,7 @@
                        new_bh = sb_getblk(sb, block);
                        if (!new_bh) {
  getblk_failed:
@@ -2076,7 +2076,7 @@ Index: linux-2.6.5-suse/fs/ext3/xattr.c
                                error = -EIO;
                                goto cleanup;
                        }
-@@ -1408,7 +1408,7 @@
+@@ -1411,7 +1411,7 @@
                if (HDR(old_bh)->h_refcount == cpu_to_le32(1)) {
                        /* Free the old block. */
                        ea_bdebug(old_bh, "freeing");
@@ -2085,19 +2085,19 @@ Index: linux-2.6.5-suse/fs/ext3/xattr.c
  
                        /* ext3_forget() calls bforget() for us, but we
                           let our caller release old_bh, so we need to
-@@ -1504,7 +1504,7 @@
-       lock_buffer(bh);
-       if (HDR(bh)->h_refcount == cpu_to_le32(1)) {
-               ext3_xattr_cache_remove(bh);
+@@ -1519,7 +1519,7 @@
+                       mb_cache_entry_free(ce);
+                       ce = NULL;
+               }
 -              ext3_free_blocks(handle, inode, EXT3_I(inode)->i_file_acl, 1);
 +              ext3_free_blocks(handle, inode, EXT3_I(inode)->i_file_acl, 1, 1);
                get_bh(bh);
                ext3_forget(handle, 1, inode, bh, EXT3_I(inode)->i_file_acl);
        } else {
-Index: linux-2.6.5-suse/include/linux/ext3_fs.h
+Index: linux-stage/include/linux/ext3_fs.h
 ===================================================================
---- linux-2.6.5-suse.orig/include/linux/ext3_fs.h      2005-02-26 18:40:25.000000000 +0300
-+++ linux-2.6.5-suse/include/linux/ext3_fs.h   2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/include/linux/ext3_fs.h   2005-07-28 16:09:49.626821776 -0400
++++ linux-stage/include/linux/ext3_fs.h        2005-07-28 16:10:14.962970096 -0400
 @@ -57,6 +57,14 @@
  #define ext3_debug(f, a...)   do {} while (0)
  #endif
@@ -2121,7 +2121,7 @@ Index: linux-2.6.5-suse/include/linux/ext3_fs.h
  
  /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
  #ifndef clear_opt
-@@ -698,7 +707,7 @@
+@@ -700,7 +709,7 @@
  extern unsigned long ext3_bg_num_gdb(struct super_block *sb, int group);
  extern int ext3_new_block (handle_t *, struct inode *, unsigned long, int *);
  extern void ext3_free_blocks (handle_t *, struct inode *, unsigned long,
@@ -2130,7 +2130,7 @@ Index: linux-2.6.5-suse/include/linux/ext3_fs.h
  extern unsigned long ext3_count_free_blocks (struct super_block *);
  extern void ext3_check_blocks_bitmap (struct super_block *);
  extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb,
-@@ -820,6 +829,37 @@
+@@ -822,6 +831,37 @@
  extern int ext3_ext_ioctl(struct inode *inode, struct file *filp,
                          unsigned int cmd, unsigned long arg);
  
@@ -2168,10 +2168,10 @@ Index: linux-2.6.5-suse/include/linux/ext3_fs.h
  #endif        /* __KERNEL__ */
  
  #define EXT3_IOC_CREATE_INUM                  _IOW('f', 5, long)
-Index: linux-2.6.5-suse/include/linux/ext3_fs_sb.h
+Index: linux-stage/include/linux/ext3_fs_sb.h
 ===================================================================
---- linux-2.6.5-suse.orig/include/linux/ext3_fs_sb.h   2005-02-26 18:40:20.000000000 +0300
-+++ linux-2.6.5-suse/include/linux/ext3_fs_sb.h        2005-02-26 18:40:26.000000000 +0300
+--- linux-stage.orig/include/linux/ext3_fs_sb.h        2005-07-28 16:09:48.346016488 -0400
++++ linux-stage/include/linux/ext3_fs_sb.h     2005-07-28 16:10:14.963969944 -0400
 @@ -23,10 +23,30 @@
  #define EXT_INCLUDE
  #include <linux/blockgroup_lock.h>
index 24b2595..c8b3e48 100644 (file)
@@ -4,7 +4,7 @@ Index: linux-stage/fs/ext3/mballoc.c
 +++ linux-stage/fs/ext3/mballoc.c      2005-02-25 17:28:41.859307576 +0200
 @@ -0,0 +1,1861 @@
 +/*
-+ * Copyright (c) 2003, Cluster File Systems, Inc, info@clusterfs.com
++ * Copyright(c) 2003, 2004, 2005, Cluster File Systems, Inc, info@clusterfs.com
 + * Written by Alex Tomas <alex@clusterfs.com>
 + *
 + * This program is free software; you can redistribute it and/or modify
@@ -110,7 +110,7 @@ Index: linux-stage/fs/ext3/mballoc.c
 +      struct super_block *ac_sb;
 +
 +      /* search goals */
-+struct ext3_free_extent ac_g_ex;
++      struct ext3_free_extent ac_g_ex;
 +      
 +      /* the best found extent */
 +      struct ext3_free_extent ac_b_ex;
@@ -471,7 +471,7 @@ Index: linux-stage/fs/ext3/mballoc.c
 +}
 +
 +static int mb_find_extent(struct ext3_buddy *e3b, int order, int block,
-+                              int needed, struct ext3_free_extent *ex)
++                        int needed, struct ext3_free_extent *ex)
 +{
 +      int next, max, ord;
 +      void *buddy;
@@ -1849,17 +1849,17 @@ Index: linux-stage/fs/ext3/mballoc.c
 +      return ret;
 +}
 +
-+void ext3_free_blocks(handle_t *handle, struct inode * inode,
-+                      unsigned long block, unsigned long count, int metadata)
++void ext3_free_blocks(handle_t *handle, struct inode *inode,
++                    unsigned long block, unsigned long count, int metadata)
 +{
-+      struct super_block *sb;
 +      int freed;
 +
-+      sb = inode->i_sb;
-+      if (!test_opt(sb, MBALLOC))
-+              ext3_free_blocks_sb(handle, sb, block, count, &freed);
++      if (!test_opt(inode->i_sb, MBALLOC) ||
++          EXT3_SB(inode->i_sb)->s_buddy_blocks == NULL)
++              ext3_free_blocks_sb(handle, inode->i_sb, block, count, &freed);
 +      else
-+              ext3_mb_free_blocks(handle, inode, block, count, metadata, &freed);
++              ext3_mb_free_blocks(handle, inode, block,count,metadata,&freed);
++
 +      if (freed)
 +              DQUOT_FREE_BLOCK(inode, freed);
 +      return;
diff --git a/lustre/kernel_patches/patches/kjournald_affinity.patch b/lustre/kernel_patches/patches/kjournald_affinity.patch
new file mode 100644 (file)
index 0000000..977676b
--- /dev/null
@@ -0,0 +1,52 @@
+--- linux-2.6.10.orig/fs/ext3/super.c  2004-12-24 22:35:28.000000000 +0100
++++ linux-2.6.10/fs/ext3/super.c       2005-01-18 12:27:51.896529310 +0100
+@@ -1787,6 +1787,33 @@
+       return NULL;
+ }
++#ifdef CONFIG_NUMA
++#include <linux/nodemask.h>
++#include <asm/topology.h>
++
++static int journal_node_affinity = 0;
++spinlock_t journal_node_affinity_lock = SPIN_LOCK_UNLOCKED;
++
++static void ext3_bind_journal_thread(journal_t *journal) {
++      int i, node;
++
++      spin_lock(&journal_node_affinity_lock);
++      for (i = 0; i < MAX_NUMNODES; i++) {
++              node = (journal_node_affinity + i) % MAX_NUMNODES;
++
++              if (!nr_cpus_node(node) || !node_online(node))
++                      continue;
++
++              set_cpus_allowed(journal->j_task, node_to_cpumask(node));
++              journal_node_affinity = (node + 1) % MAX_NUMNODES;
++              break;
++      }
++      spin_unlock(&journal_node_affinity_lock);
++}
++#else
++#define ext3_bind_journal_thread(journal) do {} while (0)
++#endif
++
+ static int ext3_load_journal(struct super_block * sb,
+                            struct ext3_super_block * es)
+ {
+@@ -1852,6 +1875,7 @@
+               return err;
+       }
++      ext3_bind_journal_thread(journal);
+       EXT3_SB(sb)->s_journal = journal;
+       ext3_clear_journal_err(sb, es);
+       return 0;
+@@ -1881,6 +1908,7 @@
+               return -EIO;
+       }
++      ext3_bind_journal_thread(journal);
+       EXT3_SB(sb)->s_journal = journal;
+       ext3_update_dynamic_rev(sb);
diff --git a/lustre/kernel_patches/patches/lustre-version-revert_suse.patch b/lustre/kernel_patches/patches/lustre-version-revert_suse.patch
new file mode 100644 (file)
index 0000000..7925a8b
--- /dev/null
@@ -0,0 +1,4 @@
+--- linux/include/linux/lustre_version.h       2005-06-28 12:24:04.000000000 -0400
++++ /dev/null  2004-06-24 13:56:02.000000000 -0400
+@@ -1 +0,0 @@
+-#define LUSTRE_KERNEL_VERSION 39
index 6a9810b..d01f972 100644 (file)
@@ -1,3 +1,4 @@
+Version 47: allow the ext3_map_inode_page() created param to be NULL
 Version 46: Separate ->fs_private in struct file
 Version 45: more robust and general dev_read_only for failover (b=4834)  
 Version 44: fix link_path_walk_it() oops creating .foo in deleted "." (b=5548)
@@ -20,6 +21,6 @@ Version 34: ext3 iopen assertion (b=2517), operations on deleted "." (b=2399)
 --- /dev/null  Fri Aug 30 17:31:37 2002
 +++ linux-2.4.18-18.8.0-l12-braam/include/linux/lustre_version.h       Thu Feb 13 07:58:33 2003
 @@ -0,0 +1 @@
-+#define LUSTRE_KERNEL_VERSION 46
++#define LUSTRE_KERNEL_VERSION 47
 
 _
index 52ea4e1..13c7cd7 100644 (file)
  /*
   * Look up one component of a pathname.
   * N.B. After this call _both_ fhp and resfh need an fh_put
-@@ -300,7 +422,10 @@ nfsd_setattr(struct svc_rqst *rqstp, str
+@@ -300,7 +422,12 @@ nfsd_setattr(struct svc_rqst *rqstp, str
        }
        err = nfserr_notsync;
        if (!check_guard || guardtime == inode->i_ctime) {
 -              err = notify_change(dentry, iap);
 +              if (dentry->d_inode->i_op &&dentry->d_inode->i_op->setattr_raw){
-+                      if (acc_mode & MAY_OWNER_OVERRIDE)
++                      if (accmode & MAY_OWNER_OVERRIDE)
 +                              iap->ia_valid & O_OWNER_OVERRIDE;
 +                      err = setattr_raw(dentry->d_inode, iap);
 +              } else
index d4d9be1..14c227d 100644 (file)
@@ -1,8 +1,8 @@
-Index: linux-2.6.5/arch/i386/defconfig
+Index: linux-2.6.5-7.191/arch/i386/defconfig
 ===================================================================
---- linux-2.6.5.orig/arch/i386/defconfig       2005-02-01 16:56:13.000000000 -0500
-+++ linux-2.6.5/arch/i386/defconfig    2005-05-11 12:10:12.362944128 -0400
-@@ -137,6 +137,8 @@
+--- linux-2.6.5-7.191.orig/arch/i386/defconfig 2005-06-28 12:24:26.000000000 -0400
++++ linux-2.6.5-7.191/arch/i386/defconfig      2005-07-28 14:52:52.764691504 -0400
+@@ -139,6 +139,8 @@
  CONFIG_EFI=y
  CONFIG_BOOT_IOREMAP=y
  CONFIG_REGPARM=y
@@ -11,11 +11,11 @@ Index: linux-2.6.5/arch/i386/defconfig
  
  #
  # Special options
-Index: linux-2.6.5/arch/i386/Kconfig
+Index: linux-2.6.5-7.191/arch/i386/Kconfig
 ===================================================================
---- linux-2.6.5.orig/arch/i386/Kconfig 2005-05-11 12:10:10.831176992 -0400
-+++ linux-2.6.5/arch/i386/Kconfig      2005-05-11 12:10:12.363943976 -0400
-@@ -1024,6 +1024,9 @@
+--- linux-2.6.5-7.191.orig/arch/i386/Kconfig   2005-06-28 12:24:15.000000000 -0400
++++ linux-2.6.5-7.191/arch/i386/Kconfig        2005-07-28 14:52:52.765691352 -0400
+@@ -1030,6 +1030,9 @@
          a work-around for a number of buggy BIOSes. Switch this option on if
          your computer crashes instead of powering off properly.
  
@@ -25,10 +25,10 @@ Index: linux-2.6.5/arch/i386/Kconfig
  endmenu
  
  source "arch/i386/kernel/cpu/cpufreq/Kconfig"
-Index: linux-2.6.5/arch/i386/mm/hugetlbpage.c
+Index: linux-2.6.5-7.191/arch/i386/mm/hugetlbpage.c
 ===================================================================
---- linux-2.6.5.orig/arch/i386/mm/hugetlbpage.c        2005-02-01 16:56:06.000000000 -0500
-+++ linux-2.6.5/arch/i386/mm/hugetlbpage.c     2005-05-11 12:10:12.364943824 -0400
+--- linux-2.6.5-7.191.orig/arch/i386/mm/hugetlbpage.c  2005-06-28 12:24:09.000000000 -0400
++++ linux-2.6.5-7.191/arch/i386/mm/hugetlbpage.c       2005-07-28 14:52:52.766691200 -0400
 @@ -16,6 +16,7 @@
  #include <linux/err.h>
  #include <linux/sysctl.h>
@@ -45,11 +45,11 @@ Index: linux-2.6.5/arch/i386/mm/hugetlbpage.c
        unmap_hugepage_range(vma, start, start + length);
        spin_unlock(&mm->page_table_lock);
  }
-Index: linux-2.6.5/arch/ia64/defconfig
+Index: linux-2.6.5-7.191/arch/ia64/defconfig
 ===================================================================
---- linux-2.6.5.orig/arch/ia64/defconfig       2005-02-01 16:56:13.000000000 -0500
-+++ linux-2.6.5/arch/ia64/defconfig    2005-05-11 12:10:12.365943672 -0400
-@@ -100,6 +100,8 @@
+--- linux-2.6.5-7.191.orig/arch/ia64/defconfig 2005-06-28 12:24:26.000000000 -0400
++++ linux-2.6.5-7.191/arch/ia64/defconfig      2005-07-28 14:52:52.767691048 -0400
+@@ -103,6 +103,8 @@
  CONFIG_EFI_VARS=y
  CONFIG_BINFMT_ELF=y
  CONFIG_BINFMT_MISC=m
@@ -58,11 +58,11 @@ Index: linux-2.6.5/arch/ia64/defconfig
  
  #
  # Power management and ACPI
-Index: linux-2.6.5/arch/ia64/Kconfig
+Index: linux-2.6.5-7.191/arch/ia64/Kconfig
 ===================================================================
---- linux-2.6.5.orig/arch/ia64/Kconfig 2005-02-01 16:55:45.000000000 -0500
-+++ linux-2.6.5/arch/ia64/Kconfig      2005-05-11 12:10:12.366943520 -0400
-@@ -315,6 +315,8 @@
+--- linux-2.6.5-7.191.orig/arch/ia64/Kconfig   2005-06-28 12:24:20.000000000 -0400
++++ linux-2.6.5-7.191/arch/ia64/Kconfig        2005-07-28 14:52:52.768690896 -0400
+@@ -323,6 +323,8 @@
          To use this option, you have to check that the "/proc file system
          support" (CONFIG_PROC_FS) is enabled, too.
  
@@ -71,10 +71,10 @@ Index: linux-2.6.5/arch/ia64/Kconfig
  source "fs/Kconfig.binfmt"
  
  endmenu
-Index: linux-2.6.5/arch/ia64/mm/hugetlbpage.c
+Index: linux-2.6.5-7.191/arch/ia64/mm/hugetlbpage.c
 ===================================================================
---- linux-2.6.5.orig/arch/ia64/mm/hugetlbpage.c        2005-02-01 16:55:55.000000000 -0500
-+++ linux-2.6.5/arch/ia64/mm/hugetlbpage.c     2005-05-11 12:10:12.367943368 -0400
+--- linux-2.6.5-7.191.orig/arch/ia64/mm/hugetlbpage.c  2005-06-28 12:24:04.000000000 -0400
++++ linux-2.6.5-7.191/arch/ia64/mm/hugetlbpage.c       2005-07-28 14:52:52.768690896 -0400
 @@ -19,6 +19,7 @@
  #include <linux/slab.h>
  #include <linux/sysctl.h>
@@ -91,11 +91,11 @@ Index: linux-2.6.5/arch/ia64/mm/hugetlbpage.c
        unmap_hugepage_range(vma, start, start + length);
        spin_unlock(&mm->page_table_lock);
  }
-Index: linux-2.6.5/arch/x86_64/defconfig
+Index: linux-2.6.5-7.191/arch/x86_64/defconfig
 ===================================================================
---- linux-2.6.5.orig/arch/x86_64/defconfig     2005-02-01 16:56:13.000000000 -0500
-+++ linux-2.6.5/arch/x86_64/defconfig  2005-05-11 12:10:12.368943216 -0400
-@@ -89,6 +89,8 @@
+--- linux-2.6.5-7.191.orig/arch/x86_64/defconfig       2005-06-28 12:24:26.000000000 -0400
++++ linux-2.6.5-7.191/arch/x86_64/defconfig    2005-07-28 14:52:52.770690592 -0400
+@@ -91,6 +91,8 @@
  CONFIG_GART_IOMMU=y
  CONFIG_SWIOTLB=y
  CONFIG_X86_MCE=y
@@ -104,11 +104,11 @@ Index: linux-2.6.5/arch/x86_64/defconfig
  
  #
  # Power management options
-Index: linux-2.6.5/arch/x86_64/Kconfig
+Index: linux-2.6.5-7.191/arch/x86_64/Kconfig
 ===================================================================
---- linux-2.6.5.orig/arch/x86_64/Kconfig       2005-05-11 12:10:11.101135952 -0400
-+++ linux-2.6.5/arch/x86_64/Kconfig    2005-05-11 12:10:12.368943216 -0400
-@@ -329,6 +329,9 @@
+--- linux-2.6.5-7.191.orig/arch/x86_64/Kconfig 2005-06-28 12:24:23.000000000 -0400
++++ linux-2.6.5-7.191/arch/x86_64/Kconfig      2005-07-28 14:52:52.770690592 -0400
+@@ -341,6 +341,9 @@
  
  source "arch/x86_64/kernel/cpufreq/Kconfig"
  
@@ -118,10 +118,10 @@ Index: linux-2.6.5/arch/x86_64/Kconfig
  endmenu
  
  menu "Bus options (PCI etc.)"
-Index: linux-2.6.5/Documentation/vm/ioproc.txt
+Index: linux-2.6.5-7.191/Documentation/vm/ioproc.txt
 ===================================================================
---- linux-2.6.5.orig/Documentation/vm/ioproc.txt       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/Documentation/vm/ioproc.txt    2005-05-11 12:10:12.369943064 -0400
+--- linux-2.6.5-7.191.orig/Documentation/vm/ioproc.txt 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/Documentation/vm/ioproc.txt      2005-07-28 14:52:52.771690440 -0400
 @@ -0,0 +1,468 @@
 +Linux IOPROC patch overview
 +===========================
@@ -591,10 +591,10 @@ Index: linux-2.6.5/Documentation/vm/ioproc.txt
 +
 +
 +-- Last update DavidAddison - 17 Aug 2004
-Index: linux-2.6.5/drivers/net/qsnet/eip/eip_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/eip/eip_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/eip/eip_linux.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/eip/eip_linux.c      2005-05-11 12:10:12.372942608 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/eip/eip_linux.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/eip/eip_linux.c        2005-07-28 14:52:52.774689984 -0400
 @@ -0,0 +1,1576 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -2172,10 +2172,10 @@ Index: linux-2.6.5/drivers/net/qsnet/eip/eip_linux.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/eip/eip_linux.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/eip/eip_linux.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/eip/eip_linux.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/eip/eip_linux.h      2005-05-11 12:10:12.373942456 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/eip/eip_linux.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/eip/eip_linux.h        2005-07-28 14:52:52.775689832 -0400
 @@ -0,0 +1,399 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -2576,10 +2576,10 @@ Index: linux-2.6.5/drivers/net/qsnet/eip/eip_linux.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/eip/eip_stats.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/eip/eip_stats.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/eip/eip_stats.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/eip/eip_stats.c      2005-05-11 12:10:12.374942304 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/eip/eip_stats.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/eip/eip_stats.c        2005-07-28 14:52:52.776689680 -0400
 @@ -0,0 +1,375 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -2956,10 +2956,10 @@ Index: linux-2.6.5/drivers/net/qsnet/eip/eip_stats.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/eip/eip_stats.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/eip/eip_stats.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/eip/eip_stats.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/eip/eip_stats.h      2005-05-11 12:10:12.374942304 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/eip/eip_stats.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/eip/eip_stats.h        2005-07-28 14:52:52.776689680 -0400
 @@ -0,0 +1,22 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -2983,10 +2983,10 @@ Index: linux-2.6.5/drivers/net/qsnet/eip/eip_stats.h
 +void eip_stats_dump(void);
 +
 +#endif                                /* __EIP_STATS_H */
-Index: linux-2.6.5/drivers/net/qsnet/eip/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/eip/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/eip/Makefile    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/eip/Makefile 2005-05-11 12:10:12.374942304 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/eip/Makefile      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/eip/Makefile   2005-07-28 14:52:52.776689680 -0400
 @@ -0,0 +1,15 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -3003,10 +3003,10 @@ Index: linux-2.6.5/drivers/net/qsnet/eip/Makefile
 +eip-objs      := eip_linux.o eip_stats.o
 +
 +EXTRA_CFLAGS          +=  -DDEBUG -DDEBUG_PRINTF -DDEBUG_ASSERT
-Index: linux-2.6.5/drivers/net/qsnet/eip/Makefile.conf
+Index: linux-2.6.5-7.191/drivers/net/qsnet/eip/Makefile.conf
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/eip/Makefile.conf       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/eip/Makefile.conf    2005-05-11 12:10:12.375942152 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/eip/Makefile.conf 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/eip/Makefile.conf      2005-07-28 14:52:52.777689528 -0400
 @@ -0,0 +1,10 @@
 +# Flags for generating QsNet Linux Kernel Makefiles
 +MODNAME               =       eip.o
@@ -3018,16 +3018,16 @@ Index: linux-2.6.5/drivers/net/qsnet/eip/Makefile.conf
 +# EXTRALINES START
 +
 +# EXTRALINES END
-Index: linux-2.6.5/drivers/net/qsnet/eip/quadrics_version.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/eip/quadrics_version.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/eip/quadrics_version.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/eip/quadrics_version.h       2005-05-11 12:10:12.375942152 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/eip/quadrics_version.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/eip/quadrics_version.h 2005-07-28 14:52:52.777689528 -0400
 @@ -0,0 +1 @@
 +#define QUADRICS_VERSION "4.31qsnet"
-Index: linux-2.6.5/drivers/net/qsnet/elan/bitmap.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/bitmap.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/bitmap.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/bitmap.c        2005-05-11 12:10:12.375942152 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/bitmap.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/bitmap.c  2005-07-28 14:52:52.777689528 -0400
 @@ -0,0 +1,287 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -3316,10 +3316,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/bitmap.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan/capability.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/capability.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/capability.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/capability.c    2005-05-11 12:10:12.376942000 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/capability.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/capability.c      2005-07-28 14:52:52.779689224 -0400
 @@ -0,0 +1,628 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -3949,10 +3949,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/capability.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan/capability_general.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/capability_general.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/capability_general.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/capability_general.c    2005-05-11 12:10:12.377941848 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/capability_general.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/capability_general.c      2005-07-28 14:52:52.779689224 -0400
 @@ -0,0 +1,446 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -4400,10 +4400,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/capability_general.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan/device.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/device.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/device.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/device.c        2005-05-11 12:10:12.378941696 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/device.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/device.c  2005-07-28 14:52:52.780689072 -0400
 @@ -0,0 +1,147 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -4552,10 +4552,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/device.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan/devinfo.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/devinfo.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/devinfo.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/devinfo.c       2005-05-11 12:10:12.378941696 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/devinfo.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/devinfo.c 2005-07-28 14:52:52.780689072 -0400
 @@ -0,0 +1,78 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -4635,10 +4635,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/devinfo.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan/elanmod.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/elanmod.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/elanmod.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/elanmod.c       2005-05-11 12:10:12.378941696 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/elanmod.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/elanmod.c 2005-07-28 14:52:52.781688920 -0400
 @@ -0,0 +1,149 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -4789,10 +4789,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/elanmod.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan/elanmod_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/elanmod_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/elanmod_linux.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/elanmod_linux.c 2005-05-11 12:10:12.379941544 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/elanmod_linux.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/elanmod_linux.c   2005-07-28 14:52:52.781688920 -0400
 @@ -0,0 +1,410 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -5204,10 +5204,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/elanmod_linux.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/Makefile   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/Makefile        2005-05-11 12:10:12.379941544 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/Makefile     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/Makefile  2005-07-28 14:52:52.782688768 -0400
 @@ -0,0 +1,15 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -5224,10 +5224,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/Makefile
 +elan-objs     := elanmod.o device.o stats.o devinfo.o capability.o elanmod_linux.o capability_general.o bitmap.o
 +
 +EXTRA_CFLAGS          +=  -DDEBUG -DDEBUG_PRINTF -DDEBUG_ASSERT
-Index: linux-2.6.5/drivers/net/qsnet/elan/Makefile.conf
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/Makefile.conf
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/Makefile.conf      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/Makefile.conf   2005-05-11 12:10:12.380941392 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/Makefile.conf        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/Makefile.conf     2005-07-28 14:52:52.782688768 -0400
 @@ -0,0 +1,10 @@
 +# Flags for generating QsNet Linux Kernel Makefiles
 +MODNAME               =       elan.o
@@ -5239,16 +5239,16 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/Makefile.conf
 +# EXTRALINES START
 +
 +# EXTRALINES END
-Index: linux-2.6.5/drivers/net/qsnet/elan/quadrics_version.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/quadrics_version.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/quadrics_version.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/quadrics_version.h      2005-05-11 12:10:12.380941392 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/quadrics_version.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/quadrics_version.h        2005-07-28 14:52:52.782688768 -0400
 @@ -0,0 +1 @@
 +#define QUADRICS_VERSION "4.31qsnet"
-Index: linux-2.6.5/drivers/net/qsnet/elan/stats.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan/stats.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan/stats.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan/stats.c 2005-05-11 12:10:12.380941392 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan/stats.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan/stats.c   2005-07-28 14:52:52.783688616 -0400
 @@ -0,0 +1,277 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -5527,10 +5527,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan/stats.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/context.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/context.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/context.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/context.c      2005-05-11 12:10:12.384940784 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/context.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/context.c        2005-07-28 14:52:52.786688160 -0400
 @@ -0,0 +1,2101 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -7633,10 +7633,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/context.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/context_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/context_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/context_linux.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/context_linux.c        2005-05-11 12:10:12.398938656 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/context_linux.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/context_linux.c  2005-07-28 14:52:52.787688008 -0400
 @@ -0,0 +1,229 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -7867,10 +7867,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/context_linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/cproc.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/cproc.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/cproc.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/cproc.c        2005-05-11 12:10:12.399938504 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/cproc.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/cproc.c  2005-07-28 14:52:52.788687856 -0400
 @@ -0,0 +1,539 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -8411,10 +8411,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/cproc.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/dproc.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/dproc.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/dproc.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/dproc.c        2005-05-11 12:10:12.400938352 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/dproc.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/dproc.c  2005-07-28 14:52:52.789687704 -0400
 @@ -0,0 +1,553 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -8969,10 +8969,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/dproc.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/elan3mmu_generic.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/elan3mmu_generic.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/elan3mmu_generic.c        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/elan3mmu_generic.c     2005-05-11 12:10:12.405937592 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/elan3mmu_generic.c  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/elan3mmu_generic.c       2005-07-28 14:52:52.795686792 -0400
 @@ -0,0 +1,3255 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -12229,10 +12229,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/elan3mmu_generic.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/elan3mmu_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/elan3mmu_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/elan3mmu_linux.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/elan3mmu_linux.c       2005-05-11 12:10:12.406937440 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/elan3mmu_linux.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/elan3mmu_linux.c 2005-07-28 14:52:52.795686792 -0400
 @@ -0,0 +1,284 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -12518,10 +12518,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/elan3mmu_linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/elan3ops.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/elan3ops.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/elan3ops.c        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/elan3ops.c     2005-05-11 12:10:12.407937288 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/elan3ops.c  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/elan3ops.c       2005-07-28 14:52:52.796686640 -0400
 @@ -0,0 +1,170 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -12693,10 +12693,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/elan3ops.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/elandebug.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/elandebug.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/elandebug.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/elandebug.c    2005-05-11 12:10:12.407937288 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/elandebug.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/elandebug.c      2005-07-28 14:52:52.796686640 -0400
 @@ -0,0 +1,151 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -12849,10 +12849,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/elandebug.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/elandev_generic.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/elandev_generic.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/elandev_generic.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/elandev_generic.c      2005-05-11 12:10:12.410936832 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/elandev_generic.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/elandev_generic.c        2005-07-28 14:52:52.799686184 -0400
 @@ -0,0 +1,1862 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -14716,10 +14716,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/elandev_generic.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/elandev_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/elandev_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/elandev_linux.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/elandev_linux.c        2005-05-11 12:10:12.414936224 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/elandev_linux.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/elandev_linux.c  2005-07-28 14:52:52.803685576 -0400
 @@ -0,0 +1,2358 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -17079,10 +17079,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/elandev_linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/elansyscall.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/elansyscall.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/elansyscall.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/elansyscall.c  2005-05-11 12:10:12.416935920 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/elansyscall.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/elansyscall.c    2005-07-28 14:52:52.805685272 -0400
 @@ -0,0 +1,1230 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -18314,10 +18314,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/elansyscall.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/eventcookie.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/eventcookie.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/eventcookie.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/eventcookie.c  2005-05-11 12:10:12.416935920 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/eventcookie.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/eventcookie.c    2005-07-28 14:52:52.806685120 -0400
 @@ -0,0 +1,324 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -18643,10 +18643,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/eventcookie.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/iproc.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/iproc.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/iproc.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/iproc.c        2005-05-11 12:10:12.418935616 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/iproc.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/iproc.c  2005-07-28 14:52:52.808684816 -0400
 @@ -0,0 +1,925 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -19573,10 +19573,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/iproc.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/Makefile  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/Makefile       2005-05-11 12:10:12.418935616 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/Makefile    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/Makefile 2005-07-28 14:52:52.808684816 -0400
 @@ -0,0 +1,15 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -19593,10 +19593,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/Makefile
 +elan3-objs    := context.o cproc.o dproc.o elandebug.o elandev_generic.o elansyscall.o eventcookie.o iproc.o sdram.o minames.o network_error.o route_table.o tproc.o tprocinsts.o routecheck.o virtual_process.o elan3ops.o context_linux.o elandev_linux.o procfs_linux.o tproc_linux.o elan3mmu_generic.o elan3mmu_linux.o
 +
 +EXTRA_CFLAGS          +=  -DDEBUG -DDEBUG_PRINTF -DDEBUG_ASSERT
-Index: linux-2.6.5/drivers/net/qsnet/elan3/Makefile.conf
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/Makefile.conf
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/Makefile.conf     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/Makefile.conf  2005-05-11 12:10:12.419935464 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/Makefile.conf       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/Makefile.conf    2005-07-28 14:52:52.808684816 -0400
 @@ -0,0 +1,10 @@
 +# Flags for generating QsNet Linux Kernel Makefiles
 +MODNAME               =       elan3.o
@@ -19608,10 +19608,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/Makefile.conf
 +# EXTRALINES START
 +
 +# EXTRALINES END
-Index: linux-2.6.5/drivers/net/qsnet/elan3/minames.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/minames.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/minames.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/minames.c      2005-05-11 12:10:12.419935464 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/minames.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/minames.c        2005-07-28 14:52:52.809684664 -0400
 @@ -0,0 +1,38 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -19651,10 +19651,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/minames.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/network_error.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/network_error.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/network_error.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/network_error.c        2005-05-11 12:10:12.420935312 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/network_error.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/network_error.c  2005-07-28 14:52:52.810684512 -0400
 @@ -0,0 +1,777 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -20433,10 +20433,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/network_error.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/procfs_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/procfs_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/procfs_linux.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/procfs_linux.c 2005-05-11 12:10:12.421935160 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/procfs_linux.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/procfs_linux.c   2005-07-28 14:52:52.810684512 -0400
 @@ -0,0 +1,195 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -20633,16 +20633,16 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/procfs_linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/quadrics_version.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/quadrics_version.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/quadrics_version.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/quadrics_version.h     2005-05-11 12:10:12.421935160 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/quadrics_version.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/quadrics_version.h       2005-07-28 14:52:52.811684360 -0400
 @@ -0,0 +1 @@
 +#define QUADRICS_VERSION "4.31qsnet"
-Index: linux-2.6.5/drivers/net/qsnet/elan3/routecheck.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/routecheck.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/routecheck.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/routecheck.c   2005-05-11 12:10:12.422935008 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/routecheck.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/routecheck.c     2005-07-28 14:52:52.811684360 -0400
 @@ -0,0 +1,313 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -20957,10 +20957,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/routecheck.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/route_table.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/route_table.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/route_table.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/route_table.c  2005-05-11 12:10:12.423934856 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/route_table.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/route_table.c    2005-07-28 14:52:52.812684208 -0400
 @@ -0,0 +1,560 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -21522,10 +21522,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/route_table.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/sdram.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/sdram.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/sdram.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/sdram.c        2005-05-11 12:10:12.436932880 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/sdram.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/sdram.c  2005-07-28 14:52:52.814683904 -0400
 @@ -0,0 +1,807 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -22334,10 +22334,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/sdram.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/tproc.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/tproc.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/tproc.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/tproc.c        2005-05-11 12:10:12.438932576 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/tproc.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/tproc.c  2005-07-28 14:52:52.815683752 -0400
 @@ -0,0 +1,778 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -23117,10 +23117,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/tproc.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/tprocinsts.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/tprocinsts.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/tprocinsts.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/tprocinsts.c   2005-05-11 12:10:12.438932576 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/tprocinsts.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/tprocinsts.c     2005-07-28 14:52:52.816683600 -0400
 @@ -0,0 +1,401 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -23523,10 +23523,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/tprocinsts.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/tproc_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/tproc_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/tproc_linux.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/tproc_linux.c  2005-05-11 13:24:43.188275368 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/tproc_linux.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/tproc_linux.c    2005-07-28 14:52:52.817683448 -0400
 @@ -0,0 +1,215 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -23743,10 +23743,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/tproc_linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan3/virtual_process.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan3/virtual_process.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan3/virtual_process.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan3/virtual_process.c      2005-05-11 12:10:12.440932272 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan3/virtual_process.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan3/virtual_process.c        2005-07-28 14:52:52.818683296 -0400
 @@ -0,0 +1,884 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -24632,10 +24632,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan3/virtual_process.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/debug.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/debug.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/debug.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/debug.c        2005-05-11 12:10:12.441932120 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/debug.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/debug.c  2005-07-28 14:52:52.819683144 -0400
 @@ -0,0 +1,94 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -24731,10 +24731,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/debug.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/device.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/device.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/device.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/device.c       2005-05-11 12:10:12.446931360 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/device.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/device.c 2005-07-28 14:52:52.824682384 -0400
 @@ -0,0 +1,2916 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -27652,10 +27652,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/device.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/device_Linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/device_Linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/device_Linux.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/device_Linux.c 2005-05-11 12:10:12.450930752 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/device_Linux.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/device_Linux.c   2005-07-28 14:52:52.828681776 -0400
 @@ -0,0 +1,2760 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -30417,10 +30417,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/device_Linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/i2c.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/i2c.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/i2c.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/i2c.c  2005-05-11 12:10:12.450930752 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/i2c.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/i2c.c    2005-07-28 14:52:52.829681624 -0400
 @@ -0,0 +1,248 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -30670,10 +30670,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/i2c.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/intcookie.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/intcookie.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/intcookie.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/intcookie.c    2005-05-11 12:10:12.451930600 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/intcookie.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/intcookie.c      2005-07-28 14:52:52.829681624 -0400
 @@ -0,0 +1,371 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -31046,10 +31046,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/intcookie.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/Makefile  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/Makefile       2005-05-11 12:10:12.451930600 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/Makefile    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/Makefile 2005-07-28 14:52:52.830681472 -0400
 @@ -0,0 +1,15 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -31066,10 +31066,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/Makefile
 +elan4-objs    := device.o i2c.o mmu.o sdram.o debug.o routetable.o trap.o user.o user_ddcq.o regions.o intcookie.o neterr.o device_Linux.o user_Linux.o procfs_Linux.o mmu_Linux.o
 +
 +EXTRA_CFLAGS          +=  -DDEBUG -DDEBUG_PRINTF -DDEBUG_ASSERT
-Index: linux-2.6.5/drivers/net/qsnet/elan4/Makefile.conf
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/Makefile.conf
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/Makefile.conf     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/Makefile.conf  2005-05-11 12:10:12.452930448 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/Makefile.conf       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/Makefile.conf    2005-07-28 14:52:52.830681472 -0400
 @@ -0,0 +1,10 @@
 +# Flags for generating QsNet Linux Kernel Makefiles
 +MODNAME               =       elan4.o
@@ -31081,10 +31081,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/Makefile.conf
 +# EXTRALINES START
 +
 +# EXTRALINES END
-Index: linux-2.6.5/drivers/net/qsnet/elan4/mmu.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/mmu.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/mmu.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/mmu.c  2005-05-11 12:10:12.453930296 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/mmu.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/mmu.c    2005-07-28 14:52:52.832681168 -0400
 @@ -0,0 +1,862 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -31948,10 +31948,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/mmu.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/mmu_Linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/mmu_Linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/mmu_Linux.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/mmu_Linux.c    2005-05-11 12:10:12.454930144 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/mmu_Linux.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/mmu_Linux.c      2005-07-28 14:52:52.832681168 -0400
 @@ -0,0 +1,265 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -32218,10 +32218,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/mmu_Linux.c
 +
 +EXPORT_SYMBOL(elan4mmu_phys2pte);
 +EXPORT_SYMBOL(elan4mmu_pte2phys);
-Index: linux-2.6.5/drivers/net/qsnet/elan4/neterr.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/neterr.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/neterr.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/neterr.c       2005-05-11 12:10:12.455929992 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/neterr.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/neterr.c 2005-07-28 14:52:52.833681016 -0400
 @@ -0,0 +1,270 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -32493,10 +32493,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/neterr.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/procfs_Linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/procfs_Linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/procfs_Linux.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/procfs_Linux.c 2005-05-11 12:10:12.457929688 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/procfs_Linux.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/procfs_Linux.c   2005-07-28 14:52:52.835680712 -0400
 @@ -0,0 +1,1074 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -33572,16 +33572,16 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/procfs_Linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/quadrics_version.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/quadrics_version.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/quadrics_version.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/quadrics_version.h     2005-05-11 12:10:12.457929688 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/quadrics_version.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/quadrics_version.h       2005-07-28 14:52:52.835680712 -0400
 @@ -0,0 +1 @@
 +#define QUADRICS_VERSION "4.31qsnet"
-Index: linux-2.6.5/drivers/net/qsnet/elan4/regions.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/regions.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/regions.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/regions.c      2005-05-11 12:10:12.462928928 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/regions.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/regions.c        2005-07-28 14:52:52.836680560 -0400
 @@ -0,0 +1,609 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -34192,10 +34192,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/regions.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/routetable.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/routetable.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/routetable.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/routetable.c   2005-05-11 12:10:12.463928776 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/routetable.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/routetable.c     2005-07-28 14:52:52.837680408 -0400
 @@ -0,0 +1,249 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -34446,10 +34446,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/routetable.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/sdram.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/sdram.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/sdram.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/sdram.c        2005-05-11 12:10:12.464928624 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/sdram.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/sdram.c  2005-07-28 14:52:52.839680104 -0400
 @@ -0,0 +1,1039 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -35490,10 +35490,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/sdram.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/trap.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/trap.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/trap.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/trap.c 2005-05-11 12:10:12.466928320 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/trap.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/trap.c   2005-07-28 14:52:52.840679952 -0400
 @@ -0,0 +1,777 @@
 +/*
 + *    Copyright (c) 2002-2003 by Quadrics Ltd.
@@ -36272,10 +36272,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/trap.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/user.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/user.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/user.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/user.c 2005-05-11 12:10:12.471927560 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/user.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/user.c   2005-07-28 14:52:52.846679040 -0400
 @@ -0,0 +1,3362 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -39639,10 +39639,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/user.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/user_ddcq.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/user_ddcq.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/user_ddcq.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/user_ddcq.c    2005-05-11 12:10:12.472927408 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/user_ddcq.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/user_ddcq.c      2005-07-28 14:52:52.847678888 -0400
 @@ -0,0 +1,226 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -39870,10 +39870,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/user_ddcq.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/elan4/user_Linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/elan4/user_Linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/elan4/user_Linux.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/elan4/user_Linux.c   2005-05-11 12:10:12.473927256 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/elan4/user_Linux.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/elan4/user_Linux.c     2005-07-28 14:52:52.847678888 -0400
 @@ -0,0 +1,377 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -40252,10 +40252,10 @@ Index: linux-2.6.5/drivers/net/qsnet/elan4/user_Linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/asm_elan4_thread.S
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/asm_elan4_thread.S
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/asm_elan4_thread.S   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/asm_elan4_thread.S        2005-05-11 12:10:12.473927256 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/asm_elan4_thread.S     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/asm_elan4_thread.S  2005-07-28 14:52:52.848678736 -0400
 @@ -0,0 +1,78 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -40335,10 +40335,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/asm_elan4_thread.S
 +      jmpl            %r2+8, %r0                      // and return
 +       add            %sp, 192, %sp
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/assym_elan4.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/assym_elan4.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/assym_elan4.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/assym_elan4.h     2005-05-11 12:10:12.474927104 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/assym_elan4.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/assym_elan4.h       2005-07-28 14:52:52.848678736 -0400
 @@ -0,0 +1,20 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -40360,10 +40360,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/assym_elan4.h
 +#define EP4_RXD_NEXT          664
 +#define EP4_RXD_QUEUED                728
 +#define EP4_RXD_DEBUG         944
-Index: linux-2.6.5/drivers/net/qsnet/ep/cm.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/cm.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/cm.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/cm.c      2005-05-11 12:10:12.479926344 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/cm.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/cm.c        2005-07-28 14:52:52.853677976 -0400
 @@ -0,0 +1,3000 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -43365,10 +43365,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/cm.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/cm.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/cm.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/cm.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/cm.h      2005-05-11 12:10:12.480926192 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/cm.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/cm.h        2005-07-28 14:52:52.854677824 -0400
 @@ -0,0 +1,412 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -43782,10 +43782,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/cm.h
 + */
 +#endif /* __ELAN_CM_H */
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/cm_procfs.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/cm_procfs.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/cm_procfs.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/cm_procfs.c       2005-05-11 12:10:12.480926192 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/cm_procfs.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/cm_procfs.c 2005-07-28 14:52:52.855677672 -0400
 @@ -0,0 +1,254 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -44041,10 +44041,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/cm_procfs.c
 +
 +    remove_proc_entry ("machine_id",      ep_config_root);
 +}
-Index: linux-2.6.5/drivers/net/qsnet/ep/commands_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/commands_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/commands_elan4.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/commands_elan4.c  2005-05-11 12:10:12.481926040 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/commands_elan4.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/commands_elan4.c    2005-07-28 14:52:52.855677672 -0400
 @@ -0,0 +1,173 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -44219,10 +44219,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/commands_elan4.c
 +      elan4_command_write (cq, *ptr++, i);
 +}
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/conf_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/conf_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/conf_linux.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/conf_linux.c      2005-05-11 12:10:12.481926040 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/conf_linux.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/conf_linux.c        2005-07-28 14:52:52.856677520 -0400
 @@ -0,0 +1,309 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -44533,10 +44533,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/conf_linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/conf_linux.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/conf_linux.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/conf_linux.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/conf_linux.h      2005-05-11 12:10:12.482925888 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/conf_linux.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/conf_linux.h        2005-07-28 14:52:52.856677520 -0400
 @@ -0,0 +1,29 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -44567,10 +44567,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/conf_linux.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/debug.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/debug.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/debug.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/debug.c   2005-05-11 12:10:12.482925888 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/debug.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/debug.c     2005-07-28 14:52:52.857677368 -0400
 @@ -0,0 +1,145 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -44717,10 +44717,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/debug.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/debug_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/debug_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/debug_elan4.c        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/debug_elan4.c     2005-05-11 12:10:12.482925888 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/debug_elan4.c  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/debug_elan4.c       2005-07-28 14:52:52.857677368 -0400
 @@ -0,0 +1,59 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -44781,10 +44781,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/debug_elan4.c
 +    ep_display_rmap (rail->r_generic.ElanAllocator.ResourceMap);
 +}
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/debug.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/debug.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/debug.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/debug.h   2005-05-11 12:10:12.483925736 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/debug.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/debug.h     2005-07-28 14:52:52.857677368 -0400
 @@ -0,0 +1,109 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -44895,10 +44895,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/debug.h
 + */
 +#endif /* _ELAN3_EPDEBUG_H */
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_asm_elan4_thread.S
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_asm_elan4_thread.S
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcomms_asm_elan4_thread.S   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcomms_asm_elan4_thread.S        2005-05-11 12:10:12.483925736 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcomms_asm_elan4_thread.S     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_asm_elan4_thread.S  2005-07-28 14:52:52.858677216 -0400
 @@ -0,0 +1,133 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -45033,10 +45033,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_asm_elan4_thread.S
 +      jmpl            %r7+8, %r0                      // and return
 +       add            %sp, 192, %sp
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcomms.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcomms.c 2005-05-11 12:10:12.484925584 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcomms.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms.c   2005-07-28 14:52:52.859677064 -0400
 @@ -0,0 +1,484 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -45522,10 +45522,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcomms_elan3.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3.c   2005-05-11 12:10:12.485925432 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcomms_elan3.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan3.c     2005-07-28 14:52:52.859677064 -0400
 @@ -0,0 +1,191 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -45718,10 +45718,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan3.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcomms_elan3.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3.h   2005-05-11 12:10:12.485925432 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcomms_elan3.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan3.h     2005-07-28 14:52:52.860676912 -0400
 @@ -0,0 +1,330 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -46053,10 +46053,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3.h
 + * End:
 + */
 +#endif /* __EPCOMMS_ELAN3_H */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3_thread.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan3_thread.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcomms_elan3_thread.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3_thread.c    2005-05-11 12:10:12.486925280 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcomms_elan3_thread.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan3_thread.c      2005-07-28 14:52:52.861676760 -0400
 @@ -0,0 +1,296 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -46354,10 +46354,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan3_thread.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcomms_elan4.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4.c   2005-05-11 12:10:12.487925128 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcomms_elan4.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan4.c     2005-07-28 14:52:52.862676608 -0400
 @@ -0,0 +1,392 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -46751,10 +46751,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan4.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcomms_elan4.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4.h   2005-05-11 12:10:12.488924976 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcomms_elan4.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan4.h     2005-07-28 14:52:52.863676456 -0400
 @@ -0,0 +1,470 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -47226,10 +47226,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4.h
 + * End:
 + */
 +#endif /* __EPCOMMS_ELAN4_H */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4_thread.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan4_thread.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcomms_elan4_thread.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4_thread.c    2005-05-11 12:10:12.489924824 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcomms_elan4_thread.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcomms_elan4_thread.c      2005-07-28 14:52:52.864676304 -0400
 @@ -0,0 +1,346 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -47577,10 +47577,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcomms_elan4_thread.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsFwd.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsFwd.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcommsFwd.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcommsFwd.c      2005-05-11 12:10:12.490924672 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcommsFwd.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsFwd.c        2005-07-28 14:52:52.864676304 -0400
 @@ -0,0 +1,310 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -47892,10 +47892,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsFwd.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsRx.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsRx.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcommsRx.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcommsRx.c       2005-05-11 12:10:12.492924368 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcommsRx.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsRx.c 2005-07-28 14:52:52.866676000 -0400
 @@ -0,0 +1,1205 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -49102,10 +49102,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsRx.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsRx_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsRx_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcommsRx_elan3.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcommsRx_elan3.c 2005-05-11 12:10:12.495923912 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcommsRx_elan3.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsRx_elan3.c   2005-07-28 14:52:52.870675392 -0400
 @@ -0,0 +1,1776 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -50883,10 +50883,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsRx_elan3.c
 +    /* EP3_RCVR_RAIL * ep4rcvr_rail = (EP3_RCVR_RAIL *) rcvr_rail; */
 +}
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsRx_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsRx_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcommsRx_elan4.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcommsRx_elan4.c 2005-05-11 12:10:12.499923304 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcommsRx_elan4.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsRx_elan4.c   2005-07-28 14:52:52.874674784 -0400
 @@ -0,0 +1,1758 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -52646,10 +52646,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsRx_elan4.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsTx.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsTx.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcommsTx.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcommsTx.c       2005-05-11 12:10:12.501923000 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcommsTx.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsTx.c 2005-07-28 14:52:52.876674480 -0400
 @@ -0,0 +1,919 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -53570,10 +53570,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsTx.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsTx_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsTx_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcommsTx_elan3.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcommsTx_elan3.c 2005-05-11 12:10:12.503922696 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcommsTx_elan3.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsTx_elan3.c   2005-07-28 14:52:52.878674176 -0400
 @@ -0,0 +1,1173 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -54748,10 +54748,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsTx_elan3.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsTx_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsTx_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/epcommsTx_elan4.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/epcommsTx_elan4.c 2005-05-11 12:10:12.506922240 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/epcommsTx_elan4.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/epcommsTx_elan4.c   2005-07-28 14:52:52.881673720 -0400
 @@ -0,0 +1,1389 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -56142,10 +56142,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/epcommsTx_elan4.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/ep_procfs.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/ep_procfs.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/ep_procfs.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/ep_procfs.c       2005-05-11 12:10:12.506922240 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/ep_procfs.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/ep_procfs.c 2005-07-28 14:52:52.881673720 -0400
 @@ -0,0 +1,331 @@
 +
 +/*
@@ -56478,10 +56478,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/ep_procfs.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/kalloc.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kalloc.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kalloc.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kalloc.c  2005-05-11 12:10:12.507922088 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kalloc.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kalloc.c    2005-07-28 14:52:52.882673568 -0400
 @@ -0,0 +1,677 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -57160,10 +57160,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kalloc.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kcomm.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kcomm.c   2005-05-11 12:10:12.510921632 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kcomm.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm.c     2005-07-28 14:52:52.885673112 -0400
 @@ -0,0 +1,1448 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -58613,10 +58613,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kcomm_elan3.c        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan3.c     2005-05-11 12:10:12.522919808 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kcomm_elan3.c  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_elan3.c       2005-07-28 14:52:52.886672960 -0400
 @@ -0,0 +1,504 @@
 +
 +/*
@@ -59122,10 +59122,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan3.c
 +    /* no stats here yet */
 +    /* EP3_RAIL *ep3rail = (EP3_RAIL *)r; */
 +}
-Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan3.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_elan3.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kcomm_elan3.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan3.h     2005-05-11 12:10:12.523919656 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kcomm_elan3.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_elan3.h       2005-07-28 14:52:52.887672808 -0400
 @@ -0,0 +1,431 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -59558,10 +59558,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan3.h
 +#endif /* !defined(__ELAN3__) */
 +
 +#endif /* __EP_KCOMM_ELAN3_H */
-Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kcomm_elan4.c        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan4.c     2005-05-11 12:10:12.524919504 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kcomm_elan4.c  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_elan4.c       2005-07-28 14:52:52.888672656 -0400
 @@ -0,0 +1,526 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -60089,10 +60089,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan4.c
 +    /* no stats here yet */
 +    /* EP4_RAIL *ep4rail = (EP4_RAIL *)r; */
 +}
-Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan4.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_elan4.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kcomm_elan4.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan4.h     2005-05-11 12:10:12.525919352 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kcomm_elan4.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_elan4.h       2005-07-28 14:52:52.889672504 -0400
 @@ -0,0 +1,443 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -60537,10 +60537,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_elan4.h
 +#endif /* ! defined(__elan4__) */
 +
 +#endif /* __EP_KCOMM_ELAN4_H */
-Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_vp.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_vp.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kcomm_vp.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kcomm_vp.h        2005-05-11 12:10:12.525919352 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kcomm_vp.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kcomm_vp.h  2005-07-28 14:52:52.889672504 -0400
 @@ -0,0 +1,36 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -60578,10 +60578,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kcomm_vp.h
 +#endif /* __EP_KCOMM_VP_H */
 +
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/kmap.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kmap.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kmap.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kmap.c    2005-05-11 12:10:12.526919200 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kmap.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kmap.c      2005-07-28 14:52:52.890672352 -0400
 @@ -0,0 +1,561 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -61144,10 +61144,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kmap.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/kmap_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kmap_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kmap_elan3.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kmap_elan3.c      2005-05-11 12:10:12.527919048 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kmap_elan3.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kmap_elan3.c        2005-07-28 14:52:52.891672200 -0400
 @@ -0,0 +1,209 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -61358,10 +61358,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kmap_elan3.c
 +    for (i = (npages * ELAN3_PTES_PER_PAGE) - 1; i >= 0; i--)
 +      elan3_writepte (rail->Device, ptep[i], tpte);
 +}
-Index: linux-2.6.5/drivers/net/qsnet/ep/kmap_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kmap_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kmap_elan4.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kmap_elan4.c      2005-05-11 12:10:12.528918896 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kmap_elan4.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kmap_elan4.c        2005-07-28 14:52:52.892672048 -0400
 @@ -0,0 +1,226 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -61589,10 +61589,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kmap_elan4.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/kmsg_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kmsg_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kmsg_elan3.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kmsg_elan3.c      2005-05-11 12:10:12.529918744 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kmsg_elan3.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kmsg_elan3.c        2005-07-28 14:52:52.892672048 -0400
 @@ -0,0 +1,345 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -61939,10 +61939,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kmsg_elan3.c
 +
 +    return TRUE;
 +}
-Index: linux-2.6.5/drivers/net/qsnet/ep/kmsg_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kmsg_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kmsg_elan4.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kmsg_elan4.c      2005-05-11 12:10:12.530918592 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kmsg_elan4.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kmsg_elan4.c        2005-07-28 14:52:52.893671896 -0400
 @@ -0,0 +1,418 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -62362,10 +62362,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kmsg_elan4.c
 +
 +    return 1;
 +}
-Index: linux-2.6.5/drivers/net/qsnet/ep/kthread.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kthread.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kthread.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kthread.c 2005-05-11 12:10:12.530918592 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kthread.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kthread.c   2005-07-28 14:52:52.894671744 -0400
 @@ -0,0 +1,186 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -62553,10 +62553,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kthread.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/kthread.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/kthread.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/kthread.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/kthread.h 2005-05-11 12:10:12.530918592 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/kthread.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/kthread.h   2005-07-28 14:52:52.894671744 -0400
 @@ -0,0 +1,53 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -62611,10 +62611,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/kthread.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/Makefile     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/Makefile  2005-05-11 12:10:12.531918440 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/Makefile       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/Makefile    2005-07-28 14:52:52.894671744 -0400
 @@ -0,0 +1,17 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -62633,10 +62633,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/Makefile
 +ep-objs       := cm.o debug.o kalloc.o kcomm.o kmap.o kthread.o neterr.o nmh.o probenetwork.o railhints.o rmap.o statemap.o support.o threadcode.o epcomms.o epcommsRx.o epcommsTx.o epcommsFwd.o conf_linux.o procfs_linux.o ep_procfs.o cm_procfs.o $(ep3-$(CONFIG_EP)) $(ep4-$(CONFIG_EP))
 +
 +EXTRA_CFLAGS          +=  -DDEBUG -DDEBUG_PRINTF -DDEBUG_ASSERT
-Index: linux-2.6.5/drivers/net/qsnet/ep/Makefile.conf
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/Makefile.conf
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/Makefile.conf        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/Makefile.conf     2005-05-11 12:10:12.531918440 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/Makefile.conf  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/Makefile.conf       2005-07-28 14:52:52.895671592 -0400
 @@ -0,0 +1,12 @@
 +# Flags for generating QsNet Linux Kernel Makefiles
 +MODNAME               =       ep.o
@@ -62650,10 +62650,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/Makefile.conf
 +ep3-$(CONFIG_ELAN3)   := kcomm_elan3.o kmsg_elan3.o kmap_elan3.o neterr_elan3.o probenetwork_elan3.o support_elan3.o threadcode_elan3.o threadcode_elan3_Linux.o epcomms_elan3.o epcommsTx_elan3.o epcommsRx_elan3.o
 +ep4-$(CONFIG_ELAN4)   := kcomm_elan4.o kmsg_elan4.o kmap_elan4.o neterr_elan4.o probenetwork_elan4.o commands_elan4.o debug_elan4.o support_elan4.o threadcode_elan4_Linux.o epcomms_elan4.o epcommsTx_elan4.o epcommsRx_elan4.o
 +# EXTRALINES END
-Index: linux-2.6.5/drivers/net/qsnet/ep/neterr.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/neterr.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/neterr.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/neterr.c  2005-05-11 12:10:12.531918440 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/neterr.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/neterr.c    2005-07-28 14:52:52.895671592 -0400
 @@ -0,0 +1,82 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -62737,10 +62737,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/neterr.c
 + * End:
 + */
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/neterr_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/neterr_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/neterr_elan3.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/neterr_elan3.c    2005-05-11 12:10:12.532918288 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/neterr_elan3.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/neterr_elan3.c      2005-07-28 14:52:52.896671440 -0400
 @@ -0,0 +1,326 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -63068,10 +63068,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/neterr_elan3.c
 + * End:
 + */
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/neterr_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/neterr_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/neterr_elan4.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/neterr_elan4.c    2005-05-11 12:10:12.533918136 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/neterr_elan4.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/neterr_elan4.c      2005-07-28 14:52:52.896671440 -0400
 @@ -0,0 +1,251 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -63324,10 +63324,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/neterr_elan4.c
 + * End:
 + */
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/nmh.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/nmh.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/nmh.c        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/nmh.c     2005-05-11 12:10:12.533918136 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/nmh.c  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/nmh.c       2005-07-28 14:52:52.897671288 -0400
 @@ -0,0 +1,181 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -63510,10 +63510,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/nmh.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/probenetwork.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/probenetwork.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/probenetwork.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/probenetwork.c    2005-05-11 12:10:12.534917984 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/probenetwork.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/probenetwork.c      2005-07-28 14:52:52.898671136 -0400
 @@ -0,0 +1,446 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -63961,10 +63961,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/probenetwork.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/probenetwork_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/probenetwork_elan3.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan3.c      2005-05-11 12:10:12.535917832 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/probenetwork_elan3.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/probenetwork_elan3.c        2005-07-28 14:52:52.898671136 -0400
 @@ -0,0 +1,298 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -64264,10 +64264,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan3.c
 +    return updated;
 +}
 +
-Index: linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan3_thread.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/probenetwork_elan3_thread.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/probenetwork_elan3_thread.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan3_thread.c       2005-05-11 12:10:12.535917832 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/probenetwork_elan3_thread.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/probenetwork_elan3_thread.c 2005-07-28 14:52:52.899670984 -0400
 @@ -0,0 +1,98 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -64367,10 +64367,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan3_thread.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/probenetwork_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/probenetwork_elan4.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan4.c      2005-05-11 12:10:12.536917680 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/probenetwork_elan4.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/probenetwork_elan4.c        2005-07-28 14:52:52.900670832 -0400
 @@ -0,0 +1,396 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -64768,10 +64768,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/probenetwork_elan4.c
 +
 +    return 0;
 +}
-Index: linux-2.6.5/drivers/net/qsnet/ep/procfs_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/procfs_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/procfs_linux.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/procfs_linux.c    2005-05-11 12:10:12.537917528 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/procfs_linux.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/procfs_linux.c      2005-07-28 14:52:52.901670680 -0400
 @@ -0,0 +1,693 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -65466,16 +65466,16 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/procfs_linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/quadrics_version.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/quadrics_version.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/quadrics_version.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/quadrics_version.h        2005-05-11 12:10:12.538917376 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/quadrics_version.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/quadrics_version.h  2005-07-28 14:52:52.901670680 -0400
 @@ -0,0 +1 @@
 +#define QUADRICS_VERSION "4.31qsnet"
-Index: linux-2.6.5/drivers/net/qsnet/ep/railhints.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/railhints.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/railhints.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/railhints.c       2005-05-11 12:10:12.538917376 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/railhints.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/railhints.c 2005-07-28 14:52:52.902670528 -0400
 @@ -0,0 +1,103 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -65580,10 +65580,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/railhints.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/rmap.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/rmap.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/rmap.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/rmap.c    2005-05-11 12:10:12.539917224 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/rmap.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/rmap.c      2005-07-28 14:52:52.902670528 -0400
 @@ -0,0 +1,365 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -65950,10 +65950,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/rmap.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/spinlock_elan3_thread.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/spinlock_elan3_thread.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/spinlock_elan3_thread.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/spinlock_elan3_thread.c   2005-05-11 12:10:12.539917224 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/spinlock_elan3_thread.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/spinlock_elan3_thread.c     2005-07-28 14:52:52.903670376 -0400
 @@ -0,0 +1,44 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -65999,10 +65999,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/spinlock_elan3_thread.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/statemap.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/statemap.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/statemap.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/statemap.c        2005-05-11 12:10:12.540917072 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/statemap.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/statemap.c  2005-07-28 14:52:52.903670376 -0400
 @@ -0,0 +1,385 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -66389,10 +66389,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/statemap.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/statusmon.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/statusmon.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/statusmon.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/statusmon.h       2005-05-11 12:10:12.540917072 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/statusmon.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/statusmon.h 2005-07-28 14:52:52.904670224 -0400
 @@ -0,0 +1,44 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -66438,10 +66438,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/statusmon.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/support.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/support.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/support.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/support.c 2005-05-11 12:10:12.540917072 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/support.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/support.c   2005-07-28 14:52:52.904670224 -0400
 @@ -0,0 +1,109 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -66552,10 +66552,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/support.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/support_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/support_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/support_elan3.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/support_elan3.c   2005-05-11 12:10:12.544916464 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/support_elan3.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/support_elan3.c     2005-07-28 14:52:52.908669616 -0400
 @@ -0,0 +1,2111 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -68668,10 +68668,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/support_elan3.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/support_elan4.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/support_elan4.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/support_elan4.c      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/support_elan4.c   2005-05-11 12:10:12.546916160 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/support_elan4.c        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/support_elan4.c     2005-07-28 14:52:52.910669312 -0400
 @@ -0,0 +1,1184 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -69857,10 +69857,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/support_elan4.c
 +    }
 +    spin_unlock_irqrestore (&rail->r_dma_lock, flags);
 +}
-Index: linux-2.6.5/drivers/net/qsnet/ep/threadcode.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/threadcode.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/threadcode.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/threadcode.c      2005-05-11 12:10:12.546916160 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/threadcode.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/threadcode.c        2005-07-28 14:52:52.911669160 -0400
 @@ -0,0 +1,146 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -70008,10 +70008,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/threadcode.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan3.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/threadcode_elan3.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/threadcode_elan3.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan3.c        2005-05-11 12:10:12.547916008 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/threadcode_elan3.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/threadcode_elan3.c  2005-07-28 14:52:52.911669160 -0400
 @@ -0,0 +1,85 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -70098,10 +70098,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan3.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan3_Linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/threadcode_elan3_Linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/threadcode_elan3_Linux.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan3_Linux.c  2005-05-11 12:10:12.547916008 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/threadcode_elan3_Linux.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/threadcode_elan3_Linux.c    2005-07-28 14:52:52.912669008 -0400
 @@ -0,0 +1,112 @@
 +/* --------------------------------------------------------*/
 +/* MACHINE GENERATED ELAN CODE                             */
@@ -70215,10 +70215,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan3_Linux.c
 +   threadcode_elan3_rodata_size,
 +   threadcode_elan3_symbols,
 +};
-Index: linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan4_Linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/ep/threadcode_elan4_Linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/ep/threadcode_elan4_Linux.c     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan4_Linux.c  2005-05-11 12:10:12.548915856 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/ep/threadcode_elan4_Linux.c       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/ep/threadcode_elan4_Linux.c    2005-07-28 14:52:52.912669008 -0400
 @@ -0,0 +1,112 @@
 +/* --------------------------------------------------------*/
 +/* MACHINE GENERATED ELAN CODE                             */
@@ -70332,10 +70332,10 @@ Index: linux-2.6.5/drivers/net/qsnet/ep/threadcode_elan4_Linux.c
 +   threadcode_elan4_rodata_size,
 +   threadcode_elan4_symbols,
 +};
-Index: linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/jtag/jtagdrv.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/jtag/jtagdrv.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv.c       2005-05-11 12:10:12.549915704 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/jtag/jtagdrv.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/jtag/jtagdrv.c 2005-07-28 14:52:52.913668856 -0400
 @@ -0,0 +1,451 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -70788,10 +70788,10 @@ Index: linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv.c
 +    LPT_WRITE_CTRL (dev, 0); DELAY(1);                                                                /* strobe low */
 +}
 +
-Index: linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/jtag/jtagdrv.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/jtag/jtagdrv.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv.h       2005-05-11 12:10:12.549915704 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/jtag/jtagdrv.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/jtag/jtagdrv.h 2005-07-28 14:52:52.914668704 -0400
 @@ -0,0 +1,57 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -70850,10 +70850,10 @@ Index: linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv.h
 +
 +
 +#endif /* __JTAGDRV_COMMON_H */
-Index: linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv_Linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/jtag/jtagdrv_Linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/jtag/jtagdrv_Linux.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv_Linux.c 2005-05-11 12:10:12.550915552 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/jtag/jtagdrv_Linux.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/jtag/jtagdrv_Linux.c   2005-07-28 14:52:52.914668704 -0400
 @@ -0,0 +1,325 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -71180,10 +71180,10 @@ Index: linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv_Linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv_Linux.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/jtag/jtagdrv_Linux.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/jtag/jtagdrv_Linux.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv_Linux.h 2005-05-11 12:10:12.550915552 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/jtag/jtagdrv_Linux.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/jtag/jtagdrv_Linux.h   2005-07-28 14:52:52.915668552 -0400
 @@ -0,0 +1,174 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -71359,10 +71359,10 @@ Index: linux-2.6.5/drivers/net/qsnet/jtag/jtagdrv_Linux.h
 +
 +
 +#endif /* __JTAGDRV_LINUX_H */
-Index: linux-2.6.5/drivers/net/qsnet/jtag/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/jtag/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/jtag/Makefile   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/jtag/Makefile        2005-05-11 12:10:12.551915400 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/jtag/Makefile     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/jtag/Makefile  2005-07-28 14:52:52.915668552 -0400
 @@ -0,0 +1,15 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -71379,10 +71379,10 @@ Index: linux-2.6.5/drivers/net/qsnet/jtag/Makefile
 +jtag-objs     := jtagdrv_Linux.o jtagdrv.o
 +
 +EXTRA_CFLAGS          +=  -DDEBUG -DDEBUG_PRINTF -DDEBUG_ASSERT
-Index: linux-2.6.5/drivers/net/qsnet/jtag/Makefile.conf
+Index: linux-2.6.5-7.191/drivers/net/qsnet/jtag/Makefile.conf
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/jtag/Makefile.conf      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/jtag/Makefile.conf   2005-05-11 12:10:12.551915400 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/jtag/Makefile.conf        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/jtag/Makefile.conf     2005-07-28 14:52:52.915668552 -0400
 @@ -0,0 +1,10 @@
 +# Flags for generating QsNet Linux Kernel Makefiles
 +MODNAME               =       jtag.o
@@ -71394,16 +71394,16 @@ Index: linux-2.6.5/drivers/net/qsnet/jtag/Makefile.conf
 +# EXTRALINES START
 +
 +# EXTRALINES END
-Index: linux-2.6.5/drivers/net/qsnet/jtag/quadrics_version.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/jtag/quadrics_version.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/jtag/quadrics_version.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/jtag/quadrics_version.h      2005-05-11 12:10:12.551915400 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/jtag/quadrics_version.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/jtag/quadrics_version.h        2005-07-28 14:52:52.915668552 -0400
 @@ -0,0 +1 @@
 +#define QUADRICS_VERSION "4.31qsnet"
-Index: linux-2.6.5/drivers/net/qsnet/Kconfig
+Index: linux-2.6.5-7.191/drivers/net/qsnet/Kconfig
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/Kconfig 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/Kconfig      2005-05-11 12:10:12.552915248 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/Kconfig   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/Kconfig        2005-07-28 14:52:52.916668400 -0400
 @@ -0,0 +1,79 @@
 +#
 +# Kconfig for Quadrics QsNet
@@ -71484,10 +71484,10 @@ Index: linux-2.6.5/drivers/net/qsnet/Kconfig
 +          For more information about JTag interface, please refer to the IEEE document on
 +          http://www.ieee.org/
 +endmenu
-Index: linux-2.6.5/drivers/net/qsnet/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/Makefile        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/Makefile     2005-05-11 12:10:12.552915248 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/Makefile  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/Makefile       2005-07-28 14:52:52.916668400 -0400
 @@ -0,0 +1,15 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -71504,10 +71504,10 @@ Index: linux-2.6.5/drivers/net/qsnet/Makefile
 +obj-$(CONFIG_EIP)       += eip/ 
 +obj-$(CONFIG_RMS)       += rms/ 
 +obj-$(CONFIG_JTAG)      += jtag/
-Index: linux-2.6.5/drivers/net/qsnet/qsnet/debug.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/qsnet/debug.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/qsnet/debug.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/qsnet/debug.c        2005-05-11 12:10:12.553915096 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/qsnet/debug.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/qsnet/debug.c  2005-07-28 14:52:52.917668248 -0400
 @@ -0,0 +1,583 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -72092,10 +72092,10 @@ Index: linux-2.6.5/drivers/net/qsnet/qsnet/debug.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/qsnet/i686_mmx.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/qsnet/i686_mmx.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/qsnet/i686_mmx.c        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/qsnet/i686_mmx.c     2005-05-11 12:10:12.553915096 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/qsnet/i686_mmx.c  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/qsnet/i686_mmx.c       2005-07-28 14:52:52.917668248 -0400
 @@ -0,0 +1,99 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -72196,10 +72196,10 @@ Index: linux-2.6.5/drivers/net/qsnet/qsnet/i686_mmx.c
 +    }
 +}
 +#endif
-Index: linux-2.6.5/drivers/net/qsnet/qsnet/kernel_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/qsnet/kernel_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/qsnet/kernel_linux.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/qsnet/kernel_linux.c 2005-05-11 12:10:12.554914944 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/qsnet/kernel_linux.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/qsnet/kernel_linux.c   2005-07-28 14:52:52.919667944 -0400
 @@ -0,0 +1,856 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -73057,10 +73057,10 @@ Index: linux-2.6.5/drivers/net/qsnet/qsnet/kernel_linux.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/qsnet/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/qsnet/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/qsnet/Makefile  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/qsnet/Makefile       2005-05-11 12:10:12.555914792 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/qsnet/Makefile    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/qsnet/Makefile 2005-07-28 14:52:52.919667944 -0400
 @@ -0,0 +1,15 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -73077,10 +73077,10 @@ Index: linux-2.6.5/drivers/net/qsnet/qsnet/Makefile
 +qsnet-objs    := debug.o kernel_linux.o i686_mmx.o
 +
 +EXTRA_CFLAGS          +=  -DDEBUG -DDEBUG_PRINTF -DDEBUG_ASSERT
-Index: linux-2.6.5/drivers/net/qsnet/qsnet/Makefile.conf
+Index: linux-2.6.5-7.191/drivers/net/qsnet/qsnet/Makefile.conf
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/qsnet/Makefile.conf     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/qsnet/Makefile.conf  2005-05-11 12:10:12.555914792 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/qsnet/Makefile.conf       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/qsnet/Makefile.conf    2005-07-28 14:52:52.919667944 -0400
 @@ -0,0 +1,10 @@
 +# Flags for generating QsNet Linux Kernel Makefiles
 +MODNAME               =       qsnet.o
@@ -73092,10 +73092,10 @@ Index: linux-2.6.5/drivers/net/qsnet/qsnet/Makefile.conf
 +# EXTRALINES START
 +
 +# EXTRALINES END
-Index: linux-2.6.5/drivers/net/qsnet/qsnet/qsnetkmem_linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/qsnet/qsnetkmem_linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/qsnet/qsnetkmem_linux.c 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/qsnet/qsnetkmem_linux.c      2005-05-11 12:10:12.555914792 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/qsnet/qsnetkmem_linux.c   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/qsnet/qsnetkmem_linux.c        2005-07-28 14:52:52.920667792 -0400
 @@ -0,0 +1,325 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -73422,16 +73422,16 @@ Index: linux-2.6.5/drivers/net/qsnet/qsnet/qsnetkmem_linux.c
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/qsnet/qsnet/quadrics_version.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/qsnet/quadrics_version.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/qsnet/quadrics_version.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/qsnet/quadrics_version.h     2005-05-11 12:10:12.556914640 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/qsnet/quadrics_version.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/qsnet/quadrics_version.h       2005-07-28 14:52:52.920667792 -0400
 @@ -0,0 +1 @@
 +#define QUADRICS_VERSION "4.31qsnet"
-Index: linux-2.6.5/drivers/net/qsnet/rms/Makefile
+Index: linux-2.6.5-7.191/drivers/net/qsnet/rms/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/rms/Makefile    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/rms/Makefile 2005-05-11 12:10:12.556914640 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/rms/Makefile      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/rms/Makefile   2005-07-28 14:52:52.920667792 -0400
 @@ -0,0 +1,15 @@
 +#
 +# Makefile for Quadrics QsNet
@@ -73448,10 +73448,10 @@ Index: linux-2.6.5/drivers/net/qsnet/rms/Makefile
 +rms-objs      := rms_kern.o rms_kern_Linux.o
 +
 +EXTRA_CFLAGS          +=  -DDEBUG -DDEBUG_PRINTF -DDEBUG_ASSERT
-Index: linux-2.6.5/drivers/net/qsnet/rms/Makefile.conf
+Index: linux-2.6.5-7.191/drivers/net/qsnet/rms/Makefile.conf
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/rms/Makefile.conf       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/rms/Makefile.conf    2005-05-11 12:10:12.556914640 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/rms/Makefile.conf 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/rms/Makefile.conf      2005-07-28 14:52:52.921667640 -0400
 @@ -0,0 +1,10 @@
 +# Flags for generating QsNet Linux Kernel Makefiles
 +MODNAME               =       rms.o
@@ -73463,16 +73463,16 @@ Index: linux-2.6.5/drivers/net/qsnet/rms/Makefile.conf
 +# EXTRALINES START
 +
 +# EXTRALINES END
-Index: linux-2.6.5/drivers/net/qsnet/rms/quadrics_version.h
+Index: linux-2.6.5-7.191/drivers/net/qsnet/rms/quadrics_version.h
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/rms/quadrics_version.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/rms/quadrics_version.h       2005-05-11 12:10:12.557914488 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/rms/quadrics_version.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/rms/quadrics_version.h 2005-07-28 14:52:52.921667640 -0400
 @@ -0,0 +1 @@
 +#define QUADRICS_VERSION "4.31qsnet"
-Index: linux-2.6.5/drivers/net/qsnet/rms/rms_kern.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/rms/rms_kern.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/rms/rms_kern.c  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/rms/rms_kern.c       2005-05-11 12:10:12.559914184 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/rms/rms_kern.c    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/rms/rms_kern.c 2005-07-28 14:52:52.923667336 -0400
 @@ -0,0 +1,1757 @@
 +/*
 + * Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -75231,10 +75231,10 @@ Index: linux-2.6.5/drivers/net/qsnet/rms/rms_kern.c
 +
 +
 +
-Index: linux-2.6.5/drivers/net/qsnet/rms/rms_kern_Linux.c
+Index: linux-2.6.5-7.191/drivers/net/qsnet/rms/rms_kern_Linux.c
 ===================================================================
---- linux-2.6.5.orig/drivers/net/qsnet/rms/rms_kern_Linux.c    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/drivers/net/qsnet/rms/rms_kern_Linux.c 2005-05-11 12:10:12.560914032 -0400
+--- linux-2.6.5-7.191.orig/drivers/net/qsnet/rms/rms_kern_Linux.c      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/drivers/net/qsnet/rms/rms_kern_Linux.c   2005-07-28 14:52:52.924667184 -0400
 @@ -0,0 +1,430 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -75666,11 +75666,11 @@ Index: linux-2.6.5/drivers/net/qsnet/rms/rms_kern_Linux.c
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/drivers/net/Kconfig
+Index: linux-2.6.5-7.191/drivers/net/Kconfig
 ===================================================================
---- linux-2.6.5.orig/drivers/net/Kconfig       2005-02-01 16:56:02.000000000 -0500
-+++ linux-2.6.5/drivers/net/Kconfig    2005-05-11 12:10:12.562913728 -0400
-@@ -2541,6 +2541,8 @@
+--- linux-2.6.5-7.191.orig/drivers/net/Kconfig 2005-06-28 12:23:55.000000000 -0400
++++ linux-2.6.5-7.191/drivers/net/Kconfig      2005-07-28 14:52:52.926666880 -0400
+@@ -2491,6 +2491,8 @@
  
  source "drivers/net/tokenring/Kconfig"
  
@@ -75679,20 +75679,20 @@ Index: linux-2.6.5/drivers/net/Kconfig
  config NET_FC
        bool "Fibre Channel driver support"
        depends on NETDEVICES && SCSI && PCI
-Index: linux-2.6.5/drivers/net/Makefile
+Index: linux-2.6.5-7.191/drivers/net/Makefile
 ===================================================================
---- linux-2.6.5.orig/drivers/net/Makefile      2005-02-01 16:56:02.000000000 -0500
-+++ linux-2.6.5/drivers/net/Makefile   2005-05-11 12:10:12.562913728 -0400
-@@ -200,3 +200,5 @@
+--- linux-2.6.5-7.191.orig/drivers/net/Makefile        2005-06-28 12:23:50.000000000 -0400
++++ linux-2.6.5-7.191/drivers/net/Makefile     2005-07-28 14:52:52.927666728 -0400
+@@ -196,3 +196,5 @@
  
  obj-$(CONFIG_NETCONSOLE) += netconsole.o
  obj-$(CONFIG_XPNET) += xpnet.o
 +
 +obj-$(CONFIG_QSNET) += qsnet/
-Index: linux-2.6.5/fs/exec.c
+Index: linux-2.6.5-7.191/fs/exec.c
 ===================================================================
---- linux-2.6.5.orig/fs/exec.c 2005-02-01 16:56:09.000000000 -0500
-+++ linux-2.6.5/fs/exec.c      2005-05-11 12:10:12.563913576 -0400
+--- linux-2.6.5-7.191.orig/fs/exec.c   2005-06-28 12:24:23.000000000 -0400
++++ linux-2.6.5-7.191/fs/exec.c        2005-07-28 14:52:52.928666576 -0400
 @@ -65,6 +65,8 @@
  #include <linux/kmod.h>
  #endif
@@ -75701,8 +75701,8 @@ Index: linux-2.6.5/fs/exec.c
 +
  int core_uses_pid;
  char core_pattern[65] = "core";
- /* The maximal length of core_pattern is also specified in sysctl.c */
-@@ -1197,6 +1199,9 @@
+ int suid_dumpable = 0;
+@@ -1202,6 +1204,9 @@
        if (retval < 0)
                goto out;
  
@@ -75712,19 +75712,19 @@ Index: linux-2.6.5/fs/exec.c
        retval = search_binary_handler(&bprm,regs);
        if (retval >= 0) {
                TRIG_EVENT(exec_hook, file->f_dentry->d_name.len,
-Index: linux-2.6.5/fs/select.c
+Index: linux-2.6.5-7.191/fs/select.c
 ===================================================================
---- linux-2.6.5.orig/fs/select.c       2005-02-01 16:55:41.000000000 -0500
-+++ linux-2.6.5/fs/select.c    2005-05-11 12:10:12.564913424 -0400
+--- linux-2.6.5-7.191.orig/fs/select.c 2005-06-28 12:24:00.000000000 -0400
++++ linux-2.6.5-7.191/fs/select.c      2005-07-28 14:52:52.928666576 -0400
 @@ -649,3 +649,4 @@
        }
        return -EIOCBRETRY;
  }
 +EXPORT_SYMBOL_GPL(sys_poll);
-Index: linux-2.6.5/fs/read_write.c
+Index: linux-2.6.5-7.191/fs/read_write.c
 ===================================================================
---- linux-2.6.5.orig/fs/read_write.c   2005-02-01 16:56:02.000000000 -0500
-+++ linux-2.6.5/fs/read_write.c        2005-05-11 14:08:49.220017400 -0400
+--- linux-2.6.5-7.191.orig/fs/read_write.c     2005-06-28 12:24:09.000000000 -0400
++++ linux-2.6.5-7.191/fs/read_write.c  2005-07-28 14:52:52.929666424 -0400
 @@ -339,6 +339,7 @@
  
        return ret;
@@ -75733,10 +75733,10 @@ Index: linux-2.6.5/fs/read_write.c
  
  asmlinkage ssize_t sys_pread64(unsigned int fd, char __user *buf,
                             size_t count, loff_t pos)
-Index: linux-2.6.5/include/elan/bitmap.h
+Index: linux-2.6.5-7.191/include/elan/bitmap.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/bitmap.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/bitmap.h  2005-05-11 12:10:12.564913424 -0400
+--- linux-2.6.5-7.191.orig/include/elan/bitmap.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/bitmap.h    2005-07-28 14:52:52.929666424 -0400
 @@ -0,0 +1,74 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -75812,10 +75812,10 @@ Index: linux-2.6.5/include/elan/bitmap.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/capability.h
+Index: linux-2.6.5-7.191/include/elan/capability.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/capability.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/capability.h      2005-05-11 12:10:12.565913272 -0400
+--- linux-2.6.5-7.191.orig/include/elan/capability.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/capability.h        2005-07-28 14:52:52.930666272 -0400
 @@ -0,0 +1,197 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -76014,10 +76014,10 @@ Index: linux-2.6.5/include/elan/capability.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/cm.h
+Index: linux-2.6.5-7.191/include/elan/cm.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/cm.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/cm.h      2005-05-11 12:10:12.566913120 -0400
+--- linux-2.6.5-7.191.orig/include/elan/cm.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/cm.h        2005-07-28 14:52:52.931666120 -0400
 @@ -0,0 +1,412 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -76431,10 +76431,10 @@ Index: linux-2.6.5/include/elan/cm.h
 + */
 +#endif /* __ELAN_CM_H */
 +
-Index: linux-2.6.5/include/elan/compat.h
+Index: linux-2.6.5-7.191/include/elan/compat.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/compat.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/compat.h  2005-05-11 12:10:12.566913120 -0400
+--- linux-2.6.5-7.191.orig/include/elan/compat.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/compat.h    2005-07-28 14:52:52.931666120 -0400
 @@ -0,0 +1,23 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -76459,10 +76459,10 @@ Index: linux-2.6.5/include/elan/compat.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/device.h
+Index: linux-2.6.5-7.191/include/elan/device.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/device.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/device.h  2005-05-11 12:10:12.566913120 -0400
+--- linux-2.6.5-7.191.orig/include/elan/device.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/device.h    2005-07-28 14:52:52.932665968 -0400
 @@ -0,0 +1,62 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -76526,10 +76526,10 @@ Index: linux-2.6.5/include/elan/device.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/devinfo.h
+Index: linux-2.6.5-7.191/include/elan/devinfo.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/devinfo.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/devinfo.h 2005-05-11 12:10:12.567912968 -0400
+--- linux-2.6.5-7.191.orig/include/elan/devinfo.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/devinfo.h   2005-07-28 14:52:52.932665968 -0400
 @@ -0,0 +1,92 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -76623,10 +76623,10 @@ Index: linux-2.6.5/include/elan/devinfo.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/elanmoddebug.h
+Index: linux-2.6.5-7.191/include/elan/elanmoddebug.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/elanmoddebug.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/elanmoddebug.h    2005-05-11 12:10:12.567912968 -0400
+--- linux-2.6.5-7.191.orig/include/elan/elanmoddebug.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/elanmoddebug.h      2005-07-28 14:52:52.932665968 -0400
 @@ -0,0 +1,63 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -76691,10 +76691,10 @@ Index: linux-2.6.5/include/elan/elanmoddebug.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/elanmod.h
+Index: linux-2.6.5-7.191/include/elan/elanmod.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/elanmod.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/elanmod.h 2005-05-11 12:10:12.567912968 -0400
+--- linux-2.6.5-7.191.orig/include/elan/elanmod.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/elanmod.h   2005-07-28 14:52:52.932665968 -0400
 @@ -0,0 +1,59 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -76755,10 +76755,10 @@ Index: linux-2.6.5/include/elan/elanmod.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/elanmod_linux.h
+Index: linux-2.6.5-7.191/include/elan/elanmod_linux.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/elanmod_linux.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/elanmod_linux.h   2005-05-11 12:10:12.568912816 -0400
+--- linux-2.6.5-7.191.orig/include/elan/elanmod_linux.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/elanmod_linux.h     2005-07-28 14:52:52.933665816 -0400
 @@ -0,0 +1,140 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -76900,10 +76900,10 @@ Index: linux-2.6.5/include/elan/elanmod_linux.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/elanmod_subsystem.h
+Index: linux-2.6.5-7.191/include/elan/elanmod_subsystem.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/elanmod_subsystem.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/elanmod_subsystem.h       2005-05-11 12:10:12.568912816 -0400
+--- linux-2.6.5-7.191.orig/include/elan/elanmod_subsystem.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/elanmod_subsystem.h 2005-07-28 14:52:52.933665816 -0400
 @@ -0,0 +1,138 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -77043,10 +77043,10 @@ Index: linux-2.6.5/include/elan/elanmod_subsystem.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/epcomms.h
+Index: linux-2.6.5-7.191/include/elan/epcomms.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/epcomms.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/epcomms.h 2005-05-11 12:10:12.569912664 -0400
+--- linux-2.6.5-7.191.orig/include/elan/epcomms.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/epcomms.h   2005-07-28 14:52:52.935665512 -0400
 @@ -0,0 +1,635 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -77683,10 +77683,10 @@ Index: linux-2.6.5/include/elan/epcomms.h
 + */
 +#endif /* __ELAN_EPCOMMS_H */
 +
-Index: linux-2.6.5/include/elan/epsvc.h
+Index: linux-2.6.5-7.191/include/elan/epsvc.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/epsvc.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/epsvc.h   2005-05-11 12:10:12.570912512 -0400
+--- linux-2.6.5-7.191.orig/include/elan/epsvc.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/epsvc.h     2005-07-28 14:52:52.935665512 -0400
 @@ -0,0 +1,36 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -77724,10 +77724,10 @@ Index: linux-2.6.5/include/elan/epsvc.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/kalloc.h
+Index: linux-2.6.5-7.191/include/elan/kalloc.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/kalloc.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/kalloc.h  2005-05-11 12:10:12.570912512 -0400
+--- linux-2.6.5-7.191.orig/include/elan/kalloc.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/kalloc.h    2005-07-28 14:52:52.935665512 -0400
 @@ -0,0 +1,108 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -77837,10 +77837,10 @@ Index: linux-2.6.5/include/elan/kalloc.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/kcomm.h
+Index: linux-2.6.5-7.191/include/elan/kcomm.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/kcomm.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/kcomm.h   2005-05-11 12:10:12.572912208 -0400
+--- linux-2.6.5-7.191.orig/include/elan/kcomm.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/kcomm.h     2005-07-28 14:52:52.937665208 -0400
 @@ -0,0 +1,839 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -78681,10 +78681,10 @@ Index: linux-2.6.5/include/elan/kcomm.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/kcomm_stats.h
+Index: linux-2.6.5-7.191/include/elan/kcomm_stats.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/kcomm_stats.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/kcomm_stats.h     2005-05-11 12:10:12.572912208 -0400
+--- linux-2.6.5-7.191.orig/include/elan/kcomm_stats.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/kcomm_stats.h       2005-07-28 14:52:52.937665208 -0400
 @@ -0,0 +1,153 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -78839,10 +78839,10 @@ Index: linux-2.6.5/include/elan/kcomm_stats.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/kmap.h
+Index: linux-2.6.5-7.191/include/elan/kmap.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/kmap.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/kmap.h    2005-05-11 12:10:12.572912208 -0400
+--- linux-2.6.5-7.191.orig/include/elan/kmap.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/kmap.h      2005-07-28 14:52:52.938665056 -0400
 @@ -0,0 +1,68 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -78912,10 +78912,10 @@ Index: linux-2.6.5/include/elan/kmap.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/kmsg.h
+Index: linux-2.6.5-7.191/include/elan/kmsg.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/kmsg.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/kmsg.h    2005-05-11 12:10:12.573912056 -0400
+--- linux-2.6.5-7.191.orig/include/elan/kmsg.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/kmsg.h      2005-07-28 14:52:52.938665056 -0400
 @@ -0,0 +1,14 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Ltd.
@@ -78931,10 +78931,10 @@ Index: linux-2.6.5/include/elan/kmsg.h
 +/*      $Source: /cvs/master/quadrics/epmod/kmsg.h,v $ */
 +
 +#endif /* __ELAN_KMSG_H */
-Index: linux-2.6.5/include/elan/kthread.h
+Index: linux-2.6.5-7.191/include/elan/kthread.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/kthread.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/kthread.h 2005-05-11 12:10:12.573912056 -0400
+--- linux-2.6.5-7.191.orig/include/elan/kthread.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/kthread.h   2005-07-28 14:52:52.938665056 -0400
 @@ -0,0 +1,53 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -78989,10 +78989,10 @@ Index: linux-2.6.5/include/elan/kthread.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/nmh.h
+Index: linux-2.6.5-7.191/include/elan/nmh.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/nmh.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/nmh.h     2005-05-11 12:10:12.573912056 -0400
+--- linux-2.6.5-7.191.orig/include/elan/nmh.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/nmh.h       2005-07-28 14:52:52.939664904 -0400
 @@ -0,0 +1,95 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -79089,10 +79089,10 @@ Index: linux-2.6.5/include/elan/nmh.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/rmap.h
+Index: linux-2.6.5-7.191/include/elan/rmap.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/rmap.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/rmap.h    2005-05-11 12:10:12.573912056 -0400
+--- linux-2.6.5-7.191.orig/include/elan/rmap.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/rmap.h      2005-07-28 14:52:52.939664904 -0400
 @@ -0,0 +1,49 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -79143,10 +79143,10 @@ Index: linux-2.6.5/include/elan/rmap.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/statemap.h
+Index: linux-2.6.5-7.191/include/elan/statemap.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/statemap.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/statemap.h        2005-05-11 12:10:12.574911904 -0400
+--- linux-2.6.5-7.191.orig/include/elan/statemap.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/statemap.h  2005-07-28 14:52:52.939664904 -0400
 @@ -0,0 +1,52 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -79200,10 +79200,10 @@ Index: linux-2.6.5/include/elan/statemap.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan/stats.h
+Index: linux-2.6.5-7.191/include/elan/stats.h
 ===================================================================
---- linux-2.6.5.orig/include/elan/stats.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan/stats.h   2005-05-11 12:10:12.574911904 -0400
+--- linux-2.6.5-7.191.orig/include/elan/stats.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan/stats.h     2005-07-28 14:52:52.939664904 -0400
 @@ -0,0 +1,85 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -79290,10 +79290,10 @@ Index: linux-2.6.5/include/elan/stats.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/compat.h
+Index: linux-2.6.5-7.191/include/elan3/compat.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/compat.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/compat.h 2005-05-11 12:10:12.575911752 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/compat.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/compat.h   2005-07-28 14:52:52.940664752 -0400
 @@ -0,0 +1,177 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -79472,10 +79472,10 @@ Index: linux-2.6.5/include/elan3/compat.h
 + * End:
 + */
 +
-Index: linux-2.6.5/include/elan3/dma.h
+Index: linux-2.6.5-7.191/include/elan3/dma.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/dma.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/dma.h    2005-05-11 12:10:12.575911752 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/dma.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/dma.h      2005-07-28 14:52:52.941664600 -0400
 @@ -0,0 +1,213 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -79690,10 +79690,10 @@ Index: linux-2.6.5/include/elan3/dma.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/e3types.h
+Index: linux-2.6.5-7.191/include/elan3/e3types.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/e3types.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/e3types.h        2005-05-11 12:10:12.582910688 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/e3types.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/e3types.h  2005-07-28 14:52:52.941664600 -0400
 @@ -0,0 +1,82 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -79777,10 +79777,10 @@ Index: linux-2.6.5/include/elan3/e3types.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elan3mmu.h
+Index: linux-2.6.5-7.191/include/elan3/elan3mmu.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elan3mmu.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elan3mmu.h       2005-05-11 12:10:12.583910536 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elan3mmu.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elan3mmu.h 2005-07-28 14:52:52.942664448 -0400
 @@ -0,0 +1,346 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -80128,10 +80128,10 @@ Index: linux-2.6.5/include/elan3/elan3mmu.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elan3mmu_linux.h
+Index: linux-2.6.5-7.191/include/elan3/elan3mmu_linux.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elan3mmu_linux.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elan3mmu_linux.h 2005-05-11 12:10:12.584910384 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elan3mmu_linux.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elan3mmu_linux.h   2005-07-28 14:52:52.942664448 -0400
 @@ -0,0 +1,39 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -80172,10 +80172,10 @@ Index: linux-2.6.5/include/elan3/elan3mmu_linux.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elan3ops.h
+Index: linux-2.6.5-7.191/include/elan3/elan3ops.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elan3ops.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elan3ops.h       2005-05-11 12:10:12.584910384 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elan3ops.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elan3ops.h 2005-07-28 14:52:52.942664448 -0400
 @@ -0,0 +1,42 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -80219,10 +80219,10 @@ Index: linux-2.6.5/include/elan3/elan3ops.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elanctxt.h
+Index: linux-2.6.5-7.191/include/elan3/elanctxt.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elanctxt.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elanctxt.h       2005-05-11 12:10:12.586910080 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elanctxt.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elanctxt.h 2005-07-28 14:52:52.944664144 -0400
 @@ -0,0 +1,856 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -81080,10 +81080,10 @@ Index: linux-2.6.5/include/elan3/elanctxt.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elandebug.h
+Index: linux-2.6.5-7.191/include/elan3/elandebug.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elandebug.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elandebug.h      2005-05-11 12:10:12.586910080 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elandebug.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elandebug.h        2005-07-28 14:52:52.945663992 -0400
 @@ -0,0 +1,106 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -81191,10 +81191,10 @@ Index: linux-2.6.5/include/elan3/elandebug.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elandev.h
+Index: linux-2.6.5-7.191/include/elan3/elandev.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elandev.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elandev.h        2005-05-11 12:10:12.587909928 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elandev.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elandev.h  2005-07-28 14:52:52.946663840 -0400
 @@ -0,0 +1,581 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -81777,10 +81777,10 @@ Index: linux-2.6.5/include/elan3/elandev.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elandev_linux.h
+Index: linux-2.6.5-7.191/include/elan3/elandev_linux.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elandev_linux.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elandev_linux.h  2005-05-11 12:10:12.588909776 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elandev_linux.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elandev_linux.h    2005-07-28 14:52:52.946663840 -0400
 @@ -0,0 +1,74 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -81856,10 +81856,10 @@ Index: linux-2.6.5/include/elan3/elandev_linux.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elanio.h
+Index: linux-2.6.5-7.191/include/elan3/elanio.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elanio.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elanio.h 2005-05-11 12:10:12.588909776 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elanio.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elanio.h   2005-07-28 14:52:52.947663688 -0400
 @@ -0,0 +1,226 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -82087,10 +82087,10 @@ Index: linux-2.6.5/include/elan3/elanio.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elanregs.h
+Index: linux-2.6.5-7.191/include/elan3/elanregs.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elanregs.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elanregs.h       2005-05-11 12:10:12.590909472 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elanregs.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elanregs.h 2005-07-28 14:52:52.949663384 -0400
 @@ -0,0 +1,1063 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -83155,10 +83155,10 @@ Index: linux-2.6.5/include/elan3/elanregs.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elansyscall.h
+Index: linux-2.6.5-7.191/include/elan3/elansyscall.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elansyscall.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elansyscall.h    2005-05-11 12:10:12.591909320 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elansyscall.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elansyscall.h      2005-07-28 14:52:52.949663384 -0400
 @@ -0,0 +1,124 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -83284,10 +83284,10 @@ Index: linux-2.6.5/include/elan3/elansyscall.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elanuregs.h
+Index: linux-2.6.5-7.191/include/elan3/elanuregs.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elanuregs.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elanuregs.h      2005-05-11 12:10:12.591909320 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elanuregs.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elanuregs.h        2005-07-28 14:52:52.950663232 -0400
 @@ -0,0 +1,295 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -83584,10 +83584,10 @@ Index: linux-2.6.5/include/elan3/elanuregs.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/elanvp.h
+Index: linux-2.6.5-7.191/include/elan3/elanvp.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/elanvp.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/elanvp.h 2005-05-11 12:10:12.592909168 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/elanvp.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/elanvp.h   2005-07-28 14:52:52.950663232 -0400
 @@ -0,0 +1,165 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -83754,10 +83754,10 @@ Index: linux-2.6.5/include/elan3/elanvp.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/events.h
+Index: linux-2.6.5-7.191/include/elan3/events.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/events.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/events.h 2005-05-11 12:10:12.592909168 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/events.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/events.h   2005-07-28 14:52:52.951663080 -0400
 @@ -0,0 +1,183 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -83942,10 +83942,10 @@ Index: linux-2.6.5/include/elan3/events.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/intrinsics.h
+Index: linux-2.6.5-7.191/include/elan3/intrinsics.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/intrinsics.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/intrinsics.h     2005-05-11 12:10:12.593909016 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/intrinsics.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/intrinsics.h       2005-07-28 14:52:52.952662928 -0400
 @@ -0,0 +1,320 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -84267,10 +84267,10 @@ Index: linux-2.6.5/include/elan3/intrinsics.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/minames.h
+Index: linux-2.6.5-7.191/include/elan3/minames.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/minames.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/minames.h        2005-05-11 12:10:12.594908864 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/minames.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/minames.h  2005-07-28 14:52:52.952662928 -0400
 @@ -0,0 +1,256 @@
 +{MI_WaitForRemoteDescRead,    "MI_WaitForRemoteDescRead"},
 +{MI_WaitForRemoteDescRead2,   "MI_WaitForRemoteDescRead2"},
@@ -84528,10 +84528,10 @@ Index: linux-2.6.5/include/elan3/minames.h
 +{MI_CheckForRunIfZero,        "MI_CheckForRunIfZero"},
 +{MI_TestForBreakOrSuspend,    "MI_TestForBreakOrSuspend"},
 +{MI_SwapForRunable,   "MI_SwapForRunable"},
-Index: linux-2.6.5/include/elan3/neterr_rpc.h
+Index: linux-2.6.5-7.191/include/elan3/neterr_rpc.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/neterr_rpc.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/neterr_rpc.h     2005-05-11 12:10:12.594908864 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/neterr_rpc.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/neterr_rpc.h       2005-07-28 14:52:52.953662776 -0400
 @@ -0,0 +1,68 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -84601,10 +84601,10 @@ Index: linux-2.6.5/include/elan3/neterr_rpc.h
 + * End:
 + */
 +#endif /* __ELAN3_NETERR_RPC_H */
-Index: linux-2.6.5/include/elan3/perm.h
+Index: linux-2.6.5-7.191/include/elan3/perm.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/perm.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/perm.h   2005-05-11 12:10:12.594908864 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/perm.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/perm.h     2005-07-28 14:52:52.953662776 -0400
 @@ -0,0 +1,29 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -84635,10 +84635,10 @@ Index: linux-2.6.5/include/elan3/perm.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/pte.h
+Index: linux-2.6.5-7.191/include/elan3/pte.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/pte.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/pte.h    2005-05-11 12:10:12.595908712 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/pte.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/pte.h      2005-07-28 14:52:52.953662776 -0400
 @@ -0,0 +1,139 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -84779,10 +84779,10 @@ Index: linux-2.6.5/include/elan3/pte.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/spinlock.h
+Index: linux-2.6.5-7.191/include/elan3/spinlock.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/spinlock.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/spinlock.h       2005-05-11 12:10:12.595908712 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/spinlock.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/spinlock.h 2005-07-28 14:52:52.954662624 -0400
 @@ -0,0 +1,195 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -84979,10 +84979,10 @@ Index: linux-2.6.5/include/elan3/spinlock.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/thread.h
+Index: linux-2.6.5-7.191/include/elan3/thread.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/thread.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/thread.h 2005-05-11 12:10:12.596908560 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/thread.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/thread.h   2005-07-28 14:52:52.954662624 -0400
 @@ -0,0 +1,137 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -85121,10 +85121,10 @@ Index: linux-2.6.5/include/elan3/thread.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/threadlinkage.h
+Index: linux-2.6.5-7.191/include/elan3/threadlinkage.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/threadlinkage.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/threadlinkage.h  2005-05-11 12:10:12.596908560 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/threadlinkage.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/threadlinkage.h    2005-07-28 14:52:52.955662472 -0400
 @@ -0,0 +1,103 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -85229,10 +85229,10 @@ Index: linux-2.6.5/include/elan3/threadlinkage.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/threadsyscall.h
+Index: linux-2.6.5-7.191/include/elan3/threadsyscall.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/threadsyscall.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/threadsyscall.h  2005-05-11 12:10:12.596908560 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/threadsyscall.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/threadsyscall.h    2005-07-28 14:52:52.955662472 -0400
 @@ -0,0 +1,64 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -85298,10 +85298,10 @@ Index: linux-2.6.5/include/elan3/threadsyscall.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/trtype.h
+Index: linux-2.6.5-7.191/include/elan3/trtype.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/trtype.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/trtype.h 2005-05-11 12:10:12.597908408 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/trtype.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/trtype.h   2005-07-28 14:52:52.955662472 -0400
 @@ -0,0 +1,116 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -85419,10 +85419,10 @@ Index: linux-2.6.5/include/elan3/trtype.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/urom_addrs.h
+Index: linux-2.6.5-7.191/include/elan3/urom_addrs.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/urom_addrs.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/urom_addrs.h     2005-05-11 12:10:12.597908408 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/urom_addrs.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/urom_addrs.h       2005-07-28 14:52:52.956662320 -0400
 @@ -0,0 +1,262 @@
 +#define MI_WaitForRemoteDescRead 0x0
 +#define MI_WaitForRemoteDescRead2 0x1
@@ -85686,10 +85686,10 @@ Index: linux-2.6.5/include/elan3/urom_addrs.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/vmseg.h
+Index: linux-2.6.5-7.191/include/elan3/vmseg.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/vmseg.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/vmseg.h  2005-05-11 12:10:12.598908256 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/vmseg.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/vmseg.h    2005-07-28 14:52:52.956662320 -0400
 @@ -0,0 +1,75 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -85766,10 +85766,10 @@ Index: linux-2.6.5/include/elan3/vmseg.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan3/vpd.h
+Index: linux-2.6.5-7.191/include/elan3/vpd.h
 ===================================================================
---- linux-2.6.5.orig/include/elan3/vpd.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan3/vpd.h    2005-05-11 12:10:12.598908256 -0400
+--- linux-2.6.5-7.191.orig/include/elan3/vpd.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan3/vpd.h      2005-07-28 14:52:52.957662168 -0400
 @@ -0,0 +1,47 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -85818,10 +85818,10 @@ Index: linux-2.6.5/include/elan3/vpd.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/elan4/commands.h
+Index: linux-2.6.5-7.191/include/elan4/commands.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/commands.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/commands.h       2005-05-11 12:10:12.599908104 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/commands.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/commands.h 2005-07-28 14:52:52.957662168 -0400
 @@ -0,0 +1,247 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -86070,10 +86070,10 @@ Index: linux-2.6.5/include/elan4/commands.h
 +
 +#endif /* __ELAN4_COMMANDS_H  */
 +
-Index: linux-2.6.5/include/elan4/debug.h
+Index: linux-2.6.5-7.191/include/elan4/debug.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/debug.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/debug.h  2005-05-11 12:10:12.599908104 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/debug.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/debug.h    2005-07-28 14:52:52.958662016 -0400
 @@ -0,0 +1,113 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -86188,10 +86188,10 @@ Index: linux-2.6.5/include/elan4/debug.h
 + * End:
 + */
 +#endif /* _ELAN4_ELANDEBUG_H */
-Index: linux-2.6.5/include/elan4/device.h
+Index: linux-2.6.5-7.191/include/elan4/device.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/device.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/device.h 2005-05-11 12:10:12.601907800 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/device.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/device.h   2005-07-28 14:52:52.960661712 -0400
 @@ -0,0 +1,811 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -87004,10 +87004,10 @@ Index: linux-2.6.5/include/elan4/device.h
 + * End:
 + */
 +#endif /* __ELAN4_ELANDEV_H */
-Index: linux-2.6.5/include/elan4/device_Linux.h
+Index: linux-2.6.5-7.191/include/elan4/device_Linux.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/device_Linux.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/device_Linux.h   2005-05-11 12:10:12.601907800 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/device_Linux.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/device_Linux.h     2005-07-28 14:52:52.960661712 -0400
 @@ -0,0 +1,117 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -87126,10 +87126,10 @@ Index: linux-2.6.5/include/elan4/device_Linux.h
 + * End:
 + */
 +#endif /* __ELAN4_ELANDEV_LINUX_H */
-Index: linux-2.6.5/include/elan4/dma.h
+Index: linux-2.6.5-7.191/include/elan4/dma.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/dma.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/dma.h    2005-05-11 12:10:12.602907648 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/dma.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/dma.h      2005-07-28 14:52:52.960661712 -0400
 @@ -0,0 +1,82 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -87213,10 +87213,10 @@ Index: linux-2.6.5/include/elan4/dma.h
 +} E4_DMA64;
 +
 +#endif /* __ELAN4_DMA_H */
-Index: linux-2.6.5/include/elan4/events.h
+Index: linux-2.6.5-7.191/include/elan4/events.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/events.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/events.h 2005-05-11 12:10:12.602907648 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/events.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/events.h   2005-07-28 14:52:52.961661560 -0400
 @@ -0,0 +1,179 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -87397,10 +87397,10 @@ Index: linux-2.6.5/include/elan4/events.h
 +#endif /* _ASM */
 +
 +#endif /* __ELAN4_EVENTS_H */
-Index: linux-2.6.5/include/elan4/i2c.h
+Index: linux-2.6.5-7.191/include/elan4/i2c.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/i2c.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/i2c.h    2005-05-11 12:10:12.602907648 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/i2c.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/i2c.h      2005-07-28 14:52:52.961661560 -0400
 @@ -0,0 +1,47 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -87449,10 +87449,10 @@ Index: linux-2.6.5/include/elan4/i2c.h
 + * End:
 + */
 +#endif /* _ELAN4_I2C_H */
-Index: linux-2.6.5/include/elan4/intcookie.h
+Index: linux-2.6.5-7.191/include/elan4/intcookie.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/intcookie.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/intcookie.h      2005-05-11 12:10:12.603907496 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/intcookie.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/intcookie.h        2005-07-28 14:52:52.961661560 -0400
 @@ -0,0 +1,62 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -87516,10 +87516,10 @@ Index: linux-2.6.5/include/elan4/intcookie.h
 + * End:
 + */
 +#endif /* __ELAN4_INTCOOKIE_H */
-Index: linux-2.6.5/include/elan4/ioctl.h
+Index: linux-2.6.5-7.191/include/elan4/ioctl.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/ioctl.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/ioctl.h  2005-05-11 12:10:12.603907496 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/ioctl.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/ioctl.h    2005-07-28 14:52:52.962661408 -0400
 @@ -0,0 +1,320 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -87841,10 +87841,10 @@ Index: linux-2.6.5/include/elan4/ioctl.h
 + * End:
 + */
 +#endif /* __ELAN4_IOCTL_H */
-Index: linux-2.6.5/include/elan4/mmu.h
+Index: linux-2.6.5-7.191/include/elan4/mmu.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/mmu.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/mmu.h    2005-05-11 12:10:12.604907344 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/mmu.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/mmu.h      2005-07-28 14:52:52.963661256 -0400
 @@ -0,0 +1,94 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -87940,10 +87940,10 @@ Index: linux-2.6.5/include/elan4/mmu.h
 + * End:
 + */
 +#endif /* __ELAN4_MMU_H */
-Index: linux-2.6.5/include/elan4/neterr.h
+Index: linux-2.6.5-7.191/include/elan4/neterr.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/neterr.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/neterr.h 2005-05-11 12:10:12.604907344 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/neterr.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/neterr.h   2005-07-28 14:52:52.963661256 -0400
 @@ -0,0 +1,40 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -87985,10 +87985,10 @@ Index: linux-2.6.5/include/elan4/neterr.h
 + * End:
 + */
 +#endif /* __ELAN4_NETERR_H */
-Index: linux-2.6.5/include/elan4/pci.h
+Index: linux-2.6.5-7.191/include/elan4/pci.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/pci.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/pci.h    2005-05-11 12:10:12.605907192 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/pci.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/pci.h      2005-07-28 14:52:52.964661104 -0400
 @@ -0,0 +1,227 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -88217,10 +88217,10 @@ Index: linux-2.6.5/include/elan4/pci.h
 +#define ECTRL_SYS_CLOCK_RATIO_MASK    (7 << ECTRL_SYS_CLOCK_RATIO_SHIFT)
 +
 +#endif /* __ELAN4_PCI_H */
-Index: linux-2.6.5/include/elan4/registers.h
+Index: linux-2.6.5-7.191/include/elan4/registers.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/registers.h 2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/registers.h      2005-05-11 12:10:12.608906736 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/registers.h   2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/registers.h        2005-07-28 14:52:52.967660648 -0400
 @@ -0,0 +1,1587 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -89809,10 +89809,10 @@ Index: linux-2.6.5/include/elan4/registers.h
 +#define ELAN4_REVB_NUM_COMMAND_QUEUES (ELAN4_REVB_I2C_OFFSET >> 13)
 +
 +#endif /* notdef _ELAN4_REGISTERS_H */
-Index: linux-2.6.5/include/elan4/sdram.h
+Index: linux-2.6.5-7.191/include/elan4/sdram.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/sdram.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/sdram.h  2005-05-11 12:10:12.608906736 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/sdram.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/sdram.h    2005-07-28 14:52:52.967660648 -0400
 @@ -0,0 +1,41 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -89855,10 +89855,10 @@ Index: linux-2.6.5/include/elan4/sdram.h
 +#define SDRAM_MIN_PAGE_SIZE           (8192)
 +
 +#endif /* __ELAN4_SDRAM_H */
-Index: linux-2.6.5/include/elan4/stats.h
+Index: linux-2.6.5-7.191/include/elan4/stats.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/stats.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/stats.h  2005-05-11 12:10:12.609906584 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/stats.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/stats.h    2005-07-28 14:52:52.967660648 -0400
 @@ -0,0 +1,83 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -89943,10 +89943,10 @@ Index: linux-2.6.5/include/elan4/stats.h
 + * End:
 + */
 +#endif /*__ELAN4_STATS_H */
-Index: linux-2.6.5/include/elan4/tprintf.h
+Index: linux-2.6.5-7.191/include/elan4/tprintf.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/tprintf.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/tprintf.h        2005-05-11 12:10:12.609906584 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/tprintf.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/tprintf.h  2005-07-28 14:52:52.968660496 -0400
 @@ -0,0 +1,24 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -89972,10 +89972,10 @@ Index: linux-2.6.5/include/elan4/tprintf.h
 +#endif /* _ASM */
 +
 +#endif /* __ELAN4_TPRINTF_H */
-Index: linux-2.6.5/include/elan4/trap.h
+Index: linux-2.6.5-7.191/include/elan4/trap.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/trap.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/trap.h   2005-05-11 12:10:12.614905824 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/trap.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/trap.h     2005-07-28 14:52:52.968660496 -0400
 @@ -0,0 +1,95 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -90072,10 +90072,10 @@ Index: linux-2.6.5/include/elan4/trap.h
 + * End:
 + */
 +#endif /* __ELAN4_TRAP_H */
-Index: linux-2.6.5/include/elan4/trtype.h
+Index: linux-2.6.5-7.191/include/elan4/trtype.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/trtype.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/trtype.h 2005-05-11 12:10:12.615905672 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/trtype.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/trtype.h   2005-07-28 14:52:52.968660496 -0400
 @@ -0,0 +1,112 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -90189,10 +90189,10 @@ Index: linux-2.6.5/include/elan4/trtype.h
 +#define TR_TRACEROUTE1_BCAST_BOTTOM(val)      (((val) >> 12) & 7)             /* 12:14 Broadcast Bottom */
 +
 +#endif /* _ELAN4_TRANSACTIONTYPE_H */
-Index: linux-2.6.5/include/elan4/types.h
+Index: linux-2.6.5-7.191/include/elan4/types.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/types.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/types.h  2005-05-11 12:10:12.615905672 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/types.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/types.h    2005-07-28 14:52:52.969660344 -0400
 @@ -0,0 +1,69 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -90263,10 +90263,10 @@ Index: linux-2.6.5/include/elan4/types.h
 +
 +#endif /* __ELAN4_TYPES_H */
 +
-Index: linux-2.6.5/include/elan4/user.h
+Index: linux-2.6.5-7.191/include/elan4/user.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/user.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/user.h   2005-05-11 12:10:12.616905520 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/user.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/user.h     2005-07-28 14:52:52.970660192 -0400
 @@ -0,0 +1,344 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -90612,10 +90612,10 @@ Index: linux-2.6.5/include/elan4/user.h
 + * End:
 + */
 +#endif /* __ELAN4_USER_H */
-Index: linux-2.6.5/include/elan4/userregs.h
+Index: linux-2.6.5-7.191/include/elan4/userregs.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/userregs.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/userregs.h       2005-05-11 12:10:12.617905368 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/userregs.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/userregs.h 2005-07-28 14:52:52.971660040 -0400
 @@ -0,0 +1,383 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -91000,10 +91000,10 @@ Index: linux-2.6.5/include/elan4/userregs.h
 +#endif
 +
 +#endif /* __ELAN4_USERREGS_H */
-Index: linux-2.6.5/include/elan4/usertrap.h
+Index: linux-2.6.5-7.191/include/elan4/usertrap.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/usertrap.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/usertrap.h       2005-05-11 12:10:12.617905368 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/usertrap.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/usertrap.h 2005-07-28 14:52:52.971660040 -0400
 @@ -0,0 +1,114 @@
 +/*
 + *    Copyright (c) 2001-2002 by Quadrics Supercomputers World Ltd.
@@ -91119,10 +91119,10 @@ Index: linux-2.6.5/include/elan4/usertrap.h
 + * End:
 + */
 +#endif /* __ELAN4_USERTRAP_H */
-Index: linux-2.6.5/include/elan4/xsdram.h
+Index: linux-2.6.5-7.191/include/elan4/xsdram.h
 ===================================================================
---- linux-2.6.5.orig/include/elan4/xsdram.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/elan4/xsdram.h 2005-05-11 12:10:12.617905368 -0400
+--- linux-2.6.5-7.191.orig/include/elan4/xsdram.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/elan4/xsdram.h   2005-07-28 14:52:52.971660040 -0400
 @@ -0,0 +1,59 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -91183,10 +91183,10 @@ Index: linux-2.6.5/include/elan4/xsdram.h
 +#endif
 +
 +#endif /* __ELAN4_XSDRAM_H */
-Index: linux-2.6.5/include/jtag/jtagio.h
+Index: linux-2.6.5-7.191/include/jtag/jtagio.h
 ===================================================================
---- linux-2.6.5.orig/include/jtag/jtagio.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/jtag/jtagio.h  2005-05-11 12:10:12.618905216 -0400
+--- linux-2.6.5-7.191.orig/include/jtag/jtagio.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/jtag/jtagio.h    2005-07-28 14:52:52.972659888 -0400
 @@ -0,0 +1,106 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -91294,10 +91294,10 @@ Index: linux-2.6.5/include/jtag/jtagio.h
 +#endif
 +
 +#endif /* __SYS_JTAGMOD_H */
-Index: linux-2.6.5/include/linux/init_task.h
+Index: linux-2.6.5-7.191/include/linux/init_task.h
 ===================================================================
---- linux-2.6.5.orig/include/linux/init_task.h 2005-02-01 16:56:02.000000000 -0500
-+++ linux-2.6.5/include/linux/init_task.h      2005-05-11 12:10:12.618905216 -0400
+--- linux-2.6.5-7.191.orig/include/linux/init_task.h   2005-06-28 12:24:09.000000000 -0400
++++ linux-2.6.5-7.191/include/linux/init_task.h        2005-07-28 14:52:52.972659888 -0400
 @@ -3,6 +3,7 @@
  
  #include <linux/file.h>
@@ -91310,14 +91310,14 @@ Index: linux-2.6.5/include/linux/init_task.h
        .map_base       = __TASK_UNMAPPED_BASE,                         \
        .io_wait        = NULL,                                         \
        INIT_TASK_PAGG(tsk)                                             \
-+      INIT_TASK_PTRACK(tsk),                                          \
++      INIT_TASK_PTRACK(tsk)                                           \
  }
  
  
-Index: linux-2.6.5/include/linux/ioproc.h
+Index: linux-2.6.5-7.191/include/linux/ioproc.h
 ===================================================================
---- linux-2.6.5.orig/include/linux/ioproc.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/linux/ioproc.h 2005-05-11 12:10:12.619905064 -0400
+--- linux-2.6.5-7.191.orig/include/linux/ioproc.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/linux/ioproc.h   2005-07-28 14:52:52.973659736 -0400
 @@ -0,0 +1,271 @@
 +/* -*- linux-c -*-
 + *
@@ -91590,10 +91590,10 @@ Index: linux-2.6.5/include/linux/ioproc.h
 +#endif /* CONFIG_IOPROC */
 +
 +#endif /* __LINUX_IOPROC_H__ */
-Index: linux-2.6.5/include/linux/ptrack.h
+Index: linux-2.6.5-7.191/include/linux/ptrack.h
 ===================================================================
---- linux-2.6.5.orig/include/linux/ptrack.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/linux/ptrack.h 2005-05-11 12:10:12.619905064 -0400
+--- linux-2.6.5-7.191.orig/include/linux/ptrack.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/linux/ptrack.h   2005-07-28 14:52:52.973659736 -0400
 @@ -0,0 +1,65 @@
 +/*
 + *    Copyright (C) 2000  Regents of the University of California
@@ -91650,20 +91650,20 @@ Index: linux-2.6.5/include/linux/ptrack.h
 +extern int     ptrack_call_callbacks (int phase, struct task_struct *child);
 +
 +#define INIT_TASK_PTRACK(tsk) \
-+      .ptrack_list = LIST_HEAD_INIT(tsk.ptrack_list)
++      .ptrack_list = LIST_HEAD_INIT(tsk.ptrack_list),
 +
 +#else
-+#define ptrack_call_callbacks (phase, child) (0)
++#define ptrack_call_callbacks(phase, child) (0)
 +
 +#define INIT_TASK_PTRACK(tsk)
 +
 +#endif
 +
 +#endif /* __LINUX_PTRACK_H */
-Index: linux-2.6.5/include/linux/sched.h
+Index: linux-2.6.5-7.191/include/linux/sched.h
 ===================================================================
---- linux-2.6.5.orig/include/linux/sched.h     2005-02-01 16:56:07.000000000 -0500
-+++ linux-2.6.5/include/linux/sched.h  2005-05-11 12:10:12.620904912 -0400
+--- linux-2.6.5-7.191.orig/include/linux/sched.h       2005-06-28 12:24:22.000000000 -0400
++++ linux-2.6.5-7.191/include/linux/sched.h    2005-07-28 14:52:52.974659584 -0400
 @@ -188,6 +188,9 @@
  extern int max_timeslice, min_timeslice;
  
@@ -91701,10 +91701,10 @@ Index: linux-2.6.5/include/linux/sched.h
  };
  
  static inline pid_t process_group(struct task_struct *tsk)
-Index: linux-2.6.5/include/qsnet/autoconf.h
+Index: linux-2.6.5-7.191/include/qsnet/autoconf.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/autoconf.h  2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/autoconf.h       2005-05-11 12:17:53.578828656 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/autoconf.h    2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/autoconf.h 2005-07-28 14:52:52.975659432 -0400
 @@ -0,0 +1,38 @@
 +/*
 + *    Copyright (c) 2004 by Quadrics Ltd.
@@ -91744,10 +91744,10 @@ Index: linux-2.6.5/include/qsnet/autoconf.h
 +#define       CONFIG_JTAG
 +#define       CONFIG_QSNET
 +#define       CONFIG_RMS
-Index: linux-2.6.5/include/qsnet/condvar.h
+Index: linux-2.6.5-7.191/include/qsnet/condvar.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/condvar.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/condvar.h        2005-05-11 12:10:12.621904760 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/condvar.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/condvar.h  2005-07-28 14:52:52.975659432 -0400
 @@ -0,0 +1,140 @@
 +/*
 + *    Copyright (C) 2000  Regents of the University of California
@@ -91889,10 +91889,10 @@ Index: linux-2.6.5/include/qsnet/condvar.h
 +
 +#endif /* __KERNEL__ */
 +#endif /* _LINUX_CONDVAR_H */
-Index: linux-2.6.5/include/qsnet/config.h
+Index: linux-2.6.5-7.191/include/qsnet/config.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/config.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/config.h 2005-05-11 12:10:12.622904608 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/config.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/config.h   2005-07-28 14:52:52.976659280 -0400
 @@ -0,0 +1,195 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -92089,10 +92089,10 @@ Index: linux-2.6.5/include/qsnet/config.h
 +#include <qsnet/workarounds.h>
 +
 +#endif /* _QSNET_CONFIG_H */
-Index: linux-2.6.5/include/qsnet/crwlock.h
+Index: linux-2.6.5-7.191/include/qsnet/crwlock.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/crwlock.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/crwlock.h        2005-05-11 12:10:12.622904608 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/crwlock.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/crwlock.h  2005-07-28 14:52:52.976659280 -0400
 @@ -0,0 +1,207 @@
 +/* 
 + *    Copyright (C) 2000  Regents of the University of California
@@ -92301,10 +92301,10 @@ Index: linux-2.6.5/include/qsnet/crwlock.h
 +
 +#endif /* __KERNEL__ */
 +#endif /* _LINUX_RWLOCK_H */
-Index: linux-2.6.5/include/qsnet/ctrl_linux.h
+Index: linux-2.6.5-7.191/include/qsnet/ctrl_linux.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/ctrl_linux.h        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/ctrl_linux.h     2005-05-11 12:10:12.622904608 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/ctrl_linux.h  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/ctrl_linux.h       2005-07-28 14:52:52.977659128 -0400
 @@ -0,0 +1,37 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -92343,10 +92343,10 @@ Index: linux-2.6.5/include/qsnet/ctrl_linux.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/qsnet/debug.h
+Index: linux-2.6.5-7.191/include/qsnet/debug.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/debug.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/debug.h  2005-05-11 12:10:12.623904456 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/debug.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/debug.h    2005-07-28 14:52:52.977659128 -0400
 @@ -0,0 +1,68 @@
 +/*
 + *    Copyright (C) 2000  Regents of the University of California
@@ -92416,10 +92416,10 @@ Index: linux-2.6.5/include/qsnet/debug.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/qsnet/fence.h
+Index: linux-2.6.5-7.191/include/qsnet/fence.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/fence.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/fence.h  2005-05-11 12:10:12.623904456 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/fence.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/fence.h    2005-07-28 14:52:52.977659128 -0400
 @@ -0,0 +1,178 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Supercomputers World Ltd.
@@ -92599,10 +92599,10 @@ Index: linux-2.6.5/include/qsnet/fence.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/qsnet/kernel.h
+Index: linux-2.6.5-7.191/include/qsnet/kernel.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/kernel.h    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/kernel.h 2005-05-11 12:10:12.623904456 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/kernel.h      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/kernel.h   2005-07-28 14:52:52.978658976 -0400
 @@ -0,0 +1,38 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -92642,10 +92642,10 @@ Index: linux-2.6.5/include/qsnet/kernel.h
 +
 +
 +
-Index: linux-2.6.5/include/qsnet/kernel_linux.h
+Index: linux-2.6.5-7.191/include/qsnet/kernel_linux.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/kernel_linux.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/kernel_linux.h   2005-05-11 12:10:12.624904304 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/kernel_linux.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/kernel_linux.h     2005-07-28 14:52:52.978658976 -0400
 @@ -0,0 +1,352 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -92999,10 +92999,10 @@ Index: linux-2.6.5/include/qsnet/kernel_linux.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/qsnet/kpte.h
+Index: linux-2.6.5-7.191/include/qsnet/kpte.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/kpte.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/kpte.h   2005-05-11 12:10:12.624904304 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/kpte.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/kpte.h     2005-07-28 14:52:52.979658824 -0400
 @@ -0,0 +1,109 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -93113,10 +93113,10 @@ Index: linux-2.6.5/include/qsnet/kpte.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/qsnet/kthread.h
+Index: linux-2.6.5-7.191/include/qsnet/kthread.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/kthread.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/kthread.h        2005-05-11 12:10:12.630903392 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/kthread.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/kthread.h  2005-07-28 14:52:52.979658824 -0400
 @@ -0,0 +1,71 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -93189,10 +93189,10 @@ Index: linux-2.6.5/include/qsnet/kthread.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/qsnet/list.h
+Index: linux-2.6.5-7.191/include/qsnet/list.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/list.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/list.h   2005-05-11 12:10:12.631903240 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/list.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/list.h     2005-07-28 14:52:52.979658824 -0400
 @@ -0,0 +1,80 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Limited.
@@ -93274,10 +93274,10 @@ Index: linux-2.6.5/include/qsnet/list.h
 +           pos = n, n = (pos)->next)
 +
 +#endif /* __QSNET_LIST_H */
-Index: linux-2.6.5/include/qsnet/mutex.h
+Index: linux-2.6.5-7.191/include/qsnet/mutex.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/mutex.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/mutex.h  2005-05-11 12:10:12.631903240 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/mutex.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/mutex.h    2005-07-28 14:52:52.980658672 -0400
 @@ -0,0 +1,91 @@
 +/*
 + *    Copyright (C) 2000  Regents of the University of California
@@ -93370,10 +93370,10 @@ Index: linux-2.6.5/include/qsnet/mutex.h
 +
 +#endif /* __KERNEL__ */
 +#endif /* _LINUX_MUTEX_H */
-Index: linux-2.6.5/include/qsnet/procfs_linux.h
+Index: linux-2.6.5-7.191/include/qsnet/procfs_linux.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/procfs_linux.h      2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/procfs_linux.h   2005-05-11 12:10:12.632903088 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/procfs_linux.h        2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/procfs_linux.h     2005-07-28 14:52:52.980658672 -0400
 @@ -0,0 +1,234 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -93609,10 +93609,10 @@ Index: linux-2.6.5/include/qsnet/procfs_linux.h
 + * c-file-style: "linux"
 + * End:
 + */
-Index: linux-2.6.5/include/qsnet/pthread.h
+Index: linux-2.6.5-7.191/include/qsnet/pthread.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/pthread.h   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/pthread.h        2005-05-11 12:10:12.632903088 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/pthread.h     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/pthread.h  2005-07-28 14:52:52.980658672 -0400
 @@ -0,0 +1,59 @@
 +/*
 + *    Copyright (c) 2003 by Quadrics Supercomputers World Ltd.
@@ -93673,10 +93673,10 @@ Index: linux-2.6.5/include/qsnet/pthread.h
 + * c-file-style: "stroustrup"
 + * End:
 + */
-Index: linux-2.6.5/include/qsnet/statsformat.h
+Index: linux-2.6.5-7.191/include/qsnet/statsformat.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/statsformat.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/statsformat.h    2005-05-11 12:10:12.632903088 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/statsformat.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/statsformat.h      2005-07-28 14:52:52.981658520 -0400
 @@ -0,0 +1,25 @@
 +#ifndef _QSNET_STATSFORMAT_H
 +#define _QSNET_STATSFORMAT_H
@@ -93703,10 +93703,10 @@ Index: linux-2.6.5/include/qsnet/statsformat.h
 +#endif
 +
 +#endif
-Index: linux-2.6.5/include/qsnet/types.h
+Index: linux-2.6.5-7.191/include/qsnet/types.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/types.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/types.h  2005-05-11 12:10:12.632903088 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/types.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/types.h    2005-07-28 14:52:52.981658520 -0400
 @@ -0,0 +1,90 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -93798,10 +93798,10 @@ Index: linux-2.6.5/include/qsnet/types.h
 +
 +
 +#endif /* __QSNET_TYPES_H */
-Index: linux-2.6.5/include/qsnet/workarounds.h
+Index: linux-2.6.5-7.191/include/qsnet/workarounds.h
 ===================================================================
---- linux-2.6.5.orig/include/qsnet/workarounds.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/qsnet/workarounds.h    2005-05-11 12:10:12.633902936 -0400
+--- linux-2.6.5-7.191.orig/include/qsnet/workarounds.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/qsnet/workarounds.h      2005-07-28 14:52:52.981658520 -0400
 @@ -0,0 +1,24 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -93827,10 +93827,10 @@ Index: linux-2.6.5/include/qsnet/workarounds.h
 +#define ELAN_REVB_BUG_3
 +
 +#endif /* _QSNET_WORKAROUNDS_H */
-Index: linux-2.6.5/include/rms/rmscall.h
+Index: linux-2.6.5-7.191/include/rms/rmscall.h
 ===================================================================
---- linux-2.6.5.orig/include/rms/rmscall.h     2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/rms/rmscall.h  2005-05-11 12:10:12.633902936 -0400
+--- linux-2.6.5-7.191.orig/include/rms/rmscall.h       2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/rms/rmscall.h    2005-07-28 14:52:52.982658368 -0400
 @@ -0,0 +1,144 @@
 +/*
 + * Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -93976,10 +93976,10 @@ Index: linux-2.6.5/include/rms/rmscall.h
 +
 +
 +
-Index: linux-2.6.5/include/rms/rmsio.h
+Index: linux-2.6.5-7.191/include/rms/rmsio.h
 ===================================================================
---- linux-2.6.5.orig/include/rms/rmsio.h       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/include/rms/rmsio.h    2005-05-11 12:10:12.634902784 -0400
+--- linux-2.6.5-7.191.orig/include/rms/rmsio.h 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/include/rms/rmsio.h      2005-07-28 14:52:52.982658368 -0400
 @@ -0,0 +1,185 @@
 +/*
 + *    Copyright (c) 1996-2002 by Quadrics Supercomputers World Ltd.
@@ -94166,10 +94166,10 @@ Index: linux-2.6.5/include/rms/rmsio.h
 +
 +
 +
-Index: linux-2.6.5/ipc/shm.c
+Index: linux-2.6.5-7.191/ipc/shm.c
 ===================================================================
---- linux-2.6.5.orig/ipc/shm.c 2005-02-01 16:55:41.000000000 -0500
-+++ linux-2.6.5/ipc/shm.c      2005-05-11 12:10:12.634902784 -0400
+--- linux-2.6.5-7.191.orig/ipc/shm.c   2005-06-28 12:24:24.000000000 -0400
++++ linux-2.6.5-7.191/ipc/shm.c        2005-07-28 14:52:52.983658216 -0400
 @@ -27,6 +27,7 @@
  #include <linux/shmem_fs.h>
  #include <linux/security.h>
@@ -94178,7 +94178,7 @@ Index: linux-2.6.5/ipc/shm.c
  #include <linux/trigevent_hooks.h>
  #include <asm/uaccess.h>
  
-@@ -871,6 +872,44 @@
+@@ -877,6 +878,44 @@
        return audit_result(retval);
  }
  
@@ -94223,10 +94223,10 @@ Index: linux-2.6.5/ipc/shm.c
  #ifdef CONFIG_PROC_FS
  static int sysvipc_shm_read_proc(char *buffer, char **start, off_t offset, int length, int *eof, void *data)
  {
-Index: linux-2.6.5/kernel/exit.c
+Index: linux-2.6.5-7.191/kernel/exit.c
 ===================================================================
---- linux-2.6.5.orig/kernel/exit.c     2005-02-01 16:56:07.000000000 -0500
-+++ linux-2.6.5/kernel/exit.c  2005-05-11 12:10:12.684895184 -0400
+--- linux-2.6.5-7.191.orig/kernel/exit.c       2005-06-28 12:24:24.000000000 -0400
++++ linux-2.6.5-7.191/kernel/exit.c    2005-07-28 14:52:52.984658064 -0400
 @@ -40,6 +40,8 @@
  /* tng related changes */
  int (*tng_exitfunc)(int) = NULL;
@@ -94236,7 +94236,7 @@ Index: linux-2.6.5/kernel/exit.c
  extern void sem_exit (void);
  extern struct task_struct *child_reaper;
  void (*do_eop_acct) (int, struct task_struct *);
-@@ -840,6 +842,8 @@
+@@ -838,6 +840,8 @@
                audit_exit(tsk, code);
        audit_free(tsk->audit);
  #endif
@@ -94245,10 +94245,10 @@ Index: linux-2.6.5/kernel/exit.c
        __exit_mm(tsk);
  
        if (unlikely(tng_exitfunc))
-Index: linux-2.6.5/kernel/fork.c
+Index: linux-2.6.5-7.191/kernel/fork.c
 ===================================================================
---- linux-2.6.5.orig/kernel/fork.c     2005-02-01 16:56:06.000000000 -0500
-+++ linux-2.6.5/kernel/fork.c  2005-05-11 12:10:12.685895032 -0400
+--- linux-2.6.5-7.191.orig/kernel/fork.c       2005-06-28 12:24:10.000000000 -0400
++++ linux-2.6.5-7.191/kernel/fork.c    2005-07-28 14:52:52.985657912 -0400
 @@ -14,6 +14,7 @@
  #include <linux/config.h>
  #include <linux/slab.h>
@@ -94279,10 +94279,10 @@ Index: linux-2.6.5/kernel/fork.c
                /* Trace the event  */
                TRIG_EVENT(fork_hook, clone_flags, p, pid);
                if (!(clone_flags & CLONE_STOPPED)) {
-Index: linux-2.6.5/kernel/Kconfig
+Index: linux-2.6.5-7.191/kernel/Kconfig
 ===================================================================
---- linux-2.6.5.orig/kernel/Kconfig    2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/kernel/Kconfig 2005-05-11 12:10:12.685895032 -0400
+--- linux-2.6.5-7.191.orig/kernel/Kconfig      2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/kernel/Kconfig   2005-07-28 14:52:52.985657912 -0400
 @@ -0,0 +1,14 @@
 +#
 +# Kernel subsystem specific config
@@ -94298,11 +94298,11 @@ Index: linux-2.6.5/kernel/Kconfig
 +      created and destoryed in order for a resource management 
 +      system to know which processes are a member of a "job" and 
 +      to be able to clean up when the job is terminated.
-Index: linux-2.6.5/kernel/Makefile
+Index: linux-2.6.5-7.191/kernel/Makefile
 ===================================================================
---- linux-2.6.5.orig/kernel/Makefile   2005-05-11 12:10:11.148128808 -0400
-+++ linux-2.6.5/kernel/Makefile        2005-05-11 12:10:12.685895032 -0400
-@@ -26,6 +26,7 @@
+--- linux-2.6.5-7.191.orig/kernel/Makefile     2005-06-28 12:24:10.000000000 -0400
++++ linux-2.6.5-7.191/kernel/Makefile  2005-07-28 14:52:52.985657912 -0400
+@@ -25,6 +25,7 @@
  obj-$(CONFIG_EVLOG) += evlbuf.o evlapi.o evlposix.o
  obj-$(CONFIG_HOOK) += hook.o
  obj-$(CONFIG_TRIGEVENT_HOOKS) += trigevent_hooks.o
@@ -94310,10 +94310,10 @@ Index: linux-2.6.5/kernel/Makefile
  obj-$(CONFIG_LTT) += ltt/
  obj-$(CONFIG_KPROBES) += kprobes.o
  obj-$(CONFIG_CPUSETS) += cpuset.o
-Index: linux-2.6.5/kernel/ptrack.c
+Index: linux-2.6.5-7.191/kernel/ptrack.c
 ===================================================================
---- linux-2.6.5.orig/kernel/ptrack.c   2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/kernel/ptrack.c        2005-05-11 12:10:12.686894880 -0400
+--- linux-2.6.5-7.191.orig/kernel/ptrack.c     2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/kernel/ptrack.c  2005-07-28 14:52:52.986657760 -0400
 @@ -0,0 +1,145 @@
 +/*
 + *    Copyright (C) 2000  Regents of the University of California
@@ -94460,11 +94460,11 @@ Index: linux-2.6.5/kernel/ptrack.c
 +EXPORT_SYMBOL(ptrack_register);
 +EXPORT_SYMBOL(ptrack_deregister);
 +EXPORT_SYMBOL(ptrack_registered);
-Index: linux-2.6.5/kernel/signal.c
+Index: linux-2.6.5-7.191/kernel/signal.c
 ===================================================================
---- linux-2.6.5.orig/kernel/signal.c   2005-02-01 16:56:05.000000000 -0500
-+++ linux-2.6.5/kernel/signal.c        2005-05-11 12:10:12.688894576 -0400
-@@ -2271,6 +2271,7 @@
+--- linux-2.6.5-7.191.orig/kernel/signal.c     2005-06-28 12:24:23.000000000 -0400
++++ linux-2.6.5-7.191/kernel/signal.c  2005-07-28 14:52:52.987657608 -0400
+@@ -2282,6 +2282,7 @@
        read_unlock(&tasklist_lock);
        return audit_lresult(error);
  }
@@ -94472,10 +94472,10 @@ Index: linux-2.6.5/kernel/signal.c
  
  asmlinkage long
  sys_rt_sigqueueinfo(int pid, int sig, siginfo_t __user *uinfo)
-Index: linux-2.6.5/mm/fremap.c
+Index: linux-2.6.5-7.191/mm/fremap.c
 ===================================================================
---- linux-2.6.5.orig/mm/fremap.c       2005-02-01 16:55:36.000000000 -0500
-+++ linux-2.6.5/mm/fremap.c    2005-05-11 12:10:12.688894576 -0400
+--- linux-2.6.5-7.191.orig/mm/fremap.c 2005-06-28 12:23:58.000000000 -0400
++++ linux-2.6.5-7.191/mm/fremap.c      2005-07-28 14:52:52.988657456 -0400
 @@ -14,6 +14,7 @@
  #include <linux/swapops.h>
  #include <linux/objrmap.h>
@@ -94508,10 +94508,10 @@ Index: linux-2.6.5/mm/fremap.c
        spin_unlock(&mm->page_table_lock);
        return 0;
  
-Index: linux-2.6.5/mm/ioproc.c
+Index: linux-2.6.5-7.191/mm/ioproc.c
 ===================================================================
---- linux-2.6.5.orig/mm/ioproc.c       2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/mm/ioproc.c    2005-05-11 12:10:12.688894576 -0400
+--- linux-2.6.5-7.191.orig/mm/ioproc.c 2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/mm/ioproc.c      2005-07-28 14:52:52.988657456 -0400
 @@ -0,0 +1,58 @@
 +/* -*- linux-c -*-
 + *
@@ -94571,10 +94571,10 @@ Index: linux-2.6.5/mm/ioproc.c
 +}
 +
 +EXPORT_SYMBOL_GPL(ioproc_unregister_ops);
-Index: linux-2.6.5/mm/Kconfig
+Index: linux-2.6.5-7.191/mm/Kconfig
 ===================================================================
---- linux-2.6.5.orig/mm/Kconfig        2004-02-23 16:02:56.000000000 -0500
-+++ linux-2.6.5/mm/Kconfig     2005-05-11 12:10:12.689894424 -0400
+--- linux-2.6.5-7.191.orig/mm/Kconfig  2004-02-23 16:02:56.000000000 -0500
++++ linux-2.6.5-7.191/mm/Kconfig       2005-07-28 14:52:52.989657304 -0400
 @@ -0,0 +1,15 @@
 +#
 +# VM subsystem specific config
@@ -94591,20 +94591,20 @@ Index: linux-2.6.5/mm/Kconfig
 +      incorporate advanced RDMA capabilities can be kept in sync with CPU 
 +      page table changes.
 +      See Documentation/vm/ioproc.txt for more details.
-Index: linux-2.6.5/mm/Makefile
+Index: linux-2.6.5-7.191/mm/Makefile
 ===================================================================
---- linux-2.6.5.orig/mm/Makefile       2005-02-01 16:55:36.000000000 -0500
-+++ linux-2.6.5/mm/Makefile    2005-05-11 12:10:12.689894424 -0400
+--- linux-2.6.5-7.191.orig/mm/Makefile 2005-06-28 12:23:58.000000000 -0400
++++ linux-2.6.5-7.191/mm/Makefile      2005-07-28 14:52:52.989657304 -0400
 @@ -15,4 +15,5 @@
  obj-$(CONFIG_SWAP)    += page_io.o swap_state.o swapfile.o
  obj-$(CONFIG_PROC_MM) += proc_mm.o
  obj-$(CONFIG_NUMA)    += policy.o
 +obj-$(CONFIG_IOPROC)    += ioproc.o
  
-Index: linux-2.6.5/mm/memory.c
+Index: linux-2.6.5-7.191/mm/memory.c
 ===================================================================
---- linux-2.6.5.orig/mm/memory.c       2005-02-01 16:56:06.000000000 -0500
-+++ linux-2.6.5/mm/memory.c    2005-05-11 12:10:12.691894120 -0400
+--- linux-2.6.5-7.191.orig/mm/memory.c 2005-06-28 12:24:14.000000000 -0400
++++ linux-2.6.5-7.191/mm/memory.c      2005-07-28 14:55:16.271875096 -0400
 @@ -43,6 +43,7 @@
  #include <linux/swap.h>
  #include <linux/highmem.h>
@@ -94653,15 +94653,15 @@ Index: linux-2.6.5/mm/memory.c
        flush_tlb_range(vma, beg, end);
        spin_unlock(&mm->page_table_lock);
        return error;
-@@ -1120,6 +1126,7 @@
-                       ptep_establish(vma, address, page_table, entry);
+@@ -1122,6 +1128,7 @@
                        update_mmu_cache(vma, address, entry);
+                       lazy_mmu_prot_update(entry);
                        pte_unmap(page_table);
 +                      ioproc_update_page(vma, address);
                        spin_unlock(&mm->page_table_lock);
                        return VM_FAULT_MINOR;
                }
-@@ -1155,6 +1162,7 @@
+@@ -1157,6 +1164,7 @@
                }
  
                page_remove_rmap(old_page);
@@ -94669,7 +94669,7 @@ Index: linux-2.6.5/mm/memory.c
                break_cow(vma, new_page, address, page_table);
                page_add_rmap(new_page, vma, address, 1);
                lru_cache_add_active(new_page);
-@@ -1163,6 +1171,7 @@
+@@ -1165,6 +1173,7 @@
                new_page = old_page;
        }
        pte_unmap(page_table);
@@ -94677,31 +94677,31 @@ Index: linux-2.6.5/mm/memory.c
        page_cache_release(new_page);
        page_cache_release(old_page);
        spin_unlock(&mm->page_table_lock);
-@@ -1469,6 +1478,7 @@
-       /* No need to invalidate - it was non-present before */
+@@ -1472,6 +1481,7 @@
        update_mmu_cache(vma, address, pte);
+       lazy_mmu_prot_update(pte);
        pte_unmap(page_table);
 +      ioproc_update_page(vma, address);
        spin_unlock(&mm->page_table_lock);
  out:
        return ret;
-@@ -1530,6 +1540,7 @@
+@@ -1534,6 +1544,7 @@
        /* No need to invalidate - it was non-present before */
        update_mmu_cache(vma, addr, entry);
+       lazy_mmu_prot_update(entry);
 +      ioproc_update_page(vma, addr);
        spin_unlock(&mm->page_table_lock);
        ret = VM_FAULT_MINOR;
  
-@@ -1669,6 +1680,7 @@
+@@ -1674,6 +1685,7 @@
        /* no need to invalidate: a not-present page shouldn't be cached */
        update_mmu_cache(vma, address, entry);
+       lazy_mmu_prot_update(entry);
 +      ioproc_update_page(vma, address);
        spin_unlock(&mm->page_table_lock);
   out:
        return ret;
-@@ -1768,6 +1780,7 @@
+@@ -1774,6 +1786,7 @@
        spin_unlock(&mm->page_table_lock);
        return VM_FAULT_MINOR;
  }
@@ -94709,10 +94709,10 @@ Index: linux-2.6.5/mm/memory.c
  
  
  /* Can be overwritten by the architecture */
-Index: linux-2.6.5/mm/mmap.c
+Index: linux-2.6.5-7.191/mm/mmap.c
 ===================================================================
---- linux-2.6.5.orig/mm/mmap.c 2005-02-01 16:56:10.000000000 -0500
-+++ linux-2.6.5/mm/mmap.c      2005-05-11 12:10:12.692893968 -0400
+--- linux-2.6.5-7.191.orig/mm/mmap.c   2005-06-28 12:24:15.000000000 -0400
++++ linux-2.6.5-7.191/mm/mmap.c        2005-07-28 14:52:52.992656848 -0400
 @@ -25,6 +25,7 @@
  #include <linux/init.h>
  #include <linux/file.h>
@@ -94737,10 +94737,10 @@ Index: linux-2.6.5/mm/mmap.c
        tlb = tlb_gather_mmu(mm, 1);
        flush_cache_mm(mm);
        /* Use ~0UL here to ensure all VMAs in the mm are unmapped */
-Index: linux-2.6.5/mm/mprotect.c
+Index: linux-2.6.5-7.191/mm/mprotect.c
 ===================================================================
---- linux-2.6.5.orig/mm/mprotect.c     2005-02-01 16:55:59.000000000 -0500
-+++ linux-2.6.5/mm/mprotect.c  2005-05-11 12:10:12.692893968 -0400
+--- linux-2.6.5-7.191.orig/mm/mprotect.c       2005-06-28 12:24:14.000000000 -0400
++++ linux-2.6.5-7.191/mm/mprotect.c    2005-07-28 14:52:52.992656848 -0400
 @@ -10,6 +10,7 @@
  
  #include <linux/mm.h>
@@ -94749,7 +94749,7 @@ Index: linux-2.6.5/mm/mprotect.c
  #include <linux/slab.h>
  #include <linux/shm.h>
  #include <linux/mman.h>
-@@ -99,6 +100,7 @@
+@@ -101,6 +102,7 @@
        if (start >= end)
                BUG();
        spin_lock(&current->mm->page_table_lock);
@@ -94757,10 +94757,10 @@ Index: linux-2.6.5/mm/mprotect.c
        do {
                change_pmd_range(dir, start, end - start, newprot);
                start = (start + PGDIR_SIZE) & PGDIR_MASK;
-Index: linux-2.6.5/mm/mremap.c
+Index: linux-2.6.5-7.191/mm/mremap.c
 ===================================================================
---- linux-2.6.5.orig/mm/mremap.c       2005-02-01 16:56:02.000000000 -0500
-+++ linux-2.6.5/mm/mremap.c    2005-05-11 12:10:12.693893816 -0400
+--- linux-2.6.5-7.191.orig/mm/mremap.c 2005-06-28 12:24:09.000000000 -0400
++++ linux-2.6.5-7.191/mm/mremap.c      2005-07-28 14:52:52.993656696 -0400
 @@ -9,6 +9,7 @@
  
  #include <linux/mm.h>
@@ -94778,10 +94778,10 @@ Index: linux-2.6.5/mm/mremap.c
        flush_cache_range(vma, old_addr, old_addr + len);
  
        /*
-Index: linux-2.6.5/mm/msync.c
+Index: linux-2.6.5-7.191/mm/msync.c
 ===================================================================
---- linux-2.6.5.orig/mm/msync.c        2005-02-01 16:55:36.000000000 -0500
-+++ linux-2.6.5/mm/msync.c     2005-05-11 12:10:12.693893816 -0400
+--- linux-2.6.5-7.191.orig/mm/msync.c  2005-06-28 12:23:58.000000000 -0400
++++ linux-2.6.5-7.191/mm/msync.c       2005-07-28 14:52:52.993656696 -0400
 @@ -12,6 +12,7 @@
  #include <linux/mm.h>
  #include <linux/mman.h>
@@ -94798,10 +94798,10 @@ Index: linux-2.6.5/mm/msync.c
        do {
                error |= filemap_sync_pmd_range(dir, address, end, vma, flags);
                address = (address + PGDIR_SIZE) & PGDIR_MASK;
-Index: linux-2.6.5/mm/objrmap.c
+Index: linux-2.6.5-7.191/mm/objrmap.c
 ===================================================================
---- linux-2.6.5.orig/mm/objrmap.c      2005-02-01 16:56:06.000000000 -0500
-+++ linux-2.6.5/mm/objrmap.c   2005-05-11 12:10:12.694893664 -0400
+--- linux-2.6.5-7.191.orig/mm/objrmap.c        2005-06-28 12:24:10.000000000 -0400
++++ linux-2.6.5-7.191/mm/objrmap.c     2005-07-28 14:52:52.994656544 -0400
 @@ -29,6 +29,7 @@
  #include <linux/swapops.h>
  #include <linux/objrmap.h>
index c8d2598..bf0adc7 100644 (file)
@@ -28,7 +28,7 @@ diff -u -p -r1.1.1.1 Config.in
  
  if [ "$CONFIG_BLK_DEV_SD" != "n" ]; then
     int  'Maximum number of SCSI disks that can be loaded as modules' CONFIG_SD_EXTRA_DEVS 40
-+   bool 'SCSI disk I/O stats' CONFIG_SD_IOSTATS
++   bool 'SCSI disk I/O stats' CONFIG_SD_IOSTATS y
  fi
  
  dep_tristate '  SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI
@@ -74,7 +74,7 @@ diff -u -p -r1.1.1.1 sd.c
 +static inline void sd_iostats_init(void) {}
 +static inline void sd_iostats_init_disk(int disk) {}
 +static inline void sd_iostats_fini(void) {}
-+static inline void sd_iostats_bump(kdev_t dev, unsigned int nsect, int iswrite) {}
++static inline void sd_iostats_bump(int dev, unsigned int nsect, int iswrite) {}
 +#endif
 +
  /* device number --> sd_gendisks index */
index b9429b4..12e4ac0 100644 (file)
@@ -2,13 +2,14 @@ Index: linux-2.6.9-5.0.3.EL/drivers/scsi/Kconfig
 ===================================================================
 --- linux-2.6.9-5.0.3.EL.orig/drivers/scsi/Kconfig     2005-04-01 18:36:39.218039672 +0300
 +++ linux-2.6.9-5.0.3.EL/drivers/scsi/Kconfig  2005-04-01 18:36:45.571073864 +0300
-@@ -61,6 +61,13 @@
+@@ -61,6 +61,14 @@
        help
           SCSI dump support
  
 +config SD_IOSTATS
 +   bool "Enable SCSI disk I/O stats"
 +   depends on BLK_DEV_SD
++   default y
 +   ---help---
 +     This enables SCSI disk I/O stats collection.  You must also enable
 +     /proc file system support if you want this feature.
index ada40d4..f12319c 100644 (file)
@@ -2,13 +2,14 @@ Index: linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891_lustre.1.4.0-phik/drivers/s
 ===================================================================
 --- linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891_lustre.1.4.0-phik.orig/drivers/scsi/Kconfig  2004-11-11 07:28:52.000000000 -0800
 +++ linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891_lustre.1.4.0-phik/drivers/scsi/Kconfig       2005-01-06 22:58:42.338770968 -0800
-@@ -55,6 +55,13 @@
+@@ -55,6 +55,14 @@
          In this case, do not compile the driver for your SCSI host adapter
          (below) as a module either.
  
 +config SD_IOSTATS
 +   bool "Enable SCSI disk I/O stats"
 +   depends on BLK_DEV_SD
++   default y
 +   ---help---
 +     This enables SCSI disk I/O stats collection.  You must also enable
 +     /proc file system support if you want this feature.
@@ -51,9 +52,9 @@ Index: linux-2.6.5-SLES9_SP1_BRANCH_2004111114454891_lustre.1.4.0-phik/drivers/s
 +extern void sd_iostats_bump(int disk, unsigned int nsect, int iswrite);
 +#else
 +static inline void sd_iostats_init(void) {}
-+static inline void sd_iostats_init_disk(struct gendisk *) {}
++static inline void sd_iostats_init_disk(struct gendisk *disk) {}
 +static inline void sd_iostats_fini(void) {}
-+static inline void sd_iostats_bump(kdev_t dev, unsigned int nsect, int iswrite) {}
++static inline void sd_iostats_bump(int disk, unsigned int nsect, int iswrite) {}
 +#endif
  
  /*
index 7c7119d..e6e5392 100644 (file)
@@ -126,13 +126,16 @@ Index: linux-2.6.5-12.1/fs/namei.c
  /*
   * Name resolution.
   *
-@@ -664,7 +708,9 @@
+@@ -664,8 +708,12 @@
+                       goto out_dput;
  
                if (inode->i_op->follow_link) {
++                      int save_flags = nd->flags;
                        mntget(next.mnt);
 +                      nd->flags |= LOOKUP_LINK_NOTLAST;
                        err = do_follow_link(next.dentry, nd);
-+                      nd->flags &= ~LOOKUP_LINK_NOTLAST;
++                      if (!(save_flags & LOOKUP_LINK_NOTLAST))
++                              nd->flags &= ~LOOKUP_LINK_NOTLAST;
                        dput(next.dentry);
                        mntput(next.mnt);
                        if (err)
index 1aae992..7f95eb3 100644 (file)
@@ -426,7 +426,7 @@ Index: linux-2.6.9-5.0.3.EL/fs/open.c
 +
 +              newattrs.ia_uid = user;
 +              newattrs.ia_gid = group;
-+              newattrs.ia_valid = ATTR_UID | ATTR_GID;
++              newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
 +              newattrs.ia_valid |= ATTR_RAW;
 +              error = op->setattr_raw(inode, &newattrs);
 +              /* the file system wants to use normal vfs path now */
index cfd0db0..8817678 100644 (file)
@@ -401,7 +401,7 @@ Index: linux-2.6.5-12.1/fs/open.c
 +
 +              newattrs.ia_uid = user;
 +              newattrs.ia_gid = group;
-+              newattrs.ia_valid = ATTR_UID | ATTR_GID;
++              newattrs.ia_valid = ATTR_UID | ATTR_GID | ATTR_CTIME;
 +              newattrs.ia_valid |= ATTR_RAW;
 +              error = op->setattr_raw(inode, &newattrs);
 +              /* the file system wants to use normal vfs path now */
diff --git a/lustre/kernel_patches/series/2.6-suse-lnxi.series b/lustre/kernel_patches/series/2.6-suse-lnxi.series
deleted file mode 100644 (file)
index 86a2b59..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-dev_read_only-2.6-lnxi.patch
-sd_iostats-2.6-suse.patch
-blkdev_tunables-2.6-suse.patch
-bluesmoke-2.6-suse-lnxi.patch 
-mtd-2.6-suse-lnxi.patch 
-perfctr-2.6-suse-lnxi.patch 
-kexec-2.6-suse-lnxi.patch
-export-filemap_populate.patch
-grab_cache_page_nowait_gfp-2.6-suse.patch 
-remove-suid-2.6-suse.patch
-link_notlast-susefix.patch
-uml-exprt-clearuser.patch
-qsnet-suse-2.6.patch 
-fsprivate-2.6.patch
diff --git a/lustre/kernel_patches/series/2.6-suse-newer.series b/lustre/kernel_patches/series/2.6-suse-newer.series
new file mode 100644 (file)
index 0000000..c0de646
--- /dev/null
@@ -0,0 +1,8 @@
+lustre-version-revert_suse.patch
+lustre_version.patch
+dev_read_only-2.6-lnxi.patch
+sd_iostats-2.6-suse.patch
+blkdev_tunables-2.6-suse.patch
+uml-exprt-clearuser.patch
+qsnet-suse-2.6.patch 
+fsprivate-2.6.patch
index 0980162..8e76197 100644 (file)
@@ -9,4 +9,5 @@ ext3-include-fixes-2.6-rhel4.patch
 ext3-extents-2.6.9-rhel4.patch
 ext3-mballoc2-2.6.9-rhel4.patch 
 ext3-nlinks-2.6.7.patch
-ext3-htree-dot-2.6.patch
+ext3-htree-dot-2.6.patch 
+ext3-ialloc-2.6.patch
index c44eea3..2584c1d 100644 (file)
@@ -10,4 +10,5 @@ ext3-extents-2.6.5.patch
 ext3-mballoc2-2.6-suse.patch
 ext3-nlinks-2.6.7.patch
 ext3-rename-reserve-2.6-suse.patch
-ext3-htree-dot-2.6.5-suse.patch
+ext3-htree-dot-2.6.5-suse.patch 
+ext3-ialloc-2.6.patch
index 2482df4..2cc841f 100644 (file)
@@ -50,3 +50,4 @@ nfs_statfs-toomanyfiles-rhel-2.4.patch
 statfs64-cast-unsigned-2.4-rhel.patch
 fsprivate-2.4.patch
 nfsd_iallocsem.patch
+linux-2.4.24-jbd-handle-EIO.patch
index c0187e4..12b65ba 100644 (file)
@@ -39,3 +39,5 @@ grab_cache_page_nowait_gfp-2.4.21-suse2.patch
 remove-suid-2.4-rhel.patch
 fsprivate-2.4-suse.patch
 nfsd_iallocsem.patch
+linux-2.4.24-jbd-handle-EIO.patch
+ext3-ialloc-2.4.21-suse2.patch 
index 7b38830..bb22e80 100644 (file)
@@ -35,9 +35,11 @@ inode-max-readahead-2.4.24.patch
 ext3-extents-2.4.29.patch
 ext3-extents-asyncdel-2.4.24.patch
 ext3-nlinks-2.4.24.patch
+ext3-ialloc-2.4.24.patch
 export-show_task-2.4-vanilla.patch 
 export-zap-page-range.patch
 remove-suid-2.4-rhel.patch
 kallsyms-2.4.29.patch
 fsprivate-2.4.patch
 nfsd_iallocsem.patch
+linux-2.4.24-jbd-handle-EIO.patch
index a67deac..3647196 100644 (file)
@@ -1,9 +1,9 @@
 lnxmaj="2.6.5"
-lnxrel="7.141"
+lnxrel="7.191"
 
 KERNEL=linux-$lnxmaj-$lnxrel.tar.bz2
 # they include our patches
-SERIES=2.6-suse-lnxi.series
+SERIES=2.6-suse-newer.series
 VERSION=$lnxmaj
 EXTRA_VERSION="${lnxrel}_lustre.@VERSION@"
 LUSTRE_VERSION=@VERSION@
index 4d8423e..7ee0629 100644 (file)
@@ -3,7 +3,13 @@ SERIES             MNEMONIC                 COMMENT                     ARCH
 SUPPORTED KERNELS:
 rhel-2.4.21        linux-2.4.21-20.3EL      RHEL3 2.4.21                all
 2.6-suse           linux-2.6-suse           SLES9 SP1 kernel            all
-2.6-rhel4          linux-2.6-rhel4          RHEL4 2.6.9 kernel       i386,x86_64
+2.6-suse-newer     linux-2.6-suse           SLES9 SP1 kernel add-ons    all
+2.6-rhel4          linux-2.6-rhel4          RHEL4 2.6.9 kernel          all
+
+NB - The patches in the 2.6-suse series should already be in the SLES9 SP1
+     kernel.  The patches in the 2.6-suse-newer series are patches that
+     have been created since the SP1 kernel was released and should be
+     applied to the already-patched SP1 kernel.
 
 UNSUPPORTED KERNELS; BEING PHASED OUT; MAY BE MISSING CRITICAL BUG FIXES:
 hp-pnnl-2.4.20     linux-2.4.20-hp4_pnnl1   same as vanilla but no uml  ia64
index 53ca41e..0eff073 100644 (file)
@@ -38,7 +38,7 @@ sources: $(ext3_sources) $(ext3_headers) $(linux_headers) $(series)
        cp $(ext3_sources) $(ext3_headers) $(ext3_extra) linux-stage/fs/ext3
        cp $(linux_headers) linux-stage/include/linux
 if USE_QUILT
-       cd linux-stage && quilt setup -l ../$(series) -d ../$(patches)
+       cd linux-stage && quilt setup -d ../$(patches) ../$(series)
        cd linux-stage && quilt push -a -q
 else
        @echo -n "Applying ext3 patches:"
index fd229c3..09fda38 100644 (file)
@@ -3,20 +3,23 @@
  *
  * Copyright (C) 2001, 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.sf.net/projects/lustre/
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -124,7 +127,7 @@ void l_check_ns_lock(struct ldlm_namespace *ns)
         if (!l_has_lock(&ns->ns_lock) && time_after(jiffies, next_msg)) {
                 CERROR("namespace %s lock not held when it should be; tell "
                        "phil\n", ns->ns_name);
-                portals_debug_dumpstack(NULL);
+                libcfs_debug_dumpstack(NULL);
                 next_msg = jiffies + 60 * HZ;
         }
 }
@@ -136,7 +139,7 @@ void l_check_no_ns_lock(struct ldlm_namespace *ns)
         if (l_has_lock(&ns->ns_lock) && time_after(jiffies, next_msg)) {
                 CERROR("namespace %s lock held illegally; tell phil\n",
                        ns->ns_name);
-                portals_debug_dumpstack(NULL);
+                libcfs_debug_dumpstack(NULL);
                 next_msg = jiffies + 60 * HZ;
         }
 }
index 0cd1240..db4c152 100644 (file)
@@ -5,20 +5,23 @@
  *   Author: Peter Braam <braam@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_LDLM
@@ -148,6 +151,7 @@ static void ldlm_extent_policy(struct ldlm_resource *res,
 /* Determine if the lock is compatible with all locks on the queue.
  * We stop walking the queue if we hit ourselves so we don't take
  * conflicting locks enqueued after us into accound, or we'd wait forever.
+ *
  * 0 if the lock is not compatible
  * 1 if the lock is compatible
  * 2 if this group lock is compatible and requires no further checking
@@ -202,11 +206,11 @@ ldlm_extent_compat_queue(struct list_head *queue, struct ldlm_lock *req,
 
                 /* locks are compatible, overlap doesn't matter */
                 if (lockmode_compat(lock->l_req_mode, req_mode)) {
-                       /* non-group locks are compatible, overlap doesn't
-                          matter */
+                        /* non-group locks are compatible, overlap doesn't
+                           matter */
                         if (likely(req_mode != LCK_GROUP))
                                 continue;
-                                
+
                         /* If we are trying to get a GROUP lock and there is
                            another one of this kind, we need to compare gid */
                         if (req->l_policy_data.l_extent.gid ==
@@ -317,6 +321,12 @@ int ldlm_process_extent_lock(struct ldlm_lock *lock, int *flags, int first_enq,
         *err = ELDLM_OK;
 
         if (!first_enq) {
+                /* Careful observers will note that we don't handle -EWOULDBLOCK
+                 * here, but it's ok for a non-obvious reason -- compat_queue
+                 * can only return -EWOULDBLOCK if (flags & BLOCK_NOWAIT).
+                 * flags should always be zero here, and if that ever stops
+                 * being true, we want to find out. */
+                LASSERT(*flags == 0);
                 LASSERT(res->lr_tmp != NULL);
                 rc = ldlm_extent_compat_queue(&res->lr_granted, lock, 0, flags,
                                               err);
index b4bae36..a602e3b 100644 (file)
@@ -5,20 +5,23 @@
  *   Developed under the sponsorship of the US Government under
  *   Subcontract No. B514193
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_LDLM
index 7338654..caa70cd 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -404,7 +407,7 @@ int client_connect_import(struct lustre_handle *dlm_handle,
 
         imp->imp_dlm_handle = *dlm_handle;
         rc = ptlrpc_init_import(imp);
-        if (rc != 0) 
+        if (rc != 0)
                 GOTO(out_ldlm, rc);
 
         if (data)
@@ -500,7 +503,7 @@ int target_handle_reconnect(struct lustre_handle *conn, struct obd_export *exp,
                 hdl = &exp->exp_imp_reverse->imp_remote_handle;
                 /* Might be a re-connect after a partition. */
                 if (!memcmp(&conn->cookie, &hdl->cookie, sizeof conn->cookie)) {
-                        CERROR("%s reconnecting\n", cluuid->uuid);
+                        CWARN("%s reconnecting\n", cluuid->uuid);
                         conn->cookie = exp->exp_handle.h_cookie;
                         /* target_handle_connect() treats EALREADY and
                          * -EALREADY differently */
@@ -542,12 +545,12 @@ int target_handle_connect(struct ptlrpc_request *req, svc_handler_t handler)
         int size = sizeof(*data);
         ENTRY;
 
-        OBD_RACE(OBD_FAIL_TGT_CONN_RACE); 
+        OBD_RACE(OBD_FAIL_TGT_CONN_RACE);
 
         LASSERT_REQSWAB (req, 0);
         str = lustre_msg_string(req->rq_reqmsg, 0, sizeof(tgtuuid) - 1);
         if (str == NULL) {
-                DEBUG_REQ(D_ERROR, req, "bad target UUID for connect\n");
+                DEBUG_REQ(D_ERROR, req, "bad target UUID for connect");
                 GOTO(out, rc = -EINVAL);
         }
 
@@ -559,23 +562,23 @@ int target_handle_connect(struct ptlrpc_request *req, svc_handler_t handler)
 
         if (!target || target->obd_stopping || !target->obd_set_up) {
                 DEBUG_REQ(D_ERROR, req, "UUID '%s' is not available "
-                       " for connect (%s)\n", str,
-                       !target ? "no target" : 
-                       (target->obd_stopping ? "stopping" : "not set up"));
+                          " for connect (%s)", str,
+                          !target ? "no target" :
+                          (target->obd_stopping ? "stopping" : "not set up"));
                 GOTO(out, rc = -ENODEV);
         }
 
         LASSERT_REQSWAB (req, 1);
         str = lustre_msg_string(req->rq_reqmsg, 1, sizeof(cluuid) - 1);
         if (str == NULL) {
-                DEBUG_REQ(D_ERROR, req, "bad client UUID for connect\n");
+                DEBUG_REQ(D_ERROR, req, "bad client UUID for connect");
                 GOTO(out, rc = -EINVAL);
         }
 
         obd_str2uuid (&cluuid, str);
 
         /* XXX extract a nettype and format accordingly */
-        switch (sizeof(ptl_nid_t)) {
+        switch (sizeof(lnet_nid_t)) {
                 /* NB the casts only avoid compiler warnings */
         case 8:
                 snprintf(remote_uuid.uuid, sizeof remote_uuid,
@@ -697,9 +700,11 @@ int target_handle_connect(struct ptlrpc_request *req, svc_handler_t handler)
         export->exp_conn_cnt = req->rq_reqmsg->conn_cnt;
         spin_unlock_irqrestore(&export->exp_lock, flags);
 
-        /* request from liblustre? */
-        if (lustre_msg_get_op_flags(req->rq_reqmsg) & MSG_CONNECT_LIBCLIENT)
+        /* request from liblustre?  Don't evict it for not pinging. */
+        if (lustre_msg_get_op_flags(req->rq_reqmsg) & MSG_CONNECT_LIBCLIENT) {
                 export->exp_libclient = 1;
+                list_del_init(&export->exp_obd_chain_timed);
+        }
 
         if (export->exp_connection != NULL)
                 ptlrpc_put_connection(export->exp_connection);
@@ -1189,7 +1194,7 @@ int target_queue_final_reply(struct ptlrpc_request *req, int rc)
                 LBUG();
         memcpy(saved_req, req, sizeof *saved_req);
         memcpy(reqmsg, req->rq_reqmsg, req->rq_reqlen);
-        
+
         /* Don't race cleanup */
         spin_lock_bh(&obd->obd_processing_task_lock);
         if (obd->obd_stopping) {
@@ -1249,7 +1254,7 @@ target_send_reply_msg (struct ptlrpc_request *req, int rc, int fail_id)
         } else {
                 DEBUG_REQ(D_NET, req, "sending reply");
         }
-        
+
         return (ptlrpc_send_reply(req, 1));
 }
 
@@ -1264,7 +1269,6 @@ target_send_reply(struct ptlrpc_request *req, int rc, int fail_id)
         struct ptlrpc_service     *svc;
 
         svc = req->rq_rqbd->rqbd_service;
-        
         rs = req->rq_reply_state;
         if (rs == NULL || !rs->rs_difficult) {
                 /* no notifiers */
@@ -1353,8 +1357,7 @@ void target_committed_to_req(struct ptlrpc_request *req)
         if (!obd->obd_no_transno && req->rq_repmsg != NULL)
                 req->rq_repmsg->last_committed = obd->obd_last_committed;
         else
-                DEBUG_REQ(D_IOCTL, req,
-                          "not sending last_committed update");
+                DEBUG_REQ(D_IOCTL, req, "not sending last_committed update");
 
         CDEBUG(D_INFO, "last_committed "LPU64", xid "LPU64"\n",
                obd->obd_last_committed, req->rq_xid);
index b38c3b5..8749c69 100644 (file)
@@ -5,20 +5,23 @@
  *   Author: Peter Braam <braam@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_LDLM
@@ -167,7 +170,7 @@ void ldlm_lock_remove_from_lru(struct ldlm_lock *lock)
         EXIT;
 }
 
-/* This used to have a 'strict' flact, which recovery would use to mark an
+/* This used to have a 'strict' flag, which recovery would use to mark an
  * in-use lock as needing-to-die.  Lest I am ever tempted to put it back, I
  * shall explain why it's gone: with the new hash table scheme, once you call
  * ldlm_lock_destroy, you can never drop your final references on this lock.
@@ -1167,7 +1170,7 @@ void ldlm_lock_dump(int level, struct ldlm_lock *lock, int pos)
 {
         struct obd_device *obd = NULL;
 
-        if (!((portal_debug | D_ERROR) & level))
+        if (!((libcfs_debug | D_ERROR) & level))
                 return;
 
         if (!lock) {
index 875fcd6..79902d0 100644 (file)
@@ -5,20 +5,23 @@
  *   Author: Peter Braam <braam@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -111,7 +114,7 @@ static int expired_lock_main(void *arg)
 
         ENTRY;
         lock_kernel();
-        kportal_daemonize("ldlm_elt");
+        libcfs_daemonize("ldlm_elt");
 
         SIGNAL_MASK_LOCK(current, flags);
         sigfillset(&current->blocked);
@@ -134,8 +137,8 @@ static int expired_lock_main(void *arg)
                         spin_unlock_bh(&waiting_locks_spinlock);
 
                         /* from waiting_locks_callback, but not in timer */
-                        portals_debug_dumplog();
-                        portals_run_lbug_upcall(__FILE__,
+                        libcfs_debug_dumplog();
+                        libcfs_run_lbug_upcall(__FILE__,
                                                 "waiting_locks_callback",
                                                 expired_lock_thread.elt_dump);
 
@@ -188,7 +191,7 @@ static void waiting_locks_callback(unsigned long unused)
         struct ldlm_lock *lock, *last = NULL;
 
         if (obd_dump_on_timeout)
-                portals_debug_dumplog();
+                libcfs_debug_dumplog();
 
         spin_lock_bh(&waiting_locks_spinlock);
         while (!list_empty(&waiting_locks_list)) {
@@ -219,9 +222,9 @@ static void waiting_locks_callback(unsigned long unused)
 
                         /* LBUG(); */
                         CEMERG("would be an LBUG, but isn't (bug 5653)\n");
-                        portals_debug_dumpstack(NULL);
-                        /*blocks* portals_debug_dumplog(); */
-                        /*blocks* portals_run_lbug_upcall(file, func, line); */
+                        libcfs_debug_dumpstack(NULL);
+                        /*blocks* libcfs_debug_dumplog(); */
+                        /*blocks* libcfs_run_lbug_upcall(file, func, line); */
                         break;
                 }
                 last = lock;
@@ -268,7 +271,7 @@ static int ldlm_add_waiting_lock(struct ldlm_lock *lock)
                 LDLM_ERROR(lock, "not waiting on destroyed lock (bug 5653)");
                 if (time_after(jiffies, next)) {
                         next = jiffies + 14400 * HZ;
-                        portals_debug_dumpstack(NULL);
+                        libcfs_debug_dumpstack(NULL);
                 }
                 return 0;
         }
@@ -364,12 +367,13 @@ static void ldlm_failed_ast(struct ldlm_lock *lock, int rc,
         LCONSOLE_ERROR("A client on nid %s was evicted from service %s.\n",
                        str, lock->l_export->exp_obd->obd_name);
 
-        LDLM_ERROR(lock, "%s AST failed (%d): evicting client %s@%s NID "LPX64
+        LDLM_ERROR(lock, "%s AST failed (%d): evicting client %s@%s NID %s"
                    " (%s)", ast_type, rc, lock->l_export->exp_client_uuid.uuid,
-                   conn->c_remote_uuid.uuid, conn->c_peer.nid, str);
+                   conn->c_remote_uuid.uuid, libcfs_nid2str(conn->c_peer.nid), 
+                   str);
 
         if (obd_dump_on_timeout)
-                portals_debug_dumplog();
+                libcfs_debug_dumplog();
         class_fail_export(lock->l_export);
 }
 
@@ -377,7 +381,7 @@ static int ldlm_handle_ast_error(struct ldlm_lock *lock,
                                  struct ptlrpc_request *req, int rc,
                                  const char *ast_type)
 {
-        ptl_process_id_t peer = req->rq_import->imp_connection->c_peer;
+        lnet_process_id_t peer = req->rq_import->imp_connection->c_peer;
 
         if (rc == -ETIMEDOUT || rc == -EINTR || rc == -ENOTCONN) {
                 LASSERT(lock->l_export);
@@ -1332,7 +1336,7 @@ static int ldlm_bl_thread_main(void *arg)
                 char name[sizeof(current->comm)];
                 snprintf(name, sizeof(name) - 1, "ldlm_bl_%02d",
                          bltd->bltd_num);
-                kportal_daemonize(name);
+                libcfs_daemonize(name);
         }
         SIGNAL_MASK_LOCK(current, flags);
         sigfillset(&current->blocked);
@@ -1423,9 +1427,10 @@ static int ldlm_setup(void)
 
         ldlm_state->ldlm_cb_service =
                 ptlrpc_init_svc(LDLM_NBUFS, LDLM_BUFSIZE, LDLM_MAXREQSIZE,
-                                LDLM_CB_REQUEST_PORTAL, LDLM_CB_REPLY_PORTAL,
-                                1500, ldlm_callback_handler, "ldlm_cbd",
-                                ldlm_svc_proc_dir, NULL);
+                                LDLM_MAXREPSIZE, LDLM_CB_REQUEST_PORTAL,
+                                LDLM_CB_REPLY_PORTAL, 1500,
+                                ldlm_callback_handler, "ldlm_cbd",
+                                ldlm_svc_proc_dir, NULL, LDLM_NUM_THREADS);
 
         if (!ldlm_state->ldlm_cb_service) {
                 CERROR("failed to start service\n");
@@ -1434,10 +1439,10 @@ static int ldlm_setup(void)
 
         ldlm_state->ldlm_cancel_service =
                 ptlrpc_init_svc(LDLM_NBUFS, LDLM_BUFSIZE, LDLM_MAXREQSIZE,
-                                LDLM_CANCEL_REQUEST_PORTAL,
+                                LDLM_MAXREPSIZE, LDLM_CANCEL_REQUEST_PORTAL,
                                 LDLM_CANCEL_REPLY_PORTAL, 30000,
                                 ldlm_cancel_handler, "ldlm_canceld",
-                                ldlm_svc_proc_dir, NULL);
+                                ldlm_svc_proc_dir, NULL, LDLM_NUM_THREADS);
 
         if (!ldlm_state->ldlm_cancel_service) {
                 CERROR("failed to start service\n");
@@ -1470,13 +1475,13 @@ static int ldlm_setup(void)
                 wait_for_completion(&blp->blp_comp);
         }
 
-        rc = ptlrpc_start_n_threads(NULL, ldlm_state->ldlm_cancel_service,
-                                    LDLM_NUM_THREADS, "ldlm_cn");
+        rc = ptlrpc_start_threads(NULL, ldlm_state->ldlm_cancel_service,
+                                  "ldlm_cn");
         if (rc)
                 GOTO(out_thread, rc);
 
-        rc = ptlrpc_start_n_threads(NULL, ldlm_state->ldlm_cb_service,
-                                    LDLM_NUM_THREADS, "ldlm_cb");
+        rc = ptlrpc_start_threads(NULL, ldlm_state->ldlm_cb_service,
+                                  "ldlm_cb");
         if (rc)
                 GOTO(out_thread, rc);
 
index 9a693e3..d78160d 100644 (file)
@@ -5,20 +5,23 @@
  *   Author: Peter Braam <braam@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_LDLM
index f88f0ef..692d3bb 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_LDLM
@@ -59,7 +62,7 @@ int ldlm_expired_completion_wait(void *data)
                         ldlm_namespace_dump(D_DLMTRACE,
                                             lock->l_resource->lr_namespace);
                         if (last_dump == 0)
-                                portals_debug_dumplog();
+                                libcfs_debug_dumplog();
                 }
                 RETURN(0);
         }
index 9a5922b..6664101 100644 (file)
@@ -5,20 +5,23 @@
  *   Author: Phil Schwan <phil@clusterfs.com>
  *   Author: Peter Braam <braam@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_LDLM
@@ -140,7 +143,8 @@ static int lprocfs_write_lru_size(struct file *file, const char *buffer,
         unsigned long tmp;
 
         dummy[MAX_STRING_SIZE] = '\0';
-        copy_from_user(dummy, buffer, MAX_STRING_SIZE);
+        if (copy_from_user(dummy, buffer, MAX_STRING_SIZE))
+                return -EFAULT;
 
         if (count == 6 && memcmp(dummy, "clear", 5) == 0) {
                 CDEBUG(D_DLMTRACE,
@@ -561,7 +565,7 @@ struct ldlm_resource *ldlm_resource_getref(struct ldlm_resource *res)
         LASSERT(res != NULL);
         LASSERT(res != LP_POISON);
         atomic_inc(&res->lr_refcount);
-        CDEBUG(D_DLMTRACE, "getref res: %p count: %d\n", res,
+        CDEBUG(D_INFO, "getref res: %p count: %d\n", res,
                atomic_read(&res->lr_refcount));
         return res;
 }
@@ -572,7 +576,7 @@ int ldlm_resource_putref(struct ldlm_resource *res)
         int rc = 0;
         ENTRY;
 
-        CDEBUG(D_DLMTRACE, "putref res: %p count: %d\n", res,
+        CDEBUG(D_INFO, "putref res: %p count: %d\n", res,
                atomic_read(&res->lr_refcount) - 1);
         LASSERT(atomic_read(&res->lr_refcount) > 0);
         LASSERT(atomic_read(&res->lr_refcount) < LI_POISON);
index 6fac0b2..7de4a40 100644 (file)
@@ -16,14 +16,9 @@ LUSTRE_LIBS = libllite.a \
               $(top_builddir)/lustre/obdclass/liblustreclass.a \
               $(top_builddir)/lustre/lvfs/liblvfs.a
 
-if !CRAY_PORTALS
-PTL_LIBS =    $(top_builddir)/portals/utils/libuptlctl.a \
-              $(top_builddir)/portals/unals/libtcpnal.a \
-              $(top_builddir)/portals/portals/libportals.a
-else
-PTL_LIBS =    $(top_builddir)/portals/utils/libuptlctl.a \
-              $(CRAY_PORTALS_LIBS)/libportals.a
-endif
+PTL_LIBS =    $(top_builddir)/lnet/utils/libuptlctl.a \
+              $(top_builddir)/lnet/ulnds/socklnd/libsocklnd.a \
+              $(top_builddir)/lnet/lnet/liblnet.a
 
 SYSIO_LIBS =  $(SYSIO)/lib/libsysio.a
 
@@ -53,7 +48,7 @@ liblustre_a_SOURCES = llite_lib.c super.c namei.c rw.c file.c dir.c \
                     llite_lib.h
 
 liblustre.a : $(LUSTRE_LIBS) $(PTL_LIBS) $(SYSIO_LIBS)
-       sh $(srcdir)/genlib.sh "$(SYSIO)" "$(CRAY_PORTALS_LIBS)" "$(LIBS)"
+       sh $(srcdir)/genlib.sh "$(SYSIO)" "$(LIBS)"
 
 EXTRA_DIST = genlib.sh
 
index ec33ac3..4c1917a 100644 (file)
@@ -180,7 +180,7 @@ static int filldir(char *buf, int buflen,
                 return 1;
 
         dirent->d_ino = ino;
-        dirent->d_off = offset,
+        dirent->d_off = offset;
         dirent->d_reclen = reclen;
         dirent->d_type = (unsigned short) d_type;
         memcpy(dirent->d_name, name, namelen);
@@ -241,7 +241,7 @@ ssize_t llu_iop_getdirentries(struct inode *ino, char *buf, size_t nbytes,
 
                                 offset = (char*) de - addr;
                                 over =  filldir(buf, nbytes, de->name, de->name_len,
-                                                (pgidx << PAGE_SHIFT) | offset,
+                                                ((pgidx << PAGE_SHIFT) | offset) + le16_to_cpu(de->rec_len),
                                                 le32_to_cpu(de->inode), d_type, &filled);
                                 if (over) {
                                         free_page(page);
index b7f4b55..c5e3cf8 100644 (file)
 
 #include "llite_lib.h"
 
+/* Pack the required supplementary groups into the supplied groups array.
+ * If we don't need to use the groups from the target inode(s) then we
+ * instead pack one or more groups from the user's supplementary group
+ * array in case it might be useful.  Not needed if doing an MDS-side upcall. */
+void ll_i2gids(__u32 *suppgids, struct inode *i1, struct inode *i2)
+{
+        LASSERT(i1 != NULL);
+        LASSERT(suppgids != NULL);
+
+        if (in_group_p(i1->i_stbuf.st_gid))
+                suppgids[0] = i1->i_stbuf.st_gid;
+        else
+                suppgids[0] = -1;
+
+        if (i2) {
+                if (in_group_p(i2->i_stbuf.st_gid))
+                        suppgids[1] = i2->i_stbuf.st_gid;
+                else
+                        suppgids[1] = -1;
+        } else {
+                suppgids[1] = -1;
+        }
+}
+
 void llu_prepare_mdc_op_data(struct mdc_op_data *data,
                              struct inode *i1,
                              struct inode *i2,
@@ -55,13 +79,14 @@ void llu_prepare_mdc_op_data(struct mdc_op_data *data,
                              int mode)
 {
         LASSERT(i1);
-        
-        ll_i2uctxt(&data->ctxt, i1, i2);
+
+        ll_i2gids(data->suppgids, i1, i2);
         ll_inode2fid(&data->fid1, i1);
 
-        if (i2) {
+        if (i2)
                 ll_inode2fid(&data->fid2, i2);
-        }
+        else
+                memset(&data->fid2, 0, sizeof(data->fid2));
 
         data->name = name;
         data->namelen = namelen;
@@ -147,7 +172,7 @@ int llu_iop_open(struct pnode *pnode, int flags, mode_t mode)
         if (llu_is_root_inode(inode))
                 RETURN(0);
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu\n", st->st_ino);
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu\n", (long long)st->st_ino);
         LL_GET_INTENT(inode, it);
 
         if (!it->d.lustre.it_disposition) {
@@ -214,6 +239,7 @@ int llu_objects_destroy(struct ptlrpc_request *request, struct inode *dir)
         int rc;
         ENTRY;
 
+        oti.oti_thread = request->rq_svc_thread;
         /* req is swabbed so this is safe */
         body = lustre_msg_buf(request->rq_repmsg, 0, sizeof(*body));
 
@@ -313,12 +339,13 @@ int llu_mdc_close(struct obd_export *mdc_exp, struct inode *inode)
                 //ll_queue_done_writing(inode);
                 rc = 0;
         } else if (rc) {
-                CERROR("inode %llu close failed: rc %d\n", st->st_ino, rc);
+                CERROR("inode %llu close failed: rc %d\n",
+                       (long long)st->st_ino, rc);
         } else {
                 rc = llu_objects_destroy(req, inode);
                 if (rc)
                         CERROR("inode %llu ll_objects destroy: rc = %d\n",
-                                st->st_ino, rc);
+                               (long long)st->st_ino, rc);
         }
 
         mdc_clear_open_replay_data(och);
@@ -338,8 +365,8 @@ int llu_file_release(struct inode *inode)
         int rc = 0, rc2;
 
         ENTRY;
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu/%lu\n", llu_i2stat(inode)->st_ino,
-               lli->lli_st_generation);
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu/%lu\n",
+               (long long)llu_i2stat(inode)->st_ino, lli->lli_st_generation);
 
         if (llu_is_root_inode(inode))
                 RETURN(0);
@@ -400,12 +427,13 @@ static void llu_truncate(struct inode *inode)
         struct obdo oa = {0};
         int rc;
         ENTRY;
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu/%lu(%p) to %llu\n", st->st_ino,
-               lli->lli_st_generation, inode, st->st_size);
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu/%lu(%p) to %llu\n",
+               (long long)st->st_ino, lli->lli_st_generation, inode,
+               (long long)st->st_size);
 
         if (!lsm) {
                 CDEBUG(D_INODE, "truncate on inode %llu with no objects\n",
-                       st->st_ino);
+                       (long long)st->st_ino);
                 EXIT;
                 return;
         }
@@ -418,13 +446,14 @@ static void llu_truncate(struct inode *inode)
         obd_adjust_kms(llu_i2obdexp(inode), lsm, st->st_size, 1);
 
         CDEBUG(D_INFO, "calling punch for "LPX64" (all bytes after %Lu)\n",
-               oa.o_id, st->st_size);
+               oa.o_id, (long long)st->st_size);
 
         /* truncate == punch from new size to absolute end of file */
         rc = obd_punch(llu_i2obdexp(inode), &oa, lsm, st->st_size,
                        OBD_OBJECT_EOF, NULL);
         if (rc)
-                CERROR("obd_truncate fails (%d) ino %llu\n", rc, st->st_ino);
+                CERROR("obd_truncate fails (%d) ino %llu\n",
+                       rc, (long long)st->st_ino);
         else
                 obdo_to_inode(inode, &oa, OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
                                           OBD_MD_FLATIME | OBD_MD_FLMTIME |
index f70116d..7de5e27 100755 (executable)
@@ -1,5 +1,6 @@
 #!/bin/bash
 #set -xv
+set -e
 
 #
 # This script is to generate lib lustre library as a whole. It will leave
@@ -17,8 +18,7 @@ RANLIB=/usr/bin/ranlib
 CWD=`pwd`
 
 SYSIO=$1
-CRAY_PORTALS_LIBS=$2
-LIBS=$3
+LIBS=$2
 
 if [ ! -f $SYSIO/lib/libsysio.a ]; then
   echo "ERROR: $SYSIO/lib/libsysio.a dosen't exist"
@@ -53,22 +53,6 @@ build_sysio_obj_list() {
   done
 }
 
-#
-# special treatment for libportals.a
-#
-cray_tmp=$CWD/cray_tmp_`date +%s`
-rm -rf $cray_tmp
-build_cray_portals_obj_list() {
-  _objs=`$AR -t $1`
-  mkdir -p $cray_tmp
-  cd $cray_tmp
-  $AR -x $1
-  cd ..
-  for _lib in $_objs; do
-    ALL_OBJS=$ALL_OBJS"$cray_tmp/$_lib ";
-  done
-}
-
 # lustre components libs
 build_obj_list . libllite.a
 build_obj_list ../lov liblov.a
@@ -79,16 +63,10 @@ build_obj_list ../ptlrpc libptlrpc.a
 build_obj_list ../obdclass liblustreclass.a
 build_obj_list ../lvfs liblvfs.a
 
-# portals components libs
-build_obj_list ../../portals/utils libuptlctl.a
-
-if [ "x$CRAY_PORTALS_LIBS" = "x" ]; then
-  build_obj_list ../../portals/unals libtcpnal.a
-  build_obj_list ../../portals/portals libportals.a
-# if libportals is already in our LIBS we don't need to link against it here
-elif $(echo "$LIBS" | grep -v -- "-lportals" >/dev/null) ; then
-  build_cray_portals_obj_list $CRAY_PORTALS_LIBS/libportals.a
-fi
+# lnet components libs
+build_obj_list ../../lnet/utils libuptlctl.a
+build_obj_list ../../lnet/ulnds/socklnd libsocklnd.a
+build_obj_list ../../lnet/lnet liblnet.a
 
 # create static lib lsupport
 rm -f $CWD/liblsupport.a
@@ -111,4 +89,3 @@ $LD -shared -o $CWD/liblustre.so -init __liblustre_setup_ -fini __liblustre_clea
        $ALL_OBJS -lcap -lpthread
 
 rm -rf $sysio_tmp
-rm -rf $cray_tmp
index 9a69750..10e3472 100644 (file)
  * of 'LIST_HEAD'. undef it to suppress warnings
  */
 #undef LIST_HEAD
-#include <portals/ptlctl.h>     /* needed for parse_dump */
+#include <lnet/lnetctl.h>     /* needed for parse_dump */
 
 #include "lutil.h"
 #include "llite_lib.h"
 
 static int lllib_init(void)
 {
-        if (liblustre_init_current("dummy") ||
+        if (liblustre_init_current("liblustre") ||
             init_obdclass() ||
             init_lib_portals() ||
             ptlrpc_init() ||
@@ -85,7 +85,7 @@ int liblustre_process_log(struct config_llog_instance *cfg,
         class_uuid_t uuid;
         struct obd_uuid mdc_uuid;
         struct llog_ctxt *ctxt;
-        ptl_nid_t nid = 0;
+        lnet_nid_t nid = 0;
         int err, rc = 0;
         ENTRY;
 
@@ -93,7 +93,7 @@ int liblustre_process_log(struct config_llog_instance *cfg,
         class_uuid_unparse(uuid, &mdc_uuid);
 
         nid = libcfs_str2nid(mdsnid);
-        if (nid == PTL_NID_ANY) {
+        if (nid == LNET_NID_ANY) {
                 CERROR("Can't parse NID %s\n", mdsnid);
                 RETURN(-EINVAL);
         }
@@ -102,43 +102,42 @@ int liblustre_process_log(struct config_llog_instance *cfg,
         lustre_cfg_bufs_set_string(&bufs, 1, peer);
         lcfg = lustre_cfg_new(LCFG_ADD_UUID, &bufs);
         lcfg->lcfg_nid = nid;
-        err = class_process_config(lcfg);
+        rc = class_process_config(lcfg);
         lustre_cfg_free(lcfg);
-        if (err < 0)
-                GOTO(out, err);
+        if (rc < 0)
+                GOTO(out, rc);
 
         lustre_cfg_bufs_reset(&bufs, name);
         lustre_cfg_bufs_set_string(&bufs, 1, LUSTRE_MDC_NAME);
         lustre_cfg_bufs_set_string(&bufs, 2, mdc_uuid.uuid);
         lcfg = lustre_cfg_new(LCFG_ATTACH, &bufs);
-        err = class_process_config(lcfg);
+        rc = class_process_config(lcfg);
         lustre_cfg_free(lcfg);
-        if (err < 0)
-                GOTO(out_del_uuid, err);
+        if (rc < 0)
+                GOTO(out_del_uuid, rc);
 
         lustre_cfg_bufs_reset(&bufs, name);
         lustre_cfg_bufs_set_string(&bufs, 1, mdsname);
         lustre_cfg_bufs_set_string(&bufs, 2, peer);
         lcfg = lustre_cfg_new(LCFG_SETUP, &bufs);
-        err = class_process_config(lcfg);
+        rc = class_process_config(lcfg);
         lustre_cfg_free(lcfg);
-        if (err < 0)
-                GOTO(out_detach, err);
+        if (rc < 0)
+                GOTO(out_detach, rc);
 
         obd = class_name2obd(name);
         if (obd == NULL)
-                GOTO(out_cleanup, err = -EINVAL);
+                GOTO(out_cleanup, rc = -EINVAL);
 
         /* Disable initial recovery on this import */
-        err = obd_set_info(obd->obd_self_export,
-                           strlen("initial_recov"), "initial_recov",
-                           sizeof(allow_recov), &allow_recov);
+        rc = obd_set_info(obd->obd_self_export,
+                          strlen("initial_recov"), "initial_recov",
+                          sizeof(allow_recov), &allow_recov);
 
-        err = obd_connect(&mdc_conn, obd, &mdc_uuid, NULL /*connect_flags*/);
-        if (err) {
-                CERROR("cannot connect to %s: rc = %d\n",
-                        mdsname, err);
-                GOTO(out_cleanup, err);
+        rc = obd_connect(&mdc_conn, obd, &mdc_uuid, NULL /*connect_flags*/);
+        if (rc) {
+                CERROR("cannot connect to %s: rc = %d\n", mdsname, rc);
+                GOTO(out_cleanup, rc);
         }
 
         exp = class_conn2export(&mdc_conn);
@@ -149,33 +148,37 @@ int liblustre_process_log(struct config_llog_instance *cfg,
                 CERROR("class_config_parse_llog failed: rc = %d\n", rc);
         }
 
+        /* We don't so much care about errors in cleaning up the config llog
+         * connection, as we have already read the config by this point. */
         err = obd_disconnect(exp);
+        if (err)
+                CERROR("obd_disconnect failed: rc = %d\n", err);
 
 out_cleanup:
         lustre_cfg_bufs_reset(&bufs, name);
         lcfg = lustre_cfg_new(LCFG_CLEANUP, &bufs);
         err = class_process_config(lcfg);
         lustre_cfg_free(lcfg);
-        if (err < 0)
-                GOTO(out, err);
+        if (err)
+                CERROR("mdc_cleanup failed: rc = %d\n", err);
 
 out_detach:
         lustre_cfg_bufs_reset(&bufs, name);
         lcfg = lustre_cfg_new(LCFG_DETACH, &bufs);
         err = class_process_config(lcfg);
         lustre_cfg_free(lcfg);
-        if (err < 0)
-                GOTO(out, err);
+        if (err)
+                CERROR("mdc_detach failed: rc = %d\n", err);
 
 out_del_uuid:
         lustre_cfg_bufs_reset(&bufs, name);
         lustre_cfg_bufs_set_string(&bufs, 1, peer);
         lcfg = lustre_cfg_new(LCFG_DEL_UUID, &bufs);
         err = class_process_config(lcfg);
+        if (err)
+                CERROR("del MDC UUID failed: rc = %d\n", err);
         lustre_cfg_free(lcfg);
 out:
-        if (rc == 0)
-                rc = err;
 
         RETURN(rc);
 }
@@ -243,8 +246,8 @@ int _sysio_lustre_init(void)
 #endif
 
 #if 0
-        portal_debug = -1;
-        portal_subsystem_debug = -1;
+        libcfs_debug = -1;
+        libcfs_subsystem_debug = -1;
 #endif
 
         liblustre_init_random();
@@ -264,11 +267,11 @@ int _sysio_lustre_init(void)
         /* debug masks */
         debug_mask = getenv(ENV_LUSTRE_DEBUG_MASK);
         if (debug_mask)
-                portal_debug = (unsigned int) strtol(debug_mask, NULL, 0);
+                libcfs_debug = (unsigned int) strtol(debug_mask, NULL, 0);
 
         debug_subsys = getenv(ENV_LUSTRE_DEBUG_SUBSYS);
         if (debug_subsys)
-                portal_subsystem_debug =
+                libcfs_subsystem_debug =
                                 (unsigned int) strtol(debug_subsys, NULL, 0);
 
 #ifndef INIT_SYSIO
@@ -354,14 +357,12 @@ void __liblustre_cleanup_(void)
         /* we can't call umount here, because libsysio will not cleanup
          * opening files for us. _sysio_shutdown() will cleanup fds at
          * first but which will also close the sockets we need for umount
-         * liblutre. this delima lead to another hack in
+         * liblutre. this dilema lead to another hack in
          * libsysio/src/file_hack.c FIXME
          */
-#ifdef INIT_SYSIO
         _sysio_shutdown();
+#ifdef INIT_SYSIO
         cleanup_lib_portals();
-        PtlFini();
-#else
-        _sysio_shutdown();
+        LNetFini();
 #endif
 }
index e254ea0..3cfc29f 100644 (file)
@@ -113,11 +113,11 @@ static inline int llu_is_root_inode(struct inode *inode)
 do {                                                                           \
         struct lookup_intent *temp;                                            \
         LASSERT(llu_i2info(inode)->lli_it == NULL);                            \
-               OBD_ALLOC(temp, sizeof(*temp));                                        \
+        OBD_ALLOC(temp, sizeof(*temp));                                        \
         memcpy(temp, it, sizeof(*temp));                                       \
         llu_i2info(inode)->lli_it = temp;                                      \
         CDEBUG(D_DENTRY, "alloc intent %p to inode %p(ino %llu)\n",            \
-                        temp, inode, llu_i2stat(inode)->st_ino);               \
+                        temp, inode, (long long)llu_i2stat(inode)->st_ino);    \
 } while(0)
 
 
@@ -128,7 +128,7 @@ do {                                                                           \
         LASSERT(it);                                                           \
         llu_i2info(inode)->lli_it = NULL;                                      \
         CDEBUG(D_DENTRY, "dettach intent %p from inode %p(ino %llu)\n",        \
-                        it, inode, llu_i2stat(inode)->st_ino);                 \
+                        it, inode, (long long)llu_i2stat(inode)->st_ino);      \
 } while(0)
 
 /* interpet return codes from intent lookup */
@@ -146,29 +146,7 @@ struct it_cb_data {
         obd_id hash;
 };
 
-static inline void ll_i2uctxt(struct ll_uctxt *ctxt, struct inode *i1,
-                              struct inode *i2)
-{
-        struct intnl_stat *st = llu_i2stat(i1);
-
-        LASSERT(i1);
-        LASSERT(ctxt);
-
-        if (in_group_p(st->st_gid))
-                ctxt->gid1 = st->st_gid;
-        else
-                ctxt->gid1 = -1;
-
-        if (i2) {
-                st = llu_i2stat(i2);
-                if (in_group_p(st->st_gid))
-                        ctxt->gid2 = st->st_gid;
-                else
-                        ctxt->gid2 = -1;
-        } else 
-                ctxt->gid2 = 0;
-}
-
+void ll_i2gids(__u32 *suppgids, struct inode *i1,struct inode *i2);
 
 typedef int (*intent_finish_cb)(struct ptlrpc_request *,
                                 struct inode *parent, struct pnode *pnode, 
index 2227b0b..a429b07 100644 (file)
 
 #include "lutil.h"
 
-#if CRAY_PORTALS
-void portals_debug_dumplog(void){};
-#endif
 
-unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_NAL);
-unsigned int portal_debug = 0;
+unsigned int libcfs_subsystem_debug = ~0 - (S_PORTALS | S_NAL);
+unsigned int libcfs_debug = 0;
 
 struct task_struct     *current;
 
@@ -86,7 +83,7 @@ static int get_ipv4_addr()
         if (hptr == NULL ||
             hptr->h_addrtype != AF_INET ||
             *hptr->h_addr_list == NULL) {
-                printf("LibLustre: Warning: fail to get local IPv4 address\n");
+                CWARN("Warning: fail to get local IPv4 address\n");
                 return 0;
         }
 
@@ -152,8 +149,8 @@ static void init_capability(int *res)
 
         syscap = cap_get_proc();
         if (!syscap) {
-                printf("Liblustre: Warning: failed to get system capability, "
-                       "set to minimal\n");
+                CWARN("Warning: failed to get system capability, "
+                      "set to minimal\n");
                 return;
         }
 
@@ -231,13 +228,12 @@ void generate_random_uuid(unsigned char uuid_out[16])
 
 int init_lib_portals()
 {
-        int max_interfaces;
         int rc;
         ENTRY;
 
-        rc = PtlInit(&max_interfaces);
-        if (rc != PTL_OK) {
-                CERROR("PtlInit failed: %d\n", rc);
+        rc = LNetInit();
+        if (rc != 0) {
+                CERROR("LNetInit failed: %d\n", rc);
                 RETURN (-ENXIO);
         }
         RETURN(0);
index 9e69a9e..e173996 100644 (file)
@@ -104,13 +104,14 @@ void unhook_stale_inode(struct pnode *pno)
 
 void llu_lookup_finish_locks(struct lookup_intent *it, struct pnode *pnode)
 {
+        struct inode *inode;
         LASSERT(it);
         LASSERT(pnode);
 
-        if (it && pnode->p_base->pb_ino != NULL) {
-                struct inode *inode = pnode->p_base->pb_ino;
+        inode = pnode->p_base->pb_ino;
+        if (it->d.lustre.it_lock_mode && inode != NULL) {
                 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%llu/%lu)\n",
-                       inode, llu_i2stat(inode)->st_ino,
+                       inode, (long long)llu_i2stat(inode)->st_ino,
                        llu_i2info(inode)->lli_st_generation);
                 mdc_set_lock_data(&it->d.lustre.it_lock_handle, inode);
         }
@@ -159,13 +160,13 @@ int llu_mdc_blocking_ast(struct ldlm_lock *lock,
                 clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK, &lli->lli_flags);
 
                 if (lock->l_resource->lr_name.name[0] != st->st_ino ||
-                    lock->l_resource->lr_name.name[1] != lli->lli_st_generation) {
+                    lock->l_resource->lr_name.name[1] !=lli->lli_st_generation){
                         LDLM_ERROR(lock, "data mismatch with ino %llu/%lu",
-                                   st->st_ino, lli->lli_st_generation);
+                                  (long long)st->st_ino,lli->lli_st_generation);
                 }
                 if (S_ISDIR(st->st_mode)) {
                         CDEBUG(D_INODE, "invalidating inode %llu\n",
-                               st->st_ino);
+                               (long long)st->st_ino);
 
                         llu_invalidate_inode_pages(inode);
                 }
@@ -215,9 +216,8 @@ static int pnode_revalidate_finish(struct ptlrpc_request *req,
 int llu_pb_revalidate(struct pnode *pnode, int flags, struct lookup_intent *it)
 {
         struct pnode_base *pb = pnode->p_base;
-        struct ll_fid pfid, cfid;
         struct it_cb_data icbd;
-        struct ll_uctxt ctxt;
+        struct mdc_op_data op_data;
         struct ptlrpc_request *req = NULL;
         struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
         struct obd_export *exp;
@@ -244,7 +244,7 @@ int llu_pb_revalidate(struct pnode *pnode, int flags, struct lookup_intent *it)
                 if (lli->lli_it) {
                         CDEBUG(D_INODE, "inode %llu still have intent "
                                         "%p(opc 0x%x), release it\n",
-                                        st->st_ino, lli->lli_it,
+                                        (long long) st->st_ino, lli->lli_it,
                                         lli->lli_it->it_op);
                         ll_intent_release(lli->lli_it);
                         OBD_FREE(lli->lli_it, sizeof(*lli->lli_it));
@@ -253,8 +253,6 @@ int llu_pb_revalidate(struct pnode *pnode, int flags, struct lookup_intent *it)
         }
 
         exp = llu_i2mdcexp(pb->pb_ino);
-        ll_inode2fid(&pfid, pnode->p_parent->p_base->pb_ino);
-        ll_inode2fid(&cfid, pb->pb_ino);
         icbd.icbd_parent = pnode->p_parent->p_base->pb_ino;
         icbd.icbd_child = pnode;
 
@@ -263,12 +261,11 @@ int llu_pb_revalidate(struct pnode *pnode, int flags, struct lookup_intent *it)
                 it->it_op_release = ll_intent_release;
         }
 
-        ll_i2uctxt(&ctxt, pnode->p_parent->p_base->pb_ino, pb->pb_ino);
+        llu_prepare_mdc_op_data(&op_data, pnode->p_parent->p_base->pb_ino,
+                                pb->pb_ino, pb->pb_name.name,pb->pb_name.len,0);
 
-        rc = mdc_intent_lock(exp, &ctxt, &pfid,
-                             pb->pb_name.name, pb->pb_name.len,
-                             NULL, 0, &cfid, it, flags, &req,
-                             llu_mdc_blocking_ast);
+        rc = mdc_intent_lock(exp, &op_data, NULL, 0, it, flags,
+                             &req, llu_mdc_blocking_ast);
         /* If req is NULL, then mdc_intent_lock only tried to do a lock match;
          * if all was well, it will return 1 if it found locks, 0 otherwise. */
         if (req == NULL && rc >= 0)
@@ -411,8 +408,7 @@ struct inode *llu_inode_from_lock(struct ldlm_lock *lock)
 static int llu_lookup_it(struct inode *parent, struct pnode *pnode,
                          struct lookup_intent *it, int flags)
 {
-        struct ll_fid pfid;
-        struct ll_uctxt ctxt;
+        struct mdc_op_data op_data;
         struct it_cb_data icbd;
         struct ptlrpc_request *req = NULL;
         struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
@@ -429,18 +425,16 @@ static int llu_lookup_it(struct inode *parent, struct pnode *pnode,
 
         icbd.icbd_child = pnode;
         icbd.icbd_parent = parent;
-        icbd.icbd_child = pnode;
-        ll_inode2fid(&pfid, parent);
-        ll_i2uctxt(&ctxt, parent, NULL);
-
-        rc = mdc_intent_lock(llu_i2mdcexp(parent), &ctxt, &pfid,
-                             pnode->p_base->pb_name.name,
-                             pnode->p_base->pb_name.len,
-                             NULL, 0, NULL, it, flags, &req,
-                             llu_mdc_blocking_ast);
+
+        llu_prepare_mdc_op_data(&op_data, parent, NULL,
+                                pnode->p_base->pb_name.name,
+                                pnode->p_base->pb_name.len, flags);
+
+        rc = mdc_intent_lock(llu_i2mdcexp(parent), &op_data, NULL, 0, it,
+                             flags, &req, llu_mdc_blocking_ast);
         if (rc < 0)
                 GOTO(out, rc);
-        
+
         rc = lookup_it_finish(req, 1, it, &icbd);
         if (rc != 0) {
                 ll_intent_release(it);
@@ -508,6 +502,12 @@ translate_lookup_intent(struct intent *intent, const char *path)
         if (it->it_flags & O_CREAT) {
                 it->it_op |= IT_CREAT;
                 it->it_create_mode = *((int*)intent->int_arg1);
+                /* bug 7278: libsysio hack. For O_EXCL, libsysio depends on
+                   this lookup to return negative result, but then there is no
+                   way to find out original intent in ll_iop_open(). So we just
+                   clear O_EXCL from libsysio flags here to avoid checking
+                   for negative result. O_EXCL will be enforced by MDS. */
+                *((int*)intent->int_arg2) &= ~O_EXCL;
         }
 
         if (intent->int_opmask & INT_GETATTR)
index a20e18c..f548b88 100644 (file)
@@ -203,7 +203,7 @@ static int llu_glimpse_callback(struct ldlm_lock *lock, void *reqp)
         lvb->lvb_size = lli->lli_smd->lsm_oinfo[stripe].loi_kms;
 
         LDLM_DEBUG(lock, "i_size: %llu -> stripe number %u -> kms "LPU64,
-                   llu_i2stat(inode)->st_size, stripe, lvb->lvb_size);
+                   (long long)llu_i2stat(inode)->st_size, stripe,lvb->lvb_size);
  iput:
         I_RELE(inode);
  out:
@@ -228,7 +228,7 @@ int llu_glimpse_size(struct inode *inode)
         int rc, flags = LDLM_FL_HAS_INTENT;
         ENTRY;
 
-        CDEBUG(D_DLMTRACE, "Glimpsing inode %llu\n", st->st_ino);
+        CDEBUG(D_DLMTRACE, "Glimpsing inode %llu\n", (long long)st->st_ino);
 
         rc = obd_enqueue(sbi->ll_osc_exp, lli->lli_smd, LDLM_EXTENT, &policy,
                          LCK_PR, &flags, llu_extent_lock_callback,
@@ -241,10 +241,10 @@ int llu_glimpse_size(struct inode *inode)
 
         st->st_size = lov_merge_size(lli->lli_smd, 0);
         st->st_blocks = lov_merge_blocks(lli->lli_smd);
-        //lli->lli_st_mtime = lov_merge_mtime(lli->lli_smd, inode->i_mtime);
+        st->st_mtime = lov_merge_mtime(lli->lli_smd, st->st_mtime);
 
         CDEBUG(D_DLMTRACE, "glimpse: size: %llu, blocks: %llu\n",
-               st->st_size, st->st_blocks);
+               (long long)st->st_size, (long long)st->st_blocks);
 
         obd_cancel(sbi->ll_osc_exp, lli->lli_smd, LCK_PR, &lockh);
 
@@ -269,7 +269,8 @@ int llu_extent_lock(struct ll_file_data *fd, struct inode *inode,
                 RETURN(0);
 
         CDEBUG(D_DLMTRACE, "Locking inode %llu, start "LPU64" end "LPU64"\n",
-               st->st_ino, policy->l_extent.start, policy->l_extent.end);
+               (long long)st->st_ino, policy->l_extent.start,
+               policy->l_extent.end);
 
         rc = obd_enqueue(sbi->ll_osc_exp, lsm, LDLM_EXTENT, policy, mode,
                          &ast_flags, llu_extent_lock_callback,
@@ -282,7 +283,8 @@ int llu_extent_lock(struct ll_file_data *fd, struct inode *inode,
             policy->l_extent.end == OBD_OBJECT_EOF)
                 st->st_size = lov_merge_size(lsm, 1);
 
-        //inode->i_mtime = lov_merge_mtime(lsm, inode->i_mtime);
+        if (rc == 0)
+                st->st_mtime = lov_merge_mtime(lsm, st->st_mtime);
 
         RETURN(rc);
 }
@@ -330,7 +332,7 @@ static void llu_ap_fill_obdo(void *data, int cmd, struct obdo *oa)
         oa->o_id = lsm->lsm_object_id;
         oa->o_valid = OBD_MD_FLID;
         valid_flags = OBD_MD_FLTYPE | OBD_MD_FLATIME;
-        if (cmd == OBD_BRW_WRITE)
+        if (cmd & OBD_BRW_WRITE)
                 valid_flags |= OBD_MD_FLMTIME | OBD_MD_FLCTIME;
 
         obdo_from_inode(oa, inode, valid_flags);
@@ -349,36 +351,18 @@ static void llu_ap_completion(void *data, int cmd, struct obdo *oa, int rc)
         page = llap->llap_page;
 
         if (rc != 0) {
-                if (cmd == OBD_BRW_WRITE)
+                if (cmd & OBD_BRW_WRITE)
                         CERROR("writeback error on page %p index %ld: %d\n", 
                                page, page->index, rc);
         }
         EXIT;
 }
 
-static void llu_ap_get_ucred(void *data, struct lvfs_ucred *luc)
-{
-        struct ll_async_page *llap;
-        struct ll_uctxt ctxt;
-        ENTRY; 
-        
-        llap = LLAP_FROM_COOKIE(data);
-        
-        luc->luc_fsuid = current->fsuid;
-        luc->luc_fsgid = current->fsgid;
-        luc->luc_cap = current->cap_effective;
-        ll_i2uctxt(&ctxt, llap->llap_inode, NULL);
-        luc->luc_suppgid1 = ctxt.gid1;
-        
-        EXIT;
-}
-
 static struct obd_async_page_ops llu_async_page_ops = {
         .ap_make_ready =        NULL,
         .ap_refresh_count =     NULL,
         .ap_fill_obdo =         llu_ap_fill_obdo,
         .ap_completion =        llu_ap_completion,
-        .ap_get_ucred =         llu_ap_get_ucred,
 };
 
 static int llu_queue_pio(int cmd, struct llu_io_group *group,
index 5dcd3b8..2b4b71a 100644 (file)
@@ -140,7 +140,7 @@ void llu_update_inode(struct inode *inode, struct mds_body *body,
                 } else {
                         if (memcmp(lli->lli_smd, lsm, sizeof(*lsm))) {
                                 CERROR("lsm mismatch for inode %lld\n",
-                                       st->st_ino);
+                                       (long long)st->st_ino);
                                 LBUG();
                         }
                 }
@@ -441,7 +441,8 @@ static int llu_inode_revalidate(struct inode *inode)
                 ll_inode2fid(&fid, inode);
                 rc = mdc_getattr(sbi->ll_mdc_exp, &fid, valid, ealen, &req);
                 if (rc) {
-                        CERROR("failure %d inode %llu\n", rc, llu_i2stat(inode)->st_ino);
+                        CERROR("failure %d inode %llu\n", rc,
+                               (long long)llu_i2stat(inode)->st_ino);
                         RETURN(-abs(rc));
                 }
                 rc = mdc_req2lustre_md(req, 0, sbi->ll_osc_exp, &md);
@@ -534,7 +535,8 @@ void llu_clear_inode(struct inode *inode)
         ENTRY;
 
         CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu/%lu(%p)\n",
-               llu_i2stat(inode)->st_ino, lli->lli_st_generation, inode);
+               (long long)llu_i2stat(inode)->st_ino, lli->lli_st_generation,
+               inode);
 
         ll_inode2fid(&fid, inode);
         clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK, &(lli->lli_flags));
@@ -626,12 +628,13 @@ int llu_setattr_raw(struct inode *inode, struct iattr *attr)
         int rc = 0;
         ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu\n", st->st_ino);
+        CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu\n", (long long)st->st_ino);
 
         if (ia_valid & ATTR_SIZE) {
                 if (attr->ia_size > ll_file_maxbytes(inode)) {
                         CDEBUG(D_INODE, "file too large %llu > "LPU64"\n",
-                               attr->ia_size, ll_file_maxbytes(inode));
+                               (long long)attr->ia_size,
+                               ll_file_maxbytes(inode));
                         RETURN(-EFBIG);
                 }
 
@@ -682,17 +685,16 @@ int llu_setattr_raw(struct inode *inode, struct iattr *attr)
                         RETURN(rc);
                 }
 
-                /* We call inode_setattr to adjust timestamps, but we first
-                 * clear ATTR_SIZE to avoid invoking vmtruncate.
-                 *
-                 * NB: ATTR_SIZE will only be set at this point if the size
-                 * resides on the MDS, ie, this file has no objects. */
-                attr->ia_valid &= ~ATTR_SIZE;
+                /* We call inode_setattr to adjust timestamps.
+                 * If there is at least some data in file, we cleared ATTR_SIZE
+                 * above to avoid invoking vmtruncate, otherwise it is important
+                 * to call vmtruncate in inode_setattr to update inode->i_size
+                 * (bug 6196) */
                 inode_setattr(inode, attr);
                 llu_update_inode(inode, md.body, md.lsm);
                 ptlrpc_req_finished(request);
 
-                if (!md.lsm || !S_ISREG(st->st_mode)) {
+                if (!lsm || !S_ISREG(st->st_mode)) {
                         CDEBUG(D_INODE, "no lsm: not setting attrs on OST\n");
                         RETURN(0);
                 }
@@ -752,7 +754,7 @@ int llu_setattr_raw(struct inode *inode, struct iattr *attr)
                 struct obdo oa;
 
                 CDEBUG(D_INODE, "set mtime on OST inode %llu to %lu\n",
-                       st->st_ino, LTIME_S(attr->ia_mtime));
+                       (long long)st->st_ino, LTIME_S(attr->ia_mtime));
                 oa.o_id = lsm->lsm_object_id;
                 oa.o_valid = OBD_MD_FLID;
                 obdo_from_inode(&oa, inode, OBD_MD_FLTYPE | OBD_MD_FLATIME |
@@ -833,7 +835,8 @@ static int llu_iop_symlink_raw(struct pnode *pno, const char *tgt)
         llu_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
         err = mdc_create(sbi->ll_mdc_exp, &op_data,
                          tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
-                         current->fsuid, current->fsgid, 0, &request);
+                         current->fsuid, current->fsgid, current->cap_effective,
+                         0, &request);
         ptlrpc_req_finished(request);
         RETURN(err);
 }
@@ -862,7 +865,7 @@ static int llu_readlink_internal(struct inode *inode,
         rc = mdc_getattr(sbi->ll_mdc_exp, &fid,
                          OBD_MD_LINKNAME, symlen, request);
         if (rc) {
-                CERROR("inode %llu: rc = %d\n", st->st_ino, rc);
+                CERROR("inode %llu: rc = %d\n", (long long)st->st_ino, rc);
                 RETURN(rc);
         }
 
@@ -874,21 +877,21 @@ static int llu_readlink_internal(struct inode *inode,
                 CERROR ("OBD_MD_LINKNAME not set on reply\n");
                 GOTO (failed, rc = -EPROTO);
         }
-        
-        LASSERT (symlen != 0);
+
+        LASSERT(symlen != 0);
         if (body->eadatasize != symlen) {
-                CERROR ("inode %llu: symlink length %d not expected %d\n",
-                        st->st_ino, body->eadatasize - 1, symlen - 1);
-                GOTO (failed, rc = -EPROTO);
+                CERROR("inode %llu: symlink length %d not expected %d\n",
+                       (long long)st->st_ino, body->eadatasize - 1, symlen - 1);
+                GOTO(failed, rc = -EPROTO);
         }
 
         *symname = lustre_msg_buf ((*request)->rq_repmsg, 1, symlen);
         if (*symname == NULL ||
-            strnlen (*symname, symlen) != symlen - 1) {
+            strnlen(*symname, symlen) != symlen - 1) {
                 /* not full/NULL terminated */
-                CERROR ("inode %llu: symlink not NULL terminated string"
-                        "of length %d\n", st->st_ino, symlen - 1);
-                GOTO (failed, rc = -EPROTO);
+                CERROR("inode %llu: symlink not NULL terminated string"
+                       "of length %d\n", (long long)st->st_ino, symlen - 1);
+                GOTO(failed, rc = -EPROTO);
         }
 
         OBD_ALLOC(lli->lli_symlink_name, symlen);
@@ -937,7 +940,7 @@ static int llu_iop_mknod_raw(struct pnode *pno,
 
         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%llu\n",
                (int)pno->p_base->pb_name.len, pno->p_base->pb_name.name,
-               llu_i2stat(dir)->st_ino);
+               (long long)llu_i2stat(dir)->st_ino);
 
         if (llu_i2stat(dir)->st_nlink >= EXT2_LINK_MAX)
                 RETURN(err);
@@ -955,7 +958,8 @@ static int llu_iop_mknod_raw(struct pnode *pno,
                                         pno->p_base->pb_name.len,
                                         0);
                 err = mdc_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
-                                 current->fsuid, current->fsgid, dev, &request);
+                                 current->fsuid, current->fsgid,
+                                 current->cap_effective, dev, &request);
                 ptlrpc_req_finished(request);
                 break;
         case S_IFDIR:
@@ -1170,15 +1174,17 @@ static int llu_iop_mkdir_raw(struct pnode *pno, mode_t mode)
         struct mdc_op_data op_data;
         int err = -EMLINK;
         ENTRY;
-        CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%llu/%lu(%p)\n",
-               len, name, st->st_ino, llu_i2info(dir)->lli_st_generation, dir);
+
+        CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%llu/%lu(%p)\n", len, name,
+               (long long)st->st_ino, llu_i2info(dir)->lli_st_generation, dir);
 
         if (st->st_nlink >= EXT2_LINK_MAX)
                 RETURN(err);
 
         llu_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
         err = mdc_create(llu_i2sbi(dir)->ll_mdc_exp, &op_data, NULL, 0, mode,
-                         current->fsuid, current->fsgid, 0, &request);
+                         current->fsuid, current->fsgid, current->cap_effective,
+                         0, &request);
         ptlrpc_req_finished(request);
         RETURN(err);
 }
@@ -1194,7 +1200,8 @@ static int llu_iop_rmdir_raw(struct pnode *pno)
         int rc;
         ENTRY;
         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%llu/%lu(%p)\n", len, name,
-               llu_i2stat(dir)->st_ino, llu_i2info(dir)->lli_st_generation,dir);
+               (long long)llu_i2stat(dir)->st_ino,
+               llu_i2info(dir)->lli_st_generation, dir);
 
         llu_prepare_mdc_op_data(&op_data, dir, NULL, name, len, S_IFDIR);
         rc = mdc_unlink(llu_i2sbi(dir)->ll_mdc_exp, &op_data, &request);
@@ -1509,11 +1516,11 @@ static int llu_put_grouplock(struct inode *inode, unsigned long arg)
 static int llu_iop_ioctl(struct inode *ino, unsigned long int request,
                          va_list ap)
 {
+        unsigned long arg;
 
         liblustre_wait_event(0);
 
         switch (request) {
-        unsigned long arg;
         case LL_IOC_GROUP_LOCK:
                 arg = va_arg(ap, unsigned long);
                 return llu_get_grouplock(ino, arg);
index a7ca2fb..4b8c62e 100644 (file)
@@ -60,7 +60,7 @@ static int connect_echo_client(void)
 {
        struct lustre_cfg *lcfg;
         struct lustre_cfg_bufs bufs;
-       ptl_nid_t nid;
+       lnet_nid_t nid;
        char *peer = "ECHO_PEER_NID";
        class_uuid_t osc_uuid, echo_uuid;
        struct obd_uuid osc_uuid_str, echo_uuid_str;
@@ -73,7 +73,7 @@ static int connect_echo_client(void)
         class_uuid_unparse(echo_uuid, &echo_uuid_str);
 
        nid = libcfs_str2nid(echo_server_nid);
-        if (nid == PTL_NID_ANY) {
+        if (nid == LNET_NID_ANY) {
                 CERROR("Can't parse NID %s\n", echo_server_nid);
                 RETURN(-EINVAL);
         }
@@ -226,8 +226,8 @@ int main(int argc, char **argv)
                return 1;
        }
 
-       portal_debug = 0;
-       portal_subsystem_debug = 0;
+       libcfs_debug = 0;
+       libcfs_subsystem_debug = 0;
 
         liblustre_init_random();
 
index 6cd9ba4..6af93f1 100644 (file)
@@ -296,8 +296,8 @@ void t7()
         LEAVE();
 }
 
-extern int portal_debug;
-extern int portal_subsystem_debug;
+extern int libcfs_debug;
+extern int libcfs_subsystem_debug;
 
 extern void __liblustre_setup_(void);
 extern void __liblustre_cleanup_(void);
@@ -320,7 +320,7 @@ int main(int argc, char * argv[])
                 {0, 0, 0, 0}
         };
 
-        if (argc < 3)
+        if (argc < 3 - (getenv(ENV_LUSTRE_MNTTGT)||getenv(ENV_LUSTRE_DUMPFILE)))
                 usage(argv[0]);
 
         while ((c = getopt_long(argc, argv, "s:", long_opts, &opt_index)) != -1) {
index 2897807..418ba94 100644 (file)
@@ -242,8 +242,8 @@ void t4()
         }
 }
 
-extern int portal_debug;
-extern int portal_subsystem_debug;
+extern int libcfs_debug;
+extern int libcfs_subsystem_debug;
 
 extern void __liblustre_setup_(void);
 extern void __liblustre_cleanup_(void);
index 9628354..17155f8 100644 (file)
@@ -309,8 +309,8 @@ void t10()
         t_unlink(path2);
 }
 
-extern int portal_debug;
-extern int portal_subsystem_debug;
+extern int libcfs_debug;
+extern int libcfs_subsystem_debug;
 
 extern void __liblustre_setup_(void);
 extern void __liblustre_cleanup_(void);
@@ -345,7 +345,7 @@ int main(int argc, char * const argv[])
                 {0, 0, 0, 0}
         };
 
-        if (argc < 4)
+        if (argc < 4 - (getenv(ENV_LUSTRE_MNTTGT)||getenv(ENV_LUSTRE_DUMPFILE)))
                 usage(argv[0]);
 
         while ((c = getopt_long(argc, argv, "s:b:f:", long_opts, &opt_index)) != -1) {
index 57ed1d2..9636e9c 100644 (file)
 
 #include "test_common.h"
 
+#ifndef PAGE_SIZE
+#define PAGE_SIZE getpagesize()
+#endif
+#define _npages (2048)
+
+void *buf_alloc;
+int buf_size;
+
 extern char *lustre_path;
 
 #define ENTRY(str)                                                      \
@@ -69,15 +77,15 @@ extern char *lustre_path;
                         buf[80] = 0;                                    \
                 }                                                       \
                 printf("%s", buf);                                      \
+                return 0;                                               \
         } while (0)
 
 #define MAX_PATH_LENGTH 4096
 
-void t1()
+int t1(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
 
-        ENTRY("create/delete");
         snprintf(path, MAX_PATH_LENGTH, "%s/test_t1", lustre_path);
 
         t_touch(path);
@@ -85,7 +93,7 @@ void t1()
         LEAVE();
 }
 
-void t2()
+int t2(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
 
@@ -97,7 +105,7 @@ void t2()
         LEAVE();
 }
 
-void t3()
+int t3(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
 
@@ -110,7 +118,7 @@ void t3()
         LEAVE();
 }
 
-void t4()
+int t4(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
 
@@ -123,7 +131,7 @@ void t4()
         LEAVE();
 }
 
-void t6()
+int t6(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
         char path2[MAX_PATH_LENGTH] = "";
@@ -140,7 +148,7 @@ void t6()
         LEAVE();
 }
 
-void t6b()
+int t6b(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
         char path2[MAX_PATH_LENGTH] = "";
@@ -161,7 +169,6 @@ void t6b()
                 fprintf(stderr, "current path too long to fit in "
                         "MAX_PATH_LENGTH?\n");
                 LEAVE();
-                return;
         }
         t_chdir(path2);
         t_chdir(cwd);
@@ -176,7 +183,7 @@ void t6b()
         LEAVE();
 }
 
-void t7()
+int t7(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
         int rc;
@@ -198,7 +205,7 @@ void t7()
         LEAVE();
 }
 
-void t8()
+int t8(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
 
@@ -212,7 +219,7 @@ void t8()
         LEAVE();
 }
 
-void t9()
+int t9(char *name)
 {
         char path[MAX_PATH_LENGTH] = "";
         char path2[MAX_PATH_LENGTH] = "";
@@ -230,7 +237,7 @@ void t9()
         LEAVE();
 }
 
-void t10()
+int t10(char *name)
 {
         char dir1[MAX_PATH_LENGTH] = "";
         char dir2[MAX_PATH_LENGTH] = "";
@@ -263,7 +270,7 @@ void t10()
         LEAVE();
 }
 
-void t11()
+int t11(char *name)
 {
         char *base=lustre_path;
         char path[MAX_PATH_LENGTH], path2[MAX_PATH_LENGTH];
@@ -286,7 +293,7 @@ void t11()
                 safe_strncpy(path, base, MAX_PATH_LENGTH);
                 for (j = 1; j < i; j++)
                         strcat(path, "/dir");
-                
+
                 for (j = 0; j < nreg; j++) {
                         sprintf(path2, "%s/file%d", path, j);
                         t_unlink(path2);
@@ -299,7 +306,7 @@ void t11()
         LEAVE();
 }
 
-void t12()
+int t12(char *name)
 {
         char dir[MAX_PATH_LENGTH] = "";
         char buf[1024*128];
@@ -315,10 +322,10 @@ void t12()
         LEAVE();
 }
 
-void t13()
+int t13(char *name)
 {
         char dir[MAX_PATH_LENGTH] = "";
-        char name[1024];
+        char path[1024];
         char buf[1024];
         const int nfiles = 20;
         char *prefix = "test13_filename_prefix_";
@@ -329,25 +336,25 @@ void t13()
         t_mkdir(dir);
         printf("Creating %d files...\n", nfiles);
         for (i = 0; i < nfiles; i++) {
-                sprintf(name, "%s%s%05d", dir, prefix, i);
-                t_touch(name);
+                sprintf(path, "%s%s%05d", dir, prefix, i);
+                t_touch(path);
         }
         fd = t_opendir(dir);
         t_ls(fd, buf, sizeof(buf));
         t_close(fd);
         printf("Cleanup...\n");
         for (i = 0; i < nfiles; i++) {
-                sprintf(name, "%s%s%05d", dir, prefix, i);
-                t_unlink(name);
+                sprintf(path, "%s%s%05d", dir, prefix, i);
+                t_unlink(path);
         }
         t_rmdir(dir);
         LEAVE();
 }
 
-void t14()
+int t14(char *name)
 {
         char dir[MAX_PATH_LENGTH] = "";
-        char name[1024];
+        char path[1024];
         char buf[1024];
         const int nfiles = 256;
         char *prefix = "test14_filename_long_prefix_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA___";
@@ -360,8 +367,8 @@ void t14()
         t_mkdir(dir);
         printf("Creating %d files...\n", nfiles);
         for (i = 0; i < nfiles; i++) {
-                sprintf(name, "%s%s%05d", dir, prefix, i);
-                t_touch(name);
+                sprintf(path, "%s%s%05d", dir, prefix, i);
+                t_touch(path);
         }
         fd = t_opendir(dir);
         printf("Listing...\n");
@@ -377,7 +384,7 @@ void t14()
                                 goto iter;
                         if (strstr(item, prefix) != item) {
                                 printf("found bad name %s\n", item);
-                                exit(-1);
+                                return(-1);
                         }
                        printf("[%03d]: %s\n",
                                 index++, item + strlen(prefix));
@@ -387,23 +394,23 @@ iter:
        }
        if (rc < 0) {
                printf("getdents error %d\n", rc);
-                exit(-1);
+                return(-1);
        }
         if (index != nfiles) {
                 printf("get %d files != %d\n", index, nfiles);
-                exit(-1);
+                return(-1);
         }
         t_close(fd);
         printf("Cleanup...\n");
         for (i = 0; i < nfiles; i++) {
-                sprintf(name, "%s%s%05d", dir, prefix, i);
-                t_unlink(name);
+                sprintf(path, "%s%s%05d", dir, prefix, i);
+                t_unlink(path);
         }
         t_rmdir(dir);
         LEAVE();
 }
 
-void t15()
+int t15(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         int fd;
@@ -418,7 +425,7 @@ void t15()
         LEAVE();
 }
 
-void t16()
+int t16(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         ENTRY("small-write-read");
@@ -430,7 +437,7 @@ void t16()
         LEAVE();
 }
 
-void t17()
+int t17(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         int fd;
@@ -440,13 +447,13 @@ void t17()
         fd = open(file, O_WRONLY | O_CREAT, 0666);
         if (fd < 0) {
                 printf("failed to create file: %s\n", strerror(errno));
-                exit(-1);
+                return(-1);
         }
         t_unlink(file);
         LEAVE();
 }
 
-void t18()
+int t18(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         char buf[128];
@@ -459,16 +466,16 @@ void t18()
                 fd = open(file, O_RDWR|O_CREAT|O_APPEND, (mode_t)0666);
                 if (fd < 0) {
                         printf("error open file: %s\n", strerror(errno));
-                        exit(-1);
+                        return(-1);
                 }
                 if (write(fd, buf, sizeof(buf)) != sizeof(buf)) {
                         printf("error write file\n");
-                        exit(-1);
+                        return(-1);
                 }
                 close(fd);
                 if(stat(file, &statbuf[i]) != 0) {
                         printf("Error stat\n");
-                        exit(1);
+                        return(1);
                 }
                 printf("atime %lu, mtime %lu\n",
                         statbuf[i].st_atime, statbuf[i].st_mtime);
@@ -479,28 +486,28 @@ void t18()
                 if ((statbuf[i].st_atime <= statbuf[i-1].st_atime) ||
                     (statbuf[i].st_mtime <= statbuf[i-1].st_mtime)) {
                         printf("time error\n");
-                        exit(-1);
+                        return(-1);
                 }
         }
         t_unlink(file);
         LEAVE();
 }
 
-void t18b()
+int t18b(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         char buf[128];
         int fd, i;
         struct stat statbuf[3];
         ENTRY("utime should change mtime/atime/ctime");
-        snprintf(file, MAX_PATH_LENGTH, "%s/test_t23_file", lustre_path);
+        snprintf(file, MAX_PATH_LENGTH, "%s/test_t18b_file", lustre_path);
         t_touch(file);
 
         for (i = 0; i < 3; i++) {
                 t_utime(file, NULL);
                 if(stat(file, &statbuf[i]) != 0) {
                         printf("Error stat\n");
-                        exit(1);
+                        return(1);
                 }
                 printf("atime %lu, mtime %lu, ctime %lu\n",
                        statbuf[i].st_atime, statbuf[i].st_mtime,
@@ -513,14 +520,14 @@ void t18b()
                     (statbuf[i].st_mtime <= statbuf[i-1].st_mtime) ||
                     (statbuf[i].st_ctime <= statbuf[i-1].st_ctime)) {
                         printf("time error\n");
-                        exit(-1);
+                        return(-1);
                 }
         }
         t_unlink(file);
         LEAVE();
 }
 
-void t19()
+int t19(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         int fd;
@@ -533,22 +540,22 @@ void t19()
         fd = open(file, O_RDWR|O_CREAT|O_TRUNC, (mode_t)0666);
         if (fd < 0) {
                 printf("error open file: %s\n", strerror(errno));
-                exit(-1);
+                return(-1);
         }
         close(fd);
         if(stat(file, &statbuf) != 0) {
                 printf("Error stat\n");
-                exit(1);
+                return(1);
         }
         if (statbuf.st_size != 0) {
                 printf("size %ld is not zero\n", statbuf.st_size);
-                exit(-1);
+                return(-1);
         }
         t_unlink(file);
         LEAVE();
 }
 
-void t20()
+int t20(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         int fd;
@@ -561,18 +568,18 @@ void t20()
         fd = open(file, O_RDWR|O_CREAT, (mode_t)0666);
         if (fd < 0) {
                 printf("error open file: %s\n", strerror(errno));
-                exit(-1);
+                return(-1);
         }
 
         ret = write(fd, NULL, 20);
         if (ret != -1 || errno != EFAULT) {
                 printf("write 1: ret %ld, errno %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
         ret = write(fd, (void *)-1, 20);
         if (ret != -1 || errno != EFAULT) {
                 printf("write 2: ret %ld, errno %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
         iov[0].iov_base = NULL;
         iov[0].iov_len = 10;
@@ -581,7 +588,7 @@ void t20()
         ret = writev(fd, iov, 2);
         if (ret != -1 || errno != EFAULT) {
                 printf("writev 1: ret %ld, errno %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
         iov[0].iov_base = NULL;
         iov[0].iov_len = 0;
@@ -590,19 +597,19 @@ void t20()
         ret = writev(fd, iov, 2);
         if (ret != sizeof(buf)) {
                 printf("write 3 ret %ld, error %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
         lseek(fd, 0, SEEK_SET);
 
         ret = read(fd, NULL, 20);
         if (ret != -1 || errno != EFAULT) {
                 printf("read 1: ret %ld, errno %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
         ret = read(fd, (void *)-1, 20);
         if (ret != -1 || errno != EFAULT) {
                 printf("read 2: ret %ld, errno %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
         iov[0].iov_base = NULL;
         iov[0].iov_len = 10;
@@ -611,7 +618,7 @@ void t20()
         ret = readv(fd, iov, 2);
         if (ret != -1 || errno != EFAULT) {
                 printf("readv 1: ret %ld, errno %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
         iov[0].iov_base = NULL;
         iov[0].iov_len = 0;
@@ -620,7 +627,7 @@ void t20()
         ret = readv(fd, iov, 2);
         if (ret != sizeof(buf)) {
                 printf("read 3 ret %ld, error %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
 
         close(fd);
@@ -628,7 +635,7 @@ void t20()
         LEAVE();
 }
 
-void t21()
+int t21(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         int fd, ret;
@@ -643,13 +650,13 @@ void t21()
         fd = open(file, O_RDWR|O_CREAT, (mode_t)0666);
         if (fd < 0) {
                 printf("error open file: %m\n", file);
-                exit(-1);
+                return(-1);
         }
 
         t_fcntl(fd, F_SETFL, O_APPEND);
         if (!(ret = t_fcntl(fd, F_GETFL)) & O_APPEND) {
                 printf("error get flag: ret %x\n", ret);
-                exit(-1);
+                return(-1);
         }
 
        t_fcntl(fd, F_SETLK, &lock);
@@ -665,7 +672,7 @@ void t21()
         LEAVE();
 }
 
-void t22()
+int t22(char *name)
 {
         char file[MAX_PATH_LENGTH] = "";
         int fd;
@@ -678,50 +685,50 @@ void t22()
         fd = open(file, O_RDWR|O_CREAT|O_APPEND, (mode_t)0666);
         if (fd < 0) {
                 printf("error open file: %s\n", strerror(errno));
-                exit(-1);
+                return(-1);
         }
 
         lseek(fd, 100, SEEK_SET);
         ret = write(fd, str, strlen(str));
         if (ret != strlen(str)) {
                 printf("write 1: ret %ld, errno %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
 
         lseek(fd, 0, SEEK_SET);
         ret = read(fd, buf, sizeof(buf));
         if (ret != strlen(str)) {
                 printf("read 1 got %ld\n", ret);
-                exit(1);
+                return(1);
         }
 
         if (memcmp(buf, str, strlen(str))) {
                 printf("read 1 data err\n");
-                exit(1);
+                return(1);
         }
 
         if (fcntl(fd, F_SETFL, 0)) {
                 printf("fcntl err: %s\n", strerror(errno));
-                exit(1);
+                return(1);
         }
 
         lseek(fd, 100, SEEK_SET);
         ret = write(fd, str, strlen(str));
         if (ret != strlen(str)) {
                 printf("write 2: ret %ld, errno %d\n", ret, errno);
-                exit(1);
+                return(1);
         }
 
         lseek(fd, 100, SEEK_SET);
         ret = read(fd, buf, sizeof(buf));
         if (ret != strlen(str)) {
                 printf("read 2 got %ld\n", ret);
-                exit(1);
+                return(1);
         }
 
         if (memcmp(buf, str, strlen(str))) {
                 printf("read 2 data err\n");
-                exit(1);
+                return(1);
         }
 
         close(fd);
@@ -729,37 +736,95 @@ void t22()
         LEAVE();
 }
 
-#define PAGE_SIZE (4096)
-#define _npages (2048)
+int t23(char *name)
+{
+        char path[MAX_PATH_LENGTH];
+        int fd;
+        char *str = "1234567890";
+        char buf[100];
+        long long ret;
+        loff_t off;
+
+        ENTRY("handle lseek > 2GB");
+        snprintf(path, MAX_PATH_LENGTH, "%s/f%s", lustre_path, name);
 
-static int _buffer[_npages][PAGE_SIZE/sizeof(int)];
+        fd = open(path, O_WRONLY | O_CREAT | O_LARGEFILE, 0666);
+        if (fd < 0) {
+                printf("failed to create file %s: %s\n", path, strerror(errno));
+                return(-1);
+        }
+
+        off = 2048ULL * 1024 * 1024 - buf_size / 2;
+        ret = lseek(fd, off, SEEK_SET);
+        if (ret != off) {
+                printf("seek error for initial %llu != %llu\n",
+                       (long long)off, ret);
+                return -1;
+        }
+
+        ret = write(fd, buf_alloc, buf_size);
+        if (ret != buf_size) {
+                printf("write error for %d != %llubytes @ %llu\n",
+                       buf_size, ret, (long long)off);
+                return -1;
+        }
+
+        ret = lseek(fd, off, SEEK_SET);
+        if (ret != off) {
+                printf("seek error for %llu != %llu\n", (long long)off, ret);
+                return -1;
+        }
+
+        ret = lseek(fd, off + buf_size - 2, SEEK_SET);
+        if (ret != off + buf_size - 2) {
+                printf("seek error for %llu != %llu\n", (long long)off, ret);
+                return -1;
+        }
+
+        ret = lseek(fd, -buf_size + 2, SEEK_CUR);
+        if (ret != off) {
+                printf("relative seek error for %d != %llu\n",
+                       -buf_size + 2, off);
+                return -1;
+        }
+
+        ret = lseek(fd, 0, SEEK_END);
+        if (ret != off + buf_size) {
+                printf("end seek error for %llu != %llu\n",
+                       (long long)off + buf_size, ret);
+                return -1;
+        }
+
+        LEAVE();
+}
 
 /* pos:   i/o start from
  * xfer:  npages per transfer
  */
-static void pages_io(int xfer, loff_t pos)
+static int pages_io(int xfer, loff_t pos)
 {
         char path[MAX_PATH_LENGTH] = "";
 
-        int check_sum[_npages] = {0,};
+        int check_sum[_npages] = {0,}, *buf;
         int fd, rc, i, j, data_error = 0;
         struct timeval tw1, tw2, tr1, tr2;
         double tw, tr;
 
         snprintf(path, MAX_PATH_LENGTH, "%s/test_t50", lustre_path);
-        memset(_buffer, 0, sizeof(_buffer));
+
+        memset(buf_alloc, 0, buf_size);
 
         /* create sample data */
-        for (i = 0; i < _npages; i++) {
-                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
-                        _buffer[i][j] = rand();
+        for (i = 0, buf = buf_alloc; i < _npages; i++) {
+                for (j = 0; j < PAGE_SIZE/sizeof(int); j++, buf++) {
+                        *buf = rand();
                 }
         }
 
         /* compute checksum */
-        for (i = 0; i < _npages; i++) {
-                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
-                        check_sum[i] += _buffer[i][j];
+        for (i = 0, buf = buf_alloc; i < _npages; i++) {
+                for (j = 0; j < PAGE_SIZE/sizeof(int); j++, buf++) {
+                        check_sum[i] += *buf;
                 }
         }
 
@@ -770,34 +835,36 @@ static void pages_io(int xfer, loff_t pos)
         /* write */
        lseek(fd, pos, SEEK_SET);
         gettimeofday(&tw1, NULL);
-       for (i = 0; i < _npages; i += xfer) {
-               rc = write(fd, _buffer[i], PAGE_SIZE * xfer);
+       for (i = 0, buf = buf_alloc; i < _npages;
+             i += xfer, buf += xfer * PAGE_SIZE / sizeof(int)) {
+                rc = write(fd, buf, PAGE_SIZE * xfer);
                 if (rc != PAGE_SIZE * xfer) {
                         printf("write error %d (i = %d)\n", rc, i);
-                        exit(1);
+                        return(1);
                 }
        }
         gettimeofday(&tw2, NULL);
 
-        memset(_buffer, 0, sizeof(_buffer));
+        memset(buf_alloc, 0, buf_size);
 
         /* read */
        lseek(fd, pos, SEEK_SET);
         gettimeofday(&tr1, NULL);
-       for (i = 0; i < _npages; i += xfer) {
-               rc = read(fd, _buffer[i], PAGE_SIZE * xfer);
+       for (i = 0, buf = buf_alloc; i < _npages;
+             i += xfer, buf += xfer * PAGE_SIZE / sizeof(int)) {
+               rc = read(fd, buf, PAGE_SIZE * xfer);
                 if (rc != PAGE_SIZE * xfer) {
                         printf("read error %d (i = %d)\n", rc, i);
-                        exit(1);
+                        return(1);
                 }
        }
         gettimeofday(&tr2, NULL);
 
         /* compute checksum */
-        for (i = 0; i < _npages; i++) {
+        for (i = 0, buf = buf_alloc; i < _npages; i++) {
                 int sum = 0;
-                for (j = 0; j < PAGE_SIZE/sizeof(int); j++) {
-                        sum += _buffer[i][j];
+                for (j = 0; j < PAGE_SIZE/sizeof(int); j++, buf++) {
+                        sum += *buf;
                 }
                 if (sum != check_sum[i]) {
                         data_error = 1;
@@ -815,14 +882,14 @@ static void pages_io(int xfer, loff_t pos)
                 (_npages * PAGE_SIZE) / (tr / 1000000.0) / (1024 * 1024));
 
         if (data_error)
-                exit(1);
+                return 1;
+
+        return 0;
 }
 
-void t50()
+int t50(char *name)
 {
-        loff_t off_array[] = {1, 17, 255, 258, 4095, 4097, 8191,
-                              1024*1024*1024*1024ULL};
-        int np = 1, i;
+        int np = 1;
         loff_t offset = 0;
 
         ENTRY("4k aligned i/o sanity");
@@ -832,6 +899,14 @@ void t50()
                 np += np;
         }
         LEAVE();
+}
+
+int t50b(char *name)
+{
+        loff_t off_array[] = {1, 17, 255, 258, 4095, 4097, 8191,
+                              1024*1024*1024*1024ULL};
+        int np = 1, i;
+        loff_t offset = 0;
 
         ENTRY("4k un-aligned i/o sanity");
         for (i = 0; i < sizeof(off_array)/sizeof(loff_t); i++) {
@@ -840,79 +915,123 @@ void t50()
                         _npages, offset);
                 pages_io(16, offset);
         }
+
         LEAVE();
 }
 
 extern void __liblustre_setup_(void);
 extern void __liblustre_cleanup_(void);
 
+
 void usage(char *cmd)
 {
+        printf("\n");
         printf("Usage: \t%s --target mdsnid:/mdsname/profile\n", cmd);
         printf("       \t%s --dumpfile dumpfile\n", cmd);
         exit(-1);
 }
 
+struct testlist {
+        int (*test)(char *name);
+        char *name;
+} testlist[] = {
+        { t1, "1" },
+        { t2, "2" },
+        { t3, "3" },
+        { t4, "4" },
+        { t6, "6" },
+        { t6b, "6b" },
+        { t7, "7" },
+        { t8, "8" },
+        { t9, "9" },
+        { t10, "10" },
+        { t11, "11" },
+        { t12, "12" },
+        { t13, "13" },
+        { t14, "14" },
+        { t15, "15" },
+        { t16, "16" },
+        { t17, "17" },
+        { t18, "18" },
+        { t18b, "t8b" },
+        { t19, "19" },
+        { t20, "20" },
+        { t21, "21" },
+        { t22, "22" },
+        { t23, "23" },
+        { t50, "50" },
+        { t50b, "50b" },
+        { NULL, NULL }
+};
+
 int main(int argc, char * const argv[])
 {
-        int opt_index, c;
+        struct testlist *test;
+        int opt_index, c, numonly = 0;
+        char *only[100];
         static struct option long_opts[] = {
-                {"target", 1, 0, 0},
-                {"dumpfile", 1, 0, 0},
+                {"dumpfile", 1, 0, 'd'},
+                {"only", 1, 0, 'o'},
+                {"target", 1, 0, 't'},
                 {0, 0, 0, 0}
         };
 
-        if (argc <= 1)
-                usage(argv[0]);
-
-        while ((c = getopt_long(argc, argv, "", long_opts, &opt_index)) != -1) {
+        while ((c = getopt_long(argc, argv, "d:o:t:", long_opts, &opt_index)) != -1) {
                 switch (c) {
-                case 0: {
-                        if (!optarg[0])
-                                usage(argv[0]);
-
-                        if (!strcmp(long_opts[opt_index].name, "target")) {
-                                setenv(ENV_LUSTRE_MNTTGT, optarg, 1);
-                        } else if (!strcmp(long_opts[opt_index].name, "dumpfile")) {
-                                setenv(ENV_LUSTRE_DUMPFILE, optarg, 1);
-                        } else
-                                usage(argv[0]);
+                case 'd':
+                        setenv(ENV_LUSTRE_DUMPFILE, optarg, 1);
+                        break;
+                case 'o':
+                        if (numonly == 0)
+                                printf("Only running test(s): ");
+                        printf("%s ", optarg);
+                        only[numonly++] = optarg;
+                        break;
+                case 't':
+                        setenv(ENV_LUSTRE_MNTTGT, optarg, 1);
                         break;
-                }
                 default:
                         usage(argv[0]);
+                        break;
                 }
         }
 
+        if (getenv(ENV_LUSTRE_MNTTGT) == NULL &&
+            getenv(ENV_LUSTRE_DUMPFILE) == NULL)
+                usage(argv[0]);
+
         if (optind != argc)
                 usage(argv[0]);
 
+        printf("\n");
+
         __liblustre_setup_();
 
-        t1();
-        t2();
-        t3();
-        t4();
-        t6();
-        t6b();
-        t7();
-        t8();
-        t9();
-        t10();
-        t11();
-        t12();
-        t13();
-        t14();
-        t15();
-        t16();
-        t17();
-        t18();
-        t18b();
-        t19();
-        t20();
-        t21();
-        t22();
-        t50();
+        buf_size = _npages * PAGE_SIZE;
+        buf_alloc = malloc(buf_size);
+
+        for (test = testlist; test->test != NULL; test++) {
+                int run = 1, i;
+
+                if (numonly > 0) {
+                        int len;
+
+                        run = 0;
+                        len = strlen(test->name);
+                        for (i = 0; i < numonly; i++) {
+                                if (len < strlen(only[i]))
+                                        continue;
+                                if (strncmp(only[i], test->name, len) == 0) {
+                                        run = 1;
+                                        break;
+                                }
+                        }
+                }
+                if (run && (test->test)(test->name) != 0)
+                        break;
+        }
+
+        free(buf_alloc);
 
        printf("liblustre is about to shutdown\n");
         __liblustre_cleanup_();
index 8f55aa4..6cbf974 100644 (file)
@@ -165,7 +165,7 @@ restart:
                         CERROR("called on root (?) dentry=%p, inode=%p "
                                "ino=%lu\n", dentry, inode, inode->i_ino);
                         lustre_dump_dentry(dentry, 1);
-                        portals_debug_dumpstack(NULL);
+                        libcfs_debug_dumpstack(NULL);
                 } else if (d_mountpoint(dentry)) {
                         /* For mountpoints we skip removal of the dentry
                            which happens solely because we have a lock on it
@@ -272,9 +272,8 @@ int ll_revalidate_it(struct dentry *de, int lookup_flags,
                      struct lookup_intent *it)
 {
         int rc;
-        struct ll_fid pfid, cfid;
         struct it_cb_data icbd;
-        struct ll_uctxt ctxt;
+        struct mdc_op_data op_data;
         struct ptlrpc_request *req = NULL;
         struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
         struct obd_export *exp;
@@ -288,8 +287,6 @@ int ll_revalidate_it(struct dentry *de, int lookup_flags,
                 RETURN(0);
 
         exp = ll_i2mdcexp(de->d_inode);
-        ll_inode2fid(&pfid, de->d_parent->d_inode);
-        ll_inode2fid(&cfid, de->d_inode);
         icbd.icbd_parent = de->d_parent->d_inode;
         icbd.icbd_childp = &de;
 
@@ -302,11 +299,11 @@ int ll_revalidate_it(struct dentry *de, int lookup_flags,
         ll_frob_intent(&it, &lookup_it);
         LASSERT(it);
 
-        ll_i2uctxt(&ctxt, de->d_parent->d_inode, de->d_inode);
+        ll_prepare_mdc_op_data(&op_data, de->d_parent->d_inode, de->d_inode,
+                               de->d_name.name, de->d_name.len, 0);
 
-        rc = mdc_intent_lock(exp, &ctxt, &pfid, de->d_name.name, de->d_name.len,
-                             NULL, 0,
-                             &cfid, it, lookup_flags, &req,ll_mdc_blocking_ast);
+        rc = mdc_intent_lock(exp, &op_data, NULL, 0, it, lookup_flags,
+                             &req, ll_mdc_blocking_ast);
         /* If req is NULL, then mdc_intent_lock only tried to do a lock match;
          * if all was well, it will return 1 if it found locks, 0 otherwise. */
         if (req == NULL && rc >= 0)
index a6e63bc..f9d4924 100644 (file)
@@ -309,8 +309,6 @@ int ll_readdir(struct file * filp, void * dirent, filldir_t filldir)
         if (pos > inode->i_size - EXT2_DIR_REC_LEN(1))
                 RETURN(0);
 
-        types = ext2_filetype_table;
-
         for ( ; n < npages; n++, offset = 0) {
                 char *kaddr, *limit;
                 ext2_dirent *de;
index 856079f..c8b4e7c 100644 (file)
 #endif
 #include "llite_internal.h"
 
+/* also used by llite/special.c:ll_special_open() */
+struct ll_file_data *ll_file_data_get(void)
+{
+        struct ll_file_data *fd;
+
+        OBD_SLAB_ALLOC(fd, ll_file_data_slab, SLAB_KERNEL, sizeof *fd);
+        return fd;
+}
+
+static void ll_file_data_put(struct ll_file_data *fd)
+{
+        if (fd != NULL)
+                OBD_SLAB_FREE(fd, ll_file_data_slab, sizeof *fd);
+}
+
 int ll_mdc_close(struct obd_export *mdc_exp, struct inode *inode,
                         struct file *file)
 {
@@ -81,7 +96,7 @@ int ll_mdc_close(struct obd_export *mdc_exp, struct inode *inode,
         ptlrpc_req_finished(req);
         och->och_fh.cookie = DEAD_HANDLE_MAGIC;
         LUSTRE_FPRIVATE(file) = NULL;
-        OBD_SLAB_FREE(fd, ll_file_data_slab, sizeof *fd);
+        ll_file_data_put(fd);
 
         RETURN(rc);
 }
@@ -145,11 +160,11 @@ static int ll_intent_file_open(struct file *file, void *lmm,
         RETURN(rc);
 }
 
-int ll_local_open(struct file *file, struct lookup_intent *it)
+int ll_local_open(struct file *file, struct lookup_intent *it,
+                  struct ll_file_data *fd)
 {
         struct ptlrpc_request *req = it->d.lustre.it_data;
         struct ll_inode_info *lli = ll_i2info(file->f_dentry->d_inode);
-        struct ll_file_data *fd;
         struct mds_body *body;
         ENTRY;
 
@@ -159,9 +174,6 @@ int ll_local_open(struct file *file, struct lookup_intent *it)
 
         LASSERT(!LUSTRE_FPRIVATE(file));
 
-        OBD_SLAB_ALLOC(fd, ll_file_data_slab, SLAB_KERNEL, sizeof *fd);
-        /* We can't handle this well without reorganizing ll_file_open and
-         * ll_mdc_close, so don't even try right now. */
         LASSERT(fd != NULL);
 
         memcpy(&fd->fd_mds_och.och_fh, &body->handle, sizeof(body->handle));
@@ -198,6 +210,7 @@ int ll_file_open(struct inode *inode, struct file *file)
                                           .it_flags = file->f_flags };
         struct lov_stripe_md *lsm;
         struct ptlrpc_request *req;
+        struct ll_file_data *fd;
         int rc = 0;
         ENTRY;
 
@@ -210,21 +223,29 @@ int ll_file_open(struct inode *inode, struct file *file)
 
         it = file->f_it;
 
+        fd = ll_file_data_get();
+        if (fd == NULL)
+                RETURN(-ENOMEM);
+
         if (!it || !it->d.lustre.it_disposition) {
                 it = &oit;
                 rc = ll_intent_file_open(file, NULL, 0, it);
-                if (rc)
+                if (rc) {
+                        ll_file_data_put(fd);
                         GOTO(out, rc);
         }
+        }
 
         lprocfs_counter_incr(ll_i2sbi(inode)->ll_stats, LPROC_LL_OPEN);
         rc = it_open_error(DISP_OPEN_OPEN, it);
         /* mdc_intent_lock() didn't get a request ref if there was an open
          * error, so don't do cleanup on the request here (bug 3430) */
-        if (rc)
+        if (rc) {
+                ll_file_data_put(fd);
                 RETURN(rc);
+        }
 
-        rc = ll_local_open(file, it);
+        rc = ll_local_open(file, it, fd);
         LASSERTF(rc == 0, "rc = %d\n", rc);
 
         if (!S_ISREG(inode->i_mode))
@@ -974,11 +995,12 @@ static int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
                                     int lum_size)
 {
         struct ll_inode_info *lli = ll_i2info(inode);
-        struct file *f;
+        struct file *f = NULL;
         struct obd_export *exp = ll_i2obdexp(inode);
         struct lov_stripe_md *lsm;
         struct lookup_intent oit = {.it_op = IT_OPEN, .it_flags = flags};
         struct ptlrpc_request *req = NULL;
+        struct ll_file_data *fd;
         int rc = 0;
         struct lustre_md md;
         ENTRY;
@@ -992,6 +1014,10 @@ static int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
                 RETURN(-EEXIST);
         }
 
+        fd = ll_file_data_get();
+        if (fd == NULL)
+                GOTO(out, -ENOMEM);
+
         f = get_empty_filp();
         if (!f)
                 GOTO(out, -ENOMEM);
@@ -1015,9 +1041,10 @@ static int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
                 GOTO(out, rc);
         ll_update_inode(f->f_dentry->d_inode, md.body, md.lsm);
 
-        rc = ll_local_open(f, &oit);
+        rc = ll_local_open(f, &oit, fd);
         if (rc)
                 GOTO(out, rc);
+        fd = NULL;
         ll_intent_release(&oit);
 
         rc = ll_file_release(f->f_dentry->d_inode, f);
@@ -1025,6 +1052,7 @@ static int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file,
  out:
         if (f)
                 put_filp(f);
+        ll_file_data_put(fd);
         up(&lli->lli_open_sem);
         if (req != NULL)
                 ptlrpc_req_finished(req);
@@ -1098,7 +1126,7 @@ static int ll_lov_getstripe(struct inode *inode, unsigned long arg)
 static int ll_get_grouplock(struct inode *inode, struct file *file,
                          unsigned long arg)
 {
-        struct ll_file_data *fd = file->private_data;
+        struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
         ldlm_policy_data_t policy = { .l_extent = { .start = 0,
                                                     .end = OBD_OBJECT_EOF}};
         struct lustre_handle lockh = { 0 };
@@ -1129,7 +1157,7 @@ static int ll_get_grouplock(struct inode *inode, struct file *file,
 static int ll_put_grouplock(struct inode *inode, struct file *file,
                          unsigned long arg)
 {
-        struct ll_file_data *fd = file->private_data;
+        struct ll_file_data *fd = LUSTRE_FPRIVATE(file);
         struct ll_inode_info *lli = ll_i2info(inode);
         struct lov_stripe_md *lsm = lli->lli_smd;
         int rc;
@@ -1142,7 +1170,7 @@ static int ll_put_grouplock(struct inode *inode, struct file *file,
 
         if (fd->fd_gid != arg) /* Ugh? Unlocking with different gid? */
                 RETURN(-EINVAL);
-        
+
         fd->fd_flags &= ~(LL_FILE_GROUP_LOCKED|LL_FILE_IGNORE_LOCK);
 
         rc = ll_extent_unlock(fd, inode, lsm, LCK_GROUP, &fd->fd_cwlockh);
@@ -1153,7 +1181,7 @@ static int ll_put_grouplock(struct inode *inode, struct file *file,
         memset(&fd->fd_cwlockh, 0, sizeof(fd->fd_cwlockh));
 
         RETURN(0);
-}       
+}
 
 int ll_file_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                   unsigned long arg)
@@ -1550,6 +1578,22 @@ struct file_operations ll_file_operations = {
         /* .lock           = ll_file_flock */
 };
 
+struct file_operations ll_file_operations_flock = {
+        .read           = ll_file_read,
+        .write          = ll_file_write,
+        .ioctl          = ll_file_ioctl,
+        .open           = ll_file_open,
+        .release        = ll_file_release,
+        .mmap           = ll_file_mmap,
+        .llseek         = ll_file_seek,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
+        .sendfile       = generic_file_sendfile,
+#endif
+        .fsync          = ll_fsync,
+        .lock           = ll_file_flock
+};
+
+
 struct inode_operations ll_file_inode_operations = {
         .setattr_raw    = ll_setattr_raw,
         .setattr        = ll_setattr,
index c218fa4..91b77f8 100644 (file)
@@ -200,7 +200,7 @@ static int ll_close_thread(void *arg)
                 char name[sizeof(current->comm)];
                 unsigned long flags;
                 snprintf(name, sizeof(name) - 1, "ll_close");
-                kportal_daemonize(name);
+                libcfs_daemonize(name);
                 SIGNAL_MASK_LOCK(current, flags);
                 sigfillset(&current->blocked);
                 RECALC_SIGPENDING;
index 958c9ef..0efc33f 100644 (file)
@@ -120,6 +120,7 @@ struct ll_ra_info {
 /* flags for sbi->ll_flags */
 #define LL_SBI_NOLCK            0x1 /* DLM locking disabled (directio-only) */
 #define LL_SBI_CHECKSUM         0x2 /* checksum each page as it's written */
+#define LL_SBI_FLOCK            0x4
 
 struct ll_sb_info {
         struct list_head          ll_list;
@@ -147,12 +148,48 @@ struct ll_sb_info {
 
         struct ll_ra_info         ll_ra_info;
         unsigned int              ll_namelen;
+        struct file_operations   *ll_fop;
 };
 
+/*
+ * per file-descriptor read-ahead data.
+ */
 struct ll_readahead_state {
         spinlock_t      ras_lock;
-        unsigned long   ras_last_readpage, ras_consecutive;
+        /*
+         * index of the last page that read(2) needed and that wasn't in the
+         * cache. Used by ras_update() to detect seeks.
+         *
+         * XXX nikita: if access seeks into cached region, Lustre doesn't see
+         * this.
+         */
+        unsigned long   ras_last_readpage;
+        /*
+         * number of pages read after last read-ahead window reset. As window
+         * is reset on each seek, this is effectively a number of consecutive
+         * accesses. Maybe ->ras_accessed_in_window is better name.
+         *
+         * XXX nikita: window is also reset (by ras_update()) when Lustre
+         * believes that memory pressure evicts read-ahead pages. In that
+         * case, it probably doesn't make sense to expand window to
+         * PTLRPC_MAX_BRW_PAGES on the third access.
+         */
+        unsigned long   ras_consecutive;
+        /*
+         * Parameters of current read-ahead window. Handled by
+         * ras_update(). On the initial access to the file or after a seek,
+         * window is reset to 0. After 3 consecutive accesses, window is
+         * expanded to PTLRPC_MAX_BRW_PAGES. Afterwards, window is enlarged by
+         * PTLRPC_MAX_BRW_PAGES chunks up to ->ra_max_pages.
+         */
         unsigned long   ras_window_start, ras_window_len;
+        /*
+         * Where next read-ahead should start at. This lies within read-ahead
+         * window. Read-ahead window is read in pieces rather than at once
+         * because: 1. lustre limits total number of pages under read-ahead by
+         * ->ra_max_pages (see ll_ra_count_get()), 2. client cannot read pages
+         * not covered by DLM lock.
+         */
         unsigned long   ras_next_readahead;
 
 };
@@ -186,32 +223,14 @@ static inline struct inode *ll_info2i(struct ll_inode_info *lli)
 #endif
 }
 
-static inline void ll_i2uctxt(struct ll_uctxt *ctxt, struct inode *i1,
-                              struct inode *i2)
-{
-        LASSERT(i1);
-        LASSERT(ctxt);
-
-        if (in_group_p(i1->i_gid))
-                ctxt->gid1 = i1->i_gid;
-        else
-                ctxt->gid1 = -1;
-
-        if (i2) {
-                if (in_group_p(i2->i_gid))
-                        ctxt->gid2 = i2->i_gid;
-                else
-                        ctxt->gid2 = -1;
-        } else
-                ctxt->gid2 = 0;
-}
-
 struct it_cb_data {
         struct inode *icbd_parent;
         struct dentry **icbd_childp;
         obd_id hash;
 };
 
+void ll_i2gids(__u32 *suppgids, struct inode *i1,struct inode *i2);
+
 #define LLAP_MAGIC 98764321
 
 extern kmem_cache_t *ll_async_page_slab;
@@ -227,8 +246,6 @@ struct ll_async_page {
         struct page     *llap_page;
         struct list_head llap_pending_write;
         struct list_head llap_pglist_item;
-        /* user credit information for oss enforcement quota */
-        struct lvfs_ucred llap_ouc;
         /* checksum for paranoid I/O debugging */
         __u32 llap_checksum;
 };
@@ -299,6 +316,7 @@ void ll_truncate(struct inode *inode);
 
 /* llite/file.c */
 extern struct file_operations ll_file_operations;
+extern struct file_operations ll_file_operations_flock;
 extern struct inode_operations ll_file_inode_operations;
 extern int ll_inode_revalidate_it(struct dentry *, struct lookup_intent *);
 int ll_extent_lock(struct ll_file_data *, struct inode *,
@@ -310,13 +328,15 @@ int ll_file_open(struct inode *inode, struct file *file);
 int ll_file_release(struct inode *inode, struct file *file);
 int ll_lsm_getattr(struct obd_export *, struct lov_stripe_md *, struct obdo *);
 int ll_glimpse_size(struct inode *inode);
-int ll_local_open(struct file *file, struct lookup_intent *it);
+int ll_local_open(struct file *file,
+                  struct lookup_intent *it, struct ll_file_data *fd);
 int ll_mdc_close(struct obd_export *mdc_exp, struct inode *inode,
                  struct file *file);
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
 int ll_getattr(struct vfsmount *mnt, struct dentry *de,
                struct lookup_intent *it, struct kstat *stat);
 #endif
+struct ll_file_data *ll_file_data_get(void);
 
 /* llite/dcache.c */
 void ll_intent_drop_lock(struct lookup_intent *);
@@ -409,7 +429,7 @@ int ll_teardown_mmaps(struct address_space *mapping, __u64 first, __u64 last);
 int ll_file_mmap(struct file * file, struct vm_area_struct * vma);
 struct ll_lock_tree_node * ll_node_from_inode(struct inode *inode, __u64 start,
                                               __u64 end, ldlm_mode_t mode);
-int ll_tree_lock(struct ll_lock_tree *tree, 
+int ll_tree_lock(struct ll_lock_tree *tree,
                  struct ll_lock_tree_node *first_node,
                  const char *buf, size_t count, int ast_flags);
 int ll_tree_unlock(struct ll_lock_tree *tree);
index 6165247..c0616c1 100644 (file)
@@ -156,6 +156,12 @@ int client_common_fill_super(struct super_block *sb, char *mdc, char *osc)
         if (sb->s_flags & MS_RDONLY)
                 data->ocd_connect_flags |= OBD_CONNECT_RDONLY;
 
+        if (sbi->ll_flags & LL_SBI_FLOCK) {
+                sbi->ll_fop = &ll_file_operations_flock;
+        } else {
+                sbi->ll_fop = &ll_file_operations;
+        }
+
         err = obd_connect(&mdc_conn, obd, &sbi->ll_sb_uuid, data);
         if (err == -EBUSY) {
                 CERROR("An MDT (mdc %s) is performing recovery, of which this"
@@ -400,6 +406,7 @@ int ll_set_opt(const char *opt, char *data, int fl)
 
 void ll_options(char *options, char **ost, char **mdc, int *flags)
 {
+        int tmp;
         char *this_char;
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
         char *opt_ptr = options;
@@ -424,11 +431,21 @@ void ll_options(char *options, char **ost, char **mdc, int *flags)
                         continue;
                 if (!*mdc && (*mdc = ll_read_opt("mdc", this_char)))
                         continue;
-                if (!(*flags & LL_SBI_NOLCK) &&
-                    ((*flags) = (*flags) |
-                                ll_set_opt("nolock", this_char,
-                                           LL_SBI_NOLCK)))
+                tmp = ll_set_opt("nolock", this_char, LL_SBI_NOLCK);
+                if (tmp) {
+                        *flags |= tmp;
+                        continue;
+                }
+                tmp = ll_set_opt("flock", this_char, LL_SBI_FLOCK);
+                if (tmp) {
+                        *flags |= tmp;
+                        continue;
+                }
+                tmp = ll_set_opt("noflock", this_char, LL_SBI_FLOCK);
+                if (tmp) {
+                        *flags &= ~tmp;
                         continue;
+                }
         }
         EXIT;
 }
@@ -517,8 +534,9 @@ out_free:
                 lsi->lsi_llsbi = NULL;
         }
         RETURN(err);
-}
-                                                                                       
+} /* ll_fill_super */
+
+
 void ll_put_super(struct super_block *sb)
 {
         struct obd_device *obd;
@@ -930,6 +948,12 @@ void ll_update_inode(struct inode *inode, struct mds_body *body,
         LASSERT ((lsm != NULL) == ((body->valid & OBD_MD_FLEASIZE) != 0));
         if (lsm != NULL) {
                 if (lli->lli_smd == NULL) {
+                        if (lsm->lsm_magic != LOV_MAGIC) {
+                                dump_lsm(D_ERROR, lsm);
+                                LBUG();
+                        }
+                        CDEBUG(D_INODE, "adding lsm %p to inode %lu/%u(%p)\n",
+                               lsm, inode->i_ino, inode->i_generation, inode);
                         lli->lli_smd = lsm;
                         lli->lli_maxbytes = lsm->lsm_maxbytes;
                         if (lli->lli_maxbytes > PAGE_CACHE_MAXBYTES)
@@ -1030,8 +1054,9 @@ void ll_read_inode2(struct inode *inode, void *opaque)
         /* OIDEBUG(inode); */
 
         if (S_ISREG(inode->i_mode)) {
+                struct ll_sb_info *sbi = ll_i2sbi(inode);
                 inode->i_op = &ll_file_inode_operations;
-                inode->i_fop = &ll_file_operations;
+                inode->i_fop = sbi->ll_fop;
                 inode->i_mapping->a_ops = &ll_aops;
                 EXIT;
         } else if (S_ISDIR(inode->i_mode)) {
index 48a166b..779c1e1 100644 (file)
@@ -190,11 +190,50 @@ int ll_mdc_cancel_unused(struct lustre_handle *conn, struct inode *inode,
                 { .name = {inode->i_ino, inode->i_generation} };
         struct obd_device *obddev = class_conn2obd(conn);
         ENTRY;
-        
+
         RETURN(ldlm_cli_cancel_unused(obddev->obd_namespace, &res_id, flags,
                                       opaque));
 }
 
+/* Pack the required supplementary groups into the supplied groups array.
+ * If we don't need to use the groups from the target inode(s) then we
+ * instead pack one or more groups from the user's supplementary group
+ * array in case it might be useful.  Not needed if doing an MDS-side upcall. */
+void ll_i2gids(__u32 *suppgids, struct inode *i1, struct inode *i2)
+{
+        int i;
+
+        LASSERT(i1 != NULL);
+        LASSERT(suppgids != NULL);
+
+        if (in_group_p(i1->i_gid))
+                suppgids[0] = i1->i_gid;
+        else
+                suppgids[0] = -1;
+
+        if (i2) {
+                if (in_group_p(i2->i_gid))
+                        suppgids[1] = i2->i_gid;
+                else
+                        suppgids[1] = -1;
+        } else {
+                suppgids[1] = -1;
+        }
+
+        for (i = 0; i < current_ngroups; i++) {
+                if (suppgids[0] == -1) {
+                        if (current_groups[i] != suppgids[1])
+                                suppgids[0] = current_groups[i];
+                        continue;
+                }
+                if (suppgids[1] == -1) {
+                        if (current_groups[i] != suppgids[0])
+                                suppgids[1] = current_groups[i];
+                        continue;
+                }
+                break;
+        }
+}
 
 void ll_prepare_mdc_op_data(struct mdc_op_data *data, struct inode *i1,
                             struct inode *i2, const char *name, int namelen,
@@ -202,11 +241,13 @@ void ll_prepare_mdc_op_data(struct mdc_op_data *data, struct inode *i1,
 {
         LASSERT(i1);
 
-        ll_i2uctxt(&data->ctxt, i1, i2);
+        ll_i2gids(data->suppgids, i1, i2);
         ll_inode2fid(&data->fid1, i1);
 
         if (i2)
                 ll_inode2fid(&data->fid2, i2);
+        else
+                memset(&data->fid2, 0, sizeof(data->fid2));
 
         data->name = name;
         data->namelen = namelen;
@@ -311,23 +352,14 @@ static int lookup_it_finish(struct ptlrpc_request *request, int offset,
                        inode, inode->i_ino, inode->i_generation);
                 mdc_set_lock_data(&it->d.lustre.it_lock_handle, inode);
 
-                /* If this is a stat, get the authoritative file size */
-                if (it->it_op == IT_GETATTR && S_ISREG(inode->i_mode) &&
-                    ll_i2info(inode)->lli_smd != NULL) {
-                        struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
-                        ldlm_error_t rc;
-
-                        LASSERT(lsm->lsm_object_id != 0);
-
-                        /* bug 2334: drop MDS lock before acquiring OST lock */
-                        ll_intent_drop_lock(it);
-
-                        rc = ll_glimpse_size(inode);
-                        if (rc) {
-                                iput(inode);
-                                RETURN(rc);
-                        }
-                }
+                /* We used to query real size from OSTs here, but actually
+                   this is not needed. For stat() calls size would be updated
+                   from subsequent do_revalidate()->ll_inode_revalidate_it() in
+                   2.4 and
+                   vfs_getattr_it->ll_getattr()->ll_inode_revalidate_it() in 2.6
+                   Everybody else who needs correct file size would call
+                   ll_glimpse_size or some equivalent themselves anyway.
+                   Also see bug 7198. */
 
                 *de = ll_find_alias(inode, *de);
         } else {
@@ -348,8 +380,7 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
                                    struct lookup_intent *it, int lookup_flags)
 {
         struct dentry *save = dentry, *retval;
-        struct ll_fid pfid;
-        struct ll_uctxt ctxt;
+        struct mdc_op_data op_data;
         struct it_cb_data icbd;
         struct ptlrpc_request *req = NULL;
         struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
@@ -370,14 +401,15 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
 
         icbd.icbd_childp = &dentry;
         icbd.icbd_parent = parent;
-        ll_inode2fid(&pfid, parent);
-        ll_i2uctxt(&ctxt, parent, NULL);
+
+        ll_prepare_mdc_op_data(&op_data, parent, NULL, dentry->d_name.name,
+                               dentry->d_name.len, lookup_flags);
 
         it->it_create_mode &= ~current->fs->umask;
 
-        rc = mdc_intent_lock(ll_i2mdcexp(parent), &ctxt, &pfid,
-                             dentry->d_name.name, dentry->d_name.len, NULL, 0,
-                             NULL, it, lookup_flags, &req, ll_mdc_blocking_ast);
+        rc = mdc_intent_lock(ll_i2mdcexp(parent), &op_data, NULL, 0, it,
+                             lookup_flags, &req, ll_mdc_blocking_ast);
+
         if (rc < 0)
                 GOTO(out, retval = ERR_PTR(rc));
 
@@ -541,7 +573,7 @@ static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
                                        nd->last.len, 0);
                 err = mdc_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
                                  current->fsuid, current->fsgid,
-                                 rdev, &request);
+                                 current->cap_effective, rdev, &request);
                 if (err == 0)
                         ll_update_times(request, 0, dir);
                 ptlrpc_req_finished(request);
@@ -583,7 +615,7 @@ static int ll_mknod(struct inode *dir, struct dentry *dchild, int mode,
                                        dchild->d_name.len, 0);
                 err = mdc_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
                                  current->fsuid, current->fsgid,
-                                 rdev, &request);
+                                 current->cap_effective, rdev, &request);
                 if (err)
                         GOTO(out_err, err);
 
@@ -624,7 +656,8 @@ static int ll_symlink_raw(struct nameidata *nd, const char *tgt)
                                nd->last.len, 0);
         err = mdc_create(sbi->ll_mdc_exp, &op_data,
                          tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
-                         current->fsuid, current->fsgid, 0, &request);
+                         current->fsuid, current->fsgid, current->cap_effective,
+                         0, &request);
         if (err == 0)
                 ll_update_times(request, 0, dir);
 
@@ -674,7 +707,8 @@ static int ll_mkdir_raw(struct nameidata *nd, int mode)
         ll_prepare_mdc_op_data(&op_data, dir, NULL, nd->last.name,
                                nd->last.len, 0);
         err = mdc_create(sbi->ll_mdc_exp, &op_data, NULL, 0, mode,
-                         current->fsuid, current->fsgid, 0, &request);
+                         current->fsuid, current->fsgid, current->cap_effective,
+                         0, &request);
         if (err == 0)
                 ll_update_times(request, 0, dir);
 
@@ -722,6 +756,8 @@ int ll_objects_destroy(struct ptlrpc_request *request, struct inode *dir)
         int rc;
         ENTRY;
 
+        oti.oti_thread = request->rq_svc_thread;
+
         /* req is swabbed so this is safe */
         body = lustre_msg_buf(request->rq_repmsg, 0, sizeof(*body));
 
index 4a59682..b8f2b2c 100644 (file)
@@ -70,7 +70,7 @@ static int ll_brw(int cmd, struct inode *inode, struct obdo *oa,
         pg.pg = page;
         pg.off = ((obd_off)page->index) << PAGE_SHIFT;
 
-        if (cmd == OBD_BRW_WRITE && (pg.off + PAGE_SIZE > inode->i_size))
+        if ((cmd & OBD_BRW_WRITE) && (pg.off + PAGE_SIZE > inode->i_size))
                 pg.count = inode->i_size % PAGE_SIZE;
         else
                 pg.count = PAGE_SIZE;
@@ -87,7 +87,7 @@ static int ll_brw(int cmd, struct inode *inode, struct obdo *oa,
 
         pg.flag = flags;
 
-        if (cmd == OBD_BRW_WRITE)
+        if (cmd & OBD_BRW_WRITE)
                 lprocfs_counter_add(ll_i2sbi(inode)->ll_stats,
                                     LPROC_LL_BRW_WRITE, pg.count);
         else
@@ -266,7 +266,7 @@ static int ll_ap_make_ready(void *data, int cmd)
         llap = LLAP_FROM_COOKIE(data);
         page = llap->llap_page;
 
-        LASSERT(cmd != OBD_BRW_READ);
+        LASSERT(!(cmd & OBD_BRW_READ));
 
         /* we're trying to write, but the page is locked.. come back later */
         if (TryLockPage(page))
@@ -343,7 +343,7 @@ void ll_inode_fill_obdo(struct inode *inode, int cmd, struct obdo *oa)
         oa->o_id = lsm->lsm_object_id;
         oa->o_valid = OBD_MD_FLID;
         valid_flags = OBD_MD_FLTYPE | OBD_MD_FLATIME;
-        if (cmd == OBD_BRW_WRITE) {
+        if (cmd & OBD_BRW_WRITE) {
                 oa->o_valid |= OBD_MD_FLIFID | OBD_MD_FLEPOCH;
                 mdc_pack_fid(obdo_fid(oa), inode->i_ino, 0, inode->i_mode);
                 oa->o_easize = ll_i2info(inode)->lli_io_epoch;
@@ -367,26 +367,11 @@ static void ll_ap_fill_obdo(void *data, int cmd, struct obdo *oa)
         EXIT;
 }
 
-static void ll_ap_get_ucred(void *data, struct lvfs_ucred *ouc)
-{
-        struct ll_async_page *llap;
-
-        llap = LLAP_FROM_COOKIE(data);
-        if (IS_ERR(llap)) {
-                EXIT;
-                return;
-        }
-
-        memcpy(ouc, &llap->llap_ouc, sizeof(*ouc));
-        EXIT;
-}
-
 static struct obd_async_page_ops ll_async_page_ops = {
         .ap_make_ready =        ll_ap_make_ready,
         .ap_refresh_count =     ll_ap_refresh_count,
         .ap_fill_obdo =         ll_ap_fill_obdo,
         .ap_completion =        ll_ap_completion,
-        .ap_get_ucred =         ll_ap_get_ucred,
 };
 
 struct ll_async_page *llap_cast_private(struct page *page)
@@ -595,14 +580,14 @@ static int queue_or_sync_write(struct obd_export *exp, struct inode *inode,
         unsigned long size_index = inode->i_size >> PAGE_SHIFT;
         struct obd_io_group *oig;
         struct ll_sb_info *sbi = ll_i2sbi(inode);
-        int rc;
+        int rc, noquot = capable(CAP_SYS_RESOURCE) ? OBD_BRW_NOQUOTA : 0;
         ENTRY;
 
         /* _make_ready only sees llap once we've unlocked the page */
         llap->llap_write_queued = 1;
         rc = obd_queue_async_io(exp, ll_i2info(inode)->lli_smd, NULL,
-                                llap->llap_cookie, OBD_BRW_WRITE, 0, 0, 0,
-                                async_flags);
+                                llap->llap_cookie, OBD_BRW_WRITE | noquot,
+                                0, 0, 0, async_flags);
         if (rc == 0) {
                 LL_CDEBUG_PAGE(D_PAGE, llap->llap_page, "write queued\n");
                 //llap_write_pending(inode, llap);
@@ -647,8 +632,8 @@ static int queue_or_sync_write(struct obd_export *exp, struct inode *inode,
         }
 
         rc = obd_queue_group_io(exp, ll_i2info(inode)->lli_smd, NULL, oig,
-                                llap->llap_cookie, OBD_BRW_WRITE, 0, to, 0,
-                                ASYNC_READY | ASYNC_URGENT |
+                                llap->llap_cookie, OBD_BRW_WRITE | noquot,
+                                0, to, 0, ASYNC_READY | ASYNC_URGENT |
                                 ASYNC_COUNT_STABLE | ASYNC_GROUP_SYNC);
         if (rc)
                 GOTO(free_oig, rc);
@@ -683,7 +668,6 @@ int ll_commit_write(struct file *file, struct page *page, unsigned from,
         struct lov_stripe_md *lsm = lli->lli_smd;
         struct obd_export *exp;
         struct ll_async_page *llap;
-        struct ll_uctxt ctxt;
         loff_t size;
         int rc = 0;
         ENTRY;
@@ -703,13 +687,6 @@ int ll_commit_write(struct file *file, struct page *page, unsigned from,
         if (exp == NULL)
                 RETURN(-EINVAL);
 
-        /* set user credit information for this page */
-        llap->llap_ouc.luc_fsuid = current->fsuid;
-        llap->llap_ouc.luc_fsgid = current->fsgid;
-        llap->llap_ouc.luc_cap = current->cap_effective;
-        ll_i2uctxt(&ctxt, inode, NULL);
-        llap->llap_ouc.luc_suppgid1 = ctxt.gid1;
-
         /* queue a write for some time in the future the first time we
          * dirty the page */
         if (!PageDirty(page)) {
@@ -785,11 +762,11 @@ void ll_ap_completion(void *data, int cmd, struct obdo *oa, int rc)
 
         LL_CDEBUG_PAGE(D_PAGE, page, "completing cmd %d with %d\n", cmd, rc);
 
-        if (cmd == OBD_BRW_READ && llap->llap_defer_uptodate)
+        if (cmd & OBD_BRW_READ && llap->llap_defer_uptodate)
                 ll_ra_count_put(ll_i2sbi(page->mapping->host), 1);
 
         if (rc == 0)  {
-                if (cmd == OBD_BRW_READ) {
+                if (cmd & OBD_BRW_READ) {
                         if (!llap->llap_defer_uptodate)
                                 SetPageUptodate(page);
                 } else {
@@ -797,7 +774,7 @@ void ll_ap_completion(void *data, int cmd, struct obdo *oa, int rc)
                 }
                 ClearPageError(page);
         } else {
-                if (cmd == OBD_BRW_READ) {
+                if (cmd & OBD_BRW_READ) {
                         llap->llap_defer_uptodate = 0;
                 } else {
                         ll_redirty_page(page);
@@ -807,7 +784,7 @@ void ll_ap_completion(void *data, int cmd, struct obdo *oa, int rc)
 
         unlock_page(page);
 
-        if (0 && cmd == OBD_BRW_WRITE) {
+        if (0 && cmd & OBD_BRW_WRITE) {
                 llap_write_complete(page->mapping->host, llap);
                 ll_try_done_writing(page->mapping->host);
         }
@@ -914,8 +891,8 @@ static int ll_issue_page_read(struct obd_export *exp,
         llap->llap_ra_used = 0;
         rc = obd_queue_group_io(exp, ll_i2info(page->mapping->host)->lli_smd,
                                 NULL, oig, llap->llap_cookie, OBD_BRW_READ, 0,
-                                PAGE_SIZE, 0, ASYNC_COUNT_STABLE | ASYNC_READY
-                                              ASYNC_URGENT);
+                                PAGE_SIZE, 0, ASYNC_COUNT_STABLE | ASYNC_READY |
+                                              ASYNC_URGENT);
         if (rc) {
                 LL_CDEBUG_PAGE(D_ERROR, page, "read queue failed: rc %d\n", rc);
                 page_cache_release(page);
index 895f7c9..1e9355a 100644 (file)
@@ -274,9 +274,14 @@ static int ll_special_open(struct inode *inode, struct file *filp)
         struct file_operations *sfops = filp->f_op;
         struct ptlrpc_request *req;
         struct lookup_intent *it;
+        struct ll_file_data *fd;
         int rc = -EINVAL, err;
         ENTRY;
 
+        fd = ll_file_data_get();
+        if (fd == NULL)
+                RETURN(-ENOMEM);
+
         if (pfop && *pfop) {
                 /* FIXME fops_get */
                 if ((*pfop)->open) {
@@ -291,7 +296,7 @@ static int ll_special_open(struct inode *inode, struct file *filp)
 
         it = filp->f_it;
 
-        err = ll_local_open(filp, it);
+        err = ll_local_open(filp, it, fd);
         if (rc != 0) {
                 CERROR("error opening special file: rc %d\n", rc);
                 ll_mdc_close(ll_i2sbi(inode)->ll_mdc_exp, inode, filp);
index 6537be4..722f42b 100644 (file)
@@ -6,20 +6,23 @@
  *         Peter Braam <braam@clusterfs.com>
  *         Mike Shaver <shaver@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -88,7 +91,7 @@ static int lov_llog_origin_add(struct llog_ctxt *ctxt,
 }
 
 static int lov_llog_origin_connect(struct llog_ctxt *ctxt, int count,
-                                   struct llog_logid *logid, 
+                                   struct llog_logid *logid,
                                    struct llog_gen *gen,
                                    struct obd_uuid *uuid)
 {
@@ -136,7 +139,7 @@ static int lov_llog_repl_cancel(struct llog_ctxt *ctxt, struct lov_stripe_md *ls
         loi = lsm->lsm_oinfo;
         lov = &obd->u.lov;
         for (i = 0; i < count; i++, cookies++, loi++) {
-                struct obd_device *child = lov->tgts[loi->loi_ost_idx].ltd_exp->exp_obd; 
+                struct obd_device *child = lov->tgts[loi->loi_ost_idx].ltd_exp->exp_obd;
                 struct llog_ctxt *cctxt = llog_get_context(child, ctxt->loc_idx);
                 int err;
 
index 30092ae..614d1e6 100644 (file)
@@ -3,20 +3,23 @@
  *
  * Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
index 9629989..4303589 100644 (file)
@@ -6,20 +6,23 @@
  *         Peter Braam <braam@clusterfs.com>
  *         Mike Shaver <shaver@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -1354,19 +1357,11 @@ static void lov_ap_completion(void *data, int cmd, struct obdo *oa, int rc)
         lap->lap_caller_ops->ap_completion(lap->lap_caller_data, cmd, oa, rc);
 }
 
-static void lov_ap_get_ucred(void *data, struct lvfs_ucred *ouc)
-{
-        struct lov_async_page *lap = LAP_FROM_COOKIE(data);
-
-        lap->lap_caller_ops->ap_get_ucred(lap->lap_caller_data, ouc);
-}
-
 static struct obd_async_page_ops lov_async_page_ops = {
         .ap_make_ready =        lov_ap_make_ready,
         .ap_refresh_count =     lov_ap_refresh_count,
         .ap_fill_obdo =         lov_ap_fill_obdo,
         .ap_completion =        lov_ap_completion,
-        .ap_get_ucred =         lov_ap_get_ucred,
 };
 
 int lov_prep_async_page(struct obd_export *exp, struct lov_stripe_md *lsm,
@@ -1649,10 +1644,6 @@ static int lov_change_cbdata(struct obd_export *exp,
         lov = &exp->exp_obd->u.lov;
         for (i = 0,loi = lsm->lsm_oinfo; i < lsm->lsm_stripe_count; i++,loi++) {
                 struct lov_stripe_md submd;
-                if (lov->tgts[loi->loi_ost_idx].active == 0) {
-                        CDEBUG(D_HA, "lov idx %d inactive\n", loi->loi_ost_idx);
-                        continue;
-                }
 
                 submd.lsm_object_id = loi->loi_id;
                 submd.lsm_stripe_count = 0;
@@ -2070,6 +2061,20 @@ static int lov_set_info(struct obd_export *exp, obd_count keylen,
                 RETURN(rc);
         }
 
+        if (KEY_IS("evict_by_nid")) {
+                for (i = 0; i < lov->desc.ld_tgt_count; i++) {
+                        /* OST was disconnected or is inactive */
+                        if (!lov->tgts[i].ltd_exp || !lov->tgts[i].active)
+                                continue;
+
+                        err = obd_set_info(lov->tgts[i].ltd_exp, keylen, key,
+                                           vallen, val);
+                        if (!rc)
+                                rc = err;
+                }
+                RETURN(rc);
+        }
+
         if (KEY_IS("mds_conn") || KEY_IS("unlinked")) {
                 if (vallen != 0)
                         RETURN(-EINVAL);
index 66fad27..b60fd46 100644 (file)
@@ -3,20 +3,23 @@
  *
  * Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
- *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
- *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
+ *
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
+ *
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
+ *
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
index 049ea80..c85333d 100644 (file)
@@ -211,8 +211,9 @@ static int lov_verify_lmm(void *lmm, int lmm_bytes, int *stripe_count)
         case LOV_MAGIC_V1:
                 return lov_verify_lmm_v1(lmm, lmm_bytes, stripe_count);
         default:
-                CERROR("bad disk LOV MAGIC: 0x%08X\n",
+                CERROR("bad disk LOV MAGIC: 0x%08X; dumping V1 LMM:\n",
                        le32_to_cpu(*(__u32 *)lmm));
+                lov_dump_lmm_v1(D_WARNING, lmm);
                 return -EINVAL;
         }
 }
index c7bd979..1eadbc0 100644 (file)
@@ -3,20 +3,23 @@
  *
  * Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
index 3054173..6bc4bd5 100644 (file)
@@ -3,20 +3,23 @@
  *
  * Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -614,7 +617,7 @@ int lov_update_create_set(struct lov_request_set *set,
         loi = &lsm->lsm_oinfo[req->rq_stripe];
 
         if (rc && lov->tgts[req->rq_idx].active) {
-                CERROR("error creating objid "LPX64" sub-object"
+                CERROR("error creating fid "LPX64" sub-object"
                        " on OST idx %d/%d: rc = %d\n",
                        set->set_oa->o_id, req->rq_idx,
                        lsm->lsm_stripe_count, rc);
index 2546c6c..12b755b 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 #define DEBUG_SUBSYSTEM S_CLASS
index 02fb755..dc286b7 100644 (file)
@@ -1,7 +1,7 @@
 MODULES := lvfs #quotactl_test quotacheck_test
 @SERVER_TRUE@MODULES += fsfilt_@BACKINGFS@
 
-lvfs-objs := lvfs_common.o lvfs_linux.o fsfilt.o
+lvfs-objs := lvfs_common.o lvfs_linux.o fsfilt.o upcall_cache.o
 #quotactl-objs := quotactl_test.o
 #quotaccheck-objs := quotacheck_test.o
 
index ef84f9d..10d8904 100644 (file)
@@ -52,7 +52,8 @@ endif # MODULES
 
 DIST_SOURCES = fsfilt.c fsfilt_ext3.c fsfilt_reiserfs.c lvfs_common.c \
        lvfs_internal.h lvfs_linux.c lvfs_userfs.c \
-        quotacheck_test.c quotactl_test.c # fsfilt_ext3_quota.h
+       upcall_cache.c \
+        # quotacheck_test.c quotactl_test.c fsfilt_ext3_quota.h
 
 MOSTLYCLEANFILES := @MOSTLYCLEANFILES@ 
 CLEANFILES = fsfilt-*.c fsfilt_ldiskfs.c fsfilt_extN.c sources
index c5ff7a9..458feb8 100644 (file)
@@ -359,7 +359,7 @@ static int fsfilt_ext3_commit_async(struct inode *inode, void *h,
 
         LASSERT(current->journal_info == handle);
 
-        lock_kernel();
+        lock_24kernel();
         transaction = handle->h_transaction;
         journal = transaction->t_journal;
         tid = transaction->t_tid;
@@ -368,7 +368,7 @@ static int fsfilt_ext3_commit_async(struct inode *inode, void *h,
         rc = journal_stop(handle);
         if (rc) {
                 CERROR("error while stopping transaction: %d\n", rc);
-                unlock_kernel();
+                unlock_24kernel();
                 return rc;
         }
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
@@ -377,9 +377,9 @@ static int fsfilt_ext3_commit_async(struct inode *inode, void *h,
                 CERROR("strange race: %lu != %lu\n",
                        (unsigned long) tid, (unsigned long) rtid);
 #else
-        log_start_commit(journal, transaction->t_tid);
+        log_start_commit(journal, tid);
 #endif
-        unlock_kernel();
+        unlock_24kernel();
 
         *wait_handle = (void *) tid;
         CDEBUG(D_INODE, "commit async: %lu\n", (unsigned long) tid);
@@ -473,11 +473,11 @@ static int fsfilt_ext3_set_md(struct inode *inode, void *handle,
                 CWARN("setting EA on %lu/%u again... interesting\n",
                        inode->i_ino, inode->i_generation);
 
-        lock_kernel();
+        lock_24kernel();
         rc = ext3_xattr_set_handle(handle, inode, EXT3_XATTR_INDEX_TRUSTED,
                                    XATTR_LUSTRE_MDS_LOV_EA, lmm, lmm_size, 0);
 
-        unlock_kernel();
+        unlock_24kernel();
 
         if (rc)
                 CERROR("error adding MD data to inode %lu: rc = %d\n",
@@ -491,11 +491,11 @@ static int fsfilt_ext3_get_md(struct inode *inode, void *lmm, int lmm_size)
         int rc;
 
         LASSERT(down_trylock(&inode->i_sem) != 0);
-        lock_kernel();
+        lock_24kernel();
 
         rc = ext3_xattr_get(inode, EXT3_XATTR_INDEX_TRUSTED,
                             XATTR_LUSTRE_MDS_LOV_EA, lmm, lmm_size);
-        unlock_kernel();
+        unlock_24kernel();
 
         /* This gives us the MD size */
         if (lmm == NULL)
@@ -764,7 +764,7 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
         EXT_ASSERT(i == path->p_depth);
         EXT_ASSERT(path[i].p_hdr);
 
-               if (cex->ec_type == EXT3_EXT_CACHE_EXTENT) {
+        if (cex->ec_type == EXT3_EXT_CACHE_EXTENT) {
                 err = EXT_CONTINUE;
                 goto map;
         }
@@ -812,7 +812,9 @@ static int ext3_ext_new_extent_cb(struct ext3_extents_tree *tree,
         count = cex->ec_len;
         goal = ext3_ext_find_goal(inode, path, cex->ec_block, &aflags);
         aflags |= 2; /* block have been already reserved */
+        lock_24kernel();
         pblock = ext3_mb_new_blocks(handle, inode, goal, &count, aflags, &err);
+        unlock_24kernel();
         if (!pblock)
                 goto out;
         EXT_ASSERT(count <= cex->ec_len);
@@ -851,6 +853,8 @@ out:
         unlock_24kernel();
 map:
         if (err >= 0) {
+                struct block_device *bdev = inode->i_sb->s_bdev;
+
                 /* map blocks */
                 if (bp->num == 0) {
                         CERROR("hmm. why do we find this extent?\n");
@@ -867,12 +871,18 @@ map:
                         CERROR("nothing to do?! i = %d, e_num = %u\n",
                                         i, cex->ec_len);
                 for (; i < cex->ec_len && bp->num; i++) {
-                        if (cex->ec_type == EXT3_EXT_CACHE_EXTENT)
+                        *(bp->blocks) = cex->ec_start + i;
+                        if (cex->ec_type == EXT3_EXT_CACHE_EXTENT) {
                                 *(bp->created) = 0;
-                        else
+                        } else {
                                 *(bp->created) = 1;
+                                /* unmap any possible underlying metadata from
+                                 * the block device mapping.  bug 6998.
+                                 * This only compiles on 2.6, but there are
+                                 * no users of mballoc on 2.4. */
+                                unmap_underlying_metadata(bdev, *(bp->blocks));
+                        }
                         bp->created++;
-                        *(bp->blocks) = cex->ec_start + i;
                         bp->blocks++;
                         bp->num--;
                         bp->start++;
index 4d68116..091fd99 100644 (file)
@@ -1,8 +1,5 @@
 int  fsfilt_ext3_init(void);
 void fsfilt_ext3_exit(void);
 
-int  fsfilt_extN_init(void);
-void fsfilt_extN_exit(void);
-
 int  fsfilt_reiser_init(void);
 void fsfilt_reiser_exit(void);
index 52f0f0d..afe58d9 100644 (file)
@@ -65,13 +65,57 @@ int obd_memmax;
 # define ASSERT_KERNEL_CTXT(msg) do {} while(0)
 #endif
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4))
-#define current_ngroups current->group_info->ngroups
-#define current_groups current->group_info->small_block
+static void push_group_info(struct lvfs_run_ctxt *save,
+                            struct upcall_cache_entry *uce)
+{
+        struct group_info *ginfo = uce ? uce->ue_group_info : NULL;
+
+        if (!ginfo) {
+                save->ngroups = current_ngroups;
+                current_ngroups = 0;
+        } else {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
+                task_lock(current);
+                save->group_info = current->group_info;
+                current->group_info = ginfo;
+                task_unlock(current);
 #else
-#define current_ngroups current->ngroups
-#define current_groups current->groups
+                LASSERT(ginfo->ngroups <= NGROUPS);
+                LASSERT(current->ngroups <= NGROUPS_SMALL);
+                /* save old */
+                save->group_info.ngroups = current->ngroups;
+                if (current->ngroups)
+                        memcpy(save->group_info.small_block, current->groups,
+                               current->ngroups * sizeof(gid_t));
+                /* push new */
+                current->ngroups = ginfo->ngroups;
+                if (ginfo->ngroups)
+                        memcpy(current->groups, ginfo->small_block,
+                               current->ngroups * sizeof(gid_t));
 #endif
+        }
+}
+
+static void pop_group_info(struct lvfs_run_ctxt *save,
+                           struct upcall_cache_entry *uce)
+{
+        struct group_info *ginfo = uce ? uce->ue_group_info : NULL;
+
+        if (!ginfo) {
+                current_ngroups = save->ngroups;
+        } else {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
+                task_lock(current);
+                current->group_info = save->group_info;
+                task_unlock(current);
+#else
+                current->ngroups = save->group_info.ngroups;
+                if (current->ngroups)
+                        memcpy(current->groups, save->group_info.small_block,
+                               current->ngroups * sizeof(gid_t));
+#endif
+        }
+}
 
 /* push / pop to root of obd store */
 void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx,
@@ -97,7 +141,6 @@ void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx,
         LASSERT(atomic_read(&new_ctx->pwd->d_count));
         save->pwd = dget(current->fs->pwd);
         save->pwdmnt = mntget(current->fs->pwdmnt);
-        save->ngroups = current_ngroups;
         save->luc.luc_umask = current->fs->umask;
 
         LASSERT(save->pwd);
@@ -109,25 +152,11 @@ void push_ctxt(struct lvfs_run_ctxt *save, struct lvfs_run_ctxt *new_ctx,
                 save->luc.luc_fsuid = current->fsuid;
                 save->luc.luc_fsgid = current->fsgid;
                 save->luc.luc_cap = current->cap_effective;
-                save->luc.luc_suppgid1 = current_groups[0];
-                save->luc.luc_suppgid2 = current_groups[1];
 
                 current->fsuid = uc->luc_fsuid;
                 current->fsgid = uc->luc_fsgid;
                 current->cap_effective = uc->luc_cap;
-                current_ngroups = 0;
-
-                if (uc->luc_suppgid1 != -1)
-                        current_groups[current_ngroups++] = uc->luc_suppgid1;
-                if (uc->luc_suppgid2 != -1)
-                        current_groups[current_ngroups++] = uc->luc_suppgid2;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
-                if (uc->luc_suppgid1 != -1 && uc->luc_suppgid2 != -1 &&
-                    (uc->luc_suppgid1 > uc->luc_suppgid2)) {
-                        current_groups[0] = uc->luc_suppgid2;
-                        current_groups[1] = uc->luc_suppgid1;
-                }
-#endif
+                push_group_info(save, uc->luc_uce);
         }
         current->fs->umask = 0; /* umask already applied on client */
         set_fs(new_ctx->fs);
@@ -178,9 +207,7 @@ void pop_ctxt(struct lvfs_run_ctxt *saved, struct lvfs_run_ctxt *new_ctx,
                 current->fsuid = saved->luc.luc_fsuid;
                 current->fsgid = saved->luc.luc_fsgid;
                 current->cap_effective = saved->luc.luc_cap;
-                current_ngroups = saved->ngroups;
-                current_groups[0] = saved->luc.luc_suppgid1;
-                current_groups[1] = saved->luc.luc_suppgid2;
+                pop_group_info(saved, uc->luc_uce);
         }
 
         /*
@@ -352,13 +379,16 @@ static int l_filldir(void *__buf, const char *name, int namlen, loff_t offset,
 {
         struct l_linux_dirent *dirent;
         struct l_readdir_callback *buf = (struct l_readdir_callback *)__buf;
-        
+
         dirent = buf->lrc_dirent;
         if (dirent)
-               dirent->lld_off = offset; 
+               dirent->lld_off = offset;
 
         OBD_ALLOC(dirent, sizeof(*dirent));
 
+        if (!dirent)
+                return -ENOMEM;
+
         list_add_tail(&dirent->lld_list, buf->lrc_list);
 
         buf->lrc_dirent = dirent;
diff --git a/lustre/lvfs/upcall_cache.c b/lustre/lvfs/upcall_cache.c
new file mode 100644 (file)
index 0000000..a8bb2b6
--- /dev/null
@@ -0,0 +1,519 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Supplementary groups cache.
+ *
+ *  Copyright (c) 2004 Cluster File Systems, Inc.
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre is free software; you can redistribute it and/or
+ *   modify it under the terms of version 2 of the GNU General Public
+ *   License as published by the Free Software Foundation.
+ *
+ *   Lustre is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define DEBUG_SUBSYSTEM S_SEC
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/kmod.h>
+#include <linux/string.h>
+#include <linux/stat.h>
+#include <linux/errno.h>
+#include <linux/version.h>
+#include <linux/unistd.h>
+
+#include <asm/system.h>
+#include <asm/uaccess.h>
+
+#include <linux/fs.h>
+#include <linux/stat.h>
+#include <asm/uaccess.h>
+#include <linux/slab.h>
+#include <asm/segment.h>
+
+#include <linux/obd_support.h>
+#include <linux/lustre_lib.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4)
+struct group_info *groups_alloc(int ngroups)
+{
+        struct group_info *ginfo;
+
+        LASSERT(ngroups <= NGROUPS_SMALL);
+
+        OBD_ALLOC(ginfo, sizeof(*ginfo) + 1 * sizeof(gid_t *));
+        if (!ginfo)
+                return NULL;
+        ginfo->ngroups = ngroups;
+        ginfo->nblocks = 1;
+        ginfo->blocks[0] = ginfo->small_block;
+        atomic_set(&ginfo->usage, 1);
+
+        return ginfo;
+}
+
+void groups_free(struct group_info *ginfo)
+{
+        if (!ginfo)
+                return;
+
+        LASSERT(ginfo->ngroups <= NGROUPS_SMALL);
+        LASSERT(ginfo->nblocks == 1);
+        LASSERT(ginfo->blocks[0] == ginfo->small_block);
+
+        OBD_FREE(ginfo, sizeof(*ginfo) + 1 * sizeof(gid_t *));
+}
+#endif
+
+static struct upcall_cache_entry *alloc_entry(__u64 key)
+{
+        struct upcall_cache_entry *entry;
+
+        OBD_ALLOC(entry, sizeof(*entry));
+        if (!entry)
+                return NULL;
+
+        UC_CACHE_SET_NEW(entry);
+        INIT_LIST_HEAD(&entry->ue_hash);
+        entry->ue_key = key;
+        atomic_set(&entry->ue_refcount, 0);
+        init_waitqueue_head(&entry->ue_waitq);
+        return entry;
+}
+
+/* protected by hash lock */
+static void free_entry(struct upcall_cache_entry *entry)
+{
+        groups_free(entry->ue_group_info);
+        list_del(&entry->ue_hash);
+        CDEBUG(D_OTHER, "destroy cache entry %p for key "LPU64"\n",
+               entry, entry->ue_key);
+        OBD_FREE(entry, sizeof(*entry));
+}
+
+static void get_entry(struct upcall_cache_entry *entry)
+{
+        atomic_inc(&entry->ue_refcount);
+}
+
+static void put_entry(struct upcall_cache_entry *entry)
+{
+        if (atomic_dec_and_test(&entry->ue_refcount) &&
+            (UC_CACHE_IS_INVALID(entry) || UC_CACHE_IS_EXPIRED(entry))) {
+                free_entry(entry);
+        }
+}
+
+static int check_unlink_entry(struct upcall_cache_entry *entry)
+{
+        if (UC_CACHE_IS_VALID(entry) &&
+            time_before(jiffies, entry->ue_expire))
+                return 0;
+
+        if (UC_CACHE_IS_ACQUIRING(entry)) {
+                if (time_before(jiffies, entry->ue_acquire_expire))
+                        return 0;
+
+                UC_CACHE_SET_EXPIRED(entry);
+                wake_up_all(&entry->ue_waitq);
+        } else if (!UC_CACHE_IS_INVALID(entry)) {
+                UC_CACHE_SET_EXPIRED(entry);
+        }
+
+        list_del_init(&entry->ue_hash);
+        if (!atomic_read(&entry->ue_refcount))
+                free_entry(entry);
+        return 1;
+}
+
+static int refresh_entry(struct upcall_cache *hash,
+                         struct upcall_cache_entry *entry)
+{
+        char *argv[4];
+        char *envp[3];
+        char keystr[16];
+        int rc;
+        ENTRY;
+
+        snprintf(keystr, 16, LPU64, entry->ue_key);
+
+        CDEBUG(D_INFO, "The groups upcall is: %s \n", hash->uc_upcall);
+        argv[0] = hash->uc_upcall;
+        argv[1] = hash->uc_name;
+        argv[2] = keystr;
+        argv[3] = NULL;
+
+        envp[0] = "HOME=/";
+        envp[1] = "PATH=/sbin:/usr/sbin";
+        envp[2] = NULL;
+
+        rc = USERMODEHELPER(argv[0], argv, envp);
+        if (rc < 0) {
+                CERROR("%s: error invoking getgroups upcall %s %s %s: rc %d; "
+                       "check /proc/fs/lustre/mds/%s/group_upcall\n",
+                       hash->uc_name, argv[0], argv[1], argv[2], rc, argv[1]);
+        } else {
+                CDEBUG(D_HA, "%s: invoked upcall %s %s %s\n", hash->uc_name,
+                       argv[0], argv[1], argv[2]);
+                rc = 0;
+        }
+        RETURN(rc);
+}
+
+static int entry_set_group_info(struct upcall_cache_entry *entry, __u32 primary,
+                                __u32 ngroups, __u32 *groups)
+{
+        struct group_info *ginfo;
+        int i, j;
+        ENTRY;
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4)
+        if (ngroups > NGROUPS)
+                ngroups = NGROUPS;
+#endif
+
+        if (ngroups > NGROUPS_MAX) {
+                CERROR("using first %d supplementary groups for uid "LPU64"\n",
+                       NGROUPS_MAX, entry->ue_key);
+                ngroups = NGROUPS_MAX;
+        }
+
+        ginfo = groups_alloc(ngroups);
+        if (!ginfo) {
+                CERROR("uid "LPU64" update can't alloc ginfo for %d groups\n",
+                       entry->ue_key, ngroups);
+                RETURN(-ENOMEM);
+        }
+        entry->ue_group_info = ginfo;
+        entry->ue_primary = primary;
+
+        for (i = 0; i < ginfo->nblocks; i++) {
+                int cp_count = min(NGROUPS_PER_BLOCK, (int)ngroups);
+                int off = i * NGROUPS_PER_BLOCK;
+
+                for (j = 0; j < cp_count; j++)
+                        ginfo->blocks[i][j] = groups[off + j];
+
+                ngroups -= cp_count;
+        }
+        RETURN(0);
+}
+
+struct upcall_cache_entry *upcall_cache_get_entry(struct upcall_cache *hash,
+                                                  __u64 key, __u32 primary,
+                                                  __u32 ngroups, __u32 *groups)
+{
+        struct upcall_cache_entry *entry = NULL, *new = NULL, *next;
+        struct list_head *head;
+        wait_queue_t wait;
+        int rc, found;
+        ENTRY;
+
+        LASSERT(hash);
+
+        if (strcmp(hash->uc_upcall, "NONE") == 0) {
+                new = alloc_entry(key);
+                if (!new) {
+                        CERROR("fail to alloc entry\n");
+                        RETURN(NULL);
+                }
+                get_entry(new);
+
+                /* We have to sort the groups for 2.6 kernels */
+                LASSERT(ngroups <= 2);
+                if (ngroups == 2 && groups[1] == -1)
+                        ngroups--;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)
+                /* 2.6 needs groups array sorted */
+                if (ngroups == 2 && groups[0] > groups[1]) {
+                        __u32 tmp = groups[1];
+                        groups[1] = groups[0];
+                        groups[0] = tmp;
+                }
+#endif
+                if (ngroups > 0 && groups[0] == -1) {
+                        groups[0] = groups[1];
+                        ngroups--;
+                }
+
+                rc = entry_set_group_info(new, primary, ngroups, groups);
+
+                /* We can't cache this entry as it only has a subset of
+                 * the user's groups, as sent in suppgid1, suppgid2. */
+                UC_CACHE_SET_EXPIRED(new);
+                RETURN(new);
+        }
+        head = &hash->uc_hashtable[UC_CACHE_HASH_INDEX(key)];
+find_again:
+        found = 0;
+        spin_lock(&hash->uc_lock);
+        list_for_each_entry_safe(entry, next, head, ue_hash) {
+                /* check invalid & expired items */
+                if (check_unlink_entry(entry))
+                        continue;
+                if (entry->ue_key == key) {
+                        found = 1;
+                        break;
+                }
+        }
+
+        if (!found) { /* didn't find it */
+                if (!new) {
+                        spin_unlock(&hash->uc_lock);
+                        new = alloc_entry(key);
+                        if (!new) {
+                                CERROR("fail to alloc entry\n");
+                                RETURN(ERR_PTR(-ENOMEM));
+                        }
+                        goto find_again;
+                } else {
+                        list_add(&new->ue_hash, head);
+                        entry = new;
+                }
+        } else {
+                if (new) {
+                        free_entry(new);
+                        new = NULL;
+                }
+                list_move(&entry->ue_hash, head);
+        }
+        get_entry(entry);
+
+        /* acquire for new one */
+        if (UC_CACHE_IS_NEW(entry)) {
+                UC_CACHE_SET_ACQUIRING(entry);
+                UC_CACHE_CLEAR_NEW(entry);
+                entry->ue_acquire_expire = jiffies + hash->uc_acquire_expire;
+                spin_unlock(&hash->uc_lock);
+                rc = refresh_entry(hash, entry);
+                spin_lock(&hash->uc_lock);
+                if (rc < 0) {
+                        UC_CACHE_CLEAR_ACQUIRING(entry);
+                        UC_CACHE_SET_INVALID(entry);
+                }
+                /* fall through */
+        }
+        /* someone (and only one) is doing upcall upon
+         * this item, just wait it complete
+         */
+        if (UC_CACHE_IS_ACQUIRING(entry)) {
+                init_waitqueue_entry(&wait, current);
+                add_wait_queue(&entry->ue_waitq, &wait);
+                set_current_state(TASK_INTERRUPTIBLE);
+                spin_unlock(&hash->uc_lock);
+
+                schedule_timeout(hash->uc_acquire_expire);
+
+                spin_lock(&hash->uc_lock);
+                remove_wait_queue(&entry->ue_waitq, &wait);
+                if (UC_CACHE_IS_ACQUIRING(entry)) {
+                        static unsigned long next;
+                        /* we're interrupted or upcall failed in the middle */
+                        if (time_after(jiffies, next)) {
+                                CERROR("key "LPU64" update failed: check %s\n",
+                                       entry->ue_key, hash->uc_upcall);
+                                next = jiffies + 1800;
+                        }
+                        put_entry(entry);
+                        GOTO(out, entry = ERR_PTR(-EIDRM));
+                }
+                /* fall through */
+        }
+
+        /* invalid means error, don't need to try again */
+        if (UC_CACHE_IS_INVALID(entry)) {
+                put_entry(entry);
+                GOTO(out, entry = ERR_PTR(-EIDRM));
+        }
+
+        /* check expired
+         * We can't refresh the existing one because some
+         * memory might be shared by multiple processes.
+         */
+        if (check_unlink_entry(entry)) {
+                /* if expired, try again. but if this entry is
+                 * created by me but too quickly turn to expired
+                 * without any error, should at least give a
+                 * chance to use it once.
+                 */
+                if (entry != new) {
+                        put_entry(entry);
+                        spin_unlock(&hash->uc_lock);
+                        new = NULL;
+                        goto find_again;
+                }
+        }
+
+        /* Now we know it's good */
+out:
+        spin_unlock(&hash->uc_lock);
+        RETURN(entry);
+}
+EXPORT_SYMBOL(upcall_cache_get_entry);
+
+void upcall_cache_put_entry(struct upcall_cache *hash,
+                            struct upcall_cache_entry *entry)
+{
+        ENTRY;
+
+        if (!entry) {
+                EXIT;
+                return;
+        }
+
+        LASSERT(atomic_read(&entry->ue_refcount) > 0);
+        spin_lock(&hash->uc_lock);
+        put_entry(entry);
+        spin_unlock(&hash->uc_lock);
+        EXIT;
+}
+EXPORT_SYMBOL(upcall_cache_put_entry);
+
+int upcall_cache_downcall(struct upcall_cache *hash, __u32 err, __u64 key,
+                          __u32 primary, __u32 ngroups, __u32 *groups)
+{
+        struct upcall_cache_entry *entry = NULL;
+        struct list_head *head;
+        int found = 0, rc = 0;
+        ENTRY;
+
+        LASSERT(hash);
+
+        head = &hash->uc_hashtable[UC_CACHE_HASH_INDEX(key)];
+
+        spin_lock(&hash->uc_lock);
+        list_for_each_entry(entry, head, ue_hash) {
+                if (entry->ue_key == key) {
+                        found = 1;
+                        get_entry(entry);
+                        break;
+                }
+        }
+
+        if (!found) {
+                CDEBUG(D_OTHER, "%s: upcall for key "LPU64" not expected\n",
+                       hash->uc_name, entry->ue_key);
+                /* haven't found, it's possible */
+                spin_unlock(&hash->uc_lock);
+                RETURN(-EINVAL);
+        }
+
+        if (err) {
+                CDEBUG(D_OTHER, "%s: upcall for key "LPU64" returned %d\n",
+                       hash->uc_name, entry->ue_key, err);
+                GOTO(out, rc = -EINVAL);
+        }
+
+        if (!UC_CACHE_IS_ACQUIRING(entry)) {
+                CERROR("%s: found uptodate entry %p (key "LPU64") in ioctl\n",
+                       hash->uc_name, entry, entry->ue_key);
+                GOTO(out, rc = 0);
+        }
+
+        if (UC_CACHE_IS_INVALID(entry) || UC_CACHE_IS_EXPIRED(entry)) {
+                CERROR("%s: found a stale entry %p (key "LPU64") in ioctl\n",
+                       hash->uc_name, entry, entry->ue_key);
+                GOTO(out, rc = -EINVAL);
+        }
+
+        spin_unlock(&hash->uc_lock);
+        rc = entry_set_group_info(entry, primary, ngroups, groups);
+        spin_lock(&hash->uc_lock);
+        if (rc)
+                GOTO(out, rc);
+
+        entry->ue_expire = jiffies + hash->uc_entry_expire;
+        UC_CACHE_SET_VALID(entry);
+        CDEBUG(D_OTHER, "%s: created upcall cache entry %p for key "LPU64"\n",
+               hash->uc_name, entry, entry->ue_key);
+out:
+        if (rc) {
+                UC_CACHE_SET_INVALID(entry);
+                list_del_init(&entry->ue_hash);
+        }
+        UC_CACHE_CLEAR_ACQUIRING(entry);
+        spin_unlock(&hash->uc_lock);
+        wake_up_all(&entry->ue_waitq);
+        put_entry(entry);
+
+        RETURN(rc);
+}
+EXPORT_SYMBOL(upcall_cache_downcall);
+
+static void cache_flush(struct upcall_cache *hash, int force)
+{
+        struct upcall_cache_entry *entry, *next;
+        int i;
+        ENTRY;
+
+        spin_lock(&hash->uc_lock);
+        for (i = 0; i < UC_CACHE_HASH_SIZE; i++) {
+                list_for_each_entry_safe(entry, next,
+                                         &hash->uc_hashtable[i], ue_hash) {
+                        if (!force && atomic_read(&entry->ue_refcount)) {
+                                UC_CACHE_SET_EXPIRED(entry);
+                                continue;
+                        }
+                        LASSERT(!atomic_read(&entry->ue_refcount));
+                        free_entry(entry);
+                }
+        }
+        spin_unlock(&hash->uc_lock);
+        EXIT;
+}
+
+void upcall_cache_flush_idle(struct upcall_cache *cache)
+{
+        cache_flush(cache, 0);
+}
+EXPORT_SYMBOL(upcall_cache_flush_idle);
+
+void upcall_cache_flush_all(struct upcall_cache *cache)
+{
+        cache_flush(cache, 1);
+}
+EXPORT_SYMBOL(upcall_cache_flush_all);
+
+struct upcall_cache *upcall_cache_init(const char *name)
+{
+        struct upcall_cache *hash;
+        int i;
+        ENTRY;
+
+        OBD_ALLOC(hash, sizeof(*hash));
+        if (!hash)
+                RETURN(ERR_PTR(-ENOMEM));
+
+        spin_lock_init(&hash->uc_lock);
+        for (i = 0; i < UC_CACHE_HASH_SIZE; i++)
+                INIT_LIST_HEAD(&hash->uc_hashtable[i]);
+        strncpy(hash->uc_name, name, sizeof(hash->uc_name) - 1);
+        /* set default value, proc tunable */
+        strcpy(hash->uc_upcall, "NONE");
+        hash->uc_entry_expire = 5 * 60 * HZ;
+        hash->uc_acquire_expire = 5 * HZ;
+
+        RETURN(hash);
+}
+EXPORT_SYMBOL(upcall_cache_init);
+
+void upcall_cache_cleanup(struct upcall_cache *hash)
+{
+        if (!hash)
+                return;
+        upcall_cache_flush_all(hash);
+        OBD_FREE(hash, sizeof(*hash));
+}
+EXPORT_SYMBOL(upcall_cache_cleanup);
index 7b83f48..02b06ca 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 #define DEBUG_SUBSYSTEM S_CLASS
index c08b0ab..8d79fe3 100644 (file)
@@ -10,8 +10,9 @@ void mdc_setattr_pack(struct ptlrpc_request *req,
                       struct iattr *iattr, void *ea, int ealen,
                      void *ea2, int ea2len);
 void mdc_create_pack(struct ptlrpc_request *req, int offset,
-                     struct mdc_op_data *op_data, __u32 mode, __u64 rdev,
-                     const void *data, int datalen);
+                     struct mdc_op_data *op_data, const void *data, int datalen,
+                    __u32 mode, __u32 uid, __u32 gid, __u32 cap_effective,
+                    __u64 rdev);
 void mdc_open_pack(struct ptlrpc_request *req, int offset,
                    struct mdc_op_data *op_data, __u32 mode, __u64 rdev,
                    __u32 flags, const void *data, int datalen);
index 3b9e023..b17b798 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_MDC
@@ -68,23 +71,24 @@ void mdc_pack_req_body(struct ptlrpc_request *req)
 
 /* packing of MDS records */
 void mdc_create_pack(struct ptlrpc_request *req, int offset,
-                     struct mdc_op_data *op_data, __u32 mode, __u64 rdev,
-                     const void *data, int datalen)
+                     struct mdc_op_data *op_data, const void *data, int datalen,
+                     __u32 mode, __u32 uid, __u32 gid, __u32 cap_effective,
+                     __u64 rdev)
 {
         struct mds_rec_create *rec;
         char *tmp;
         rec = lustre_msg_buf(req->rq_reqmsg, offset, sizeof (*rec));
 
         rec->cr_opcode = REINT_CREATE;
-        rec->cr_fsuid = current->fsuid;
-        rec->cr_fsgid = current->fsgid;
-        rec->cr_cap = current->cap_effective;
+        rec->cr_fsuid = uid;
+        rec->cr_fsgid = gid;
+        rec->cr_cap = cap_effective;
         rec->cr_fid = op_data->fid1;
         memset(&rec->cr_replayfid, 0, sizeof(rec->cr_replayfid));
         rec->cr_mode = mode;
         rec->cr_rdev = rdev;
         rec->cr_time = op_data->mod_time;
-        rec->cr_suppgid = op_data->ctxt.gid1;
+        rec->cr_suppgid = op_data->suppgids[0];
 
         tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1, op_data->namelen + 1);
         LOGL0(op_data->name, op_data->namelen, tmp);
@@ -131,7 +135,7 @@ void mdc_open_pack(struct ptlrpc_request *req, int offset,
         rec->cr_flags = mds_pack_open_flags(flags);
         rec->cr_rdev = rdev;
         rec->cr_time = op_data->mod_time;
-        rec->cr_suppgid = op_data->ctxt.gid1;
+        rec->cr_suppgid = op_data->suppgids[0];
 
         if (op_data->name) {
                 tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1,
@@ -157,6 +161,7 @@ void mdc_setattr_pack(struct ptlrpc_request *req, struct mdc_op_data *data,
         rec->sa_fsgid = current->fsgid;
         rec->sa_cap = current->cap_effective;
         rec->sa_fid = data->fid1;
+        rec->sa_suppgid = -1;
 
         if (iattr) {
                 rec->sa_valid = iattr->ia_valid;
@@ -170,12 +175,8 @@ void mdc_setattr_pack(struct ptlrpc_request *req, struct mdc_op_data *data,
                 rec->sa_attr_flags = iattr->ia_attr_flags;
                 if ((iattr->ia_valid & ATTR_GID) && in_group_p(iattr->ia_gid))
                         rec->sa_suppgid = iattr->ia_gid;
-                else if ((iattr->ia_valid & ATTR_MODE) &&
-                         in_group_p(iattr->ia_gid))
-                        rec->sa_suppgid = data->ctxt.gid1;
-                else if ((iattr->ia_valid & (ATTR_MTIME|ATTR_CTIME)) &&
-                         data->ctxt.gid1 != -1)
-                        rec->sa_suppgid = data->ctxt.gid1;
+                else
+                        rec->sa_suppgid = data->suppgids[0];
         }
 
         if (ealen == 0)
@@ -203,7 +204,7 @@ void mdc_unlink_pack(struct ptlrpc_request *req, int offset,
         rec->ul_fsgid = current->fsgid;
         rec->ul_cap = current->cap_effective;
         rec->ul_mode = data->create_mode;
-        rec->ul_suppgid = data->ctxt.gid1;
+        rec->ul_suppgid = data->suppgids[0];
         rec->ul_fid1 = data->fid1;
         rec->ul_fid2 = data->fid2;
         rec->ul_time = data->mod_time;
@@ -225,8 +226,8 @@ void mdc_link_pack(struct ptlrpc_request *req, int offset,
         rec->lk_fsuid = current->fsuid;
         rec->lk_fsgid = current->fsgid;
         rec->lk_cap = current->cap_effective;
-        rec->lk_suppgid1 = data->ctxt.gid1;
-        rec->lk_suppgid2 = data->ctxt.gid2;
+        rec->lk_suppgid1 = data->suppgids[0];
+        rec->lk_suppgid2 = data->suppgids[1];
         rec->lk_fid1 = data->fid1;
         rec->lk_fid2 = data->fid2;
         rec->lk_time = data->mod_time;
@@ -249,8 +250,8 @@ void mdc_rename_pack(struct ptlrpc_request *req, int offset,
         rec->rn_fsuid = current->fsuid;
         rec->rn_fsgid = current->fsgid;
         rec->rn_cap = current->cap_effective;
-        rec->rn_suppgid1 = data->ctxt.gid1;
-        rec->rn_suppgid2 = data->ctxt.gid2;
+        rec->rn_suppgid1 = data->suppgids[0];
+        rec->rn_suppgid2 = data->suppgids[1];
         rec->rn_fid1 = data->fid1;
         rec->rn_fid2 = data->fid2;
         rec->rn_time = data->mod_time;
@@ -275,7 +276,7 @@ void mdc_getattr_pack(struct ptlrpc_request *req, int valid, int offset,
         b->capability = current->cap_effective;
         b->valid = valid;
         b->flags = flags;
-        b->suppgid = data->ctxt.gid1;
+        b->suppgid = data->suppgids[0];
 
         b->fid1 = data->fid1;
         if (data->name) {
index c525a2a..ead4b89 100644 (file)
@@ -3,20 +3,23 @@
  *
  * Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.sf.net/projects/lustre/
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -51,26 +54,6 @@ void it_set_disposition(struct lookup_intent *it, int flag)
 }
 EXPORT_SYMBOL(it_set_disposition);
 
-static void mdc_fid2mdc_op_data(struct mdc_op_data *data, struct ll_uctxt *ctxt,
-                                struct ll_fid *f1, struct ll_fid *f2,
-                                const char *name, int namelen, int mode)
-{
-        LASSERT(data);
-        LASSERT(ctxt);
-        LASSERT(f1);
-
-        data->ctxt = *ctxt;
-        data->fid1 = *f1;
-        if (f2)
-                data->fid2 = *f2;
-        else
-                memset(&data->fid2, 0, sizeof(data->fid2));
-        data->name = name;
-        data->namelen = namelen;
-        data->create_mode = mode;
-        data->mod_time = CURRENT_SECONDS;
-}
-
 static int it_to_lock_mode(struct lookup_intent *it)
 {
         /* CREAT needs to be tested before open (both could be set) */
@@ -86,28 +69,28 @@ static int it_to_lock_mode(struct lookup_intent *it)
 int it_open_error(int phase, struct lookup_intent *it)
 {
         if (it_disposition(it, DISP_OPEN_OPEN)) {
-                if (phase == DISP_OPEN_OPEN)
+                if (phase >= DISP_OPEN_OPEN)
                         return it->d.lustre.it_status;
                 else
                         return 0;
         }
 
         if (it_disposition(it, DISP_OPEN_CREATE)) {
-                if (phase == DISP_OPEN_CREATE)
+                if (phase >= DISP_OPEN_CREATE)
                         return it->d.lustre.it_status;
                 else
                         return 0;
         }
 
         if (it_disposition(it, DISP_LOOKUP_EXECD)) {
-                if (phase == DISP_LOOKUP_EXECD)
+                if (phase >= DISP_LOOKUP_EXECD)
                         return it->d.lustre.it_status;
                 else
                         return 0;
         }
 
         if (it_disposition(it, DISP_IT_EXECD)) {
-                if (phase == DISP_IT_EXECD)
+                if (phase >= DISP_IT_EXECD)
                         return it->d.lustre.it_status;
                 else
                         return 0;
@@ -486,10 +469,8 @@ EXPORT_SYMBOL(mdc_enqueue);
  * Else, if DISP_LOOKUP_EXECD then d.lustre.it_status is the rc of the
  * child lookup.
  */
-int mdc_intent_lock(struct obd_export *exp, struct ll_uctxt *uctxt,
-                    struct ll_fid *pfid, const char *name, int len,
-                    void *lmm, int lmmsize,
-                    struct ll_fid *cfid, struct lookup_intent *it,
+int mdc_intent_lock(struct obd_export *exp, struct mdc_op_data *op_data,
+                    void *lmm, int lmmsize, struct lookup_intent *it,
                     int lookup_flags, struct ptlrpc_request **reqp,
                     ldlm_blocking_callback cb_blocking)
 {
@@ -503,14 +484,16 @@ int mdc_intent_lock(struct obd_export *exp, struct ll_uctxt *uctxt,
         LASSERT(it);
 
         CDEBUG(D_DLMTRACE,"name: %.*s in inode "LPU64", intent: %s flags %#o\n",
-               len, name, pfid->id, ldlm_it2str(it->it_op), it->it_flags);
+               op_data->namelen, op_data->name, op_data->fid1.id,
+               ldlm_it2str(it->it_op), it->it_flags);
 
-        if (cfid && (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR)) {
+        if (op_data->fid2.id &&
+            (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR)) {
                 /* We could just return 1 immediately, but since we should only
                  * be called in revalidate_it if we already have a lock, let's
                  * verify that. */
-                struct ldlm_res_id res_id = { .name = { cfid->id,
-                                                        cfid->generation}};
+                struct ldlm_res_id res_id = {.name ={op_data->fid2.id,
+                                                     op_data->fid2.generation}};
                 struct lustre_handle lockh;
                 int mode = LCK_PR;
 
@@ -540,11 +523,9 @@ int mdc_intent_lock(struct obd_export *exp, struct ll_uctxt *uctxt,
          * this and use the request from revalidate.  In this case, revalidate
          * never dropped its reference, so the refcounts are all OK */
         if (!it_disposition(it, DISP_ENQ_COMPLETE)) {
-                struct mdc_op_data op_data;
-                mdc_fid2mdc_op_data(&op_data, uctxt, pfid, cfid, name, len, 0);
 
                 rc = mdc_enqueue(exp, LDLM_PLAIN, it, it_to_lock_mode(it),
-                                 &op_data, &lockh, lmm, lmmsize,
+                                 op_data, &lockh, lmm, lmmsize,
                                  ldlm_completion_ast, cb_blocking, NULL);
                 if (rc < 0)
                         RETURN(rc);
@@ -581,10 +562,10 @@ int mdc_intent_lock(struct obd_export *exp, struct ll_uctxt *uctxt,
 
         /* If we were revalidating a fid/name pair, mark the intent in
          * case we fail and get called again from lookup */
-        if (cfid != NULL) {
+        if (op_data->fid2.id) {
                 it_set_disposition(it, DISP_ENQ_COMPLETE);
                 /* Also: did we find the same inode? */
-                if (memcmp(cfid, &mds_body->fid1, sizeof(*cfid)))
+                if (memcmp(&op_data->fid2, &mds_body->fid1, sizeof(op_data->fid2)))
                         RETURN(-ESTALE);
         }
 
@@ -630,8 +611,8 @@ int mdc_intent_lock(struct obd_export *exp, struct ll_uctxt *uctxt,
                 }
         }
         CDEBUG(D_DENTRY,"D_IT dentry %.*s intent: %s status %d disp %x rc %d\n",
-               len, name, ldlm_it2str(it->it_op), it->d.lustre.it_status,
-               it->d.lustre.it_disposition, rc);
+               op_data->namelen, op_data->name, ldlm_it2str(it->it_op),
+               it->d.lustre.it_status, it->d.lustre.it_disposition, rc);
 
         RETURN(rc);
 }
index 7de0ca5..f282a69 100644 (file)
@@ -3,20 +3,23 @@
  *
  * Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.sf.net/projects/lustre/
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -112,7 +115,7 @@ int mdc_setattr(struct obd_export *exp, struct mdc_op_data *data,
 
 int mdc_create(struct obd_export *exp, struct mdc_op_data *op_data,
                const void *data, int datalen, int mode, __u32 uid, __u32 gid,
-               __u64 rdev, struct ptlrpc_request **request)
+               __u32 cap_effective, __u64 rdev, struct ptlrpc_request **request)
 {
         struct obd_device *obd = exp->exp_obd;
         struct ptlrpc_request *req;
@@ -132,7 +135,8 @@ int mdc_create(struct obd_export *exp, struct mdc_op_data *op_data,
 
         /* mdc_create_pack fills msg->bufs[1] with name
          * and msg->bufs[2] with tgt, for symlinks or lov MD data */
-        mdc_create_pack(req, 0, op_data, mode, rdev, data, datalen);
+        mdc_create_pack(req, 0, op_data, data, datalen, mode,
+                        uid, gid, cap_effective, rdev);
 
         size[0] = sizeof(struct mds_body);
         req->rq_replen = lustre_msg_size(1, size);
index 04c0485..434d114 100644 (file)
@@ -3,20 +3,23 @@
  *
  * Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.sf.net/projects/lustre/
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
index d08bd4b..8dd2fcd 100644 (file)
@@ -1,4 +1,26 @@
-
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ *  Copyright (C) 2005 Cluster File Systems, Inc.
+ *
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
+ *
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
+ *
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
+ *
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
+ */
 
 void commit_add(struct )
 {
index 0304b3f..e7678c5 100644 (file)
  *   Author: Phil Schwan <phil@clusterfs.com>
  *   Author: Mike Shaver <shaver@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -216,10 +219,21 @@ struct dentry *mds_fid2dentry(struct mds_obd *mds, struct ll_fid *fid,
         if (!inode)
                 RETURN(ERR_PTR(-ENOENT));
 
+        if (inode->i_generation == 0 || inode->i_nlink == 0) {
+                LCONSOLE_WARN("Found inode with zero generation or link -- this"
+                              " may indicate disk corruption (inode: %lu, link:"
+                              " %lu, count: %d)\n", inode->i_ino,
+                              (unsigned long)inode->i_nlink,
+                              atomic_read(&inode->i_count));
+                dput(result);
+                RETURN(ERR_PTR(-ENOENT));
+        }
+
         if (generation && inode->i_generation != generation) {
                 /* we didn't find the right inode.. */
-                CERROR("bad inode %lu, link: %lu ct: %d or generation %u/%u\n",
-                       inode->i_ino, (unsigned long)inode->i_nlink,
+                CDEBUG(D_INODE, "found wrong generation: inode %lu, link: %lu, "
+                       "count: %d, generation %u/%u\n", inode->i_ino,
+                       (unsigned long)inode->i_nlink,
                        atomic_read(&inode->i_count), inode->i_generation,
                        generation);
                 dput(result);
@@ -662,11 +676,12 @@ static int mds_getattr_name(int offset, struct ptlrpc_request *req,
                             struct lustre_handle *child_lockh)
 {
         struct obd_device *obd = req->rq_export->exp_obd;
+        struct mds_obd *mds = &obd->u.mds;
         struct ldlm_reply *rep = NULL;
         struct lvfs_run_ctxt saved;
         struct mds_body *body;
         struct dentry *dparent = NULL, *dchild = NULL;
-        struct lvfs_ucred uc;
+        struct lvfs_ucred uc = {NULL,};
         struct lustre_handle parent_lockh;
         int namesize;
         int rc = 0, cleanup_phase = 0, resent_req = 0;
@@ -681,16 +696,20 @@ static int mds_getattr_name(int offset, struct ptlrpc_request *req,
                                   lustre_swab_mds_body);
         if (body == NULL) {
                 CERROR("Can't swab mds_body\n");
-                GOTO(cleanup, rc = -EFAULT);
+                RETURN(-EFAULT);
         }
 
         LASSERT_REQSWAB(req, offset + 1);
         name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0);
         if (name == NULL) {
                 CERROR("Can't unpack name\n");
-                GOTO(cleanup, rc = -EFAULT);
+                RETURN(-EFAULT);
         }
-        namesize = req->rq_reqmsg->buflens[offset + 1];
+        namesize = lustre_msg_buflen(req->rq_reqmsg, offset + 1);
+
+        rc = mds_init_ucred(&uc, req, offset);
+        if (rc)
+                GOTO(cleanup, rc);
 
         LASSERT (offset == 0 || offset == 2);
         /* if requests were at offset 2, the getattr reply goes back at 1 */
@@ -699,15 +718,6 @@ static int mds_getattr_name(int offset, struct ptlrpc_request *req,
                 offset = 1;
         }
 
-#if CRAY_PORTALS
-        uc.luc_fsuid = req->rq_uid;
-#else
-        uc.luc_fsuid = body->fsuid;
-#endif
-        uc.luc_fsgid = body->fsgid;
-        uc.luc_cap = body->capability;
-        uc.luc_suppgid1 = body->suppgid;
-        uc.luc_suppgid2 = -1;
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, &uc);
         cleanup_phase = 1; /* kernel context */
         intent_set_disposition(rep, DISP_LOOKUP_EXECD);
@@ -800,7 +810,12 @@ static int mds_getattr_name(int offset, struct ptlrpc_request *req,
                 l_dput(dchild);
         case 1:
                 pop_ctxt(&saved, &obd->obd_lvfs_ctxt, &uc);
-        default: ;
+        default:
+                mds_exit_ucred(&uc, mds);
+                if (req->rq_reply_state == NULL) {
+                        req->rq_status = rc;
+                        lustre_pack_reply(req, 0, NULL, NULL);
+                }
         }
         return rc;
 }
@@ -812,7 +827,7 @@ static int mds_getattr(int offset, struct ptlrpc_request *req)
         struct lvfs_run_ctxt saved;
         struct dentry *de;
         struct mds_body *body;
-        struct lvfs_ucred uc;
+        struct lvfs_ucred uc = {NULL,};
         int rc = 0;
         ENTRY;
 
@@ -823,13 +838,10 @@ static int mds_getattr(int offset, struct ptlrpc_request *req)
                 RETURN(-EFAULT);
         }
 
-#if CRAY_PORTALS
-        uc.luc_fsuid = req->rq_uid;
-#else
-        uc.luc_fsuid = body->fsuid;
-#endif
-        uc.luc_fsgid = body->fsgid;
-        uc.luc_cap = body->capability;
+        rc = mds_init_ucred(&uc, req, offset);
+        if (rc)
+                GOTO(out_ucred, rc);
+
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, &uc);
         de = mds_fid2dentry(mds, &body->fid1, NULL);
         if (IS_ERR(de)) {
@@ -849,6 +861,12 @@ static int mds_getattr(int offset, struct ptlrpc_request *req)
         GOTO(out_pop, rc);
 out_pop:
         pop_ctxt(&saved, &obd->obd_lvfs_ctxt, &uc);
+out_ucred:
+        if (req->rq_reply_state == NULL) {
+                req->rq_status = rc;
+                lustre_pack_reply(req, 0, NULL, NULL);
+        }
+        mds_exit_ucred(&uc, mds);
         return rc;
 }
 
@@ -951,13 +969,14 @@ out:
 static int mds_readpage(struct ptlrpc_request *req)
 {
         struct obd_device *obd = req->rq_export->exp_obd;
+        struct mds_obd *mds = &obd->u.mds;
         struct vfsmount *mnt;
         struct dentry *de;
         struct file *file;
         struct mds_body *body, *repbody;
         struct lvfs_run_ctxt saved;
         int rc, size = sizeof(*repbody);
-        struct lvfs_ucred uc;
+        struct lvfs_ucred uc = {NULL,};
         ENTRY;
 
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_READPAGE_PACK))
@@ -965,21 +984,18 @@ static int mds_readpage(struct ptlrpc_request *req)
 
         rc = lustre_pack_reply(req, 1, &size, NULL);
         if (rc) {
-                CERROR("mds: out of memory while packing readpage reply\n");
-                RETURN(-ENOMEM);
+                CERROR("error packing readpage reply: rc %d\n", rc);
+                GOTO(out, rc);
         }
 
         body = lustre_swab_reqbuf(req, 0, sizeof(*body), lustre_swab_mds_body);
         if (body == NULL)
                 GOTO (out, rc = -EFAULT);
 
-#if CRAY_PORTALS
-        uc.luc_fsuid = req->rq_uid;
-#else
-        uc.luc_fsuid = body->fsuid;
-#endif
-        uc.luc_fsgid = body->fsgid;
-        uc.luc_cap = body->capability;
+        rc = mds_init_ucred(&uc, req, 0);
+        if (rc)
+                GOTO(out, rc);
+
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, &uc);
         de = mds_fid2dentry(&obd->u.mds, &body->fid1, &mnt);
         if (IS_ERR(de))
@@ -1021,6 +1037,7 @@ out_file:
 out_pop:
         pop_ctxt(&saved, &obd->obd_lvfs_ctxt, &uc);
 out:
+        mds_exit_ucred(&uc, mds);
         req->rq_status = rc;
         RETURN(0);
 }
@@ -1040,6 +1057,7 @@ int mds_reint(struct ptlrpc_request *req, int offset,
                 CERROR("invalid record\n");
                 GOTO(out, req->rq_status = -EINVAL);
         }
+
         /* rc will be used to interrupt a for loop over multiple records */
         rc = mds_reint_rec(rec, offset, req, lockh);
  out:
@@ -1139,8 +1157,8 @@ int mds_handle(struct ptlrpc_request *req)
                 int recovering, abort_recovery;
 
                 if (req->rq_export == NULL) {
-                        CERROR("lustre_mds: operation %d on unconnected MDS\n",
-                               req->rq_reqmsg->opc);
+                        CERROR("operation %d on unconnected MDS\n",
+                               req->rq_reqmsg->opc);              
                         req->rq_status = -ENOTCONN;
                         GOTO(out, rc = -ENOTCONN);
                 }
@@ -1444,7 +1462,12 @@ int mds_update_server_data(struct obd_device *obd, int force_sync)
 }
 
 
-/* mount the file system (secretly) */
+/* mount the file system (secretly).  lustre_cfg parameters are:
+ * 1 = device
+ * 2 = fstype
+ * 3 = flags: failover=f, failout=n, ignored for an MDS
+ * 4 = mount options
+ */
 static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
 {
         struct lprocfs_static_vars lvars;
@@ -1484,9 +1507,10 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
                 options = (char *)page;
                 memset(options, 0, PAGE_SIZE);
 
-                /* here we use "iopen_nopriv" hardcoded, because it affects MDS utility
-                 * and the rest of options are passed by mount options. Probably this
-                 * should be moved to somewhere else like startup scripts or lconf. */
+                /* here we use "iopen_nopriv" hardcoded, because it affects
+                 * MDS utility and the rest of options are passed by mount
+                 * options. Probably this should be moved to somewhere else
+                 * like startup scripts or lconf. */
                 sprintf(options, "iopen_nopriv");
 
                 if (LUSTRE_CFG_BUFLEN(lcfg, 4) > 0 && lustre_cfg_buf(lcfg, 4))
@@ -1498,7 +1522,8 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
                 free_page(page);
                 if (IS_ERR(mnt)) {
                         rc = PTR_ERR(mnt);
-                        CERROR("do_kern_mount failed: rc = %d\n", rc);
+                        LCONSOLE_ERROR("Can't mount disk %s (%d)\n",
+                                       lustre_cfg_string(lcfg, 1), rc);
                         GOTO(err_ops, rc);
                 }
         }
@@ -1551,6 +1576,13 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
                            "mds_ldlm_client", &obd->obd_ldlm_client);
         obd->obd_replayable = 1;
 
+        mds->mds_group_hash = upcall_cache_init(obd->obd_name);
+        if (IS_ERR(mds->mds_group_hash)) {
+                rc = PTR_ERR(mds->mds_group_hash);
+                mds->mds_group_hash = NULL;
+                GOTO(err_fs, rc);
+        }
+
         mds_quota_setup(mds);
 
         rc = mds_postsetup(obd);
@@ -1582,7 +1614,7 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
                               obd->obd_replayable ? "enabled" : "disabled");
         }
 
-        ldlm_timeout = 6;
+        ldlm_timeout = 2;
         ping_evictor_start();
 
         RETURN(0);
@@ -1590,6 +1622,8 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
 err_fs:
         /* No extra cleanup needed for llog_init_commit_thread() */
         mds_fs_cleanup(obd);
+        upcall_cache_cleanup(mds->mds_group_hash);
+        mds->mds_group_hash = NULL;
 err_ns:
         ldlm_namespace_free(obd->obd_namespace, 0);
         obd->obd_namespace = NULL;
@@ -1627,7 +1661,7 @@ static int mds_postsetup(struct obd_device *obd)
                 cfg.cfg_instance = NULL;
                 cfg.cfg_uuid = mds->mds_lov_uuid;
                 push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
-                rc = class_config_parse_llog(llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT), 
+                rc = class_config_parse_llog(llog_get_context(obd, LLOG_CONFIG_ORIG_CTXT),
                                              mds->mds_profile, &cfg);
                 pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                 switch (rc) {
@@ -1687,7 +1721,7 @@ int mds_postrecov(struct obd_device *obd)
         }
 
         /* clean PENDING dir */
-        rc = mds_cleanup_orphans(obd);
+        rc = mds_cleanup_pending(obd);
         if (rc < 0) {
                 GOTO(out, rc);
         } else {
@@ -1807,6 +1841,9 @@ static int mds_cleanup(struct obd_device *obd)
         }
         mds_fs_cleanup(obd);
 
+        upcall_cache_cleanup(mds->mds_group_hash);
+        mds->mds_group_hash = NULL;
+
         /* 2 seems normal on mds, (may_umount() also expects 2
           fwiw), but we only see 1 at this point in obdfilter. */
         if (atomic_read(&obd->u.mds.mds_vfsmnt->mnt_count) > 2)
@@ -2068,51 +2105,53 @@ static int mdt_setup(struct obd_device *obd, obd_count len, void *buf)
         lprocfs_init_vars(mdt, &lvars);
         lprocfs_obd_setup(obd, lvars.obd_vars);
 
+        sema_init(&mds->mds_health_sem, 1);
+
         mds->mds_service =
                 ptlrpc_init_svc(MDS_NBUFS, MDS_BUFSIZE, MDS_MAXREQSIZE,
-                                MDS_REQUEST_PORTAL, MDC_REPLY_PORTAL,
-                                MDS_SERVICE_WATCHDOG_TIMEOUT,
-                                mds_handle, "mds", obd->obd_proc_entry, NULL);
+                                MDS_MAXREPSIZE, MDS_REQUEST_PORTAL,
+                                MDC_REPLY_PORTAL, MDS_SERVICE_WATCHDOG_TIMEOUT,
+                                mds_handle, "mds", obd->obd_proc_entry, NULL,
+                                MDT_NUM_THREADS);
 
         if (!mds->mds_service) {
                 CERROR("failed to start service\n");
                 GOTO(err_lprocfs, rc = -ENOMEM);
         }
 
-        rc = ptlrpc_start_n_threads(obd, mds->mds_service, MDT_NUM_THREADS,
-                                    "ll_mdt");
+        rc = ptlrpc_start_threads(obd, mds->mds_service, "ll_mdt");
         if (rc)
                 GOTO(err_thread, rc);
 
         mds->mds_setattr_service =
                 ptlrpc_init_svc(MDS_NBUFS, MDS_BUFSIZE, MDS_MAXREQSIZE,
-                                MDS_SETATTR_PORTAL, MDC_REPLY_PORTAL,
-                                MDS_SERVICE_WATCHDOG_TIMEOUT,
+                                MDS_MAXREPSIZE, MDS_SETATTR_PORTAL,
+                                MDC_REPLY_PORTAL, MDS_SERVICE_WATCHDOG_TIMEOUT,
                                 mds_handle, "mds_setattr",
-                                obd->obd_proc_entry, NULL);
+                                obd->obd_proc_entry, NULL, MDT_NUM_THREADS);
         if (!mds->mds_setattr_service) {
                 CERROR("failed to start getattr service\n");
                 GOTO(err_thread, rc = -ENOMEM);
         }
 
-        rc = ptlrpc_start_n_threads(obd, mds->mds_setattr_service,
-                                    MDT_NUM_THREADS, "ll_mdt_attr");
+        rc = ptlrpc_start_threads(obd, mds->mds_setattr_service,
+                                  "ll_mdt_attr");
         if (rc)
                 GOTO(err_thread2, rc);
 
         mds->mds_readpage_service =
                 ptlrpc_init_svc(MDS_NBUFS, MDS_BUFSIZE, MDS_MAXREQSIZE,
-                                MDS_READPAGE_PORTAL, MDC_REPLY_PORTAL,
-                                MDS_SERVICE_WATCHDOG_TIMEOUT,
+                                MDS_MAXREPSIZE, MDS_READPAGE_PORTAL,
+                                MDC_REPLY_PORTAL, MDS_SERVICE_WATCHDOG_TIMEOUT,
                                 mds_handle, "mds_readpage",
-                                obd->obd_proc_entry, NULL);
+                                obd->obd_proc_entry, NULL, MDT_NUM_THREADS);
         if (!mds->mds_readpage_service) {
                 CERROR("failed to start readpage service\n");
                 GOTO(err_thread2, rc = -ENOMEM);
         }
 
-        rc = ptlrpc_start_n_threads(obd, mds->mds_readpage_service,
-                                    MDT_NUM_THREADS, "ll_mdt_rdpg");
+        rc = ptlrpc_start_threads(obd, mds->mds_readpage_service,
+                                  "ll_mdt_rdpg");
 
         if (rc)
                 GOTO(err_thread3, rc);
@@ -2121,10 +2160,13 @@ static int mdt_setup(struct obd_device *obd, obd_count len, void *buf)
 
 err_thread3:
         ptlrpc_unregister_service(mds->mds_readpage_service);
+        mds->mds_readpage_service = NULL;
 err_thread2:
         ptlrpc_unregister_service(mds->mds_setattr_service);
+        mds->mds_setattr_service = NULL;
 err_thread:
         ptlrpc_unregister_service(mds->mds_service);
+        mds->mds_service = NULL;
 err_lprocfs:
         lprocfs_obd_cleanup(obd);
         return rc;
@@ -2135,15 +2177,42 @@ static int mdt_cleanup(struct obd_device *obd)
         struct mds_obd *mds = &obd->u.mds;
         ENTRY;
 
+        down(&mds->mds_health_sem);
         ptlrpc_unregister_service(mds->mds_readpage_service);
         ptlrpc_unregister_service(mds->mds_setattr_service);
         ptlrpc_unregister_service(mds->mds_service);
+        mds->mds_readpage_service = NULL;
+        mds->mds_setattr_service = NULL;
+        mds->mds_service = NULL;
+        up(&mds->mds_health_sem);
 
         lprocfs_obd_cleanup(obd);
 
         RETURN(0);
 }
 
+static int mdt_health_check(struct obd_device *obd)
+{
+        struct mds_obd *mds = &obd->u.mds;
+        int rc = 0;
+        
+        down(&mds->mds_health_sem);
+        rc |= ptlrpc_service_health_check(mds->mds_readpage_service);
+        rc |= ptlrpc_service_health_check(mds->mds_setattr_service);
+        rc |= ptlrpc_service_health_check(mds->mds_service);
+        up(&mds->mds_health_sem);
+
+        /*
+         * health_check to return 0 on healthy
+         * and 1 on unhealthy.
+         */
+        if(rc != 0)
+                rc = 1;
+        
+        return rc;
+}
+
+
 static struct dentry *mds_lvfs_fid2dentry(__u64 id, __u32 gen, __u64 gr,
                                           void *data)
 {
@@ -2182,6 +2251,7 @@ static struct obd_ops mdt_obd_ops = {
         .o_owner           = THIS_MODULE,
         .o_setup           = mdt_setup,
         .o_cleanup         = mdt_cleanup,
+        .o_health_check    = mdt_health_check,        
 };
 
 static int __init mds_init(void)
index fe5d6f5..1964bc2 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 #define DEBUG_SUBSYSTEM S_CLASS
@@ -28,7 +31,6 @@
 #include <linux/obd.h>
 #include <linux/obd_class.h>
 #include <linux/lprocfs_status.h>
-
 #include "mds_internal.h"
 
 #ifdef LPROCFS
@@ -44,25 +46,211 @@ static int lprocfs_mds_rd_mntdev(char *page, char **start, off_t off, int count,
         return snprintf(page, count, "%s\n",obd->u.mds.mds_vfsmnt->mnt_devname);
 }
 
+static int lprocfs_mds_wr_evict_client(struct file *file, const char *buffer,
+                                       unsigned long count, void *data)
+{
+        struct obd_device *obd = data;
+        struct mds_obd *mds = &obd->u.mds;
+        char tmpbuf[sizeof(struct obd_uuid)];
+        int rc;
+
+        sscanf(buffer, "%40s", tmpbuf);
+
+        if (strncmp(tmpbuf, "nid:", 4) != 0)
+                return lprocfs_wr_evict_client(file, buffer, count, data);
+
+        obd_export_evict_by_nid(obd, tmpbuf+4);
+
+        rc = obd_set_info(mds->mds_osc_exp, strlen("evict_by_nid"),
+                          "evict_by_nid", strlen(tmpbuf + 4) + 1, tmpbuf + 4);
+        if (rc)
+                CERROR("Failed to evict nid %s from OSTs: rc %d\n", tmpbuf + 4,
+                       rc);
+
+        return count;
+}
+
+static int lprocfs_wr_group_info(struct file *file, const char *buffer,
+                                 unsigned long count, void *data)
+{
+        struct obd_device *obd = data;
+        struct mds_obd *mds = &obd->u.mds;
+        struct mds_grp_downcall_data sparam, *param = &sparam;
+        int size = 0, rc = count;
+
+        if (count < sizeof(param)) {
+                CERROR("%s: invalid data size %lu\n", obd->obd_name, count);
+                return count;
+        }
+
+        if (copy_from_user(param, buffer, sizeof(*param)) ||
+            param->mgd_magic != MDS_GRP_DOWNCALL_MAGIC) {
+                CERROR("%s: MDS group downcall bad params\n", obd->obd_name);
+                return count;
+        }
+
+        if (param->mgd_ngroups > NGROUPS_MAX) {
+                CWARN("%s: uid %u groups %d more than maximum %d\n",
+                      obd->obd_name, param->mgd_uid, param->mgd_ngroups,
+                      NGROUPS_MAX);
+                param->mgd_ngroups = NGROUPS_MAX;
+        }
+
+        if (param->mgd_ngroups > 0) {
+                size = offsetof(struct mds_grp_downcall_data,
+                                mgd_groups[param->mgd_ngroups]);
+                OBD_ALLOC(param, size);
+                if (!param) {
+                        CERROR("%s: fail to alloc %d bytes for uid %u"
+                               " with %d groups\n", obd->obd_name, size,
+                               sparam.mgd_uid, sparam.mgd_ngroups);
+                        param = &sparam;
+                        param->mgd_ngroups = 0;
+                } else if (copy_from_user(param, buffer, size)) {
+                        CERROR("%s: uid %u bad supplementary group data\n",
+                               obd->obd_name, sparam.mgd_uid);
+                        OBD_FREE(param, size);
+                        param = &sparam;
+                        param->mgd_ngroups = 0;
+                }
+        }
+        rc = upcall_cache_downcall(mds->mds_group_hash, param->mgd_err,
+                                   param->mgd_uid, param->mgd_gid,
+                                   param->mgd_ngroups, param->mgd_groups);
+
+        if (param && param != &sparam)
+                OBD_FREE(param, size);
+
+        return rc;
+}
+
+static int lprocfs_rd_group_expire(char *page, char **start, off_t off,
+                                   int count, int *eof, void *data)
+{
+        struct obd_device *obd = data;
+
+        *eof = 1;
+        return snprintf(page, count, "%lu\n",
+                        obd->u.mds.mds_group_hash->uc_entry_expire / HZ);
+}
+
+static int lprocfs_wr_group_expire(struct file *file, const char *buffer,
+                                   unsigned long count, void *data)
+{
+        struct obd_device *obd = data;
+        int val, rc;
+
+        rc = lprocfs_write_helper(buffer, count, &val);
+        if (rc)
+                return rc;
+
+        if (val > 5)
+                obd->u.mds.mds_group_hash->uc_entry_expire = val * HZ;
+        else
+                CERROR("invalid expire time %u for group cache\n", val);
+
+        return count;
+}
+
+static int lprocfs_rd_group_acquire_expire(char *page, char **start, off_t off,
+                                           int count, int *eof, void *data)
+{
+        struct obd_device *obd = data;
+
+        *eof = 1;
+        return snprintf(page, count, "%lu\n",
+                        obd->u.mds.mds_group_hash->uc_acquire_expire / HZ);
+}
+
+static int lprocfs_wr_group_acquire_expire(struct file *file,const char *buffer,
+                                           unsigned long count, void *data)
+{
+        struct obd_device *obd = data;
+        int val, rc = 0;
+
+        rc = lprocfs_write_helper(buffer, count, &val);
+        if (rc)
+                return rc;
+
+        if (val > 2)
+                obd->u.mds.mds_group_hash->uc_acquire_expire = val * HZ;
+
+        return count;
+}
+
+static int lprocfs_rd_group_upcall(char *page, char **start, off_t off,
+                                   int count, int *eof, void *data)
+{
+        struct obd_device *obd = data;
+
+        *eof = 1;
+        return snprintf(page, count, "%s\n",
+                        obd->u.mds.mds_group_hash->uc_upcall);
+}
+
+static int lprocfs_wr_group_upcall(struct file *file, const char *buffer,
+                                   unsigned long count, void *data)
+{
+        struct obd_device *obd = data;
+        struct upcall_cache *hash = obd->u.mds.mds_group_hash;
+        char kernbuf[UC_CACHE_UPCALL_MAXPATH] = { '\0' };
+
+        if (count >= UC_CACHE_UPCALL_MAXPATH) {
+                CERROR("%s: group upcall too long\n", obd->obd_name);
+                return -EINVAL;
+        }
+
+        if (copy_from_user(kernbuf, buffer,
+                           min(count, UC_CACHE_UPCALL_MAXPATH - 1)))
+                return -EFAULT;
+
+        /* Remove any extraneous bits from the upcall (e.g. linefeeds) */
+        sscanf(kernbuf, "%s", hash->uc_upcall);
+
+        if (strcmp(hash->uc_name, obd->obd_name) != 0)
+                CWARN("%s: write to upcall name %s for MDS %s\n",
+                      obd->obd_name, hash->uc_upcall, obd->obd_name);
+        CWARN("%s: group upcall set to %s\n", obd->obd_name, hash->uc_upcall);
+
+        return count;
+}
+
+static int lprocfs_wr_group_flush(struct file *file, const char *buffer,
+                                  unsigned long count, void *data)
+{
+        struct obd_device *obd = data;
+
+        upcall_cache_flush_idle(obd->u.mds.mds_group_hash);
+        return count;
+}
+
 struct lprocfs_vars lprocfs_mds_obd_vars[] = {
-        { "uuid",         lprocfs_rd_uuid,        0, 0 },
-        { "blocksize",    lprocfs_rd_blksize,     0, 0 },
-        { "kbytestotal",  lprocfs_rd_kbytestotal, 0, 0 },
-        { "kbytesfree",   lprocfs_rd_kbytesfree,  0, 0 },
-        { "kbytesavail",  lprocfs_rd_kbytesavail, 0, 0 },
-        { "filestotal",   lprocfs_rd_filestotal,  0, 0 },
-        { "filesfree",    lprocfs_rd_filesfree,   0, 0 },
-        { "fstype",       lprocfs_rd_fstype,      0, 0 },
-        { "mntdev",       lprocfs_mds_rd_mntdev,  0, 0 },
+        { "uuid",            lprocfs_rd_uuid,        0, 0 },
+        { "blocksize",       lprocfs_rd_blksize,     0, 0 },
+        { "kbytestotal",     lprocfs_rd_kbytestotal, 0, 0 },
+        { "kbytesfree",      lprocfs_rd_kbytesfree,  0, 0 },
+        { "kbytesavail",     lprocfs_rd_kbytesavail, 0, 0 },
+        { "filestotal",      lprocfs_rd_filestotal,  0, 0 },
+        { "filesfree",       lprocfs_rd_filesfree,   0, 0 },
+        { "fstype",          lprocfs_rd_fstype,      0, 0 },
+        { "mntdev",          lprocfs_mds_rd_mntdev,  0, 0 },
         { "recovery_status", lprocfs_obd_rd_recovery_status, 0, 0 },
-        { "evict_client", 0, lprocfs_wr_evict_client, 0 },
-        { "num_exports",  lprocfs_rd_num_exports, 0, 0 },
+        { "evict_client",    0,                lprocfs_mds_wr_evict_client, 0 },
+        { "num_exports",     lprocfs_rd_num_exports, 0, 0 },
 #ifdef HAVE_QUOTA_SUPPORT
-        { "quota_bunit_sz", lprocfs_mds_rd_bunit, lprocfs_mds_wr_bunit, 0 },
-        { "quota_btune_sz", lprocfs_mds_rd_btune, lprocfs_mds_wr_btune, 0 },
-        { "quota_iunit_sz", lprocfs_mds_rd_iunit, lprocfs_mds_wr_iunit, 0 },
-        { "quota_itune_sz", lprocfs_mds_rd_itune, lprocfs_mds_wr_itune, 0 },
+        { "quota_bunit_sz",  lprocfs_mds_rd_bunit, lprocfs_mds_wr_bunit, 0 },
+        { "quota_btune_sz",  lprocfs_mds_rd_btune, lprocfs_mds_wr_btune, 0 },
+        { "quota_iunit_sz",  lprocfs_mds_rd_iunit, lprocfs_mds_wr_iunit, 0 },
+        { "quota_itune_sz",  lprocfs_mds_rd_itune, lprocfs_mds_wr_itune, 0 },
 #endif
+        { "group_expire_interval", lprocfs_rd_group_expire,
+                             lprocfs_wr_group_expire, 0},
+        { "group_acquire_expire", lprocfs_rd_group_acquire_expire,
+                             lprocfs_wr_group_acquire_expire, 0},
+        { "group_upcall",    lprocfs_rd_group_upcall,
+                             lprocfs_wr_group_upcall, 0},
+        { "group_flush", 0,  lprocfs_wr_group_flush, 0},
+        { "group_info", 0,   lprocfs_wr_group_info, 0 },
         { 0 }
 };
 
index cd9b135..4c69049 100644 (file)
@@ -7,20 +7,23 @@
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -46,7 +49,8 @@
 
 #include "mds_internal.h"
 
-/* This limit is arbitrary, but for now we fit it in 1 page (32k clients) */
+/* This limit is arbitrary (32k clients on x86), but it is convenient to use
+ * 2^n * PAGE_SIZE * 8 for the number of bits that fit an order-n allocation. */
 #define MDS_MAX_CLIENTS (PAGE_SIZE * 8)
 
 #define LAST_RCVD "last_rcvd"
@@ -185,8 +189,14 @@ int mds_client_free(struct obd_export *exp)
                 LBUG();
         }
 
+
+        /* Make sure the server's last_transno is up to date. Do this
+         * after the client is freed so we know all the client's
+         * transactions have been committed. */
+        mds_update_server_data(exp->exp_obd, 0);
+
         EXIT;
-free:
+ free:
         OBD_FREE(med->med_mcd, sizeof(*med->med_mcd));
         med->med_mcd = NULL;
 
@@ -606,14 +616,13 @@ int mds_obd_create(struct obd_export *exp, struct obdo *oa,
         struct lvfs_run_ctxt saved;
         char fidname[LL_FID_NAMELEN];
         void *handle;
-        struct lvfs_ucred ucred;
+        struct lvfs_ucred ucred = { 0 };
         int rc = 0, err, namelen;
         ENTRY;
 
         /* the owner of object file should always be root */
-        memset(&ucred, 0, sizeof(ucred));
         ucred.luc_cap = current->cap_effective | CAP_SYS_RESOURCE;
-        
+
         push_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, &ucred);
 
         sprintf(fidname, "OBJECTS/%u.%u", tmpname, current->pid);
@@ -689,14 +698,13 @@ int mds_obd_destroy(struct obd_export *exp, struct obdo *oa,
         struct inode *parent_inode = mds->mds_objects_dir->d_inode;
         struct obd_device *obd = exp->exp_obd;
         struct lvfs_run_ctxt saved;
-        struct lvfs_ucred ucred;
+        struct lvfs_ucred ucred = { 0 };
         char fidname[LL_FID_NAMELEN];
         struct dentry *de;
         void *handle;
         int err, namelen, rc = 0;
         ENTRY;
-        
-        memset(&ucred, 0, sizeof(ucred));
+
         ucred.luc_cap = current->cap_effective | CAP_SYS_RESOURCE;
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, &ucred);
 
@@ -724,7 +732,7 @@ int mds_obd_destroy(struct obd_export *exp, struct obdo *oa,
 
         if (IS_ERR(handle))
                 GOTO(out_dput, rc = PTR_ERR(handle));
-        
+
         rc = vfs_unlink(mds->mds_objects_dir->d_inode, de);
         if (rc)
                 CERROR("error destroying object "LPU64":%u: rc %d\n",
index 9d99a66..84ad473 100644 (file)
@@ -125,9 +125,12 @@ int mds_osc_setattr_async(struct obd_device *obd, struct inode *inode,
 /* mds/mds_lib.c */
 int mds_update_unpack(struct ptlrpc_request *, int offset,
                       struct mds_update_record *);
+int mds_init_ucred(struct lvfs_ucred *ucred, struct ptlrpc_request *req,
+                   int offset);
+void mds_exit_ucred(struct lvfs_ucred *ucred, struct mds_obd *obd);
 
 /* mds/mds_unlink_open.c */
-int mds_cleanup_orphans(struct obd_device *obd);
+int mds_cleanup_pending(struct obd_device *obd);
 
 
 /* mds/mds_log.c */
@@ -195,8 +198,8 @@ void mds_pack_inode2body(struct mds_body *body, struct inode *inode);
 int lustre_dquot_init(void);
 void lustre_dquot_exit(void);
 int dqacq_handler(struct obd_device *obd, struct qunit_data *qdata, int opc);
-void mds_adjust_qunit(struct obd_device *obd, uid_t cuid, gid_t cgid, 
-                      uid_t puid, gid_t pgid, int rc);
+void mds_adjust_qunit(struct obd_device *obd, uid_t cuid, gid_t cgid,
+                     uid_t puid, gid_t pgid, int rc);
 int init_admin_quotafiles(struct obd_device *obd, struct obd_quotactl *oqctl);
 int mds_quota_on(struct obd_device *obd, struct obd_quotactl *oqctl);
 int mds_quota_off(struct obd_device *obd, struct obd_quotactl *oqctl);
@@ -207,24 +210,24 @@ int mds_get_dqblk(struct obd_device *obd, struct obd_quotactl *oqctl);
 #else
 static inline int lustre_dquot_init(void) { return 0; }
 static inline void lustre_dquot_exit(void) { return; }
-static inline int dqacq_handler(struct obd_device *obd, 
+static inline int dqacq_handler(struct obd_device *obd,
                                 struct qunit_data *qdata, int opc) {return 0;}
-static inline void mds_adjust_qunit(struct obd_device *obd, uid_t cuid, 
-                                    gid_t cgid, uid_t puid, 
+static inline void mds_adjust_qunit(struct obd_device *obd, uid_t cuid,
+                                    gid_t cgid, uid_t puid,
                                     gid_t pgid, int rc) { return; }
-static inline int init_admin_quotafiles(struct obd_device *obd, 
+static inline int init_admin_quotafiles(struct obd_device *obd,
                                         struct obd_quotactl *oqctl) {return 0;}
-static inline int mds_quota_on(struct obd_device *obd, 
+static inline int mds_quota_on(struct obd_device *obd,
                                struct obd_quotactl *oqctl) { return 0; }
-static inline int mds_quota_off(struct obd_device *obd, 
+static inline int mds_quota_off(struct obd_device *obd,
                                 struct obd_quotactl *oqctl) { return 0; }
-static inline int mds_set_dqinfo(struct obd_device *obd, 
+static inline int mds_set_dqinfo(struct obd_device *obd,
                                  struct obd_quotactl *oqctl) { return 0; }
-static inline int mds_get_dqinfo(struct obd_device *obd, 
+static inline int mds_get_dqinfo(struct obd_device *obd,
                                  struct obd_quotactl *oqctl) { return 0; }
-static inline int mds_set_dqblk(struct obd_device *obd, 
+static inline int mds_set_dqblk(struct obd_device *obd,
                                 struct obd_quotactl *oqctl) { return 0; }
-static inline int mds_get_dqblk(struct obd_device *obd, 
+static inline int mds_get_dqblk(struct obd_device *obd,
                                 struct obd_quotactl *oqctl) { return 0; }
 #endif /* KERNEL_VERSION(2,5,0) && QUOTA */
 
index 57dfb38..2047fdb 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_MDS
@@ -98,11 +101,11 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset,
         if (rec == NULL)
                 RETURN (-EFAULT);
 
-        r->ur_fsuid = rec->sa_fsuid;
-        r->ur_fsgid = rec->sa_fsgid;
-        r->ur_cap = rec->sa_cap;
-        r->ur_suppgid1 = rec->sa_suppgid;
-        r->ur_suppgid2 = -1;
+        r->ur_uc.luc_fsuid = rec->sa_fsuid;
+        r->ur_uc.luc_fsgid = rec->sa_fsgid;
+        r->ur_uc.luc_cap = rec->sa_cap;
+        r->ur_uc.luc_suppgid1 = rec->sa_suppgid;
+        r->ur_uc.luc_suppgid2 = -1;
         r->ur_fid1 = &rec->sa_fid;
         attr->ia_valid = rec->sa_valid;
         attr->ia_mode = rec->sa_mode;
@@ -145,17 +148,17 @@ static int mds_create_unpack(struct ptlrpc_request *req, int offset,
         if (rec == NULL)
                 RETURN (-EFAULT);
 
-        r->ur_fsuid = rec->cr_fsuid;
-        r->ur_fsgid = rec->cr_fsgid;
-        r->ur_cap = rec->cr_cap;
+        r->ur_uc.luc_fsuid = rec->cr_fsuid;
+        r->ur_uc.luc_fsgid = rec->cr_fsgid;
+        r->ur_uc.luc_cap = rec->cr_cap;
+        r->ur_uc.luc_suppgid1 = rec->cr_suppgid;
+        r->ur_uc.luc_suppgid2 = -1;
         r->ur_fid1 = &rec->cr_fid;
         r->ur_fid2 = &rec->cr_replayfid;
         r->ur_mode = rec->cr_mode;
         r->ur_rdev = rec->cr_rdev;
         r->ur_time = rec->cr_time;
         r->ur_flags = rec->cr_flags;
-        r->ur_suppgid1 = rec->cr_suppgid;
-        r->ur_suppgid2 = -1;
 
         LASSERT_REQSWAB (req, offset + 1);
         r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0);
@@ -191,11 +194,11 @@ static int mds_link_unpack(struct ptlrpc_request *req, int offset,
         if (rec == NULL)
                 RETURN (-EFAULT);
 
-        r->ur_fsuid = rec->lk_fsuid;
-        r->ur_fsgid = rec->lk_fsgid;
-        r->ur_cap = rec->lk_cap;
-        r->ur_suppgid1 = rec->lk_suppgid1;
-        r->ur_suppgid2 = rec->lk_suppgid2;
+        r->ur_uc.luc_fsuid = rec->lk_fsuid;
+        r->ur_uc.luc_fsgid = rec->lk_fsgid;
+        r->ur_uc.luc_cap = rec->lk_cap;
+        r->ur_uc.luc_suppgid1 = rec->lk_suppgid1;
+        r->ur_uc.luc_suppgid2 = rec->lk_suppgid2;
         r->ur_fid1 = &rec->lk_fid1;
         r->ur_fid2 = &rec->lk_fid2;
         r->ur_time = rec->lk_time;
@@ -219,12 +222,12 @@ static int mds_unlink_unpack(struct ptlrpc_request *req, int offset,
         if (rec == NULL)
                 RETURN(-EFAULT);
 
-        r->ur_fsuid = rec->ul_fsuid;
-        r->ur_fsgid = rec->ul_fsgid;
-        r->ur_cap = rec->ul_cap;
+        r->ur_uc.luc_fsuid = rec->ul_fsuid;
+        r->ur_uc.luc_fsgid = rec->ul_fsgid;
+        r->ur_uc.luc_cap = rec->ul_cap;
+        r->ur_uc.luc_suppgid1 = rec->ul_suppgid;
+        r->ur_uc.luc_suppgid2 = -1;
         r->ur_mode = rec->ul_mode;
-        r->ur_suppgid1 = rec->ul_suppgid;
-        r->ur_suppgid2 = -1;
         r->ur_fid1 = &rec->ul_fid1;
         r->ur_fid2 = &rec->ul_fid2;
         r->ur_time = rec->ul_time;
@@ -248,11 +251,11 @@ static int mds_rename_unpack(struct ptlrpc_request *req, int offset,
         if (rec == NULL)
                 RETURN(-EFAULT);
 
-        r->ur_fsuid = rec->rn_fsuid;
-        r->ur_fsgid = rec->rn_fsgid;
-        r->ur_cap = rec->rn_cap;
-        r->ur_suppgid1 = rec->rn_suppgid1;
-        r->ur_suppgid2 = rec->rn_suppgid2;
+        r->ur_uc.luc_fsuid = rec->rn_fsuid;
+        r->ur_uc.luc_fsgid = rec->rn_fsgid;
+        r->ur_uc.luc_cap = rec->rn_cap;
+        r->ur_uc.luc_suppgid1 = rec->rn_suppgid1;
+        r->ur_uc.luc_suppgid2 = rec->rn_suppgid2;
         r->ur_fid1 = &rec->rn_fid1;
         r->ur_fid2 = &rec->rn_fid2;
         r->ur_time = rec->rn_time;
@@ -282,17 +285,17 @@ static int mds_open_unpack(struct ptlrpc_request *req, int offset,
         if (rec == NULL)
                 RETURN (-EFAULT);
 
-        r->ur_fsuid = rec->cr_fsuid;
-        r->ur_fsgid = rec->cr_fsgid;
-        r->ur_cap = rec->cr_cap;
+        r->ur_uc.luc_fsuid = rec->cr_fsuid;
+        r->ur_uc.luc_fsgid = rec->cr_fsgid;
+        r->ur_uc.luc_cap = rec->cr_cap;
+        r->ur_uc.luc_suppgid1 = rec->cr_suppgid;
+        r->ur_uc.luc_suppgid2 = -1;
         r->ur_fid1 = &rec->cr_fid;
         r->ur_fid2 = &rec->cr_replayfid;
         r->ur_mode = rec->cr_mode;
         r->ur_rdev = rec->cr_rdev;
         r->ur_time = rec->cr_time;
         r->ur_flags = rec->cr_flags;
-        r->ur_suppgid1 = rec->cr_suppgid;
-        r->ur_suppgid2 = -1;
 
         LASSERT_REQSWAB (req, offset + 1);
         r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0);
@@ -347,8 +350,47 @@ int mds_update_unpack(struct ptlrpc_request *req, int offset,
 
         rec->ur_opcode = opcode;
         rc = mds_unpackers[opcode](req, offset, rec);
-#if CRAY_PORTALS
-        rec->ur_fsuid = req->rq_uid;
-#endif
+
         RETURN(rc);
 }
+
+int mds_init_ucred(struct lvfs_ucred *ucred, struct ptlrpc_request *req,
+                   int offset)
+{
+        struct mds_body *body = lustre_msg_buf(req->rq_reqmsg, offset,
+                                               sizeof(*body));
+        struct mds_obd *mds = mds_req2mds(req);
+        int rc;
+
+        LASSERT(body != NULL); /* previously verified & swabbed by caller */
+
+#if CRAY_XT3
+        ucred->luc_fsuid = req->rq_uid;
+#else
+        ucred->luc_fsuid = body->fsuid;
+        ucred->luc_fsgid = body->fsgid;
+        ucred->luc_cap = body->capability;
+#endif
+
+        ucred->luc_uce = upcall_cache_get_entry(mds->mds_group_hash,
+                                                ucred->luc_fsuid,
+                                                ucred->luc_fsgid, 1,
+                                                &body->suppgid);
+        if (IS_ERR(ucred->luc_uce)) {
+                rc = PTR_ERR(ucred->luc_uce);
+                ucred->luc_uce = NULL;
+                return rc;
+        }
+
+#if CRAY_XT3
+        if (ucred->luc_uce)
+                ucred->luc_fsgid = ucred->luc_uce->ue_primary;
+#endif
+
+        return 0;
+}
+
+void mds_exit_ucred(struct lvfs_ucred *ucred, struct mds_obd *mds)
+{
+        upcall_cache_put_entry(mds->mds_group_hash, ucred->luc_uce);
+}
index cb1a91c..9f88e3e 100644 (file)
@@ -8,20 +8,23 @@
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_MDS
@@ -191,7 +194,7 @@ static struct llog_operations mds_ost_orig_logops = {
 };
 
 static struct llog_operations mds_size_repl_logops = {
-        lop_cancel:     mds_llog_repl_cancel
+        lop_cancel:     mds_llog_repl_cancel,
 };
 
 int mds_llog_init(struct obd_device *obd, struct obd_device *tgt,
index 6a5b8b0..9649dfa 100644 (file)
@@ -7,20 +7,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author: Peter Braam <braam@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
index 39cf431..4a4cdd0 100644 (file)
@@ -7,20 +7,23 @@
  *   Author: Phil Schwan <phil@clusterfs.com>
  *   Author: Mike Shaver <shaver@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -332,6 +335,7 @@ static int mds_create_objects(struct ptlrpc_request *req, int offset,
         if (*ids == NULL)
                 RETURN(-ENOMEM);
         oti.oti_objid = *ids;
+        oti.oti_thread = req->rq_svc_thread;
 
         /* replay case */
         if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
@@ -366,7 +370,6 @@ static int mds_create_objects(struct ptlrpc_request *req, int offset,
                 RETURN(0);
         }
 
-
         if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_MDS_ALLOC_OBDO))
                 GOTO(out_ids, rc = -ENOMEM);
 
@@ -960,11 +963,11 @@ int mds_open(struct mds_update_record *rec, int offset,
                 LTIME_S(iattr.ia_ctime) = rec->ur_time;
                 LTIME_S(iattr.ia_mtime) = rec->ur_time;
 
-                iattr.ia_uid = rec->ur_fsuid;
+                iattr.ia_uid = current->fsuid;  /* set by push_ctxt already */
                 if (dparent->d_inode->i_mode & S_ISGID)
                         iattr.ia_gid = dparent->d_inode->i_gid;
                 else
-                        iattr.ia_gid = rec->ur_fsgid;
+                        iattr.ia_gid = current->fsgid;
 
                 iattr.ia_valid = ATTR_UID | ATTR_GID | ATTR_ATIME |
                         ATTR_MTIME | ATTR_CTIME;
@@ -988,8 +991,9 @@ int mds_open(struct mds_update_record *rec, int offset,
 
 
         LASSERTF(!mds_inode_is_orphan(dchild->d_inode),
-                 "dchild %.*s (%p) inode %p\n", dchild->d_name.len,
-                 dchild->d_name.name, dchild, dchild->d_inode);
+                 "dchild %.*s (%p) inode %p/%lu/%u\n", dchild->d_name.len,
+                 dchild->d_name.name, dchild, dchild->d_inode,
+                 dchild->d_inode->i_ino, dchild->d_inode->i_generation);
 
         mds_pack_inode2fid(&body->fid1, dchild->d_inode);
         mds_pack_inode2body(body, dchild->d_inode);
@@ -1297,6 +1301,7 @@ int mds_close(struct ptlrpc_request *req)
         if (rc) {
                 CERROR("lustre_pack_reply: rc = %d\n", rc);
                 req->rq_status = rc;
+                /* Continue on to drop local open count even if we can't send the reply */
         } else {
                 MDS_CHECK_RESENT(req, mds_reconstruct_generic(req));
         }
index d163220..a3e76c7 100644 (file)
@@ -9,20 +9,23 @@
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -39,6 +42,7 @@
 #include <linux/lustre_mds.h>
 #include <linux/lustre_dlm.h>
 #include <linux/lustre_fsfilt.h>
+#include <linux/lustre_ucache.h>
 
 #include "mds_internal.h"
 
@@ -199,23 +203,24 @@ int mds_fix_attr(struct inode *inode, struct mds_update_record *rec)
         int error;
         ENTRY;
 
-        /* only fix up attrs if the client VFS didn't already */
-        if (!(ia_valid & ATTR_RAW))
-                RETURN(0);
+        if (ia_valid & ATTR_RAW)
+                attr->ia_valid &= ~ATTR_RAW;
 
         if (!(ia_valid & ATTR_CTIME_SET))
                 LTIME_S(attr->ia_ctime) = now;
+        else
+                attr->ia_valid &= ~ATTR_CTIME_SET;
         if (!(ia_valid & ATTR_ATIME_SET))
                 LTIME_S(attr->ia_atime) = now;
         if (!(ia_valid & ATTR_MTIME_SET))
                 LTIME_S(attr->ia_mtime) = now;
 
         if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
-                RETURN(-EPERM);
+                RETURN((attr->ia_valid & ~ATTR_ATTR_FLAG) ? -EPERM : 0);
 
         /* times */
         if ((ia_valid & (ATTR_MTIME|ATTR_ATIME)) == (ATTR_MTIME|ATTR_ATIME)) {
-                if (rec->ur_fsuid != inode->i_uid &&
+                if (rec->ur_uc.luc_fsuid != inode->i_uid &&
                     (error = ll_permission(inode, MAY_WRITE, NULL)) != 0)
                         RETURN(error);
         }
@@ -225,7 +230,7 @@ int mds_fix_attr(struct inode *inode, struct mds_update_record *rec)
                         RETURN(error);
         }
 
-        if (ia_valid & ATTR_UID) {
+        if (ia_valid & (ATTR_UID | ATTR_GID)) {
                 /* chown */
                 error = -EPERM;
                 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
@@ -234,7 +239,8 @@ int mds_fix_attr(struct inode *inode, struct mds_update_record *rec)
                         attr->ia_uid = inode->i_uid;
                 if (attr->ia_gid == (gid_t) -1)
                         attr->ia_gid = inode->i_gid;
-                attr->ia_mode = inode->i_mode;
+                if (!(ia_valid & ATTR_MODE))
+                        attr->ia_mode = inode->i_mode;
                 /*
                  * If the user or group of a non-directory has been
                  * changed by a non-root user, remove the setuid bit.
@@ -390,7 +396,7 @@ int mds_osc_setattr_async(struct obd_device *obd, struct inode *inode,
 
         rc = obd_unpackmd(mds->mds_osc_exp, &lsm, lmm, lmm_size);
         if (rc < 0) {
-                CERROR("Error unpack md %p\n", lmm);
+                CERROR("Error unpack md %p for inode %lu\n", lmm, inode->i_ino);
                 GOTO(out, rc);
         }
 
@@ -508,10 +514,10 @@ static int mds_reint_setattr(struct mds_update_record *rec, int offset,
         if (rc)
                 GOTO(cleanup, rc);
 
-        if (rec->ur_iattr.ia_valid & ATTR_ATTR_FLAG)    /* ioctl */
+        if (rec->ur_iattr.ia_valid & ATTR_ATTR_FLAG) {  /* ioctl */
                 rc = fsfilt_iocontrol(obd, inode, NULL, EXT3_IOC_SETFLAGS,
                                       (long)&rec->ur_iattr.ia_attr_flags);
-        else {                                            /* setattr */
+        } else if (rec->ur_iattr.ia_valid) {            /* setattr */
                 rc = fsfilt_setattr(obd, de, handle, &rec->ur_iattr, 0);
                 /* journal chown/chgrp in llog, just like unlink */
                 if (rc == 0 && S_ISREG(inode->i_mode) &&
@@ -539,9 +545,14 @@ static int mds_reint_setattr(struct mds_update_record *rec, int offset,
                         GOTO(cleanup, rc);
 
                 lum = rec->ur_eadata;
-                /* if lmm_stripe_size is -1 then delete stripe info from dir */
+                /* if { size, offset, count } = { 0, -1, 0 } (i.e. all default
+                 * values specified) then delete default striping from dir. */
                 if (S_ISDIR(inode->i_mode) &&
-                    lum->lmm_stripe_size == (typeof(lum->lmm_stripe_size))(-1)){
+                    ((lum->lmm_stripe_size == 0 &&
+                      lum->lmm_stripe_offset == (typeof(lum->lmm_stripe_offset))(-1) &&
+                      lum->lmm_stripe_count == 0) ||
+                    /* lmm_stripe_size == -1 is deprecated in 1.4.6 */
+                    lum->lmm_stripe_size == (typeof(lum->lmm_stripe_size))(-1))){
                         rc = fsfilt_set_md(obd, inode, handle, NULL, 0);
                         if (rc)
                                 GOTO(cleanup, rc);
@@ -709,6 +720,7 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
         dchild = ll_lookup_one_len(rec->ur_name, dparent, rec->ur_namelen - 1);
         if (IS_ERR(dchild)) {
                 rc = PTR_ERR(dchild);
+                if (rc != -ENAMETOOLONG)
                 CERROR("child lookup error %d\n", rc);
                 GOTO(cleanup, rc);
         }
@@ -723,10 +735,8 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 GOTO(cleanup, rc = -EROFS);
         }
 
-        if (dir->i_mode & S_ISGID) {
-                if (S_ISDIR(rec->ur_mode))
-                        rec->ur_mode |= S_ISGID;
-        }
+        if (dir->i_mode & S_ISGID && S_ISDIR(rec->ur_mode))
+                rec->ur_mode |= S_ISGID;
 
         dchild->d_fsdata = (void *)&dp;
         dp.p_inum = (unsigned long)rec->ur_fid2->id;
@@ -794,11 +804,11 @@ static int mds_reint_create(struct mds_update_record *rec, int offset,
                 LTIME_S(iattr.ia_atime) = rec->ur_time;
                 LTIME_S(iattr.ia_ctime) = rec->ur_time;
                 LTIME_S(iattr.ia_mtime) = rec->ur_time;
-                iattr.ia_uid = rec->ur_fsuid;
+                iattr.ia_uid = current->fsuid;  /* set by push_ctxt already */
                 if (dir->i_mode & S_ISGID)
                         iattr.ia_gid = dir->i_gid;
                 else
-                        iattr.ia_gid = rec->ur_fsgid;
+                        iattr.ia_gid = current->fsgid;
                 iattr.ia_valid = ATTR_UID | ATTR_GID | ATTR_ATIME |
                         ATTR_MTIME | ATTR_CTIME;
 
@@ -1627,11 +1637,18 @@ static int mds_reint_link(struct mds_update_record *rec, int offset,
 
         cleanup_phase = 3; /* locks */
 
+        if (mds_inode_is_orphan(de_src->d_inode)) {
+                CDEBUG(D_INODE, "an attempt to link an orphan inode %lu/%u\n",
+                       de_src->d_inode->i_ino,
+                       de_src->d_inode->i_generation);
+                GOTO(cleanup, rc = -ENOENT);
+        }
+
         /* Step 3: Lookup the child */
         dchild = ll_lookup_one_len(rec->ur_name, de_tgt_dir, rec->ur_namelen-1);
         if (IS_ERR(dchild)) {
                 rc = PTR_ERR(dchild);
-                if (rc != -EPERM && rc != -EACCES)
+                if (rc != -EPERM && rc != -EACCES && rc != -ENAMETOOLONG)
                         CERROR("child lookup error %d\n", rc);
                 GOTO(cleanup, rc);
         }
@@ -1788,6 +1805,7 @@ static int mds_get_parents_children_locked(struct obd_device *obd,
         *de_newp = ll_lookup_one_len(new_name, *de_tgtdirp, new_len - 1);
         if (IS_ERR(*de_newp)) {
                 rc = PTR_ERR(*de_newp);
+                if (rc != -ENAMETOOLONG)
                 CERROR("new child lookup error (%.*s): %d\n",
                        old_len - 1, old_name, rc);
                 GOTO(cleanup, rc);
@@ -2072,16 +2090,39 @@ int mds_reint_rec(struct mds_update_record *rec, int offset,
                   struct ptlrpc_request *req, struct lustre_handle *lockh)
 {
         struct obd_device *obd = req->rq_export->exp_obd;
+        struct mds_obd *mds = &obd->u.mds;
         struct lvfs_run_ctxt saved;
         int rc;
         ENTRY;
 
+#if CRAY_XT3
+        rec->ur_uc.luc_fsuid = req->rq_uid;
+#endif
+
+        /* get group info of this user */
+        rec->ur_uc.luc_uce = upcall_cache_get_entry(mds->mds_group_hash,
+                                                    rec->ur_uc.luc_fsuid,
+                                                    rec->ur_uc.luc_fsgid, 2,
+                                                    &rec->ur_uc.luc_suppgid1);
+
+        if (IS_ERR(rec->ur_uc.luc_uce)) {
+                rc = PTR_ERR(rec->ur_uc.luc_uce);
+                rec->ur_uc.luc_uce = NULL;
+                RETURN(rc);
+        }
+
         /* checked by unpacker */
         LASSERT(rec->ur_opcode < REINT_MAX && reinters[rec->ur_opcode] != NULL);
 
+#if CRAY_XT3
+        if (rec->ur_uc.luc_uce)
+                rec->ur_uc.luc_fsgid = rec->ur_uc.luc_uce->ue_primary;
+#endif
+
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, &rec->ur_uc);
         rc = reinters[rec->ur_opcode] (rec, offset, req, lockh);
         pop_ctxt(&saved, &obd->obd_lvfs_ctxt, &rec->ur_uc);
 
+        upcall_cache_put_entry(mds->mds_group_hash, rec->ur_uc.luc_uce);
         RETURN(rc);
 }
index 6298eb4..6db4c52 100644 (file)
@@ -8,20 +8,23 @@
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 /* code for handling open unlinked files */
@@ -158,7 +161,10 @@ out_free_lmm:
         RETURN(rc);
 }
 
-int mds_cleanup_orphans(struct obd_device *obd)
+/* Delete inodes which were previously open-unlinked but were not reopened
+ * during MDS recovery for whatever reason (e.g. client also failed, recovery
+ * aborted, etc). */
+int mds_cleanup_pending(struct obd_device *obd)
 {
         struct mds_obd *mds = &obd->u.mds;
         struct lvfs_run_ctxt saved;
@@ -174,6 +180,8 @@ int mds_cleanup_orphans(struct obd_device *obd)
         ENTRY;
 
         push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
+        /* dentry and mnt ref dropped in dentry_open() on error, or
+         * in filp_close() if dentry_open() succeeds */
         dentry = dget(mds->mds_pending_dir);
         if (IS_ERR(dentry))
                 GOTO(err_pop, rc = PTR_ERR(dentry));
index 89a4b3b..00590c0 100644 (file)
@@ -5,20 +5,23 @@
  *
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * These are the only exported functions, they provide some generic
  * infrastructure for managing object devices
@@ -72,7 +75,7 @@
 
 #ifndef __KERNEL__
 /* liblustre workaround */
-atomic_t portal_kmemory = {0};
+atomic_t libcfs_kmemory = {0};
 #endif
 
 struct obd_device obd_dev[MAX_OBD_DEVICES];
@@ -90,6 +93,7 @@ unsigned int obd_fail_loc;
 unsigned int obd_dump_on_timeout;
 unsigned int obd_timeout = 100; /* seconds */
 unsigned int ldlm_timeout = 20; /* seconds */
+unsigned int obd_health_check_timeout = 120; /* seconds */
 char obd_lustre_upcall[128] = "DEFAULT"; /* or NONE or /full/path/to/upcall  */
 unsigned int obd_sync_filter; /* = 0, don't sync by default */
 
@@ -187,8 +191,8 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg)
         /* only for debugging */
         if (cmd == PTL_IOC_DEBUG_MASK) {
                 debug_data = (struct portals_debug_ioctl_data*)arg;
-                portal_subsystem_debug = debug_data->subs;
-                portal_debug = debug_data->debug;
+                libcfs_subsystem_debug = debug_data->subs;
+                libcfs_debug = debug_data->debug;
                 return 0;
         }
 
@@ -215,7 +219,6 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg)
 
                 OBD_ALLOC(lcfg, data->ioc_plen1);
                 err = copy_from_user(lcfg, data->ioc_pbuf1, data->ioc_plen1);
-
                 if (!err)
                         err = class_process_config(lcfg);
                 OBD_FREE(lcfg, data->ioc_plen1);
@@ -295,10 +298,8 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg)
 
 
         case OBD_IOC_CLOSE_UUID: {
-                ptl_nid_t       peer_nid;
-                CDEBUG(D_IOCTL, "closing all connections to uuid %s\n",
+                CDEBUG(D_IOCTL, "closing all connections to uuid %s (NOOP)\n",
                        data->ioc_inlbuf1);
-                lustre_uuid_to_peer(data->ioc_inlbuf1, &peer_nid);
                 GOTO(out, err = 0);
         }
 
@@ -381,6 +382,7 @@ EXPORT_SYMBOL(obd_race_waitq);
 EXPORT_SYMBOL(obd_dump_on_timeout);
 EXPORT_SYMBOL(obd_timeout);
 EXPORT_SYMBOL(ldlm_timeout);
+EXPORT_SYMBOL(obd_health_check_timeout);
 EXPORT_SYMBOL(obd_lustre_upcall);
 EXPORT_SYMBOL(obd_sync_filter);
 EXPORT_SYMBOL(ptlrpc_put_connection_superhack);
@@ -458,13 +460,12 @@ int obd_proc_read_pinger(char *page, char **start, off_t off, int count,
 static int obd_proc_read_health(char *page, char **start, off_t off,
                                 int count, int *eof, void *data)
 {
-        int rc = 0; //, i;
+        int rc = 0, i;
         *eof = 1;
 
-        if (portals_catastrophe)
+        if (libcfs_catastrophe)
                 rc += snprintf(page + rc, count - rc, "LBUG\n");
 
-#if 0
         spin_lock(&obd_dev_lock);
         for (i = 0; i < MAX_OBD_DEVICES; i++) {
                 struct obd_device *obd;
@@ -485,7 +486,6 @@ static int obd_proc_read_health(char *page, char **start, off_t off,
                 spin_lock(&obd_dev_lock);
         }
         spin_unlock(&obd_dev_lock);
-#endif
 
         if (rc == 0)
                 return snprintf(page, count, "healthy\n");
@@ -494,12 +494,35 @@ static int obd_proc_read_health(char *page, char **start, off_t off,
         return rc;
 }
 
+static int obd_proc_rd_health_timeout(char *page, char **start, off_t off,
+                                      int count, int *eof, void *data)
+{
+        *eof = 1;
+        return snprintf(page, count, "%d\n", obd_health_check_timeout);
+}
+
+static int obd_proc_wr_health_timeout(struct file *file, const char *buffer,
+                                      unsigned long count, void *data)
+{
+        int val, rc;
+
+        rc = lprocfs_write_helper(buffer, count, &val);
+        if (rc)
+                return rc;
+
+        obd_health_check_timeout = val;
+
+        return count;
+}
+
 /* Root for /proc/fs/lustre */
 struct lprocfs_vars lprocfs_base[] = {
         { "version", obd_proc_read_version, NULL, NULL },
         { "kernel_version", obd_proc_read_kernel_version, NULL, NULL },
         { "pinger", obd_proc_read_pinger, NULL, NULL },
         { "health_check", obd_proc_read_health, NULL, NULL },
+        { "health_check_timeout", obd_proc_rd_health_timeout,
+          obd_proc_wr_health_timeout, NULL },        
         { 0 }
 };
 #else
@@ -667,8 +690,13 @@ int init_obdclass(void)
         int err;
         int i;
 
+#ifdef __KERNEL__
         printk(KERN_INFO "Lustre: OBD class driver Build Version: "
                BUILD_VERSION", info@clusterfs.com\n");
+#else
+        CDEBUG(D_INFO, "Lustre: OBD class driver Build Version: "
+               BUILD_VERSION", info@clusterfs.com\n");
+#endif
 
         err = obd_init_checks();
         if (err == -EOVERFLOW)
@@ -708,8 +736,7 @@ int init_obdclass(void)
         proc_version = lprocfs_add_vars(proc_lustre_root, lprocfs_base, NULL);
         entry = create_proc_entry("devices", 0444, proc_lustre_root);
         if (entry == NULL) {
-                printk(KERN_ERR "LustreError: error registering "
-                       "/proc/fs/lustre/devices\n");
+                CERROR("error registering /proc/fs/lustre/devices\n");
                 lprocfs_remove(proc_lustre_root);
                 RETURN(-ENOMEM);
         }
@@ -764,8 +791,8 @@ static void cleanup_obdclass(void)
 /* Check that we're building against the appropriate version of the Lustre
  * kernel patch */
 #include <linux/lustre_version.h>
-#define LUSTRE_MIN_VERSION 32
-#define LUSTRE_MAX_VERSION 46
+#define LUSTRE_MIN_VERSION 37
+#define LUSTRE_MAX_VERSION 47
 #if (LUSTRE_KERNEL_VERSION < LUSTRE_MIN_VERSION)
 # error Cannot continue: Your Lustre kernel patch is older than the sources
 #elif (LUSTRE_KERNEL_VERSION > LUSTRE_MAX_VERSION)
index 3d89284..9b3b8cc 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * Helper routines for dumping data structs for debugging.
  */
@@ -99,8 +102,8 @@ int dump_obdo(struct obdo *oa)
 
 void dump_lsm(int level, struct lov_stripe_md *lsm)
 {
-        CDEBUG(level, "objid "LPX64", maxbytes "LPX64", magic 0x%08X, "
-               "stripe_size %u, stripe_count %u\n",
+        CDEBUG(level, "lsm %p, objid "LPX64", maxbytes "LPX64", magic 0x%08X, "
+               "stripe_size %u, stripe_count %u\n", lsm,
                lsm->lsm_object_id, lsm->lsm_maxbytes, lsm->lsm_magic,
                lsm->lsm_stripe_size, lsm->lsm_stripe_count);
 }
index 165a7df..926851b 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2001-2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * These are the only exported functions, they provide some generic
  * infrastructure for managing object devices
@@ -476,7 +479,7 @@ struct obd_export *class_conn2export(struct lustre_handle *conn)
                 RETURN(NULL);
         }
 
-        CDEBUG(D_IOCTL, "looking for export cookie "LPX64"\n", conn->cookie);
+        CDEBUG(D_INFO, "looking for export cookie "LPX64"\n", conn->cookie);
         export = class_handle2object(conn->cookie);
         RETURN(export);
 }
@@ -609,7 +612,7 @@ struct obd_import *class_import_get(struct obd_import *import)
         LASSERT(atomic_read(&import->imp_refcount) >= 0);
         LASSERT(atomic_read(&import->imp_refcount) < 0x5a5a5a);
         atomic_inc(&import->imp_refcount);
-        CDEBUG(D_IOCTL, "import %p refcount=%d\n", import,
+        CDEBUG(D_INFO, "import %p refcount=%d\n", import,
                atomic_read(&import->imp_refcount));
         return import;
 }
@@ -619,7 +622,7 @@ void class_import_put(struct obd_import *import)
 {
         ENTRY;
 
-        CDEBUG(D_IOCTL, "import %p refcount=%d\n", import,
+        CDEBUG(D_INFO, "import %p refcount=%d\n", import,
                atomic_read(&import->imp_refcount) - 1);
 
         LASSERT(atomic_read(&import->imp_refcount) > 0);
@@ -889,8 +892,7 @@ void oig_release(struct obd_io_group *oig)
 }
 EXPORT_SYMBOL(oig_release);
 
-void oig_add_one(struct obd_io_group *oig,
-                  struct oig_callback_context *occ)
+void oig_add_one(struct obd_io_group *oig, struct oig_callback_context *occ)
 {
         unsigned long flags;
         CDEBUG(D_CACHE, "oig %p ready to roll\n", oig);
@@ -1014,7 +1016,7 @@ void class_fail_export(struct obd_export *exp)
                exp, exp->exp_client_uuid.uuid);
 
         if (obd_dump_on_timeout)
-                portals_debug_dumplog();
+                libcfs_debug_dumplog();
 
         /* Most callers into obd_disconnect are removing their own reference
          * (request, for example) in addition to the one from the hash table.
@@ -1029,9 +1031,16 @@ void class_fail_export(struct obd_export *exp)
 }
 EXPORT_SYMBOL(class_fail_export);
 
-/* Ping evictor thread */
-#define D_PET D_HA
+char *obd_export_nid2str(struct obd_export *exp)
+{
+        if (exp->exp_connection != NULL)
+                return libcfs_nid2str(exp->exp_connection->c_peer.nid);
+        
+        return "(no nid)";
+}
+EXPORT_SYMBOL(obd_export_nid2str);
 
+/* Ping evictor thread */
 #ifdef __KERNEL__
 #define PET_READY     1
 #define PET_TERMINATE 2
@@ -1073,14 +1082,14 @@ static int ping_evictor_main(void *arg)
         ENTRY;
 
         lock_kernel();
-        kportal_daemonize("ping_evictor");
+        libcfs_daemonize("ping_evictor");
         SIGNAL_MASK_LOCK(current, flags);
         sigfillset(&current->blocked);
         RECALC_SIGPENDING;
         SIGNAL_MASK_UNLOCK(current, flags);
         unlock_kernel();
 
-        CDEBUG(D_PET, "Starting Ping Evictor\n");
+        CDEBUG(D_HA, "Starting Ping Evictor\n");
         pet_exp = NULL;
         pet_state = PET_READY;
         while (1) {
@@ -1092,7 +1101,7 @@ static int ping_evictor_main(void *arg)
                 obd = pet_exp->exp_obd;
                 expire_time = CURRENT_SECONDS - (3 * obd_timeout / 2);
 
-                CDEBUG(D_PET, "evicting all exports of obd %s older than %ld\n",
+                CDEBUG(D_HA, "evicting all exports of obd %s older than %ld\n",
                        obd->obd_name, expire_time);
 
                 /* Exports can't be deleted out of the list, which means we
@@ -1132,7 +1141,7 @@ static int ping_evictor_main(void *arg)
                 class_export_put(pet_exp);
                 pet_exp = NULL;
         }
-        CDEBUG(D_PET, "Exiting Ping Evictor\n");
+        CDEBUG(D_HA, "Exiting Ping Evictor\n");
 
         RETURN(0);
 }
@@ -1187,7 +1196,7 @@ void class_update_export_timer(struct obd_export *exp, time_t extra_delay)
         exp->exp_last_request_time = max(exp->exp_last_request_time,
                                          (time_t)CURRENT_SECONDS + extra_delay);
 
-        CDEBUG(D_PET, "updating export %s at %ld\n",
+        CDEBUG(D_INFO, "updating export %s at %ld\n",
                exp->exp_client_uuid.uuid,
                exp->exp_last_request_time);
 
@@ -1228,8 +1237,8 @@ void class_update_export_timer(struct obd_export *exp, time_t extra_delay)
                            ptlrpc_pinger_main), we better wait for 3. */
                         exp->exp_obd->obd_eviction_timer = CURRENT_SECONDS +
                                 3 * PING_INTERVAL;
-                        CDEBUG(D_PET,
-                               "Thinking about evicting old export from %ld\n",
+                        CDEBUG(D_HA, "%s: Think about evicting %s from %ld\n",
+                               exp->exp_obd->obd_name, obd_export_nid2str(exp),
                                oldest_time);
                 }
         } else {
@@ -1247,10 +1256,73 @@ void class_update_export_timer(struct obd_export *exp, time_t extra_delay)
 }
 EXPORT_SYMBOL(class_update_export_timer);
 
-char *obd_export_nid2str(struct obd_export *exp)
+int obd_export_evict_by_nid(struct obd_device *obd, char *nid)
 {
-        if (exp->exp_connection != NULL)
-                return libcfs_nid2str(exp->exp_connection->c_peer.nid);
-        
-        return "(no nid)";
+        struct obd_export *doomed_exp = NULL;
+        struct list_head *p;
+        int exports_evicted = 0;
+
+search_again:
+        spin_lock(&obd->obd_dev_lock);
+        list_for_each(p, &obd->obd_exports) {
+                doomed_exp = list_entry(p, struct obd_export, exp_obd_chain);
+                if (strcmp(obd_export_nid2str(doomed_exp), nid) == 0) {
+                        class_export_get(doomed_exp);
+                        break;
+                }
+                doomed_exp = NULL;
+        }
+        spin_unlock(&obd->obd_dev_lock);
+
+        if (doomed_exp == NULL) {
+                goto out;
+        } else {
+                CERROR("evicting nid %s (%s) at adminstrative request\n",
+                       nid, doomed_exp->exp_client_uuid.uuid);
+                class_fail_export(doomed_exp);
+                class_export_put(doomed_exp);
+                exports_evicted++;
+                goto search_again;
+        }
+
+out:
+        if (!exports_evicted)
+                CERROR("can't disconnect %s: no exports found\n", nid);
+        return exports_evicted;
+}
+EXPORT_SYMBOL(obd_export_evict_by_nid);
+
+int obd_export_evict_by_uuid(struct obd_device *obd, char *uuid)
+{
+        struct obd_export *doomed_exp = NULL;
+        struct list_head *p;
+        struct obd_uuid doomed;
+        int exports_evicted = 0;
+
+        obd_str2uuid(&doomed, uuid);
+
+        spin_lock(&obd->obd_dev_lock);
+        list_for_each(p, &obd->obd_exports) {
+                doomed_exp = list_entry(p, struct obd_export, exp_obd_chain);
+
+                if (obd_uuid_equals(&doomed, &doomed_exp->exp_client_uuid)) {
+                        class_export_get(doomed_exp);
+                        break;
+                }
+                doomed_exp = NULL;
+        }
+        spin_unlock(&obd->obd_dev_lock);
+
+        if (doomed_exp == NULL) {
+                CERROR("can't disconnect %s: no exports found\n", uuid);
+        } else {
+                CERROR("evicting %s at adminstrative request\n",
+                       doomed_exp->exp_client_uuid.uuid);
+                class_fail_export(doomed_exp);
+                class_export_put(doomed_exp);
+                exports_evicted++;
+        }
+
+        return exports_evicted;
 }
+EXPORT_SYMBOL(obd_export_evict_by_uuid);
index 09a295b..17f7a45 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * OST<->MDS recovery logging infrastructure.
  *
@@ -263,6 +266,13 @@ int llog_process(struct llog_handle *loghandle, llog_cb_t cb,
                         if (rec->lrh_index == 0)
                                 GOTO(out, 0); /* no more records */
 
+                        if (rec->lrh_len == 0 || rec->lrh_len >LLOG_CHUNK_SIZE){
+                                CWARN("invalid length %d in llog record for "
+                                      "index %d\n", rec->lrh_len,
+                                rec->lrh_index);
+                                GOTO(out, 0);
+                        }
+
                         if (rec->lrh_index < index) {
                                 CDEBUG(D_OTHER, "skipping lrh_index %d\n",
                                        rec->lrh_index);
index 6f1cbac..b975f14 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * OST<->MDS recovery logging infrastructure.
  *
index 03adc1a..7e37945 100644 (file)
@@ -1,9 +1,25 @@
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  Copyright (C) 2005 Cluster File Systems, Inc.
+ *
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
+ *
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
+ *
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
+ *
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_LOG
index 39c2613..df4dc34 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * OST<->MDS recovery logging infrastructure.
  *
index c328873..c98ae41 100644 (file)
@@ -1,10 +1,25 @@
-
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  Copyright (C) 2005 Cluster File Systems, Inc.
+ *
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
+ *
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
+ *
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
+ *
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_LOG
index 22b185a..8188b48 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2004-2005 Cluster File Systems, Inc.
  *   Author: jacob berkman  <jacob@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * Swabbing of llog datatypes (from disk or over the wire).
  *
@@ -203,7 +206,7 @@ static void print_lustre_cfg(struct lustre_cfg *lcfg)
         int i;
         ENTRY;
 
-        if (!(portal_debug & D_OTHER)) /* don't loop on nothing */
+        if (!(libcfs_debug & D_OTHER)) /* don't loop on nothing */
                 return;
         CDEBUG(D_OTHER, "lustre_cfg: %p\n", lcfg);
         CDEBUG(D_OTHER, "\tlcfg->lcfg_magic: %#x\n", lcfg->lcfg_magic);
@@ -212,7 +215,7 @@ static void print_lustre_cfg(struct lustre_cfg *lcfg)
         CDEBUG(D_OTHER, "\tlcfg->lcfg_command: %#x\n", lcfg->lcfg_command);
         CDEBUG(D_OTHER, "\tlcfg->lcfg_num: %#x\n", lcfg->lcfg_num);
         CDEBUG(D_OTHER, "\tlcfg->lcfg_flags: %#x\n", lcfg->lcfg_flags);
-        CDEBUG(D_OTHER, "\tlcfg->lcfg_nid: "LPX64"\n", lcfg->lcfg_nid);
+        CDEBUG(D_OTHER, "\tlcfg->lcfg_nid: %s\n", libcfs_nid2str(lcfg->lcfg_nid));
 
         CDEBUG(D_OTHER, "\tlcfg->lcfg_bufcount: %d\n", lcfg->lcfg_bufcount);
         if (lcfg->lcfg_bufcount < LUSTRE_CFG_MAX_BUFCOUNT)
index 2160e57..b66d5a3 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2003 Cluster File Systems, Inc.
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org/
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * A kernel module which tests the llog API from the OBD setup function.
  */
index 8a0db22..0a8ebb4 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *   Author: Hariharan Thantry <thantry@users.sourceforge.net>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
@@ -671,6 +674,7 @@ int lprocfs_alloc_obd_stats(struct obd_device *obd, unsigned num_private_stats)
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, notify);
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotacheck);
         LPROCFS_OBD_OP_INIT(num_private_stats, stats, quotactl);
+        LPROCFS_OBD_OP_INIT(num_private_stats, stats, health_check);
 
         for (i = num_private_stats; i < num_stats; i++) {
                 /* If this LBUGs, it is likely that an obd
index 0a6acfe..f3626b2 100644 (file)
@@ -4,20 +4,23 @@
  * Copyright (C) 2002 Cluster File Systems, Inc.
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org/
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_CLASS
index e1a4e7c..a62e7f1 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -39,7 +42,7 @@
 
 struct uuid_nid_data {
         struct list_head un_list;
-        ptl_nid_t        un_nid;
+        lnet_nid_t        un_nid;
         char            *un_uuid;
 };
 
@@ -59,7 +62,7 @@ void class_exit_uuidlist(void)
         class_del_uuid(NULL);
 }
 
-int lustre_uuid_to_peer(char *uuid, ptl_nid_t *peer_nid)
+int lustre_uuid_to_peer(char *uuid, lnet_nid_t *peer_nid, int index)
 {
         struct list_head *tmp;
 
@@ -69,7 +72,8 @@ int lustre_uuid_to_peer(char *uuid, ptl_nid_t *peer_nid)
                 struct uuid_nid_data *data =
                         list_entry(tmp, struct uuid_nid_data, un_list);
 
-                if (strcmp(data->un_uuid, uuid) == 0) {
+                if (!strcmp(data->un_uuid, uuid) &&
+                    index-- == 0) {
                         *peer_nid = data->un_nid;
 
                         spin_unlock (&g_uuid_lock);
@@ -78,7 +82,7 @@ int lustre_uuid_to_peer(char *uuid, ptl_nid_t *peer_nid)
         }
 
         spin_unlock (&g_uuid_lock);
-        return -1;
+        return -ENOENT;
 }
 
 int class_add_uuid(char *uuid, __u64 nid)
@@ -103,7 +107,7 @@ int class_add_uuid(char *uuid, __u64 nid)
                 return -ENOMEM;
         }
 
-        CDEBUG(D_INFO, "add uuid %s "LPX64"\n", uuid, nid);
+        CDEBUG(D_INFO, "add uuid %s %s\n", uuid, libcfs_nid2str(nid));
         memcpy(data->un_uuid, uuid, nob);
         data->un_nid = nid;
 
index 1345bbb..d411042 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2001-2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * Config API
  *
@@ -799,8 +802,8 @@ int class_config_dump_handler(struct llog_handle * handle,
                 if (lcfg->lcfg_flags)
                         CDEBUG(D_INFO, "       flags: %x\n", lcfg->lcfg_flags);
                 if (lcfg->lcfg_nid)
-                        CDEBUG(D_INFO, "         nid: "LPX64"\n",
-                               lcfg->lcfg_nid);
+                        CDEBUG(D_INFO, "         nid: %s\n",
+                               libcfs_nid2str(lcfg->lcfg_nid));
                 if (lcfg->lcfg_nal)
                         CDEBUG(D_INFO, "         nal: %x (obsolete)\n", lcfg->lcfg_nal);
                 if (lcfg->lcfg_num)
index 86a9598..071b778 100644 (file)
@@ -5,20 +5,23 @@
  *
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * These are the only exported functions, they provide some generic
  * infrastructure for managing object devices
index 74fbc5b..616bdfa 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * (Un)packing of OST/MDS requests
  *
index 1bf8a27..714aa0e 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2001, 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -89,8 +92,6 @@ int LL_PROC_PROTO(proc_set_timeout)
         rc = ll_proc_dointvec(table, write, filp, buffer, lenp, ppos);
         if (ldlm_timeout >= obd_timeout)
                 ldlm_timeout = max(obd_timeout / 3, 1U);
-        else if (ldlm_timeout < 10 && obd_timeout >= ldlm_timeout * 4)
-                ldlm_timeout = min(obd_timeout / 3, 30U);
         return rc;
 }
 
index ccc85a0..0b56fb7 100644 (file)
@@ -5,20 +5,23 @@
  *   Author: Peter Braam <braam@clusterfs.com>
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
index 806788d..4b8f5cc 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2001-2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_ECHO
@@ -481,8 +484,10 @@ echo_client_page_debug_check(struct lov_stripe_md *lsm,
                 rc2 = block_debug_check("test_brw", 
                                         addr + delta, OBD_ECHO_BLOCK_SIZE, 
                                         stripe_off, stripe_id);
-                if (rc2 != 0)
+                if (rc2 != 0) {
+                        CERROR ("Error in echo object "LPX64"\n", id);
                         rc = rc2;
+                }
         }
 
         kunmap(page);
index cc3207d..3418691 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 #define DEBUG_SUBSYSTEM S_ECHO
index c3d533e..b23a845 100644 (file)
@@ -303,7 +303,7 @@ static int filter_free_server_data(struct filter_obd *filter)
 {
         OBD_FREE(filter->fo_fsd, sizeof(*filter->fo_fsd));
         filter->fo_fsd = NULL;
-        OBD_FREE(filter->fo_last_rcvd_slots, FILTER_LR_MAX_CLIENTS/8);
+        OBD_FREE(filter->fo_last_rcvd_slots, FILTER_LR_MAX_CLIENTS / 8);
         filter->fo_last_rcvd_slots = NULL;
         return 0;
 }
@@ -376,7 +376,7 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp)
                 RETURN(-ENOMEM);
         filter->fo_fsd = fsd;
 
-        OBD_ALLOC(filter->fo_last_rcvd_slots, FILTER_LR_MAX_CLIENTS/8);
+        OBD_ALLOC(filter->fo_last_rcvd_slots, FILTER_LR_MAX_CLIENTS / 8);
         if (filter->fo_last_rcvd_slots == NULL) {
                 OBD_FREE(fsd, sizeof(*fsd));
                 RETURN(-ENOMEM);
@@ -1090,6 +1090,7 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         struct list_head *tmp;
         ldlm_error_t err;
         int tmpflags = 0, rc, repsize[2] = {sizeof(*rep), sizeof(*reply_lvb)};
+        int only_liblustre = 0;
         ENTRY;
 
         policy = ldlm_get_processing_policy(res);
@@ -1157,6 +1158,15 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
                 if (tmplock->l_policy_data.l_extent.end <= reply_lvb->lvb_size)
                         continue;
 
+                /* Don't send glimpse ASTs to liblustre clients.  They aren't
+                 * listening for them, and they do entirely synchronous I/O
+                 * anyways. */
+                if (tmplock->l_export == NULL ||
+                    tmplock->l_export->exp_libclient == 1) {
+                        only_liblustre = 1;
+                        continue;
+                }
+
                 if (l == NULL) {
                         l = LDLM_LOCK_GET(tmplock);
                         continue;
@@ -1172,8 +1182,26 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         l_unlock(&res->lr_namespace->ns_lock);
 
         /* There were no PW locks beyond the size in the LVB; finished. */
-        if (l == NULL)
+        if (l == NULL) {
+                if (only_liblustre) {
+                        /* If we discovered a liblustre client with a PW lock,
+                         * however, the LVB may be out of date!  The LVB is
+                         * updated only on glimpse (which we don't do for
+                         * liblustre clients) and cancel (which the client
+                         * obviously has not yet done).  So if it has written
+                         * data but kept the lock, the LVB is stale and needs
+                         * to be updated from disk.
+                         *
+                         * Of course, this will all disappear when we switch to
+                         * taking liblustre locks on the OST. */
+                        if (res->lr_namespace->ns_lvbo &&
+                            res->lr_namespace->ns_lvbo->lvbo_update) {
+                                res->lr_namespace->ns_lvbo->lvbo_update
+                                                             (res, NULL, 0, 1);
+                        }
+                }
                 RETURN(ELDLM_LOCK_ABORTED);
+        }
 
         if (l->l_glimpse_ast == NULL) {
                 /* We are racing with unlink(); just return -ENOENT */
@@ -1183,6 +1211,7 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
 
         LASSERTF(l->l_glimpse_ast != NULL, "l == %p", l);
         rc = l->l_glimpse_ast(l, NULL); /* this will update the LVB */
+        /* Update the LVB from disk if the AST failed (this is a legal race) */
         if (rc != 0 && res->lr_namespace->ns_lvbo &&
             res->lr_namespace->ns_lvbo->lvbo_update) {
                 res->lr_namespace->ns_lvbo->lvbo_update(res, NULL, 0, 1);
@@ -1198,7 +1227,110 @@ static int filter_intent_policy(struct ldlm_namespace *ns,
         RETURN(ELDLM_LOCK_ABORTED);
 }
 
-/* mount the file system (secretly) */
+/*
+ * per-obd_device iobuf pool.
+ *
+ * To avoid memory deadlocks in low-memory setups, amount of dynamic
+ * allocations in write-path has to be minimized (see bug 5137).
+ *
+ * Pages, niobuf_local's and niobuf_remote's are pre-allocated and attached to
+ * OST threads (see ost_thread_{init,done}()).
+ *
+ * "iobuf's" used by filter cannot be attached to OST thread, however, because
+ * at the OST layer there are only (potentially) multiple obd_device of type
+ * unknown at the time of OST thread creation.
+ *
+ * Instead array of iobuf's is attached to struct filter_obd (->fo_iobuf_pool
+ * field). This array has size OST_NUM_THREADS, so that each OST thread uses
+ * it's very own iobuf.
+ *
+ * Functions below
+ *
+ *     filter_kiobuf_pool_init()
+ *
+ *     filter_kiobuf_pool_done()
+ *
+ *     filter_iobuf_get()
+ *
+ * operate on this array. They are "generic" in a sense that they don't depend
+ * on actual type of iobuf's (the latter depending on Linux kernel version).
+ */
+
+/*
+ * destroy pool created by filter_iobuf_pool_init
+ */
+static void filter_iobuf_pool_done(struct filter_obd *filter)
+{
+        void **pool;
+        int i;
+
+        ENTRY;
+
+        pool = filter->fo_iobuf_pool;
+        if (pool != NULL) {
+                for (i = 0; i < OST_NUM_THREADS; ++ i) {
+                        if (pool[i] != NULL)
+                                filter_free_iobuf(pool[i]);
+                }
+                OBD_FREE(pool, OST_NUM_THREADS * sizeof pool[0]);
+                filter->fo_iobuf_pool = NULL;
+        }
+        EXIT;
+}
+
+/*
+ * pre-allocate pool of iobuf's to be used by filter_{prep,commit}rw_write().
+ */
+static int filter_iobuf_pool_init(struct filter_obd *filter, int count)
+{
+        void **pool;
+        int i;
+        int result = 0;
+
+        ENTRY;
+
+        LASSERT(count <= OST_NUM_THREADS);
+
+        OBD_ALLOC_GFP(pool, OST_NUM_THREADS * sizeof pool[0], GFP_KERNEL);
+        if (pool == NULL)
+                RETURN(-ENOMEM);
+
+        filter->fo_iobuf_pool = pool;
+        filter->fo_iobuf_count = count;
+        for (i = 0; i < count; ++ i) {
+                /*
+                 * allocate kiobuf to be used by i-th OST thread.
+                 */
+                result = filter_alloc_iobuf(filter, OBD_BRW_WRITE,
+                                            PTLRPC_MAX_BRW_PAGES,
+                                            &pool[i]);
+                if (result != 0) {
+                        filter_iobuf_pool_done(filter);
+                        break;
+                }
+        }
+        RETURN(result);
+}
+
+/*
+ * return iobuf preallocated by filter_iobuf_pool_init() for @thread.
+ */
+void *filter_iobuf_get(struct ptlrpc_thread *thread, struct filter_obd *filter)
+{
+        void *kio;
+
+        LASSERT(thread->t_id < filter->fo_iobuf_count);
+        kio = filter->fo_iobuf_pool[thread->t_id];
+        LASSERT(kio != NULL);
+        return kio;
+}
+
+/* mount the file system (secretly).  lustre_cfg parameters are:
+ * 1 = device
+ * 2 = fstype
+ * 3 = flags: failover=f, failout=n
+ * 4 = mount options
+ */
 int filter_common_setup(struct obd_device *obd, obd_count len, void *buf,
                         void *option)
 {
@@ -1208,7 +1340,7 @@ int filter_common_setup(struct obd_device *obd, obd_count len, void *buf,
         struct lustre_mount_info *lmi;
         char *str;
         char ns_name[48];
-        int rc = 0;
+        int rc;
         ENTRY;
 
         if (lcfg->lcfg_bufcount < 3 ||
@@ -1219,35 +1351,41 @@ int filter_common_setup(struct obd_device *obd, obd_count len, void *buf,
         obd->obd_fsops = fsfilt_get_ops(lustre_cfg_string(lcfg, 2));
         if (IS_ERR(obd->obd_fsops))
                 RETURN(PTR_ERR(obd->obd_fsops));
-        
+
+        rc = filter_iobuf_pool_init(filter, OST_NUM_THREADS);
+        if (rc != 0)
+                GOTO(err_ops, rc);
+
         lmi = lustre_get_mount(obd->obd_name);
         if (lmi) {
                 /* We already mounted in lustre_fill_super */
+                /* FIXME did we mount with the flags below?*/
                 mnt = lmi->lmi_mnt;
         } else {
                 mnt = do_kern_mount(lustre_cfg_string(lcfg, 2),
                                     MS_NOATIME|MS_NODIRATIME,
                                     lustre_cfg_string(lcfg, 1), option);       
         }
-        rc = PTR_ERR(mnt);
-        if (IS_ERR(mnt))
+
+        if (IS_ERR(mnt)) {
+                rc = PTR_ERR(mnt);
+                LCONSOLE_ERROR("Can't mount disk %s (%d)\n",
+                               lustre_cfg_string(lcfg, 1), rc);
                 GOTO(err_ops, rc);
+        }
 
         LASSERT(!lvfs_check_rdonly(lvfs_sbdev(mnt->mnt_sb)));
 
+        /* failover is the default */
+        obd->obd_replayable = 1;
+        obd_sync_filter = 1;
+
         if (lcfg->lcfg_bufcount > 3 && LUSTRE_CFG_BUFLEN(lcfg, 3) > 0) {
                 str = lustre_cfg_string(lcfg, 3);
-                if (*str == 'f') {
-                        obd->obd_replayable = 1;
-                        obd_sync_filter = 1;
-                        CWARN("%s: recovery enabled\n", obd->obd_name);
-                } else {
-                        if (*str != 'n') {
-                                CERROR("unrecognised flag '%c'\n",
-                                       *str);
-                        }
-                        // XXX Robert? Why do we get errors here
-                        // GOTO(err_mntput, rc = -EINVAL);
+                if (strchr(str, 'n')) {
+                        CWARN("%s: recovery disabled\n", obd->obd_name);
+                        obd->obd_replayable = 0;
+                        obd_sync_filter = 0;
                 }
         }
 
@@ -1348,6 +1486,7 @@ err_mntput:
         filter->fo_sb = 0;
 err_ops:
         fsfilt_put_ops(obd->obd_fsops);
+        filter_iobuf_pool_done(filter);
         return rc;
 }
 
@@ -1522,6 +1661,8 @@ static int filter_cleanup(struct obd_device *obd)
 
         fsfilt_put_ops(obd->obd_fsops);
 
+        filter_iobuf_pool_done(filter);
+
         LCONSOLE_INFO("OST %s has stopped.\n", obd->obd_name);
 
         RETURN(0);
@@ -1781,8 +1922,7 @@ static int filter_getattr(struct obd_export *exp, struct obdo *oa,
 
         obd = class_exp2obd(exp);
         if (obd == NULL) {
-                CDEBUG(D_IOCTL, "invalid client cookie "LPX64"\n",
-                       exp->exp_handle.h_cookie);
+                CDEBUG(D_IOCTL, "invalid client export %p\n", exp);
                 RETURN(-EINVAL);
         }
 
@@ -1840,7 +1980,7 @@ int filter_setattr(struct obd_export *exp, struct obdo *oa,
         if (iattr.ia_valid & (ATTR_UID | ATTR_GID)) {
                 orig_uid = dentry->d_inode->i_uid;
                 orig_gid = dentry->d_inode->i_gid;
-                handle = fsfilt_start_log(exp->exp_obd, dentry->d_inode, 
+                handle = fsfilt_start_log(exp->exp_obd, dentry->d_inode,
                                           FSFILT_OP_SETATTR, oti, 1);
         } else {
                 handle = fsfilt_start(exp->exp_obd, dentry->d_inode,
@@ -2079,7 +2219,7 @@ static int filter_statfs(struct obd_device *obd, struct obd_statfs *osfs,
 
         osfs->os_bavail -= min(osfs->os_bavail,
                                (filter->fo_tot_dirty + filter->fo_tot_pending +
-                                osfs->os_bsize -1) >> blockbits);
+                                osfs->os_bsize - 1) >> blockbits);
 
         RETURN(rc);
 }
@@ -2112,12 +2252,12 @@ static int filter_precreate(struct obd_device *obd, struct obdo *oa,
                 recreate_obj = 1;
         } else {
                 OBD_ALLOC(osfs, sizeof(*osfs));
-                if(osfs == NULL)
+                if (osfs == NULL)
                         RETURN(-ENOMEM);
-                rc = filter_statfs(obd, osfs, jiffies-HZ);
-                if(rc == 0 && osfs->os_bavail < (osfs->os_blocks >> 10)) {
-                        CDEBUG(D_HA, "This OST has not enough space! avail "LPU64"\n",
-                                osfs->os_bavail << filter->fo_sb->s_blocksize_bits);
+                rc = filter_statfs(obd, osfs, jiffies - HZ);
+                if (rc == 0 && osfs->os_bavail < (osfs->os_blocks >> 10)) {
+                        CDEBUG(D_HA, "OST out of space! avail "LPU64"\n",
+                              osfs->os_bavail<<filter->fo_sb->s_blocksize_bits);
                         *num=0;
                         rc = -ENOSPC;
                 }
@@ -2501,8 +2641,7 @@ static int filter_get_info(struct obd_export *exp, __u32 keylen,
 
         obd = class_exp2obd(exp);
         if (obd == NULL) {
-                CDEBUG(D_IOCTL, "invalid client cookie "LPX64"\n",
-                       exp->exp_handle.h_cookie);
+                CDEBUG(D_IOCTL, "invalid client export %p\n", exp);
                 RETURN(-EINVAL);
         }
 
@@ -2536,17 +2675,13 @@ static int filter_set_info(struct obd_export *exp, __u32 keylen,
                            void *key, __u32 vallen, void *val)
 {
         struct obd_device *obd;
-        struct lustre_handle conn;
         struct llog_ctxt *ctxt;
         int rc = 0;
         ENTRY;
 
-        conn.cookie = exp->exp_handle.h_cookie;
-
         obd = exp->exp_obd;
         if (obd == NULL) {
-                CDEBUG(D_IOCTL, "invalid exp %p cookie "LPX64"\n",
-                       exp, conn.cookie);
+                CDEBUG(D_IOCTL, "invalid export %p\n", exp);
                 RETURN(-EINVAL);
         }
 
@@ -2554,14 +2689,14 @@ static int filter_set_info(struct obd_export *exp, __u32 keylen,
             memcmp(key, "mds_conn", keylen) != 0)
                 RETURN(-EINVAL);
 
-        CWARN("%s: received MDS connection ("LPX64")\n",
-              obd->obd_name, conn.cookie);
-        memcpy(&obd->u.filter.fo_mdc_conn, &conn, sizeof(conn));
+        CWARN("%s: received MDS connection from %s\n", obd->obd_name,
+              obd_export_nid2str(exp));
+        obd->u.filter.fo_mdc_conn.cookie = exp->exp_handle.h_cookie;
 
         /* setup llog imports */
         ctxt = llog_get_context(obd, LLOG_MDS_OST_REPL_CTXT);
         rc = llog_receptor_accept(ctxt, exp->exp_imp_reverse);
-        
+
         filter_quota_set_info(exp, obd);
 
         RETURN(rc);
@@ -2635,6 +2770,21 @@ int filter_iocontrol(unsigned int cmd, struct obd_export *exp,
         RETURN(0);
 }
 
+static int filter_health_check(struct obd_device *obd)
+{
+        struct filter_obd *filter = &obd->u.filter;
+        int rc = 0;
+       
+        /*
+         * health_check to return 0 on healthy
+         * and 1 on unhealthy.
+         */
+        if(filter->fo_sb->s_flags & MS_RDONLY)
+                rc = 1;
+
+        return rc;
+}
+
 static struct dentry *filter_lvfs_fid2dentry(__u64 id, __u32 gen, __u64 gr,
                                              void *data)
 {
@@ -2671,6 +2821,7 @@ static struct obd_ops filter_obd_ops = {
         .o_iocontrol      = filter_iocontrol,
         .o_quotacheck     = filter_quotacheck,
         .o_quotactl       = filter_quotactl,
+        .o_health_check   = filter_health_check,
 };
 
 static struct obd_ops filter_sanobd_ops = {
@@ -2717,10 +2868,8 @@ static int __init obdfilter_init(void)
 
         rc = class_register_type(&filter_obd_ops, lvars.module_vars,
                                  OBD_FILTER_DEVICENAME);
-        if (rc) {
+        if (rc)
                 GOTO(out, rc);
-                return rc;
-        }
 
         rc = class_register_type(&filter_sanobd_ops, lvars.module_vars,
                                  OBD_FILTER_SAN_DEVICENAME);
index 4b5c27d..d431bfc 100644 (file)
@@ -43,7 +43,7 @@
 #define FILTER_INCOMPAT_GROUPS 0x00000001
 #define FILTER_INCOMPAT_SUPP   (FILTER_INCOMPAT_GROUPS)
 
-#define FILTER_GRANT_CHUNK (2ULL*1024*1024)
+#define FILTER_GRANT_CHUNK (2ULL * PTLRPC_MAX_BRW_SIZE)
 
 /* Data stored per client in the last_rcvd file.  In le32 order. */
 struct filter_client_data {
@@ -111,8 +111,6 @@ int filter_brw(int cmd, struct obd_export *, struct obdo *,
                struct lov_stripe_md *, obd_count oa_bufs, struct brw_page *,
                struct obd_trans_info *);
 void flip_into_page_cache(struct inode *inode, struct page *new_page);
-void filter_free_dio_pages(int objcount, struct obd_ioobj *obj,
-                           int niocount, struct niobuf_local *res);
 
 /* filter_io_*.c */
 int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
@@ -128,6 +126,8 @@ int filter_alloc_iobuf(struct filter_obd *, int rw, int num_pages, void **ret);
 void filter_free_iobuf(void *iobuf);
 int filter_iobuf_add_page(struct obd_device *obd, void *iobuf,
                           struct inode *inode, struct page *page);
+void *filter_iobuf_get(struct ptlrpc_thread *thread, struct filter_obd *filter);
+void filter_iobuf_put(void *iobuf);
 int filter_direct_io(int rw, struct dentry *dchild, void *iobuf,
                      struct obd_export *exp, struct iattr *attr,
                      struct obd_trans_info *oti, void **wait_handle);
@@ -165,7 +165,7 @@ static inline void filter_tally_write(struct filter_obd *filter,
                                  unsigned long *blocks, int blocks_per_page) {}
 static inline void filter_tally_read(struct filter_obd *filter,
                                      struct niobuf_local *lnb, int niocount) {}
-static inline int lproc_filter_attach_seqstat(struct obd_device *dev) {};
+static inline int lproc_filter_attach_seqstat(struct obd_device *dev) {}
 #endif
 
 /* Quota stuff */
@@ -199,36 +199,41 @@ int lprocfs_filter_wr_btune(struct file *file, const char *buffer,
 int lprocfs_filter_wr_itune(struct file *file, const char *buffer,
                                    unsigned long count, void *data);
 #endif /* LPROCFS */
-#else /* Quota */
+#else /* !HAVE_QUOTA_SUPPORT */
 static inline int filter_quota_setup(struct filter_obd *filter)
 {
         return 0;
 }
 static inline void filter_quota_cleanup(struct filter_obd *filter) {}
-static inline void filter_quota_set_info(struct obd_export *exp, struct obd_device *obd) {}
-static inline int filter_quotacheck(struct obd_export *exp, struct obd_quotactl *oqctl)
+static inline void filter_quota_set_info(struct obd_export *exp,
+                                         struct obd_device *obd) {}
+static inline int filter_quotacheck(struct obd_export *exp,
+                                    struct obd_quotactl *oqctl)
 {
         return -ENOTSUPP;
 }
-static inline int filter_quotactl(struct obd_export *exp, struct obd_quotactl *oqctl)
+static inline int filter_quotactl(struct obd_export *exp,
+                                  struct obd_quotactl *oqctl)
 {
         return -ENOTSUPP;
 }
 static inline int filter_quota_enforcement(struct obd_device *obd,
-                                    unsigned int fsuid, unsigned int fsgid,
-                                    struct lvfs_ucred **ret_uc)
+                                           unsigned int fsuid,
+                                           unsigned int fsgid,
+                                           struct lvfs_ucred **ret_uc)
 {
         return 0;
 }
 static inline int filter_get_quota_flag(struct obd_device *obd,
-                                 struct obdo *oa)
+                                        struct obdo *oa)
 {
         return 0;
 }
-static inline int filter_quota_check_master(struct obd_device *obd, struct inode *inode)
+static inline int filter_quota_check_master(struct obd_device *obd,
+                                            struct inode *inode)
 {
         return 0;
 }
-#endif /* Quota */
+#endif /* HAVE_QUOTA_SUPPORT */
 
-#endif
+#endif /* _FILTER_INTERNAL_H */
index 88e2dfa..e0c4fa6 100644 (file)
@@ -8,20 +8,23 @@
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_FILTER
@@ -42,12 +45,9 @@ static int filter_alloc_dio_page(struct obd_device *obd, struct inode *inode,
 {
         struct page *page;
 
-        page = alloc_pages(GFP_HIGHUSER, 0);
-        if (page == NULL) {
-                CERROR("no memory for a temp page\n");
-                lnb->rc = -ENOMEM;
-                RETURN(-ENOMEM);
-        }
+        LASSERT(lnb->page != NULL);
+
+        page = lnb->page;
 #if 0
         POISON_PAGE(page, 0xf1);
         if (lnb->len != PAGE_SIZE) {
@@ -56,24 +56,19 @@ static int filter_alloc_dio_page(struct obd_device *obd, struct inode *inode,
         }
 #endif
         page->index = lnb->offset >> PAGE_SHIFT;
-        lnb->page = page;
 
         RETURN(0);
 }
 
-void filter_free_dio_pages(int objcount, struct obd_ioobj *obj,
+static void filter_free_dio_pages(int objcount, struct obd_ioobj *obj,
                            int niocount, struct niobuf_local *res)
 {
         int i, j;
 
         for (i = 0; i < objcount; i++, obj++) {
-                for (j = 0 ; j < obj->ioo_bufcnt ; j++, res++) {
-                        if (res->page != NULL) {
-                                __free_page(res->page);
+                for (j = 0 ; j < obj->ioo_bufcnt ; j++, res++)
                                 res->page = NULL;
                         }
-                }
-        }
 }
 
 /* Grab the dirty and seen grant announcements from the incoming obdo.
@@ -295,14 +290,9 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa,
                 spin_unlock(&obd->obd_osfs_lock);
         }
 
-        memset(res, 0, niocount * sizeof(*res));
-
         push_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
 
-        rc = filter_alloc_iobuf(&obd->u.filter, OBD_BRW_READ, obj->ioo_bufcnt,
-                                &iobuf);
-        if (rc)
-                GOTO(cleanup, rc);
+        iobuf = filter_iobuf_get(oti->oti_thread, &exp->exp_obd->u.filter);
 
         dentry = filter_oa2dentry(obd, oa);
         if (IS_ERR(dentry)) {
@@ -325,21 +315,19 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa,
                 lnb->len    = rnb->len;
                 lnb->flags  = rnb->flags;
 
+                /*
+                 * ost_brw_write()->ost_nio_pages_get() already initialized
+                 * lnb->page to point to the page from the per-thread page
+                 * pool (bug 5137), initialize page.
+                 */
+                LASSERT(lnb->page != NULL);
+
                 if (inode->i_size <= rnb->offset)
-                      /* If there's no more data, abort early.
-                       * lnb->page == NULL and lnb->rc == 0, so it's
-                       * easy to detect later. */
+                        /* If there's no more data, abort early.  lnb->rc == 0,
+                         * so it's easy to detect later. */
                         break;
                 else
-                        rc = filter_alloc_dio_page(obd, inode, lnb);
-
-                if (rc) {
-                        CDEBUG(rc == -ENOSPC ? D_INODE : D_ERROR,
-                             "page err %u@"LPU64" %u/%u %p: rc %d\n",
-                              lnb->len, lnb->offset, i, obj->ioo_bufcnt,
-                              dentry, rc);
-                        GOTO(cleanup, rc);
-                }
+                        filter_alloc_dio_page(obd, inode, lnb);
 
                 if (inode->i_size < lnb->offset + lnb->len - 1)
                         lnb->rc = inode->i_size - lnb->offset;
@@ -372,8 +360,7 @@ static int filter_preprw_read(int cmd, struct obd_export *exp, struct obdo *oa,
                         f_dput(dentry);
         }
 
-        if (iobuf != NULL)
-                filter_free_iobuf(iobuf);
+        filter_iobuf_put(iobuf);
 
         pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
         if (rc)
@@ -525,13 +512,7 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
         LASSERT(objcount == 1);
         LASSERT(obj->ioo_bufcnt > 0);
 
-        memset(res, 0, niocount * sizeof(*res));
-
-        /* This iobuf is for reading any partial pages from disk */
-        rc = filter_alloc_iobuf(&exp->exp_obd->u.filter, OBD_BRW_READ,
-                                obj->ioo_bufcnt, &iobuf);
-        if (rc)
-                GOTO(cleanup, rc);
+        iobuf = filter_iobuf_get(oti->oti_thread, &exp->exp_obd->u.filter);
         cleanup_phase = 1;
 
         push_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
@@ -589,13 +570,19 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
                 lnb->len    = rnb->len;
                 lnb->flags  = rnb->flags;
 
-                rc = filter_alloc_dio_page(exp->exp_obd, dentry->d_inode,lnb);
-                if (rc) {
-                        CERROR("page err %u@"LPU64" %u/%u %p: rc %d\n",
-                               lnb->len, lnb->offset,
-                               i, obj->ioo_bufcnt, dentry, rc);
-                        GOTO(cleanup, rc);
+                /*
+                 * ost_brw_write()->ost_nio_pages_get() already initialized
+                 * lnb->page to point to the page from the per-thread page
+                 * pool (bug 5137), initialize page.
+                 */
+                LASSERT(lnb->page != NULL);
+                if (lnb->len != PAGE_SIZE) {
+                        memset(kmap(lnb->page) + lnb->len,
+                               0, PAGE_SIZE - lnb->len);
+                        kunmap(lnb->page);
                 }
+                lnb->page->index = lnb->offset >> PAGE_SHIFT;
+
                 cleanup_phase = 4;
 
                 /* If the filter writes a partial page, then has the file
@@ -630,7 +617,6 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
                                 kunmap(lnb->page);
                         }
                 }
-
                 if (lnb->rc == 0)
                         tot_bytes += lnb->len;
         }
@@ -646,12 +632,10 @@ static int filter_preprw_write(int cmd, struct obd_export *exp, struct obdo *oa,
 cleanup:
         switch(cleanup_phase) {
         case 4:
-                if (rc)
-                        filter_free_dio_pages(objcount, obj, niocount, res);
         case 3:
-                pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
-                filter_free_iobuf(iobuf);
+                filter_iobuf_put(iobuf);
         case 2:
+                pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
                 if (rc)
                         f_dput(dentry);
                 break;
@@ -661,7 +645,7 @@ cleanup:
                         filter_grant_incoming(exp, oa);
                 spin_unlock(&exp->exp_obd->obd_osfs_lock);
                 pop_ctxt(&saved, &exp->exp_obd->obd_lvfs_ctxt, NULL);
-                filter_free_iobuf(iobuf);
+                filter_iobuf_put(iobuf);
                 break;
         default:;
         }
index 4d43bb3..b0c498e 100644 (file)
@@ -8,20 +8,23 @@
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #include <linux/config.h>
 #include <linux/lustre_fsfilt.h>
 #include "filter_internal.h"
 
-/* We should only change the file mtime (and not the ctime, like
- * update_inode_times() in generic_file_write()) when we only change data. */
-void inode_update_time(struct inode *inode, int ctime_too)
-{
-        time_t now = CURRENT_TIME;
-        if (inode->i_mtime == now && (!ctime_too || inode->i_ctime == now))
-                return;
-        inode->i_mtime = now;
-        if (ctime_too)
-                inode->i_ctime = now;
-        mark_inode_dirty_sync(inode);
-}
-
 /* Bug 2254 -- this is better done in ext3_map_inode_page, but this
  * workaround will suffice until everyone has upgraded their kernels */
 static void check_pending_bhs(unsigned long *blocks, int nr_pages, dev_t dev,
@@ -306,6 +296,11 @@ static void clear_kiobuf(struct kiobuf *iobuf)
         iobuf->length = 0;
 }
 
+void filter_iobuf_put(void *iobuf)
+{
+        clear_kiobuf(iobuf);
+}
+
 int filter_alloc_iobuf(struct filter_obd *filter, int rw, int num_pages,
                        void **ret)
 {
@@ -375,10 +370,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa, int objcount,
         if (rc != 0)
                 GOTO(cleanup, rc);
 
-        rc = filter_alloc_iobuf(&obd->u.filter, OBD_BRW_WRITE,
-                                obj->ioo_bufcnt, &iobuf);
-        if (rc)
-                GOTO(cleanup, rc);
+        iobuf = filter_iobuf_get(oti->oti_thread, &exp->exp_obd->u.filter);
         cleanup_phase = 1;
 
         fso.fso_dentry = res->dentry;
@@ -450,9 +442,12 @@ cleanup:
                 pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL);
                 LASSERT(current->journal_info == NULL);
         case 1:
-                filter_free_iobuf(iobuf);
+                filter_iobuf_put(iobuf);
         case 0:
-                filter_free_dio_pages(objcount, obj, niocount, res);
+                /*
+                 * lnb->page automatically returns back into per-thread page
+                 * pool (bug 5137)
+                 */
                 f_dput(res->dentry);
         }
 
index a706583..a712188 100644 (file)
@@ -8,20 +8,23 @@
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #include <linux/config.h>
@@ -37,8 +40,6 @@
 #include <linux/lustre_quota.h>
 #include "filter_internal.h"
 
-#warning "implement writeback mode -bzzz"
-
 /* 512byte block min */
 #define MAX_BLOCKS_PER_PAGE (PAGE_SIZE / 512)
 struct dio_request {
@@ -48,7 +49,6 @@ struct dio_request {
         int               dr_max_pages;
         int               dr_npages;
         int               dr_error;
-        unsigned long     dr_flag;     /* indicating if there is client cache page in this rpc */
         struct page     **dr_pages;
         unsigned long    *dr_blocks;
         spinlock_t        dr_lock;
@@ -171,11 +171,11 @@ int filter_alloc_iobuf(struct filter_obd *filter, int rw, int num_pages,
         OBD_ALLOC(dreq, sizeof(*dreq));
         if (dreq == NULL)
                 goto failed_0;
-        
+
         OBD_ALLOC(dreq->dr_pages, num_pages * sizeof(*dreq->dr_pages));
         if (dreq->dr_pages == NULL)
                 goto failed_1;
-        
+
         OBD_ALLOC(dreq->dr_blocks,
                   MAX_BLOCKS_PER_PAGE * num_pages * sizeof(*dreq->dr_blocks));
         if (dreq->dr_blocks == NULL)
@@ -201,10 +201,9 @@ int filter_alloc_iobuf(struct filter_obd *filter, int rw, int num_pages,
         RETURN(-ENOMEM);
 }
 
-void filter_free_iobuf(void *iobuf)
+void filter_iobuf_put(void *iobuf)
 {
         struct dio_request *dreq = iobuf;
-        int                 num_pages = dreq->dr_max_pages;
 
         /* free all bios */
         while (dreq->dr_bios) {
@@ -212,12 +211,22 @@ void filter_free_iobuf(void *iobuf)
                 dreq->dr_bios = bio->bi_private;
                 bio_put(bio);
         }
+        dreq->dr_npages = 0;
+        atomic_set(&dreq->dr_numreqs, 0);
+}
+
+void filter_free_iobuf(void *iobuf)
+{
+        struct dio_request *dreq = iobuf;
+        int                 num_pages = dreq->dr_max_pages;
+
+        filter_iobuf_put(dreq);
 
         OBD_FREE(dreq->dr_blocks,
                  MAX_BLOCKS_PER_PAGE * num_pages * sizeof(*dreq->dr_blocks));
         OBD_FREE(dreq->dr_pages,
                  num_pages * sizeof(*dreq->dr_pages));
-        OBD_FREE(dreq, sizeof(*dreq));
+        OBD_FREE_PTR(dreq);
 }
 
 int filter_iobuf_add_page(struct obd_device *obd, void *iobuf,
@@ -412,31 +421,29 @@ int filter_direct_io(int rw, struct dentry *dchild, void *iobuf,
         struct dio_request *dreq = iobuf;
         struct inode *inode = dchild->d_inode;
         int blocks_per_page = PAGE_SIZE >> inode->i_blkbits;
-        int rc, rc2;
+        int rc, rc2, create;
+        struct semaphore *sem;
         ENTRY;
 
-        LASSERTF(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ, "%x\n", rw);
         LASSERTF(dreq->dr_npages <= dreq->dr_max_pages, "%d,%d\n",
                  dreq->dr_npages, dreq->dr_max_pages);
         LASSERT(dreq->dr_npages <= OBDFILTER_CREATED_SCRATCHPAD_ENTRIES);
-        LASSERT(dreq->dr_npages > 0 || rw != OBD_BRW_WRITE);
 
-        if (dreq->dr_npages == 0)
-                RETURN(0);
-
-        /* If there is any page in this write rpc that comes from client
-         * cache, we write the whole rpc without quota limit */
-        if (dreq->dr_flag & OBD_BRW_FROM_GRANT) {
-                cap_raise(current->cap_effective, CAP_SYS_RESOURCE);
-                dreq->dr_flag &= ~OBD_BRW_FROM_GRANT;
+        if (rw == OBD_BRW_READ) {
+                if (dreq->dr_npages == 0)
+                        RETURN(0);
+                create = 0;
+                sem = NULL;
+        } else {
+                LASSERTF(rw == OBD_BRW_WRITE, "%x\n", rw);
+                LASSERT(dreq->dr_npages > 0);
+                create = 1;
+                sem = &obd->u.filter.fo_alloc_lock;
         }
-
 remap:
-        rc = fsfilt_map_inode_pages(obd, inode,
-                                    dreq->dr_pages, dreq->dr_npages,
-                                    dreq->dr_blocks,
-                                    obdfilter_created_scratchpad,
-                                    rw == OBD_BRW_WRITE, NULL);
+        rc = fsfilt_map_inode_pages(obd, inode, dreq->dr_pages,
+                                    dreq->dr_npages, dreq->dr_blocks,
+                                    obdfilter_created_scratchpad, create, sem);
 
         if (rc == -EDQUOT) {
                 LASSERT(rw == OBD_BRW_WRITE &&
@@ -466,9 +473,13 @@ remap:
                 up(&inode->i_sem);
 
                 rc2 = filter_finish_transno(exp, oti, 0);
-                if (rc2 != 0)
-                        CERROR("can't close transaction: %d\n", rc);
+                if (rc2 != 0) {
+                        CERROR("can't close transaction: %d\n", rc2);
+                        if (rc == 0)
+                                rc = rc2;
+                }
 
+                rc2 =fsfilt_commit_async(obd,inode,oti->oti_handle,wait_handle);
                 if (rc == 0)
                         rc = rc2;
                 if (rc != 0)
@@ -519,6 +530,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
         struct obd_device *obd = exp->exp_obd;
         struct filter_obd *filter = &obd->u.filter;
         struct lvfs_ucred *uc = NULL;
+        void *wait_handle;
         int   total_size = 0;
         ENTRY;
 
@@ -528,11 +540,8 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
 
         if (rc != 0)
                 GOTO(cleanup, rc);
-        
-        rc = filter_alloc_iobuf(&obd->u.filter, OBD_BRW_WRITE, obj->ioo_bufcnt,
-                                (void **)&dreq);
-        if (rc)
-                GOTO(cleanup, rc);
+
+        dreq = filter_iobuf_get(oti->oti_thread, &exp->exp_obd->u.filter);
         cleanup_phase = 1;
 
         fso.fso_dentry = res->dentry;
@@ -562,10 +571,6 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
                 this_size = lnb->offset + lnb->len;
                 if (this_size > iattr.ia_size)
                         iattr.ia_size = this_size;
-                /* if one page is a write-back page from client cache,
-                 * then mark that the whole io request can be over quota */
-                if (lnb->flags & OBD_BRW_FROM_GRANT)
-                        dreq->dr_flag |= OBD_BRW_FROM_GRANT;
         }
 
         /* The client store the user credit information fsuid and fsgid
@@ -579,6 +584,7 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
         cleanup_phase = 2;
 
         down(&inode->i_sem);
+        fsfilt_check_slow(now, obd_timeout, "i_sem");
         oti->oti_handle = fsfilt_brw_start(obd, objcount, &fso, niocount, res,
                                            oti);
         if (IS_ERR(oti->oti_handle)) {
@@ -596,18 +602,18 @@ int filter_commitrw_write(struct obd_export *exp, struct obdo *oa,
         iattr_from_obdo(&iattr,oa,OBD_MD_FLATIME|OBD_MD_FLMTIME|OBD_MD_FLCTIME);
         /* filter_direct_io drops i_sem */
         rc = filter_direct_io(OBD_BRW_WRITE, res->dentry, dreq, exp, &iattr,
-                              oti, NULL);
+                              oti, &wait_handle);
         if (rc == 0)
-                obdo_from_inode(oa, inode, 
-                                FILTER_VALID_FLAGS | OBD_MD_FLUID | OBD_MD_FLGID);
-        else 
+                obdo_from_inode(oa, inode,
+                                FILTER_VALID_FLAGS |OBD_MD_FLUID |OBD_MD_FLGID);
+        else
                 obdo_from_inode(oa, inode, OBD_MD_FLUID | OBD_MD_FLGID);
 
         filter_get_quota_flag(obd, oa);
 
         fsfilt_check_slow(now, obd_timeout, "direct_io");
 
-        err = fsfilt_commit(obd, inode, oti->oti_handle, obd_sync_filter);
+        err = fsfilt_commit_wait(obd, inode, wait_handle);
         if (err)
                 rc = err;
 
@@ -628,9 +634,12 @@ cleanup:
                         OBD_FREE(uc, sizeof(*uc));
                 LASSERT(current->journal_info == NULL);
         case 1:
-                filter_free_iobuf(dreq);
+                filter_iobuf_put(dreq);
         case 0:
-                filter_free_dio_pages(objcount, obj, niocount, res);
+                /*
+                 * lnb->page automatically returns back into per-thread page
+                 * pool (bug 5137)
+                 */
                 f_dput(res->dentry);
         }
 
index 2ddfe72..87a2e2a 100644 (file)
@@ -8,20 +8,23 @@
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_FILTER
index e0ff9eb..2891f90 100644 (file)
@@ -8,20 +8,23 @@
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_FILTER
@@ -94,10 +97,10 @@ static int filter_lvbo_init(struct ldlm_resource *res)
  *   m != NULL : called by the DLM itself after a glimpse callback
  *   m == NULL : called by the filter after a disk write
  *
- *   If 'increase' is true, don't allow values to move backwards.
+ *   If 'increase_only' is true, don't allow values to move backwards.
  */
 static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m,
-                              int buf_idx, int increase)
+                              int buf_idx, int increase_only)
 {
         int rc = 0;
         struct ost_lvb *lvb;
@@ -127,28 +130,27 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m,
                                       lustre_swab_ost_lvb);
                 if (new == NULL) {
                         CERROR("lustre_swab_buf failed\n");
-                        //GOTO(out, rc = -EPROTO);
-                        GOTO(out, rc = 0);
+                        goto disk_update;
                 }
-                if (new->lvb_size > lvb->lvb_size || !increase) {
+                if (new->lvb_size > lvb->lvb_size || !increase_only) {
                         CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb size: "
                                LPU64" -> "LPU64"\n", res->lr_name.name[0],
                                lvb->lvb_size, new->lvb_size);
                         lvb->lvb_size = new->lvb_size;
                 }
-                if (new->lvb_mtime > lvb->lvb_mtime || !increase) {
+                if (new->lvb_mtime > lvb->lvb_mtime || !increase_only) {
                         CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb mtime: "
                                LPU64" -> "LPU64"\n", res->lr_name.name[0],
                                lvb->lvb_mtime, new->lvb_mtime);
                         lvb->lvb_mtime = new->lvb_mtime;
                 }
-                if (new->lvb_atime > lvb->lvb_atime || !increase) {
+                if (new->lvb_atime > lvb->lvb_atime || !increase_only) {
                         CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb atime: "
                                LPU64" -> "LPU64"\n", res->lr_name.name[0],
                                lvb->lvb_atime, new->lvb_atime);
                         lvb->lvb_atime = new->lvb_atime;
                 }
-                if (new->lvb_ctime > lvb->lvb_ctime || !increase) {
+                if (new->lvb_ctime > lvb->lvb_ctime || !increase_only) {
                         CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb ctime: "
                                LPU64" -> "LPU64"\n", res->lr_name.name[0],
                                lvb->lvb_ctime, new->lvb_ctime);
@@ -156,6 +158,7 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m,
                 }
         }
 
+ disk_update:
         /* Update the LVB from the disk inode */
         obd = res->lr_namespace->ns_lvbp;
         LASSERT(obd);
@@ -167,26 +170,26 @@ static int filter_lvbo_update(struct ldlm_resource *res, struct lustre_msg *m,
         if (dentry->d_inode == NULL)
                 GOTO(out_dentry, rc = -ENOENT);
 
-        if (dentry->d_inode->i_size > lvb->lvb_size || !increase) {
+        if (dentry->d_inode->i_size > lvb->lvb_size || !increase_only) {
                 CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb size from disk: "
                        LPU64" -> %llu\n", res->lr_name.name[0],
                        lvb->lvb_size, dentry->d_inode->i_size);
                 lvb->lvb_size = dentry->d_inode->i_size;
         }
 
-        if (LTIME_S(dentry->d_inode->i_mtime) > lvb->lvb_mtime || !increase) {
+        if (LTIME_S(dentry->d_inode->i_mtime) >lvb->lvb_mtime|| !increase_only){
                 CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb mtime from disk: "
                        LPU64" -> %lu\n", res->lr_name.name[0],
                        lvb->lvb_mtime, LTIME_S(dentry->d_inode->i_mtime));
                 lvb->lvb_mtime = LTIME_S(dentry->d_inode->i_mtime);
         }
-        if (LTIME_S(dentry->d_inode->i_atime) > lvb->lvb_atime || !increase) {
+        if (LTIME_S(dentry->d_inode->i_atime) >lvb->lvb_atime|| !increase_only){
                 CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb atime from disk: "
                        LPU64" -> %lu\n", res->lr_name.name[0],
                        lvb->lvb_atime, LTIME_S(dentry->d_inode->i_atime));
                 lvb->lvb_atime = LTIME_S(dentry->d_inode->i_atime);
         }
-        if (LTIME_S(dentry->d_inode->i_ctime) > lvb->lvb_ctime || !increase) {
+        if (LTIME_S(dentry->d_inode->i_ctime) >lvb->lvb_ctime|| !increase_only){
                 CDEBUG(D_DLMTRACE, "res: "LPU64" updating lvb ctime from disk: "
                        LPU64" -> %lu\n", res->lr_name.name[0],
                        lvb->lvb_ctime, LTIME_S(dentry->d_inode->i_ctime));
index 0340d6b..f2749ce 100644 (file)
@@ -7,20 +7,23 @@
  *   Author: Peter Braam <braam@clusterfs.com>
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_FILTER
@@ -49,7 +52,7 @@ int filter_san_setup(struct obd_device *obd, obd_count len, void *buf)
         if (!page)
                 RETURN(-ENOMEM);
 
-        /* for extN/ext3 filesystem, we must mount it with 'writeback' mode */
+        /* for ext3/ldiskfs filesystem, we must mount in 'writeback' mode */
         if (!strcmp(lustre_cfg_string(lcfg, 2), "ldiskfs"))
                 strcpy((void *)page, "data=writeback");
         else if (!strcmp(lustre_cfg_string(lcfg, 2), "ext3"))
index ab7e4c5..3832d54 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 #define DEBUG_SUBSYSTEM S_CLASS
@@ -333,7 +336,7 @@ static int filter_brw_stats_seq_show(struct seq_file *seq, void *v)
         }
 
         seq_printf(seq, "\n\t\t\tread\t\t\twrite\n");
-        seq_printf(seq, "io time (jiffies)     rpcs   %% cum %% |");
+        seq_printf(seq, "io time (jiffies = 1/%ds)     rpcs   %% cum %% |", HZ);
         seq_printf(seq, "       rpcs   %% cum %%\n");
 
         read_tot = lprocfs_oh_sum(&filter->fo_r_io_time);
index 3127e0b..b4ca5d9 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 #define DEBUG_SUBSYSTEM S_CLASS
@@ -92,6 +95,10 @@ static int osc_wr_max_rpcs_in_flight(struct file *file, const char *buffer,
         if (val < 1 || val > OSC_MAX_RIF_MAX)
                 return -ERANGE;
 
+        if (cli->cl_rq_pool && val > cli->cl_max_rpcs_in_flight)
+                cli->cl_rq_pool->prp_populate(cli->cl_rq_pool,
+                                              val - cli->cl_max_rpcs_in_flight);
+
         spin_lock(&cli->cl_loi_list_lock);
         cli->cl_max_rpcs_in_flight = val;
         spin_unlock(&cli->cl_loi_list_lock);
@@ -124,7 +131,8 @@ static int osc_wr_max_dirty_mb(struct file *file, const char *buffer,
         if (rc)
                 return rc;
 
-        if (val < 0 || val > OSC_MAX_DIRTY_MB_MAX || val > num_physpages / 4)
+        if (val < 0 || val > OSC_MAX_DIRTY_MB_MAX ||
+            val > num_physpages >> (20 - PAGE_SHIFT - 2)) /* 1/4 of RAM */
                 return -ERANGE;
 
         spin_lock(&cli->cl_loi_list_lock);
index 27d1e41..052f456 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author Peter Braam <braam@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  *  For testing and management it is treated as an obd_device,
  *  although * it does not export a full OBD method table (the
index 60e9160..6c6d385 100644 (file)
@@ -32,8 +32,8 @@ struct osc_async_page {
         void                    *oap_caller_data;
 };
 
-#define OAP_FROM_COOKIE(c)                                                      \
-        (LASSERT(((struct osc_async_page *)(c))->oap_magic == OAP_MAGIC),       \
+#define OAP_FROM_COOKIE(c)                                                    \
+        (LASSERT(((struct osc_async_page *)(c))->oap_magic == OAP_MAGIC),     \
          (struct osc_async_page *)(c))
 
 struct osc_cache_waiter {
@@ -69,15 +69,15 @@ void osc_qinfo_exit(void);
 int osc_quotacheck(struct obd_export *exp, struct obd_quotactl *oqctl);
 int osc_poll_quotacheck(struct obd_export *exp, struct if_quotacheck *qchk);
 int osc_quotactl(struct obd_export *exp, struct obd_quotactl *oqctl);
-#else
+#else /* !HAVE_QUOTA_SUPPORT */
 static inline int osc_get_quota_flag(struct client_obd *cli,
-                       unsigned int uid, unsigned int gid)
+                                     unsigned int uid, unsigned int gid)
 {
        return QUOTA_OK;
 }
 static inline int osc_set_quota_flag(struct client_obd *cli,
-                       unsigned int uid, unsigned int gid,
-                       obd_flag valid, obd_flag flags)
+                                     unsigned int uid, unsigned int gid,
+                                     obd_flag valid, obd_flag flags)
 {
         return 0;
 }
@@ -90,19 +90,22 @@ static inline int osc_qinfo_init(void)
         return 0;
 }
 static inline void osc_qinfo_exit(void) {}
-static inline int osc_quotacheck(struct obd_export *exp, struct obd_quotactl *oqctl)
+static inline int osc_quotacheck(struct obd_export *exp,
+                                 struct obd_quotactl *oqctl)
 {
         return -ENOTSUPP;
 }
-static inline int osc_poll_quotacheck(struct obd_export *exp, struct if_quotacheck *qchk)
+static inline int osc_poll_quotacheck(struct obd_export *exp,
+                                      struct if_quotacheck *qchk)
 {
         return -ENOTSUPP;
 }
-static inline int osc_quotactl(struct obd_export *exp, struct obd_quotactl *oqctl)
+static inline int osc_quotactl(struct obd_export *exp,
+                               struct obd_quotactl *oqctl)
 {
         return -ENOTSUPP;
 }
-#endif
+#endif /* HAVE_QUOTA_SUPPORT */
 
 #ifdef LPROCFS
 int lproc_osc_attach_seqstat(struct obd_device *dev);
index cedce02..3b76e2f 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef EXPORT_SYMTAB
index c4687b4..4374a80 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author Peter Braam <braam@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  *  For testing and management it is treated as an obd_device,
  *  although * it does not export a full OBD method table (the
@@ -280,7 +283,8 @@ out:
 }
 
 static int osc_setattr_async(struct obd_export *exp, struct obdo *oa,
-                       struct lov_stripe_md *md, struct obd_trans_info *oti)
+                             struct lov_stripe_md *md,
+                             struct obd_trans_info *oti)
 {
         struct ptlrpc_request *request;
         struct ost_body *body;
@@ -296,7 +300,7 @@ static int osc_setattr_async(struct obd_export *exp, struct obdo *oa,
 
         body = lustre_msg_buf(request->rq_reqmsg, 0, sizeof(*body));
 
-        if (oa->o_valid & OBD_MD_FLCOOKIE) 
+        if (oa->o_valid & OBD_MD_FLCOOKIE)
                 memcpy(obdo_logcookie(oa), oti->oti_logcookies,
                        sizeof(*oti->oti_logcookies));
 
@@ -554,7 +558,9 @@ static void osc_announce_cached(struct client_obd *cli, struct obdo *oa,
                        cli->cl_dirty, cli->cl_dirty_max);
                 oa->o_undirty = 0;
         } else {
-                oa->o_undirty = cli->cl_dirty_max - oa->o_dirty;
+                long max_in_flight = (cli->cl_max_pages_per_rpc << PAGE_SHIFT)*
+                                (cli->cl_max_rpcs_in_flight + 1);
+                oa->o_undirty = max(cli->cl_dirty_max, max_in_flight);
         }
         oa->o_grant = cli->cl_avail_grant;
         oa->o_dropped = cli->cl_lost_grant;
@@ -758,8 +764,10 @@ static int osc_brw_prep_request(int cmd, struct obd_import *imp,struct obdo *oa,
         int                      requested_nob;
         int                      opc;
         int                      rc;
+        struct ptlrpc_request_pool *pool;
 
         opc = ((cmd & OBD_BRW_WRITE) != 0) ? OST_WRITE : OST_READ;
+        pool = ((cmd & OBD_BRW_WRITE) != 0) ? cli->cl_rq_pool : NULL;
 
         for (niocount = i = 1; i < page_count; i++)
                 if (!can_merge_pages(&pga[i - 1], &pga[i]))
@@ -770,7 +778,7 @@ static int osc_brw_prep_request(int cmd, struct obd_import *imp,struct obdo *oa,
         size[2] = niocount * sizeof(*niobuf);
 
         OBD_FAIL_RETURN(OBD_FAIL_OSC_BRW_PREP_REQ, -ENOMEM);
-        req = ptlrpc_prep_req(imp, opc, 3, size, NULL);
+        req = ptlrpc_prep_req_pool(imp, opc, 3, size, NULL, pool);
         if (req == NULL)
                 return (-ENOMEM);
 
@@ -898,7 +906,7 @@ static int osc_brw_fini_request(struct ptlrpc_request *req, struct obdo *oa,
                                 obd_count page_count, struct brw_page *pga,
                                 int rc)
 {
-        const ptl_process_id_t *peer =
+        const lnet_process_id_t *peer =
                         &req->rq_import->imp_connection->c_peer;
         struct client_obd *cli = &req->rq_import->imp_obd->u.cli;
         struct ost_body *body;
@@ -917,7 +925,7 @@ static int osc_brw_fini_request(struct ptlrpc_request *req, struct obdo *oa,
         /* set/clear over quota flag for a uid/gid */
         if (req->rq_reqmsg->opc == OST_WRITE &&
             body->oa.o_valid & (OBD_MD_FLUSRQUOTA | OBD_MD_FLGRPQUOTA))
-                osc_set_quota_flag(cli, body->oa.o_uid, body->oa.o_gid, 
+                osc_set_quota_flag(cli, body->oa.o_uid, body->oa.o_gid,
                                    body->oa.o_valid, body->oa.o_flags);
 
         if (rc < 0)
@@ -1111,28 +1119,27 @@ static void sort_brw_pages(struct brw_page *array, int num)
         } while (stride > 1);
 }
 
-static obd_count 
-max_unfragmented_pages(struct brw_page *pg, obd_count pages)
+static obd_count max_unfragmented_pages(struct brw_page *pg, obd_count pages)
 {
         int count = 1;
         int offset;
 
        LASSERT (pages > 0);
         offset = pg->off & (PAGE_SIZE - 1);
-        
+
        for (;;) {
                pages--;
-               if (pages == 0)                 /* that's all */
+               if (pages == 0)         /* that's all */
                         return count;
-                
-                if (offset + pg->count < PAGE_SIZE) /* doesn't end on page boundary */
-                       return count;
-               
+
+                if (offset + pg->count < PAGE_SIZE)
+                       return count;   /* doesn't end on page boundary */
+
                pg++;
                 offset = pg->off & (PAGE_SIZE - 1);
-               if (offset != 0)                /* doesn't start on page boundary */
+               if (offset != 0)        /* doesn't start on page boundary */
                        return count;
-               
+
                count++;
        }
 }
@@ -1143,7 +1150,7 @@ static int osc_brw(int cmd, struct obd_export *exp, struct obdo *oa,
 {
         ENTRY;
 
-        if (cmd == OBD_BRW_CHECK) {
+        if (cmd & OBD_BRW_CHECK) {
                 /* The caller just wants to know if there's a chance that this
                  * I/O can succeed */
                 struct obd_import *imp = class_exp2cliimp(exp);
@@ -1183,7 +1190,7 @@ static int osc_brw_async(int cmd, struct obd_export *exp, struct obdo *oa,
 {
         ENTRY;
 
-        if (cmd == OBD_BRW_CHECK) {
+        if (cmd & OBD_BRW_CHECK) {
                 /* The caller just wants to know if there's a chance that this
                  * I/O can succeed */
                 struct obd_import *imp = class_exp2cliimp(exp);
@@ -1219,9 +1226,84 @@ static int osc_brw_async(int cmd, struct obd_export *exp, struct obdo *oa,
 static void osc_check_rpcs(struct client_obd *cli);
 static void osc_exit_cache(struct client_obd *cli, struct osc_async_page *oap,
                            int sent);
-static void loi_list_maint(struct client_obd *cli, struct lov_oinfo *loi);
+
+static int lop_makes_rpc(struct client_obd *cli, struct loi_oap_pages *lop,
+                         int cmd)
+{
+        int optimal;
+        ENTRY;
+
+        if (lop->lop_num_pending == 0)
+                RETURN(0);
+
+        /* if we have an invalid import we want to drain the queued pages
+         * by forcing them through rpcs that immediately fail and complete
+         * the pages.  recovery relies on this to empty the queued pages
+         * before canceling the locks and evicting down the llite pages */
+        if (cli->cl_import == NULL || cli->cl_import->imp_invalid)
+                RETURN(1);
+
+        /* stream rpcs in queue order as long as as there is an urgent page
+         * queued.  this is our cheap solution for good batching in the case
+         * where writepage marks some random page in the middle of the file
+         * as urgent because of, say, memory pressure */
+        if (!list_empty(&lop->lop_urgent))
+                RETURN(1);
+
+        /* fire off rpcs when we have 'optimal' rpcs as tuned for the wire. */
+        optimal = cli->cl_max_pages_per_rpc;
+        if (cmd & OBD_BRW_WRITE) {
+                /* trigger a write rpc stream as long as there are dirtiers
+                 * waiting for space.  as they're waiting, they're not going to
+                 * create more pages to coallesce with what's waiting.. */
+                if (!list_empty(&cli->cl_cache_waiters))
+                        RETURN(1);
+
+                /* +16 to avoid triggering rpcs that would want to include pages
+                 * that are being queued but which can't be made ready until
+                 * the queuer finishes with the page. this is a wart for
+                 * llite::commit_write() */
+                optimal += 16;
+        }
+        if (lop->lop_num_pending >= optimal)
+                RETURN(1);
+
+        RETURN(0);
+}
+
+static void on_list(struct list_head *item, struct list_head *list,
+                    int should_be_on)
+{
+        if (list_empty(item) && should_be_on)
+                list_add_tail(item, list);
+        else if (!list_empty(item) && !should_be_on)
+                list_del_init(item);
+}
+
+/* maintain the loi's cli list membership invariants so that osc_send_oap_rpc
+ * can find pages to build into rpcs quickly */
+static void loi_list_maint(struct client_obd *cli, struct lov_oinfo *loi)
+{
+        on_list(&loi->loi_cli_item, &cli->cl_loi_ready_list,
+                lop_makes_rpc(cli, &loi->loi_write_lop, OBD_BRW_WRITE) ||
+                lop_makes_rpc(cli, &loi->loi_read_lop, OBD_BRW_READ));
+
+        on_list(&loi->loi_write_item, &cli->cl_loi_write_list,
+                loi->loi_write_lop.lop_num_pending);
+
+        on_list(&loi->loi_read_item, &cli->cl_loi_read_list,
+                loi->loi_read_lop.lop_num_pending);
+}
+
 static void lop_update_pending(struct client_obd *cli,
-                               struct loi_oap_pages *lop, int cmd, int delta);
+                               struct loi_oap_pages *lop, int cmd, int delta)
+{
+        lop->lop_num_pending += delta;
+        if (cmd & OBD_BRW_WRITE)
+                cli->cl_pending_w_pages += delta;
+        else
+                cli->cl_pending_r_pages += delta;
+}
 
 /* this is called when a sync waiter receives an interruption.  Its job is to
  * get the caller woken as soon as possible.  If its page hasn't been put in an
@@ -1257,7 +1339,7 @@ static void osc_occ_interrupted(struct oig_callback_context *occ)
                         list_del_init(&oap->oap_urgent_item);
 
                 loi = oap->oap_loi;
-                lop = (oap->oap_cmd == OBD_BRW_WRITE) ?
+                lop = (oap->oap_cmd & OBD_BRW_WRITE) ?
                         &loi->loi_write_lop : &loi->loi_read_lop;
                 lop_update_pending(oap->oap_cli, lop, oap->oap_cmd, -1);
                 loi_list_maint(oap->oap_cli, oap->oap_loi);
@@ -1272,7 +1354,7 @@ unlock:
 
 /* this is trying to propogate async writeback errors back up to the
  * application.  As an async write fails we record the error code for later if
- * the app does an fsync.  as long as errors persist we force future rpcs to be
+ * the app does an fsync.  As long as errors persist we force future rpcs to be
  * sync so that the app can get a sync error and break the cycle of queueing
  * pages for which writeback will fail. */
 static void osc_process_ar(struct osc_async_rc *ar, struct ptlrpc_request *req,
@@ -1301,7 +1383,7 @@ static void osc_ap_completion(struct client_obd *cli, struct obdo *oa,
         oap->oap_async_flags = 0;
         oap->oap_interrupted = 0;
 
-        if (oap->oap_cmd == OBD_BRW_WRITE) {
+        if (oap->oap_cmd & OBD_BRW_WRITE) {
                 osc_process_ar(&cli->cl_ar, oap->oap_request, rc);
                 osc_process_ar(&oap->oap_loi->loi_ar, oap->oap_request, rc);
         }
@@ -1424,18 +1506,6 @@ static struct ptlrpc_request *osc_build_req(struct client_obd *cli,
         LASSERT(ops != NULL);
         ops->ap_fill_obdo(caller_data, cmd, oa);
 
-        /* To enforce quota on oss, we need pass the client's user credit
-         * information to ost. We chose to store the fsuid and fsgid in
-         * oa->o_uid and oa->o_gid since the two fields haven't been used
-         * at present. And we chose one page's user credit information as
-         * the whole rpc's credit information. FIXME */
-        if (cmd == OBD_BRW_WRITE) {
-                struct lvfs_ucred ouc;
-                ops->ap_get_ucred(caller_data, &ouc);
-                oa->o_uid = ouc.luc_fsuid;
-                oa->o_gid = ouc.luc_fsgid;
-        }
-
         sort_brw_pages(pga, page_count);
         rc = osc_brw_prep_request(cmd, cli->cl_import, oa, NULL, page_count,
                                   pga, &requested_nob, &nio_count, &req);
@@ -1463,16 +1533,6 @@ out:
         RETURN(req);
 }
 
-static void lop_update_pending(struct client_obd *cli,
-                               struct loi_oap_pages *lop, int cmd, int delta)
-{
-        lop->lop_num_pending += delta;
-        if (cmd == OBD_BRW_WRITE)
-                cli->cl_pending_w_pages += delta;
-        else
-                cli->cl_pending_r_pages += delta;
-}
-
 /* the loi lock is held across this function but it's allowed to release
  * and reacquire it during its work */
 static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
@@ -1539,7 +1599,16 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
                 }
                 if (pos == NULL)
                         break;
-
+                /*
+                 * Page submitted for IO has to be locked. Either by
+                 * ->ap_make_ready() or by higher layers.
+                 *
+                 * XXX nikita: this assertion should be adjusted when lustre
+                 * starts using PG_writeback for pages being written out.
+                 */
+#if defined(__KERNEL__)
+                LASSERT(PageLocked(oap->oap_page));
+#endif
                 /* If there is a gap at the start of this page, it can't merge
                  * with any previous page, so we'll hand the network a
                  * "fragmented" page array that it can't transfer in 1 RDMA */
@@ -1552,7 +1621,7 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
                 list_del_init(&oap->oap_urgent_item);
 
                 if (page_count == 0)
-                        starting_offset = (oap->oap_obj_off + oap->oap_page_off) &
+                        starting_offset = (oap->oap_obj_off+oap->oap_page_off) &
                                           (PTLRPC_MAX_BRW_SIZE - 1);
 
                 /* ask the caller for the size of the io as the rpc leaves. */
@@ -1575,7 +1644,7 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
                  * RPCs aligned on PTLRPC_MAX_BRW_SIZE boundaries to help reads
                  * have the same alignment as the initial writes that allocated
                  * extents on the server. */
-                ending_offset = (oap->oap_obj_off + oap->oap_page_off + 
+                ending_offset = (oap->oap_obj_off + oap->oap_page_off +
                                  oap->oap_count) & (PTLRPC_MAX_BRW_SIZE - 1);
                 if (ending_offset == 0)
                         break;
@@ -1593,6 +1662,7 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
                 RETURN(0);
 
         loi_list_maint(cli, loi);
+
         spin_unlock(&cli->cl_loi_list_lock);
 
         request = osc_build_req(cli, &rpc_list, page_count, cmd);
@@ -1633,7 +1703,6 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
         list_splice(&rpc_list, &aa->aa_oaps);
         INIT_LIST_HEAD(&rpc_list);
 
-#ifdef LPROCFS
         if (cmd == OBD_BRW_READ) {
                 lprocfs_oh_tally_log2(&cli->cl_read_page_hist, page_count);
                 lprocfs_oh_tally(&cli->cl_read_rpc_hist, cli->cl_r_in_flight);
@@ -1646,7 +1715,6 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
                 lprocfs_oh_tally_log2(&cli->cl_write_offset_hist,
                                       starting_offset/PAGE_SIZE + 1);
         }
-#endif
 
         spin_lock(&cli->cl_loi_list_lock);
 
@@ -1654,6 +1722,7 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
                 cli->cl_r_in_flight++;
         else
                 cli->cl_w_in_flight++;
+
         /* queued sync pages can be torn down while the pages
          * were between the pending list and the rpc */
         list_for_each(pos, &aa->aa_oaps) {
@@ -1666,7 +1735,7 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
                 }
         }
 
-        CDEBUG(D_INODE, "req %p: %d pages, aa %p.  now %dr/%dw in flight\n", 
+        CDEBUG(D_INODE, "req %p: %d pages, aa %p.  now %dr/%dw in flight\n",
                         request, page_count, aa, cli->cl_r_in_flight,
                         cli->cl_w_in_flight);
 
@@ -1676,74 +1745,6 @@ static int osc_send_oap_rpc(struct client_obd *cli, struct lov_oinfo *loi,
         RETURN(1);
 }
 
-static int lop_makes_rpc(struct client_obd *cli, struct loi_oap_pages *lop,
-                         int cmd)
-{
-        int optimal;
-        ENTRY;
-
-        if (lop->lop_num_pending == 0)
-                RETURN(0);
-
-        /* if we have an invalid import we want to drain the queued pages
-         * by forcing them through rpcs that immediately fail and complete
-         * the pages.  recovery relies on this to empty the queued pages
-         * before canceling the locks and evicting down the llite pages */
-        if (cli->cl_import == NULL || cli->cl_import->imp_invalid)
-                RETURN(1);
-
-        /* stream rpcs in queue order as long as as there is an urgent page
-         * queued.  this is our cheap solution for good batching in the case
-         * where writepage marks some random page in the middle of the file as
-         * urgent because of, say, memory pressure */
-        if (!list_empty(&lop->lop_urgent))
-                RETURN(1);
-
-        /* fire off rpcs when we have 'optimal' rpcs as tuned for the wire. */
-        optimal = cli->cl_max_pages_per_rpc;
-        if (cmd == OBD_BRW_WRITE) {
-                /* trigger a write rpc stream as long as there are dirtiers
-                 * waiting for space.  as they're waiting, they're not going to
-                 * create more pages to coallesce with what's waiting.. */
-                if (!list_empty(&cli->cl_cache_waiters))
-                        RETURN(1);
-
-                /* *2 to avoid triggering rpcs that would want to include pages
-                 * that are being queued but which can't be made ready until
-                 * the queuer finishes with the page. this is a wart for
-                 * llite::commit_write() */
-                optimal += 16;
-        }
-        if (lop->lop_num_pending >= optimal)
-                RETURN(1);
-
-        RETURN(0);
-}
-
-static void on_list(struct list_head *item, struct list_head *list,
-                    int should_be_on)
-{
-        if (list_empty(item) && should_be_on)
-                list_add_tail(item, list);
-        else if (!list_empty(item) && !should_be_on)
-                list_del_init(item);
-}
-
-/* maintain the loi's cli list membership invariants so that osc_send_oap_rpc
- * can find pages to build into rpcs quickly */
-static void loi_list_maint(struct client_obd *cli, struct lov_oinfo *loi)
-{
-        on_list(&loi->loi_cli_item, &cli->cl_loi_ready_list,
-                lop_makes_rpc(cli, &loi->loi_write_lop, OBD_BRW_WRITE) ||
-                lop_makes_rpc(cli, &loi->loi_read_lop, OBD_BRW_READ));
-
-        on_list(&loi->loi_write_item, &cli->cl_loi_write_list,
-                loi->loi_write_lop.lop_num_pending);
-
-        on_list(&loi->loi_read_item, &cli->cl_loi_read_list,
-                loi->loi_read_lop.lop_num_pending);
-}
-
 #define LOI_DEBUG(LOI, STR, args...)                                     \
         CDEBUG(D_INODE, "loi ready %d wr %d:%d rd %d:%d " STR,           \
                !list_empty(&(LOI)->loi_cli_item),                        \
@@ -1903,7 +1904,7 @@ static int osc_enter_cache(struct client_obd *cli, struct lov_oinfo *loi,
                 osc_check_rpcs(cli);
                 spin_unlock(&cli->cl_loi_list_lock);
 
-                CDEBUG(0, "sleeping for cache space\n");
+                CDEBUG(D_CACHE, "sleeping for cache space\n");
                 l_wait_event(ocw.ocw_waitq, ocw_granted(cli, &ocw), &lwi);
 
                 spin_lock(&cli->cl_loi_list_lock);
@@ -2020,7 +2021,8 @@ static int osc_queue_async_io(struct obd_export *exp, struct lov_stripe_md *lsm,
                 RETURN(-EBUSY);
 
         /* check if the file's owner/group is over quota */
-        if (cmd == OBD_BRW_WRITE){
+#ifdef HAVE_QUOTA_SUPPORT
+        if ((cmd & OBD_BRW_WRITE) && !(cmd & OBD_BRW_NOQUOTA)){
                 struct obd_async_page_ops *ops;
                 struct obdo *oa = NULL;
 
@@ -2037,6 +2039,7 @@ static int osc_queue_async_io(struct obd_export *exp, struct lov_stripe_md *lsm,
                 if (rc)
                         RETURN(rc);
         }
+#endif
 
         if (loi == NULL)
                 loi = &lsm->lsm_oinfo[0];
@@ -2044,12 +2047,12 @@ static int osc_queue_async_io(struct obd_export *exp, struct lov_stripe_md *lsm,
         spin_lock(&cli->cl_loi_list_lock);
 
         oap->oap_cmd = cmd;
-        oap->oap_async_flags = async_flags;
         oap->oap_page_off = off;
         oap->oap_count = count;
         oap->oap_brw_flags = brw_flags;
+        oap->oap_async_flags = async_flags;
 
-        if (cmd == OBD_BRW_WRITE) {
+        if (cmd & OBD_BRW_WRITE) {
                 rc = osc_enter_cache(cli, loi, oap);
                 if (rc) {
                         spin_unlock(&cli->cl_loi_list_lock);
@@ -2100,7 +2103,7 @@ static int osc_set_async_flags(struct obd_export *exp,
         if (loi == NULL)
                 loi = &lsm->lsm_oinfo[0];
 
-        if (oap->oap_cmd == OBD_BRW_WRITE) {
+        if (oap->oap_cmd & OBD_BRW_WRITE) {
                 lop = &loi->loi_write_lop;
         } else {
                 lop = &loi->loi_read_lop;
@@ -2167,7 +2170,7 @@ static int osc_queue_group_io(struct obd_export *exp, struct lov_stripe_md *lsm,
         oap->oap_brw_flags = brw_flags;
         oap->oap_async_flags = async_flags;
 
-        if (cmd == OBD_BRW_WRITE)
+        if (cmd & OBD_BRW_WRITE)
                 lop = &loi->loi_write_lop;
         else
                 lop = &loi->loi_read_lop;
@@ -2240,7 +2243,7 @@ static int osc_teardown_async_page(struct obd_export *exp,
         if (loi == NULL)
                 loi = &lsm->lsm_oinfo[0];
 
-        if (oap->oap_cmd == OBD_BRW_WRITE) {
+        if (oap->oap_cmd & OBD_BRW_WRITE) {
                 lop = &loi->loi_write_lop;
         } else {
                 lop = &loi->loi_read_lop;
@@ -2406,6 +2409,7 @@ static int sanosc_brw_write(struct obd_export *exp, struct obdo *oa,
                             struct lov_stripe_md *lsm, obd_count page_count,
                             struct brw_page *pga)
 {
+        struct client_obd *cli = &exp->exp_obd->u.cli;
         struct ptlrpc_request *request = NULL;
         struct ost_body *body;
         struct niobuf_remote *nioptr;
@@ -2417,8 +2421,8 @@ static int sanosc_brw_write(struct obd_export *exp, struct obdo *oa,
         size[1] = sizeof(struct obd_ioobj);
         size[2] = page_count * sizeof(*nioptr);
 
-        request = ptlrpc_prep_req(class_exp2cliimp(exp), OST_SAN_WRITE,
-                                  3, size, NULL);
+        request = ptlrpc_prep_req_pool(class_exp2cliimp(exp), OST_SAN_WRITE,
+                                       3, size, NULL, cli->cl_rq_pool);
         if (!request)
                 RETURN(-ENOMEM);
 
@@ -2734,7 +2738,7 @@ static int osc_cancel(struct obd_export *exp, struct lov_stripe_md *md,
 {
         ENTRY;
 
-        if (mode == LCK_GROUP)
+        if (unlikely(mode == LCK_GROUP))
                 ldlm_lock_decref_and_cancel(lockh, mode);
         else
                 ldlm_lock_decref(lockh, mode);
@@ -2810,14 +2814,13 @@ static int osc_statfs(struct obd_device *obd, struct obd_statfs *osfs,
 static int osc_getstripe(struct lov_stripe_md *lsm, struct lov_user_md *lump)
 {
         struct lov_user_md lum, *lumk;
-        int rc, lum_size;
+        int rc = 0, lum_size;
         ENTRY;
 
         if (!lsm)
                 RETURN(-ENODATA);
 
-        rc = copy_from_user(&lum, lump, sizeof(lum));
-        if (rc)
+        if (copy_from_user(&lum, lump, sizeof(lum)))
                 RETURN(-EFAULT);
 
         if (lum.lmm_magic != LOV_USER_MAGIC)
@@ -2925,7 +2928,8 @@ static int osc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                 err = osc_poll_quotacheck(exp, (struct if_quotacheck *)karg);
                 GOTO(out, err);
         default:
-                CDEBUG(D_INODE, "unrecognised ioctl %#x by %s\n", cmd, current->comm);
+                CDEBUG(D_INODE, "unrecognised ioctl %#x by %s\n",
+                       cmd, current->comm);
                 GOTO(out, err = -ENOTTY);
         }
 out:
@@ -2986,8 +2990,8 @@ static int osc_set_info(struct obd_export *exp, obd_count keylen,
         struct obd_device  *obd = exp->exp_obd;
         struct obd_import *imp = class_exp2cliimp(exp);
         struct llog_ctxt *ctxt;
-        int rc, size = keylen;
-        char *bufs[1] = {key};
+        int rc, size[2] = {keylen, vallen};
+        char *bufs[2] = {key, val};
         ENTRY;
 
         OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_SHUTDOWN, 10);
@@ -3030,11 +3034,11 @@ static int osc_set_info(struct obd_export *exp, obd_count keylen,
                 RETURN(0);
         }
 
-        if (!KEY_IS("mds_conn"))
+        if (!KEY_IS("mds_conn") && !KEY_IS("evict_by_nid"))
                 RETURN(-EINVAL);
 
 
-        req = ptlrpc_prep_req(imp, OST_SET_INFO, 1, &size, bufs);
+        req = ptlrpc_prep_req(imp, OST_SET_INFO, 2, size, bufs);
         if (req == NULL)
                 RETURN(-ENOMEM);
 
@@ -3120,7 +3124,7 @@ static int osc_disconnect(struct obd_export *exp)
 }
 
 static int osc_import_event(struct obd_device *obd,
-                            struct obd_import *imp, 
+                            struct obd_import *imp,
                             enum obd_import_event event)
 {
         struct client_obd *cli;
@@ -3195,6 +3199,7 @@ int osc_setup(struct obd_device *obd, obd_count len, void *buf)
                 ptlrpcd_decref();
         } else {
                 struct lprocfs_static_vars lvars;
+                struct client_obd *cli = &obd->u.cli;
 
                 lprocfs_init_vars(osc, &lvars);
                 if (lprocfs_obd_setup(obd, lvars.obd_vars) == 0) {
@@ -3203,6 +3208,14 @@ int osc_setup(struct obd_device *obd, obd_count len, void *buf)
                 }
 
                 oscc_init(obd);
+                /* We need to allocate a few requests more, because
+                   brw_interpret_oap tries to create new requests before freeing
+                   previous ones. Ideally we want to have 2x max_rpcs_in_flight
+                   reserved, but I afraid that might be too much wasted RAM
+                   in fact, so 2 is just my guess and still should work. */
+                cli->cl_rq_pool = ptlrpc_init_rq_pool(cli->cl_max_rpcs_in_flight + 2,
+                                                      OST_MAXREQSIZE,
+                                                      ptlrpc_add_rqs_to_pool);
         }
 
         RETURN(rc);
@@ -3213,7 +3226,7 @@ static int osc_precleanup(struct obd_device *obd, int stage)
         int rc = 0;
         ENTRY;
 
-        if (stage < 2) 
+        if (stage < 2)
                 RETURN(0);
 
         rc = obd_llog_finish(obd, 0);
@@ -3236,10 +3249,12 @@ int osc_cleanup(struct obd_device *obd)
         oscc->oscc_flags &= ~OSCC_FLAG_RECOVERING;
         oscc->oscc_flags |= OSCC_FLAG_EXITING;
         spin_unlock(&oscc->oscc_lock);
-        
+
         /* free memory of osc quota cache */
         osc_qinfo_cleanup(cli);
 
+        ptlrpc_free_rq_pool(cli->cl_rq_pool);
+
         rc = client_obd_cleanup(obd);
         ptlrpcd_decref();
         RETURN(rc);
index bf64ba2..0210d29 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 #define DEBUG_SUBSYSTEM S_OST
index c04715d..73054be 100644 (file)
@@ -5,20 +5,23 @@
  *   Author: Peter J. Braam <braam@clusterfs.com>
  *   Author: Phil Schwan <phil@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  *  Storage Target Handling functions
  *  Lustre Object Server Module (OST)
@@ -56,6 +59,7 @@ void oti_init(struct obd_trans_info *oti, struct ptlrpc_request *req)
 
         if (req->rq_repmsg && req->rq_reqmsg != 0)
                 oti->oti_transno = req->rq_repmsg->transno;
+        oti->oti_thread = req->rq_svc_thread;
 }
 
 void oti_to_request(struct obd_trans_info *oti, struct ptlrpc_request *req)
@@ -254,6 +258,12 @@ static int get_per_page_niobufs(struct obd_ioobj *ioo, int nioo,
         int   rnbidx = 0;
         int   npages = 0;
 
+        /*
+         * array of sufficient size already preallocated by caller
+         */
+        LASSERT(pp_rnbp != NULL);
+        LASSERT(*pp_rnbp != NULL);
+
         /* first count and check the number of pages required */
         for (i = 0; i < nioo; i++)
                 for (j = 0; j < ioo->ioo_bufcnt; j++, rnbidx++) {
@@ -287,9 +297,7 @@ static int get_per_page_niobufs(struct obd_ioobj *ioo, int nioo,
                 return npages;
         }
 
-        OBD_ALLOC(pp_rnb, sizeof(*pp_rnb) * npages);
-        if (pp_rnb == NULL)
-                return -ENOMEM;
+        pp_rnb = *pp_rnbp;
 
         /* now do the actual split */
         page = rnbidx = 0;
@@ -328,50 +336,79 @@ static int get_per_page_niobufs(struct obd_ioobj *ioo, int nioo,
         }
         LASSERT(page == npages);
 
-        *pp_rnbp = pp_rnb;
         return npages;
 }
 
-static void free_per_page_niobufs (int npages, struct niobuf_remote *pp_rnb,
-                                   struct niobuf_remote *rnb)
-{
-        if (pp_rnb == rnb)                      /* didn't allocate above */
-                return;
-
-        OBD_FREE(pp_rnb, sizeof(*pp_rnb) * npages);
-}
-
 static __u32 ost_checksum_bulk(struct ptlrpc_bulk_desc *desc)
 {
         __u32 cksum = ~0;
         int i;
 
         for (i = 0; i < desc->bd_iov_count; i++) {
-#ifdef CRAY_PORTALS
-                char *ptr = desc->bd_iov[i].iov_base;
-                int len = desc->bd_iov[i].iov_len;
-#else
                 struct page *page = desc->bd_iov[i].kiov_page;
                 int off = desc->bd_iov[i].kiov_offset & ~PAGE_MASK;
                 char *ptr = kmap(page) + off;
                 int len = desc->bd_iov[i].kiov_len;
-#endif
 
                 cksum = crc32_le(cksum, ptr, len);
-#ifndef CRAY_PORTALS
-                kunmap(page);
-                LL_CDEBUG_PAGE(D_PAGE, page, "off %d checksum %x\n", off,cksum);
-#endif
         }
 
         return cksum;
 }
 
+/*
+ * populate @nio by @nrpages pages from per-thread page pool
+ */
+static void ost_nio_pages_get(struct ptlrpc_request *req,
+                              struct niobuf_local *nio, int nrpages)
+{
+        int i;
+        struct ost_thread_local_cache *tls;
+
+        ENTRY;
+
+        LASSERT(nrpages <= OST_THREAD_POOL_SIZE);
+        LASSERT(req != NULL);
+        LASSERT(req->rq_svc_thread != NULL);
+
+        tls = ost_tls(req);
+        LASSERT(tls != NULL);
+
+        memset(nio, 0, nrpages * sizeof *nio);
+        for (i = 0; i < nrpages; ++ i) {
+                struct page *page;
+
+                page = tls->page[i];
+                LASSERT(page != NULL);
+                POISON_PAGE(page, 0xf1);
+                nio[i].page = page;
+                LL_CDEBUG_PAGE(D_INFO, page, "%d\n", i);
+        }
+        EXIT;
+}
+
+/*
+ * Dual for ost_nio_pages_get(). Poison pages in pool for debugging
+ */
+static void ost_nio_pages_put(struct ptlrpc_request *req,
+                              struct niobuf_local *nio, int nrpages)
+{
+        int i;
+
+        ENTRY;
+
+        LASSERT(nrpages <= OST_THREAD_POOL_SIZE);
+
+        for (i = 0; i < nrpages; ++ i)
+                POISON_PAGE(nio[i].page, 0xf2);
+        EXIT;
+}
+
 static int ost_brw_read(struct ptlrpc_request *req, struct obd_trans_info *oti)
 {
         struct ptlrpc_bulk_desc *desc;
         struct niobuf_remote    *remote_nb;
-        struct niobuf_remote    *pp_rnb;
+        struct niobuf_remote    *pp_rnb = NULL;
         struct niobuf_local     *local_nb;
         struct obd_ioobj        *ioo;
         struct ost_body         *body, *repbody;
@@ -425,20 +462,27 @@ static int ost_brw_read(struct ptlrpc_request *req, struct obd_trans_info *oti)
         if (rc)
                 GOTO(out, rc);
 
+        /*
+         * Per-thread array of struct niobuf_{local,remote}'s was allocated by
+         * ost_thread_init().
+         */
+        local_nb = ost_tls(req)->local;
+        pp_rnb   = ost_tls(req)->remote;
+
         /* FIXME all niobuf splitting should be done in obdfilter if needed */
         /* CAVEAT EMPTOR this sets ioo->ioo_bufcnt to # pages */
         npages = get_per_page_niobufs(ioo, 1, remote_nb, niocount, &pp_rnb);
         if (npages < 0)
                 GOTO(out, rc = npages);
 
-        OBD_ALLOC(local_nb, sizeof(*local_nb) * npages);
-        if (local_nb == NULL)
-                GOTO(out_pp_rnb, rc = -ENOMEM);
+        LASSERT(npages <= OST_THREAD_POOL_SIZE);
+
+        ost_nio_pages_get(req, local_nb, npages);
 
         desc = ptlrpc_prep_bulk_exp (req, npages, 
                                      BULK_PUT_SOURCE, OST_BULK_PORTAL);
         if (desc == NULL)
-                GOTO(out_local, rc = -ENOMEM);
+                GOTO(out, rc = -ENOMEM);
 
         rc = obd_preprw(OBD_BRW_READ, req->rq_export, &body->oa, 1,
                         ioo, npages, pp_rnb, local_nb, oti);
@@ -458,7 +502,8 @@ static int ost_brw_read(struct ptlrpc_request *req, struct obd_trans_info *oti)
                         break;
                 }
 
-                LASSERT(page_rc <= pp_rnb[i].len);
+                LASSERTF(page_rc <= pp_rnb[i].len, "page_rc (%d) > "
+                         "pp_rnb[%d].len (%d)\n", page_rc, i, pp_rnb[i].len);
                 nob += page_rc;
                 if (page_rc != 0) {             /* some data! */
                         LASSERT (local_nb[i].page != NULL);
@@ -506,6 +551,8 @@ static int ost_brw_read(struct ptlrpc_request *req, struct obd_trans_info *oti)
         rc = obd_commitrw(OBD_BRW_READ, req->rq_export, &body->oa, 1,
                           ioo, npages, local_nb, oti, rc);
 
+        ost_nio_pages_put(req, local_nb, npages);
+
         if (rc == 0) {
                 repbody = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*repbody));
                 memcpy(&repbody->oa, &body->oa, sizeof(repbody->oa));
@@ -520,10 +567,6 @@ static int ost_brw_read(struct ptlrpc_request *req, struct obd_trans_info *oti)
 
  out_bulk:
         ptlrpc_free_bulk(desc);
- out_local:
-        OBD_FREE(local_nb, sizeof(*local_nb) * npages);
- out_pp_rnb:
-        free_per_page_niobufs(npages, pp_rnb, remote_nb);
  out:
         LASSERT(rc <= 0);
         if (rc == 0) {
@@ -636,20 +679,27 @@ static int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti)
                 GOTO(out, rc);
         rcs = lustre_msg_buf(req->rq_repmsg, 1, niocount * sizeof(*rcs));
 
+        /*
+         * Per-thread array of struct niobuf_{local,remote}'s was allocated by
+         * ost_thread_init().
+         */
+        local_nb = ost_tls(req)->local;
+        pp_rnb   = ost_tls(req)->remote;
+
         /* FIXME all niobuf splitting should be done in obdfilter if needed */
         /* CAVEAT EMPTOR this sets ioo->ioo_bufcnt to # pages */
         npages = get_per_page_niobufs(ioo, objcount,remote_nb,niocount,&pp_rnb);
         if (npages < 0)
                 GOTO(out, rc = npages);
 
-        OBD_ALLOC(local_nb, sizeof(*local_nb) * npages);
-        if (local_nb == NULL)
-                GOTO(out_pp_rnb, rc = -ENOMEM);
+        LASSERT(npages <= OST_THREAD_POOL_SIZE);
+
+        ost_nio_pages_get(req, local_nb, npages);
 
         desc = ptlrpc_prep_bulk_exp (req, npages, 
                                      BULK_GET_SINK, OST_BULK_PORTAL);
         if (desc == NULL)
-                GOTO(out_local, rc = -ENOMEM);
+                GOTO(out, rc = -ENOMEM);
 
         /* obd_preprw clobbers oa->valid, so save what we need */
         do_checksum = (body->oa.o_valid & OBD_MD_FLCKSUM);
@@ -723,6 +773,8 @@ static int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti)
         rc = obd_commitrw(OBD_BRW_WRITE, req->rq_export, &repbody->oa,
                            objcount, ioo, npages, local_nb, oti, rc);
 
+        ost_nio_pages_put(req, local_nb, npages);
+
         if (rc == 0) {
                 /* set per-requested niobuf return codes */
                 for (i = j = 0; i < niocount; i++) {
@@ -743,10 +795,6 @@ static int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti)
 
  out_bulk:
         ptlrpc_free_bulk(desc);
- out_local:
-        OBD_FREE(local_nb, sizeof(*local_nb) * npages);
- out_pp_rnb:
-        free_per_page_niobufs(npages, pp_rnb, remote_nb);
  out:
         if (rc == 0) {
                 oti_to_request(oti, req);
@@ -783,7 +831,7 @@ static int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti)
 
 static int ost_san_brw(struct ptlrpc_request *req, int cmd)
 {
-        struct niobuf_remote *remote_nb, *res_nb, *pp_rnb;
+        struct niobuf_remote *remote_nb, *res_nb, *pp_rnb = NULL;
         struct obd_ioobj *ioo;
         struct ost_body *body, *repbody;
         int rc, i, objcount, niocount, size[2] = {sizeof(*body)}, npages;
@@ -823,6 +871,12 @@ static int ost_san_brw(struct ptlrpc_request *req, int cmd)
                         lustre_swab_niobuf_remote (&remote_nb[i]);
         }
 
+        /*
+         * Per-thread array of struct niobuf_remote's was allocated by
+         * ost_thread_init().
+         */
+        pp_rnb = ost_tls(req)->remote;
+
         /* CAVEAT EMPTOR this sets ioo->ioo_bufcnt to # pages */
         npages = get_per_page_niobufs(ioo, objcount,remote_nb,niocount,&pp_rnb);
         if (npages < 0)
@@ -831,13 +885,13 @@ static int ost_san_brw(struct ptlrpc_request *req, int cmd)
         size[1] = npages * sizeof(*pp_rnb);
         rc = lustre_pack_reply(req, 2, size, NULL);
         if (rc)
-                GOTO(out_pp_rnb, rc);
+                GOTO(out, rc);
 
         req->rq_status = obd_san_preprw(cmd, req->rq_export, &body->oa,
                                         objcount, ioo, npages, pp_rnb);
 
         if (req->rq_status)
-                GOTO(out_pp_rnb, rc = 0);
+                GOTO(out, rc = 0);
 
         repbody = lustre_msg_buf(req->rq_repmsg, 0, sizeof(*repbody));
         memcpy(&repbody->oa, &body->oa, sizeof(body->oa));
@@ -845,8 +899,6 @@ static int ost_san_brw(struct ptlrpc_request *req, int cmd)
         res_nb = lustre_msg_buf(req->rq_repmsg, 1, size[1]);
         memcpy(res_nb, remote_nb, size[1]);
         rc = 0;
-out_pp_rnb:
-        free_per_page_niobufs(npages, pp_rnb, remote_nb);
 out:
         target_committed_to_req(req);
         if (rc) {
@@ -862,8 +914,8 @@ out:
 
 static int ost_set_info(struct obd_export *exp, struct ptlrpc_request *req)
 {
-        char *key;
-        int keylen, rc = 0;
+        char *key, *val = NULL;
+        int keylen, vallen, rc = 0;
         ENTRY;
 
         key = lustre_msg_buf(req->rq_reqmsg, 0, 1);
@@ -871,13 +923,25 @@ static int ost_set_info(struct obd_export *exp, struct ptlrpc_request *req)
                 DEBUG_REQ(D_HA, req, "no set_info key");
                 RETURN(-EFAULT);
         }
-        keylen = req->rq_reqmsg->buflens[0];
+        keylen = lustre_msg_buflen(req->rq_reqmsg,0);
 
         rc = lustre_pack_reply(req, 0, NULL, NULL);
         if (rc)
                 RETURN(rc);
 
-        rc = obd_set_info(exp, keylen, key, 0, NULL);
+        vallen = lustre_msg_buflen(req->rq_reqmsg, 1);
+        if (vallen)
+                val = lustre_msg_buf(req->rq_reqmsg, 1, 0);
+
+        if (KEY_IS("evict_by_nid")) {
+                if (val && vallen)
+                        obd_export_evict_by_nid(exp->exp_obd, val);
+
+                GOTO(out, rc = 0);
+        }
+
+        rc = obd_set_info(exp, keylen, key, vallen, val);
+out:
         req->rq_repmsg->status = 0;
         RETURN(rc);
 }
@@ -1159,6 +1223,71 @@ out:
         return 0;
 }
 
+/*
+ * free per-thread pool created by ost_thread_init().
+ */
+static void ost_thread_done(struct ptlrpc_thread *thread)
+{
+        int i;
+        struct ost_thread_local_cache *tls; /* TLS stands for Thread-Local
+                                             * Storage */
+
+        ENTRY;
+
+        LASSERT(thread != NULL);
+        LASSERT(thread->t_data != NULL);
+
+        /*
+         * be prepared to handle partially-initialized pools (because this is
+         * called from ost_thread_init() for cleanup.
+         */
+        tls = thread->t_data;
+        if (tls != NULL) {
+                for (i = 0; i < OST_THREAD_POOL_SIZE; ++ i) {
+                        if (tls->page[i] != NULL)
+                                __free_page(tls->page[i]);
+                }
+                OBD_FREE_PTR(tls);
+                thread->t_data = NULL;
+        }
+        EXIT;
+}
+
+/*
+ * initialize per-thread page pool (bug 5137).
+ */
+static int ost_thread_init(struct ptlrpc_thread *thread)
+{
+        int result;
+        int i;
+        struct ost_thread_local_cache *tls;
+
+        ENTRY;
+
+        LASSERT(thread != NULL);
+        LASSERT(thread->t_data == NULL);
+        LASSERT(thread->t_id < OST_NUM_THREADS);
+
+        OBD_ALLOC_PTR(tls);
+        if (tls != NULL) {
+                result = 0;
+                thread->t_data = tls;
+                /*
+                 * populate pool
+                 */
+                for (i = 0; i < OST_THREAD_POOL_SIZE; ++ i) {
+                        tls->page[i] = alloc_page(OST_THREAD_POOL_GFP);
+                        if (tls->page[i] == NULL) {
+                                ost_thread_done(thread);
+                                result = -ENOMEM;
+                                break;
+                        }
+                }
+        } else
+                result = -ENOMEM;
+        RETURN(result);
+}
+
 static int ost_setup(struct obd_device *obd, obd_count len, void *buf)
 {
         struct ost_obd *ost = &obd->u.ost;
@@ -1177,33 +1306,39 @@ static int ost_setup(struct obd_device *obd, obd_count len, void *buf)
         lprocfs_init_vars(ost, &lvars);
         lprocfs_obd_setup(obd, lvars.obd_vars);
 
+        sema_init(&ost->ost_health_sem, 1);
+
         ost->ost_service =
                 ptlrpc_init_svc(OST_NBUFS, OST_BUFSIZE, OST_MAXREQSIZE,
-                                OST_REQUEST_PORTAL, OSC_REPLY_PORTAL,
+                                OST_MAXREPSIZE, OST_REQUEST_PORTAL,
+                                OSC_REPLY_PORTAL,
                                 obd_timeout * 1000, ost_handle, "ost",
-                                obd->obd_proc_entry, ost_print_req);
+                                obd->obd_proc_entry, ost_print_req,
+                                OST_NUM_THREADS);
         if (ost->ost_service == NULL) {
                 CERROR("failed to start service\n");
                 GOTO(out_lprocfs, rc = -ENOMEM);
         }
 
-        rc = ptlrpc_start_n_threads(obd, ost->ost_service, OST_NUM_THREADS,
-                                    "ll_ost");
+        ost->ost_service->srv_init = ost_thread_init;
+        ost->ost_service->srv_done = ost_thread_done;
+        rc = ptlrpc_start_threads(obd, ost->ost_service, "ll_ost");
         if (rc)
                 GOTO(out_service, rc = -EINVAL);
 
         ost->ost_create_service =
                 ptlrpc_init_svc(OST_NBUFS, OST_BUFSIZE, OST_MAXREQSIZE,
-                                OST_CREATE_PORTAL, OSC_REPLY_PORTAL,
+                                OST_MAXREPSIZE, OST_CREATE_PORTAL,
+                                OSC_REPLY_PORTAL,
                                 obd_timeout * 1000, ost_handle, "ost_create",
-                                obd->obd_proc_entry, ost_print_req);
+                                obd->obd_proc_entry, ost_print_req, 1);
         if (ost->ost_create_service == NULL) {
                 CERROR("failed to start OST create service\n");
                 GOTO(out_service, rc = -ENOMEM);
         }
 
-        rc = ptlrpc_start_n_threads(obd, ost->ost_create_service, 1,
-                                    "ll_ost_creat");
+        rc = ptlrpc_start_threads(obd, ost->ost_create_service,
+                                  "ll_ost_creat");
         if (rc)
                 GOTO(out_create, rc = -EINVAL);
 
@@ -1211,8 +1346,10 @@ static int ost_setup(struct obd_device *obd, obd_count len, void *buf)
 
 out_create:
         ptlrpc_unregister_service(ost->ost_create_service);
+        ost->ost_create_service = NULL;
 out_service:
         ptlrpc_unregister_service(ost->ost_service);
+        ost->ost_service = NULL;
 out_lprocfs:
         lprocfs_obd_cleanup(obd);
         RETURN(rc);
@@ -1231,19 +1368,49 @@ static int ost_cleanup(struct obd_device *obd)
         }
         spin_unlock_bh(&obd->obd_processing_task_lock);
 
+        down(&ost->ost_health_sem);
         ptlrpc_unregister_service(ost->ost_service);
         ptlrpc_unregister_service(ost->ost_create_service);
+        ost->ost_service = NULL;
+        ost->ost_create_service = NULL;
+        up(&ost->ost_health_sem);
 
         lprocfs_obd_cleanup(obd);
 
         RETURN(err);
 }
 
+static int ost_health_check(struct obd_device *obd)
+{
+        struct ost_obd *ost = &obd->u.ost;
+        int rc = 0;
+
+        down(&ost->ost_health_sem);
+        rc |= ptlrpc_service_health_check(ost->ost_service);
+        rc |= ptlrpc_service_health_check(ost->ost_create_service);
+        up(&ost->ost_health_sem);
+
+        /*
+         * health_check to return 0 on healthy
+         * and 1 on unhealthy.
+         */
+        if( rc != 0)
+                rc = 1;
+
+        return rc;
+}
+
+struct ost_thread_local_cache *ost_tls(struct ptlrpc_request *r)
+{
+        return (struct ost_thread_local_cache *)(r->rq_svc_thread->t_data);
+}
+
 /* use obd ops to offer management infrastructure */
 static struct obd_ops ost_obd_ops = {
         .o_owner        = THIS_MODULE,
         .o_setup        = ost_setup,
         .o_cleanup      = ost_cleanup,
+        .o_health_check = ost_health_check,
 };
 
 static int __init ost_init(void)
index 9f31f25..9c7fecc 100644 (file)
@@ -11,6 +11,40 @@ extern void ost_print_req(void *seq_file, struct ptlrpc_request *req);
 # define ost_print_req NULL
 #endif
 
+/*
+ * tunables for per-thread page pool (bug 5137)
+ */
+enum {
+        /*
+         * pool size in pages
+         */
+        OST_THREAD_POOL_SIZE = PTLRPC_MAX_BRW_PAGES,
+        /*
+         * GFP mask used to allocate pages for pool
+         */
+        OST_THREAD_POOL_GFP  = GFP_HIGHUSER
+};
+
+struct page;
+struct niobuf_local;
+struct niobuf_remote;
+struct ptlrpc_request;
+
+/*
+ * struct ost_thread_local_cache is allocated and initialized for each OST
+ * thread by ost_thread_init().
+ */
+struct ost_thread_local_cache {
+        /*
+         * pool of pages and nio buffers used by write-path
+         */
+        struct page          *page  [OST_THREAD_POOL_SIZE];
+        struct niobuf_local   local [OST_THREAD_POOL_SIZE];
+        struct niobuf_remote  remote[OST_THREAD_POOL_SIZE];
+};
+
+struct ost_thread_local_cache *ost_tls(struct ptlrpc_request *r);
+
 #ifdef HAVE_QUOTA_SUPPORT
 /* Quota stuff */
 int ost_quotacheck(struct ptlrpc_request *req);
index db0dc82..3016b20 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -46,7 +49,7 @@ void ptlrpc_init_client(int req_portal, int rep_portal, char *name,
 struct ptlrpc_connection *ptlrpc_uuid_to_connection(struct obd_uuid *uuid)
 {
         struct ptlrpc_connection *c;
-        ptl_process_id_t          peer;
+        lnet_process_id_t          peer;
         int                       err;
 
         err = ptlrpc_uuid_to_peer(uuid, &peer);
@@ -69,7 +72,7 @@ struct ptlrpc_connection *ptlrpc_uuid_to_connection(struct obd_uuid *uuid)
 void ptlrpc_readdress_connection(struct ptlrpc_connection *conn,
                                  struct obd_uuid *uuid)
 {
-        ptl_process_id_t peer;
+        lnet_process_id_t peer;
         int              err;
 
         err = ptlrpc_uuid_to_peer(uuid, &peer);
@@ -94,7 +97,7 @@ static inline struct ptlrpc_bulk_desc *new_bulk(int npages, int type, int portal
         init_waitqueue_head(&desc->bd_waitq);
         desc->bd_max_iov = npages;
         desc->bd_iov_count = 0;
-        desc->bd_md_h = PTL_INVALID_HANDLE;
+        desc->bd_md_h = LNET_INVALID_HANDLE;
         desc->bd_portal = portal;
         desc->bd_type = type;
 
@@ -181,10 +184,126 @@ void ptlrpc_free_bulk(struct ptlrpc_bulk_desc *desc)
         EXIT;
 }
 
-struct ptlrpc_request *ptlrpc_prep_req(struct obd_import *imp, int opcode,
-                                       int count, int *lengths, char **bufs)
+void ptlrpc_free_rq_pool(struct ptlrpc_request_pool *pool)
+{
+        struct list_head *l, *tmp;
+        struct ptlrpc_request *req;
+
+        if (!pool)
+                return;
+
+        list_for_each_safe(l, tmp, &pool->prp_req_list) {
+                req = list_entry(l, struct ptlrpc_request, rq_list);
+                list_del(&req->rq_list);
+                LASSERT (req->rq_reqmsg);
+                OBD_FREE(req->rq_reqmsg, pool->prp_rq_size);
+                OBD_FREE(req, sizeof(*req));
+        }
+        OBD_FREE(pool, sizeof(*pool));
+}
+
+void ptlrpc_add_rqs_to_pool(struct ptlrpc_request_pool *pool, int num_rq)
+{
+        int i;
+        int size = 1;
+
+        while (size < pool->prp_rq_size)
+                size <<= 1;
+
+        LASSERTF(list_empty(&pool->prp_req_list) || size == pool->prp_rq_size,
+                 "Trying to change pool size with nonempty pool "
+                 "from %d to %d bytes\n", pool->prp_rq_size, size);
+
+        spin_lock(&pool->prp_lock);
+        pool->prp_rq_size = size;
+        for (i = 0; i < num_rq; i++) {
+                struct ptlrpc_request *req;
+                struct lustre_msg *msg;
+                OBD_ALLOC(req, sizeof(struct ptlrpc_request));
+                if (!req)
+                        goto out;
+                OBD_ALLOC_GFP(msg, size, GFP_KERNEL);
+                if (!msg) {
+                        OBD_FREE(req, sizeof(struct ptlrpc_request));
+                        goto out;
+                }
+                req->rq_reqmsg = msg;
+                req->rq_pool = pool;
+                list_add_tail(&req->rq_list, &pool->prp_req_list);
+        }
+out:
+        spin_unlock(&pool->prp_lock);
+        return;
+}
+
+struct ptlrpc_request_pool *ptlrpc_init_rq_pool(int num_rq, int msgsize,
+                                                void (*populate_pool)(struct ptlrpc_request_pool *, int))
+{
+        struct ptlrpc_request_pool *pool;
+
+        OBD_ALLOC(pool, sizeof (struct ptlrpc_request_pool));
+        if (!pool)
+                return NULL;
+
+        /* Request next power of two for the allocation, because internally
+           kernel would do exactly this */
+
+        spin_lock_init(&pool->prp_lock);
+        INIT_LIST_HEAD(&pool->prp_req_list);
+        pool->prp_rq_size = msgsize;
+        pool->prp_populate = populate_pool;
+
+        populate_pool(pool, num_rq);
+
+        if (list_empty(&pool->prp_req_list)) {
+                /* have not allocated a single request for the pool */
+                OBD_FREE(pool, sizeof (struct ptlrpc_request_pool));
+                pool = NULL;
+        }
+        return pool;
+}
+
+static struct ptlrpc_request *ptlrpc_prep_req_from_pool(struct ptlrpc_request_pool *pool)
 {
         struct ptlrpc_request *request;
+        struct lustre_msg *reqmsg;
+
+        if (!pool)
+                return NULL;
+
+        spin_lock(&pool->prp_lock);
+
+        /* See if we have anything in a pool, and bail out if nothing,
+         * in writeout path, where this matters, this is safe to do, because
+         * nothing is lost in this case, and when some in-flight requests
+         * complete, this code will be called again. */
+        if (unlikely(list_empty(&pool->prp_req_list))) {
+                spin_unlock(&pool->prp_lock);
+                return NULL;
+        }
+
+        request = list_entry(pool->prp_req_list.next, struct ptlrpc_request,
+                             rq_list);
+        list_del(&request->rq_list);
+        spin_unlock(&pool->prp_lock);
+
+        LASSERT(request->rq_reqmsg);
+        LASSERT(request->rq_pool);
+
+        reqmsg = request->rq_reqmsg;
+        memset(request, 0, sizeof(*request));
+        request->rq_reqmsg = reqmsg;
+        request->rq_pool = pool;
+        request->rq_reqlen = pool->prp_rq_size;
+        return request;
+}
+
+struct ptlrpc_request *ptlrpc_prep_req_pool(struct obd_import *imp, int opcode,
+                                            int count, int *lengths,
+                                            char **bufs,
+                                            struct ptlrpc_request_pool *pool)
+{
+        struct ptlrpc_request *request = NULL;
         int rc;
         ENTRY;
 
@@ -193,7 +312,12 @@ struct ptlrpc_request *ptlrpc_prep_req(struct obd_import *imp, int opcode,
         LASSERT((unsigned long)imp->imp_client > 0x1000);
         LASSERT(imp->imp_client != LP_POISON);
 
-        OBD_ALLOC(request, sizeof(*request));
+        if (pool)
+                request = ptlrpc_prep_req_from_pool(pool);
+
+        if (!request)
+                OBD_ALLOC(request, sizeof(*request));
+
         if (!request) {
                 CERROR("request allocation out of memory\n");
                 RETURN(NULL);
@@ -201,7 +325,7 @@ struct ptlrpc_request *ptlrpc_prep_req(struct obd_import *imp, int opcode,
 
         rc = lustre_pack_request(request, count, lengths, bufs);
         if (rc) {
-                CERROR("cannot pack request %d\n", rc);
+                LASSERT(!request->rq_pool);
                 OBD_FREE(request, sizeof(*request));
                 RETURN(NULL);
         }
@@ -241,6 +365,13 @@ struct ptlrpc_request *ptlrpc_prep_req(struct obd_import *imp, int opcode,
         RETURN(request);
 }
 
+struct ptlrpc_request *ptlrpc_prep_req(struct obd_import *imp, int opcode,
+                                       int count, int *lengths, char **bufs)
+{
+        return ptlrpc_prep_req_pool(imp, opcode, count, lengths, bufs, NULL);
+}
+
+
 struct ptlrpc_request_set *ptlrpc_prep_set(void)
 {
         struct ptlrpc_request_set *set;
@@ -501,8 +632,11 @@ static int after_reply(struct ptlrpc_request *req)
                 spin_lock_irqsave(&imp->imp_lock, flags);
                 if (req->rq_transno != 0)
                         ptlrpc_retain_replayable_request(req, imp);
-                else if (req->rq_commit_cb != NULL)
+                else if (req->rq_commit_cb != NULL) {
+                        spin_unlock_irqrestore(&imp->imp_lock, flags);
                         req->rq_commit_cb(req);
+                        spin_lock_irqsave(&imp->imp_lock, flags);
+               }
 
                 if (req->rq_transno > imp->imp_max_transno)
                         imp->imp_max_transno = req->rq_transno;
@@ -813,7 +947,7 @@ int ptlrpc_expire_one_request(struct ptlrpc_request *req)
         ptlrpc_unregister_reply (req);
 
         if (obd_dump_on_timeout)
-                portals_debug_dumplog();
+                libcfs_debug_dumplog();
 
         if (req->rq_bulk != NULL)
                 ptlrpc_unregister_bulk (req);
@@ -994,6 +1128,15 @@ int ptlrpc_set_wait(struct ptlrpc_request_set *set)
         RETURN(rc);
 }
 
+static void __ptlrpc_free_req_to_pool(struct ptlrpc_request *request)
+{
+        struct ptlrpc_request_pool *pool = request->rq_pool;
+
+        spin_lock(&pool->prp_lock);
+        list_add_tail(&request->rq_list, &pool->prp_req_list);
+        spin_unlock(&pool->prp_lock);
+}
+
 static void __ptlrpc_free_req(struct ptlrpc_request *request, int locked)
 {
         ENTRY;
@@ -1030,10 +1173,6 @@ static void __ptlrpc_free_req(struct ptlrpc_request *request, int locked)
                 OBD_FREE(request->rq_repmsg, request->rq_replen);
                 request->rq_repmsg = NULL;
         }
-        if (request->rq_reqmsg != NULL) {
-                OBD_FREE(request->rq_reqmsg, request->rq_reqlen);
-                request->rq_reqmsg = NULL;
-        }
         if (request->rq_export != NULL) {
                 class_export_put(request->rq_export);
                 request->rq_export = NULL;
@@ -1045,7 +1184,15 @@ static void __ptlrpc_free_req(struct ptlrpc_request *request, int locked)
         if (request->rq_bulk != NULL)
                 ptlrpc_free_bulk(request->rq_bulk);
 
-        OBD_FREE(request, sizeof(*request));
+        if (request->rq_pool) {
+                __ptlrpc_free_req_to_pool(request);
+        } else {
+                if (request->rq_reqmsg != NULL) {
+                        OBD_FREE(request->rq_reqmsg, request->rq_reqlen);
+                        request->rq_reqmsg = NULL;
+                }
+                OBD_FREE(request, sizeof(*request));
+        }
         EXIT;
 }
 
@@ -1112,7 +1259,7 @@ void ptlrpc_unregister_reply (struct ptlrpc_request *request)
         if (!ptlrpc_client_receiving_reply(request))
                 return;
 
-        PtlMDUnlink (request->rq_reply_md_h);
+        LNetMDUnlink (request->rq_reply_md_h);
 
         /* We have to l_wait_event() whatever the result, to give liblustre
          * a chance to run reply_in_callback() */
index 886e18e..4bd52d2 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -50,7 +53,7 @@ void ptlrpc_dump_connections(void)
         EXIT;
 }
 
-struct ptlrpc_connection *ptlrpc_get_connection(ptl_process_id_t peer,
+struct ptlrpc_connection *ptlrpc_get_connection(lnet_process_id_t peer,
                                                 struct obd_uuid *uuid)
 {
         struct list_head *tmp, *pos;
index f1ef597..5c77baa 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
 #include <linux/lustre_net.h>
 #include "ptlrpc_internal.h"
 
-#if !defined(__KERNEL__) && CRAY_PORTALS
-/* forward ref in events.c */
-static void cray_portals_callback(ptl_event_t *ev);
-#endif
-
-ptl_handle_ni_t   ptlrpc_ni_h;
-ptl_handle_eq_t   ptlrpc_eq_h;
+lnet_handle_eq_t   ptlrpc_eq_h;
 
 /*  
  *  Client's outgoing request callback
  */
-void request_out_callback(ptl_event_t *ev)
+void request_out_callback(lnet_event_t *ev)
 {
         struct ptlrpc_cb_id   *cbid = ev->md.user_ptr;
         struct ptlrpc_request *req = cbid->cbid_arg;
         unsigned long          flags;
         ENTRY;
 
-        LASSERT (ev->type == PTL_EVENT_SEND_END ||
-                 ev->type == PTL_EVENT_UNLINK);
+        LASSERT (ev->type == LNET_EVENT_SEND ||
+                 ev->type == LNET_EVENT_UNLINK);
         LASSERT (ev->unlinked);
 
-        DEBUG_REQ((ev->ni_fail_type == PTL_NI_OK) ? D_NET : D_ERROR, req,
-                  "type %d, status %d", ev->type, ev->ni_fail_type);
+        DEBUG_REQ((ev->status == 0) ? D_NET : D_ERROR, req,
+                  "type %d, status %d", ev->type, ev->status);
 
-        if (ev->type == PTL_EVENT_UNLINK ||
-            ev->ni_fail_type != PTL_NI_OK) {
+        if (ev->type == LNET_EVENT_UNLINK || ev->status != 0) {
 
                 /* Failed send: make it seem like the reply timed out, just
                  * like failing sends in client.c does currently...  */
@@ -77,30 +73,29 @@ void request_out_callback(ptl_event_t *ev)
 /*
  * Client's incoming reply callback
  */
-void reply_in_callback(ptl_event_t *ev)
+void reply_in_callback(lnet_event_t *ev)
 {
         struct ptlrpc_cb_id   *cbid = ev->md.user_ptr;
         struct ptlrpc_request *req = cbid->cbid_arg;
         unsigned long flags;
         ENTRY;
 
-        LASSERT (ev->type == PTL_EVENT_PUT_END ||
-                 ev->type == PTL_EVENT_UNLINK);
+        LASSERT (ev->type == LNET_EVENT_PUT ||
+                 ev->type == LNET_EVENT_UNLINK);
         LASSERT (ev->unlinked);
         LASSERT (ev->md.start == req->rq_repmsg);
         LASSERT (ev->offset == 0);
         LASSERT (ev->mlength <= req->rq_replen);
         
-        DEBUG_REQ((ev->ni_fail_type == PTL_NI_OK) ? D_NET : D_ERROR, req,
-                  "type %d, status %d", ev->type, ev->ni_fail_type);
+        DEBUG_REQ((ev->status == 0) ? D_NET : D_ERROR, req,
+                  "type %d, status %d", ev->type, ev->status);
 
         spin_lock_irqsave (&req->rq_lock, flags);
 
         LASSERT (req->rq_receiving_reply);
         req->rq_receiving_reply = 0;
 
-        if (ev->type == PTL_EVENT_PUT_END &&
-            ev->ni_fail_type == PTL_NI_OK) {
+        if (ev->type == LNET_EVENT_PUT && ev->status == 0) {
                 req->rq_replied = 1;
                 req->rq_nob_received = ev->mlength;
         }
@@ -116,7 +111,7 @@ void reply_in_callback(ptl_event_t *ev)
 /* 
  * Client's bulk has been written/read
  */
-void client_bulk_callback (ptl_event_t *ev)
+void client_bulk_callback (lnet_event_t *ev)
 {
         struct ptlrpc_cb_id     *cbid = ev->md.user_ptr;
         struct ptlrpc_bulk_desc *desc = cbid->cbid_arg;
@@ -124,23 +119,22 @@ void client_bulk_callback (ptl_event_t *ev)
         ENTRY;
 
         LASSERT ((desc->bd_type == BULK_PUT_SINK && 
-                  ev->type == PTL_EVENT_PUT_END) ||
+                  ev->type == LNET_EVENT_PUT) ||
                  (desc->bd_type == BULK_GET_SOURCE &&
-                  ev->type == PTL_EVENT_GET_END) ||
-                 ev->type == PTL_EVENT_UNLINK);
+                  ev->type == LNET_EVENT_GET) ||
+                 ev->type == LNET_EVENT_UNLINK);
         LASSERT (ev->unlinked);
 
-        CDEBUG((ev->ni_fail_type == PTL_NI_OK) ? D_NET : D_ERROR,
+        CDEBUG((ev->status == 0) ? D_NET : D_ERROR,
                "event type %d, status %d, desc %p\n", 
-               ev->type, ev->ni_fail_type, desc);
+               ev->type, ev->status, desc);
 
         spin_lock_irqsave (&desc->bd_lock, flags);
 
         LASSERT(desc->bd_network_rw);
         desc->bd_network_rw = 0;
 
-        if (ev->type != PTL_EVENT_UNLINK &&
-            ev->ni_fail_type == PTL_NI_OK) {
+        if (ev->type != LNET_EVENT_UNLINK && ev->status == 0) {
                 desc->bd_success = 1;
                 desc->bd_nob_transferred = ev->mlength;
         }
@@ -156,7 +150,7 @@ void client_bulk_callback (ptl_event_t *ev)
 /* 
  * Server's incoming request callback
  */
-void request_in_callback(ptl_event_t *ev)
+void request_in_callback(lnet_event_t *ev)
 {
         struct ptlrpc_cb_id               *cbid = ev->md.user_ptr;
         struct ptlrpc_request_buffer_desc *rqbd = cbid->cbid_arg;
@@ -165,15 +159,15 @@ void request_in_callback(ptl_event_t *ev)
         unsigned long                     flags;
         ENTRY;
 
-        LASSERT (ev->type == PTL_EVENT_PUT_END ||
-                 ev->type == PTL_EVENT_UNLINK);
+        LASSERT (ev->type == LNET_EVENT_PUT ||
+                 ev->type == LNET_EVENT_UNLINK);
         LASSERT ((char *)ev->md.start >= rqbd->rqbd_buffer);
         LASSERT ((char *)ev->md.start + ev->offset + ev->mlength <=
                  rqbd->rqbd_buffer + service->srv_buf_size);
 
-        CDEBUG((ev->ni_fail_type == PTL_OK) ? D_NET : D_ERROR,
+        CDEBUG((ev->status == 0) ? D_NET : D_ERROR,
                "event type %d, status %d, service %s\n", 
-               ev->type, ev->ni_fail_type, service->srv_name);
+               ev->type, ev->status, service->srv_name);
 
         if (ev->unlinked) {
                 /* If this is the last request message to fit in the
@@ -184,8 +178,8 @@ void request_in_callback(ptl_event_t *ev)
                 req = &rqbd->rqbd_req;
                 memset(req, 0, sizeof (*req));
         } else {
-                LASSERT (ev->type == PTL_EVENT_PUT_END);
-                if (ev->ni_fail_type != PTL_NI_OK) {
+                LASSERT (ev->type == LNET_EVENT_PUT);
+                if (ev->status != 0) {
                         /* We moaned above already... */
                         return;
                 }
@@ -204,17 +198,16 @@ void request_in_callback(ptl_event_t *ev)
          * size to non-zero if this was a successful receive. */
         req->rq_xid = ev->match_bits;
         req->rq_reqmsg = ev->md.start + ev->offset;
-        if (ev->type == PTL_EVENT_PUT_END &&
-            ev->ni_fail_type == PTL_NI_OK)
+        if (ev->type == LNET_EVENT_PUT && ev->status == 0)
                 req->rq_reqlen = ev->mlength;
         do_gettimeofday(&req->rq_arrival_time);
         req->rq_peer = ev->initiator;
         req->rq_rqbd = rqbd;
         req->rq_phase = RQ_PHASE_NEW;
-#if CRAY_PORTALS
+#if CRAY_XT3
         req->rq_uid = ev->uid;
 #endif
-        
+
         spin_lock_irqsave (&service->srv_lock, flags);
 
         req->rq_history_seq = service->srv_request_seq++;
@@ -222,14 +215,14 @@ void request_in_callback(ptl_event_t *ev)
 
         if (ev->unlinked) {
                 service->srv_nrqbd_receiving--;
-                if (ev->type != PTL_EVENT_UNLINK &&
+                if (ev->type != LNET_EVENT_UNLINK &&
                     service->srv_nrqbd_receiving == 0) {
                         /* This service is off-air because all its request
                          * buffers are busy.  Portals will start dropping
                          * incoming requests until more buffers get posted.  
                          * NB don't moan if it's because we're tearing down the
                          * service. */
-                        CWARN("All %s request buffers busy\n",
+                        CERROR("All %s request buffers busy\n",
                               service->srv_name);
                 }
                 /* req takes over the network's ref on rqbd */
@@ -249,10 +242,10 @@ void request_in_callback(ptl_event_t *ev)
         EXIT;
 }
 
-/*  
+/*
  *  Server's outgoing reply callback
  */
-void reply_out_callback(ptl_event_t *ev)
+void reply_out_callback(lnet_event_t *ev)
 {
         struct ptlrpc_cb_id       *cbid = ev->md.user_ptr;
         struct ptlrpc_reply_state *rs = cbid->cbid_arg;
@@ -260,9 +253,9 @@ void reply_out_callback(ptl_event_t *ev)
         unsigned long              flags;
         ENTRY;
 
-        LASSERT (ev->type == PTL_EVENT_SEND_END ||
-                 ev->type == PTL_EVENT_ACK ||
-                 ev->type == PTL_EVENT_UNLINK);
+        LASSERT (ev->type == LNET_EVENT_SEND ||
+                 ev->type == LNET_EVENT_ACK ||
+                 ev->type == LNET_EVENT_UNLINK);
 
         if (!rs->rs_difficult) {
                 /* 'Easy' replies have no further processing so I drop the
@@ -291,29 +284,29 @@ void reply_out_callback(ptl_event_t *ev)
 /*
  * Server's bulk completion callback
  */
-void server_bulk_callback (ptl_event_t *ev)
+void server_bulk_callback (lnet_event_t *ev)
 {
         struct ptlrpc_cb_id     *cbid = ev->md.user_ptr;
         struct ptlrpc_bulk_desc *desc = cbid->cbid_arg;
         unsigned long            flags;
         ENTRY;
 
-        LASSERT (ev->type == PTL_EVENT_SEND_END ||
-                 ev->type == PTL_EVENT_UNLINK ||
+        LASSERT (ev->type == LNET_EVENT_SEND ||
+                 ev->type == LNET_EVENT_UNLINK ||
                  (desc->bd_type == BULK_PUT_SOURCE &&
-                  ev->type == PTL_EVENT_ACK) ||
+                  ev->type == LNET_EVENT_ACK) ||
                  (desc->bd_type == BULK_GET_SINK &&
-                  ev->type == PTL_EVENT_REPLY_END));
+                  ev->type == LNET_EVENT_REPLY));
 
-        CDEBUG((ev->ni_fail_type == PTL_NI_OK) ? D_NET : D_ERROR,
+        CDEBUG((ev->status == 0) ? D_NET : D_ERROR,
                "event type %d, status %d, desc %p\n", 
-               ev->type, ev->ni_fail_type, desc);
+               ev->type, ev->status, desc);
 
         spin_lock_irqsave (&desc->bd_lock, flags);
         
-        if ((ev->type == PTL_EVENT_ACK ||
-             ev->type == PTL_EVENT_REPLY_END) &&
-            ev->ni_fail_type == PTL_NI_OK) {
+        if ((ev->type == LNET_EVENT_ACK ||
+             ev->type == LNET_EVENT_REPLY) &&
+            ev->status == 0) {
                 /* We heard back from the peer, so even if we get this
                  * before the SENT event (oh yes we can), we know we
                  * read/wrote the peer buffer and how much... */
@@ -331,10 +324,10 @@ void server_bulk_callback (ptl_event_t *ev)
         EXIT;
 }
 
-static void ptlrpc_master_callback(ptl_event_t *ev)
+static void ptlrpc_master_callback(lnet_event_t *ev)
 {
         struct ptlrpc_cb_id *cbid = ev->md.user_ptr;
-        void (*callback)(ptl_event_t *ev) = cbid->cbid_fn;
+        void (*callback)(lnet_event_t *ev) = cbid->cbid_fn;
 
         /* Honestly, it's best to find out early. */
         LASSERT (cbid->cbid_arg != LP_POISON);
@@ -348,10 +341,52 @@ static void ptlrpc_master_callback(ptl_event_t *ev)
         callback (ev);
 }
 
-int ptlrpc_uuid_to_peer (struct obd_uuid *uuid, ptl_process_id_t *peer)
+int ptlrpc_uuid_to_peer (struct obd_uuid *uuid, lnet_process_id_t *peer)
 {
+        int               best_dist = 0;
+        int               best_order = 0;
+        int               count = 0;
+        int               rc = -ENOENT;
+        int               portals_compatibility;
+        int               dist;
+        int               order;
+        lnet_nid_t        nid;
+
+        portals_compatibility = LNetCtl(IOC_PORTAL_PORTALS_COMPATIBILITY, NULL);
+        
+        /* Choose the matching UUID that's closest */
         peer->pid = LUSTRE_SRV_PTL_PID;
-        return lustre_uuid_to_peer (uuid->uuid, &peer->nid);
+
+        while (lustre_uuid_to_peer(uuid->uuid, &nid, count++) == 0) {
+                dist = LNetDist(nid, &order);
+                if (dist < 0)
+                        continue;
+                
+                LASSERT (order >= 0);
+                if (rc < 0 ||
+                    dist < best_dist ||
+                    (dist == best_dist && order < best_order)) {
+                        best_dist = dist;
+                        best_order = order;
+
+                        if (portals_compatibility > 1) {
+                                /* Strong portals compatibility: Zero the nid's
+                                 * NET, so if I'm reading new config logs, or
+                                 * getting configured by (new) lconf I can
+                                 * still talk to old servers. */
+                                nid = PTL_MKNID(0, PTL_NIDADDR(nid));
+                        }
+                        peer->nid = nid;
+                        rc = 0;
+                }
+        }
+
+        CDEBUG(D_WARNING,"%s->%s\n", uuid->uuid, libcfs_id2str(*peer));
+        if (rc != 0) 
+                LCONSOLE_ERROR("I couldn't find a NID for %s. Are the networks "
+                               "alive? Is routing set up?\n", uuid->uuid);
+
+        return rc;
 }
 
 void ptlrpc_ni_fini(void)
@@ -367,16 +402,16 @@ void ptlrpc_ni_fini(void)
          * replies */
 
         for (retries = 0;; retries++) {
-                rc = PtlEQFree(ptlrpc_eq_h);
+                rc = LNetEQFree(ptlrpc_eq_h);
                 switch (rc) {
                 default:
                         LBUG();
 
-                case PTL_OK:
-                        PtlNIFini(ptlrpc_ni_h);
+                case 0:
+                        LNetNIFini();
                         return;
                         
-                case PTL_EQ_IN_USE:
+                case -EBUSY:
                         if (retries != 0)
                                 CWARN("Event queue still busy\n");
                         
@@ -390,18 +425,12 @@ void ptlrpc_ni_fini(void)
         /* notreached */
 }
 
-ptl_pid_t ptl_get_pid(void)
+lnet_pid_t ptl_get_pid(void)
 {
-        ptl_pid_t        pid;
+        lnet_pid_t        pid;
 
 #ifndef  __KERNEL__
         pid = getpid();
-# if CRAY_PORTALS
-       /* hack to keep pid in range accepted by ernal */
-       pid &= 0xFF;
-       if (pid == LUSTRE_SRV_PTL_PID)
-               pid++;
-# endif
 #else
         pid = LUSTRE_SRV_PTL_PID;
 #endif
@@ -411,56 +440,36 @@ ptl_pid_t ptl_get_pid(void)
 int ptlrpc_ni_init(void)
 {
         int              rc;
-        char             str[20];
-        ptl_pid_t        pid;
+        lnet_pid_t       pid;
 
         pid = ptl_get_pid();
+        CDEBUG(D_NET, "My pid is: %x\n", pid);
 
         /* We're not passing any limits yet... */
-        rc = PtlNIInit(PTL_IFACE_DEFAULT, pid, NULL, NULL, &ptlrpc_ni_h);
-        if (rc != PTL_OK && rc != PTL_IFACE_DUP) {
+        rc = LNetNIInit(pid);
+        if (rc < 0) {
                 CDEBUG (D_NET, "Can't init network interface: %d\n", rc);
                 return (-ENOENT);
         }
 
-        CDEBUG(D_NET, "My pid is: %x\n", ptl_get_pid());
-        
-        PtlSnprintHandle(str, sizeof(str), ptlrpc_ni_h);
-        CDEBUG (D_NET, "ptlrpc_ni_h: %s\n", str);
-
         /* CAVEAT EMPTOR: how we process portals events is _radically_
          * different depending on... */
 #ifdef __KERNEL__
         /* kernel portals calls our master callback when events are added to
          * the event queue.  In fact lustre never pulls events off this queue,
          * so it's only sized for some debug history. */
-# if CRAY_PORTALS
-        rc = PtlNIDebug(pni->pni_ni_h, 0xffffffff);
-        if (rc != PTL_OK)
-                CDEBUG(D_ERROR, "Can't enable Cray Portals Debug: rc %d\n", rc);
-# endif
-        rc = PtlEQAlloc(ptlrpc_ni_h, 1024, ptlrpc_master_callback,
-                        &ptlrpc_eq_h);
+        rc = LNetEQAlloc(1024, ptlrpc_master_callback, &ptlrpc_eq_h);
 #else
         /* liblustre calls the master callback when it removes events from the
          * event queue.  The event queue has to be big enough not to drop
          * anything */
-# if CRAY_PORTALS
-        /* cray portals implements a non-standard callback to notify us there
-         * are buffered events even when the app is not doing a filesystem
-         * call. */
-        rc = PtlEQAlloc(ptlrpc_ni_h, 10240, cray_portals_callback,
-                        &ptlrpc_eq_h);
-# else
-        rc = PtlEQAlloc(ptlrpc_ni_h, 10240, PTL_EQ_HANDLER_NONE,
-                        &ptlrpc_eq_h);
-# endif
+        rc = LNetEQAlloc(10240, LNET_EQ_HANDLER_NONE, &ptlrpc_eq_h);
 #endif
-        if (rc == PTL_OK)
+        if (rc == 0)
                 return 0;
         
         CERROR ("Failed to allocate event queue: %d\n", rc);
-        PtlNIFini(ptlrpc_ni_h);
+        LNetNIFini();
 
         return (-ENOMEM);
 }
@@ -496,20 +505,20 @@ liblustre_deregister_wait_callback (void *opaque)
 int
 liblustre_check_events (int timeout)
 {
-        ptl_event_t ev;
+        lnet_event_t ev;
         int         rc;
         int         i;
         ENTRY;
 
-        rc = PtlEQPoll(&ptlrpc_eq_h, 1, timeout * 1000, &ev, &i);
-        if (rc == PTL_EQ_EMPTY)
+        rc = LNetEQPoll(&ptlrpc_eq_h, 1, timeout * 1000, &ev, &i);
+        if (rc == 0)
                 RETURN(0);
         
-        LASSERT (rc == PTL_EQ_DROPPED || rc == PTL_OK);
+        LASSERT (rc == -EOVERFLOW || rc == 0);
         
         /* liblustre: no asynch callback so we can't affort to miss any
          * events... */
-        if (rc == PTL_EQ_DROPPED) {
+        if (rc == -EOVERFLOW) {
                 CERROR ("Dropped an event!!!\n");
                 abort();
         }
@@ -558,23 +567,6 @@ liblustre_wait_event (int timeout)
         return found_something;
 }
 
-#if CRAY_PORTALS
-static void cray_portals_callback(ptl_event_t *ev)
-{
-        /* We get a callback from the client Cray portals implementation
-         * whenever anyone calls PtlEQPoll(), and an event queue with a
-         * callback handler has outstanding events.
-         *
-         * If it's not liblustre calling PtlEQPoll(), this lets us know we
-         * have outstanding events which we handle with
-         * liblustre_wait_event().
-         *
-         * Otherwise, we're already eagerly consuming events and we'd
-         * handle events out of order if we recursed. */
-        if (!liblustre_waiting)
-                liblustre_wait_event(0);
-}
-#endif
 #endif /* __KERNEL__ */
 
 int ptlrpc_init_portals(void)
index 8377af4..87185f4 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
  *   Author: Mike Shaver <shaver@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_RPC
@@ -137,6 +140,9 @@ int ptlrpc_set_import_discon(struct obd_import *imp)
                                ? "wait for recovery to complete"
                                : "fail");
 
+                if (obd_dump_on_timeout)
+                        libcfs_debug_dumplog();
+
                 CWARN("%s: connection lost to %s@%s\n",
                       imp->imp_obd->obd_name,
                       imp->imp_target_uuid.uuid,
@@ -263,9 +269,9 @@ static int import_select_connection(struct obd_import *imp)
         }
 
         if (imp->imp_conn_current && 
-            !(imp->imp_conn_current->oic_item.next == &imp->imp_conn_list)) {
+            imp->imp_conn_current->oic_item.next != &imp->imp_conn_list) {
                 imp_conn = list_entry(imp->imp_conn_current->oic_item.next,
-                                  struct obd_import_conn, oic_item);
+                                      struct obd_import_conn, oic_item);
         } else {
                 imp_conn = list_entry(imp->imp_conn_list.next,
                                       struct obd_import_conn, oic_item);
@@ -359,7 +365,8 @@ int ptlrpc_connect_import(struct obd_import *imp, char * new_uuid)
 #endif
 
         request->rq_send_state = LUSTRE_IMP_CONNECTING;
-        size[0] = sizeof(struct obd_connect_data);
+        /* Allow a slightly larger reply for future growth compatibility */
+        size[0] = sizeof(struct obd_connect_data) + 16 * sizeof(__u64);
         request->rq_replen = lustre_msg_size(1, size);
         request->rq_interpret_reply = ptlrpc_connect_interpret;
 
@@ -531,10 +538,21 @@ finish:
                         RETURN(0);
                 }
         } else {
-                list_del(&imp->imp_conn_current->oic_item);
-                list_add(&imp->imp_conn_current->oic_item,
-                         &imp->imp_conn_list);
-                imp->imp_conn_current = NULL;
+                spin_lock_irqsave(&imp->imp_lock, flags);
+                if (imp->imp_conn_current != NULL) {
+                        list_del(&imp->imp_conn_current->oic_item);
+                        list_add(&imp->imp_conn_current->oic_item,
+                                 &imp->imp_conn_list);
+                        imp->imp_conn_current = NULL;
+                        spin_unlock_irqrestore(&imp->imp_lock, flags);
+                } else {
+                        static int bug7269_dump = 0;
+                        spin_unlock_irqrestore(&imp->imp_lock, flags);
+                        CERROR("this is bug 7269 - please attach log there\n");
+                        if (bug7269_dump == 0)
+                                libcfs_debug_dumplog();
+                        bug7269_dump = 1;
+                }
         }
 
  out:
@@ -545,7 +563,7 @@ finish:
                 }
 
                 ptlrpc_maybe_ping_import_soon(imp);
-                
+
                 CDEBUG(D_HA, "recovery of %s on %s failed (%d)\n",
                        imp->imp_target_uuid.uuid,
                        (char *)imp->imp_connection->c_remote_uuid.uuid, rc);
@@ -757,20 +775,19 @@ int ptlrpc_disconnect_import(struct obd_import *imp)
         }
 
         spin_lock_irqsave(&imp->imp_lock, flags);
-        if (imp->imp_state != LUSTRE_IMP_FULL) {
+        if (imp->imp_state != LUSTRE_IMP_FULL)
                 GOTO(out, 0);
-        }
+
         spin_unlock_irqrestore(&imp->imp_lock, flags);
 
         request = ptlrpc_prep_req(imp, rq_opc, 0, NULL, NULL);
         if (request) {
-                /* For non-replayable connections, don't attempt
-                   reconnect if this fails */
-                if (!imp->imp_replayable) {
-                        request->rq_no_resend = 1;
-                        IMPORT_SET_STATE(imp, LUSTRE_IMP_CONNECTING);
-                        request->rq_send_state =  LUSTRE_IMP_CONNECTING;
-                }
+                /* We are disconnecting, do not retry a failed DISCONNECT rpc if
+                 * it fails.  We can get through the above with a down server
+                 * if the client doesn't know the server is gone yet. */
+                request->rq_no_resend = 1;
+                IMPORT_SET_STATE(imp, LUSTRE_IMP_CONNECTING);
+                request->rq_send_state =  LUSTRE_IMP_CONNECTING;
                 request->rq_replen = lustre_msg_size(0, NULL);
                 rc = ptlrpc_queue_wait(request);
                 ptlrpc_req_finished(request);
index a17aaa2..00eec03 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2004 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  *  remote api for llog - client side
  *
index 51399a9..0e08bb6 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * OST<->MDS recovery logging infrastructure.
  *
index 949fdf2..0e8f9e0 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  *  remote api for llog - server side
  *
index 6568579..a4393cc 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 #define DEBUG_SUBSYSTEM S_CLASS
@@ -459,32 +462,12 @@ int lprocfs_wr_evict_client(struct file *file, const char *buffer,
                             unsigned long count, void *data)
 {
         struct obd_device *obd = data;
-        struct obd_export *doomed_exp = NULL;
-        struct obd_uuid doomed;
-        struct list_head *p;
-        char tmpbuf[sizeof(doomed)];
+        char tmpbuf[sizeof(struct obd_uuid)];
 
         sscanf(buffer, "%40s", tmpbuf);
-        obd_str2uuid(&doomed, tmpbuf);
-
-        spin_lock(&obd->obd_dev_lock);
-        list_for_each(p, &obd->obd_exports) {
-                doomed_exp = list_entry(p, struct obd_export, exp_obd_chain);
-                if (obd_uuid_equals(&doomed, &doomed_exp->exp_client_uuid)) {
-                        class_export_get(doomed_exp);
-                        break;
-                }
-                doomed_exp = NULL;
-        }
-        spin_unlock(&obd->obd_dev_lock);
 
-        if (doomed_exp == NULL) {
-                CERROR("can't disconnect %s: no export found\n", doomed.uuid);
-        } else {
-                CERROR("evicting %s at adminstrative request\n", doomed.uuid);
-                class_fail_export(doomed_exp);
-                class_export_put(doomed_exp);
-        }
+        obd_export_evict_by_uuid(obd, tmpbuf);
+
         return count;
 }
 EXPORT_SYMBOL(lprocfs_wr_evict_client);
index 0928174..3698319 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
 #include <linux/obd.h>
 #include "ptlrpc_internal.h"
 
-static int ptl_send_buf (ptl_handle_md_t *mdh, void *base, int len,
-                         ptl_ack_req_t ack, struct ptlrpc_cb_id *cbid,
+static int ptl_send_buf (lnet_handle_md_t *mdh, void *base, int len,
+                         lnet_ack_req_t ack, struct ptlrpc_cb_id *cbid,
                          struct ptlrpc_connection *conn, int portal, __u64 xid)
 {
         int              rc;
-        ptl_md_t         md;
+        lnet_md_t         md;
         ENTRY;
 
         LASSERT (portal != 0);
@@ -43,38 +46,38 @@ static int ptl_send_buf (ptl_handle_md_t *mdh, void *base, int len,
         CDEBUG (D_INFO, "conn=%p id %s\n", conn, libcfs_id2str(conn->c_peer));
         md.start     = base;
         md.length    = len;
-        md.threshold = (ack == PTL_ACK_REQ) ? 2 : 1;
+        md.threshold = (ack == LNET_ACK_REQ) ? 2 : 1;
         md.options   = PTLRPC_MD_OPTIONS;
         md.user_ptr  = cbid;
         md.eq_handle = ptlrpc_eq_h;
 
-        if (ack == PTL_ACK_REQ &&
+        if (ack == LNET_ACK_REQ &&
             OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_ACK | OBD_FAIL_ONCE)) {
                 /* don't ask for the ack to simulate failing client */
-                ack = PTL_NOACK_REQ;
+                ack = LNET_NOACK_REQ;
                 obd_fail_loc |= OBD_FAIL_ONCE | OBD_FAILED;
         }
 
-        rc = PtlMDBind (ptlrpc_ni_h, md, PTL_UNLINK, mdh);
-        if (rc != PTL_OK) {
-                CERROR ("PtlMDBind failed: %d\n", rc);
-                LASSERT (rc == PTL_NO_SPACE);
+        rc = LNetMDBind (md, LNET_UNLINK, mdh);
+        if (rc != 0) {
+                CERROR ("LNetMDBind failed: %d\n", rc);
+                LASSERT (rc == -ENOMEM);
                 RETURN (-ENOMEM);
         }
 
         CDEBUG(D_NET, "Sending %d bytes to portal %d, xid "LPD64"\n",
                len, portal, xid);
 
-        rc = PtlPut (*mdh, ack, conn->c_peer, portal, 0, xid, 0, 0);
-        if (rc != PTL_OK) {
+        rc = LNetPut (*mdh, ack, conn->c_peer, portal, xid, 0, 0);
+        if (rc != 0) {
                 int rc2;
                 /* We're going to get an UNLINK event when I unlink below,
                  * which will complete just like any other failed send, so
                  * I fall through and return success here! */
-                CERROR("PtlPut(%s, %d, "LPD64") failed: %d\n",
+                CERROR("LNetPut(%s, %d, "LPD64") failed: %d\n",
                        libcfs_id2str(conn->c_peer), portal, xid, rc);
-                rc2 = PtlMDUnlink(*mdh);
-                LASSERTF(rc2 == PTL_OK, "rc2 = %d\n", rc2);
+                rc2 = LNetMDUnlink(*mdh);
+                LASSERTF(rc2 == 0, "rc2 = %d\n", rc2);
         }
 
         RETURN (0);
@@ -84,8 +87,8 @@ int ptlrpc_start_bulk_transfer (struct ptlrpc_bulk_desc *desc)
 {
         int                 rc;
         int                 rc2;
-        ptl_process_id_t    peer;
-        ptl_md_t            md;
+        lnet_process_id_t    peer;
+        lnet_md_t            md;
         __u64               xid;
         ENTRY;
 
@@ -111,10 +114,10 @@ int ptlrpc_start_bulk_transfer (struct ptlrpc_bulk_desc *desc)
         /* NB total length may be 0 for a read past EOF, so we send a 0
          * length bulk, since the client expects a bulk event. */
 
-        rc = PtlMDBind(ptlrpc_ni_h, md, PTL_UNLINK, &desc->bd_md_h);
-        if (rc != PTL_OK) {
-                CERROR("PtlMDBind failed: %d\n", rc);
-                LASSERT (rc == PTL_NO_SPACE);
+        rc = LNetMDBind(md, LNET_UNLINK, &desc->bd_md_h);
+        if (rc != 0) {
+                CERROR("LNetMDBind failed: %d\n", rc);
+                LASSERT (rc == -ENOMEM);
                 RETURN(-ENOMEM);
         }
 
@@ -128,20 +131,20 @@ int ptlrpc_start_bulk_transfer (struct ptlrpc_bulk_desc *desc)
         desc->bd_network_rw = 1;
 
         if (desc->bd_type == BULK_PUT_SOURCE)
-                rc = PtlPut (desc->bd_md_h, PTL_ACK_REQ, peer,
-                             desc->bd_portal, 0, xid, 0, 0);
+                rc = LNetPut (desc->bd_md_h, LNET_ACK_REQ, peer,
+                              desc->bd_portal, xid, 0, 0);
         else
-                rc = PtlGet (desc->bd_md_h, peer,
-                             desc->bd_portal, 0, xid, 0);
+                rc = LNetGet (desc->bd_md_h, peer,
+                              desc->bd_portal, xid, 0);
 
-        if (rc != PTL_OK) {
+        if (rc != 0) {
                 /* Can't send, so we unlink the MD bound above.  The UNLINK
                  * event this creates will signal completion with failure,
                  * so we return SUCCESS here! */
                 CERROR("Transfer(%s, %d, "LPX64") failed: %d\n",
                        libcfs_id2str(peer), desc->bd_portal, xid, rc);
-                rc2 = PtlMDUnlink(desc->bd_md_h);
-                LASSERT (rc2 == PTL_OK);
+                rc2 = LNetMDUnlink(desc->bd_md_h);
+                LASSERT (rc2 == 0);
         }
 
         RETURN(0);
@@ -164,7 +167,7 @@ void ptlrpc_abort_bulk (struct ptlrpc_bulk_desc *desc)
          * but we must still l_wait_event() in this case, to give liblustre
          * a chance to run server_bulk_callback()*/
 
-        PtlMDUnlink (desc->bd_md_h);
+        LNetMDUnlink (desc->bd_md_h);
 
         for (;;) {
                 /* Network access will complete in finite time but the HUGE
@@ -183,11 +186,11 @@ void ptlrpc_abort_bulk (struct ptlrpc_bulk_desc *desc)
 int ptlrpc_register_bulk (struct ptlrpc_request *req)
 {
         struct ptlrpc_bulk_desc *desc = req->rq_bulk;
-        ptl_process_id_t peer;
+        lnet_process_id_t peer;
         int rc;
         int rc2;
-        ptl_handle_me_t  me_h;
-        ptl_md_t         md;
+        lnet_handle_me_t  me_h;
+        lnet_md_t         md;
         ENTRY;
 
         if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_PTLRPC_BULK_GET_NET)) 
@@ -210,7 +213,7 @@ int ptlrpc_register_bulk (struct ptlrpc_request *req)
         md.threshold = 1;                       /* PUT or GET */
         md.options = PTLRPC_MD_OPTIONS | 
                      ((desc->bd_type == BULK_GET_SOURCE) ? 
-                      PTL_MD_OP_GET : PTL_MD_OP_PUT);
+                      LNET_MD_OP_GET : LNET_MD_OP_PUT);
         ptlrpc_fill_bulk_md(&md, desc);
 
         LASSERT (desc->bd_cbid.cbid_fn == client_bulk_callback);
@@ -225,23 +228,23 @@ int ptlrpc_register_bulk (struct ptlrpc_request *req)
         desc->bd_registered = 1;
         desc->bd_last_xid = req->rq_xid;
 
-        rc = PtlMEAttach(ptlrpc_ni_h, desc->bd_portal, peer,
-                         req->rq_xid, 0, PTL_UNLINK, PTL_INS_AFTER, &me_h);
-        if (rc != PTL_OK) {
-                CERROR("PtlMEAttach failed: %d\n", rc);
-                LASSERT (rc == PTL_NO_SPACE);
+        rc = LNetMEAttach(desc->bd_portal, peer,
+                         req->rq_xid, 0, LNET_UNLINK, LNET_INS_AFTER, &me_h);
+        if (rc != 0) {
+                CERROR("LNetMEAttach failed: %d\n", rc);
+                LASSERT (rc == -ENOMEM);
                 RETURN (-ENOMEM);
         }
 
         /* About to let the network at it... */
         desc->bd_network_rw = 1;
-        rc = PtlMDAttach(me_h, md, PTL_UNLINK, &desc->bd_md_h);
-        if (rc != PTL_OK) {
-                CERROR("PtlMDAttach failed: %d\n", rc);
-                LASSERT (rc == PTL_NO_SPACE);
+        rc = LNetMDAttach(me_h, md, LNET_UNLINK, &desc->bd_md_h);
+        if (rc != 0) {
+                CERROR("LNetMDAttach failed: %d\n", rc);
+                LASSERT (rc == -ENOMEM);
                 desc->bd_network_rw = 0;
-                rc2 = PtlMEUnlink (me_h);
-                LASSERT (rc2 == PTL_OK);
+                rc2 = LNetMEUnlink (me_h);
+                LASSERT (rc2 == 0);
                 RETURN (-ENOMEM);
         }
 
@@ -274,7 +277,7 @@ void ptlrpc_unregister_bulk (struct ptlrpc_request *req)
          * but we must still l_wait_event() in this case to give liblustre
          * a chance to run client_bulk_callback() */
 
-        PtlMDUnlink (desc->bd_md_h);
+        LNetMDUnlink (desc->bd_md_h);
         
         if (req->rq_set != NULL)
                 wq = &req->rq_set->set_waitq;
@@ -340,7 +343,7 @@ int ptlrpc_send_reply (struct ptlrpc_request *req, int may_be_difficult)
         ptlrpc_rs_addref(rs);                   /* +1 ref for the network */
 
         rc = ptl_send_buf (&rs->rs_md_h, req->rq_repmsg, req->rq_replen,
-                           rs->rs_difficult ? PTL_ACK_REQ : PTL_NOACK_REQ,
+                           rs->rs_difficult ? LNET_ACK_REQ : LNET_NOACK_REQ,
                            &rs->rs_cb_id, conn,
                            svc->srv_rep_portal, req->rq_xid);
         if (rc != 0) {
@@ -379,8 +382,8 @@ int ptl_send_rpc(struct ptlrpc_request *request)
         int rc2;
         struct ptlrpc_connection *connection;
         unsigned long flags;
-        ptl_handle_me_t  reply_me_h;
-        ptl_md_t         reply_md;
+        lnet_handle_me_t  reply_me_h;
+        lnet_md_t         reply_md;
         ENTRY;
 
         OBD_FAIL_RETURN(OBD_FAIL_PTLRPC_DROP_RPC, 0); 
@@ -418,13 +421,12 @@ int ptl_send_rpc(struct ptlrpc_request *request)
         if (request->rq_repmsg == NULL)
                 GOTO(cleanup_bulk, rc = -ENOMEM);
 
-        rc = PtlMEAttach(ptlrpc_ni_h,
-                         request->rq_reply_portal, /* XXX FIXME bug 249 */
-                         connection->c_peer, request->rq_xid, 0,
-                         PTL_UNLINK, PTL_INS_AFTER, &reply_me_h);
-        if (rc != PTL_OK) {
-                CERROR("PtlMEAttach failed: %d\n", rc);
-                LASSERT (rc == PTL_NO_SPACE);
+        rc = LNetMEAttach(request->rq_reply_portal, /* XXX FIXME bug 249 */
+                          connection->c_peer, request->rq_xid, 0,
+                          LNET_UNLINK, LNET_INS_AFTER, &reply_me_h);
+        if (rc != 0) {
+                CERROR("LNetMEAttach failed: %d\n", rc);
+                LASSERT (rc == -ENOMEM);
                 GOTO(cleanup_repmsg, rc = -ENOMEM);
         }
 
@@ -443,15 +445,15 @@ int ptl_send_rpc(struct ptlrpc_request *request)
         reply_md.start     = request->rq_repmsg;
         reply_md.length    = request->rq_replen;
         reply_md.threshold = 1;
-        reply_md.options   = PTLRPC_MD_OPTIONS | PTL_MD_OP_PUT;
+        reply_md.options   = PTLRPC_MD_OPTIONS | LNET_MD_OP_PUT;
         reply_md.user_ptr  = &request->rq_reply_cbid;
         reply_md.eq_handle = ptlrpc_eq_h;
 
-        rc = PtlMDAttach(reply_me_h, reply_md, PTL_UNLINK, 
+        rc = LNetMDAttach(reply_me_h, reply_md, LNET_UNLINK, 
                          &request->rq_reply_md_h);
-        if (rc != PTL_OK) {
-                CERROR("PtlMDAttach failed: %d\n", rc);
-                LASSERT (rc == PTL_NO_SPACE);
+        if (rc != 0) {
+                CERROR("LNetMDAttach failed: %d\n", rc);
+                LASSERT (rc == -ENOMEM);
                 spin_lock_irqsave (&request->rq_lock, flags);
                 /* ...but the MD attach didn't succeed... */
                 request->rq_receiving_reply = 0;
@@ -470,7 +472,7 @@ int ptl_send_rpc(struct ptlrpc_request *request)
         ptlrpc_pinger_sending_on_import(request->rq_import);
         rc = ptl_send_buf(&request->rq_req_md_h, 
                           request->rq_reqmsg, request->rq_reqlen,
-                          PTL_NOACK_REQ, &request->rq_req_cbid, 
+                          LNET_NOACK_REQ, &request->rq_req_cbid, 
                           connection,
                           request->rq_request_portal,
                           request->rq_xid);
@@ -485,8 +487,8 @@ int ptl_send_rpc(struct ptlrpc_request *request)
         /* MEUnlink is safe; the PUT didn't even get off the ground, and
          * nobody apart from the PUT's target has the right nid+XID to
          * access the reply buffer. */
-        rc2 = PtlMEUnlink(reply_me_h);
-        LASSERT (rc2 == PTL_OK);
+        rc2 = LNetMEUnlink(reply_me_h);
+        LASSERT (rc2 == 0);
         /* UNLINKED callback called synchronously */
         LASSERT (!request->rq_receiving_reply);
 
@@ -504,21 +506,21 @@ int ptl_send_rpc(struct ptlrpc_request *request)
 int ptlrpc_register_rqbd (struct ptlrpc_request_buffer_desc *rqbd)
 {
         struct ptlrpc_service   *service = rqbd->rqbd_service;
-        static ptl_process_id_t  match_id = {PTL_NID_ANY, PTL_PID_ANY};
+        static lnet_process_id_t  match_id = {LNET_NID_ANY, LNET_PID_ANY};
         int                      rc;
-        ptl_md_t                 md;
-        ptl_handle_me_t          me_h;
+        lnet_md_t                 md;
+        lnet_handle_me_t          me_h;
 
-        CDEBUG(D_NET, "PtlMEAttach: portal %d\n",
+        CDEBUG(D_NET, "LNetMEAttach: portal %d\n",
                service->srv_req_portal);
 
         if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_PTLRPC_RQBD))
                 return (-ENOMEM);
 
-        rc = PtlMEAttach(ptlrpc_ni_h, service->srv_req_portal,
-                         match_id, 0, ~0, PTL_UNLINK, PTL_INS_AFTER, &me_h);
-        if (rc != PTL_OK) {
-                CERROR("PtlMEAttach failed: %d\n", rc);
+        rc = LNetMEAttach(service->srv_req_portal,
+                          match_id, 0, ~0, LNET_UNLINK, LNET_INS_AFTER, &me_h);
+        if (rc != 0) {
+                CERROR("LNetMEAttach failed: %d\n", rc);
                 return (-ENOMEM);
         }
 
@@ -528,19 +530,19 @@ int ptlrpc_register_rqbd (struct ptlrpc_request_buffer_desc *rqbd)
         md.start     = rqbd->rqbd_buffer;
         md.length    = service->srv_buf_size;
         md.max_size  = service->srv_max_req_size;
-        md.threshold = PTL_MD_THRESH_INF;
-        md.options   = PTLRPC_MD_OPTIONS | PTL_MD_OP_PUT | PTL_MD_MAX_SIZE;
+        md.threshold = LNET_MD_THRESH_INF;
+        md.options   = PTLRPC_MD_OPTIONS | LNET_MD_OP_PUT | LNET_MD_MAX_SIZE;
         md.user_ptr  = &rqbd->rqbd_cbid;
         md.eq_handle = ptlrpc_eq_h;
         
-        rc = PtlMDAttach(me_h, md, PTL_UNLINK, &rqbd->rqbd_md_h);
-        if (rc == PTL_OK)
+        rc = LNetMDAttach(me_h, md, LNET_UNLINK, &rqbd->rqbd_md_h);
+        if (rc == 0)
                 return (0);
 
-        CERROR("PtlMDAttach failed: %d; \n", rc);
-        LASSERT (rc == PTL_NO_SPACE);
-        rc = PtlMEUnlink (me_h);
-        LASSERT (rc == PTL_OK);
+        CERROR("LNetMDAttach failed: %d; \n", rc);
+        LASSERT (rc == -ENOMEM);
+        rc = LNetMEUnlink (me_h);
+        LASSERT (rc == 0);
         rqbd->rqbd_refcount = 0;
         
         return (-ENOMEM);
index ef1aa0e..bf07199 100644 (file)
@@ -6,20 +6,23 @@
  *   Author: Phil Schwan <phil@clusterfs.com>
  *   Author: Eric Barton <eeb@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * (Un)packing of OST requests
  *
@@ -68,12 +71,27 @@ lustre_init_msg (struct lustre_msg *msg, int count, int *lens, char **bufs)
 int lustre_pack_request (struct ptlrpc_request *req,
                          int count, int *lens, char **bufs)
 {
+        int reqlen;
         ENTRY;
 
-        req->rq_reqlen = lustre_msg_size (count, lens);
-        OBD_ALLOC(req->rq_reqmsg, req->rq_reqlen);
-        if (req->rq_reqmsg == NULL)
-                RETURN(-ENOMEM);
+        reqlen = lustre_msg_size (count, lens);
+        /* See if we got it from prealloc pool */
+        if (req->rq_reqmsg) {
+                /* Cannot return error here, that would create
+                   infinite loop in ptlrpc_prep_req_pool */
+                /* In this case ptlrpc_prep_req_from_pool sets req->rq_reqlen
+                   to maximum size that would fit into this preallocated
+                   request */
+                LASSERTF(req->rq_reqlen >= reqlen, "req->rq_reqlen %d, "
+                                                   "reqlen %d\n",req->rq_reqlen,
+                                                    reqlen);
+                memset(req->rq_reqmsg, 0, reqlen);
+        } else {
+                OBD_ALLOC(req->rq_reqmsg, reqlen);
+                if (req->rq_reqmsg == NULL)
+                        RETURN(-ENOMEM);
+        }
+        req->rq_reqlen = reqlen;
 
         lustre_init_msg (req->rq_reqmsg, count, lens, bufs);
         RETURN (0);
@@ -105,6 +123,42 @@ do {                                                                    \
 # define PTLRPC_RS_DEBUG_LRU_DEL(rs) do {} while(0)
 #endif
 
+static struct ptlrpc_reply_state *lustre_get_emerg_rs(struct ptlrpc_service *svc,
+                                                      int size)
+{
+        unsigned long flags;
+        struct ptlrpc_reply_state *rs = NULL;
+
+        spin_lock_irqsave(&svc->srv_lock, flags);
+        /* See if we have anything in a pool, and wait if nothing */
+        while (list_empty(&svc->srv_free_rs_list)) {
+                struct l_wait_info lwi;
+                int rc;
+                spin_unlock_irqrestore(&svc->srv_lock, flags);
+                /* If we cannot get anything for some long time, we better
+                   bail out instead of waiting infinitely */
+                lwi = LWI_TIMEOUT(10 * HZ, NULL, NULL);
+                rc = l_wait_event(svc->srv_free_rs_waitq,
+                                  !list_empty(&svc->srv_free_rs_list), &lwi);
+                if (rc)
+                        goto out;
+                spin_lock_irqsave(&svc->srv_lock, flags);
+        }
+        
+        rs = list_entry(svc->srv_free_rs_list.next, struct ptlrpc_reply_state,
+                        rs_list);
+        list_del(&rs->rs_list);
+        spin_unlock_irqrestore(&svc->srv_lock, flags);
+        LASSERT(rs);
+        LASSERTF(svc->srv_max_reply_size > size, "Want %d, prealloc %d\n", size,
+                 svc->srv_max_reply_size);
+        memset(rs, 0, size);
+        rs->rs_prealloc = 1;
+out:
+        return rs;
+}
+
+
 int lustre_pack_reply (struct ptlrpc_request *req,
                        int count, int *lens, char **bufs)
 {
@@ -118,9 +172,11 @@ int lustre_pack_reply (struct ptlrpc_request *req,
         msg_len = lustre_msg_size (count, lens);
         size = offsetof (struct ptlrpc_reply_state, rs_msg) + msg_len;
         OBD_ALLOC (rs, size);
-        if (rs == NULL)
-                RETURN (-ENOMEM);
-
+        if (unlikely(rs == NULL)) {
+                rs = lustre_get_emerg_rs(req->rq_rqbd->rqbd_service, size);
+                if (!rs)
+                        RETURN (-ENOMEM);
+        }
         atomic_set(&rs->rs_refcount, 1);        /* 1 ref for rq_reply_state */
         rs->rs_cb_id.cbid_fn = reply_out_callback;
         rs->rs_cb_id.cbid_arg = rs;
@@ -152,7 +208,18 @@ void lustre_free_reply_state (struct ptlrpc_reply_state *rs)
         LASSERT (list_empty(&rs->rs_exp_list));
         LASSERT (list_empty(&rs->rs_obd_list));
 
-        OBD_FREE (rs, rs->rs_size);
+        if (unlikely(rs->rs_prealloc)) {
+                unsigned long flags;
+                struct ptlrpc_service *svc = rs->rs_service;
+
+                spin_lock_irqsave(&svc->srv_lock, flags);
+                list_add(&rs->rs_list,
+                         &svc->srv_free_rs_list);
+                spin_unlock_irqrestore(&svc->srv_lock, flags);
+                wake_up(&svc->srv_free_rs_waitq);
+        } else {
+                OBD_FREE(rs, rs->rs_size);
+        }
 }
 
 /* This returns the size of the buffer that is required to hold a lustre_msg
@@ -252,6 +319,22 @@ int lustre_unpack_msg(struct lustre_msg *m, int len)
         RETURN(0);
 }
 
+/**
+ * lustre_msg_buflen - return the length of buffer @n in message @m
+ * @m - lustre_msg (request or reply) to look at
+ * @n - message index (base 0)
+ *
+ * returns zero for non-existent message indices
+ */
+int lustre_msg_buflen(struct lustre_msg *m, int n)
+{
+        if (n >= m->bufcount)
+                return 0;
+
+        return m->buflens[n];
+}
+EXPORT_SYMBOL(lustre_msg_buflen);
+
 void *lustre_msg_buf(struct lustre_msg *m, int n, int min_size)
 {
         int i;
@@ -393,10 +476,12 @@ void lustre_swab_obd_statfs (struct obd_statfs *os)
         __swab64s (&os->os_blocks);
         __swab64s (&os->os_bfree);
         __swab64s (&os->os_bavail);
+        __swab64s (&os->os_files);
         __swab64s (&os->os_ffree);
         /* no need to swap os_fsid */
         __swab32s (&os->os_bsize);
         __swab32s (&os->os_namelen);
+        __swab64s (&os->os_maxbytes);
         /* no need to swap os_spare */
 }
 
@@ -637,7 +722,7 @@ static void print_lum_objs(struct lov_user_md *lum)
         struct lov_user_ost_data *lod;
         int i;
         ENTRY;
-        if (!(portal_debug & D_OTHER)) /* don't loop on nothing */
+        if (!(libcfs_debug & D_OTHER)) /* don't loop on nothing */
                 return;
         CDEBUG(D_OTHER, "lov_user_md_objects: %p\n", lum);
         for (i = 0; i < lum->lmm_stripe_count; i++) {
@@ -679,9 +764,10 @@ void lustre_swab_ldlm_policy_data (ldlm_policy_data_t *d)
         /* the lock data is a union and the first two fields are always an
          * extent so it's ok to process an LDLM_EXTENT and LDLM_FLOCK lock
          * data the same way. */
-        __swab64s (&d->l_flock.start);
-        __swab64s (&d->l_flock.end);
-        __swab32s (&d->l_flock.pid);
+        __swab64s(&d->l_extent.start);
+        __swab64s(&d->l_extent.end);
+        __swab64s(&d->l_extent.gid);
+        __swab32s(&d->l_flock.pid);
 }
 
 void lustre_swab_ldlm_intent (struct ldlm_intent *i)
@@ -833,8 +919,6 @@ void lustre_assert_wire_constants(void)
                  (long long)OST_LAST_OPC);
         LASSERTF(OBD_OBJECT_EOF == 0xffffffffffffffffULL," found %lld\n",
                  (long long)OBD_OBJECT_EOF);
-        LASSERTF(OST_REQ_HAS_OA1 == 1, " found %lld\n",
-                 (long long)OST_REQ_HAS_OA1);
         LASSERTF(MDS_GETATTR == 33, " found %lld\n",
                  (long long)MDS_GETATTR);
         LASSERTF(MDS_GETATTR_NAME == 34, " found %lld\n",
@@ -1857,6 +1941,10 @@ void lustre_assert_wire_constants(void)
                  (long long)(int)offsetof(struct ldlm_extent, end));
         LASSERTF((int)sizeof(((struct ldlm_extent *)0)->end) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct ldlm_extent *)0)->end));
+        LASSERTF((int)offsetof(struct ldlm_extent, gid) == 16, " found %lld\n",
+                 (long long)(int)offsetof(struct ldlm_extent, gid));
+        LASSERTF((int)sizeof(((struct ldlm_extent *)0)->gid) == 8, " found %lld\n",
+                 (long long)(int)sizeof(((struct ldlm_extent *)0)->gid));
 
         /* Checks for struct ldlm_flock */
         LASSERTF((int)sizeof(struct ldlm_flock) == 32, " found %lld\n",
index 2bd04f2..b09fb8c 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2004 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_RPC
 #include "ptlrpc_internal.h"
 
 #ifdef __KERNEL__
-#if !CRAY_PORTALS
 
-void ptlrpc_fill_bulk_md (ptl_md_t *md, struct ptlrpc_bulk_desc *desc)
+void ptlrpc_fill_bulk_md (lnet_md_t *md, struct ptlrpc_bulk_desc *desc)
 {
         LASSERT (desc->bd_iov_count <= PTLRPC_MAX_BRW_PAGES);
-        LASSERT (!(md->options & (PTL_MD_IOVEC | PTL_MD_KIOV | PTL_MD_PHYS)));
+        LASSERT (!(md->options & (LNET_MD_IOVEC | LNET_MD_KIOV | LNET_MD_PHYS)));
 
-        md->options |= PTL_MD_KIOV;
+        md->options |= LNET_MD_KIOV;
         md->start = &desc->bd_iov[0];
         md->length = desc->bd_iov_count;
 }
@@ -50,7 +52,7 @@ void ptlrpc_fill_bulk_md (ptl_md_t *md, struct ptlrpc_bulk_desc *desc)
 void ptlrpc_add_bulk_page(struct ptlrpc_bulk_desc *desc, struct page *page,
                           int pageoffset, int len)
 {
-        ptl_kiov_t *kiov = &desc->bd_iov[desc->bd_iov_count];
+        lnet_kiov_t *kiov = &desc->bd_iov[desc->bd_iov_count];
 
         kiov->kiov_page = page;
         kiov->kiov_offset = pageoffset;
@@ -59,62 +61,23 @@ void ptlrpc_add_bulk_page(struct ptlrpc_bulk_desc *desc, struct page *page,
         desc->bd_iov_count++;
 }
 
-#else  /* CRAY_PORTALS */
-#ifdef PTL_MD_KIOV
-#error "Conflicting compilation directives"
-#endif
-
-void ptlrpc_fill_bulk_md (ptl_md_t *md, struct ptlrpc_bulk_desc *desc)
-{
-        LASSERT (desc->bd_iov_count <= PTLRPC_MAX_BRW_PAGES);
-        LASSERT (!(md->options & (PTL_MD_IOVEC | PTL_MD_PHYS)));
-        
-        md->options |= (PTL_MD_IOVEC | PTL_MD_PHYS);
-        md->start = &desc->bd_iov[0];
-        md->length = desc->bd_iov_count;
-}
-
-void ptlrpc_add_bulk_page(struct ptlrpc_bulk_desc *desc, struct page *page,
-                          int pageoffset, int len)
-{
-        ptl_md_iovec_t *iov = &desc->bd_iov[desc->bd_iov_count];
-
-        /* Should get a compiler warning if sizeof(physaddr) > sizeof(void *) */
-        iov->iov_base = (void *)(page_to_phys(page) + pageoffset);
-        iov->iov_len = len;
-
-        desc->bd_iov_count++;
-}
-
-#endif /* CRAY_PORTALS */
 #else /* !__KERNEL__ */
 
-void ptlrpc_fill_bulk_md(ptl_md_t *md, struct ptlrpc_bulk_desc *desc)
+void ptlrpc_fill_bulk_md(lnet_md_t *md, struct ptlrpc_bulk_desc *desc)
 {
-#if CRAY_PORTALS
-        LASSERT (!(md->options & (PTL_MD_IOVEC | PTL_MD_PHYS)));
-#if defined(REDSTORM) && (NALID_FROM_IFACE(CRAY_QK_NAL) == PTL_IFACE_SS_ACCEL)
-       /* Enforce iov_count == 1 constraint only for SeaStar accel mode on
-        * compute nodes (ie, REDSTORM)
-        *
-        * iov_count of > 1 is supported via PTL_MD_IOVEC in other contexts */
-        LASSERT (desc->bd_iov_count == 1);
-#endif
-#else
-        LASSERT (!(md->options & (PTL_MD_IOVEC | PTL_MD_KIOV | PTL_MD_PHYS)));
-#endif
+        LASSERT (!(md->options & (LNET_MD_IOVEC | LNET_MD_KIOV | LNET_MD_PHYS)));
         if (desc->bd_iov_count == 1) {
                 md->start = desc->bd_iov[0].iov_base;
                 md->length = desc->bd_iov[0].iov_len;
                 return;
         }
         
-        md->options |= PTL_MD_IOVEC;
+        md->options |= LNET_MD_IOVEC;
         md->start = &desc->bd_iov[0];
         md->length = desc->bd_iov_count;
 }
 
-static int can_merge_iovs(ptl_md_iovec_t *existing, ptl_md_iovec_t *candidate)
+static int can_merge_iovs(lnet_md_iovec_t *existing, lnet_md_iovec_t *candidate)
 {
         if (existing->iov_base + existing->iov_len == candidate->iov_base) 
                 return 1;
@@ -130,7 +93,7 @@ static int can_merge_iovs(ptl_md_iovec_t *existing, ptl_md_iovec_t *candidate)
 void ptlrpc_add_bulk_page(struct ptlrpc_bulk_desc *desc, struct page *page, 
                           int pageoffset, int len)
 {
-        ptl_md_iovec_t *iov = &desc->bd_iov[desc->bd_iov_count];
+        lnet_md_iovec_t *iov = &desc->bd_iov[desc->bd_iov_count];
 
         iov->iov_base = page->addr + pageoffset;
         iov->iov_len = len;
index 8b75dcf..00320d5 100644 (file)
@@ -7,20 +7,23 @@
  *   Authors: Phil Schwan <phil@clusterfs.com>
  *            Mike Shaver <shaver@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #ifndef __KERNEL__
index 70dcbf2..364fbca 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -108,7 +111,7 @@ enum {
 int ptlrpc_expire_one_request(struct ptlrpc_request *req);
 
 /* pers.c */
-void ptlrpc_fill_bulk_md(ptl_md_t *md, struct ptlrpc_bulk_desc *desc);
+void ptlrpc_fill_bulk_md(lnet_md_t *md, struct ptlrpc_bulk_desc *desc);
 void ptlrpc_add_bulk_page(struct ptlrpc_bulk_desc *desc, struct page *page, 
                           int pageoffset, int len);
 
index f9c4bdb..4df0fe7 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -100,6 +103,10 @@ EXPORT_SYMBOL(ptlrpc_uuid_to_connection);
 EXPORT_SYMBOL(ptlrpc_queue_wait);
 EXPORT_SYMBOL(ptlrpc_replay_req);
 EXPORT_SYMBOL(ptlrpc_restart_req);
+EXPORT_SYMBOL(ptlrpc_add_rqs_to_pool);
+EXPORT_SYMBOL(ptlrpc_init_rq_pool);
+EXPORT_SYMBOL(ptlrpc_free_rq_pool);
+EXPORT_SYMBOL(ptlrpc_prep_req_pool);
 EXPORT_SYMBOL(ptlrpc_prep_req);
 EXPORT_SYMBOL(ptlrpc_free_req);
 EXPORT_SYMBOL(ptlrpc_unregister_reply);
@@ -131,10 +138,11 @@ EXPORT_SYMBOL(ptlrpc_schedule_difficult_reply);
 EXPORT_SYMBOL(ptlrpc_commit_replies);
 EXPORT_SYMBOL(ptlrpc_init_svc);
 EXPORT_SYMBOL(ptlrpc_stop_all_threads);
-EXPORT_SYMBOL(ptlrpc_start_n_threads);
+EXPORT_SYMBOL(ptlrpc_start_threads);
 EXPORT_SYMBOL(ptlrpc_start_thread);
 EXPORT_SYMBOL(ptlrpc_unregister_service);
 EXPORT_SYMBOL(ptlrpc_daemonize);
+EXPORT_SYMBOL(ptlrpc_service_health_check);
 
 /* pack_generic.c */
 EXPORT_SYMBOL(lustre_msg_swabbed);
index 1c2b462..38c2258 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2001-2003 Cluster File Systems, Inc.
  *   Author Peter Braam <braam@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -58,6 +61,7 @@ struct ptlrpcd_ctl {
         struct list_head          pc_req_list;
         wait_queue_head_t         pc_waitq;
         struct ptlrpc_request_set *pc_set;
+        char                      pc_name[16];
 #ifndef __KERNEL__
         int                       pc_recurred;
         void                     *pc_callback;
@@ -151,7 +155,7 @@ static int ptlrpcd(void *arg)
         unsigned long flags;
         ENTRY;
 
-        kportal_daemonize("ptlrpcd");
+        libcfs_daemonize(pc->pc_name);
 
         SIGNAL_MASK_LOCK(current, flags);
         sigfillset(&current->blocked);
@@ -206,7 +210,7 @@ int ptlrpcd_check_async_rpcs(void *arg)
 }
 #endif
 
-static int ptlrpcd_start(struct ptlrpcd_ctl *pc)
+static int ptlrpcd_start(char *name, struct ptlrpcd_ctl *pc)
 {
         int rc = 0;
 
@@ -217,6 +221,7 @@ static int ptlrpcd_start(struct ptlrpcd_ctl *pc)
         pc->pc_flags = 0;
         spin_lock_init(&pc->pc_lock);
         INIT_LIST_HEAD(&pc->pc_req_list);
+        snprintf (pc->pc_name, sizeof (pc->pc_name), name);
 
         pc->pc_set = ptlrpc_prep_set();
         if (pc->pc_set == NULL)
@@ -258,13 +263,13 @@ int ptlrpcd_addref(void)
         if (++ptlrpcd_users != 1)
                 GOTO(out, rc);
 
-        rc = ptlrpcd_start(&ptlrpcd_pc);
+        rc = ptlrpcd_start("ptlrpcd", &ptlrpcd_pc);
         if (rc) {
                 --ptlrpcd_users;
                 GOTO(out, rc);
         }
 
-        rc = ptlrpcd_start(&ptlrpcd_recovery_pc);
+        rc = ptlrpcd_start("ptlrpcd-recov", &ptlrpcd_recovery_pc);
         if (rc) {
                 ptlrpcd_stop(&ptlrpcd_pc);
                 --ptlrpcd_users;
index 241625b..2218b09 100644 (file)
@@ -4,20 +4,23 @@
  *  Copyright (C) 2003 Cluster File Systems, Inc.
  *   Author: Andreas Dilger <adilger@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  * OST<->MDS recovery logging thread.
  *
 #include <linux/obd_support.h>
 #include <linux/obd_class.h>
 #include <linux/lustre_net.h>
-#include <portals/types.h>
+#include <lnet/types.h>
 #include <libcfs/list.h>
 #include <linux/lustre_log.h>
 #include "ptlrpc_internal.h"
 
-#define LLCD_SIZE 4096
-
 #ifdef __KERNEL__
 
 static struct llog_commit_master lustre_lcm;
 static struct llog_commit_master *lcm = &lustre_lcm;
 
-/* Allocate new commit structs in case we do not have enough */
+/* Allocate new commit structs in case we do not have enough.
+ * Make the llcd size small enough that it fits into a single page when we
+ * are sending/receiving it. */
 static int llcd_alloc(void)
 {
         struct llog_canceld_ctxt *llcd;
-        int offset = offsetof(struct llog_canceld_ctxt, llcd_cookies);
+        int llcd_size = 0;
 
-        OBD_ALLOC(llcd, LLCD_SIZE + offset);
+        llcd_size = 4096 - lustre_msg_size(1, &llcd_size);
+        OBD_ALLOC(llcd,
+                  llcd_size + offsetof(struct llog_canceld_ctxt, llcd_cookies));
         if (llcd == NULL)
                 return -ENOMEM;
 
+        llcd->llcd_size = llcd_size;
         llcd->llcd_lcm = lcm;
 
         spin_lock(&lcm->lcm_llcd_lock);
@@ -82,6 +88,7 @@ struct llog_canceld_ctxt *llcd_grab(void)
 {
         struct llog_canceld_ctxt *llcd;
 
+repeat:
         spin_lock(&lcm->lcm_llcd_lock);
         if (list_empty(&lcm->lcm_llcd_free)) {
                 spin_unlock(&lcm->lcm_llcd_lock);
@@ -89,7 +96,8 @@ struct llog_canceld_ctxt *llcd_grab(void)
                         CERROR("unable to allocate log commit data!\n");
                         return NULL;
                 }
-                spin_lock(&lcm->lcm_llcd_lock);
+                /* check new llcd wasn't grabbed while lock dropped, b=7407 */
+                goto repeat;
         }
 
         llcd = list_entry(lcm->lcm_llcd_free.next, typeof(*llcd), llcd_list);
@@ -97,7 +105,6 @@ struct llog_canceld_ctxt *llcd_grab(void)
         atomic_dec(&lcm->lcm_llcd_numfree);
         spin_unlock(&lcm->lcm_llcd_lock);
 
-        llcd->llcd_tries = 0;
         llcd->llcd_cookiebytes = 0;
 
         return llcd;
@@ -106,10 +113,10 @@ EXPORT_SYMBOL(llcd_grab);
 
 static void llcd_put(struct llog_canceld_ctxt *llcd)
 {
-        int offset = offsetof(struct llog_canceld_ctxt, llcd_cookies);
-
         if (atomic_read(&lcm->lcm_llcd_numfree) >= lcm->lcm_llcd_maxfree) {
-                OBD_FREE(llcd, LLCD_SIZE + offset);
+                int llcd_size = llcd->llcd_size +
+                         offsetof(struct llog_canceld_ctxt, llcd_cookies);
+                OBD_FREE(llcd, llcd_size);
         } else {
                 spin_lock(&lcm->lcm_llcd_lock);
                 list_add(&llcd->llcd_list, &lcm->lcm_llcd_free);
@@ -174,8 +181,8 @@ int llog_obd_repl_cancel(struct llog_ctxt *ctxt,
                         GOTO(out, rc);
         }
 
-        if ((LLCD_SIZE - llcd->llcd_cookiebytes < sizeof(*cookies) ||
-             flags & OBD_LLOG_FL_SENDNOW)) {
+        if ((llcd->llcd_size - llcd->llcd_cookiebytes) < sizeof(*cookies) ||
+            (flags & OBD_LLOG_FL_SENDNOW)) {
                 CDEBUG(D_HA, "send llcd %p:%p\n", llcd, llcd->llcd_ctxt);
                 ctxt->loc_llcd = NULL;
                 llcd_send(llcd);
@@ -388,28 +395,11 @@ static int log_commit_thread(void *arg)
                                 continue;
                         }
 
-#if 0                   /* FIXME just put llcd, not put it on resend list */
-                        spin_lock(&lcm->lcm_llcd_lock);
-                        list_splice(&lcd->lcd_llcd_list, &lcm->lcm_llcd_resend);
-                        if (++llcd->llcd_tries < 5) {
-                                CERROR("commit %p failed on attempt %d: rc %d\n",
-                                       llcd, llcd->llcd_tries, rc);
-
-                                list_add_tail(&llcd->llcd_list,
-                                              &lcm->lcm_llcd_resend);
-                                spin_unlock(&lcm->lcm_llcd_lock);
-                        } else {
-                                spin_unlock(&lcm->lcm_llcd_lock);
-#endif
-                                CERROR("commit %p:%p drop %d cookies: rc %d\n",
-                                       llcd, llcd->llcd_ctxt,
-                                       (int)(llcd->llcd_cookiebytes /
-                                             sizeof(*llcd->llcd_cookies)), rc);
-                                llcd_put(llcd);
-#if 0
-                        }
-                        break;
-#endif
+                        CERROR("commit %p:%p drop %d cookies: rc %d\n",
+                               llcd, llcd->llcd_ctxt,
+                               (int)(llcd->llcd_cookiebytes /
+                                     sizeof(*llcd->llcd_cookies)), rc);
+                        llcd_put(llcd);
                 }
 
                 if (rc == 0) {
index e79e567..f25ca69 100644 (file)
@@ -6,20 +6,23 @@
  *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
  *   Author: Mike Shaver <shaver@clusterfs.com>
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  */
 
 #define DEBUG_SUBSYSTEM S_RPC
index 321ac50..6f43533 100644 (file)
@@ -3,20 +3,23 @@
  *
  *  Copyright (C) 2002 Cluster File Systems, Inc.
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ *   This file is part of the Lustre file system, http://www.lustre.org
+ *   Lustre is a trademark of Cluster File Systems, Inc.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ *   You may have signed or agreed to another license before downloading
+ *   this software.  If so, you are bound by the terms and conditions
+ *   of that agreement, and the following does not apply to you.  See the
+ *   LICENSE file included with this distribution for more information.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ *   If you did not agree to a different license, then this copy of Lustre
+ *   is open source software; you can redistribute it and/or modify it
+ *   under the terms of version 2 of the GNU General Public License as
+ *   published by the Free Software Foundation.
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *   In either case, Lustre is distributed in the hope that it will be
+ *   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+ *   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   license text for more details.
  *
  */
 
@@ -28,7 +31,7 @@
 #include <linux/obd_support.h>
 #include <linux/obd_class.h>
 #include <linux/lustre_net.h>
-#include <portals/types.h>
+#include <lnet/types.h>
 #include "ptlrpc_internal.h"
 
 /* forward ref */
@@ -90,7 +93,7 @@ ptlrpc_alloc_rqbd (struct ptlrpc_service *svc)
 }
 
 void
-ptlrpc_free_rqbd (struct ptlrpc_request_buffer_desc *rqbd) 
+ptlrpc_free_rqbd (struct ptlrpc_request_buffer_desc *rqbd)
 {
         struct ptlrpc_service *svc = rqbd->rqbd_service;
         unsigned long          flags;
@@ -133,7 +136,7 @@ ptlrpc_grow_req_bufs(struct ptlrpc_service *svc)
 }
 
 void
-ptlrpc_save_lock (struct ptlrpc_request *req, 
+ptlrpc_save_lock (struct ptlrpc_request *req,
                   struct lustre_handle *lock, int mode)
 {
         struct ptlrpc_reply_state *rs = req->rq_reply_state;
@@ -168,13 +171,13 @@ ptlrpc_schedule_difficult_reply (struct ptlrpc_reply_state *rs)
         wake_up (&svc->srv_waitq);
 }
 
-void 
+void
 ptlrpc_commit_replies (struct obd_device *obd)
 {
         struct list_head   *tmp;
         struct list_head   *nxt;
         unsigned long       flags;
-        
+
         /* Find any replies that have been committed and get their service
          * to attend to complete them. */
 
@@ -183,7 +186,7 @@ ptlrpc_commit_replies (struct obd_device *obd)
 
         list_for_each_safe (tmp, nxt, &obd->obd_uncommitted_replies) {
                 struct ptlrpc_reply_state *rs =
-                        list_entry (tmp, struct ptlrpc_reply_state, rs_obd_list);
+                        list_entry(tmp, struct ptlrpc_reply_state, rs_obd_list);
 
                 LASSERT (rs->rs_difficult);
 
@@ -196,7 +199,7 @@ ptlrpc_commit_replies (struct obd_device *obd)
                         spin_unlock (&svc->srv_lock);
                 }
         }
-        
+
         spin_unlock_irqrestore (&obd->obd_uncommitted_replies_lock, flags);
 }
 
@@ -261,11 +264,11 @@ ptlrpc_server_post_idle_rqbds (struct ptlrpc_service *svc)
 }
 
 struct ptlrpc_service *
-ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size,
+ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size, int max_reply_size,
                 int req_portal, int rep_portal, int watchdog_timeout,
                 svc_handler_t handler, char *name,
                 struct proc_dir_entry *proc_entry,
-                svcreq_printfn_t svcreq_printfn)
+                svcreq_printfn_t svcreq_printfn, int num_threads)
 {
         int                    rc;
         struct ptlrpc_service *service;
@@ -295,6 +298,7 @@ ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size,
         service->srv_request_history_print_fn = svcreq_printfn;
         service->srv_request_seq = 1;           /* valid seq #s start at 1 */
         service->srv_request_max_cull_seq = 0;
+        service->srv_num_threads = num_threads;
 
         INIT_LIST_HEAD(&service->srv_request_queue);
         INIT_LIST_HEAD(&service->srv_idle_rqbds);
@@ -303,6 +307,8 @@ ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size,
         INIT_LIST_HEAD(&service->srv_request_history);
         INIT_LIST_HEAD(&service->srv_active_replies);
         INIT_LIST_HEAD(&service->srv_reply_queue);
+        INIT_LIST_HEAD(&service->srv_free_rs_list);
+        init_waitqueue_head(&service->srv_free_rs_waitq);
 
         spin_lock (&ptlrpc_all_services_lock);
         list_add (&service->srv_list, &ptlrpc_all_services);
@@ -315,6 +321,12 @@ ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size,
         if (rc != 0)
                 GOTO(failed, NULL);
 
+        /* Now allocate pool of reply buffers */
+        /* Increase max reply size to next power of two */
+        service->srv_max_reply_size = 1;
+        while(service->srv_max_reply_size < max_reply_size)
+                service->srv_max_reply_size <<= 1;
+
         if (proc_entry != NULL)
                 ptlrpc_lprocfs_register_service(proc_entry, service);
 
@@ -327,6 +339,25 @@ failed:
         return NULL;
 }
 
+static void __ptlrpc_server_free_request(struct ptlrpc_request *req)
+{
+        struct ptlrpc_request_buffer_desc *rqbd = req->rq_rqbd;
+
+        list_del(&req->rq_list);
+
+        if (req->rq_reply_state != NULL) {
+                ptlrpc_rs_decref(req->rq_reply_state);
+                req->rq_reply_state = NULL;
+        }
+
+        if (req != &rqbd->rqbd_req) {
+                /* NB request buffers use an embedded
+                 * req if the incoming req unlinked the
+                 * MD; this isn't one of them! */
+                OBD_FREE(req, sizeof(*req));
+        }
+}
+
 static void
 ptlrpc_server_free_request(struct ptlrpc_request *req)
 {
@@ -340,7 +371,7 @@ ptlrpc_server_free_request(struct ptlrpc_request *req)
         spin_lock_irqsave(&svc->srv_lock, flags);
 
         svc->srv_n_active_reqs--;
-        list_add (&req->rq_list, &rqbd->rqbd_reqs);
+        list_add(&req->rq_list, &rqbd->rqbd_reqs);
 
         refcount = --(rqbd->rqbd_refcount);
         if (refcount == 0) {
@@ -378,20 +409,7 @@ ptlrpc_server_free_request(struct ptlrpc_request *req)
                                 req = list_entry(rqbd->rqbd_reqs.next,
                                                  struct ptlrpc_request,
                                                  rq_list);
-
-                                list_del(&req->rq_list);
-
-                                if (req->rq_reply_state != NULL) {
-                                        ptlrpc_rs_decref(req->rq_reply_state);
-                                        req->rq_reply_state = NULL;
-                                }
-
-                                if (req != &rqbd->rqbd_req) {
-                                        /* NB request buffers use an embedded
-                                         * req if the incoming req unlinked the
-                                         * MD; this isn't one of them! */
-                                        OBD_FREE(req, sizeof(*req));
-                                }
+                                __ptlrpc_server_free_request(req);
                         }
 
                         spin_lock_irqsave(&svc->srv_lock, flags);
@@ -401,13 +419,20 @@ ptlrpc_server_free_request(struct ptlrpc_request *req)
                          * reqs; particularly the embedded req */
                         list_add_tail(&rqbd->rqbd_list, &svc->srv_idle_rqbds);
                 }
+        } else if (req->rq_reply_state && req->rq_reply_state->rs_prealloc) {
+                 /* If we are low on memory, we are not interested in
+                    history */
+                list_del(&req->rq_history_list);
+                __ptlrpc_server_free_request(req);
         }
-        
+
         spin_unlock_irqrestore(&svc->srv_lock, flags);
+
 }
 
 static int
-ptlrpc_server_handle_request (struct ptlrpc_service *svc)
+ptlrpc_server_handle_request(struct ptlrpc_service *svc,
+                             struct ptlrpc_thread *thread)
 {
         struct ptlrpc_request *request;
         unsigned long          flags;
@@ -471,6 +496,7 @@ ptlrpc_server_handle_request (struct ptlrpc_service *svc)
 
         CDEBUG(D_NET, "got req "LPD64"\n", request->rq_xid);
 
+        request->rq_svc_thread = thread;
         request->rq_export = class_conn2export(&request->rq_reqmsg->handle);
 
         if (request->rq_export) {
@@ -482,8 +508,8 @@ ptlrpc_server_handle_request (struct ptlrpc_service *svc)
                                   request->rq_export->exp_conn_cnt);
                         goto put_conn;
                 }
-                if (request->rq_export->exp_obd
-                    && request->rq_export->exp_obd->obd_fail) {
+                if (request->rq_export->exp_obd &&
+                    request->rq_export->exp_obd->obd_fail) {
                         /* Failing over, don't handle any more reqs, send
                            error response instead. */
                         CDEBUG(D_HA, "Dropping req %p for failed obd %s\n",
@@ -493,8 +519,8 @@ ptlrpc_server_handle_request (struct ptlrpc_service *svc)
                         goto put_conn;
                 }
 
-                class_update_export_timer(request->rq_export, 
-                                          (time_t)(timediff / 1000000));
+                class_update_export_timer(request->rq_export,
+                                          (time_t)(timediff / 500000));
         }
 
         /* Discard requests queued for longer than my timeout.  If the
@@ -543,11 +569,18 @@ put_conn:
 
         timediff = timeval_sub(&work_end, &work_start);
 
-        CDEBUG((timediff / 1000000 > (long)obd_timeout) ? D_ERROR : D_HA,
-               "request "LPU64" opc %u from %s processed in %ldus "
-               "(%ldus total)\n", request->rq_xid, request->rq_reqmsg->opc,
-               libcfs_id2str(request->rq_peer),
-               timediff, timeval_sub(&work_end, &request->rq_arrival_time));
+        if (timediff / 1000000 > (long)obd_timeout)
+                CERROR("request "LPU64" opc %u from %s processed in %lds\n",
+                       request->rq_xid, request->rq_reqmsg->opc,
+                       libcfs_id2str(request->rq_peer),
+                       timeval_sub(&work_end,
+                                   &request->rq_arrival_time) / 1000000);
+        else
+                CDEBUG(D_HA,"request "LPU64" opc %u from %s processed in %ldus"
+                       " (%ldus total)\n", request->rq_xid,
+                       request->rq_reqmsg->opc,
+                       libcfs_id2str(request->rq_peer), timediff,
+                       timeval_sub(&work_end, &request->rq_arrival_time));
 
         if (svc->srv_stats != NULL) {
                 int opc = opcode_offset(request->rq_reqmsg->opc);
@@ -580,7 +613,7 @@ ptlrpc_server_handle_reply (struct ptlrpc_service *svc)
                 spin_unlock_irqrestore (&svc->srv_lock, flags);
                 RETURN(0);
         }
-        
+
         rs = list_entry (svc->srv_reply_queue.next,
                          struct ptlrpc_reply_state, rs_list);
 
@@ -609,7 +642,7 @@ ptlrpc_server_handle_reply (struct ptlrpc_service *svc)
 
         been_handled = rs->rs_handled;
         rs->rs_handled = 1;
-        
+
         nlocks = rs->rs_nlocks;                 /* atomic "steal", but */
         rs->rs_nlocks = 0;                      /* locks still on rs_locks! */
 
@@ -627,9 +660,9 @@ ptlrpc_server_handle_reply (struct ptlrpc_service *svc)
         if ((!been_handled && rs->rs_on_net) || 
             nlocks > 0) {
                 spin_unlock_irqrestore(&svc->srv_lock, flags);
-                
+
                 if (!been_handled && rs->rs_on_net) {
-                        PtlMDUnlink(rs->rs_md_h);
+                        LNetMDUnlink(rs->rs_md_h);
                         /* Ignore return code; we're racing with
                          * completion... */
                 }
@@ -669,13 +702,13 @@ liblustre_check_services (void *arg)
         int  rc;
         struct list_head *tmp, *nxt;
         ENTRY;
-        
+
         /* I'm relying on being single threaded, not to have to lock
          * ptlrpc_all_services etc */
         list_for_each_safe (tmp, nxt, &ptlrpc_all_services) {
                 struct ptlrpc_service *svc =
                         list_entry (tmp, struct ptlrpc_service, srv_list);
-                
+
                 if (svc->srv_nthreads != 0)     /* I've recursed */
                         continue;
 
@@ -683,16 +716,16 @@ liblustre_check_services (void *arg)
                  * (arbitrarily) to recursing 1 stack frame per service.
                  * Note that the problem with recursion is that we have to
                  * unwind completely before our caller can resume. */
-                
+
                 svc->srv_nthreads++;
-                
+
                 do {
                         rc = ptlrpc_server_handle_reply(svc);
-                        rc |= ptlrpc_server_handle_request(svc);
+                        rc |= ptlrpc_server_handle_request(svc, NULL);
                         rc |= (ptlrpc_server_post_idle_rqbds(svc) > 0);
                         did_something |= rc;
                 } while (rc);
-                
+
                 svc->srv_nthreads--;
         }
 
@@ -707,6 +740,7 @@ void ptlrpc_daemonize(void)
 {
         exit_mm(current);
         lustre_daemonize_helper();
+        set_fs_pwd(current->fs, init_task.fs->pwdmnt, init_task.fs->pwd);
         exit_files(current);
         reparent_to_init();
 }
@@ -734,7 +768,7 @@ static int
 ptlrpc_retry_rqbds(void *arg)
 {
         struct ptlrpc_service *svc = (struct ptlrpc_service *)arg;
-        
+
         svc->srv_rqbd_timeout = 0;
         return (-ETIMEDOUT);
 }
@@ -778,6 +812,10 @@ static int ptlrpc_main(void *arg)
 
         /* Record that the thread is running */
         thread->t_flags = SVC_RUNNING;
+        /*
+         * wake up our creator. Note: @data is invalid after this point,
+         * because it's allocated on ptlrpc_start_thread() stack.
+         */
         wake_up(&thread->t_ctl_waitq);
 
         watchdog = lc_watchdog_add(svc->srv_watchdog_timeout,
@@ -822,7 +860,7 @@ static int ptlrpc_main(void *arg)
                 if (!list_empty (&svc->srv_request_queue) &&
                     (svc->srv_n_difficult_replies == 0 ||
                      svc->srv_n_active_reqs < (svc->srv_nthreads - 1)))
-                        ptlrpc_server_handle_request (svc);
+                        ptlrpc_server_handle_request(svc, thread);
 
                 if (!list_empty(&svc->srv_idle_rqbds) &&
                     ptlrpc_server_post_idle_rqbds(svc) < 0) {
@@ -833,6 +871,12 @@ static int ptlrpc_main(void *arg)
                 }
         }
 
+        /*
+         * deconstruct service specific state created by ptlrpc_start_thread()
+         */
+        if (svc->srv_done != NULL)
+                svc->srv_done(thread);
+
         spin_lock_irqsave(&svc->srv_lock, flags);
 
         svc->srv_nthreads--;                    /* must know immediately */
@@ -887,16 +931,16 @@ void ptlrpc_stop_all_threads(struct ptlrpc_service *svc)
 }
 
 /* @base_name should be 12 characters or less - 3 will be added on */
-int ptlrpc_start_n_threads(struct obd_device *dev, struct ptlrpc_service *svc,
-                           int num_threads, char *base_name)
+int ptlrpc_start_threads(struct obd_device *dev, struct ptlrpc_service *svc,
+                         char *base_name)
 {
         int i, rc = 0;
         ENTRY;
 
-        for (i = 0; i < num_threads; i++) {
+        for (i = 0; i < svc->srv_num_threads; i++) {
                 char name[32];
                 sprintf(name, "%s_%02d", base_name, i);
-                rc = ptlrpc_start_thread(dev, svc, name);
+                rc = ptlrpc_start_thread(dev, svc, name, i);
                 if (rc) {
                         CERROR("cannot start %s thread #%d: rc %d\n", base_name,
                                i, rc);
@@ -907,12 +951,13 @@ int ptlrpc_start_n_threads(struct obd_device *dev, struct ptlrpc_service *svc,
 }
 
 int ptlrpc_start_thread(struct obd_device *dev, struct ptlrpc_service *svc,
-                        char *name)
+                        char *name, int id)
 {
         struct l_wait_info lwi = { 0 };
         struct ptlrpc_svc_data d;
         struct ptlrpc_thread *thread;
         unsigned long flags;
+        struct ptlrpc_reply_state *rs;
         int rc;
         ENTRY;
 
@@ -920,15 +965,28 @@ int ptlrpc_start_thread(struct obd_device *dev, struct ptlrpc_service *svc,
         if (thread == NULL)
                 RETURN(-ENOMEM);
         init_waitqueue_head(&thread->t_ctl_waitq);
-        
-        d.dev = dev;
-        d.svc = svc;
-        d.name = name;
-        d.thread = thread;
+        thread->t_id = id;
+          
+        if (svc->srv_init != NULL) {
+                rc = svc->srv_init(thread);
+                if (rc != 0)
+                        RETURN(rc);
+        }
 
+        /* Alloc reply state structure for this one */
+        OBD_ALLOC_GFP(rs, svc->srv_max_reply_size, GFP_KERNEL);
+        if (!rs)
+                RETURN(-ENOMEM);
         spin_lock_irqsave(&svc->srv_lock, flags);
+        list_add(&rs->rs_list, &svc->srv_free_rs_list);
         list_add(&thread->t_link, &svc->srv_threads);
         spin_unlock_irqrestore(&svc->srv_lock, flags);
+        wake_up(&svc->srv_free_rs_waitq);
+
+        d.dev = dev;
+        d.svc = svc;
+        d.name = name;
+        d.thread = thread;
 
         /* CLONE_VM and CLONE_FILES just avoid a needless copy, because we
          * just drop the VM and FILES in ptlrpc_daemonize() right away.
@@ -940,6 +998,10 @@ int ptlrpc_start_thread(struct obd_device *dev, struct ptlrpc_service *svc,
                 spin_lock_irqsave(&svc->srv_lock, flags);
                 list_del(&thread->t_link);
                 spin_unlock_irqrestore(&svc->srv_lock, flags);
+
+                if (svc->srv_done != NULL)
+                        svc->srv_done(thread);
+
                 OBD_FREE(thread, sizeof(*thread));
                 RETURN(rc);
         }
@@ -955,6 +1017,7 @@ int ptlrpc_unregister_service(struct ptlrpc_service *service)
         unsigned long         flags;
         struct l_wait_info    lwi;
         struct list_head     *tmp;
+        struct ptlrpc_reply_state *rs, *t;
 
         ptlrpc_stop_all_threads(service);
         LASSERT(list_empty(&service->srv_threads));
@@ -978,8 +1041,8 @@ int ptlrpc_unregister_service(struct ptlrpc_service *service)
                         list_entry(tmp, struct ptlrpc_request_buffer_desc, 
                                    rqbd_list);
 
-                rc = PtlMDUnlink(rqbd->rqbd_md_h);
-                LASSERT (rc == PTL_OK || rc == PTL_MD_INVALID);
+                rc = LNetMDUnlink(rqbd->rqbd_md_h);
+                LASSERT (rc == 0 || rc == -ENOENT);
         }
 
         /* Wait for the network to release any buffers it's currently
@@ -1038,7 +1101,7 @@ int ptlrpc_unregister_service(struct ptlrpc_service *service)
         while (!list_empty(&service->srv_idle_rqbds)) {
                 struct ptlrpc_request_buffer_desc *rqbd =
                         list_entry(service->srv_idle_rqbds.next,
-                                   struct ptlrpc_request_buffer_desc, 
+                                   struct ptlrpc_request_buffer_desc,
                                    rqbd_list);
 
                 ptlrpc_free_rqbd(rqbd);
@@ -1060,6 +1123,50 @@ int ptlrpc_unregister_service(struct ptlrpc_service *service)
                 CWARN("Unexpectedly long timeout %p\n", service);
         }
 
+        list_for_each_entry_safe(rs, t, &service->srv_free_rs_list, rs_list) {
+                list_del(&rs->rs_list);
+                OBD_FREE(rs, service->srv_max_reply_size);
+        }
+
         OBD_FREE(service, sizeof(*service));
         return 0;
 }
+
+/* Returns 0 if the service is healthy.
+ *
+ * Right now, it just checks to make sure that requests aren't languishing
+ * in the queue.  We'll use this health check to govern whether a node needs
+ * to be shot, so it's intentionally non-aggressive. */
+int ptlrpc_service_health_check(struct ptlrpc_service *svc)
+{
+        struct ptlrpc_request *request;
+        struct timeval         right_now;
+        long                   timediff, cutoff;
+        unsigned long          flags;
+        int                    rc = 0;
+
+        if (svc == NULL)
+                return 0;
+
+        spin_lock_irqsave(&svc->srv_lock, flags);
+
+        if (list_empty(&svc->srv_request_queue))
+                goto out;
+
+        request = list_entry(svc->srv_request_queue.next,
+                             struct ptlrpc_request, rq_list);
+
+        do_gettimeofday(&right_now);
+        timediff = timeval_sub(&right_now, &request->rq_arrival_time);
+
+        cutoff = obd_health_check_timeout;
+
+        if (timediff / 1000000 > cutoff) {
+                rc = -1;
+                goto out;
+        }
+
+ out:
+        spin_unlock_irqrestore(&svc->srv_lock, flags);
+        return rc;
+}
index 016bd65..084ca5a 100755 (executable)
@@ -12,6 +12,7 @@
 #      discard first vmstat line
 #
 
+HOSTNAME=`hostname`
 # a temp dir that is setup and torn down for each script run
 tmpdir=""
 # so we can kill background processes as the test cleans up
@@ -422,13 +423,13 @@ echo_filter_config() {
 
        if [ $index = 0 ]; then
                if ! lmc -m $config --add net \
-                       --node localhost --nid localhost --nettype tcp; then
-                       echo "error adding localhost net node"
+                       --node $HOSTNAME --nid $HOSTNAME --nettype tcp; then
+                       echo "error adding $HOSTNAME net node"
                        return 1
                fi
        fi
 
-       if ! lmc -m $config --add ost --ost ost_$index --node localhost \
+       if ! lmc -m $config --add ost --ost ost_$index --node $HOSTNAME \
                        --fstype ext3 --dev $bdev --journal_size 400; then
                echo "error adding $bdev to config with lmc"
                return 1
@@ -451,8 +452,8 @@ echo_filter_prepare() {
                fi
                running_config="$config"
 
-               echo 0 > /proc/sys/portals/debug
-               echo 0 > /proc/sys/portals/subsystem_debug
+               echo 0 > /proc/sys/lnet/debug
+               echo 0 > /proc/sys/lnet/subsystem_debug
 
                if ! grep -q '^obdecho\>' /proc/modules; then
                        local m
index b6398c1..2444c65 100755 (executable)
 # pidfile: /var/run/lustre.pid
 ### BEGIN INIT INFO
 # Provides: lustre
-# Required-Start:
-# Required-Stop: 
-# Should-Start: scance
-# Should-Stop: scance
+# Required-Start: $network +sshd
+# Required-Stop: $network
+# Should-Start:
+# Should-Stop:
 # Default-Start: 
-# Default-Stop: 0 1 2 6
+# Default-Stop: 0 1 2 3 4 5 6
 # Short-Description: Lustre Lite network File System.
 # Description: This starts both Lustre client and server functions.
 ### END INIT INFO
 
 
-SERVICE=lustre
-LOCK=/var/lock/subsys/$SERVICE
+SERVICE=${0##*/}
 
 : ${LUSTRE_CFG:=/etc/lustre/lustre.cfg}
 [ -f ${LUSTRE_CFG} ] && . ${LUSTRE_CFG}
+[ -f /etc/sysconfig/lustre ] && . /etc/sysconfig/lustre
 
 : ${LUSTRE_CONFIG_XML:=/etc/lustre/config.xml}
 : ${LCONF:=/usr/sbin/lconf}
-: ${LCONF_START_ARGS:="${LUSTRE_CONFIG_XML}"}
-: ${LCONF_STOP_ARGS:="--force --cleanup ${LUSTRE_CONFIG_XML}"}
 : ${LCTL:=/usr/sbin/lctl}
 
+case "$SERVICE" in
+    [SK][[:digit:]][[:digit:]]lustre | lustre)
+        SERVICE="lustre"
+       : ${LCONF_START_ARGS:="${LUSTRE_CONFIG_XML}"}
+       : ${LCONF_STOP_ARGS:="--force --cleanup ${LUSTRE_CONFIG_XML}"}
+       ;;
+    *)
+       : ${LCONF_START_ARGS:="--group ${SERVICE} --select ${SERVICE}=${HOSTNAME} ${LUSTRE_CONFIG_XML}"}
+       : ${LCONF_STOP_ARGS:="--group ${SERVICE} --select ${SERVICE}=${HOSTNAME} --failover --cleanup ${LUSTRE_CONFIG_XML}"}
+       ;;
+esac
+LOCK=/var/lock/subsys/$SERVICE
+
 # Source function library.
 if [ -f /etc/init.d/functions ] ; then
    . /etc/init.d/functions
@@ -49,17 +60,37 @@ check_start_stop() {
 
        [ -x ${LCONF} -a -x ${LCTL} ] || exit 0
 
-       [ -f ${LUSTRE_CONFIG_XML} ] || ( echo "unconfigured" && exit 0 )
+       if [ ${LUSTRE_CONFIG_XML:0:1} = "/" ] ; then
+                if [ ! -f ${LUSTRE_CONFIG_XML} ] ; then
+                    echo "${0##*/}: Configuration file ${LUSTRE_CONFIG_XML} not found; skipping."
+                    exit 0
+                fi
+       fi
 
        # Create /var/lustre directory 
        # This is used by snmp agent for checking lustre services
        #    status online/offline/online pending/offline pending.
 
        [ -d ${STATUS_DIR:=/var/lustre} ] || mkdir -p $STATUS_DIR
+       STATUS=${STATUS_DIR}/sysStatus
 }
-STATUS=${STATUS_DIR}/sysStatus
 
 start() {
+       if [ -x "/usr/sbin/clustat" -a "${SERVICE}" = "lustre" ] ; then
+           if [ ! -f "/etc/lustre/start-despite-clumanager" ] ; then
+               cat >&2 <<EOF
+This script was run directly, which can be dangerous if you are using
+clumanager to manage Lustre services.
+
+If you are not using clumanager for Lustre services, run the following
+command to have this script start Lustre instead:
+
+touch /etc/lustre/start-despite-clumanager
+EOF
+               RETVAL=1
+               return
+           fi
+       fi
        check_start_stop
        echo -n "Starting $SERVICE: "
        if [ $UID -ne 0 ]; then
@@ -107,14 +138,14 @@ status() {
        egrep -q "libcfs|lvfs|portals" /proc/modules && STATE="loaded"
 
        # check for any routes - on a portals router this is the only thing
-       [ "`cat /proc/sys/portals/routes 2> /dev/null`" ] && STATE="running"
+       [ "`cat /proc/sys/lnet/routes 2> /dev/null`" ] && STATE="running"
        
        # check for any configured devices (may indicate partial startup)
        [ "`cat /proc/fs/lustre/devices 2> /dev/null`" ] && STATE="partial"
 
        # check for either a server or a client filesystem
        MDS="`ls /proc/fs/lustre/mds/*/recovery_status 2> /dev/null`"
-       OST="`ls /proc/fs/lustre/mds/*/recovery_status 2> /dev/null`"
+       OST="`ls /proc/fs/lustre/obdfilter/*/recovery_status 2> /dev/null`"
        LLITE="`ls /proc/fs/lustre/llite/fs* 2> /dev/null`"
        [ "$MDS" -o "$OST" -o "$LLITE" ] && STATE="running"
 
@@ -125,7 +156,12 @@ status() {
        # check for servers in recovery
        [ "$MDS$OST" ] && grep -q RECOV $MDS $OST && STATE="recovery"
 
-       [ "`dmesg | grep LBUG`" ] && STATE="LBUG"
+        # check for error in health_check
+        HEALTH="/proc/fs/lustre/health_check"
+        [ -f "$HEALTH" ] && grep -q "NOT HEALTHY" $HEALTH && STATE="unhealthy"
+
+        # check for LBUG
+        [ -f  "$HEALTH" ] && grep -q "LBUG" $HEALTH && STATE="LBUG"
 
        echo $STATE
 }
index af2e675..18c32b1 100644 (file)
 #
 ### BEGIN INIT INFO
 # Provides: lustrefs
-# Required-Start: $network
-# Required-Stop: $network
+# Required-Start: $network $remote_fs +sshd +lustre
+# Required-Stop: $network $remote_fs
 # Should-Start: 
 # Should-Stop: 
-# Default-Start: 
+# Default-Start: 3 5
 # Default-Stop: 0 1 2 6
 # Short-Description: Mounts and unmounts all Lustre mount points.
 ### END INIT INFO
-## Provides: $local_fs $remote_fs
 
 # Source function library.
 if [ -f /etc/init.d/functions ]; then
@@ -39,6 +38,9 @@ if [ -f /lib/lsb/init-functions ]; then
    . /lib/lsb/init-functions
 fi
 
+[ -x /sbin/fuser ] && FUSER=/sbin/fuser
+[ -x /bin/fuser ] && FUSER=/bin/fuser
+
 # Check that networking is up.
 [ "${NETWORKING}" = "no" ] && exit 0
 
@@ -85,7 +87,7 @@ case "$1" in
                        sleep 2
                        remaining=`LC_ALL=C awk '!/^#/ && $3 ~ /^lustre/ && $2 != "/" {print $2}' /proc/mounts`
                        [ -z "$remaining" ] && break
-                       /sbin/fuser -k -m $sig $remaining >/dev/null
+                       $FUSER -k -m $sig $remaining >/dev/null
                        sleep 5
                        retry=$(($retry - 1))
                        sig=-9
index 1f890fb..57ddc08 100644 (file)
@@ -7,6 +7,8 @@ config=${1:-`basename $0 .sh`.xml}
 LMC="${LMC:-lmc} -m $config"
 TMP=${TMP:-/tmp}
 
+HOSTNAME=`hostname`
+
 MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
 MDSSIZE=${MDSSIZE:-400000}
 FSTYPE=${FSTYPE:-ext3}
@@ -29,24 +31,24 @@ STRIPES_PER_OBJ=0   # 0 means stripe over all OSTs
 rm -f $config
 
 # create nodes
-${LMC} --add node --node localhost || exit 10
-${LMC} --add net --node  localhost --nid `hostname` --nettype $NETTYPE || exit 11
+${LMC} --add node --node $HOSTNAME || exit 10
+${LMC} --add net --node  $HOSTNAME --nid `hostname` --nettype $NETTYPE || exit 11
 ${LMC} --add net --node client --nid '*' --nettype $NETTYPE || exit 12
 
 # configure mds server
-${LMC} --add mds --node localhost --mds mds1 --fstype $FSTYPE \
+${LMC} --add mds --node $HOSTNAME --mds mds1 --fstype $FSTYPE \
        --dev $MDSDEV --size $MDSSIZE $JARG $IARG $MDSOPT || exit 20
 
 # configure ost
 ${LMC} -m $config --add lov --lov lov1 --mds mds1 --stripe_sz $STRIPE_BYTES \
        --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0 $LOVOPT || exit 20
-${LMC} --add ost --ost ost1 --node localhost --lov lov1 \
+${LMC} --add ost --ost ost1 --node $HOSTNAME --lov lov1 \
        --fstype $FSTYPE --dev $OSTDEV --size $OSTSIZE $JARG $OSTOPT || exit 30
-${LMC} --add ost --ost ost2 --node localhost --lov lov1 \
+${LMC} --add ost --ost ost2 --node $HOSTNAME --lov lov1 \
        --fstype $FSTYPE --dev ${OSTDEV}2 --size $OSTSIZE $JARG $OSTOPT || exit 30
 
 # create client config
-${LMC} --add mtpt --node localhost --path $MOUNT --mds mds1 --lov lov1 \
+${LMC} --add mtpt --node $HOSTNAME --path $MOUNT --mds mds1 --lov lov1 \
        $CLIENTOPT || exit 40
 ${LMC} --add mtpt --node client --path $MOUNT2 --mds mds1 --lov lov1 \
        $CLIENTOPT || exit 41
index e3ebe1d..9c33b51 100644 (file)
@@ -1,5 +1,5 @@
 # Lustre test Makefile
-AM_CPPFLAGS = $(LLCPPFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
+AM_CPPFLAGS = $(LLCPPFLAGS) -I/opt/lam/include -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
 AM_CFLAGS = $(LLCFLAGS)
 # LDADD = -lldap
 # LDADD := -lreadline -ltermcap # -lefence
@@ -24,17 +24,17 @@ noinst_PROGRAMS += wantedi statone runas openfile getdents o_directory
 noinst_PROGRAMS += small_write multiop sleeptest ll_sparseness_verify cmknod
 noinst_PROGRAMS += ll_sparseness_write mrename ll_dirstripe_verify mkdirmany rmdirmany
 noinst_PROGRAMS += openfilleddirunlink rename_many memhog iopentest1 iopentest2
-noinst_PROGRAMS += mmap_sanity writemany
+noinst_PROGRAMS += mmap_sanity flock_test writemany random-reads
 if MPITESTS
-noinst_PROGRAMS += write_append_truncate createmany_mpi
+noinst_PROGRAMS += parallel_grouplock write_append_truncate createmany_mpi
 endif
 # noinst_PROGRAMS += ldaptest copy_attr mkdirdeep 
 bin_PROGRAMS = mcreate munlink
 endif # TESTS
 
-mmap_sanity_SOURCES= mmap_sanity.c
 stat_SOURCES = stat.c stat_fs.h
-# mkdirdeep_LDADD=-L$(top_builddir)/portals/utils -lptlctl $(LIBREADLINE)
+# mkdirdeep_LDADD=-L$(top_builddir)/lnet/utils -lptlctl $(LIBREADLINE)
+mmap_sanity_SOURCES= mmap_sanity.c
 
 if MPITESTS
 LAM_LD_FLAGS=-L/opt/lam/lib -lmpi -llam -lpthread
@@ -42,6 +42,8 @@ write_append_truncate_SOURCES=write_append_truncate.c
 write_append_truncate_LDADD=$(LAM_LD_FLAGS)
 createmany_mpi_SOURCES=createmany-mpi.c
 createmany_mpi_LDADD=$(LAM_LD_FLAGS)
+parallel_grouplock_SOURCES=parallel_grouplock.c lp_utils.c
+parallel_grouplock_LDADD=$(LAM_LD_FLAGS)
 endif
 
 #copy_attr_LDADD= -lattr
index 707198a..9c9df63 100644 (file)
@@ -26,12 +26,12 @@ display_elapsed_time() {
 
 debug_client_on()
 {
-       echo -1 > /proc/sys/portals/debug
+       echo -1 > /proc/sys/lnet/debug
 }
 
 debug_client_off()
 {
-       echo 0x3f0400 > /proc/sys/portals/debug
+       echo 0x3f0400 > /proc/sys/lnet/debug
 }
 
 MNT=${MNT:-/mnt/lustre}
index c4f0dd4..e302ecf 100644 (file)
@@ -39,7 +39,7 @@ display_elapsed_time() {
 
 set_debug_level() 
 {
-    $PDSH $CLIENTS "echo $1 > /proc/sys/portals/debug"
+    $PDSH $CLIENTS "echo $1 > /proc/sys/lnet/debug"
 }
 
 debug_client_on()
index 306ce37..ad927fa 100644 (file)
@@ -26,12 +26,12 @@ display_elapsed_time() {
 
 debug_client_on()
 {
-       echo -1 > /proc/sys/portals/debug
+       echo -1 > /proc/sys/lnet/debug
 }
 
 debug_client_off()
 {
-       echo 0x3f0400 > /proc/sys/portals/debug
+       echo 0x3f0400 > /proc/sys/lnet/debug
 }
 
 MNT=${MNT:-/mnt/lustre}
index 280f81d..01bcf15 100755 (executable)
@@ -21,10 +21,11 @@ fi
 [ "$COUNT" ] || COUNT=1000
 #[ "$DEBUG_LVL" ] || DEBUG_LVL=0x370200
 [ "$DEBUG_LVL" ] || DEBUG_LVL=0
-[ "$DEBUG_OFF" ] || DEBUG_OFF="eval echo $DEBUG_LVL > /proc/sys/portals/debug"
-[ "$DEBUG_ON" ] || DEBUG_ON="eval echo -1 > /proc/sys/portals/debug"
+[ "$DEBUG_OFF" ] || DEBUG_OFF="eval echo $DEBUG_LVL > /proc/sys/lnet/debug"
+[ "$DEBUG_ON" ] || DEBUG_ON="eval echo -1 > /proc/sys/lnet/debug"
 
-LIBLUSTRETESTS=${LIBLUSTRETESTS:-../liblustre/tests}
+LIBLUSTRE=${LIBLUSTRE:-../liblustre}
+LIBLUSTRETESTS=${LIBLUSTRETESTS:-$LIBLUSTRE/tests}
 
 for NAME in $CONFIGS; do
        export NAME MOUNT START CLEAN
@@ -69,10 +70,8 @@ for NAME in $CONFIGS; do
                sh llmountcleanup.sh
                sh llrmount.sh
        fi
-       IOZONE_OPTS="-i 0 -i 1 -i 2 -+d -r $RSIZE -s $SIZE"
-       if [ "$O_DIRECT" -a  "$O_DIRECT" != "no" ]; then
-               IOZONE_OPTS="-I $IOZONE_OPTS"
-       fi
+
+       IOZONE_OPTS="-i 0 -i 1 -i 2 -e -+d -r $RSIZE -s $SIZE"
        IOZFILE="-f $MOUNT/iozone"
        if [ "$IOZONE" != "no" ]; then
                mount | grep $MOUNT || sh llmount.sh
@@ -82,34 +81,33 @@ for NAME in $CONFIGS; do
                sh llmountcleanup.sh
                sh llrmount.sh
 
-               if [ "$IOZONE_DIR" != "no" ]; then
-                       mount | grep $MOUNT || sh llmount.sh
-                       SPACE=`df -P $MOUNT | tail -n 1 | awk '{ print $4 }'`
-                       IOZ_THREADS=`expr $SPACE / \( $SIZE + $SIZE / 512 \)`
-                       [ $THREADS -lt $IOZ_THREADS ] && IOZ_THREADS=$THREADS
+               if [ "$O_DIRECT" != "no" -a "$IOZONE_DIR" != "no" ]; then
+                       $DEBUG_OFF
+                       iozone -I $IOZONE_OPTS $IOZFILE.odir
+                       $DEBUG_ON
+                       sh llmountcleanup.sh
+                       sh llrmount.sh
+               fi
 
+               SPACE=`df -P $MOUNT | tail -n 1 | awk '{ print $4 }'`
+               IOZ_THREADS=`expr $SPACE / \( $SIZE + $SIZE / 512 \)`
+               [ $THREADS -lt $IOZ_THREADS ] && IOZ_THREADS=$THREADS
+               IOZVER=`iozone -v|awk '/Revision:/ {print $3}'|tr -d .`
+               if [ "$IOZ_THREADS" -gt 1 -a "$IOZVER" -ge 3145 ]; then
                        $DEBUG_OFF
-                       iozone $IOZONE_OPTS $IOZFILE.odir
-                       IOZVER=`iozone -v|awk '/Revision:/ {print $3}'|tr -d .`
+                       THREAD=1
+                       IOZFILE="-F "
+                       while [ $THREAD -le $IOZ_THREADS ]; do
+                               IOZFILE="$IOZFILE $MOUNT/iozone.$THREAD"
+                               THREAD=`expr $THREAD + 1`
+                       done
+                       iozone $IOZONE_OPTS -t $IOZ_THREADS $IOZFILE
                        $DEBUG_ON
                        sh llmountcleanup.sh
                        sh llrmount.sh
-                       if [ "$IOZ_THREADS" -gt 1 -a "$IOZVER" -ge 3145 ]; then
-                               $DEBUG_OFF
-                               THREAD=1
-                               IOZFILE="-F "
-                               while [ $THREAD -le $IOZ_THREADS ]; do
-                                       IOZFILE="$IOZFILE $MOUNT/iozone.$THREAD"
-                                       THREAD=`expr $THREAD + 1`
-                               done
-                               iozone $IOZONE_OPTS -t $IOZ_THREADS $IOZFILE
-                               $DEBUG_ON
-                               sh llmountcleanup.sh
-                               sh llrmount.sh
-                       elif [ $IOZVER -lt 3145 ]; then
-                               VER=`iozone -v | awk '/Revision:/ { print $3 }'`
-                               echo "iozone $VER too old for multi-thread test"
-                       fi
+               elif [ $IOZVER -lt 3145 ]; then
+                       VER=`iozone -v | awk '/Revision:/ { print $3 }'`
+                       echo "iozone $VER too old for multi-thread test"
                fi
        fi
        if [ "$FSX" != "no" ]; then
@@ -154,10 +152,12 @@ for NAME in $CONFIGS; do
        if [ "$LIBLUSTRE" != "no" ]; then
                mount | grep $MOUNT || sh llmount.sh
                IPADDR=`ping -c 1 $MDSNODE|head -n 1|sed -e "s/[^(]*(//" -e "s/).*//"`
-               export ENV_LUSTRE_MNTPNT=$MOUNT2
-               export ENV_LUSTRE_MNTTGT=$IPADDR:/$MDSNAME/$CLIENT
+               export LIBLUSTRE_MOUNT_POINT=$MOUNT2
+               export LIBLUSTRE_MOUNT_TARGET=$IPADDR:/$MDSNAME/$CLIENT
+               export LIBLUSTRE_TIMEOUT=`cat /proc/sys/lustre/timeout`
+               export LIBLUSTRE_DEBUG_MASK=`cat /proc/sys/lnet/debug`
                if [ -x $LIBLUSTRETESTS/sanity ]; then
-                       $LIBLUSTRETESTS/sanity --target=$ENV_LUSTRE_MNTTGT
+                       $LIBLUSTRETESTS/sanity --target=$LIBLUSTRE_MOUNT_TARGET
                fi
                sh llmountcleanup.sh
                #sh llrmount.sh
index 983df93..3b7e8ac 100755 (executable)
@@ -6,6 +6,8 @@ config=${1:-$(basename $0 .sh)}.xml
 LMC=${LMC:-../utils/lmc -m $config}
 TMP=${TMP:-/tmp}
 
+HOSTNAME=`hostname`
+
 MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
 MDSSIZE=50000
 FSTYPE=${FSTYPE:-ext3}
@@ -15,18 +17,18 @@ OSTSIZE=200000
 
 rm -f $config
 # create nodes
-${LMC} --add node --node localhost || exit 10
-${LMC} --add net --node  localhost --nid localhost --nettype tcp || exit 11
+${LMC} --add node --node $HOSTNAME || exit 10
+${LMC} --add net --node  $HOSTNAME --nid $HOSTNAME --nettype tcp || exit 11
 
 # configure mds server
-${LMC}  --add mds  --node localhost --mds mds1 --fstype $FSTYPE --dev $MDSDEV --size $MDSSIZE || exit 20
+${LMC}  --add mds  --node $HOSTNAME --mds mds1 --fstype $FSTYPE --dev $MDSDEV --size $MDSSIZE || exit 20
 
 # configure ost
-${LMC} --add ost --node localhost --obd obd1 --fstype $FSTYPE --obdtype obdecho || exit 30
+${LMC} --add ost --node $HOSTNAME --obd obd1 --fstype $FSTYPE --obdtype obdecho || exit 30
 # configure ost
-${LMC} --add ost --node localhost --obd obd2 --fstype $FSTYPE --obdtype obdecho || exit 30
+${LMC} --add ost --node $HOSTNAME --obd obd2 --fstype $FSTYPE --obdtype obdecho || exit 30
 
-${LMC} --add cobd --node localhost --real_obd obd1 --cache_obd obd2
+${LMC} --add cobd --node $HOSTNAME --real_obd obd1 --cache_obd obd2
 
 # create client config
-# ${LMC} -m $config --add mtpt --node localhost --path /mnt/lustre --mds mds1 --obd obd1 || exit 40
+# ${LMC} -m $config --add mtpt --node $HOSTNAME --path /mnt/lustre --mds mds1 --obd obd1 || exit 40
index e0fde5d..c91a4ed 100644 (file)
@@ -9,12 +9,20 @@
 
 set -e
 
+ONLY=${ONLY:-"$*"}
+# bug number for skipped test: 
+ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-""}
+# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
+
+[ "$ALWAYS_EXCEPT$EXCEPT" ] && echo "Skipping tests: $ALWAYS_EXCEPT $EXCEPT"
+
 SRCDIR=`dirname $0`
 PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
 
 LUSTRE=${LUSTRE:-`dirname $0`/..}
 RLUSTRE=${RLUSTRE:-$LUSTRE}
 MOUNTLUSTRE=${MOUNTLUSTRE:-/sbin/mount.lustre}
+HOSTNAME=`hostname`
 
 . $LUSTRE/tests/test-framework.sh
 
@@ -75,7 +83,7 @@ umount_client() {
 
 manual_umount_client(){
        echo "manual umount lustre on ${MOUNTPATH}...."
-       do_facet  client "umount $MOUNT"
+       do_facet client "umount $MOUNT"
 }
 
 setup() {
@@ -89,7 +97,7 @@ cleanup() {
        stop_mds $FORCE || return 201
        stop_ost $FORCE || return 202
        # catch case where these return just fine, but modules are still not unloaded
-       /sbin/lsmod | egrep -q "portals|libcfs"
+       /sbin/lsmod | egrep -q "lnet|libcfs"
        if [ 1 -ne $? ]; then
                echo "modules still loaded..."
                /sbin/lsmod
@@ -113,6 +121,11 @@ check_mount2() {
 
 build_test_filter
 
+if [ "$ONLY" == "setup" ]; then
+       setup
+       exit
+fi
+
 if [ "$ONLY" == "cleanup" ]; then
        cleanup
        exit
@@ -203,15 +216,13 @@ test_5() {
        stop_mds  || return 4
        stop_ost || return 5
 
-       lsmod | grep -q portals && return 6
+       lsmod | grep -q lnet && return 6
        return 0
 }
 run_test 5 "force cleanup mds, then cleanup"
 
 test_5b() {
        start_ost
-       start_mds
-       stop_mds
 
        [ -d $MOUNT ] || mkdir -p $MOUNT
        $LCONF --nosetup --node client_facet $XMLCONFIG > /dev/null
@@ -224,7 +235,7 @@ test_5b() {
        stop_mds || return 2
        stop_ost || return 3
 
-       lsmod | grep -q portals && return 4
+       lsmod | grep -q lnet && return 4
        return 0
 
 }
@@ -244,7 +255,7 @@ test_5c() {
        stop_mds || return 2
        stop_ost || return 3
 
-       lsmod | grep -q portals && return 4
+       lsmod | grep -q lnet && return 4
        return 0
 
 }
@@ -265,7 +276,7 @@ test_5d() {
        
        stop_mds || return 3
 
-       lsmod | grep -q portals && return 4
+       lsmod | grep -q lnet && return 4
        return 0
 
 }
@@ -317,14 +328,14 @@ test_9() {
         start_ost
         start_mds
         mount_client $MOUNT
-        CHECK_PTLDEBUG="`cat /proc/sys/portals/debug`"
+        CHECK_PTLDEBUG="`cat /proc/sys/lnet/debug`"
         if [ $CHECK_PTLDEBUG = "1" ]; then
            echo "lmc --debug success"
         else
            echo "lmc --debug: want 1, have $CHECK_PTLDEBUG"
            return 1
         fi
-        CHECK_SUBSYSTEM="`cat /proc/sys/portals/subsystem_debug`"
+        CHECK_SUBSYSTEM="`cat /proc/sys/lnet/subsystem_debug`"
         if [ $CHECK_SUBSYSTEM = "2" ]; then
            echo "lmc --subsystem success"
         else
@@ -341,18 +352,18 @@ test_9() {
         # check lconf --ptldebug/subsystem overriding lmc --ptldebug/subsystem
         start_ost
         start_mds
-        CHECK_PTLDEBUG="`do_facet mds cat /proc/sys/portals/debug`"
+        CHECK_PTLDEBUG="`do_facet mds sysctl lnet.debug | cut -d= -f2`"
         if [ $CHECK_PTLDEBUG = "3" ]; then
            echo "lconf --debug success"
         else
            echo "lconf --debug: want 3, have $CHECK_PTLDEBUG"
            return 1
         fi
-        CHECK_SUBSYSTEM="`do_facet mds cat /proc/sys/portals/subsystem_debug`"
-        if [ $CHECK_SUBSYSTEM = "20" ]; then
+        CHECK_SUBSYS="`do_facet mds sysctl lnet.subsystem_debug|cut -d= -f2`"
+        if [ $CHECK_SUBSYS = "20" ]; then
            echo "lconf --subsystem success"
         else
-           echo "lconf --subsystem: want 20, have $CHECK_SUBSYSTEM"
+           echo "lconf --subsystem: want 20, have $CHECK_SUBSYS"
            return 1
         fi
         mount_client $MOUNT
@@ -429,8 +440,8 @@ test_12() {
         # test double quote
         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
         [ -f "$BATCHFILE" ] && rm -f $BATCHFILE
-        echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
-        echo "--add mds --node localhost --mds mds1 --mkfsoptions \"-I 128\"" >> $BATCHFILE
+        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
+        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \"-I 128\"" >> $BATCHFILE
         # --mkfsoptions "-I 128"
         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
@@ -441,16 +452,16 @@ test_12() {
         fi
         rm -f $XMLCONFIG
         rm -f $BATCHFILE
-        echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
-        echo "--add mds --node localhost --mds mds1 --mkfsoptions \"-I 128" >> $BATCHFILE
+        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
+        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \"-I 128" >> $BATCHFILE
         # --mkfsoptions "-I 128
         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
         echo "unmatched double quote should return error"
 
         # test single quote
         rm -f $BATCHFILE
-        echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
-        echo "--add mds --node localhost --mds mds1 --mkfsoptions '-I 128'" >> $BATCHFILE
+        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
+        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions '-I 128'" >> $BATCHFILE
         # --mkfsoptions '-I 128'
         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
@@ -461,16 +472,16 @@ test_12() {
         fi
         rm -f $XMLCONFIG
         rm -f $BATCHFILE
-        echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
-        echo "--add mds --node localhost --mds mds1 --mkfsoptions '-I 128" >> $BATCHFILE
+        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
+        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions '-I 128" >> $BATCHFILE
         # --mkfsoptions '-I 128
         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
         echo "unmatched single quote should return error"
 
         # test backslash
         rm -f $BATCHFILE
-        echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
-        echo "--add mds --node localhost --mds mds1 --mkfsoptions \-\I\ \128" >> $BATCHFILE
+        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
+        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions \-\I\ \128" >> $BATCHFILE
         # --mkfsoptions \-\I\ \128
         do_lmc -m $XMLCONFIG --batch $BATCHFILE || return $?
         if [ `sed -n '/>-I 128</p' $XMLCONFIG | wc -l` -eq 1 ]; then
@@ -481,8 +492,8 @@ test_12() {
         fi
         rm -f $XMLCONFIG
         rm -f $BATCHFILE
-        echo "--add net --node  localhost --nid localhost.localdomain --nettype tcp" > $BATCHFILE
-        echo "--add mds --node localhost --mds mds1 --mkfsoptions -I\ 128\\" >> $BATCHFILE
+        echo "--add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp" > $BATCHFILE
+        echo "--add mds --node $HOSTNAME --mds mds1 --mkfsoptions -I\ 128\\" >> $BATCHFILE
         # --mkfsoptions -I\ 128\
         do_lmc -m $XMLCONFIG --batch $BATCHFILE && return $?
         echo "backslash followed by nothing should return error"
@@ -500,9 +511,9 @@ test_13() {
         # check long uuid will be truncated properly and uniquely
         echo "To generate XML configuration file(with long ost name): $XMLCONFIG"
         [ -f "$XMLCONFIG" ] && rm -f $XMLCONFIG
-        do_lmc --add net --node localhost --nid localhost.localdomain --nettype tcp
-        do_lmc --add mds --node localhost --mds mds1_name_longer_than_31characters
-        do_lmc --add mds --node localhost --mds mds2_name_longer_than_31characters
+        do_lmc --add net --node $HOSTNAME --nid $HOSTNAME --nettype tcp
+        do_lmc --add mds --node $HOSTNAME --mds mds1_name_longer_than_31characters
+        do_lmc --add mds --node $HOSTNAME --mds mds2_name_longer_than_31characters
         if [ ! -f "$XMLCONFIG" ]; then
                 echo "Error:no file $XMLCONFIG created!"
                 return 1
index 1d90308..0c2ab30 100755 (executable)
@@ -13,8 +13,9 @@ config=${config:-$(basename $0 .sh).xml}
 LMC=${LMC:-../utils/lmc -m $config}
 TMP=${TMP:-/tmp}
 
-SERVER=${SERVER:-localhost}
-CLIENT=${CLIENT:-localhost}
+HOSTNAME=`hostname`
+SERVER=${SERVER:-$HOSTNAME}
+CLIENT=${CLIENT:-$HOSTNAME}
 NET=${NET:-tcp}
 
 h2tcp () {
@@ -38,6 +39,15 @@ h2iib () {
         *) echo $1 | sed "s/[^0-9]*//" ;;
         esac
 }
+
+#
+# PJK: I believe this is correct
+# PTL NID's are of the form
+# num@ptl
+#
+h2ptl () { 
+        echo $1 | sed 's/[^0-9]*//g' 
+}
         
 # FIXME: make LMC not require MDS for obdecho LOV
 MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
diff --git a/lustre/tests/flock.c b/lustre/tests/flock.c
new file mode 100644 (file)
index 0000000..83da7c5
--- /dev/null
@@ -0,0 +1,196 @@
+/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
+ * vim:expandtab:shiftwidth=8:tabstop=8:
+ *
+ * Lustre Light user test program
+ *
+ *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
+ *
+ *   This file is part of Lustre, http://www.lustre.org.
+ *
+ *   Lustre is free software; you can redistribute it and/or
+ *   modify it under the terms of version 2 of the GNU General Public
+ *   License as published by the Free Software Foundation.
+ *
+ *   Lustre is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with Lustre; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define _BSD_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/queue.h>
+#include <signal.h>
+#include <errno.h>
+#include <dirent.h>
+#include <sys/uio.h>
+#include <sys/time.h>
+#include <stdarg.h>
+
+static char lustre_path[] = "/mnt/lustre";
+
+#define ENTRY(str)                                                      \
+        do {                                                            \
+                char buf[100];                                          \
+                int len;                                                \
+                sprintf(buf, "===== START %s: %s ", __FUNCTION__, (str)); \
+                len = strlen(buf);                                      \
+                if (len < 79) {                                         \
+                        memset(buf+len, '=', 100-len);                  \
+                        buf[79] = '\n';                                 \
+                        buf[80] = 0;                                    \
+                }                                                       \
+                printf("%s", buf);                                      \
+        } while (0)
+
+#define LEAVE()                                                         \
+        do {                                                            \
+                char buf[100];                                          \
+                int len;                                                \
+                sprintf(buf, "===== END TEST %s: successfully ",        \
+                        __FUNCTION__);                                  \
+                len = strlen(buf);                                      \
+                if (len < 79) {                                         \
+                        memset(buf+len, '=', 100-len);                  \
+                        buf[79] = '\n';                                 \
+                        buf[80] = 0;                                    \
+                }                                                       \
+                printf("%s", buf);                                      \
+        } while (0)
+
+#define EXIT return
+
+#define MAX_PATH_LENGTH 4096
+
+
+int t_fcntl(int fd, int cmd, ...)
+{
+       va_list ap;
+       long arg;
+       struct flock *lock;
+       int rc = -1;
+
+       va_start(ap, cmd);
+       switch (cmd) {
+       case F_GETFL:
+               va_end(ap);
+               rc = fcntl(fd, cmd);
+               if (rc == -1) {
+                       printf("fcntl GETFL failed: %s\n",
+                                strerror(errno));
+                       EXIT(1);
+               }
+               break;
+       case F_SETFL:
+               arg = va_arg(ap, long);
+               va_end(ap);
+               rc = fcntl(fd, cmd, arg);
+               if (rc == -1) {
+                       printf("fcntl SETFL %ld failed: %s\n",
+                                arg, strerror(errno));
+                       EXIT(1);
+               }
+               break;
+       case F_GETLK:
+       case F_SETLK:
+       case F_SETLKW:
+               lock = va_arg(ap, struct flock *);
+               va_end(ap);
+               rc = fcntl(fd, cmd, lock);
+               if (rc == -1) {
+                       printf("fcntl cmd %d failed: %s\n",
+                                cmd, strerror(errno));
+                       EXIT(1);
+               }
+               break;
+       case F_DUPFD:
+               arg = va_arg(ap, long);
+               va_end(ap);
+               rc = fcntl(fd, cmd, arg);
+               if (rc == -1) {
+                       printf("fcntl F_DUPFD %d failed: %s\n",
+                                (int)arg, strerror(errno));
+                       EXIT(1);
+               }
+               break;
+       default:
+               va_end(ap);
+               printf("fcntl cmd %d not supported\n", cmd);
+               EXIT(1);
+       }
+        printf("fcntl %d = %d, ltype = %d\n", cmd, rc, lock->l_type);
+       return rc;
+}
+
+int t_unlink(const char *path)
+{
+        int rc;
+
+        rc = unlink(path);
+        if (rc) {
+                printf("unlink(%s) error: %s\n", path, strerror(errno));
+                EXIT(-1);
+        }
+        return rc;
+}
+
+void t21()
+{
+        char file[MAX_PATH_LENGTH] = "";
+        int fd, ret;
+       struct flock lock = {
+               .l_type = F_RDLCK,
+               .l_whence = SEEK_SET,
+       };
+
+        ENTRY("basic fcntl support");
+        snprintf(file, MAX_PATH_LENGTH, "%s/test_t21_file", lustre_path);
+
+        fd = open(file, O_RDWR|O_CREAT, (mode_t)0666);
+        if (fd < 0) {
+                printf("error open file: %m\n", file);
+                exit(-1);
+        }
+
+        t_fcntl(fd, F_SETFL, O_APPEND);
+        if (!(ret = t_fcntl(fd, F_GETFL)) & O_APPEND) {
+                printf("error get flag: ret %x\n", ret);
+                exit(-1);
+        }
+
+       t_fcntl(fd, F_SETLK, &lock);
+       t_fcntl(fd, F_GETLK, &lock);
+       lock.l_type = F_WRLCK;
+       t_fcntl(fd, F_SETLKW, &lock);
+       t_fcntl(fd, F_GETLK, &lock);
+       lock.l_type = F_UNLCK;
+       t_fcntl(fd, F_SETLK, &lock);
+
+        close(fd);
+        t_unlink(file);
+        LEAVE();
+}
+
+
+int main(int argc, char * const argv[])
+{
+        /* Set D_VFSTRACE to see messages from ll_file_flock.
+           The test passes either with -o flock or -o noflock 
+           mount -o flock -t lustre uml1:/mds1/client /mnt/lustre */
+        t21();
+
+       printf("completed successfully\n");
+       return 0;
+}
diff --git a/lustre/tests/flock_test.c b/lustre/tests/flock_test.c
new file mode 100644 (file)
index 0000000..8ca0797
--- /dev/null
@@ -0,0 +1,86 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <sys/wait.h>
+
+void chd_lock_unlock(int);
+char fname[1024];
+
+int main(int argc, char **argv)
+{
+    pid_t pid;
+    int cfd, fd, rc;
+
+    if (argc != 2) {
+        fprintf(stderr, "\nUSAGE: flock_test filepath\n");
+        exit(2);
+    }
+    strncpy(fname, argv[1], 1023);
+    fname[1023] ='\0';
+    fd = open(fname, O_RDWR|O_CREAT, (mode_t)0666);
+    if (fd == -1) {
+        fprintf(stderr, "flock_test: failed to open %s : ", fname);
+        perror("");
+        exit(1);
+    }
+    if (flock(fd, LOCK_EX | LOCK_NB) == -1) {
+        fprintf(stderr, "flock_test: parent attempt to lock %s failed : ", \
+            fname);
+        perror("");
+        exit(1);
+    }
+
+    pid = fork();
+    if (pid == -1) {
+        fprintf(stderr, "flock_test: fork failed : ");
+        perror("");
+        exit(1);
+    }
+
+    if (pid == 0) {
+        pid = getpid();
+        sleep(2);
+        if ((cfd = open(fname, O_RDWR)) == -1) {
+            fprintf(stderr, "flock_test child (%d) cannot open %s: ", \
+                pid, fname);
+            perror("");
+            exit(1);
+        }
+        if(flock(cfd, LOCK_EX | LOCK_NB) != -1) {
+            fprintf(stderr, "flock_test child (%d): %s not yet locked  : ", \
+                pid, fname);
+            exit(1);
+        }
+        if(flock(fd, LOCK_UN) == -1) {
+            fprintf(stderr, "flock_test child (%d): cannot unlock %s: ", \
+                pid, fname);
+            perror("");
+            exit(1);
+        }
+        if(flock(cfd, LOCK_EX | LOCK_NB) == -1 ) {
+            fprintf(stderr, \
+                "flock_test: child (%d) cannot re-lock %s after unlocking : ", \
+                pid, fname);
+            perror("");
+            exit(1);
+        }
+        close(cfd);
+        exit(0);
+    }
+
+    waitpid(pid, &rc, 0);
+    close(fd);
+    unlink(fname);
+    if (WIFEXITED(rc) && WEXITSTATUS(rc) != 0) {
+        fprintf(stderr, "flock_test: child (%d) exit code = %d\n", \
+            pid, WEXITSTATUS(rc));
+        exit(1);
+    }
+    exit(0);
+}
index 7007f8e..c6d0a1b 100755 (executable)
@@ -336,7 +336,9 @@ test_4() {
  
     #Check FS
     echo "Test Lustre stability after OST failure"
-    client_df
+    client_df &
+    DFPIDA=$!
+    sleep 5
 
     #MDS Portion
     echo "Failing MDS"
@@ -348,7 +350,7 @@ test_4() {
     reboot_facet mds
 
     client_df &
-    DFPID=$!
+    DFPIDB=$!
     sleep 5
 
     #Reintegration
@@ -362,7 +364,8 @@ test_4() {
     start mds
     #Check FS
     
-    wait $DFPID
+    wait $DFPIDA
+    wait $DFPIDB
     clients_recover_osts ost1
     echo "Test Lustre stability after MDS failover"
     client_df || return 1
@@ -385,7 +388,9 @@ test_5() {
     
     #Check FS
     echo "Test Lustre stability after OST failure"
-    client_df
+    client_df &
+    DFPIDA=$!
+    sleep 5
     
     #OST Portion
     echo "Failing OST"
@@ -394,7 +399,9 @@ test_5() {
 
     #Check FS
     echo "Test Lustre stability after OST failure"
-    client_df
+    client_df &
+    DFPIDB=$!
+    sleep 5
 
     #Reintegration
     echo "Reintegrating OSTs"
@@ -407,6 +414,8 @@ test_5() {
     clients_recover_osts ost2
     sleep $TIMEOUT
 
+    wait $DFPIDA
+    wait $DFPIDB
     client_df || return 2
 }
 run_test 5 "Fifth Failure Mode: OST/OST `date`"
@@ -428,7 +437,9 @@ test_6() {
 
     #Check FS
     echo "Test Lustre stability after OST failure"
-    client_df
+    client_df &
+    DFPIDA=$!
+    sleep 5
 
     #CLIENT Portion
     echo "Failing CLIENTs"
@@ -436,7 +447,9 @@ test_6() {
     
     #Check FS
     echo "Test Lustre stability after CLIENTs failure"
-    client_df
+    client_df &
+    DFPIDB=$!
+    sleep 5
     
     #Reintegration
     echo "Reintegrating OST/CLIENTs"
@@ -445,6 +458,8 @@ test_6() {
     reintegrate_clients
     sleep 5 
 
+    wait $DFPIDA
+    wait $DFPIDB
     echo "Verifying mount"
     client_df || return 3
 }
@@ -539,15 +554,19 @@ test_8() {
 
     #Check FS
     echo "Test Lustre stability after OST failure"
-    client_df
-    $PDSH $LIVE_CLIENT "ls -l $MOUNT"
-    $PDSH $LIVE_CLIENT "rm -f $MOUNT/*_testfile"
+    client_df &
+    DFPID=$!
+    sleep 5
+    #non-failout hangs forever here
+    #$PDSH $LIVE_CLIENT "ls -l $MOUNT"
+    #$PDSH $LIVE_CLIENT "rm -f $MOUNT/*_testfile"
     
     #Reintegration
     echo "Reintegrating CLIENTs/OST"
     reintegrate_clients
     wait_for ost1
     start ost1
+    wait $DFPID
     client_df || return 1
     client_touch testfile2 || return 2
 
index 9ba1798..ee035d0 100644 (file)
@@ -8,6 +8,7 @@ LLIP=127.0.0.1
 
 LTREE_KERNEL=${LTREE_KERNEL:-../../lustre}
 LTREE_USER=${LTREE_USER:-../../lustre-lib}
+HOSTNAME=`hostname`
 
 # checking
 if [ ! -e $LTREE_KERNEL ]; then
@@ -31,7 +32,7 @@ cleanup()
 {
        curdir=`pwd`
        cd $LTREE_KERNEL/tests
-       $LCONF --node localhost --cleanup --force $LTREE_USER/tests/$configfile 2>&1 > /dev/null
+       $LCONF --node $HOSTNAME --cleanup --force $LTREE_USER/tests/$configfile 2>&1 > /dev/null
        cd $curdir
 }
 
@@ -39,7 +40,7 @@ configfile=liblustre_sanity_uml.xml
 
 # generate config file
 rm -f $configfile
-MDSNODE=localhost OSTNODES=localhost CLIENTS=$LLIP sh uml.sh $configfile
+MDSNODE=$HOSTNAME OSTNODES=$HOSTNAME CLIENTS=$LLIP sh uml.sh $configfile
 if [ ! -e $configfile ]; then
        echo "fail to generate config file $configfile"
        exit 1
@@ -55,7 +56,7 @@ fi
 
 #setup lustre server
 cd $LTREE_KERNEL/tests
-$LCONF --node localhost --reformat $LTREE_USER/tests/$configfile
+$LCONF --node $HOSTNAME --reformat $LTREE_USER/tests/$configfile
 rc=$?
 if [ $rc -ne 0 ]; then
        echo "setup lustre server: error $rc"
index 56eea6e..696356c 100644 (file)
 #include <lustre/lustre_user.h>
 #include <linux/obd_lov.h>
 
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
 
 
 #define MAX_LOV_UUID_COUNT      1000
 
 int read_proc_entry(char *proc_path, char *buf, int len)
 {
-        int rcnt = -1, fd;
+        int rcnt = -2, fd;
 
         if ((fd = open(proc_path, O_RDONLY)) == -1) {
                 fprintf(stderr, "open('%s') failed: %s\n",
                         proc_path, strerror(errno));
-                rcnt = -1;
+                rcnt = -3;
         } else if ((rcnt = read(fd, buf, len)) <= 0) {
                 fprintf(stderr, "read('%s') failed: %s\n",
                         proc_path, strerror(errno));
@@ -59,56 +59,65 @@ int compare(struct lov_user_md *lum_dir, struct lov_user_md *lum_file1,
         char buf[128];
         char lov_path[PATH_MAX];
         char tmp_path[PATH_MAX];
-        int i;
+        int i, rc;
 
-        if (read_proc_entry("/proc/fs/lustre/llite/fs0/lov/common_name",
-                            buf, sizeof(buf)) <= 0)
-                return -1;
+        rc = read_proc_entry("/proc/fs/lustre/llite/fs0/lov/common_name",
+                             buf, sizeof(buf)) <= 0;
+        if (rc < 0)
+                return -rc;
 
         snprintf(lov_path, sizeof(lov_path) - 1, "/proc/fs/lustre/lov/%s", buf);
 
         stripe_count = (int)lum_dir->lmm_stripe_count;
-        if (stripe_count == 0) {
+        if (stripe_count == 0 || stripe_count == (__u16)-1) {
                 snprintf(tmp_path, sizeof(tmp_path) - 1, "%s/stripecount", lov_path);
                 if (read_proc_entry(tmp_path, buf, sizeof(buf)) <= 0)
-                        return -1;
+                        return 4;
 
                 stripe_count = atoi(buf);
         }
 
+        snprintf(tmp_path, sizeof(tmp_path) - 1, "%s/numobd", lov_path);
+        if (read_proc_entry(tmp_path, buf, sizeof(buf)) <= 0)
+                return 6;
+
+        ost_count = atoi(buf);
+        stripe_count = stripe_count ? stripe_count : ost_count;
+
+        if (lum_file1->lmm_stripe_count != stripe_count) {
+                fprintf(stderr, "stripe count %d != %d\n",
+                        lum_file1->lmm_stripe_count, stripe_count);
+                return 7;
+        }
+
         stripe_size = (int)lum_dir->lmm_stripe_size;
         if (stripe_size == 0) {
                 snprintf(tmp_path, sizeof(tmp_path) - 1, "%s/stripesize", lov_path);
                 if (read_proc_entry(tmp_path, buf, sizeof(buf)) <= 0)
-                        return -1;
+                        return 5;
 
                 stripe_size = atoi(buf);
         }
 
-        snprintf(tmp_path, sizeof(tmp_path) - 1, "%s/numobd", lov_path);
-        if (read_proc_entry(tmp_path, buf, sizeof(buf)) <= 0)
-                return -1;
-
-        ost_count = atoi(buf);
-        stripe_count = stripe_count ? stripe_count : ost_count;
-
-        if ((lum_file1->lmm_stripe_count != stripe_count) ||
-            (lum_file1->lmm_stripe_size != stripe_size))
-                return -1;
+        if (lum_file1->lmm_stripe_size != stripe_size) {
+                fprintf(stderr, "stripe size %d != %d\n",
+                        lum_file1->lmm_stripe_size, stripe_size);
+                return 8;
+        }
 
         stripe_offset = (short int)lum_dir->lmm_stripe_offset;
         if (stripe_offset != -1) {
                 for (i = 0; i < stripe_count; i++)
                         if (lum_file1->lmm_objects[i].l_ost_idx !=
                             (stripe_offset + i) % ost_count)
-                                return -1;
+                                return 9;
         } else if (lum_file2 != NULL) {
                 int next, idx;
                 next = (lum_file1->lmm_objects[stripe_count-1].l_ost_idx + 1)
                        % ost_count;
                 idx = lum_file2->lmm_objects[0].l_ost_idx;
                 if (idx != next)
-                        return -1;
+                        return 10;
         }
 
         return 0;
@@ -129,7 +138,7 @@ int main(int argc, char **argv)
         }
 
         dir = opendir(argv[1]);
-        if (dir  == NULL) {
+        if (dir == NULL) {
                 fprintf(stderr, "%s opendir failed\n", argv[1]);
                 return errno;
         }
index 7c907b0..b0d703b 100755 (executable)
@@ -48,6 +48,6 @@ if [ "$LEAK_LUSTRE" -o "$LEAK_PORTALS" ]; then
        mv $TMP/debug $TMP/debug-leak.`date +%s`
        exit 254
 fi
-lsmod | grep portals && echo "modules still loaded" && exit 1
+lsmod | grep lnet && echo "modules still loaded" && exit 1
 
 exit $rc
index d34d8ca..d198c82 100755 (executable)
@@ -30,7 +30,7 @@ fi
 
 ${LCONF} $NOMOD $portals_opt $lustre_opt $node_opt $@ $conf_opt || exit 2
 
-[ $DEBUG ] && sysctl -w portals.debug=$DEBUG
+[ $DEBUG ] && sysctl -w lnet.debug=$DEBUG
 
 if [ "$MOUNT2" ]; then
        $LLMOUNT -v `hostname`:/mds1/client $MOUNT2 || exit 3
index b19837c..50453b2 100755 (executable)
@@ -7,6 +7,7 @@ config=${1:-`basename $0 .sh`.xml}
 LMC="${LMC:-lmc} -m $config"
 TMP=${TMP:-/tmp}
 
+HOSTNAME=`hostname`
 MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
 MDSSIZE=${MDSSIZE:-400000}
 FSTYPE=${FSTYPE:-ext3}
@@ -24,27 +25,36 @@ MDSISIZE=${MDSISIZE:-0}
 [ "$MDSISIZE" -gt 0 ] && IARG="--inode_size $MDSISIZE"
 
 STRIPE_BYTES=${STRIPE_BYTES:-1048576}
-STRIPES_PER_OBJ=0      # 0 means stripe over all OSTs
+STRIPES_PER_OBJ=1      # 0 means stripe over all OSTs
 
 rm -f $config
 
 # create nodes
-${LMC} --add node --node localhost || exit 10
-${LMC} --add net --node  localhost --nid `hostname` --nettype $NETTYPE || exit 11
+${LMC} --add node --node $HOSTNAME || exit 10
+${LMC} --add net --node $HOSTNAME --nid $HOSTNAME --nettype $NETTYPE || exit 11
 ${LMC} --add net --node client --nid '*' --nettype $NETTYPE || exit 12
 
+[ "x$MDS_MOUNT_OPTS" != "x" ] &&
+    MDS_MOUNT_OPTS="--mountfsoptions $MDS_MOUNT_OPTS"
+
 # configure mds server
-${LMC} --add mds --node localhost --mds mds1 --fstype $FSTYPE \
-       --dev $MDSDEV --size $MDSSIZE $JARG $IARG $MDSOPT || exit 20
+${LMC} --add mds --node $HOSTNAME --mds mds1 --fstype $FSTYPE \
+       --dev $MDSDEV \
+       $MDS_MOUNT_OPTS --size $MDSSIZE $JARG $IARG $MDSOPT || exit 20
+
+[ "x$OST_MOUNT_OPTS" != "x" ] &&
+    OST_MOUNT_OPTS="--mountfsoptions $OST_MOUNT_OPTS"
 
 # configure ost
-${LMC} -m $config --add lov --lov lov1 --mds mds1 --stripe_sz $STRIPE_BYTES \
+${LMC} --add lov --lov lov1 --mds mds1 --stripe_sz $STRIPE_BYTES \
        --stripe_cnt $STRIPES_PER_OBJ --stripe_pattern 0 $LOVOPT || exit 20
-${LMC} --add ost --nspath /mnt/ost_ns --node localhost --lov lov1 \
-       --fstype $FSTYPE --dev $OSTDEV --size $OSTSIZE $JARG $OSTOPT || exit 30
+
+${LMC} --add ost --node $HOSTNAME --lov lov1 --fstype $FSTYPE \
+       --dev $OSTDEV \
+       $OST_MOUNT_OPTS --size $OSTSIZE $JARG $OSTOPT || exit 30
 
 # create client config
-${LMC} --add mtpt --node localhost --path $MOUNT --mds mds1 --lov lov1 \
-       $CLIENTOPT || exit 40
-${LMC} --add mtpt --node client --path $MOUNT2 --mds mds1 --lov lov1 \
-       $CLIENTOPT || exit 41
+${LMC} --add mtpt --node $HOSTNAME --path $MOUNT \
+       --mds mds1 --lov lov1 $CLIENTOPT || exit 40
+${LMC} --add mtpt --node client --path $MOUNT2 \
+       --mds mds1 --lov lov1 $CLIENTOPT || exit 41
index afbbfad..0691323 100755 (executable)
@@ -9,6 +9,7 @@ config=${1:-`basename $0 .sh`.xml}
 LMC="${LMC:-lmc} -m $config"
 TMP=${TMP:-/tmp}
 
+HOSTNAME=`hostname`
 MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
 MDSSIZE=${MDSSIZE:-400000}
 FSTYPE=${FSTYPE:-ext3}
@@ -34,12 +35,12 @@ JARG=""
 rm -f $config
 
 # create nodes
-${LMC} --add node --node localhost || exit 10
-${LMC} --add net --node  localhost --nid `hostname` --nettype $NETTYPE || exit 11
+${LMC} --add node --node $HOSTNAME || exit 10
+${LMC} --add net --node $HOSTNAME --nid $HOSTNAME --nettype $NETTYPE || exit 11
 ${LMC} --add net --node client --nid '*' --nettype $NETTYPE || exit 12
 
 # configure mds server
-${LMC} --format --add mds --node localhost --mds mds1 --fstype $FSTYPE \
+${LMC} --format --add mds --node $HOSTNAME --mds mds1 --fstype $FSTYPE \
        --dev $MDSDEV --size $MDSSIZE $MDSOPT || exit 20
 
 # configure ost
@@ -50,17 +51,17 @@ for num in `seq $OSTCOUNT`; do
     OST=ost$num
     DEVPTR=OSTDEV$num
     eval $DEVPTR=${!DEVPTR:=$TMP/$OST-`hostname`}
-    ${LMC} --add ost --node localhost --lov lov1 --ost $OST --fstype $FSTYPE \
+    ${LMC} --add ost --node $HOSTNAME --lov lov1 --ost $OST --fstype $FSTYPE \
        --dev ${!DEVPTR} --size $OSTSIZE $JARG $OSTOPT || exit 30
 done
 
 
 if [ -z "$ECHO_CLIENT" ]; then
        # create client config
-       ${LMC} --add mtpt --node localhost --path $MOUNT --mds mds1 --lov lov1 \
-               $CLIENTOPT || exit 40
-       ${LMC} --add mtpt --node client --path $MOUNT2 --mds mds1 --lov lov1 \
-               $CLIENTOPT || exit 41
+       ${LMC} --add mtpt --node $HOSTNAME --path $MOUNT \
+               --mds mds1 --lov lov1 $CLIENTOPT || exit 40
+       ${LMC} --add mtpt --node client --path $MOUNT2 \
+               --mds mds1 --lov lov1 $CLIENTOPT || exit 41
 else
-       ${LMC} --add echo_client --node localhost --ost lov1 || exit 42
+       ${LMC} --add echo_client --node $HOSTNAME --ost lov1 || exit 42
 fi
index 8641d1d..d5f1b27 100644 (file)
@@ -2,8 +2,8 @@
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
  * Compile with:
- * cc -I../../portals/include -o mkdirdeep mkdirdeep.c
- *    -L../../portals/linux/utils -lptlctl
+ * cc -I../../lnet/include -o mkdirdeep mkdirdeep.c
+ *    -L../../lnet/linux/utils -lptlctl
  */
 
 #include <stdio.h>
index 907f853..9260f7b 100755 (executable)
@@ -17,8 +17,8 @@ rm -f $OOS
 
 sleep 1        # to ensure we get up-to-date statfs info
 
-#echo -1 > /proc/sys/portals/debug
-#echo 0x40a8 > /proc/sys/portals/subsystem_debug
+#echo -1 > /proc/sys/lnet/debug
+#echo 0x40a8 > /proc/sys/lnet/subsystem_debug
 #lctl clear
 #lctl debug_daemon start /r/tmp/debug 1024
 
diff --git a/lustre/tests/random-reads.c b/lustre/tests/random-reads.c
new file mode 100644 (file)
index 0000000..178ecc1
--- /dev/null
@@ -0,0 +1,197 @@
+/*
+ * Lustre Random Reads test
+ *
+ * Copyright (c) 2005 Cluster File Systems, Inc.
+ *
+ * Author: Nikita Danilov <nikita@clusterfs.com>
+ *
+ * This file is part of Lustre, http://www.lustre.org.
+ *
+ * Lustre is free software; you can redistribute it and/or modify it under the
+ * terms of version 2 of the GNU General Public License as published by the
+ * Free Software Foundation.
+ *
+ * Lustre is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with Lustre; if not, write to the Free Software Foundation, Inc., 675 Mass
+ * Ave, Cambridge, MA 02139, USA.
+ */
+
+#define _XOPEN_SOURCE 500 /* for pread(2) */
+
+#include <errno.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <sys/time.h>
+
+long long atoll(const char *nptr);
+
+static void usage(void)
+{
+       printf("random-reads: read random chunks of a file.\n");
+       printf("Usage:\n\n");
+       printf("random-reads -f <filename> -s <filesize> -b <buffersize> -a <adjacent reads> [-v] [-h] [-C] [-S <seed>] [-n <iterations>] [-w <width>]\n");
+}
+
+enum {
+       BSIZE_DEFAULT = 16 * 4096
+};
+
+#define LOG(level, ...)                                \
+({                                             \
+       if ((level) <= verbosity)               \
+               fprintf(stderr, __VA_ARGS__);   \
+})
+
+enum {
+       LOG_CRIT,
+       LOG_WARN,
+       LOG_INFO,
+       LOG_DEBUG
+};
+
+enum {
+       RR_OK,
+       RR_PARSE,
+       RR_SET,
+       RR_MALLOC,
+       RR_OPEN,
+       RR_PRECLEAN,
+       RR_READ
+};
+
+int main(int argc, char **argv)
+{
+       int    verbosity = LOG_CRIT;
+       char  *fname = NULL;
+       loff_t size = 0;
+       size_t bsize = 0;
+       int    ad = 1;
+       int    preclean = 0;
+       int    width = 10;
+       unsigned int seed = 0;
+       unsigned long iterations = 0;
+
+       int opt;
+       int fd;
+       unsigned long nblocks;
+       unsigned long i;
+       ssize_t  ret;
+
+       struct timeval start;
+       struct timeval stop;
+
+       double usecs;
+
+       char *buf;
+
+       do {
+               opt = getopt(argc, argv, "f:s:b:va:hCS:n:w:");
+               switch (opt) {
+               case -1:
+                       break;
+               default:
+                       LOG(LOG_CRIT, "Unable to parse command line.\n");
+               case 'h':
+                       usage();
+                       return RR_PARSE;
+               case 'v':
+                       verbosity ++;
+                       break;
+               case 'f':
+                       fname = strdup(optarg);
+                       break;
+               case 's':
+                       size = atoll(optarg);
+                       break;
+               case 'b':
+                       bsize = atol(optarg);
+                       break;
+               case 'a':
+                       ad = atoi(optarg);
+                       break;
+               case 'C':
+                       preclean = 1;
+                       break;
+               case 'S':
+                       seed = atol(optarg);
+                       break;
+               case 'n':
+                       iterations = atoll(optarg);
+                       break;
+               case 'w':
+                       width = atoi(optarg);
+                       break;
+               }
+       } while (opt != -1);
+
+       if (fname == NULL || size == 0 || bsize == 0 || ad <= 0) {
+               usage();
+               return RR_SET;
+       }
+
+       bsize /= ad;
+       nblocks = size / bsize;
+       buf = malloc(bsize);
+       if (buf == NULL) {
+               LOG(LOG_CRIT, "malloc(%i) failure: %m\n", bsize);
+               return RR_MALLOC;
+       }
+
+       fd = open(fname, (preclean ? O_RDWR : O_RDONLY) | O_CREAT, 0700);
+       if (fd == -1) {
+               LOG(LOG_CRIT, "malloc(\"%s\") failure: %m\n", fname);
+               return RR_OPEN;
+       }
+       if (preclean) {
+               loff_t towrite;
+               size_t count;
+
+               LOG(LOG_INFO, "precleaning");
+               for (i = 0, towrite = size; towrite > 0; towrite -= ret) {
+                       count = bsize < towrite ? bsize : towrite;
+                       memset(buf, bsize, seed + i++);
+                       ret = write(fd, buf, count);
+                       if (ret < 0) {
+                               LOG(LOG_CRIT, "write() failure: %m\n");
+                               return RR_PRECLEAN;
+                       }
+               }
+       }
+       if (seed != 0)
+               srand(seed);
+       gettimeofday(&start, NULL);
+       for (i = 0; !iterations || i < iterations; i ++) {
+               unsigned long block_nr;
+               int j;
+
+               block_nr = (int) ((double)nblocks*rand()/(RAND_MAX+1.0));
+               if (i % width == 0)
+                       LOG(LOG_INFO, "\n%9lu: ", i);
+               LOG(LOG_INFO, "%7lu ", block_nr);
+               for (j = 0; j < ad; j++) {
+                       ret = pread(fd, buf, bsize, (block_nr + j) * bsize);
+                       if (ret != bsize) {
+                               LOG(LOG_CRIT,
+                                   "pread(...%zi, %li) got: %zi, %m\n",
+                                   bsize, block_nr * bsize, ret);
+                               return RR_READ;
+                       }
+               }
+       }
+       gettimeofday(&stop, NULL);
+       usecs = (stop.tv_sec - start.tv_sec) * 1000000. +
+               stop.tv_usec - start.tv_usec;
+       printf("\n%f\n", usecs / 1000000.);
+       return RR_OK;
+}
index e0d4b3c..c784c50 100755 (executable)
@@ -2,8 +2,8 @@
 
 set -e
 
-#         bug  2986 5494
-ALWAYS_EXCEPT="20b  24"
+#         bug  2986 5494 7288
+ALWAYS_EXCEPT="20b  24   27"
 
 
 LUSTRE=${LUSTRE:-`dirname $0`/..}
@@ -65,7 +65,7 @@ if [ ! -z "$EVAL" ]; then
 fi
 
 if [ "$ONLY" == "cleanup" ]; then
-    sysctl -w portals.debug=0 || true
+    sysctl -w lnet.debug=0 || true
     FORCE=--force cleanup
     exit
 fi
@@ -252,8 +252,8 @@ test_17() {
     sysctl -w lustre.fail_loc=0
     do_facet client "df $DIR"
     # expect cmp to fail
-    do_facet client "cmp /etc/termcap $DIR/$tfile"  && return 1
-    do_facet client "rm $DIR/$tfile" || return 2
+    do_facet client "cmp /etc/termcap $DIR/$tfile"  && return 3
+    do_facet client "rm $DIR/$tfile" || return 4
     return 0
 }
 run_test 17 "timeout bulk get, evict client (2732)"
index 0817fbc..7f3ccb2 100755 (executable)
@@ -2,6 +2,9 @@
 
 set -e
 
+#         bug 6088
+ALWAYS_EXCEPT="8"
+
 LUSTRE=${LUSTRE:-`dirname $0`/..}
 . $LUSTRE/tests/test-framework.sh
 
@@ -48,7 +51,7 @@ cleanup() {
 }
 
 if [ "$ONLY" == "cleanup" ]; then
-    sysctl -w portals.debug=0
+    sysctl -w lnet.debug=0
     FORCE=--force cleanup
     exit
 fi
@@ -243,7 +246,7 @@ test_12() {
     MULTIPID=$!
     sleep 5
 
-    # drop first enqueue
+#define OBD_FAIL_LDLM_ENQUEUE            0x302
     sysctl -w lustre.fail_loc=0x80000302
     facet_failover mds
     df $MOUNT || return 1
index 753b858..cbe7da1 100755 (executable)
@@ -40,7 +40,7 @@ cleanup() {
 }
 
 if [ "$ONLY" == "cleanup" ]; then
-    sysctl -w portals.debug=0
+    sysctl -w lnet.debug=0
     FORCE=--force cleanup
     exit
 fi
index 1e7268f..23bd3c3 100755 (executable)
@@ -14,8 +14,8 @@ init_test_env $@
 . ${CONFIG:=$LUSTRE/tests/cfg/local.sh}
 
 # Skip these tests
-# bug number: 2766
-ALWAYS_EXCEPT="0b"
+# bug number: 2766 4176
+ALWAYS_EXCEPT="0b  39"
 
 gen_config() {
     rm -f $XMLCONFIG
@@ -47,7 +47,7 @@ cleanup() {
 }
 
 if [ "$ONLY" == "cleanup" ]; then
-    sysctl -w portals.debug=0 || true
+    sysctl -w lnet.debug=0 || true
     FORCE=--force cleanup
     exit
 fi
@@ -756,7 +756,7 @@ test_38() {
 }
 run_test 38 "test recovery from unlink llog (test llog_gen_rec) "
 
-test_39() {
+test_39() { # bug 4176
     createmany -o $DIR/$tfile-%d 800
     replay_barrier mds
     unlinkmany $DIR/$tfile-%d 0 400
@@ -837,24 +837,23 @@ test_42() {
     createmany -o $DIR/$tfile-%d 800
     replay_barrier ost
     unlinkmany $DIR/$tfile-%d 0 400
-    DEBUG42=`sysctl portals.debug | tr -d ' '`
-    sysctl -w portals.debug=-1
+    DEBUG42=`sysctl -n lnet.debug`
+    sysctl -w lnet.debug=-1
     facet_failover ost
     
-    # osc is evicted, fs is smaller
-    blocks_after=`df -P $MOUNT | tail -n 1 | awk '{ print $2 }'`
-    [ $blocks_after -lt $blocks ] || return 1
+    # osc is evicted, fs is smaller (but only with failout OSTs (bug 7287)
+    #blocks_after=`df -P $MOUNT | tail -n 1 | awk '{ print $2 }'`
+    #[ $blocks_after -lt $blocks ] || return 1
     echo wait for MDS to timeout and recover
     sleep $((TIMEOUT * 2))
-    sysctl -w $DEBUG42
+    sysctl -w lnet.debug=$DEBUG42
     unlinkmany $DIR/$tfile-%d 400 400
     $CHECKSTAT -t file $DIR/$tfile-* && return 2 || true
 }
 run_test 42 "recovery after ost failure"
 
-# b=2530
 # timeout in MDS/OST recovery RPC will LBUG MDS
-test_43() {
+test_43() { # bug 2530
     replay_barrier mds
 
     # OBD_FAIL_OST_CREATE_NET 0x204
@@ -913,9 +912,7 @@ test_46() {
 }
 run_test 46 "Don't leak file handle after open resend (3325)"
 
-# b=2824
-test_47() {
-
+test_47() { # bug 2824
     # create some files to make sure precreate has been done on all 
     # OSTs. (just in case this test is run independently)
     createmany -o $DIR/$tfile 20  || return 1
@@ -939,7 +936,6 @@ test_47() {
 run_test 47 "MDS->OSC failure during precreate cleanup (2824)"
 
 test_48() {
-
     replay_barrier mds
     createmany -o $DIR/$tfile 20  || return 1
     # OBD_FAIL_OST_EROFS 0x216
index c6d6bdb..dcd683c 100644 (file)
@@ -79,7 +79,6 @@ for R in $ROUTERS; do
                --target_cluster_id $SERVER_CLUSTER
 done
 
---dev $OSTDEV --size $OSTSIZE
 # OSTNODE
 COUNT=1
 for OSTNODE in $OSTNODES; do
index f36a9ff..4db7617 100644 (file)
@@ -8,6 +8,7 @@
 #include <errno.h>
 #include <ctype.h>
 #include <sys/types.h>
+#include <pwd.h>
 #include <grp.h>
 #include <sys/wait.h>
 
@@ -37,21 +38,43 @@ int main(int argc, char **argv)
         uid_t user_id = 0;
         gid_t grp_id = 0, supp_groups[NGROUPS_MAX] = { 0 };
 
-        if (argc == 1)
+        if (argc == 1) {
+                fprintf(stderr, "No parameter count\n");
                 Usage_and_abort(name);
+        }
 
         // get UID and GID
         while ((c = getopt(argc, argv, "+u:g:hG::")) != -1) {
                 switch (c) {
                 case 'u':
-                        user_id = (uid_t)atoi(optarg);
+                        if (!isdigit(optarg[0])) {
+                                struct passwd *pw = getpwnam(optarg);
+                                if (pw == NULL) {
+                                        fprintf(stderr, "parameter '%s' bad\n",
+                                                optarg);
+                                        Usage_and_abort(name);
+                                }
+                                user_id = pw->pw_uid;
+                        } else {
+                                user_id = (uid_t)atoi(optarg);
+                        }
                         uid_is_set = 1;
                         if (!gid_is_set)
                                 grp_id = user_id;
                         break;
 
                 case 'g':
-                        grp_id = (gid_t)atoi(optarg);
+                        if (!isdigit(optarg[0])) {
+                                struct group *gr = getgrnam(optarg);
+                                if (gr == NULL) {
+                                        fprintf(stderr, "getgrname %s failed\n",
+                                                optarg);
+                                        Usage_and_abort(name);
+                                }
+                                grp_id = gr->gr_gid;
+                        } else {
+                                grp_id = (gid_t)atoi(optarg);
+                        }
                         gid_is_set = 1;
                         break;
 
@@ -74,11 +97,13 @@ int main(int argc, char **argv)
                 }
         }
 
-        if (!uid_is_set)
+        if (!uid_is_set) {
+                fprintf(stderr, "Must specify uid to run.\n");
                 Usage_and_abort(name);
+        }
 
         if (optind == argc) {
-                fputs("Must specify command to run.\n", stderr);
+                fprintf(stderr, "Must specify command to run.\n");
                 Usage_and_abort(name);
         }
 
index 821ac46..b23ea12 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 MNT=${MNT:-/mnt/lustre}
 DIR=${DIR:-$MNT/`hostname`}
-#[ -e /proc/sys/portals/debug ] && echo 0 > /proc/sys/portals/debug 
+#[ -e /proc/sys/lnet/debug ] && echo 0 > /proc/sys/lnet/debug 
 mkdir -p $DIR
 TGT=$DIR/client.txt
 SRC=${SRC:-/usr/lib/dbench/client.txt}
index ce5634b..4e9bdd7 100755 (executable)
@@ -26,7 +26,7 @@ test_fail() {
 set -vx
 
 LCTL=../utils/lctl
-OSC=OSC_localhost_UUID
+OSC=OSC_`hostname`_UUID
 MDC=MDC_client1_UUID
 TIMEOUT=5 # complete in finite time
 
index db74c2e..5eacb9c 100755 (executable)
@@ -8,7 +8,7 @@
 [ $1 ] && SIZE=$1
 LOOP=0
 rm -f endiozone
-echo 0 > /proc/sys/portals/debug
+echo 0 > /proc/sys/lnet/debug
 while date; do
        LOOP=`expr $LOOP + 1`
        echo "Test #$LOOP"
index 7167d2d..d403bb4 100755 (executable)
@@ -48,7 +48,7 @@ USED=`expr $USED + 16`        # Some space for the status file
 THREADS=1
 while [ $THREADS -lt 196 ]; do
        echo "starting $THREADS threads at `date`"
-       [ $V -gt 0 ] || echo 0 > /proc/sys/portals/debug
+       [ $V -gt 0 ] || echo 0 > /proc/sys/lnet/debug
        $SRCDIR/createdestroy /mnt/lustre/file-$$ $COUNT $V $THREADS
        $SRCDIR/openclose /mnt/lustre/file-$$ $COUNT $THREADS
        THREADS=`expr $THREADS + 5`
index 77d6768..58f33ef 100644 (file)
@@ -76,7 +76,7 @@ for CMD in test_getattr test_brw_write test_brw_read; do
        runthreads 1 $CMD 1 1 $PG
        runthreads 1 $CMD 100 1 $PG
 
-       echo 0 > /proc/sys/portals/debug
+       echo 0 > /proc/sys/lnet/debug
        runthreads 1 $CMD $COUNT_100 -10 $PG
        [ "$PGV" ] && runthreads 1 $CMD $COUNT_1000 -10 $PGV
 
diff --git a/lustre/tests/sanity-ldlm.sh b/lustre/tests/sanity-ldlm.sh
deleted file mode 100644 (file)
index e5bd422..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/bash
-
-set -e
-
-SRCDIR=`dirname $0`
-PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH
-
-MOUNT=${MOUNT:-/mnt/lustre}
-DIR=${DIR:-$MOUNT}
-export NAME=$NAME
-clean() {
-        echo -n "cln.."
-        sh llmountcleanup.sh > /dev/null || exit 20
-}
-CLEAN=${CLEAN:-clean}
-start() {
-        echo -n "mnt.."
-        sh llrmount.sh > /dev/null || exit 10
-        echo "done"
-}
-START=${START:-start}
-
-log() {
-       echo "$*"
-       lctl mark "$*" || /bin/true
-}
-
-pass() {
-    echo PASS
-}
-
-mount | grep $MOUNT || sh llmount.sh
-
-log '== drop ldlm request  ======================== test 1'
-echo 0x302 > /proc/sys/lustre/fail_loc
-echo 3 > /proc/sys/lustre/timeout
-touch $DIR/f &
-sleep 5
-echo 0 > /proc/sys/lustre/fail_loc
-lctl --device 6 recover
-pass
-$CLEAN
-$START
-
-log '== drop ldlm reply (bug 1139) ================ test 2'
-echo 0x213 > /proc/sys/lustre/fail_loc
-echo 3 > /proc/sys/lustre/timeout
-touch $DIR/f
-pass
-$CLEAN
-$START
-
-log '== drop reply after completion (bug 1068) ==== test 3'
-touch $DIR/f
-stat $DIR/f
-echo 0x213 > /proc/sys/lustre/fail_loc
-echo 3 > /proc/sys/lustre/timeout
-echo foo >> $DIR/f
-pass
-$CLEAN
-$START
index 11874aa..0b6c8b7 100644 (file)
@@ -8,9 +8,17 @@ set -e
 
 ONLY=${ONLY:-"$*"}
 # bug number for skipped test: 2108 3637 3561 5188/5749
-ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"42a 42c  45   68"}
+ALWAYS_EXCEPT=${ALWAYS_EXCEPT:-"27o 31 42a 42c  45   68"}
 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
 
+[ "$SLOW" = "no" ] && EXCEPT="$EXCEPT 24o 51b 51c 64b 71"
+
+case `uname -r` in
+2.4*) FSTYPE=${FSTYPE:-ext3} ;;
+2.6*) FSTYPE=${FSTYPE:-ldiskfs}; ALWAYS_EXCEPT="$ALWAYS_EXCEPT 60 69";;
+*) error "unsupported kernel" ;;
+esac
+
 [ "$ALWAYS_EXCEPT$EXCEPT" ] && \
        echo "Skipping tests: `echo $ALWAYS_EXCEPT $EXCEPT`"
 
@@ -18,7 +26,6 @@ SRCDIR=`dirname $0`
 export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH:/sbin
 
 TMP=${TMP:-/tmp}
-FSTYPE=${FSTYPE:-ext3}
 
 CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
 CREATETEST=${CREATETEST:-createtest}
@@ -30,6 +37,7 @@ LCTL=${LCTL:-lctl}
 MCREATE=${MCREATE:-mcreate}
 OPENFILE=${OPENFILE:-openfile}
 OPENUNLINK=${OPENUNLINK:-openunlink}
+RANDOM_READS=${RANDOM_READS:-"random-reads"}
 TOEXCL=${TOEXCL:-toexcl}
 TRUNCATE=${TRUNCATE:-truncate}
 MUNLINK=${MUNLINK:-munlink}
@@ -41,11 +49,18 @@ MEMHOG=${MEMHOG:-memhog}
 DIRECTIO=${DIRECTIO:-directio}
 
 if [ $UID -ne 0 ]; then
+    echo "Warning: running as non-root uid $UID"
        RUNAS_ID="$UID"
        RUNAS=""
 else
        RUNAS_ID=${RUNAS_ID:-500}
        RUNAS=${RUNAS:-"runas -u $RUNAS_ID"}
+
+    # $RUNAS_ID may get set incorrectly somewhere else
+    if [ $RUNAS_ID -eq 0 ]; then
+       echo "Error: \$RUNAS_ID set to 0, but \$UID is also 0!"
+       exit 1
+    fi
 fi
 
 export NAME=${NAME:-local}
@@ -79,8 +94,9 @@ trace() {
 }
 TRACE=${TRACE:-""}
 
+LPROC=/proc/fs/lustre
 check_kernel_version() {
-       VERSION_FILE=/proc/fs/lustre/kernel_version
+       VERSION_FILE=$LPROC/kernel_version
        WANT_VER=$1
        [ ! -f $VERSION_FILE ] && echo "can't find kernel version" && return 1
        GOT_VER=`cat $VERSION_FILE`
@@ -153,6 +169,7 @@ run_test() {
 [ "$SANITYLOG" ] && rm -f $SANITYLOG || true
 
 error() { 
+       sysctl -w lustre.fail_loc=0
        log "FAIL: $TESTNAME $@"
        if [ "$SANITYLOG" ]; then
                echo "FAIL: $TESTNAME $@" >> $SANITYLOG
@@ -181,12 +198,13 @@ fi
 DIR=${DIR:-$MOUNT}
 [ -z "`echo $DIR | grep $MOUNT`" ] && echo "$DIR not in $MOUNT" && exit 99
 
-LOVNAME=`cat /proc/fs/lustre/llite/*/lov/common_name | tail -n 1`
-OSTCOUNT=`cat /proc/fs/lustre/lov/$LOVNAME/numobd`
-STRIPECOUNT=`cat /proc/fs/lustre/lov/$LOVNAME/stripecount`
-STRIPESIZE=`cat /proc/fs/lustre/lov/$LOVNAME/stripesize`
-ORIGFREE=`cat /proc/fs/lustre/lov/$LOVNAME/kbytesavail`
+LOVNAME=`cat $LPROC/llite/*/lov/common_name | tail -n 1`
+OSTCOUNT=`cat $LPROC/lov/$LOVNAME/numobd`
+STRIPECOUNT=`cat $LPROC/lov/$LOVNAME/stripecount`
+STRIPESIZE=`cat $LPROC/lov/$LOVNAME/stripesize`
+ORIGFREE=`cat $LPROC/lov/$LOVNAME/kbytesavail`
 MAXFREE=${MAXFREE:-$((200000 * $OSTCOUNT))}
+MDS=$(\ls $LPROC/mds 2> /dev/null | grep -v num_refs | tail -n 1)
 
 [ -f $DIR/d52a/foo ] && chattr -a $DIR/d52a/foo
 [ -f $DIR/d52b/foo ] && chattr -i $DIR/d52b/foo
@@ -198,6 +216,7 @@ echo preparing for tests involving mounts
 EXT2_DEV=${EXT2_DEV:-/tmp/SANITY.LOOP}
 touch $EXT2_DEV
 mke2fs -j -F $EXT2_DEV 8000 > /dev/null
+echo # add a newline after mke2fs.
 
 umask 077
 
@@ -353,6 +372,15 @@ test_6g() {
 }
 run_test 6g "Is new dir in sgid dir inheriting group?"
 
+test_6h() { # bug 7331
+       [ $RUNAS_ID -eq $UID ] && echo "skipping test 6f" && return
+       touch $DIR/f6h || error "touch failed"
+       chown $RUNAS_ID:$RUNAS_ID $DIR/f6h || error "initial chown failed"
+       $RUNAS -G$RUNAS_ID chown $RUNAS_ID:0 $DIR/f6h && error "chown worked"
+       $CHECKSTAT -t file -u \#$RUNAS_ID -g \#$RUNAS_ID $DIR/f6h || error
+}
+run_test 6h "$RUNAS chown RUNAS_ID.0 .../f6h (should return error)"
+
 test_7a() {
        mkdir $DIR/d7
        $MCREATE $DIR/d7/f
@@ -796,6 +824,23 @@ test_26e() {
 }
 run_test 26e "unlink multiple component recursive symlink ======"
 
+# recursive symlinks (bug 7022)
+test_26f() {
+       mkdir $DIR/foo         || error "mkdir $DIR/foo failed"
+       cd $DIR/foo            || error "cd $DIR/foo failed"
+       mkdir -p bar/bar1      || error "mkdir bar/bar1 failed"
+       mkdir foo              || error "mkdir foo failed"
+       cd foo                 || error "cd foo failed"
+       ln -s .. dotdot        || error "ln dotdot failed"
+       ln -s dotdot/bar bar   || error "ln bar failed"
+       cd ../..               || error "cd ../.. failed"
+       output=`ls foo/foo/bar/bar1`
+       [ "$output" = bar1 ] && error "unexpected output"
+       rm -r foo              || error "rm foo failed"
+       $CHECKSTAT -a $DIR/foo || error "foo not gone"
+}
+run_test 26f "rm -r of a directory which has recursive symlink ="
+
 test_27a() {
        echo '== stripe sanity =============================================='
        mkdir $DIR/d27
@@ -907,106 +952,119 @@ test_27m() {
        touch $DIR/d27/f27m_$i
        [ `$LFIND $DIR/d27/f27m_$i | grep -A 10 obdidx | awk '{print $1}'| grep -w "0"` ] && \
                error "OST0 was full but new created file still use it"
-       rm $DIR/d27/f27m_1
+       rm -r $DIR/d27
 }
 run_test 27m "create file while OST0 was full =================="
 
 # osc's keep a NOSPC stick flag that gets unset with rmdir
 reset_enospc() {
-    sysctl -w lustre.fail_loc=0
-    mkdir -p $DIR/d27/nospc
-    rmdir $DIR/d27/nospc
+       [ "$1" ] && FAIL_LOC=$1 || FAIL_LOC=0
+       mkdir -p $DIR/d27/nospc
+       rmdir $DIR/d27/nospc
+       sysctl -w lustre.fail_loc=$FAIL_LOC
 }
 
 exhaust_precreations() {
-    local i
-    ostidx=$1
-    ost=$(head -n $(( ostidx + 1 )) /proc/fs/lustre/lov/${LOVNAME}/target_obd | tail -n 1 | awk '{print $2}' | sed -e 's/_UUID$//')
-    mds=$(find /proc/fs/lustre/mds/ -maxdepth 1 -type d | tail -n 1)
-    mds=$(basename $mds)
-
-    last_id=$(tail -n 1 /proc/fs/lustre/osc/OSC_*_${ost}_${mds}/prealloc_last_id)
-    next_id=$(tail -n 1 /proc/fs/lustre/osc/OSC_*_${ost}_${mds}/prealloc_next_id)
-
-    mkdir -p $DIR/d27/${ost}
-    $LSTRIPE $DIR/d27/${ost} 0 $ostidx 1
-    sysctl -w lustre.fail_loc=0x215
-    echo "Creating to objid $last_id on ost $ost..."
-    for (( i = next_id; i <= last_id; i++ )) ; do
-       touch $DIR/d27/${ost}/f$i
-    done
-    reset_enospc
+       OSTIDX=$1
+       OST=$(head -n $((OSTIDX + 1)) $LPROC/lov/${LOVNAME}/target_obd |\
+               tail -n 1 | awk '{print $2}' | sed -e 's/_UUID$//')
+
+       last_id=$(cat $LPROC/osc/OSC_*_${OST}_${MDS}/prealloc_last_id)
+       next_id=$(cat $LPROC/osc/OSC_*_${OST}_${MDS}/prealloc_next_id)
+
+       mkdir -p $DIR/d27/${OST}
+       $LSTRIPE $DIR/d27/${OST} 0 $OSTIDX 1
+#define OBD_FAIL_OST_ENOSPC              0x215
+       sysctl -w lustre.fail_loc=0x215
+       echo "Creating to objid $last_id on ost $OST..."
+       createmany -o $DIR/d27/${OST}/f $next_id $((last_id - next_id + 2))
+       grep '[0-9]' $LPROC/osc/OSC_*_${OST}_${MDS}/prealloc*
+       reset_enospc $2
 }
 
 exhaust_all_precreations() {
-    local i
-    for (( i=0; i < OSTCOUNT; i++ )) ; do
-       exhaust_precreations $i
-    done
+       local i
+       for (( i=0; i < OSTCOUNT; i++ )) ; do
+               exhaust_precreations $i 0x215
+       done
+       reset_enospc $1
 }
 
 test_27n() {
-    [ "$OSTCOUNT" -lt "2" ] && echo "" && return
-    reset_enospc
-    rm -f $DIR/d27/f27n
-    exhaust_precreations 0
-    sysctl -w lustre.fail_loc=0x80000215
-    touch $DIR/d27/f27n || error
-    reset_enospc
+       [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && echo "skipping test" && return
+
+       reset_enospc
+       rm -f $DIR/d27/f27n
+       exhaust_precreations 0 0x80000215
+
+       touch $DIR/d27/f27n || error
+
+       reset_enospc
 }
-run_test 27n "creating a file while some OSTs are full (should succeed) ==="
+run_test 27n "create file with some full OSTs =================="
 
 test_27o() {
-    [ "$OSTCOUNT" -lt "2" ] && echo "" && return
-    reset_enospc
-    rm -f $DIR/d27/f27o
-    exhaust_all_precreations
-    sysctl -w lustre.fail_loc=0x215
-    touch $DIR/d27/f27o && error
-    reset_enospc
+       [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && echo "skipping test" && return
+
+       reset_enospc
+       rm -f $DIR/d27/f27o
+       exhaust_all_precreations 0x215
+
+       touch $DIR/d27/f27o && error
+
+       reset_enospc
 }
-run_test 27o "creating a file while all OSTs are full (should error) ==="
+run_test 27o "create file with all full OSTs (should error) ===="
 
 test_27p() {
-    [ "$OSTCOUNT" -lt "2" ] && echo "" && return
-    reset_enospc
-    rm -f $DIR/d27/f27p
-    exhaust_precreations 0
-    $MCREATE $DIR/d27/f27p || error
-    $TRUNCATE $DIR/d27/f27p 80000000 || error
-    $CHECKSTAT -s 80000000 $DIR/d27/f27p || error
-    sysctl -w lustre.fail_loc=0x80000215
-    echo foo >> $DIR/d27/f27p || error
-    $CHECKSTAT -s 80000004 $DIR/d27/f27p || error
-    reset_enospc
-}
-run_test 27p "appending to a truncated file while some OSTs are full ==="
+       [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && echo "skipping test" && return
+
+       reset_enospc
+       rm -f $DIR/d27/f27p
+
+       $MCREATE $DIR/d27/f27p || error
+       $TRUNCATE $DIR/d27/f27p 80000000 || error
+       $CHECKSTAT -s 80000000 $DIR/d27/f27p || error
+
+       exhaust_precreations 0 0x80000215
+       echo foo >> $DIR/d27/f27p || error
+       $CHECKSTAT -s 80000004 $DIR/d27/f27p || error
+
+       reset_enospc
+}
+run_test 27p "append to a truncated file with some full OSTs ==="
 
 test_27q() {
-    [ "$OSTCOUNT" -lt "2" ] && echo "" && return
-    reset_enospc
-    rm -f $DIR/d27/f27q
-    exhaust_precreations 0
-    $MCREATE $DIR/d27/f27q || error
-    $TRUNCATE $DIR/d27/f27q 80000000 || error
-    $CHECKSTAT -s 80000000 $DIR/d27/f27q || error
-    sysctl -w lustre.fail_loc=0x215
-    echo foo >> $DIR/d27/f27q && error
-    $CHECKSTAT -s 80000000 $DIR/d27/f27q || error
-    reset_enospc
-}
-run_test 27q "appending to a truncated file while all OSTs are full (should error) ==="
+       [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && echo "skipping test" && return
+
+       reset_enospc
+       rm -f $DIR/d27/f27q
+
+       $MCREATE $DIR/d27/f27q || error
+       $TRUNCATE $DIR/d27/f27q 80000000 || error
+       $CHECKSTAT -s 80000000 $DIR/d27/f27q || error
+
+       exhaust_all_precreations 0x215
+
+       echo foo >> $DIR/d27/f27q && error
+       $CHECKSTAT -s 80000000 $DIR/d27/f27q || error
+
+       reset_enospc
+}
+run_test 27q "append to truncated file with all OSTs full (should error) ==="
 
 test_27r() {
-    [ "$OSTCOUNT" -lt "2" ] && echo "" && return
-    reset_enospc
-    rm -f $DIR/d27/f27r
-    exhaust_precreations 0
-    sysctl -w lustre.fail_loc=0x80000215
-    $LSTRIPE $DIR/d27/f27r 0 0 -1 && error
-    reset_enospc
+       [ "$OSTCOUNT" -lt "2" -o -z "$MDS" ] && echo "skipping test" && return
+
+       reset_enospc
+       rm -f $DIR/d27/f27r
+       exhaust_precreations 0 0x80000215
+
+       $LSTRIPE $DIR/d27/f27r 0 0 2 # && error
+
+       reset_enospc
 }
-run_test 27r "creating a file while some OSTs are full with an explicit stripe count (should error) ==="
+run_test 27r "stripe file with some full OSTs (shouldn't LBUG) ==="
 
 test_28() {
        mkdir $DIR/d28
@@ -1015,10 +1073,10 @@ test_28() {
 run_test 28 "create/mknod/mkdir with bad file types ============"
 
 cancel_lru_locks() {
-       for d in /proc/fs/lustre/ldlm/namespaces/$1*; do
+       for d in $LPROC/ldlm/namespaces/$1*; do
                echo clear > $d/lru_size
        done
-       grep "[0-9]" /proc/fs/lustre/ldlm/namespaces/$1*/lock_unused_count /dev/null
+       grep "[0-9]" $LPROC/ldlm/namespaces/$1*/lock_unused_count /dev/null
 }
 
 test_29() {
@@ -1027,7 +1085,7 @@ test_29() {
        touch $DIR/d29/foo
        log 'first d29'
        ls -l $DIR/d29
-       MDCDIR=${MDCDIR:-/proc/fs/lustre/ldlm/namespaces/MDC_*}
+       MDCDIR=${MDCDIR:-$LPROC/ldlm/namespaces/MDC_*}
        LOCKCOUNTORIG=`cat $MDCDIR/lock_count`
        LOCKUNUSEDCOUNTORIG=`cat $MDCDIR/lock_unused_count`
        log 'second d29'
@@ -1036,7 +1094,7 @@ test_29() {
        LOCKCOUNTCURRENT=`cat $MDCDIR/lock_count`
        LOCKUNUSEDCOUNTCURRENT=`cat $MDCDIR/lock_unused_count`
        if [ $LOCKCOUNTCURRENT -gt $LOCKCOUNTORIG ]; then
-               echo > /proc/fs/lustre/ldlm/dump_namespaces
+               echo > $LPROC/ldlm/dump_namespaces
                error "CURRENT: $LOCKCOUNTCURRENT > $LOCKCOUNTORIG"
                $LCTL dk | sort -k4 -t: > $TMP/test_29.dk
                log "dumped log to $TMP/test_29.dk (bug 5793)"
@@ -1339,9 +1397,6 @@ test_32r() {
 }
 run_test 32r "opendir follows mountpoints in Lustre (should return error)"
 
-#   chmod 444 /mnt/lustre/somefile
-#   open(/mnt/lustre/somefile, O_RDWR)
-#   Should return -1
 test_33() {
        rm -f $DIR/test_33_file
        touch $DIR/test_33_file
@@ -1352,7 +1407,7 @@ test_33() {
         log 33_2
 }
 run_test 33 "write file with mode 444 (should return error) ===="
-                                                                                                                                               
+
 test_33a() {
         rm -fr $DIR/d33
         mkdir -p $DIR/d33
@@ -1511,7 +1566,7 @@ test_41() {
 run_test 41 "test small file write + fstat ====================="
 
 count_ost_writes() {
-        cat /proc/fs/lustre/osc/*/stats |
+        cat $LPROC/osc/*/stats |
             awk -vwrites=0 '/ost_write/ { writes += $2 } END { print writes; }'
 }
 
@@ -1559,7 +1614,7 @@ test_42a() {
        stop_writeback
        sync; sleep 1; sync # just to be safe
        BEFOREWRITES=`count_ost_writes`
-       grep "[0-9]" /proc/fs/lustre/osc/OSC*MNT*/cur_grant_bytes
+       grep "[0-9]" $LPROC/osc/OSC*MNT*/cur_grant_bytes
        dd if=/dev/zero of=$DIR/f42a bs=1024 count=100
        AFTERWRITES=`count_ost_writes`
        [ $BEFOREWRITES -eq $AFTERWRITES ] || \
@@ -1579,16 +1634,12 @@ test_42b() {
         AFTERWRITES=`count_ost_writes`
         if [ $BEFOREWRITES -lt $AFTERWRITES ]; then
                 error "$BEFOREWRITES < $AFTERWRITES on unlink"
-                $LCTL dk | sort -k 4 -t: | gzip -9 > $TMP/debug-unlk.bug5195.gz
-                error "please put $TMP/debug-unlk.bug5195.gz on bug 5195 once"
         fi
         BEFOREWRITES=`count_ost_writes`
         sync || error "sync: $?"
         AFTERWRITES=`count_ost_writes`
         if [ $BEFOREWRITES -lt $AFTERWRITES ]; then
                 error "$BEFOREWRITES < $AFTERWRITES on sync"
-                $LCTL dk | sort -k 4 -t: | gzip -9 > $TMP/debug-sync.bug5195.gz
-                error "please put $TMP/debug-sync.bug5195.gz on bug 5195 once"
         fi
         dmesg | grep 'error from obd_brw_async' && error 'error writing back'
        start_writeback
@@ -1727,7 +1778,7 @@ run_test 44a "test sparse pwrite ==============================="
 
 dirty_osc_total() {
        tot=0
-       for d in /proc/fs/lustre/osc/*/cur_dirty_bytes; do
+       for d in $LPROC/osc/*/cur_dirty_bytes; do
                tot=$(($tot + `cat $d`))
        done
        echo $tot
@@ -1833,7 +1884,7 @@ run_test 48b "Access removed working dir (should return errors)="
 
 test_48c() { # bug 2350
        check_kernel_version 36 || return 0
-       #sysctl -w portals.debug=-1
+       #sysctl -w lnet.debug=-1
        #set -vx
        mkdir -p $DIR/d48c/dir
        cd $DIR/d48c/dir
@@ -1856,7 +1907,7 @@ run_test 48c "Access removed working subdir (should return errors)"
 
 test_48d() { # bug 2350
        check_kernel_version 36 || return 0
-       #sysctl -w portals.debug=-1
+       #sysctl -w lnet.debug=-1
        #set -vx
        mkdir -p $DIR/d48d/dir
        cd $DIR/d48d/dir
@@ -1880,7 +1931,7 @@ run_test 48d "Access removed parent subdir (should return errors)"
 
 test_48e() { # bug 4134
        check_kernel_version 41 || return 0
-       #sysctl -w portals.debug=-1
+       #sysctl -w lnet.debug=-1
        #set -vx
        mkdir -p $DIR/d48e/dir
        cd $DIR/d48e/dir
@@ -2198,13 +2249,9 @@ run_test 58 "verify cross-platform wire constants =============="
 
 test_59() {
        echo "touch 130 files"
-       for i in `seq 1 130` ; do
-               touch $DIR/59-$i
-       done
+       createmany -o $DIR/f59- 130
        echo "rm 130 files"
-       for i in `seq 1 130` ; do
-               rm -f $DIR/59-$i
-       done
+       unlinkmany $DIR/f59- 130
        sync
        sleep 2
         # wait for commitment of removal
@@ -2220,7 +2267,7 @@ run_test 60 "llog sanity tests run from kernel module =========="
 test_60b() { # bug 6411
        dmesg > $DIR/dmesg
        LLOG_COUNT=`dmesg | grep -c llog_test`
-       [ $LLOG_COUNT -gt 50 ] && error "CDEBUG_LIMIT broken" || true
+       [ $LLOG_COUNT -gt 50 ] && error "CDEBUG_LIMIT not limiting messages"|| true
 }
 run_test 60b "limit repeated messages from CERROR/CWARN ========"
 
@@ -2267,8 +2314,8 @@ run_test 63 "Verify oig_wait interruption does not crash ======="
 # bug 2248 - async write errors didn't return to application on sync
 # bug 3677 - async write errors left page locked
 test_63b() {
-       DBG_SAVE=`cat /proc/sys/portals/debug`
-       sysctl -w portals.debug=-1
+       DBG_SAVE=`sysctl -n lnet.debug`
+       sysctl -w lnet.debug=-1
 
        # ensure we have a grant to do async writes
        dd if=/dev/zero of=/mnt/lustre/f63b bs=4k count=1
@@ -2278,13 +2325,13 @@ test_63b() {
        sysctl -w lustre.fail_loc=0x80000406
        multiop /mnt/lustre/f63b Owy && \
                $LCTL dk /tmp/test63b.debug && \
-               sysctl -w portals.debug=$DBG_SAVE && \
+               sysctl -w lnet.debug=$DBG_SAVE && \
                error "sync didn't return ENOMEM"
        grep -q locked /proc/fs/lustre/llite/fs*/dump_page_cache && \
                $LCTL dk /tmp/test63b.debug && \
-               sysctl -w portls.debug=$DBG_SAVE && \
+               sysctl -w lnet.debug=$DBG_SAVE && \
                error "locked page left in cache after async error" || true
-       sysctl -w portals.debug=$DBG_SAVE
+       sysctl -w lnet.debug=$DBG_SAVE
 }
 run_test 63b "async write errors should be returned to fsync ==="
 
@@ -2399,7 +2446,16 @@ test_67() { # bug 3285 - supplementary group fails on MDS, passes on client
        mkdir $DIR/d67
        chmod 771 $DIR/d67
        chgrp $RUNAS_ID $DIR/d67
-       $RUNAS -g $(($RUNAS_ID + 1)) -G1,2,$RUNAS_ID ls $DIR/d67 && error ||true
+       $RUNAS -u $RUNAS_ID -g $(($RUNAS_ID + 1)) -G1,2,$RUNAS_ID ls $DIR/d67
+       RC=$?
+       if [ "$MDS" ]; then
+               # can't tell which is correct otherwise
+               GROUP_UPCALL=`cat /proc/fs/lustre/mds/$MDS/group_upcall`
+               [ "$GROUP_UPCALL" = "NONE" -a $RC -eq 0 ] && \
+                       error "no-upcall passed" || true
+               [ "$GROUP_UPCALL" != "NONE" -a $RC -ne 0 ] && \
+                       error "upcall failed" || true
+       fi
 }
 run_test 67 "supplementary group failure (should return error) ="
 
@@ -2507,7 +2563,7 @@ test_71() {
 run_test 71 "Running dbench on lustre (don't segment fault) ===="
 
 test_72() { # bug 5695 - Test that on 2.6 remove_suid works properly
-        check_kernel_version 43 || return 0
+       check_kernel_version 43 || return 0
        [ "$RUNAS_ID" = "$UID" ] && echo "skipping test 72" && return
        touch $DIR/f72
        chmod 777 $DIR/f72
@@ -2609,6 +2665,53 @@ test_100() {
 }
 run_test 100 "check local port using privileged port ==========="
 
+function get_named_value()
+{
+    local tag
+
+    tag=$1
+    while read ;do
+        line=$REPLY
+        case $line in
+        $tag*)
+            echo $line | sed "s/^$tag//"
+            break
+            ;;
+        esac
+    done
+}
+
+test_101() {
+    local s
+    local discard
+    local nreads
+
+    for s in $LPROC/osc/OSC_*/rpc_stats ;do
+        echo 0 > $s
+    done
+    for s in $LPROC/llite/*/read_ahead_stats ;do
+        echo 0 > $s
+    done
+
+    #
+    # randomly read 10000 of 64K chunks from 200M file.
+    #
+    nreads=10000
+       $RANDOM_READS -f /mnt/lustre/room101.area -s200000000 -b65536 -C -n$nreads
+
+    discard=0
+    for s in $LPROC/llite/*/read_ahead_stats ;do
+        discard=$(($discard + $(cat $s | get_named_value 'read but discarded')))
+    done
+
+    if [ $(($discard * 10)) -gt $nreads ] ;then
+        cat $LPROC/osc/OSC_*/rpc_stats
+        cat $LPROC/llite/*/read_ahead_stats
+        error "too many ($discard) discarded pages" 
+    fi
+}
+run_test 101 "check read-ahead for random reads ==========="
+
 TMPDIR=$OLDTMPDIR
 TMP=$OLDTMP
 HOME=$OLDHOME
index dfe9187..f5f4d14 100644 (file)
@@ -373,6 +373,7 @@ run_test 17 "resource creation/LVB creation race ==============="
 
 test_18() {
        ./mmap_sanity -d $MOUNT1 -m $MOUNT2
+       sync; sleep 1; sync
 }
 run_test 18 "mmap sanity check ================================="
 
index af7c41f..ea3c411 100644 (file)
@@ -12,7 +12,7 @@
 #include <sys/ioctl.h>
 
 #if 0
-#include <linux/extN_fs.h>
+#include <linux/ldiskfs_fs.h>
 #endif
 #include <liblustre.h>
 #include <linux/lustre_lib.h>
@@ -153,7 +153,7 @@ int main(int argc, char ** argv)
                                        strerror(errno));
                                 break;
                         }
-                        rc = ioctl(fd, EXTN_IOC_GETEA, NULL);
+                        rc = ioctl(fd, LDISKFS_IOC_GETEA, NULL);
                         if (rc < 0) {
                                 printf("ioctl(%s) error: %s\n", filename,
                                        strerror(errno));
index f5e4509..7631827 100644 (file)
@@ -182,8 +182,8 @@ replay_barrier() {
     df $MOUNT
     do_facet $facet $LCTL --device %${facet}_svc readonly
     do_facet $facet $LCTL --device %${facet}_svc notransno
-    do_facet $facet $LCTL mark "REPLAY BARRIER"
-    $LCTL mark "REPLAY BARRIER"
+    do_facet $facet $LCTL mark "$facet REPLAY BARRIER"
+    $LCTL mark "local REPLAY BARRIER"
 }
 
 replay_barrier_nodf() {
@@ -191,8 +191,8 @@ replay_barrier_nodf() {
     do_facet $facet sync
     do_facet $facet $LCTL --device %${facet}_svc readonly
     do_facet $facet $LCTL --device %${facet}_svc notransno
-    do_facet $facet $LCTL mark "REPLAY BARRIER"
-    $LCTL mark "REPLAY BARRIER"
+    do_facet $facet $LCTL mark "$facet REPLAY BARRIER"
+    $LCTL mark "local REPLAY BARRIER"
 }
 
 mds_evict_client() {
@@ -518,9 +518,10 @@ pgcache_empty() {
 ##################################
 # Test interface 
 error() {
-    echo "${TESTSUITE}: **** FAIL:" $@
-    log "FAIL: $@"
-    exit 1
+       sysctl -w lustre.fail_loc=0
+       echo "${TESTSUITE}: **** FAIL:" $@
+       log "FAIL: $@"
+       exit 1
 }
 
 build_test_filter() {
@@ -529,7 +530,7 @@ build_test_filter() {
             eval ONLY_${O}=true
         done
         [ "$EXCEPT$ALWAYS_EXCEPT" ] && \
-               log "skipping `echo $EXCEPT $ALWAYS_EXCEPT`"
+               log "skipping test `echo $EXCEPT $ALWAYS_EXCEPT`"
         for E in $EXCEPT $ALWAYS_EXCEPT; do
             eval EXCEPT_${E}=true
         done
index 5445b0a..4f86411 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/expect
 
 spawn lwizard $argv
+HOSTNAME=`hostname`
 set timeout 3
 expect {
        "overwrite existing" {
@@ -8,7 +9,7 @@ expect {
        }
 }
 expect "HOSTNAME for mds"
-send -- "localhost\n"
+send -- "$HOSTNAME\n"
 expect "network INTERFACE"
 send -- "192.168.1.29/24 10.0.0.29/24\n"
 expect "enter the device or loop file name for mds"
@@ -18,7 +19,7 @@ send -- "10000\n"
 expect "configure FAILOVER"
 send -- "n\n"
 expect "HOSTNAME for ost"
-send -- "localhost\n"
+send -- "$HOSTNAME\n"
 expect "network INTERFACE"
 send -- "192.168.1.29/24 10.0.0.29/24\n"
 expect "device or loop file name for ost"
index a9480a8..aaf500d 100644 (file)
@@ -55,10 +55,6 @@ CLIENTS=${CLIENTS:-"uml3"}
 
 rm -f $config
 
-h2localhost () {
-       echo localhost
-}
-       
 h2tcp () {
        case $1 in
        client) echo '\*' ;;
@@ -74,7 +70,7 @@ h2elan () {
 }
 
 h2gm () {
-       echo `gmnalnid -n$1`
+       echo `gmlndnid -n$1`
 }
 
 h2iib () {
index 94ed749..78fd71b 100644 (file)
@@ -21,7 +21,7 @@ static int usage(char *prog, FILE *out)
         exit(out == stderr);
 }
 
-#define EXTN_IOC_CREATE_INUM            _IOW('f', 5, long)
+#define LDISKFS_IOC_CREATE_INUM            _IOW('f', 5, long)
 
 int main(int argc, char ** argv)
 {
@@ -39,9 +39,9 @@ int main(int argc, char ** argv)
        wantedi = atoi(argv[2]);
        printf("Creating %s/%d with ino %d\n", argv[1], wantedi, wantedi);
 
-       rc = ioctl(dirfd, EXTN_IOC_CREATE_INUM, wantedi);
+       rc = ioctl(dirfd, LDISKFS_IOC_CREATE_INUM, wantedi);
        if (rc < 0) {
-              perror("ioctl(EXTN_IOC_CREATE_INUM)");
+              perror("ioctl(LDISKFS_IOC_CREATE_INUM)");
               exit(2);
        }
 
index 723ce4c..16c51fe 100644 (file)
@@ -49,20 +49,20 @@ int main (int argc, char *argv[]) {
          struct stat stat_buf;
          ssize_t ret;
          char *filename = "/mnt/lustre/write_disjoint";
+         int numloops = 1000;
 
         error = MPI_Init(&argc, &argv);
         if (error != MPI_SUCCESS)
                 rprintf(-1, -1, "MPI_Init failed: %d\n", error);
         /* Parse command line options */
-        while (1) {
-                c = getopt(argc, argv, "f:");
-                if (c == -1)
-                        break;
-
+        while ((c = getopt(argc, argv, "f:n:")) != EOF) {
                 switch (c) {
                 case 'f':
                         filename = optarg;
                         break;
+                case 'n':
+                        numloops = strtoul(optarg, NULL, 0);
+                        break;
                 }
         }
 
@@ -88,7 +88,7 @@ int main (int argc, char *argv[]) {
          if (fd < 0)
                  rprintf(rank, -1, "open() returned %s\n", strerror(errno));
          
-         for (n=0; n < 1000 ; n++) {
+         for (n=0; n < numloops; n++) {
                  /* reset the environment */
                  if (rank == 0) {
                          ret = truncate(filename, 0);
index ff9a21c..23be7e4 100644 (file)
@@ -182,8 +182,12 @@ int run_one_child(char *file, int thread, int seconds)
                 }
                 if (unlink(filename) < 0) {
                         print_err("unlink", filename, &cur, errno);
-                        rc = errno;
-                        break;
+                        if (errno == ENOENT) {
+                                printf("Ignoring known bug 6082\n");
+                        } else {
+                                rc = errno;
+                                break;
+                        }
                 }
         }
 
index 53539a4..ea39651 100644 (file)
@@ -18,6 +18,9 @@ lfs
 mkfs_lustre
 mount_lustre
 llog_reader
+llmount
+l_getgroups
+mount.lustre
 wiretest
 .*.cmd
 .*.d
index 2938400..dc75e6f 100644 (file)
@@ -196,11 +196,11 @@ class LustreDB:
             ret = []
             devs = self.lookup_class('mds')
             for tgt in devs:
-                if tgt.get_val('group', tgt.get_value('name')) == group:
+                if tgt.get_val('group', tgt.get_val('name')) == group:
                     ret.append(tgt.getUUID())
             devs = self.lookup_class('ost')
             for tgt in devs:
-                if tgt.get_val('group', tgt.get_value('name')) == group:
+                if tgt.get_val('group', tgt.get_val('name')) == group:
                     ret.append(tgt.getUUID())
             if self.caching_enabled:
                 self.lookup_group_cache[group] = ret
index 033dcb8..d937e62 100644 (file)
@@ -4,8 +4,9 @@ SUBDIRS = Lustre
 
 AM_CFLAGS=$(LLCFLAGS)
 AM_CPPFLAGS=$(LLCPPFLAGS) -DLUSTRE_UTILS=1
+AM_LDFLAGS := -L$(top_builddir)/portals/utils
 
-LIBPTLCTL := $(top_builddir)/portals/utils/libptlctl.a
+LIBPTLCTL := $(top_builddir)/lnet/utils/libptlctl.a
 
 sbin_scripts = lconf lmc llanalyze llstat.pl llobdstat.pl lactive      \
        load_ldap.sh lrun lwizard
@@ -13,7 +14,8 @@ bin_scripts = lfind lstripe llog_reader
 
 if UTILS
 rootsbin_SCRIPTS =
-sbin_PROGRAMS = lctl obdio obdbarrier lload wirecheck wiretest mount_lustre mount.lustre mkfs_lustre mkfs.lustre
+sbin_PROGRAMS = lctl obdio obdbarrier lload wirecheck wiretest \
+       mount_lustre mount.lustre mkfs_lustre mkfs.lustre l_getgroups 
 bin_PROGRAMS = lfs llog_reader
 lib_LIBRARIES = liblustreapi.a
 sbin_SCRIPTS = $(sbin_scripts)
index 8909422..be8c565 100644 (file)
 #include <fcntl.h>
 #include <pwd.h>
 #include <grp.h>
+#include <stdarg.h>
+#include <syslog.h>
+
 #include <lustre/lustre_user.h>
 
+static char *progname;
+
+void usage(FILE *out)
+{
+        fprintf(out, "\nusage: %s {-d | mdsname} {uid}\n"
+                     "Normally invoked as an upcall from Lustre, set via:\n"
+                     "  /proc/fs/lustre/mds/{mdsname}/group_upcall\n"
+                     "\t-d: debug, print values to stdout instead of Lustre\n",
+                     progname);
+}
+
+static int compare_u32(const void *v1, const void *v2)
+{
+        return (*(__u32 *)v1 - *(__u32 *)v2);
+}
+
+static void errlog(const char *fmt, ...)
+{
+        va_list arg;
+
+        openlog(progname, LOG_PERROR, LOG_AUTHPRIV);
+
+        va_start(arg, fmt);
+        vsyslog(LOG_NOTICE, fmt, arg);
+        va_end(arg);
+
+        closelog();
+}
+
 int get_groups_local(struct mds_grp_downcall_data **grp)
 {
         struct mds_grp_downcall_data *param;
@@ -40,21 +72,27 @@ int get_groups_local(struct mds_grp_downcall_data **grp)
 
         pw = getpwuid((*grp)->mgd_uid);
         if (!pw) {
-                (*grp)->mgd_err = -errno;
+                errlog("no such user %u\n", (*grp)->mgd_uid);
+                (*grp)->mgd_err = errno ? errno : EIDRM;
                 return sizeof(*param);
         }
+        (*grp)->mgd_gid = pw->pw_gid;
 
         maxgroups = sysconf(_SC_NGROUPS_MAX);
         size = offsetof(struct mds_grp_downcall_data, mgd_groups[maxgroups]);
         param = malloc(size);
         if (param == NULL) {
-                (*grp)->mgd_err = -ENOMEM;
+                errlog("fail to alloc %d bytes for uid %u with %d groups\n",
+                       size, (*grp)->mgd_uid, maxgroups);
                 return sizeof(*param);
         }
 
         memcpy(param, *grp, sizeof(*param));
+        param->mgd_groups[param->mgd_ngroups++] = pw->pw_gid;
         *grp = param;
         while ((gr = getgrent())) {
+                if (gr->gr_gid == pw->pw_gid)
+                        continue;
                 if (!gr->gr_mem)
                         continue;
                 for (i = 0; gr->gr_mem[i]; i++) {
@@ -68,6 +106,8 @@ int get_groups_local(struct mds_grp_downcall_data **grp)
                         break;
         }
         endgrent();
+        qsort(param->mgd_groups, param->mgd_ngroups,
+              sizeof(param->mgd_groups[0]), compare_u32);
 
         return size;
 }
@@ -76,29 +116,65 @@ int get_groups_local(struct mds_grp_downcall_data **grp)
  * MDS doesn't continue to wait on the upcall. */
 int main(int argc, char **argv)
 {
-        int fd, rc, size;
+        int fd, rc, size, debug = 0;
         struct mds_grp_downcall_data sparam = { MDS_GRP_DOWNCALL_MAGIC };
         struct mds_grp_downcall_data *param = &sparam;
-        char pathname[1024];
+        char pathname[1024], *end;
 
-        if (argc != 3) {
-                printf("bad parameter\n");
-                return -1;
-        }
+        progname = strrchr(argv[0], '/');
+        if (progname == NULL)
+                progname = argv[0];
+        else
+                progname++;
 
-        snprintf(pathname, 1024, "/proc/fs/lustre/mds/%s/group_info", argv[1]);
-        param->mgd_uid = atoi(argv[2]);
+        if (strcmp(argv[1], "-d") == 0)
+                debug = 1;
 
-        fd = open(pathname, O_WRONLY);
-        if (fd < 0) {
-                printf("can't open device %s\n", pathname);
-                return -1;
+        if (argc != 3) {
+                fprintf(stderr, "%s: bad parameter count\n", progname);
+                usage(stderr);
+                return EINVAL;
+        }
+        param->mgd_uid = strtoul(argv[2], &end, 0);
+        if (*end) {
+                fprintf(stderr, "%s: invalid uid '%s'\n", progname, argv[2]);
+                usage(stderr);
+                return EINVAL;
         }
 
         size = get_groups_local(&param);
+        if (debug) {
+                int i;
+                if (param->mgd_err) {
+                        if (param->mgd_err != ENXIO)
+                                fprintf(stderr,
+                                        "%s: error getting uid %d groups: %s\n",
+                                        progname, param->mgd_uid,
+                                        strerror(param->mgd_err));
+                        rc = param->mgd_err;
+                } else {
+                        printf("uid=%d gid=", param->mgd_uid);
+                        for (i = 0; i < param->mgd_ngroups; i++)
+                                printf("%s%d", i > 0 ? "," : "",
+                                       param->mgd_groups[i]);
+                        printf("\n");
+                        rc = 0;
+                }
+        } else {
+                snprintf(pathname, 1024, "/proc/fs/lustre/mds/%s/group_info",
+                         argv[1]);
+                fd = open(pathname, O_WRONLY);
+                if (fd < 0) {
+                        fprintf(stderr, "%s: can't open device %s: %s\n",
+                                progname, pathname, strerror(errno));
+                        rc = errno;
+                } else {
+                        rc = write(fd, param, size);
+                        if (rc > 0)
+                                rc = 0;
 
-        rc = write(fd, param, size);
-
-        close(fd);
+                        close(fd);
+                }
+        }
         return rc;
 }
index 145a67e..5754b6c 100755 (executable)
@@ -27,7 +27,7 @@
 #
 # Based in part on the XML obdctl modifications done by Brian Behlendorf
 
-import sys, getopt, types
+import sys, getopt, types, errno
 import string, os, stat, popen2, socket, time, random, fcntl, select
 import re, exceptions, signal, traceback
 import xml.dom.minidom
@@ -58,7 +58,7 @@ MAXTCPBUF = 16777216
 # Maximum number of devices to search for.
 # (the /dev/loop* nodes need to be created beforehand)
 MAX_LOOP_DEVICES = 256
-PORTALS_DIR = '../portals'
+PORTALS_DIR = '../lnet'
 
 # Needed to call lconf --record
 CONFIG_FILE = ""
@@ -202,133 +202,6 @@ class CommandError (exceptions.Exception):
         else:
             print self.cmd_err
 
-
-# ============================================================
-# handle daemons, like the acceptor
-class DaemonHandler:
-    """ Manage starting and stopping a daemon. Assumes daemon manages
-    it's own pid file. """
-
-    def __init__(self, cmd):
-        self.command = cmd
-        self.path =""
-
-    def start(self):
-        if self.running():
-            log(self.command, "already running.")
-        if not self.path:
-            self.path = find_prog(self.command)
-            if not self.path:
-                panic(self.command, "not found.")
-        ret, out = runcmd(self.path +' '+ self.command_line())
-        if ret:
-            # wait for up to 15 seconds checking to see if a competing daemon
-            # starts successfully
-            loop_count = 15
-            while (not self.running()) and (loop_count > 0):
-                loop_count = loop_count - 1
-                time.sleep(1)
-
-            if not self.running():
-                raise CommandError(self.path, out, ret)
-
-    def stop(self):
-        if self.running():
-            pid = self.read_pidfile()
-            if not pid:
-                return
-            try:
-                log ("killing process", pid)
-                os.kill(pid, 15)
-                #time.sleep(1) # let daemon die
-            except OSError, e:
-                log("unable to kill", self.command, e)
-
-            # wait for the dameon to die for up to 15 seconds
-            # before complaining about it
-            loop_count = 15
-            while self.running() and (self.read_pidfile == pid) and (loop_count > 0):
-                loop_count = loop_count - 1
-                time.sleep(1)
-            if self.running() and (self.read_pidfile == pid):
-                log("unable to kill", self.command, "process", pid)
-
-    def running(self):
-        pid = self.read_pidfile()
-        if pid:
-            try:
-                os.kill(pid, 0)
-            except OSError:
-                self.clean_pidfile()
-            else:
-                return 1
-        return 0
-
-    def read_pidfile(self):
-        try:
-            fp = open(self.pidfile(), 'r')
-            pid = int(fp.read())
-            fp.close()
-            return pid
-        except ValueError:
-            print "WARNING: invalid pid in %s, removed" % self.pidfile()
-            print "WARNING: You may need to stop acceptor by yourself"
-            os.unlink(self.pidfile())
-            return 0
-        except IOError:
-            return 0
-
-    def clean_pidfile(self):
-        """ Remove a stale pidfile """
-        log("removing stale pidfile:", self.pidfile())
-        try:
-            os.unlink(self.pidfile())
-        except OSError, e:
-            log(self.pidfile(), e)
-
-class AcceptorHandler(DaemonHandler):
-    def __init__(self, port, net_type):
-        DaemonHandler.__init__(self, "acceptor")
-        self.port = port
-        self.net_type = net_type
-        self.flags = ''
-        if config.allow_unprivileged_port:
-            self.flags = '-p'
-
-    def pidfile(self):
-        return "/var/run/%s-%d.pid" % (self.command, self.port)
-
-    def command_line(self):
-        return string.join(map(str,(self.flags, self.port)))
-
-acceptors = {}
-
-# start the acceptors
-def run_acceptors():
-    if config.lctl_dump or config.record:
-        return
-    for port in acceptors.keys():
-        daemon = acceptors[port]
-        #if daemon.net_type == 'tcp' and not daemon.running():
-        #    daemon.start()
-
-def run_one_acceptor(port):
-    if config.lctl_dump or config.record:
-        return
-    if acceptors.has_key(port):
-        daemon = acceptors[port]
-        #if daemon.net_type == 'tcp' and not daemon.running():
-        #    daemon.start()
-    else:
-         panic("run_one_acceptor: No acceptor defined for port:", port)
-
-def stop_acceptor(port):
-    if acceptors.has_key(port):
-        daemon = acceptors[port]
-        #if daemon.net_type == 'tcp' and daemon.running():
-        #    daemon.stop()
-
-
 # ============================================================
 # handle lctl interface
 class LCTLInterface:
@@ -436,7 +309,7 @@ class LCTLInterface:
         return rc, out
 
     def unconfigure_network(self):
-        """get portals to unreference itself"""
+        """get lnet to unreference itself"""
         cmds = """
   network unconfigure"""
         self.run(cmds)
@@ -450,32 +323,6 @@ class LCTLInterface:
   quit """ % (dev, log)
         self.run(cmds)
 
-    def network(self, net, nid):
-        """ set mynid """
-#        cmds =  """
-#    network %s
-#    mynid %s
-#    quit """ % (net, nid)
-#        self.run(cmds)
-
-    # add an interface
-    def add_interface(self, net, ip, netmask = ""):
-        """ add an interface """
-#         cmds = """
-#   network %s
-#   add_interface %s %s
-#   quit """ % (net, ip, netmask)
-#         self.run(cmds)
-
-    # delete an interface
-    def del_interface(self, net, ip):
-        """ delete an interface """
-#         cmds = """
-#   network %s
-#   del_interface %s
-#   quit """ % (net, ip)
-#         self.run(cmds)
-
     # create a new connection
     def add_uuid(self, net_type, uuid, nid):
         if nid.find('@') < 0:
@@ -485,75 +332,16 @@ class LCTLInterface:
         cmds = "\n  add_uuid %s %s" %(uuid, nidstr)
         self.run(cmds)
 
-    def add_peer(self, net_type, nid, hostaddr, port):
-        """ noop """
-#         if net_type  in ('tcp','openib','ra','cray_kern_nal') and not config.lctl_dump:
-#             cmds =  """
-#   network %s
-#   add_peer %s %s %d
-#   quit""" % (net_type,
-#              nid, hostaddr, port )
-#             self.run(cmds)
-#         elif net_type in ('iib',) and not config.lctl_dump:
-#             cmds =  """
-#   network %s
-#   add_peer %s
-#   quit""" % (net_type,
-#              nid )
-#             self.run(cmds)
-#         elif net_type in ('vib',) and not config.lctl_dump:
-#             cmds =  """
-#   network %s
-#   add_peer %s %s
-#   quit""" % (net_type,
-#              nid, hostaddr )
-#             self.run(cmds)
-
     def connect(self, srv):
-        self.add_uuid(srv.net_type, srv.nid_uuid, srv.nid)
-#        if config.lctl_dump:
-#            return
-#
-#        if srv.net_type  in ('tcp',):
-#            host = socket.gethostname()
-#            node_list = []
-#            if config.node:
-#                node_list.append(config.node)
-#            else:
-#                if len(host) > 0:
-#                    node_list.append(host)
-#                node_list.append('localhost')
-#
-#            node_db = None
-#            for h in node_list: # we are quite sure we can find the node_db
-#                node_db = toplustreDB.lookup_name(h, 'node')
-#                if node_db:
-#                    break
-#
-#            hostaddr = None
-#            for netuuid in node_db.get_networks():
-#                localnet = toplustreDB.lookup(netuuid)
-#                localnet = Network(localnet)
-#                if localnet.net_type != 'tcp':
-#                    continue  # only tcp understands multiple hostaddrs
-#
-#                # always true for tcp network
-#                if localnet.hostaddr[0] and srv.hostaddr[0]:
-#                    for lnet in localnet.hostaddr:
-#                        for pnet in srv.hostaddr:
-#                            if srv.netmatch(lnet, pnet) != 0:
-#                                hostaddr = string.split(pnet, '/')[0]
-#                                #find one is enough, should break the top-most loop
-#                                break
-#                        if hostaddr: break
-#                    else:     # can't find a match
-#                        hostaddr = string.split(srv.hostaddr[0], '/')[0]
-#                    break
-#
-#            self.add_peer(srv.net_type, srv.nid, hostaddr, srv.port)
-#            
-#        if srv.net_type in ('openib','iib','vib','ra'):
-#            self.add_peer(srv.net_type, srv.nid, srv.hostaddr[0], srv.port)
+        if not srv.nid_uuid:
+            panic('nid_uuid not set for ', srv.net_type, srv.nid)
+        hostaddr = srv.db.get_hostaddr()
+        if len(hostaddr) > 1:
+            panic('multiple --hostaddr for ', srv.nid_uuid, ' not supported')
+        elif len(hostaddr) == 1 and hostaddr[0] != srv.nid:
+            panic('different --hostaddr and --nid  for ', srv.nid_uuid, ' not supported')
+        else:
+            self.add_uuid(srv.net_type, srv.nid_uuid, srv.nid)
 
     # Recover a device
     def recover(self, dev_name, new_conn):
@@ -562,80 +350,11 @@ class LCTLInterface:
     recover %s""" %(dev_name, new_conn)
         self.run(cmds)
 
-    # add a route to a range
-    def add_route(self, net, gw, lo, hi):
-        """ noop """
-#         cmds =  """
-#   network %s
-#   add_route %s %s %s
-#   quit  """ % (net,
-#                gw, lo, hi)
-#         try:
-#             self.run(cmds)
-#         except CommandError, e:
-#             log ("ignore: ")
-#             e.dump()
-
-    def del_route(self, net, gw, lo, hi):
-        """ noop """
-#         cmds =  """
-#   ignore_errors
-#   network %s
-#   del_route %s %s %s
-#   quit  """ % (net, gw, lo, hi)
-#         self.run(cmds)
-
-    # add a route to a host
-    def add_route_host(self, net, uuid, gw, tgt):
-        self.add_uuid(net, uuid, tgt)
-#         cmds =  """
-#   network %s
-#   add_route %s %s
-#   quit """ % (net,
-#               gw, tgt)
-#         try:
-#             self.run(cmds)
-#         except CommandError, e:
-#             log ("ignore: ")
-#             e.dump()
-
-    # add a route to a range
-    def del_route_host(self, net, uuid, gw, tgt):
-        self.del_uuid(uuid)
-#         cmds =  """
-#   ignore_errors
-#   network %s
-#   del_route %s %s
-#   quit  """ % (net, gw, tgt)
-#         self.run(cmds)
-
-
-    def del_peer(self, net_type, nid, hostaddr):
-        """ noop """
-#         if net_type  in ('tcp',) and not config.lctl_dump:
-#                 cmds =  """
-#   ignore_errors
-#   network %s
-#   del_peer %s %s single_share
-#   quit""" % (net_type,
-#              nid, hostaddr)
-#                 self.run(cmds)
-#         elif net_type  in ('openib','iib','vib','ra') and not config.lctl_dump:
-#                 cmds =  """
-#   ignore_errors
-#   network %s
-#   del_peer %s single_share
-#   quit""" % (net_type,
-#              nid)
-#                 self.run(cmds)
-
     # disconnect one connection
     def disconnect(self, srv):
+        if not srv.nid_uuid:
+            panic('nid_uuid not set for ', srv.net_type, srv.nid)
         self.del_uuid(srv.nid_uuid)
-#         if srv.net_type  in ('tcp','openib','iib','vib','ra') and not config.lctl_dump:
-#             if srv.hostaddr[0]:
-#                 hostaddr = string.split(srv.hostaddr[0], '/')[0]
-#             self.del_peer(srv.net_type, srv.nid, hostaddr)
 
     def del_uuid(self, uuid):
         cmds =  """
@@ -644,16 +363,6 @@ class LCTLInterface:
   quit""" % (uuid,)
         self.run(cmds)
 
-    # disconnect all
-    def disconnectAll(self, net):
-        """ noop """
-#         cmds =  """
-#   ignore_errors
-#   network %s
-#   disconnect
-#   quit""" % (net)
-#         self.run(cmds)
-
     def attach(self, type, name, uuid):
         cmds = """
   attach %s %s %s
@@ -675,13 +384,6 @@ class LCTLInterface:
   quit""" % (name)
         self.run(cmds)
 
-    def add_conn(self, name, conn_uuid):
-        cmds = """
-  cfg_device %s
-  add_conn %s
-  quit""" % (name, conn_uuid)
-        self.run(cmds)
-
     # create a new device with lctl
     def newdev(self, type, name, uuid, setup = ""):
         self.attach(type, name, uuid);
@@ -885,7 +587,7 @@ def mkfs(dev, devsize, fstype, jsize, isize, mkfsoptions, isblock=1):
         # devsize is in 1k, and fs block count is in 4k
         block_cnt = devsize/4
 
-    if fstype in ('ext3', 'extN', 'ldiskfs'):
+    if fstype in ('ext3', 'ldiskfs'):
         # ext3 journal size is in megabytes
         if jsize == 0:
             if devsize == 0:
@@ -958,7 +660,7 @@ def mkfs(dev, devsize, fstype, jsize, isize, mkfsoptions, isblock=1):
     if ret:
         panic("Unable to build fs:", dev, string.join(out))
     # enable hash tree indexing on fsswe
-    if fstype in ('ext3', 'extN', 'ldiskfs'):
+    if fstype in ('ext3', 'ldiskfs'):
         htree = 'tune2fs -O dir_index'
         (ret, out) = run (htree, dev)
         if ret:
@@ -1011,7 +713,9 @@ def init_loop(file, size, fstype, journal_size, inode_size, mkfsoptions, reforma
         if os.access(dev, os.R_OK):
             (stat, out) = run('losetup', dev)
             if stat:
-                run('losetup', dev, file)
+                (stat, out) = run('losetup', dev, file)
+                if stat:
+                    panic("losetup failed: (%s) %s" % (stat, out[0].strip()))
                 return dev
         else:
             print "out of loop devices"
@@ -1086,7 +790,7 @@ def sys_get_local_nid(net_type, wildcard, cluster_id):
     # don't need a real nid for config log - client will replace (bug5619)
     if config.record:
         local = "54321"
-    elif net_type in ('tcp','openib','iib','vib','ra','cray_kern_nal'):
+    elif net_type in ('tcp','openib','iib','vib','ra','ptl'):
         if  ':' in wildcard:
             iface, star = string.split(wildcard, ':')
             local = if2addr(iface)
@@ -1121,13 +825,18 @@ def sys_get_local_nid(net_type, wildcard, cluster_id):
     elif net_type == 'lo':
         fixme("automatic local address for loopback")
     elif net_type == 'gm':
-        gmnalnid = '/usr/sbin/gmnalnid'
-        if os.path.exists(gmnalnid) and os.access(gmnalnid, os.X_OK):
-            (rc, local) = run(gmnalnid, "-l")
-        else:
-            panic (gmnalnid, " not found or not executable on node with GM networking")
+        found=0
+        paths = ['/usr/sbin', config.portals + "/utils"]
+        for path in paths:
+            gmlndnid = path + '/gmlndnid'
+            if (os.path.exists(gmlndnid) and os.access(gmlndnid, os.X_OK)):
+                found=1
+                break
+        if not found:
+            panic (gmlndnid, " not found or not executable on node with GM networking")
+        (rc, local) = run(gmlndnid, "-l")
         if rc:
-            panic (gmnalnid, " failed")
+            panic (gmlndnid, " failed")
         local=string.rstrip(local[0])
     else:
         fixme("automatic local address for net type %s" % net_type)
@@ -1206,21 +915,28 @@ class kmod:
 
     def load_module(self):
         """Load all the modules in the list in the order they appear."""
-        run('/sbin/modprobe portals')
         for src_dir, dev_dir, mod in self.kmodule_list:
             if mod_loaded(mod) and not config.noexec:
                 continue
             log ('loading module:', mod, 'srcdir', src_dir, 'devdir', dev_dir)
+            if mod == 'lnet':
+                #For LNET we really need modprobe to load defined LNDs
+                run('/sbin/modprobe lnet')
+                #But if that fails, try insmod anyhow
             if src_dir:
                 module = find_module(src_dir, dev_dir, mod)
                 if not module:
                     panic('module not found:', mod)
                 (rc, out) = run('/sbin/insmod', module)
                 if rc and not mod_loaded(mod):
+                    if rc == 1:
+                        print("Bad module options? Check dmesg.") 
                     raise CommandError('insmod', out, rc)
             else:
                 (rc, out) = run('/sbin/modprobe', mod)
                 if rc and not mod_loaded(mod):
+                    if rc == 1:
+                        print("Bad module options? Check dmesg.") 
                     raise CommandError('modprobe', out, rc)
 
     def cleanup_module(self):
@@ -1231,28 +947,39 @@ class kmod:
         for src_dir, dev_dir, mod in rev:
             if not mod_loaded(mod) and not config.noexec:
                 continue
+            if mod == 'ksocklnd' and not config.noexec:
+                # Ignore ksocklnd in module list (lnet will remove)
+                continue
             log('unloading module:', mod)
-            (rc, out) = run('/sbin/rmmod', mod)
-            if rc:
-                log('! unable to unload module:', mod)
-                logall(out)
-            if mod == 'ptlrpc' and not config.noexec:
+            if mod == 'lnet' and not config.noexec:
                 # remove any self-ref portals created
                 lctl.unconfigure_network()
                 if config.dump:
                     # debug hack
                     lctl.dump(config.dump)
-                log('unloading the NALs + portals')
+                log('unloading the network')
                 lctl.unconfigure_network()
-                run('/sbin/rmmod ksocknal')
-                run('/sbin/rmmod kqswnal')
-                run('/sbin/rmmod kgmnal')
-                run('/sbin/rmmod kopenibnal')
-                run('/sbin/rmmod kiibnal')
-                run('/sbin/rmmod kvibnal')
-                run('/sbin/rmmod kranal')
-                run('/sbin/rmmod portals')
-        run('/sbin/rmmod libcfs')
+                if mod_loaded("ksocklnd"):
+                    run('/sbin/rmmod ksocklnd')
+                if mod_loaded("kqswlnd"):
+                    run('/sbin/rmmod kqswlnd')
+                if mod_loaded("kgmlnd"):
+                    run('/sbin/rmmod kgmlnd')
+                if mod_loaded("kopeniblnd"):
+                    run('/sbin/rmmod kopeniblnd')
+                if mod_loaded("kiiblnd"):
+                    run('/sbin/rmmod kiiblnd')
+                if mod_loaded("kviblnd"):
+                    run('/sbin/rmmod kviblnd')
+                if mod_loaded("kralnd"):
+                    run('/sbin/rmmod kralnd')
+                if mod_loaded("kptllnd"):
+                    run('/sbin/rmmod kptllnd')
+            (rc, out) = run('/sbin/rmmod', mod)
+            if rc:
+                log('! unable to unload module:', mod)
+                logall(out)
+
 
 # ============================================================
 # Classes to prepare and cleanup the various objects
@@ -1308,248 +1035,32 @@ class Module:
         return self.safe_to_clean()
 
 class Network(Module):
-    def __init__(self,db):
+    def __init__(self,db,nid_uuid=0):
         Module.__init__(self, 'NETWORK', db)
         self.net_type = self.db.get_val('nettype')
         self.nid = self.db.get_val('nid', '*')
         self.cluster_id = self.db.get_val('clusterid', "0")
         self.port = self.db.get_val_int('port', 0)
-
-        if '*' in self.nid:
-            self.nid = sys_get_local_nid(self.net_type, self.nid, self.cluster_id)
-            if not self.nid:
-                panic("unable to set nid for", self.net_type, self.nid, self.cluster_id)
-            self.generic_nid = 1
-            debug("nid:", self.nid)
-        else:
-            self.generic_nid = 0
-
-        self.nid_uuid = self.nid_to_uuid(self.nid)
-
-        self.hostaddr = self.db.get_hostaddr()
-        if len(self.hostaddr) == 0:
-            self.hostaddr.append(self.nid)
-        if '*' in self.hostaddr[0]:
-            self.hostaddr[0] = sys_get_local_nid(self.net_type, self.hostaddr[0], self.cluster_id)
-            if not self.hostaddr[0]:
-                panic("unable to set hostaddr for", self.net_type, self.hostaddr[0], self.cluster_id)
-            debug("hostaddr:", self.hostaddr[0])
-
-#        self.add_portals_module("libcfs", 'libcfs')
-#        self.add_portals_module("portals", 'portals')
-#        if node_needs_router():
-#            self.add_portals_module("router", 'kptlrouter')
-#        if self.net_type == 'tcp':
-#            self.add_portals_module("knals/socknal", 'ksocknal')
-#        if self.net_type == 'elan':
-#            self.add_portals_module("knals/qswnal", 'kqswnal')
-#        if self.net_type == 'gm':
-#            self.add_portals_module("knals/gmnal", 'kgmnal')
-#        if self.net_type == 'openib':
-#            self.add_portals_module("knals/openibnal", 'kopenibnal')
-#        if self.net_type == 'iib':
-#            self.add_portals_module("knals/iibnal", 'kiibnal')
-#        if self.net_type == 'vib':
-#            self.add_portals_module("knals/vibnal", 'kvibnal')
-#        if self.net_type == 'lo':
-#            self.add_portals_module("knals/lonal", 'klonal')
-#        if self.net_type == 'ra':
-#            self.add_portals_module("knals/ranal", 'kranal')
-
-    def nid_to_uuid(self, nid):
-        return "NID_%s_UUID" %(nid,)
+        self.nid_uuid = nid_uuid
+        self.add_portals_module('libcfs', 'libcfs')
+        self.add_portals_module('lnet', 'lnet')
+        # Add the socklnd for developers without modprobe.conf (umls)
+        self.add_portals_module('klnds/socklnd', 'ksocklnd')
 
     def prepare(self):
         if is_network_prepared():
             return
-        self.info(self.net_type, self.nid, self.port)
-        if not (config.record and self.generic_nid):
-            lctl.network(self.net_type, self.nid)
+        self.info(self.net_type, self.nid)
         if self.net_type == 'tcp':
             sys_tweak_socknal()
-            for hostaddr in self.db.get_hostaddr():
-                ip = string.split(hostaddr, '/')[0]
-                if len(string.split(hostaddr, '/')) == 2:
-                    netmask = string.split(hostaddr, '/')[1]
-                else:
-                    netmask = ""
-                lctl.add_interface(self.net_type, ip, netmask)
         if self.net_type == 'elan':
             sys_optimize_elan()
-        if self.net_type == 'openib':
-            if self.port == 0:
-                panic("no port set for", self.net_type, self.hostaddr[0])
-            sysctl('/proc/sys/openibnal/port', self.port)
-        if self.net_type == 'ra':
-            if self.port == 0:
-                panic("no port set for", self.net_type, self.hostaddr[0])
-            sysctl('/proc/sys/ranal/port', self.port)
-        if self.port and  node_is_router():
-            run_one_acceptor(self.port)
-            self.connect_peer_gateways()
-
-    def connect_peer_gateways(self):
-        for router in self.db.lookup_class('node'):
-            if router.get_val_int('router', 0):
-                for netuuid in router.get_networks():
-                    net = self.db.lookup(netuuid)
-                    gw = Network(net)
-                    if (gw.cluster_id == self.cluster_id and
-                        gw.net_type == self.net_type):
-                        if gw.nid != self.nid:
-                            lctl.connect(gw)
-
-    def disconnect_peer_gateways(self):
-        for router in self.db.lookup_class('node'):
-            if router.get_val_int('router', 0):
-                for netuuid in router.get_networks():
-                    net = self.db.lookup(netuuid)
-                    gw = Network(net)
-                    if (gw.cluster_id == self.cluster_id and
-                        gw.net_type == self.net_type):
-                        if gw.nid != self.nid:
-                            try:
-                                lctl.disconnect(gw)
-                            except CommandError, e:
-                                print "disconnect failed: ", self.name
-                                e.dump()
-                                cleanup_error(e.rc)
 
     def safe_to_clean(self):
         return not is_network_prepared()
 
     def cleanup(self):
-        self.info(self.net_type, self.nid, self.port)
-        if self.port:
-            stop_acceptor(self.port)
-        if  node_is_router():
-            self.disconnect_peer_gateways()
-        if self.net_type == 'tcp':
-            for hostaddr in self.db.get_hostaddr():
-                ip = string.split(hostaddr, '/')[0]
-                lctl.del_interface(self.net_type, ip)
-
-    def my_inet_aton(self, net):
-        split = net.split('.')
-        if len(split) != 4:
-            raise ValueError, "Invalid IPv4 address %s" % net
-
-        naddr = 0
-        i = 0
-        for n in split:
-            try:
-                naddr = naddr + int(n) * (256 ** (3-i))
-            except:
-                raise ValueError, "Invalid IPv4 address %s" % net
-            i = i + 1
-        return naddr
-
-    def tointAddr(self, net):
-        """convert a net address/mask into (numeric-address, bitmap-mask)"""
-        try:
-            addr, mask = string.split(net, '/')
-        except:
-            addr = net
-            mask = 24 #eeb told me that kernel uses this value by default
-
-        try:
-            mask = int(mask)
-            assert(mask >= 1 and mask <= 32)
-            mask = bitmap_32(mask)
-        except:
-            try:
-                mask = self.my_inet_aton(mask)
-            except:
-                raise ValueError("Invalid netmask %s" % str(mask))
-
-        try:
-            addr = socket.gethostbyname(addr)
-            naddr = self.my_inet_aton(addr)
-        except:
-            raise ValueError("Invalid host %s" % addr)
-
-        return (naddr, mask)
-
-    def netmatch(self, net1, net2):
-        # XXX this is only valid for IPv4 address
-        try:
-            addr1, mask1 = self.tointAddr(net1)
-            addr2, mask2 = self.tointAddr(net2)
-        except:
-            return 0
-
-        if addr1 & mask1 == addr2 & mask2:
-            return 1
-        return 0
-
-def bitmap_32(n):
-    """n should be in [1, 32]"""
-    if n < 0 or n > 32:
-        raise ValueError("A number between 1 and 32 is expected. (not %d)" % n)
-    return (-1) << (32-n)
-
-class RouteTable(Module):
-    def __init__(self,db):
-        Module.__init__(self, 'ROUTES', db)
-
-    def server_for_route(self, net_type, gw, gw_cluster_id, tgt_cluster_id,
-                         lo, hi):
-        # only setup connections for tcp, ib, and ra NALs
-        srvdb = None
-        if not net_type in ('tcp','openib','iib','vib','ra'):
-            return None
-
-        # connect to target if route is to single node and this node is the gw
-        if lo == hi and local_interface(net_type, gw_cluster_id, gw):
-            if not local_cluster(net_type, tgt_cluster_id):
-                panic("target", lo, " not on the local cluster")
-            srvdb = self.db.nid2server(lo, net_type, gw_cluster_id)
-        # connect to gateway if this node is not the gw
-        elif (local_cluster(net_type, gw_cluster_id)
-              and not local_interface(net_type, gw_cluster_id, gw)):
-            srvdb = self.db.nid2server(gw, net_type, gw_cluster_id)
-        else:
-            return None
-
-        if not srvdb:
-            panic("no server for nid", lo)
-            return None
-
-        return Network(srvdb)
-
-    def prepare(self):
-        if is_network_prepared():
-            return
-        self.info()
-        for net_type, gw, gw_cluster_id, tgt_cluster_id, lo, hi in self.db.get_route_tbl():
-            lctl.add_route(net_type, gw, lo, hi)
-            srv = self.server_for_route(net_type, gw, gw_cluster_id, tgt_cluster_id, lo, hi)
-            if srv:
-                lctl.connect(srv)
-
-    def safe_to_clean(self):
-        return not is_network_prepared()
-
-    def cleanup(self):
-        if is_network_prepared():
-            # the network is still being used, don't clean it up
-            return
-        for net_type, gw, gw_cluster_id, tgt_cluster_id, lo, hi in self.db.get_route_tbl():
-            srv = self.server_for_route(net_type, gw, gw_cluster_id, tgt_cluster_id, lo, hi)
-            if srv:
-                try:
-                    lctl.disconnect(srv)
-                except CommandError, e:
-                    print "disconnect failed: ", self.name
-                    e.dump()
-                    cleanup_error(e.rc)
-
-            try:
-                lctl.del_route(net_type, gw, lo, hi)
-            except CommandError, e:
-                print "del_route failed: ", self.name
-                e.dump()
-                cleanup_error(e.rc)
+        self.info(self.net_type, self.nid)
 
 class Management(Module):
     def __init__(self, db):
@@ -1741,7 +1252,7 @@ class MDSDEV(Module):
             else:
                 stripe_count = 1
             if stripe_count > 77:
-                self.inode_size = 4096
+                self.inode_size = 512
             elif stripe_count > 34:
                 self.inode_size = 2048
             elif stripe_count > 13:
@@ -1750,8 +1261,8 @@ class MDSDEV(Module):
             #    self.inode_size = 256
             else:
                 self.inode_size = 512
-
-        debug('stripe_count %d, inode_size %d', stripe_count, self.inode_size)
+            debug('stripe_count %d, inode_size %d',
+                  stripe_count, self.inode_size)
 
         self.target_dev_uuid = self.uuid
         self.uuid = target_uuid
@@ -1780,7 +1291,6 @@ class MDSDEV(Module):
             # run write_conf automatically, if --reformat used
             self.write_conf()
         self.info(self.devpath, self.fstype, self.size, self.format)
-        run_acceptors()
         # never reformat here
         blkdev = block_dev(self.devpath, self.size, self.fstype, 0,
                            self.format, self.journal_size, self.inode_size,
@@ -1808,6 +1318,9 @@ class MDSDEV(Module):
 
             lctl.newdev("mds", self.name, self.uuid,
                         setup ="%s %s %s %s" %(blkdev, self.fstype, self.name, mountfsoptions))
+            self.group_upcall = self.db.get_val('group_upcall','')
+            sys_set_group_upcall(self.name, self.group_upcall)
+
         except CommandError, e:
             if e.rc == 2:
                 panic("MDS is missing the config log. Need to run " +
@@ -1873,7 +1386,7 @@ class MDSDEV(Module):
                         noexec_opt = ('', '-n')
                         ret, out = run (sys.argv[0],
                                         noexec_opt[old_noexec == 1],
-                                        " --record --nomod",
+                                        " -v --record --nomod",
                                         "--record_log", client_name,
                                         "--record_device", self.name,
                                         "--node", client_name,
@@ -1888,7 +1401,7 @@ class MDSDEV(Module):
                             for s in out: log("record> ", string.strip(s))
                         ret, out = run (sys.argv[0],
                                         noexec_opt[old_noexec == 1],
-                                        "--cleanup -v --record --nomod",
+                                        "--cleanup --record --nomod",
                                         "--record_log", client_name + "-clean",
                                         "--record_device", self.name,
                                         "--node", client_name,
@@ -1980,7 +1493,7 @@ class OSD(Module):
         ost = self.db.lookup(target_uuid)
         self.name = ost.getName()
         self.format = self.db.get_val('autoformat', 'yes')
-        if ost.get_val('failover', 0):
+        if ost.get_val('failover', 1):
             self.failover_ost = 'f'
         else:
             self.failover_ost = 'n'
@@ -2021,7 +1534,6 @@ class OSD(Module):
             return
         self.info(self.osdtype, self.devpath, self.size, self.fstype,
                   self.format, self.journal_size, self.inode_size)
-        run_acceptors()
         if self.osdtype == 'obdecho':
             blkdev = ''
         else:
@@ -2164,17 +1676,12 @@ class Client(Module):
         if is_prepared(self.name):
             self.cleanup()
         try:
-            srv_list = find_local_servers(self.get_servers())
+            srv_list = self.get_servers()
+            debug('dbg CLIENT __prepare__:', self.target_uuid, srv_list)
             for srv in srv_list:
                 lctl.connect(srv)
-
-            routes = find_route(self.get_servers())
-            for (srv, r) in routes:
-                lctl.add_route_host(r[0], srv.nid_uuid, r[1], r[3])
-                srv_list.append(srv)
-
             if len(srv_list) == 0:
-                panic("no local servers and no route to", self.target_uuid)
+                panic("no servers for ", self.target_uuid)
         except CommandError, e:
             if not ignore_connect_failure:
                 raise e
@@ -2197,43 +1704,25 @@ class Client(Module):
             this_nets = get_ost_net(toplustreDB, tgt_dev_uuid)
             if len(this_nets) == 0:
                 panic ("Unable to find a backup server for:", tgt_dev_uuid)
-            srv_list = find_local_servers(this_nets)
-            if srv_list:
-                for srv in srv_list:
+            else:
+                for srv in this_nets:
                     lctl.connect(srv)
                     break
-            else:
-                routes = find_route(this_nets);
-                if len(routes) == 0:
-                    panic("no route to", tgt_dev_uuid)
-                for (srv, r) in routes:
-                    lctl.add_route_host(r[0]. srv.nid_uuid, r[1], r[3])
-            if srv:
-                 lctl.add_conn(self.name, srv.nid_uuid);
 
 
     def cleanup(self):
         if is_prepared(self.name):
             Module.cleanup(self)
-            try:
-                routes = find_route(self.get_servers())
-                for (srv, r) in routes:
-                    lctl.del_route_host(r[0], srv.nid_uuid, r[1], r[3])
-            except CommandError, e:
-                log(self.module_name, "cleanup failed: ", self.name)
-                e.dump()
-                cleanup_error(e.rc)
-
+            srv_list = self.get_servers()
+            for srv in srv_list:
+                lctl.disconnect(srv)
             for tgt_dev_uuid in self.backup_targets:
-                this_net = get_ost_net(toplustreDB, tgt_dev_uuid)
-                srv_list = find_local_servers(self.get_servers())
-                if srv_list:
-                    for srv in srv_list:
-                        lctl.disconnect(srv)
-                        break
+                this_nets = get_ost_net(toplustreDB, tgt_dev_uuid)
+                if len(this_nets) == 0:
+                    panic ("Unable to find a backup server for:", tgt_dev_uuid)
                 else:
-                    for (srv, r) in find_route(this_net):
-                        lctl.del_route_host(r[0]. srv.nid_uuid, r[1], r[3])
+                    for srv in this_nets:
+                        lctl.disconnect(srv)
 
 class MDC(Client):
     def __init__(self, db, uuid, fs_name):
@@ -2310,7 +1799,6 @@ class ECHO_CLIENT(Module):
     def prepare(self):
         if is_prepared(self.name):
             return
-        run_acceptors()
         self.osc.prepare() # XXX This is so cheating. -p
         self.info(self.obd_uuid)
 
@@ -2385,7 +1873,6 @@ class Mountpoint(Module):
         if fs_is_mounted(self.path):
             log(self.path, "already mounted.")
             return
-        run_acceptors()
         if self.mgmtcli:
             self.mgmtcli.prepare()
         self.vosc.prepare()
@@ -2467,7 +1954,8 @@ def get_ost_net(self, osd_uuid):
               " node_ref:", node_uuid)
     for net_uuid in node.get_networks():
         db = node.lookup(net_uuid)
-        srv_list.append(Network(db))
+        net = Network(db, node_uuid)
+        srv_list.append(net)
     return srv_list
 
 
@@ -2477,8 +1965,6 @@ def getServiceLevel(self):
     ret=0;
     if type in ('network',):
         ret = 5
-    elif type in ('routetbl',):
-        ret = 6
     elif type in ('ldlm',):
         ret = 20
     elif type in ('mgmt',):
@@ -2531,101 +2017,6 @@ def get_mdc(db, uuid, fs_name, mds_uuid):
     mdc = MDC(mds_db, uuid, fs_name)
     return mdc
 
-############################################################
-# routing ("rooting")
-
-# list of (nettype, cluster_id, nid)
-local_clusters = []
-
-def find_local_clusters(node_db):
-    global local_clusters
-    for netuuid in node_db.get_networks():
-        net = node_db.lookup(netuuid)
-        srv = Network(net)
-        debug("add_local", netuuid)
-        local_clusters.append((srv.net_type, srv.cluster_id, srv.nid))
-        if srv.port > 0:
-            if not acceptors.has_key(srv.port):
-                acceptors[srv.port] = AcceptorHandler(srv.port, srv.net_type)
-
-# This node is a gateway.
-is_router = 0
-def node_is_router():
-    return is_router
-
-# If there are any routers found in the config, then this will be true
-# and all nodes will load kptlrouter.
-needs_router = 0
-def node_needs_router():
-    return needs_router or is_router
-
-# list of (nettype, gw, tgt_cluster_id, lo, hi)
-# Currently, these local routes are only added to kptlrouter route
-# table if they are needed to connect to a specific server.  This
-# should be changed so all available routes are loaded, and the
-# ptlrouter can make all the decisions.
-local_routes = []
-
-def find_local_routes(lustre):
-    """ Scan the lustre config looking for routers .  Build list of
-    routes. """
-    global local_routes, needs_router
-    local_routes = []
-    list = lustre.lookup_class('node')
-    for router in list:
-        if router.get_val_int('router', 0):
-            needs_router = 1
-            for (local_type, local_cluster_id, local_nid) in local_clusters:
-                gw = None
-                for netuuid in router.get_networks():
-                    db = router.lookup(netuuid)
-                    if (local_type == db.get_val('nettype') and
-                       local_cluster_id == db.get_val('clusterid')):
-                        gw = db.get_val('nid')
-                        break
-                if gw:
-                    debug("find_local_routes: gw is", gw)
-                    for route in router.get_local_routes(local_type, gw):
-                        local_routes.append(route)
-    debug("find_local_routes:", local_routes)
-
-
-def find_local_servers(srv_list):
-    result = []
-
-    for srv in srv_list:
-#        if local_cluster(srv.net_type, srv.cluster_id):
-        result.append(srv)
-    return result
-
-def local_cluster(net_type, cluster_id):
-    for cluster in local_clusters:
-        if net_type == cluster[0] and cluster_id == cluster[1]:
-            return 1
-    return 0
-
-def local_interface(net_type, cluster_id, nid):
-    for cluster in local_clusters:
-        if (net_type == cluster[0] and cluster_id == cluster[1]
-            and nid == cluster[2]):
-            return 1
-    return 0
-
-def find_route(srv_list):
-    result = []
-#    frm_type = local_clusters[0][0]
-#    for srv in srv_list:
-#        debug("find_route: srv:", srv.nid, "type: ", srv.net_type)
-#        to_type = srv.net_type
-#        to = srv.nid
-#        cluster_id = srv.cluster_id
-#        debug ('looking for route to', to_type, to)
-#        for r in local_routes:
-#            debug("find_route: ", r)
-#            if  (r[3] <= to and to <= r[4]) and cluster_id == r[2]:
-#                result.append((srv, r))
-    return result
-
 def get_active_target(db):
     target_uuid = db.getUUID()
     target_name = db.getName()
@@ -2656,8 +2047,6 @@ def newService(db):
         n = LOV(db, "YOU_SHOULD_NEVER_SEE_THIS_UUID")
     elif type == 'network':
         n = Network(db)
-    elif type == 'routetbl':
-        n = RouteTable(db)
     elif type == 'osd':
         n = OSD(db)
     elif type == 'cobd':
@@ -2730,35 +2119,81 @@ def doUnloadModules(services):
         if n.safe_to_clean_modules():
             n.cleanup_module()
 
+def doMakeServiceScript(services):
+    if config.nosetup:
+        return
+    try:
+        os.makedirs(config.service_scripts)
+    except OSError, e:
+        if e[0] != errno.EEXIST:
+            panic("Couldn't create scripts dir " + config.service_scripts + ": " + e[1])
+    
+    for s in services:
+        if s[1].get_class() != 'osd' and s[1].get_class() != 'mdsdev':
+            continue
+
+        target_uuid = s[1].get_first_ref('target')
+        target = toplustreDB.lookup(target_uuid)
+        target_symlink = config.service_scripts + "/" + target.getName()
+        if config.force:
+            try:
+                try:
+                    os.unlink(target_symlink)
+                    if config.verbose:
+                        print "Removed " + target_symlink
+                except OSError, e:
+                    if e[0] != errno.EISDIR:
+                        raise e
+                    os.rmdir(target_symlink)
+                    if config.verbose:
+                        print "Removed " + target_symlink
+            except OSError, e:
+                if e[0] != errno.ENOENT:
+                    panic("Error removing " + target_symlink + ": " + e[1])
+                    
+        try:
+            os.symlink("/etc/init.d/lustre", target_symlink)
+            if config.verbose:
+                print "Created service link " + target_symlink + " to /etc/init.d/lustre"
+
+        except OSError, e:
+            if e[0] == errno.EEXIST:
+                extra_error = " (use --force option to remove existing files)"
+            else:
+                extra_error = ""
+            panic("Error creating " + target_symlink + ": " + e[1] + extra_error)
+
 #
 # Load profile for
 def doHost(lustreDB, hosts):
-    global is_router, local_node_name
+    global local_node_name, tgt_select
     node_db = None
     for h in hosts:
         node_db = lustreDB.lookup_name(h, 'node')
         if node_db:
+            if config.service:
+                tgt_select[config.service] = h
+                config.group = config.service
             break
     if not node_db:
         panic('No host entry found.')
 
     local_node_name = node_db.get_val('name', 0)
-    is_router = node_db.get_val_int('router', 0)
     lustre_upcall = node_db.get_val('lustreUpcall', '')
     portals_upcall = node_db.get_val('portalsUpcall', '')
     timeout = node_db.get_val_int('timeout', 0)
     ptldebug = node_db.get_val('ptldebug', '')
     subsystem = node_db.get_val('subsystem', '')
 
-    find_local_clusters(node_db)
-    if not is_router:
-        find_local_routes(lustreDB)
-
     # Two step process: (1) load modules, (2) setup lustre
     # if not cleaning, load modules first.
     prof_list = node_db.get_refs('profile')
 
-    if config.write_conf:
+    if config.make_service_scripts:
+        for_each_profile(node_db, prof_list, doMakeServiceScript)
+        return
+    
+    elif config.write_conf:
         for_each_profile(node_db, prof_list, doModules)
         sys_make_devices()
         for_each_profile(node_db, prof_list, doWriteconf)
@@ -2772,7 +2207,7 @@ def doHost(lustreDB, hosts):
         doRecovery(lustreDB, lctl, config.tgt_uuid, config.client_uuid,
                    config.conn_uuid)
     elif config.cleanup:
-        if not mod_loaded('portals'):
+        if not mod_loaded('lnet'):
             return
 
         if config.force:
@@ -2824,6 +2259,150 @@ def doHost(lustreDB, hosts):
         for_each_profile(node_db, prof_list, doSetup)
         lustreDB.close()
 
+def add_clumanager_node(node_db, nodes, services):
+    new_services = []
+    node_name = node_db.getUUID()
+    nodes[node_name] = []
+    
+    for prof_uuid in node_db.get_refs('profile'):
+        prof_db = toplustreDB.lookup(prof_uuid)
+        for ref_class, ref_uuid in prof_db.get_all_refs():
+            if ref_class not in ('osd', 'mdsdev'):
+                continue
+            devdb = toplustreDB.lookup(ref_uuid)
+            tgt_uuid = devdb.get_first_ref('target')
+
+            nodes[node_name].append(ref_uuid)
+
+            if not services.has_key(tgt_uuid):
+                if config.verbose:
+                    print "New service: " + tgt_uuid + " (originally found on " + node_name + ")"
+                new_services.append(tgt_uuid)
+                services[tgt_uuid] = []
+            services[tgt_uuid].append(ref_uuid)
+
+    return new_services
+
+def add_clumanager_services(new_services, nodes, dev_list):
+    new_nodes = []
+    for devdb in dev_list:
+        tgt_uuid = devdb.get_first_ref('target')
+        if tgt_uuid in new_services:
+            node_uuid = devdb.get_first_ref('node')
+        
+            if not (nodes.has_key(node_uuid) or node_uuid in new_nodes):
+                if config.verbose:
+                    print "New node: " + node_uuid + " for service " + tgt_uuid
+                new_nodes.append(node_uuid)
+
+    return new_nodes
+
+def doClumanager(lustreDB, hosts):
+    nodes = {}
+    services = {}
+
+    dev_list = []
+    
+    for dev_uuid in toplustreDB.get_refs('osd') + toplustreDB.get_refs('mdsdev'):
+        dev_list.append(lustreDB.lookup(dev_uuid))
+
+    node_db = None
+    for h in hosts:
+        node_db = lustreDB.lookup_name(h, 'node')
+        if node_db:
+            our_host = h
+            new_services = add_clumanager_node(node_db, nodes, services)
+            break
+            
+    if not node_db:
+        panic('No host entry found.')
+
+    while 1:
+        if len(new_services) == 0:
+            break
+        
+        new_nodes = add_clumanager_services(new_services, nodes, dev_list)
+        if len(new_nodes) == 0:
+            break
+
+        if len(new_nodes) + len(nodes.keys()) > 8:
+            panic("CluManager only supports 8 nodes per failover \"cluster.\"")
+
+        new_services = []
+        for node_uuid in new_nodes:
+            node_db = lustreDB.lookup(node_uuid)
+            if not node_db:
+                panic("No node entry for " + node_uuid + " was found.")
+
+            new_services.append(add_clumanager_node(node_db, nodes, services))
+
+    nodenames = []
+    for node in nodes.keys():
+        nodedb = lustreDB.lookup(node)
+        nodenames.append(nodedb.getName())
+    nodenames.sort()
+
+    print """<?xml version="1.0"?>
+<cluconfig version="3.0">
+  <clumembd broadcast="no" interval="750000" loglevel="5" multicast="yes" multicast_ipaddress="225.0.0.11" thread="yes" tko_count="20"/>
+  <cluquorumd loglevel="5" pinginterval="2"/>
+  <clurmtabd loglevel="5" pollinterval="4"/>
+  <clusvcmgrd loglevel="5"/>
+  <clulockd loglevel="5"/>
+  <cluster config_viewnumber="1" name="%s"/>
+  <sharedstate driver="libsharedraw.so" rawprimary="%s" rawshadow="%s" type="raw"/>
+  <members> """ % (string.join(nodenames), config.rawprimary, config.rawsecondary)
+    
+
+    i = 0
+    for node in nodenames:
+        print "    <member id=\"%d\" name=\"%s\" watchdog=\"yes\"/>" % (i, node)
+        i = i + 1
+
+    print "  </members>\n  <failoverdomains>"
+
+    servicekeys = services.keys()
+    servicekeys.sort()
+
+    i = 0
+    for service in servicekeys:
+        svcdb = lustreDB.lookup(service)
+        print "    <failoverdomain id=\"%d\" name=\"%s\" ordered=\"yes\" restricted=\"yes\">" % (i, svcdb.getName())
+        i = i + 1
+
+        j = 0
+        active_uuid = get_active_target(svcdb)
+        for svc_uuid in [active_uuid] + services[service]:
+            if svc_uuid == active_uuid and j > 0:
+                continue
+            svcdb = lustreDB.lookup(svc_uuid)
+
+            svc_node_uuid = svcdb.get_first_ref('node')
+            svc_nodedb = lustreDB.lookup(svc_node_uuid)
+
+            print "      <failoverdomainnode id=\"%d\" name=\"%s\"/>" % (j, svc_nodedb.getName())
+            j = j + 1
+
+        print "    </failoverdomain>"
+
+    print "  </failoverdomains>\n  <services>"
+
+    i = 0
+    for service in servicekeys:
+        svcdb = lustreDB.lookup(service)
+        active_uuid = get_active_target(svcdb)
+        activedb = lustreDB.lookup(active_uuid)
+
+        svc_node_uuid = activedb.get_first_ref('node')
+        svc_nodedb = lustreDB.lookup(svc_node_uuid)
+
+        print "    <service checkinterval=\"30\" failoverdomain=\"%s\" id=\"%d\" name=\"%s\" userscript=\"%s/%s\">" \
+              % ( svcdb.getName(), i, svcdb.getName(), config.service_scripts, svcdb.getName())
+        print "      <service_ipaddresses/>\n    </service>"
+        i = i + 1
+
+    print "  </services>\n</cluconfig>"
+
 def doRecovery(lustreDB, lctl, tgt_uuid, client_uuid, nid_uuid):
     tgt = lustreDB.lookup(tgt_uuid)
     if not tgt:
@@ -2888,7 +2467,7 @@ def sysctl(path, val):
 
 
 def sys_set_debug_path():
-    sysctl('portals/debug_path', config.debug_path)
+    sysctl('lnet/debug_path', config.debug_path)
 
 def validate_upcall(upcall):
     import os
@@ -2901,7 +2480,7 @@ def validate_upcall(upcall):
         print "WARNING invalid upcall script specified: %s" % upcall
 
 def sys_set_lustre_upcall(upcall):
-    # the command overrides the value in the node config
+    # the command line overrides the value in the node config
     if config.lustre_upcall:
         upcall = config.lustre_upcall
     elif config.upcall:
@@ -2911,14 +2490,28 @@ def sys_set_lustre_upcall(upcall):
         lctl.set_lustre_upcall(upcall)
 
 def sys_set_portals_upcall(upcall):
-    # the command overrides the value in the node config
+    # the command line overrides the value in the node config
     if config.portals_upcall:
         upcall = config.portals_upcall
     elif config.upcall:
         upcall = config.upcall
     if upcall:
         validate_upcall(upcall)
-        sysctl('portals/upcall', upcall)
+        sysctl('lnet/upcall', upcall)
+
+def sys_set_group_upcall(mds, upcall):
+    if config.noexec:
+        return
+    # the command line overrides the value in the MDS config
+    if config.group_upcall:
+        upcall = config.group_upcall
+    if upcall:
+        validate_upcall(upcall)
+        debug("setting MDS", mds, "upcall to:", upcall)
+        path = "/proc/fs/lustre/mds/" + mds + "/group_upcall"
+        fp = open(path, 'w')
+        fp.write(upcall)
+        fp.close()
 
 def sys_set_timeout(timeout):
     # the command overrides the value in the node config
@@ -2946,7 +2539,7 @@ def sys_set_ptldebug(ptldebug):
         try:
             val = eval(ptldebug, ptldebug_names)
             val = "0x%x" % (val)
-            sysctl('portals/debug', val)
+            sysctl('lnet/debug', val)
         except NameError, e:
             panic(str(e))
 
@@ -2957,7 +2550,7 @@ def sys_set_subsystem(subsystem):
         try:
             val = eval(subsystem, subsystem_names)
             val = "0x%x" % (val)
-            sysctl('portals/subsystem_debug', val)
+            sysctl('lnet/subsystem_debug', val)
         except NameError, e:
             panic(str(e))
 
@@ -2975,8 +2568,8 @@ def sys_set_netmem_max(path, max):
         fp.close()
 
 def sys_make_devices():
-    if not os.access('/dev/portals', os.R_OK):
-        run('mknod /dev/portals c 10 240')
+    if not os.access('/dev/lnet', os.R_OK):
+        run('mknod /dev/lnet c 10 240')
     if not os.access('/dev/obd', os.R_OK):
         run('mknod /dev/obd c 10 241')
 
@@ -3012,6 +2605,9 @@ def sanitise_path():
 tgt_select = {}
 def init_select(args):
     # args = [service=nodeA,service2=nodeB service3=nodeC]
+    # --service <service> is analagous to:
+    #     --group <service> --select <service>=<node>
+    # this is handled in doHost()
     global tgt_select
     for arg in args:
         list = string.split(arg, ',')
@@ -3034,6 +2630,7 @@ lconf_options = [
     ('ldapurl',"LDAP server URL, eg. ldap://localhost", PARAM),
     ('config', "Cluster config name used for LDAP query", PARAM),
     ('select', "service=nodeA,service2=nodeB ", PARAMLIST),
+    ('service', "shorthand for --group <service> --select <service>=<node>", PARAM),
     ('node',   "Load config for <nodename>", PARAM),
     ('cleanup,d', "Cleans up config. (Shutdown)"),
     ('force,f', "Forced unmounting and/or obd detach during cleanup",
@@ -3084,12 +2681,18 @@ lconf_options = [
     ('upcall',  "Set both portals and lustre upcall script", PARAM),
     ('lustre_upcall', "Set lustre upcall script", PARAM),
     ('portals_upcall', "Set portals upcall script", PARAM),
+    ('group_upcall', "Set supplementary group upcall program", PARAM),
     ('lctl_dump', "Save lctl ioctls to the dumpfile argument", PARAM),
     ('ptldebug', "Set the portals debug level",  PARAM),
     ('subsystem', "Set the portals debug subsystem",  PARAM),
     ('gdb_script', "Fullname of gdb debug script", PARAM, default_gdb_script()),
     ('debug_path', "Path to save debug dumps", PARAM, default_debug_path()),
     ('allow_unprivileged_port', "Allow connections from unprivileged ports"),
+    ('clumanager', "Generate CluManager config file for this node's cluster"),
+    ('rawprimary', "For clumanager, device of the primary quorum", PARAM, "/dev/raw/raw1"),
+    ('rawsecondary', "For clumanager, device of the secondary quorum", PARAM, "/dev/raw/raw2"),
+    ('service_scripts', "For clumanager, directory containing per-service scripts", PARAM, "/etc/lustre/services"),
+    ('make_service_scripts', "Create per-service symlinks for use with clumanager"),
 # Client recovery options
     ('recover', "Recover a device"),
     ('group', "The group of devices to configure or cleanup", PARAM),
@@ -3191,7 +2794,7 @@ def main():
     else:
         if len(host) > 0:
             node_list.append(host)
-        node_list.append('localhost')
+#        node_list.append('localhost')
 
     debug("configuring for host: ", node_list)
 
@@ -3210,7 +2813,10 @@ def main():
         lctl.clear_log(config.record_device, config.record_log)
         lctl.record(config.record_device, config.record_log)
 
-    doHost(lustreDB, node_list)
+    if config.clumanager:
+        doClumanager(lustreDB, node_list)
+    else:
+        doHost(lustreDB, node_list)
 
     if config.record:
         lctl.end_record()
index ba291e7..44391f3 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
 #include "obdctl.h"
 #include "parser.h"
 
index 61f1579..7b193b6 100644 (file)
@@ -33,8 +33,8 @@
 #include <pwd.h>
 #include <grp.h>
 
-#include <portals/api-support.h>
-#include <portals/ptlctl.h>
+#include <lnet/api-support.h>
+#include <lnet/lnetctl.h>
 
 #include <liblustre.h>
 #include <linux/lustre_idl.h>
 #define LUSTRE_Q_GETQUOTA 0x800007     /* get user quota structure */
 #define LUSTRE_Q_SETQUOTA 0x800008     /* set user quota structure */
 
-unsigned int portal_subsystem_debug = 0;
+/* Where is this stupid thing supposed to be defined? */
+#ifndef USRQUOTA
+# define USRQUOTA 0
+# define GRPQUOTA 1
+#endif
+
+unsigned int libcfs_subsystem_debug = 0;
 
 /* all functions */
 static int lfs_setstripe(int argc, char **argv);
@@ -138,30 +144,30 @@ static int lfs_setstripe(int argc, char **argv)
         if (argc == 3) {
                 if (strcmp(argv[1], "-d") != 0)
                         return CMD_HELP;
-                
+
                 fname = argv[2];
-                st_size = -1;
+                st_size = 0;
+                st_offset = -1;
                 st_count = 0;
-                st_offset = 0;
         } else {
                 fname = argv[1];
 
-                // get the stripe size
+                /* 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
+
+                /* 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
+                /* get the stripe count */
                 st_count = strtoul(argv[4], &end, 0);
                 if (*end != '\0') {
                         fprintf(stderr, "error: %s: bad stripe count '%s'\n",
index 8dffe33..d684aac 100644 (file)
@@ -42,8 +42,6 @@
 #include <sys/syscall.h>
 #ifdef HAVE_LINUX_TYPES_H
 #include <linux/types.h>
-#else
-#include "types.h"
 #endif
 #ifdef HAVE_LINUX_UNISTD_H
 #include <linux/unistd.h>
 #include <unistd.h>
 #endif
 
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
 
 #include <liblustre.h>
 #include <linux/obd.h>
 #include <linux/lustre_lib.h>
-#include <lustre/lustre_user.h>
+#include <lustre/liblustreapi.h>
 #include <linux/obd_lov.h>
 
 static void err_msg(char *fmt, ...)
@@ -95,53 +93,39 @@ int llapi_file_create(char *name, long stripe_size, int stripe_offset,
         page_size = LOV_MIN_STRIPE_SIZE;
         if (getpagesize() > page_size) {
                 page_size = getpagesize();
-                fprintf(stderr, "WARNING: your page size (%u) is larger than "
+                fprintf(stderr, "warning: your page size (%u) is larger than "
                         "expected (%u).\n", page_size, LOV_MIN_STRIPE_SIZE);
         }
-        if ((stripe_size < 0 || (stripe_size & (LOV_MIN_STRIPE_SIZE - 1))) &&
-            !(isdir && stripe_size == -1)) {
-                rc = -EINVAL;
+        if (stripe_size < 0 || (stripe_size & (LOV_MIN_STRIPE_SIZE - 1))) {
+                errno = rc = -EINVAL;
                 err_msg("error: stripe_size must be an even "
-                        "multiple of %d bytes.\n", page_size);
+                        "multiple of %d bytes", page_size);
                 goto out;
         }
         if (stripe_offset < -1 || stripe_offset > LOV_MAX_STRIPE_COUNT) {
                 errno = rc = -EINVAL;
-                err_msg("error: bad stripe offset %d\n", stripe_offset);
+                err_msg("error: bad stripe offset %d", stripe_offset);
                 goto out;
         }
         if (stripe_count < -1 || stripe_count > LOV_MAX_STRIPE_COUNT) {
                 errno = rc = -EINVAL;
-                err_msg("error: bad stripe count %d\n", stripe_count);
+                err_msg("error: bad stripe count %d", stripe_count);
                 goto out;
         }
         if (stripe_count > 0 && (__u64)stripe_size * stripe_count > ~0UL) {
                 errno = rc = -EINVAL;
                 err_msg("error: stripe_size %ld * stripe_count %d "
-                        "exceeds %lu bytes.\n", ~0UL);
+                        "exceeds %lu bytes", ~0UL);
                 goto out;
         }
 
-        /*  Initialize IOCTL striping pattern structure  */
+        /*  Initialize IOCTL striping pattern structure */
         lum.lmm_magic = LOV_USER_MAGIC;
         lum.lmm_pattern = stripe_pattern;
         lum.lmm_stripe_size = stripe_size;
         lum.lmm_stripe_count = stripe_count;
         lum.lmm_stripe_offset = stripe_offset;
 
-        /* setting stripe pattern 0 -1 0 to a dir means to delete it */
-        if (isdir) {
-                if (stripe_size == 0 && stripe_count == 0 &&
-                    stripe_offset == -1)
-                        lum.lmm_stripe_size = -1;
-        } else {
-                if (stripe_size == -1) {
-                        errno = rc = -EPERM;
-                        err_msg("deleting file stripe info is not allowed\n");
-                        goto out;
-                }
-        }
-
         if (ioctl(fd, LL_IOC_LOV_SETSTRIPE, &lum)) {
                 char *errmsg = "stripe already set";
                 if (errno != EEXIST && errno != EALREADY)
@@ -421,7 +405,7 @@ int llapi_file_get_stripe(char *path, struct lov_user_md *lum)
                 return errno;
         }
 
-        strncpy((char *)lum, fname, sizeof(*lum));
+        strcpy((char *)lum, fname);
         if (ioctl(fd, IOC_MDC_GETSTRIPE, (void *)lum) == -1) {
                 close(fd);
                 free(dname);
index 64c027d..c794c70 100644 (file)
@@ -38,7 +38,7 @@ $subsys->{LOV} = 1 << 18;
 $subsys->{GMNAL} = 1 << 19;
 $subsys->{PTLROUTER} = 1 << 20;
 $subsys->{COBD} = 1 << 21;
-$subsys->{IBNAL} = 1 << 22;
+$subsys->{OPENIBNAL} = 1 << 22;
 
 
 $masks->{TRACE} = 1 << 0; # /* ENTRY/EXIT markers */
@@ -318,7 +318,7 @@ while (<LOG>) {
                     $linesubsys == $subsys->{PORTALS} ||
                     $linesubsys == $subsys->{SOCKNAL} ||
                     $linesubsys == $subsys->{QSWNAL} ||
-                    $linesubsys == $subsys->{IBNAL} ||
+                    $linesubsys == $subsys->{OPENIBNAL} ||
                     $linesubsys == $subsys->{GMNAL}));
        if(!$entering_rpc) {entering_rpc($_);}
        if(!$leaving_rpc) {leaving_rpc($_);}
index 9e6a135..5885935 100644 (file)
@@ -35,7 +35,7 @@
 #include <sys/utsname.h>
 
 #include "obdctl.h"
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
 
 int          verbose;
 int          nomtab;
@@ -55,7 +55,9 @@ void usage(FILE *out)
                 "\t--force: force mount even if already in /etc/mtab\n"
                 "\t-h|--help: print this usage message\n"
                 "\t-n|--nomtab: do not update /etc/mtab after mount\n"
-                "\t-v|--verbose: print verbose config settings\n");
+                "\t-v|--verbose: print verbose config settings\n"
+                "\t-o: filesystem mount options:\n"
+                "\t\tflock/noflock: enable/disable flock support\n");
         exit(out != stdout);
 }
 
@@ -121,7 +123,7 @@ init_options(struct lustre_mount_data *lmd)
 {
         memset(lmd, 0, sizeof(*lmd));
         lmd->lmd_magic = LMD_MAGIC;
-        lmd->lmd_nid = PTL_NID_ANY;
+        lmd->lmd_nid = LNET_NID_ANY;
         return 0;
 }
 
@@ -146,40 +148,46 @@ struct opt_map {
         const char *opt;        /* option name */
         int skip;               /* skip in mtab option string */
         int inv;                /* true if flag value should be inverted */
-        int mask;               /* flag mask value */
+        int ms_mask;            /* MS flag mask value */
+        int lmd_mask;           /* LMD flag mask value */
 };
 
 static const struct opt_map opt_map[] = {
-  { "defaults", 0, 0, 0         },      /* default options */
-  { "rw",       1, 1, MS_RDONLY },      /* read-write */
-  { "ro",       0, 0, MS_RDONLY },      /* read-only */
-  { "exec",     0, 1, MS_NOEXEC },      /* permit execution of binaries */
-  { "noexec",   0, 0, MS_NOEXEC },      /* don't execute binaries */
-  { "suid",     0, 1, MS_NOSUID },      /* honor suid executables */
-  { "nosuid",   0, 0, MS_NOSUID },      /* don't honor suid executables */
-  { "dev",      0, 1, MS_NODEV  },      /* interpret device files  */
-  { "nodev",    0, 0, MS_NODEV  },      /* don't interpret devices */
-  { "async",    0, 1, MS_SYNCHRONOUS},  /* asynchronous I/O */
-  { "auto",     0, 0, 0         },      /* Can be mounted using -a */
-  { "noauto",   0, 0, 0         },      /* Can  only be mounted explicitly */
-  { "nousers",  0, 1, 0         },      /* Forbid ordinary user to mount */
-  { "nouser",   0, 1, 0         },      /* Forbid ordinary user to mount */
-  { "noowner",  0, 1, 0         },      /* Device owner has no special privs */
-  { "_netdev",  0, 0, 0         },      /* Device accessible only via network */
-  { NULL,       0, 0, 0         }
+  { "defaults", 0, 0, 0, 0         },      /* default options */
+  { "rw",       1, 1, MS_RDONLY, 0 },      /* read-write */
+  { "ro",       0, 0, MS_RDONLY, 0 },      /* read-only */
+  { "exec",     0, 1, MS_NOEXEC, 0 },      /* permit execution of binaries */
+  { "noexec",   0, 0, MS_NOEXEC, 0 },      /* don't execute binaries */
+  { "suid",     0, 1, MS_NOSUID, 0 },      /* honor suid executables */
+  { "nosuid",   0, 0, MS_NOSUID, 0 },      /* don't honor suid executables */
+  { "dev",      0, 1, MS_NODEV,  0 },      /* interpret device files  */
+  { "nodev",    0, 0, MS_NODEV,  0 },      /* don't interpret devices */
+  { "async",    0, 1, MS_SYNCHRONOUS, 0},  /* asynchronous I/O */
+  { "auto",     0, 0, 0, 0         },      /* Can be mounted using -a */
+  { "noauto",   0, 0, 0, 0         },      /* Can  only be mounted explicitly */
+  { "nousers",  0, 1, 0, 0         },      /* Forbid ordinary user to mount */
+  { "nouser",   0, 1, 0, 0         },      /* Forbid ordinary user to mount */
+  { "noowner",  0, 1, 0, 0         },      /* Device owner has no special privs */
+  { "_netdev",  0, 0, 0, 0         },      /* Device accessible only via network */
+  { "flock",    0, 0, 0, LMD_FLG_FLOCK},   /* Enable flock support */
+  { "noflock",  1, 1, 0, LMD_FLG_FLOCK},   /* Disable flock support */
+  { NULL,       0, 0, 0, 0         }
 };
 /****************************************************************************/
 
-static int parse_one_option(const char *check, int *flagp)
+static int parse_one_option(const char *check, int *ms_flags, int *lmd_flags)
 {
         const struct opt_map *opt;
 
         for (opt = &opt_map[0]; opt->opt != NULL; opt++) {
                 if (strcmp(check, opt->opt) == 0) {
-                        if (opt->inv)
-                                *flagp &= ~(opt->mask);
-                        else
-                                *flagp |= opt->mask;
+                        if (opt->inv) {
+                                *ms_flags &= ~(opt->ms_mask);
+                                *lmd_flags &= ~(opt->lmd_mask);
+                        } else {
+                                *ms_flags |= opt->ms_mask;
+                                *lmd_flags |= opt->lmd_mask;
+                        }
                         return 1;
                 }
         }
@@ -200,12 +208,14 @@ int parse_options(char *options, struct lustre_mount_data *lmd, int *flagp)
                         if (0) {
                                 /* All the network options have gone :)) */
                         } else {
-                                fprintf(stderr, "%s: unknown option '%s'\n",
-                                        progname, opt);
+                                fprintf(stderr, "%s: unknown option '%s'. "
+                                        "Ignoring.\n", progname, opt);
+                                /* Ignore old nettype= for now 
                                 usage(stderr);
+                                */
                         }
                 } else {
-                        if (parse_one_option(opt, flagp))
+                        if (parse_one_option(opt, flagp, &lmd->lmd_flags))
                                 continue;
 
                         fprintf(stderr, "%s: unknown option '%s'\n",
@@ -264,9 +274,8 @@ build_data(char *source, char *options, struct lustre_mount_data *lmd,
                 return rc;
 
         lmd->lmd_nid = libcfs_str2nid(nid);
-        if (lmd->lmd_nid == PTL_NID_ANY) {
-                fprintf(stderr, "%s: can't parse nid '%s'\n",
-                        progname, libcfs_nid2str(lmd->lmd_nid));
+        if (lmd->lmd_nid == LNET_NID_ANY) {
+                fprintf(stderr, "%s: can't parse nid '%s'\n", progname, nid);
                 return 1;
         }
 
index 11b9fb8..13a917b 100755 (executable)
@@ -21,7 +21,7 @@
 """
 lmc - lustre configuration data manager
 
-  See Lustre book (http://www.lustre.org/docs/lustre.pdf) for documentation on lmc.
+  See the man page, or the Lustre Operations Manual, for documentation on lmc.
 
 """
 
@@ -66,6 +66,7 @@ Object creation command summary:
   --timeout num
   --upcall path
   --lustre_upcall path
+  --group_upcall path
   --portals_upcall path
   --ptldebug debug_level
   --subsystem subsystem_name
@@ -74,7 +75,7 @@ Object creation command summary:
   --node node_name
   --nid nid
   --cluster_id 
-  --nettype tcp|elan|gm|openib|iib|vib|ra
+  --nettype tcp|elan|gm|openib|iib|vib|ra|ptl
   --hostaddr ip[/netmask]
   --port port
   --tcpbuf size
@@ -85,9 +86,10 @@ Object creation command summary:
   --node node_name
   --mds mds_name
   --dev path
-  --fstype extN|ext3
+  --fstype ldiskfs|ext3
   --size size
   --nspath
+  --group_upcall upcall
   --journal_size size
   --inode_size size
   --mdsuuid uuid
@@ -104,10 +106,12 @@ Object creation command summary:
 --add ost
   --node node_name
   --ost ost_name 
+  --failout
+  --failover
   --lov lov_name 
   --dev path
   --size size
-  --fstype extN|ext3
+  --fstype ldiskfs|ext3
   --journal_size size
   --inode_size size
   --osdtype obdecho|obdfilter
@@ -158,12 +162,13 @@ lmc_options = [
     ('timeout', "Set timeout to initiate recovery.", PARAM),
     ('upcall', "Set both lustre and portals upcall scripts.", PARAM),
     ('lustre_upcall', "Set location of lustre upcall script.", PARAM),
+    ('group_upcall', "Set location of extended group upcall script.", PARAM),
     ('portals_upcall', "Set location of portals upcall script.", PARAM),
     ('ptldebug', "Set the portals debug level",  PARAM),
     ('subsystem', "Specify which Lustre subsystems have debug output recorded in the log",  PARAM),
 
     # network 
-    ('nettype', "Specify the network type. This can be tcp/elan/gm/openib/iib/vib/ra.", PARAM),
+    ('nettype', "Specify the network type. This can be tcp/elan/gm/openib/iib/vib/ra/ptl.", PARAM),
     ('nid', "Give the network ID, e.g ElanID/IP Address as used by portals.", PARAM),
     ('port', "Optional argument to specify the TCP port number.", PARAM, DEFAULT_PORT),
     ('hostaddr', "Optional argument to specify the host address.", PARAMLIST),
@@ -182,10 +187,12 @@ lmc_options = [
     ('mds', "Specify MDS name.", PARAM),
     ('ost', "Specify the OST name.", PARAM,""),
     ('osdtype', "This could obdfilter or obdecho.", PARAM, "obdfilter"),
-    ('failover', "Enable failover support on OSTs or MDS?"),
+    ('failout', "Disable failover support on OST"),
+    ('failover', "Enable failover support on OST"),
     ('group', "", PARAM),
     ('dev', "Path of the device on local system.", PARAM,""),
     ('size', "Specify the size of the device if needed.", PARAM,"0"),
+    ('group_upcall', "Set location of supplementary group upcall.", PARAM,""),
     ('journal_size', "Specify new journal size for underlying ext3 file system.", PARAM,"0"),
     ('inode_size', "Specify new inode size for underlying ext3 file system.", PARAM,"0"),
     ('fstype', "Optional argument to specify the filesystem type.", PARAM, "ext3"),
@@ -204,13 +211,13 @@ lmc_options = [
 
     # lov
     ('lov', "Specify LOV name.", PARAM,""),
-    ('stripe_sz', "Specify the stripe size in bytes.", PARAM),
-    ('stripe_cnt', "Specify the number of OSTs each file should be striped on.", PARAM, 0),
+    ('stripe_sz', "Specify the stripe size in bytes.", PARAM, DEFAULT_STRIPE_SZ),
+    ('stripe_cnt', "Specify the number of OSTs each file should be striped on.", PARAM, DEFAULT_STRIPE_CNT),
     ('stripe_pattern', "Specify the stripe pattern. RAID 0 is the only one currently supported.", PARAM, 0),
 
     # cobd
-    ('real_obd', "", PARAM),
-    ('cache_obd', "", PARAM),
+    ('real_obd', "Specify the real device for the cache obd system.", PARAM),
+    ('cache_obd', "Specify the cache device for the cache obd system.", PARAM),
 
     ('mgmt', "Specify management/monitoring service name.", PARAM, ""),
     ]
@@ -224,10 +231,13 @@ def panic(cmd, msg):
     print msg
     sys.exit(1)
 
-    
 def warning(*args):
     msg = string.join(map(str,args))
-    print "Warning: ", msg
+    sys.stderr.write("WARNING: %s\n" % (msg))
+
+def info(*args):
+    msg = string.join(map(str,args))
+    sys.stderr.write("INFO: %s\n" % (msg))
     
 #
 # manage names and uuids
@@ -371,15 +381,15 @@ class GenConfig:
         ldlm = self.newService("ldlm", name, uuid)
         return ldlm
 
-    def osd(self, name, uuid, fs, osdtype, devname, format, ost_uuid,
+    def osd(self, name, uuid, fstype, osdtype, devname, format, ost_uuid,
             node_uuid, dev_size=0, journal_size=0, inode_size=0, nspath="", 
             mkfsoptions="", mountfsoptions=""):
         osd = self.newService("osd", name, uuid)
         osd.setAttribute('osdtype', osdtype)
         osd.appendChild(self.ref("target", ost_uuid))
         osd.appendChild(self.ref("node", node_uuid))
-        if fs:
-            self.addElement(osd, "fstype", fs)
+        if fstype:
+            self.addElement(osd, "fstype", fstype)
         if devname:
             dev = self.addElement(osd, "devpath", devname)
             self.addElement(osd, "autoformat", format)
@@ -391,7 +401,7 @@ class GenConfig:
                 self.addElement(osd, "inodesize", "%s" % (inode_size))
             if mkfsoptions:
                 self.addElement(osd, "mkfsoptions", mkfsoptions)
-           if mountfsoptions:
+            if mountfsoptions:
                 self.addElement(osd, "mountfsoptions", mountfsoptions)
         if nspath:
             self.addElement(osd, "nspath", nspath)
@@ -434,11 +444,11 @@ class GenConfig:
             self.addElement(mds, "group", group)
         return mds
 
-    def mdsdev(self, name, uuid, fs, devname, format, node_uuid,
+    def mdsdev(self, name, uuid, fstype, devname, format, node_uuid,
                mds_uuid, dev_size=0, journal_size=0, inode_size=256,
-               nspath="", mkfsoptions="", mountfsoptions=""):
+               nspath="", mkfsoptions="", mountfsoptions="", group_upcall=""):
         mdd = self.newService("mdsdev", name, uuid)
-        self.addElement(mdd, "fstype", fs)
+        self.addElement(mdd, "fstype", fstype)
         dev = self.addElement(mdd, "devpath", devname)
         self.addElement(mdd, "autoformat", format)
         if dev_size:
@@ -451,8 +461,10 @@ class GenConfig:
             self.addElement(mdd, "nspath", nspath)
         if mkfsoptions:
             self.addElement(mdd, "mkfsoptions", mkfsoptions)
-       if mountfsoptions:
+        if mountfsoptions:
             self.addElement(mdd, "mountfsoptions", mountfsoptions)
+       if group_upcall:
+            self.addElement(mdd, "group_upcall", group_upcall)
 
         mdd.appendChild(self.ref("node", node_uuid))
         mdd.appendChild(self.ref("target", mds_uuid))
@@ -469,7 +481,7 @@ class GenConfig:
         mtpt = self.newService("mountpoint", name, uuid)
         mtpt.appendChild(self.ref("filesystem", fs_uuid))
         self.addElement(mtpt, "path", path)
-       if clientoptions:
+        if clientoptions:
             self.addElement(mtpt, "clientoptions", clientoptions)
         return mtpt
 
@@ -601,6 +613,8 @@ def set_node_options(gen, node, options):
             gen.addElement(node, 'lustreUpcall', options.lustre_upcall)
         else: 
             gen.addElement(node, 'lustreUpcall', default_upcall)
+    if options.group_upcall:
+        gen.addElement(node, 'groupUpcall', options.group_upcall)
     if default_upcall or options.portals_upcall:
         if options.portals_upcall:
             gen.addElement(node, 'portalsUpcall', options.portals_upcall)
@@ -648,7 +662,7 @@ def add_net(gen, lustre, options):
 
     if net_type in ('tcp','openib','ra'):
         port = get_option_int(options, 'port')
-    elif net_type in ('elan','gm','iib','vib','lo'):
+    elif net_type in ('elan','gm','iib','vib','lo','ptl'):
         port = 0
     else:
         print "Unknown net_type: ", net_type
@@ -719,6 +733,8 @@ def add_mds(gen, lustre, options):
         mds = lookup(lustre, mds_uuid)
     if options.failover:
         mds.setAttribute('failover', "1")
+    if options.failout:
+        mds.setAttribute('failover,',"0")
 
     devname = get_option(options, 'dev')
     size = get_option(options, 'size')
@@ -728,6 +744,7 @@ def add_mds(gen, lustre, options):
     nspath = get_option(options, 'nspath')
     mkfsoptions = get_option(options, 'mkfsoptions')
     mountfsoptions = get_option(options, 'mountfsoptions')
+    group_upcall = get_option(options, 'group_upcall')
 
     node_uuid = name2uuid(lustre, node_name, 'node')
 
@@ -740,7 +757,7 @@ def add_mds(gen, lustre, options):
     mdd = gen.mdsdev(mdd_name, mdd_uuid, fstype, devname,
                      get_format_flag(options), node_uuid, mds_uuid,
                      size, journal_size, inode_size, nspath, mkfsoptions,
-                     mountfsoptions)
+                     mountfsoptions, group_upcall)
     lustre.appendChild(mdd)
                    
 
@@ -776,7 +793,7 @@ def add_ost(gen, lustre, options):
         journal_size = ''
         inode_size = ''
         mkfsoptions = ''
-       mountfsoptions = ''
+        mountfsoptions = ''
     else:
         devname = get_option(options, 'dev') # can be unset for bluearcs
         size = get_option(options, 'size')
@@ -784,7 +801,7 @@ def add_ost(gen, lustre, options):
         journal_size = get_option(options, 'journal_size')
         inode_size = get_option(options, 'inode_size')
         mkfsoptions = get_option(options, 'mkfsoptions')
-       mountfsoptions = get_option(options, 'mountfsoptions')
+        mountfsoptions = get_option(options, 'mountfsoptions')
         
     nspath = get_option(options, 'nspath')
 
@@ -816,6 +833,8 @@ def add_ost(gen, lustre, options):
 
     if options.failover:
         ost.setAttribute('failover', "1")
+    if options.failout:
+        ost.setAttribute('failover', "0")
     
 
     osd = gen.osd(osdname, osd_uuid, fstype, osdtype, devname,
@@ -882,6 +901,9 @@ def add_lov(gen, lustre, options):
     mds_name = get_option(options, 'mds')
     stripe_sz = get_option_int(options, 'stripe_sz')
     stripe_cnt = get_option_int(options, 'stripe_cnt')
+    if stripe_cnt == 0:
+        info("default stripe count (0) - will use %d stripe(s) per file" \
+                % DEFAULT_STRIPE_CNT)
     pattern = get_option_int(options, 'stripe_pattern')
     uuid = new_uuid(name)
 
index 35543f0..755973c 100644 (file)
@@ -49,7 +49,7 @@
 
 
 #include "obdctl.h"
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
 #include "parser.h"
 #include <stdio.h>
 
@@ -253,7 +253,7 @@ int jt_obd_cleanup(int argc, char **argv)
 }
 
 static 
-int do_add_uuid(char * func, char *uuid, ptl_nid_t nid) 
+int do_add_uuid(char * func, char *uuid, lnet_nid_t nid) 
 {
         int rc;
         struct lustre_cfg_bufs bufs;
@@ -284,14 +284,14 @@ int do_add_uuid(char * func, char *uuid, ptl_nid_t nid)
 
 int jt_lcfg_add_uuid(int argc, char **argv)
 {
-        ptl_nid_t nid;
+        lnet_nid_t nid;
         
         if (argc != 3) {                
                 return CMD_HELP;
         }
 
         nid = libcfs_str2nid(argv[2]);
-        if (nid == PTL_NID_ANY) {
+        if (nid == LNET_NID_ANY) {
                 fprintf (stderr, "Can't parse NID %s\n", argv[2]);
                 return (-1);
         }
@@ -299,7 +299,7 @@ int jt_lcfg_add_uuid(int argc, char **argv)
         return do_add_uuid(argv[0], argv[1], nid);
 }
 
-int obd_add_uuid(char *uuid, ptl_nid_t nid)
+int obd_add_uuid(char *uuid, lnet_nid_t nid)
 {
         return do_add_uuid("obd_add_uuid", uuid, nid);
 }
index 7037224..c27e4ca 100644 (file)
@@ -924,7 +924,7 @@ void set_defaults(struct mkfs_opts *mop)
         mop->mo_index = -1;
 
         gethostname(hostname, sizeof(hostname));
-        mop->mo_hostnid.primary = libcfs_str2nid(hostname);
+        //mop->mo_hostnid.primary = libcfs_str2nid(hostname);
 }
 
 static inline void badopt(char opt, char *type)
@@ -1006,7 +1006,9 @@ int main(int argc , char *const argv[])
                                 sizeof(mop.mo_mkfsopts) - 1);
                         break;
                 case 'f':
-                        mop.mo_hostnid.backup = libcfs_str2nid(optarg);
+                        /* we must pass this info on when we register with
+                           the mgs */
+                        //mop.mo_hostnid.backup = libcfs_str2nid(optarg);
                         break;
                 case 'G':
                         mop.mo_ldd.ldd_flags |= LDD_F_SV_TYPE_MGMT;
index 39e4249..1ce1a89 100644 (file)
@@ -53,7 +53,7 @@
 #endif
 
 #include <linux/obd_class.h>
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
 #include "parser.h"
 #include <stdio.h>
 #include <sys/ipc.h>
index 28b1729..1c0b09b 100644 (file)
@@ -70,6 +70,7 @@ command_t cmdlist[] = {
         {"setattr", jt_obd_setattr, 0, "setattr <id> <mode>"},
         {"newconn", jt_obd_newconn, 0, "newconn <olduuid> [newuuid]"},
         {"test_getattr", jt_obd_test_getattr, 0, "test_getattr <count> [verbose [[t]objid]]"},
+        {"test_setattr", jt_obd_test_setattr, 0, "test_setattr <count> [verbose [[t]objid]]"},
         {"test_brw", jt_obd_test_brw, 0, "test_brw [t]<count> [write [verbose [pages [[t]objid]]]]"},
         {"dump_ldlm", jt_obd_dump_ldlm, 0, "dump all lock manager state (no args)"},
 
index 646da65..7883dbd 100644 (file)
@@ -89,6 +89,6 @@ int jt_lcfg_set_lustre_upcall(int argc, char **argv);
 int jt_lcfg_add_conn(int argc, char **argv);
 int jt_lcfg_del_conn(int argc, char **argv);
 
-int obd_add_uuid(char *uuid, ptl_nid_t nid);
+int obd_add_uuid(char *uuid, lnet_nid_t nid);
 
 #endif
index 70de0ad..08a4721 100644 (file)
@@ -270,6 +270,7 @@ check_niobuf_remote(void)
         CHECK_VALUE(OBD_BRW_WRITE);
         CHECK_VALUE(OBD_BRW_SYNC);
         CHECK_VALUE(OBD_BRW_FROM_GRANT);
+        CHECK_VALUE(OBD_BRW_NOQUOTA);
 }
 
 void
@@ -458,6 +459,7 @@ check_ldlm_extent(void)
         CHECK_STRUCT(ldlm_extent);
         CHECK_MEMBER(ldlm_extent, start);
         CHECK_MEMBER(ldlm_extent, end);
+        CHECK_MEMBER(ldlm_extent, gid);
 }
 
 void
@@ -467,7 +469,6 @@ check_ldlm_flock(void)
         CHECK_STRUCT(ldlm_flock);
         CHECK_MEMBER(ldlm_flock, start);
         CHECK_MEMBER(ldlm_flock, end);
-        CHECK_MEMBER(ldlm_flock, blocking_export);
         CHECK_MEMBER(ldlm_flock, blocking_pid);
         CHECK_MEMBER(ldlm_flock, pid);
 }
@@ -866,8 +867,6 @@ main(int argc, char **argv)
 
         CHECK_DEFINE(OBD_OBJECT_EOF);
 
-        CHECK_VALUE(OST_REQ_HAS_OA1);
-
         CHECK_VALUE(MDS_GETATTR);
         CHECK_VALUE(MDS_GETATTR_NAME);
         CHECK_VALUE(MDS_CLOSE);
index f802c1a..922ecd6 100644 (file)
@@ -94,8 +94,6 @@ void lustre_assert_wire_constants(void)
                  (long long)OST_LAST_OPC);
         LASSERTF(OBD_OBJECT_EOF == 0xffffffffffffffffULL," found %lld\n",
                  (long long)OBD_OBJECT_EOF);
-        LASSERTF(OST_REQ_HAS_OA1 == 1, " found %lld\n",
-                 (long long)OST_REQ_HAS_OA1);
         LASSERTF(MDS_GETATTR == 33, " found %lld\n",
                  (long long)MDS_GETATTR);
         LASSERTF(MDS_GETATTR_NAME == 34, " found %lld\n",
@@ -1118,6 +1116,10 @@ void lustre_assert_wire_constants(void)
                  (long long)(int)offsetof(struct ldlm_extent, end));
         LASSERTF((int)sizeof(((struct ldlm_extent *)0)->end) == 8, " found %lld\n",
                  (long long)(int)sizeof(((struct ldlm_extent *)0)->end));
+        LASSERTF((int)offsetof(struct ldlm_extent, gid) == 16, " found %lld\n",
+                 (long long)(int)offsetof(struct ldlm_extent, gid));
+        LASSERTF((int)sizeof(((struct ldlm_extent *)0)->gid) == 8, " found %lld\n",
+                 (long long)(int)sizeof(((struct ldlm_extent *)0)->gid));
 
         /* Checks for struct ldlm_flock */
         LASSERTF((int)sizeof(struct ldlm_flock) == 32, " found %lld\n",