===================================================================
--- 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.
*/
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);
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];
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
+ 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);
+ 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);
+ 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);
+ 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);
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
+ 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);
+ 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);
+ 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);
+ 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);
===================================================================
--- 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;
}
+ 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;
+ }
+ }
+ "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: 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
+}
+
+
-+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;
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
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.
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().
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);
}
return err;
}
-@@ -1830,7 +1830,7 @@
+@@ -1835,7 +1835,7 @@
}
}
}
/**
-@@ -2001,7 +2001,7 @@
+@@ -2006,7 +2006,7 @@
ext3_journal_test_restart(handle, inode);
}
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;
}
}
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);
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;
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);
}
+ 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:
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");
/* 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
/* 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,
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);
#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>
+++ 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
+ 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;
+}
+
+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;
+ 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;
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
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
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:"
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
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
-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:
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
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}
# 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>
#
# 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],
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"
])
#
# 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
#
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)
-m4_define([LUSTRE_VERSION],[1.4.3.3])
+m4_define([LUSTRE_VERSION],[1.4.5])
-.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
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
--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
--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
--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
--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
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
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.
<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
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'.
--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
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
<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
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.
.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.
.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
.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
.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
-#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
\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
--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
--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
\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 ~
.
\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
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 ~
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
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
\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
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
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 ~
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
\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
<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
-.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
.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.
--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.
--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.
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.
--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
--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.
--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.
.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.
\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
--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
\layout Description
--nettype\SpecialChar ~
-<type> This can be
+<type> Specify the network type.This can be
\series bold
tcp, elan, gm.
\layout Description
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
\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 ~
\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
\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 ~
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
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 ~
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
\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
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
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 ~
\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
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.
\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
+++ /dev/null
-#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
# See the file COPYING in this distribution
SUBDIRS = linux lustre
-EXTRA_DIST = ioctl.h liblustre.h
+EXTRA_DIST = ioctl.h liblustre.h
#include <fcntl.h>
#include <libcfs/list.h>
-#include <portals/p30.h>
+#include <lnet/lnet.h>
#include <libcfs/kp30.h>
/* definitions for liblustre */
#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)
/* 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 */
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
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];
};
#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)
/*
{
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);
#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)
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)
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)
#define _LUSTRE_DISK_H
#include <linux/types.h>
-#include <portals/types.h>
+#include <lnet/types.h>
/****************** persistent mount data *********************/
}
struct host_desc {
- ptl_nid_t primary;
- ptl_nid_t backup;
+ lnet_nid_t primary;
+ lnet_nid_t backup;
};
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)
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;
#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
/* 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
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;
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)
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);
#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
#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
/* request structure for OST's */
-#define OST_REQ_HAS_OA1 0x1
-
struct ost_body {
struct obdo oa;
};
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
#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;
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;
}
#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,
#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>
/* 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 {
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;
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 {
__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
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,
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,
#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;
};
* 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 */
};
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 */
struct lustre_msg rs_msg;
};
+struct ptlrpc_thread;
+
enum rq_phase {
RQ_PHASE_NEW = 0xebc0de00,
RQ_PHASE_RPC = 0xebc0de01,
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;
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 */
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;
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 *
__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;
};
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;
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 */
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;
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 */
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);
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);
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 {
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,
#define LL_DQUOT_OFF(sb) do {} while(0)
#endif /*!HAVE_QUOTA_SUPPORT */
-#endif /* _LUSTRE_QUOTA_H */
+#endif /* _LUSTRE_QUOTA_H */
#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 */
#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;
#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
};
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
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;
/* 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 */
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 {
struct ost_obd {
struct ptlrpc_service *ost_service;
struct ptlrpc_service *ost_create_service;
+ struct semaphore ost_health_sem;
};
struct echo_client_obd {
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)
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;
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 *);
* 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.
+ *
*/
};
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);
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
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)
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);
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;
# 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) \
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); \
#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)
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); \
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); \
} \
} while (0)
+#define OBD_FREE_PTR(ptr) OBD_FREE(ptr, sizeof *(ptr))
+
#define OBD_SLAB_FREE(ptr, slab, size) \
do { \
LASSERT(ptr); \
# 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
#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
*/
#define __ASM_X86_64_PROCESSOR_H
-#include <linux/quota.h>
#ifdef __KERNEL__
#include <linux/string.h>
#else
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
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 */
--- /dev/null
+#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
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
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
#
# 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
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
# 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
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
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
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
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
# 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
# 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
# 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_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
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
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
# 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
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
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
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
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)
CONFIG_RMS=m
CONFIG_JTAG=m
CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
CONFIG_RCPCI=m
CONFIG_SHAPER=m
CONFIG_NETCONSOLE=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
CONFIG_SND_SONICVIBES=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
#
# ALSA USB devices
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
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
CONFIG_RELAYFS_FS=m
# CONFIG_KLOG_CHANNEL is not set
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
#
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
#
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y
CONFIG_LOG_BUF_SHIFT=17
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
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
#
# 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
# 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
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
#
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
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
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
# 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
# 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
# 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
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
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
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
# 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
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
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
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
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)
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
# 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
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
CONFIG_SND_SONICVIBES=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
#
# ALSA USB devices
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
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
CONFIG_RELAYFS_FS=m
# CONFIG_KLOG_CHANNEL is not set
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
#
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
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
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
#
# 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
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
# 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
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
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
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
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
# 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
# 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
# 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_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
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
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
# 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
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
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
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
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)
CONFIG_RMS=m
CONFIG_JTAG=m
CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
CONFIG_RCPCI=m
CONFIG_SHAPER=m
CONFIG_NETCONSOLE=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
CONFIG_SND_SONICVIBES=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
#
# ALSA USB devices
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
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
CONFIG_RELAYFS_FS=m
# CONFIG_KLOG_CHANNEL is not set
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
#
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
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
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
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
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y
CONFIG_ACPI_INITRD=y
-CONFIG_IOPROC=y
-CONFIG_PTRACK=y
#
# Bus options (PCI, PCMCIA)
# 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
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
#
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
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
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
# 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
# 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
# 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
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
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
# 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
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
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
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
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)
CONFIG_RMS=m
CONFIG_JTAG=m
CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
CONFIG_SHAPER=m
CONFIG_NETCONSOLE=m
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
CONFIG_SYNCLINK_CS=m
CONFIG_RAW_DRIVER=m
CONFIG_MAX_RAW_DEVS=4096
+CONFIG_HANGCHECK_TIMER=m
CONFIG_MMTIMER=m
CONFIG_VTUNE=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
CONFIG_SND_SONICVIBES=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
#
# ALSA USB devices
# 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
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
CONFIG_RELAYFS_FS=m
# CONFIG_KLOG_CHANNEL is not set
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
# CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
#
# Cryptographic options
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
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
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
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y
CONFIG_ACPI_INITRD=y
-CONFIG_IOPROC=y
-CONFIG_PTRACK=y
#
# Bus options (PCI, PCMCIA)
# 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
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
#
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
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
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
# 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
# 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
# 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
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
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
# 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
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
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
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
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)
CONFIG_RMS=m
CONFIG_JTAG=m
CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
CONFIG_SHAPER=m
CONFIG_NETCONSOLE=m
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
CONFIG_SYNCLINK_CS=m
CONFIG_RAW_DRIVER=m
CONFIG_MAX_RAW_DEVS=4096
+CONFIG_HANGCHECK_TIMER=m
CONFIG_MMTIMER=m
CONFIG_VTUNE=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
CONFIG_SND_SONICVIBES=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
#
# ALSA USB devices
# 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
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
CONFIG_RELAYFS_FS=m
# CONFIG_KLOG_CHANNEL is not set
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
# CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
#
# Cryptographic options
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
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
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
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
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y
CONFIG_ACPI_INITRD=y
-CONFIG_IOPROC=y
-CONFIG_PTRACK=y
#
# CPU Frequency scaling
# 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.)
CONFIG_COMPAT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_UID16=y
-CONFIG_KEXEC=y
#
# Device Drivers
# 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
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
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
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
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
# 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
# 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
# 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
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
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
# 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
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
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
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
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)
CONFIG_RMS=m
CONFIG_JTAG=m
CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
CONFIG_SHAPER=m
CONFIG_NETCONSOLE=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
CONFIG_SND_SONICVIBES=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
#
# ALSA USB devices
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
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
CONFIG_RELAYFS_FS=m
# CONFIG_KLOG_CHANNEL is not set
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
# CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
#
# Cryptographic options
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
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
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_PS=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
#
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
CONFIG_ACPI_PCI=y
CONFIG_ACPI_SYSTEM=y
CONFIG_ACPI_INITRD=y
-CONFIG_IOPROC=y
-CONFIG_PTRACK=y
#
# CPU Frequency scaling
# 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.)
CONFIG_COMPAT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_UID16=y
-CONFIG_KEXEC=y
#
# Device Drivers
# 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
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
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
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
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
# 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
# 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
# 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
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
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
# 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
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
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
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
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)
CONFIG_RMS=m
CONFIG_JTAG=m
CONFIG_NET_FC=y
-CONFIG_NET_LPFC=m
CONFIG_SHAPER=m
CONFIG_NETCONSOLE=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
CONFIG_SND_SONICVIBES=m
CONFIG_SND_VIA82XX=m
CONFIG_SND_VX222=m
+CONFIG_SND_HDA_INTEL=m
#
# ALSA USB devices
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
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
+CONFIG_CONFIGFS_FS=m
CONFIG_RELAYFS_FS=m
# CONFIG_KLOG_CHANNEL is not set
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
# CONFIG_SECURITY_SELINUX_MLS is not set
+CONFIG_SECURITY_SUBDOMAIN=m
#
# Cryptographic options
#
# 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
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
# 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
#
# 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
#
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
# 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
# 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
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
#
# 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
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
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
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
# 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
# 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
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
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)
#
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
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
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
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
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
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
# 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
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
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
CONFIG_IP6_NF_TARGET_MARK=m
CONFIG_IP6_NF_RAW=m
-
#
# Bridge: Netfilter Configuration
#
# 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
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
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)
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
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
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)
CONFIG_R8169=m
CONFIG_R8169_NAPI=y
CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
CONFIG_TIGON3=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)
# 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
# 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
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
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
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
CONFIG_ISDN_CAPI_CAPI20=m
CONFIG_ISDN_CAPI_CAPIFS_BOOL=y
CONFIG_ISDN_CAPI_CAPIFS=m
+CONFIG_ISDN_CAPI_CAPIDRV=m
#
# CAPI hardware drivers
# 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
# 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
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
# 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
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
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
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
#
# 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
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
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
# 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
# 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
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
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
#
# 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
# 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
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
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)
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
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
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
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
# 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
CONFIG_ZISOFS=y
CONFIG_ZISOFS_FS=y
CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#
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
#
# 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
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
# 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
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
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_UTF8=m
-CONFIG_NLS_ASCII=y
#
# Profiling support
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
# 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
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
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
#
# 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
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
# 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
#
# 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
#
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
# 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
# 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
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
#
# 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
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
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
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
# 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
# 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
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
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)
#
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
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
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
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
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
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
# 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
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
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
CONFIG_IP6_NF_TARGET_MARK=m
CONFIG_IP6_NF_RAW=m
-
#
# Bridge: Netfilter Configuration
#
# 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
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
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)
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
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
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)
CONFIG_R8169=m
CONFIG_R8169_NAPI=y
CONFIG_SK98LIN=m
+CONFIG_VIA_VELOCITY=m
CONFIG_TIGON3=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)
# 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
# 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
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
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
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
CONFIG_ISDN_CAPI_CAPI20=m
CONFIG_ISDN_CAPI_CAPIFS_BOOL=y
CONFIG_ISDN_CAPI_CAPIFS=m
+CONFIG_ISDN_CAPI_CAPIDRV=m
#
# CAPI hardware drivers
# 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
# 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
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
# 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
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
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
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
#
# 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
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
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
# 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
# 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
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
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
#
# 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
# 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
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
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)
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
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
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
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
# 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
CONFIG_ZISOFS=y
CONFIG_ZISOFS_FS=y
CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#
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
#
# 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
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
# 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
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
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_UTF8=m
-CONFIG_NLS_ASCII=y
#
# Profiling support
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
# 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
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
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
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
===================================================================
--- 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.
*/
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);
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];
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
+ 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);
+ 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);
+ 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);
+ 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);
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
+ 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);
+ 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);
+ 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);
+ 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);
===================================================================
--- 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>
+ goal = bg_start + colour;
+ }
+
++ lock_kernel();
+ newblock = ext3_new_block(handle, inode, goal, 0, 0, err);
++ unlock_kernel();
+ return newblock;
+}
+
+ 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;
+
+ /* 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",
===================================================================
--- 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>
+ goal = bg_start + colour;
+ }
+
++ lock_kernel();
+ newblock = ext3_new_block(handle, inode, goal, 0, 0, err);
++ unlock_kernel();
+ return newblock;
+}
+
+ 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;
+
+ /* 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",
===================================================================
--- 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>
+ goal = bg_start + colour;
+ }
+
++ lock_kernel();
+ newblock = ext3_new_block(handle, inode, goal, 0, 0, err);
++ unlock_kernel();
+ return newblock;
+}
+
+ 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;
+
+ /* 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",
===================================================================
--- 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>
+ goal = bg_start + colour;
+ }
+
++ lock_kernel();
+ newblock = ext3_new_block(handle, inode, goal, 0, 0, err);
++ unlock_kernel();
+ return newblock;
+}
+
+ 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;
+
+ /* 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",
--- /dev/null
+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;
if (ret)
break;
-@@ -3105,3 +3105,75 @@
+@@ -3105,3 +3105,80 @@
ret = ret2;
return ret;
}
+ 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;
+ }
+ }
+ "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:
===================================================================
--- 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;
}
+ 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;
+ }
+ }
+ "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
===================================================================
--- 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;
}
+ 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;
+ }
+ }
+
+ "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:
===================================================================
--- 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;
}
+/* 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,
+ 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;
+ }
+ }
+ "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: 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
+}
+
+
-+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;
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
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.
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().
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);
}
return err;
}
-@@ -1830,7 +1830,7 @@
+@@ -1835,7 +1835,7 @@
}
}
}
/**
-@@ -2001,7 +2001,7 @@
+@@ -2006,7 +2006,7 @@
ext3_journal_test_restart(handle, inode);
}
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;
}
}
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);
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;
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);
}
+ 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:
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");
/* 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
/* 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,
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);
#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>
+++ 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
+ 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;
+}
+
+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;
+ 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;
--- /dev/null
+--- 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);
--- /dev/null
+--- 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
+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)
--- /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
_
/*
* 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: 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
#
# 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.
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>
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
#
# 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.
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>
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
#
# 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"
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
+===========================
+
+
+-- 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.
+ * 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.
+ * 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.
+ * 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.
+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
+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
+# 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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
+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
+# 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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
+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
+# 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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
+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
+# 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.
+ * 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.
+
+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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ 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.
+#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.
+ * 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.
+ */
+#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.
+
+ 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.
+ 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.
+ * 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.
+ * 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.
+ * 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.
+ 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.
+ */
+#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.
+ 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ /* 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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 @@
+
+/*
+ * 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.
+ * 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.
+ * 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 @@
+
+/*
+ /* 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.
+#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.
+ /* 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.
+#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.
+#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.
+ * 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.
+ 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.
+ * 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.
+
+ 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.
+
+ 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.
+ * 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.
+ * 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
+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
+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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ 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.
+ * 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.
+
+ 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ }
+ 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.
+ * 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.
+ * 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 */
+ 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 */
+ 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.
+ 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.
+
+
+#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.
+ * 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.
+
+
+#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
+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
+# 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
+ 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
+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.
+ * 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.
+ }
+}
+#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.
+ * 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
+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
+# 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.
+ * 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
+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
+# 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.
+
+
+
-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.
+ * 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"
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
+
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;
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;
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.
+ * 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.
+ * 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.
+ */
+#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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ */
+#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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+/* $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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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"},
+{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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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
+ * 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.
+ * 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.
+ * 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.
+
+#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.
+ * 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.
+ * 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.
+ * 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.
+} 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.
+#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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+#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.
+#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.
+#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.
+ * 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.
+#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.
+ * 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.
+#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.
+
+#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.
+ * 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.
+#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.
+ * 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.
+#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.
+#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>
.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 -*-
+ *
+#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
+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;
};
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.
+#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
+
+#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.
+#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
+
+#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.
+ * 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
+ * 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.
+ * 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.
+
+
+
-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.
+ * 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.
+ * 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.
+ * 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.
+ 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
+
+#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.
+ * 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.
+ * 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
+#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.
+
+
+#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.
+#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.
+
+
+
-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.
+
+
+
-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>
#include <linux/trigevent_hooks.h>
#include <asm/uaccess.h>
-@@ -871,6 +872,44 @@
+@@ -877,6 +878,44 @@
return audit_result(retval);
}
#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;
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
__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>
/* 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
+ 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
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
+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);
}
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>
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 -*-
+ *
+}
+
+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
+ 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>
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);
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);
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;
}
/* 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>
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>
#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(¤t->mm->page_table_lock);
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>
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>
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>
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
+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 */
===================================================================
--- 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.
===================================================================
--- 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.
+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
/*
/*
* 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)
+
+ 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 */
+
+ 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 */
+++ /dev/null
-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
--- /dev/null
+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
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
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
statfs64-cast-unsigned-2.4-rhel.patch
fsprivate-2.4.patch
nfsd_iallocsem.patch
+linux-2.4.24-jbd-handle-EIO.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
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
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@
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
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:"
*
* 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.
*
*/
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;
}
}
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;
}
}
* 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
/* 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
/* 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 ==
*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);
* 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
*
* 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
imp->imp_dlm_handle = *dlm_handle;
rc = ptlrpc_init_import(imp);
- if (rc != 0)
+ if (rc != 0)
GOTO(out_ldlm, rc);
if (data)
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 */
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);
}
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,
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);
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) {
} else {
DEBUG_REQ(D_NET, req, "sending reply");
}
-
+
return (ptlrpc_send_reply(req, 1));
}
struct ptlrpc_service *svc;
svc = req->rq_rqbd->rqbd_service;
-
rs = req->rq_reply_state;
if (rs == NULL || !rs->rs_difficult) {
/* no notifiers */
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);
* 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
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.
{
struct obd_device *obd = NULL;
- if (!((portal_debug | D_ERROR) & level))
+ if (!((libcfs_debug | D_ERROR) & level))
return;
if (!lock) {
* 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
ENTRY;
lock_kernel();
- kportal_daemonize("ldlm_elt");
+ libcfs_daemonize("ldlm_elt");
SIGNAL_MASK_LOCK(current, flags);
sigfillset(¤t->blocked);
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);
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)) {
/* 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;
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;
}
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);
}
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);
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(¤t->blocked);
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");
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");
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);
* 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
*
* 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
ldlm_namespace_dump(D_DLMTRACE,
lock->l_resource->lr_namespace);
if (last_dump == 0)
- portals_debug_dumplog();
+ libcfs_debug_dumplog();
}
RETURN(0);
}
* 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
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,
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;
}
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);
$(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
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
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);
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);
#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,
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;
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) {
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));
//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);
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);
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;
}
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 |
#!/bin/bash
#set -xv
+set -e
#
# This script is to generate lib lustre library as a whole. It will leave
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"
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
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
$ALL_OBJS -lcap -lpthread
rm -rf $sysio_tmp
-rm -rf $cray_tmp
* 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() ||
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;
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);
}
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);
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);
}
#endif
#if 0
- portal_debug = -1;
- portal_subsystem_debug = -1;
+ libcfs_debug = -1;
+ libcfs_subsystem_debug = -1;
#endif
liblustre_init_random();
/* 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
/* 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
}
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)
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 */
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,
#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;
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;
}
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;
}
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);
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);
}
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);
}
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;
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));
}
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;
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)
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 };
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);
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)
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:
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,
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);
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,
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);
}
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);
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,
} 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();
}
}
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);
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));
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);
}
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);
}
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 |
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);
}
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);
}
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);
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);
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:
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);
}
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);
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);
{
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;
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);
}
return 1;
}
- portal_debug = 0;
- portal_subsystem_debug = 0;
+ libcfs_debug = 0;
+ libcfs_subsystem_debug = 0;
liblustre_init_random();
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);
{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) {
}
}
-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);
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);
{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) {
#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) \
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);
LEAVE();
}
-void t2()
+int t2(char *name)
{
char path[MAX_PATH_LENGTH] = "";
LEAVE();
}
-void t3()
+int t3(char *name)
{
char path[MAX_PATH_LENGTH] = "";
LEAVE();
}
-void t4()
+int t4(char *name)
{
char path[MAX_PATH_LENGTH] = "";
LEAVE();
}
-void t6()
+int t6(char *name)
{
char path[MAX_PATH_LENGTH] = "";
char path2[MAX_PATH_LENGTH] = "";
LEAVE();
}
-void t6b()
+int t6b(char *name)
{
char path[MAX_PATH_LENGTH] = "";
char path2[MAX_PATH_LENGTH] = "";
fprintf(stderr, "current path too long to fit in "
"MAX_PATH_LENGTH?\n");
LEAVE();
- return;
}
t_chdir(path2);
t_chdir(cwd);
LEAVE();
}
-void t7()
+int t7(char *name)
{
char path[MAX_PATH_LENGTH] = "";
int rc;
LEAVE();
}
-void t8()
+int t8(char *name)
{
char path[MAX_PATH_LENGTH] = "";
LEAVE();
}
-void t9()
+int t9(char *name)
{
char path[MAX_PATH_LENGTH] = "";
char path2[MAX_PATH_LENGTH] = "";
LEAVE();
}
-void t10()
+int t10(char *name)
{
char dir1[MAX_PATH_LENGTH] = "";
char dir2[MAX_PATH_LENGTH] = "";
LEAVE();
}
-void t11()
+int t11(char *name)
{
char *base=lustre_path;
char path[MAX_PATH_LENGTH], path2[MAX_PATH_LENGTH];
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);
LEAVE();
}
-void t12()
+int t12(char *name)
{
char dir[MAX_PATH_LENGTH] = "";
char buf[1024*128];
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_";
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___";
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");
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));
}
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;
LEAVE();
}
-void t16()
+int t16(char *name)
{
char file[MAX_PATH_LENGTH] = "";
ENTRY("small-write-read");
LEAVE();
}
-void t17()
+int t17(char *name)
{
char file[MAX_PATH_LENGTH] = "";
int fd;
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];
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);
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,
(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;
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;
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;
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;
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;
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;
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);
LEAVE();
}
-void t21()
+int t21(char *name)
{
char file[MAX_PATH_LENGTH] = "";
int fd, ret;
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);
LEAVE();
}
-void t22()
+int t22(char *name)
{
char file[MAX_PATH_LENGTH] = "";
int fd;
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);
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;
}
}
/* 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;
(_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");
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++) {
_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_();
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
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;
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;
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)
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;
#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)
{
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);
}
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;
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));
.it_flags = file->f_flags };
struct lov_stripe_md *lsm;
struct ptlrpc_request *req;
+ struct ll_file_data *fd;
int rc = 0;
ENTRY;
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))
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;
RETURN(-EEXIST);
}
+ fd = ll_file_data_get();
+ if (fd == NULL)
+ GOTO(out, -ENOMEM);
+
f = get_empty_filp();
if (!f)
GOTO(out, -ENOMEM);
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);
out:
if (f)
put_filp(f);
+ ll_file_data_put(fd);
up(&lli->lli_open_sem);
if (req != NULL)
ptlrpc_req_finished(req);
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 };
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;
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);
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)
/* .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,
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(¤t->blocked);
RECALC_SIGPENDING;
/* 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;
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;
};
#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;
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;
};
/* 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 *,
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 *);
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);
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"
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;
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;
}
lsi->lsi_llsbi = NULL;
}
RETURN(err);
-}
-
+} /* ll_fill_super */
+
+
void ll_put_super(struct super_block *sb)
{
struct obd_device *obd;
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)
/* 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)) {
{ .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,
{
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;
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 {
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 };
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));
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);
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);
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);
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);
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));
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;
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
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))
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;
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)
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);
}
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);
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;
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)) {
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 {
}
ClearPageError(page);
} else {
- if (cmd == OBD_BRW_READ) {
+ if (cmd & OBD_BRW_READ) {
llap->llap_defer_uptodate = 0;
} else {
ll_redirty_page(page);
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);
}
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);
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) {
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);
* 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
}
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)
{
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;
*
* 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
* 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
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,
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;
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);
*
* 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
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;
}
}
*
* 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
*
* 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
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);
*
* 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
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
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
LASSERT(current->journal_info == handle);
- lock_kernel();
+ lock_24kernel();
transaction = handle->h_transaction;
journal = transaction->t_journal;
tid = transaction->t_tid;
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)
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);
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",
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)
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;
}
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);
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");
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++;
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);
# 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,
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);
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);
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);
}
/*
{
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;
--- /dev/null
+/* -*- 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);
*
* 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
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);
*
* 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
/* 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);
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,
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;
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)
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;
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;
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;
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) {
*
* 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
}
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) */
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;
* 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)
{
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;
* 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);
/* 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);
}
}
}
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);
}
*
* 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
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;
/* 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);
*
* 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
-
+/* -*- 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 )
{
* 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
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);
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;
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 */
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);
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;
}
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;
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)) {
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;
}
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))
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))
out_pop:
pop_ctxt(&saved, &obd->obd_lvfs_ctxt, &uc);
out:
+ mds_exit_ucred(&uc, mds);
req->rq_status = rc;
RETURN(0);
}
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:
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);
}
}
-/* 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;
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))
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);
}
}
"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);
obd->obd_replayable ? "enabled" : "disabled");
}
- ldlm_timeout = 6;
+ ldlm_timeout = 2;
ping_evictor_start();
RETURN(0);
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;
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) {
}
/* clean PENDING dir */
- rc = mds_cleanup_orphans(obd);
+ rc = mds_cleanup_pending(obd);
if (rc < 0) {
GOTO(out, rc);
} else {
}
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)
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);
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;
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)
{
.o_owner = THIS_MODULE,
.o_setup = mdt_setup,
.o_cleanup = mdt_cleanup,
+ .o_health_check = mdt_health_check,
};
static int __init mds_init(void)
*
* 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
#include <linux/obd.h>
#include <linux/obd_class.h>
#include <linux/lprocfs_status.h>
-
#include "mds_internal.h"
#ifdef LPROCFS
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 }
};
* 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
#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"
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;
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);
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);
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",
/* 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 */
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);
#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 */
*
* 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
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;
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);
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;
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;
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;
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);
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);
+}
* 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
};
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,
* 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
* 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
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) {
RETURN(0);
}
-
if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_MDS_ALLOC_OBDO))
GOTO(out_ids, rc = -ENOMEM);
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;
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);
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));
}
* 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
#include <linux/lustre_mds.h>
#include <linux/lustre_dlm.h>
#include <linux/lustre_fsfilt.h>
+#include <linux/lustre_ucache.h>
#include "mds_internal.h"
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);
}
RETURN(error);
}
- if (ia_valid & ATTR_UID) {
+ if (ia_valid & (ATTR_UID | ATTR_GID)) {
/* chown */
error = -EPERM;
if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
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.
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);
}
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) &&
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);
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);
}
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;
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;
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);
}
*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);
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);
}
* 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 */
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;
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));
*
* 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
#ifndef __KERNEL__
/* liblustre workaround */
-atomic_t portal_kmemory = {0};
+atomic_t libcfs_kmemory = {0};
#endif
struct obd_device obd_dev[MAX_OBD_DEVICES];
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 */
/* 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;
}
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);
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);
}
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);
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;
spin_lock(&obd_dev_lock);
}
spin_unlock(&obd_dev_lock);
-#endif
if (rc == 0)
return snprintf(page, count, "healthy\n");
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
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)
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);
}
/* 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)
*
* 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.
*/
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);
}
*
* 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
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);
}
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;
}
{
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);
}
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);
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.
}
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
ENTRY;
lock_kernel();
- kportal_daemonize("ping_evictor");
+ libcfs_daemonize("ping_evictor");
SIGNAL_MASK_LOCK(current, flags);
sigfillset(¤t->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) {
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
class_export_put(pet_exp);
pet_exp = NULL;
}
- CDEBUG(D_PET, "Exiting Ping Evictor\n");
+ CDEBUG(D_HA, "Exiting Ping Evictor\n");
RETURN(0);
}
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);
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 {
}
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);
* 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.
*
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);
* 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.
*
/* -*- 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
* 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.
*
-
/* -*- 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
* 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).
*
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);
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)
* 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.
*/
* 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
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
* 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
*
* 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.
*
*/
struct uuid_nid_data {
struct list_head un_list;
- ptl_nid_t un_nid;
+ lnet_nid_t un_nid;
char *un_uuid;
};
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;
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);
}
spin_unlock (&g_uuid_lock);
- return -1;
+ return -ENOENT;
}
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;
*
* 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
*
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)
*
* 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
* 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
*
*
* 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.
*
*/
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;
}
* 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
*
* 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
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);
*
* 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
{
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;
}
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);
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);
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;
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 */
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);
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)
{
struct lustre_mount_info *lmi;
char *str;
char ns_name[48];
- int rc = 0;
+ int rc;
ENTRY;
if (lcfg->lcfg_bufcount < 3 ||
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;
}
}
filter->fo_sb = 0;
err_ops:
fsfilt_put_ops(obd->obd_fsops);
+ filter_iobuf_pool_done(filter);
return rc;
}
fsfilt_put_ops(obd->obd_fsops);
+ filter_iobuf_pool_done(filter);
+
LCONSOLE_INFO("OST %s has stopped.\n", obd->obd_name);
RETURN(0);
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);
}
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,
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);
}
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;
}
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);
}
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);
}
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);
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)
{
.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 = {
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);
#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 {
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,
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);
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 */
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 */
* 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
{
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) {
}
#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.
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)) {
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;
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)
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);
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
kunmap(lnb->page);
}
}
-
if (lnb->rc == 0)
tot_bytes += lnb->len;
}
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;
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:;
}
* 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,
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)
{
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;
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);
}
* 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_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 {
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;
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)
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) {
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,
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 &&
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)
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;
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;
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
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)) {
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;
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);
}
* 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
* 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
* 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;
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);
}
}
+ disk_update:
/* Update the LVB from the disk inode */
obd = res->lr_namespace->ns_lvbp;
LASSERT(obd);
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));
* 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
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"))
*
* 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
}
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);
*
* 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
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);
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);
* 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
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 {
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;
}
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);
*
* 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
* 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
}
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;
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));
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;
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]))
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);
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;
/* 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)
} 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++;
}
}
{
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);
{
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);
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
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);
/* 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,
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);
}
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);
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,
}
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 */
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. */
* 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;
RETURN(0);
loi_list_maint(cli, loi);
+
spin_unlock(&cli->cl_loi_list_lock);
request = osc_build_req(cli, &rpc_list, page_count, cmd);
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);
lprocfs_oh_tally_log2(&cli->cl_write_offset_hist,
starting_offset/PAGE_SIZE + 1);
}
-#endif
spin_lock(&cli->cl_loi_list_lock);
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) {
}
}
- 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);
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), \
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);
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;
if (rc)
RETURN(rc);
}
+#endif
if (loi == NULL)
loi = &lsm->lsm_oinfo[0];
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);
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;
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;
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;
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;
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);
{
ENTRY;
- if (mode == LCK_GROUP)
+ if (unlikely(mode == LCK_GROUP))
ldlm_lock_decref_and_cancel(lockh, mode);
else
ldlm_lock_decref(lockh, mode);
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)
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:
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);
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);
}
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;
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) {
}
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);
int rc = 0;
ENTRY;
- if (stage < 2)
+ if (stage < 2)
RETURN(0);
rc = obd_llog_finish(obd, 0);
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);
*
* 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
* 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)
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)
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++) {
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;
}
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;
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);
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);
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));
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) {
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);
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++) {
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);
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;
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)
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));
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) {
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);
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);
}
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;
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);
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);
}
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)
# 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);
*
* 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.
*
*/
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);
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);
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;
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;
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);
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);
}
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;
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;
ptlrpc_unregister_reply (req);
if (obd_dump_on_timeout)
- portals_debug_dumplog();
+ libcfs_debug_dumplog();
if (req->rq_bulk != NULL)
ptlrpc_unregister_bulk (req);
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;
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;
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;
}
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() */
*
* 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.
*
*/
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;
*
* 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... */
/*
* 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;
}
/*
* 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;
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;
}
/*
* 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;
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
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;
}
* 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++;
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 */
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;
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
/*
* 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... */
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);
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)
* 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");
/* 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
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);
}
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();
}
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)
* 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
? "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,
}
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);
#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;
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:
}
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);
}
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);
* 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
*
* 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.
*
* 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
*
*
* 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
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);
*
* 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);
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);
{
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;
/* 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);
}
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);
* 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
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))
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);
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);
}
* 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;
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) {
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);
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);
}
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;
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);
/* 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);
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);
}
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);
* 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
*
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);
# 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)
{
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;
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
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;
__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 */
}
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++) {
/* 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)
(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",
(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",
*
* 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;
}
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;
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;
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;
* 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__
*
* 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.
*
*/
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);
*
* 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.
*
*/
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);
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);
* 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.
*
*/
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;
unsigned long flags;
ENTRY;
- kportal_daemonize("ptlrpcd");
+ libcfs_daemonize(pc->pc_name);
SIGNAL_MASK_LOCK(current, flags);
sigfillset(¤t->blocked);
}
#endif
-static int ptlrpcd_start(struct ptlrpcd_ctl *pc)
+static int ptlrpcd_start(char *name, struct ptlrpcd_ctl *pc)
{
int rc = 0;
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)
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;
* 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);
{
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);
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);
atomic_dec(&lcm->lcm_llcd_numfree);
spin_unlock(&lcm->lcm_llcd_lock);
- llcd->llcd_tries = 0;
llcd->llcd_cookiebytes = 0;
return llcd;
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);
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);
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) {
* 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
*
* 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.
*
*/
#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 */
}
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;
}
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;
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. */
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);
spin_unlock (&svc->srv_lock);
}
}
-
+
spin_unlock_irqrestore (&obd->obd_uncommitted_replies_lock, flags);
}
}
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;
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);
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);
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);
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)
{
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) {
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);
* 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;
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) {
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",
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
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);
spin_unlock_irqrestore (&svc->srv_lock, flags);
RETURN(0);
}
-
+
rs = list_entry (svc->srv_reply_queue.next,
struct ptlrpc_reply_state, rs_list);
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! */
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... */
}
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;
* (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--;
}
{
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();
}
ptlrpc_retry_rqbds(void *arg)
{
struct ptlrpc_service *svc = (struct ptlrpc_service *)arg;
-
+
svc->srv_rqbd_timeout = 0;
return (-ETIMEDOUT);
}
/* 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,
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) {
}
}
+ /*
+ * 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 */
}
/* @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);
}
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;
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.
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);
}
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));
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
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);
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;
+}
# 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
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
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
# 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
[ -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
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"
# 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
}
#
### 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
. /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
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
LMC="${LMC:-lmc} -m $config"
TMP=${TMP:-/tmp}
+HOSTNAME=`hostname`
+
MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
MDSSIZE=${MDSSIZE:-400000}
FSTYPE=${FSTYPE:-ext3}
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
# 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
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
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
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}
set_debug_level()
{
- $PDSH $CLIENTS "echo $1 > /proc/sys/portals/debug"
+ $PDSH $CLIENTS "echo $1 > /proc/sys/lnet/debug"
}
debug_client_on()
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}
[ "$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
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
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
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
LMC=${LMC:-../utils/lmc -m $config}
TMP=${TMP:-/tmp}
+HOSTNAME=`hostname`
+
MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
MDSSIZE=50000
FSTYPE=${FSTYPE:-ext3}
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
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
manual_umount_client(){
echo "manual umount lustre on ${MOUNTPATH}...."
- do_facet client "umount $MOUNT"
+ do_facet client "umount $MOUNT"
}
setup() {
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
build_test_filter
+if [ "$ONLY" == "setup" ]; then
+ setup
+ exit
+fi
+
if [ "$ONLY" == "cleanup" ]; then
cleanup
exit
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
stop_mds || return 2
stop_ost || return 3
- lsmod | grep -q portals && return 4
+ lsmod | grep -q lnet && return 4
return 0
}
stop_mds || return 2
stop_ost || return 3
- lsmod | grep -q portals && return 4
+ lsmod | grep -q lnet && return 4
return 0
}
stop_mds || return 3
- lsmod | grep -q portals && return 4
+ lsmod | grep -q lnet && return 4
return 0
}
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
# 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
# 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
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
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
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"
# 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
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 () {
*) 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`}
--- /dev/null
+/* -*- 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;
+}
--- /dev/null
+#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);
+}
#Check FS
echo "Test Lustre stability after OST failure"
- client_df
+ client_df &
+ DFPIDA=$!
+ sleep 5
#MDS Portion
echo "Failing MDS"
reboot_facet mds
client_df &
- DFPID=$!
+ DFPIDB=$!
sleep 5
#Reintegration
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
#Check FS
echo "Test Lustre stability after OST failure"
- client_df
+ client_df &
+ DFPIDA=$!
+ sleep 5
#OST Portion
echo "Failing OST"
#Check FS
echo "Test Lustre stability after OST failure"
- client_df
+ client_df &
+ DFPIDB=$!
+ sleep 5
#Reintegration
echo "Reintegrating OSTs"
clients_recover_osts ost2
sleep $TIMEOUT
+ wait $DFPIDA
+ wait $DFPIDB
client_df || return 2
}
run_test 5 "Fifth Failure Mode: OST/OST `date`"
#Check FS
echo "Test Lustre stability after OST failure"
- client_df
+ client_df &
+ DFPIDA=$!
+ sleep 5
#CLIENT Portion
echo "Failing CLIENTs"
#Check FS
echo "Test Lustre stability after CLIENTs failure"
- client_df
+ client_df &
+ DFPIDB=$!
+ sleep 5
#Reintegration
echo "Reintegrating OST/CLIENTs"
reintegrate_clients
sleep 5
+ wait $DFPIDA
+ wait $DFPIDB
echo "Verifying mount"
client_df || return 3
}
#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
LTREE_KERNEL=${LTREE_KERNEL:-../../lustre}
LTREE_USER=${LTREE_USER:-../../lustre-lib}
+HOSTNAME=`hostname`
# checking
if [ ! -e $LTREE_KERNEL ]; then
{
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
}
# 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
#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"
#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));
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;
}
dir = opendir(argv[1]);
- if (dir == NULL) {
+ if (dir == NULL) {
fprintf(stderr, "%s opendir failed\n", argv[1]);
return errno;
}
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
${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
LMC="${LMC:-lmc} -m $config"
TMP=${TMP:-/tmp}
+HOSTNAME=`hostname`
MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
MDSSIZE=${MDSSIZE:-400000}
FSTYPE=${FSTYPE:-ext3}
[ "$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
LMC="${LMC:-lmc} -m $config"
TMP=${TMP:-/tmp}
+HOSTNAME=`hostname`
MDSDEV=${MDSDEV:-$TMP/mds1-`hostname`}
MDSSIZE=${MDSSIZE:-400000}
FSTYPE=${FSTYPE:-ext3}
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
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
* 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>
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
--- /dev/null
+/*
+ * 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;
+}
set -e
-# bug 2986 5494
-ALWAYS_EXCEPT="20b 24"
+# bug 2986 5494 7288
+ALWAYS_EXCEPT="20b 24 27"
LUSTRE=${LUSTRE:-`dirname $0`/..}
fi
if [ "$ONLY" == "cleanup" ]; then
- sysctl -w portals.debug=0 || true
+ sysctl -w lnet.debug=0 || true
FORCE=--force cleanup
exit
fi
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)"
set -e
+# bug 6088
+ALWAYS_EXCEPT="8"
+
LUSTRE=${LUSTRE:-`dirname $0`/..}
. $LUSTRE/tests/test-framework.sh
}
if [ "$ONLY" == "cleanup" ]; then
- sysctl -w portals.debug=0
+ sysctl -w lnet.debug=0
FORCE=--force cleanup
exit
fi
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
}
if [ "$ONLY" == "cleanup" ]; then
- sysctl -w portals.debug=0
+ sysctl -w lnet.debug=0
FORCE=--force cleanup
exit
fi
. ${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
}
if [ "$ONLY" == "cleanup" ]; then
- sysctl -w portals.debug=0 || true
+ sysctl -w lnet.debug=0 || true
FORCE=--force cleanup
exit
fi
}
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
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
}
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
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
--target_cluster_id $SERVER_CLUSTER
done
---dev $OSTDEV --size $OSTSIZE
# OSTNODE
COUNT=1
for OSTNODE in $OSTNODES; do
#include <errno.h>
#include <ctype.h>
#include <sys/types.h>
+#include <pwd.h>
#include <grp.h>
#include <sys/wait.h>
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;
}
}
- 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);
}
#!/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}
set -vx
LCTL=../utils/lctl
-OSC=OSC_localhost_UUID
+OSC=OSC_`hostname`_UUID
MDC=MDC_client1_UUID
TIMEOUT=5 # complete in finite time
[ $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"
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`
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
+++ /dev/null
-#!/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
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`"
export PATH=$PWD/$SRCDIR:$SRCDIR:$SRCDIR/../utils:$PATH:/sbin
TMP=${TMP:-/tmp}
-FSTYPE=${FSTYPE:-ext3}
CHECKSTAT=${CHECKSTAT:-"checkstat -v"}
CREATETEST=${CREATETEST:-createtest}
MCREATE=${MCREATE:-mcreate}
OPENFILE=${OPENFILE:-openfile}
OPENUNLINK=${OPENUNLINK:-openunlink}
+RANDOM_READS=${RANDOM_READS:-"random-reads"}
TOEXCL=${TOEXCL:-toexcl}
TRUNCATE=${TRUNCATE:-truncate}
MUNLINK=${MUNLINK:-munlink}
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}
}
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`
[ "$SANITYLOG" ] && rm -f $SANITYLOG || true
error() {
+ sysctl -w lustre.fail_loc=0
log "FAIL: $TESTNAME $@"
if [ "$SANITYLOG" ]; then
echo "FAIL: $TESTNAME $@" >> $SANITYLOG
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
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
}
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
}
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
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
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() {
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'
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)"
}
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
log 33_2
}
run_test 33 "write file with mode 444 (should return error) ===="
-
+
test_33a() {
rm -fr $DIR/d33
mkdir -p $DIR/d33
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; }'
}
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 ] || \
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
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
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
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
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
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
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 ========"
# 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
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 ==="
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) ="
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
}
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
test_18() {
./mmap_sanity -d $MOUNT1 -m $MOUNT2
+ sync; sleep 1; sync
}
run_test 18 "mmap sanity check ================================="
#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>
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));
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() {
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() {
##################################
# 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() {
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
#!/usr/bin/expect
spawn lwizard $argv
+HOSTNAME=`hostname`
set timeout 3
expect {
"overwrite existing" {
}
}
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"
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"
rm -f $config
-h2localhost () {
- echo localhost
-}
-
h2tcp () {
case $1 in
client) echo '\*' ;;
}
h2gm () {
- echo `gmnalnid -n$1`
+ echo `gmlndnid -n$1`
}
h2iib () {
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)
{
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);
}
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;
}
}
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);
}
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;
+ }
}
}
mkfs_lustre
mount_lustre
llog_reader
+llmount
+l_getgroups
+mount.lustre
wiretest
.*.cmd
.*.d
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
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
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)
#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;
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++) {
break;
}
endgrent();
+ qsort(param->mgd_groups, param->mgd_ngroups,
+ sizeof(param->mgd_groups[0]), compare_u32);
return size;
}
* 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(¶m);
+ 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;
}
#
# 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
# 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 = ""
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:
return rc, out
def unconfigure_network(self):
- """get portals to unreference itself"""
+ """get lnet to unreference itself"""
cmds = """
network unconfigure"""
self.run(cmds)
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:
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):
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 = """
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
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);
# 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:
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:
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"
# 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)
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)
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):
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
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):
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:
# 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
# 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,
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 " +
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,
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,
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'
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:
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
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):
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)
if fs_is_mounted(self.path):
log(self.path, "already mounted.")
return
- run_acceptors()
if self.mgmtcli:
self.mgmtcli.prepare()
self.vosc.prepare()
" 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
ret=0;
if type in ('network',):
ret = 5
- elif type in ('routetbl',):
- ret = 6
elif type in ('ldlm',):
ret = 20
elif type in ('mgmt',):
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()
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':
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)
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:
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:
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
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:
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
try:
val = eval(ptldebug, ptldebug_names)
val = "0x%x" % (val)
- sysctl('portals/debug', val)
+ sysctl('lnet/debug', val)
except NameError, e:
panic(str(e))
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))
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')
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, ',')
('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",
('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),
else:
if len(host) > 0:
node_list.append(host)
- node_list.append('localhost')
+# node_list.append('localhost')
debug("configuring for host: ", node_list)
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()
#include <stdlib.h>
#include <stdio.h>
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
#include "obdctl.h"
#include "parser.h"
#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);
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",
#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, ...)
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)
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);
$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 */
$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($_);}
#include <sys/utsname.h>
#include "obdctl.h"
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
int verbose;
int nomtab;
"\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);
}
{
memset(lmd, 0, sizeof(*lmd));
lmd->lmd_magic = LMD_MAGIC;
- lmd->lmd_nid = PTL_NID_ANY;
+ lmd->lmd_nid = LNET_NID_ANY;
return 0;
}
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;
}
}
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",
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;
}
"""
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.
"""
--timeout num
--upcall path
--lustre_upcall path
+ --group_upcall path
--portals_upcall path
--ptldebug debug_level
--subsystem subsystem_name
--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
--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
--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
('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),
('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"),
# 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, ""),
]
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
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)
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)
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:
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))
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
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)
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
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')
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')
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)
journal_size = ''
inode_size = ''
mkfsoptions = ''
- mountfsoptions = ''
+ mountfsoptions = ''
else:
devname = get_option(options, 'dev') # can be unset for bluearcs
size = get_option(options, 'size')
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')
if options.failover:
ost.setAttribute('failover', "1")
+ if options.failout:
+ ost.setAttribute('failover', "0")
osd = gen.osd(osdname, osd_uuid, fstype, osdtype, devname,
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)
#include "obdctl.h"
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
#include "parser.h"
#include <stdio.h>
}
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;
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);
}
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);
}
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)
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;
#endif
#include <linux/obd_class.h>
-#include <portals/ptlctl.h>
+#include <lnet/lnetctl.h>
#include "parser.h"
#include <stdio.h>
#include <sys/ipc.h>
{"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)"},
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
CHECK_VALUE(OBD_BRW_WRITE);
CHECK_VALUE(OBD_BRW_SYNC);
CHECK_VALUE(OBD_BRW_FROM_GRANT);
+ CHECK_VALUE(OBD_BRW_NOQUOTA);
}
void
CHECK_STRUCT(ldlm_extent);
CHECK_MEMBER(ldlm_extent, start);
CHECK_MEMBER(ldlm_extent, end);
+ CHECK_MEMBER(ldlm_extent, gid);
}
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);
}
CHECK_DEFINE(OBD_OBJECT_EOF);
- CHECK_VALUE(OST_REQ_HAS_OA1);
-
CHECK_VALUE(MDS_GETATTR);
CHECK_VALUE(MDS_GETATTR_NAME);
CHECK_VALUE(MDS_CLOSE);
(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",
(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",