From 4e849a76b033675a02dd4db5ae85205db702e96d Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 13 Apr 2009 09:32:56 +0000 Subject: [PATCH] - update from HEAD --- lustre/ChangeLog | 60 + lustre/autoconf/lustre-version.ac | 2 +- lustre/cmm/cmm_device.c | 2 +- lustre/cmm/cmm_object.c | 30 + lustre/include/Makefile.am | 2 +- lustre/include/dt_object.h | 83 +- lustre/include/lclient.h | 5 +- lustre/include/linux/lustre_fsfilt.h | 2 +- lustre/include/lprocfs_status.h | 25 +- lustre/include/lu_target.h | 80 + lustre/include/lustre/lustre_idl.h | 74 +- lustre/include/lustre/lustre_user.h | 4 - lustre/include/lustre_disk.h | 133 +- lustre/include/lustre_export.h | 59 +- lustre/include/lustre_import.h | 17 +- lustre/include/lustre_lib.h | 5 +- lustre/include/lustre_log.h | 15 +- lustre/include/lustre_mds.h | 5 + lustre/include/lustre_net.h | 9 +- lustre/include/md_object.h | 27 +- lustre/include/obd.h | 81 +- lustre/include/obd_support.h | 8 +- .../kernel-2.6.18-2.6-rhel5-xen-i686-smp.config | 3191 ++++++++++++++++++++ .../kernel-2.6.18-2.6-rhel5-xen-i686.config | 3191 ++++++++++++++++++++ .../kernel-2.6.18-2.6-rhel5-xen-x86_64-smp.config | 3079 +++++++++++++++++++ .../kernel-2.6.18-2.6-rhel5-xen-x86_64.config | 3079 +++++++++++++++++++ .../patches/small-fixes-about-jbd.patch | 13 + lustre/kernel_patches/series/2.6-rhel5.series | 1 + lustre/lclient/lcommon_cl.c | 31 +- lustre/ldlm/ldlm_lib.c | 193 +- lustre/ldlm/ldlm_lockd.c | 21 +- lustre/liblustre/llite_cl.c | 6 +- lustre/liblustre/llite_lib.c | 2 +- lustre/liblustre/super.c | 3 +- lustre/llite/dcache.c | 4 +- lustre/llite/file.c | 11 +- lustre/llite/llite_lib.c | 6 +- lustre/llite/rw.c | 11 + lustre/llite/statahead.c | 13 +- lustre/llite/vvp_io.c | 21 +- lustre/llite/vvp_lock.c | 1 + lustre/llite/vvp_page.c | 49 +- lustre/lov/lov_dev.c | 32 +- lustre/lov/lov_lock.c | 2 +- lustre/lov/lov_obd.c | 25 +- lustre/lov/lov_object.c | 1 + lustre/lov/lov_pack.c | 115 +- lustre/lov/lov_qos.c | 4 + lustre/lov/lov_request.c | 2 + lustre/lov/lovsub_lock.c | 240 +- lustre/lvfs/fsfilt_ext3.c | 7 + lustre/mdc/lproc_mdc.c | 3 +- lustre/mdc/mdc_internal.h | 1 + lustre/mdc/mdc_lib.c | 6 +- lustre/mdc/mdc_locks.c | 12 +- lustre/mdd/mdd_device.c | 17 + lustre/mdd/mdd_lov.c | 5 + lustre/mdd/mdd_object.c | 24 + lustre/mdd/mdd_orphans.c | 2 +- lustre/mds/mds_lov.c | 51 +- lustre/mdt/mdt_capa.c | 10 +- lustre/mdt/mdt_handler.c | 34 +- lustre/mdt/mdt_internal.h | 56 +- lustre/mdt/mdt_open.c | 10 + lustre/mdt/mdt_recovery.c | 215 +- lustre/mdt/mdt_reint.c | 110 +- lustre/mdt/mdt_xattr.c | 9 +- lustre/mgc/lproc_mgc.c | 3 +- lustre/obdclass/cl_internal.h | 49 +- lustre/obdclass/cl_io.c | 4 +- lustre/obdclass/cl_lock.c | 121 +- lustre/obdclass/cl_object.c | 28 +- lustre/obdclass/dt_object.c | 42 +- lustre/obdclass/genops.c | 21 +- lustre/obdclass/llog_obd.c | 4 +- lustre/obdclass/llog_test.c | 13 +- lustre/obdclass/lprocfs_status.c | 357 ++- lustre/obdclass/lu_object.c | 17 +- lustre/obdclass/md_local_object.c | 2 +- lustre/obdclass/obd_config.c | 12 +- lustre/obdclass/obd_mount.c | 2 +- lustre/obdfilter/filter.c | 101 +- lustre/obdfilter/filter_internal.h | 7 +- lustre/obdfilter/filter_io_26.c | 2 +- lustre/osc/lproc_osc.c | 3 +- lustre/osc/osc_lock.c | 40 +- lustre/osc/osc_request.c | 27 +- lustre/osd/osd_handler.c | 209 +- lustre/osd/osd_internal.h | 33 +- lustre/ost/ost_handler.c | 4 + lustre/ptlrpc/Makefile.in | 2 +- lustre/ptlrpc/client.c | 165 +- lustre/ptlrpc/gss/gss_keyring.c | 18 +- lustre/ptlrpc/import.c | 45 +- lustre/ptlrpc/llog_client.c | 17 +- lustre/ptlrpc/lproc_ptlrpc.c | 4 +- lustre/ptlrpc/niobuf.c | 9 +- lustre/ptlrpc/pack_generic.c | 179 +- lustre/ptlrpc/pinger.c | 79 +- lustre/ptlrpc/ptlrpc_internal.h | 4 +- lustre/ptlrpc/ptlrpc_module.c | 3 + lustre/ptlrpc/recov_thread.c | 4 +- lustre/ptlrpc/recover.c | 11 +- lustre/ptlrpc/service.c | 58 +- lustre/ptlrpc/target.c | 372 +++ lustre/ptlrpc/wiretest.c | 6 + lustre/quota/quota_context.c | 1 - lustre/quota/quota_ctl.c | 1 + lustre/quota/quota_interface.c | 1 + lustre/tests/Makefile.am | 4 +- lustre/tests/acceptance-small.sh | 17 +- lustre/tests/cfg/local.sh | 4 + lustre/tests/conf-sanity.sh | 76 +- lustre/tests/functions.sh | 26 + lustre/tests/large-scale.sh | 117 + lustre/tests/lockorder.sh | 4 +- lustre/tests/mdsrate-create-large.sh | 6 + lustre/tests/mdsrate-create-small.sh | 7 +- lustre/tests/mdsrate-lookup-1dir.sh | 12 +- lustre/tests/mdsrate-stat-large.sh | 12 +- lustre/tests/mdsrate-stat-small.sh | 12 +- lustre/tests/mdsrate.c | 12 +- lustre/tests/recovery-mds-scale.sh | 2 +- lustre/tests/recovery-small.sh | 25 - lustre/tests/replay-single.sh | 81 +- lustre/tests/replay-vbr.sh | 678 +++++ lustre/tests/run_dbench.sh | 18 +- lustre/tests/run_dd.sh | 16 +- lustre/tests/run_iozone.sh | 27 +- lustre/tests/run_tar.sh | 16 +- lustre/tests/runtests | 83 +- lustre/tests/sanity-quota.sh | 135 +- lustre/tests/sanity.sh | 120 +- lustre/tests/sanityN.sh | 77 +- lustre/tests/test-framework.sh | 260 +- lustre/tests/write_append_truncate.1 | 109 + lustre/tests/write_append_truncate.c | 512 +++- lustre/utils/Makefile.am | 4 +- lustre/utils/lshowmount.c | 225 ++ lustre/utils/mkfs_lustre.c | 2 +- lustre/utils/nidlist.c | 334 ++ lustre/utils/nidlist.h | 56 + lustre/utils/wirecheck.c | 3 + lustre/utils/wiretest.c | 6 + 144 files changed, 18083 insertions(+), 1742 deletions(-) create mode 100644 lustre/include/lu_target.h create mode 100644 lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-i686-smp.config create mode 100644 lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-i686.config create mode 100644 lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-x86_64-smp.config create mode 100644 lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-x86_64.config create mode 100644 lustre/kernel_patches/patches/small-fixes-about-jbd.patch create mode 100644 lustre/ptlrpc/target.c create mode 100644 lustre/tests/functions.sh create mode 100644 lustre/tests/large-scale.sh create mode 100644 lustre/tests/replay-vbr.sh create mode 100644 lustre/tests/write_append_truncate.1 create mode 100644 lustre/utils/lshowmount.c create mode 100644 lustre/utils/nidlist.c create mode 100644 lustre/utils/nidlist.h diff --git a/lustre/ChangeLog b/lustre/ChangeLog index 768f607..7efa3c2 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -55,6 +55,66 @@ Details : recover_import_no_retry or invalidate_import and import_close can to sleep queue. Severity : normal +Frequency : rare, on llog test 6 +Bugzilla : 16839 +Descriptoin: don't allow connect to already connected import +Details : allowing connect to already connected import is hide connecting problem. + +Severity : normal +Frequency : rare +Bugzilla : 18902 +Descriptoin: allow kill process which wait statahead result +Details : for some reasons 'ls' can stick in waiting result from statahead, + in this case need way for kill this process. + +Severity : enhancement +Bugzilla : 18798 +Description: Add state history info file, enhance import info file +Details : Track import connection state changes in a new osc/mdc proc file; + add overview-type data to the osc/mdc import proc file. + +Severity : enhancement +Bugzilla : 17536 +Description: MDS create should not wait for statfs RPC while holding DLM lock. + +Severity : enhancement +Bugzilla : 18289 +Description: Update to RHEL5U3 kernel-2.6.18-128.1.1.el5. + +Severity : normal +Frequency : normal +Bugzilla : 12069 +Descriptoin: OST grant too much space to client even there are not enough space. +Details : Client will shrink its grant cache to OST if there are no write + activity over 6 mins (GRANT_SHRINK_INTERVAL), and OST will retrieve + this grant cache if there are already not enough avaible space + (left_space < total_clients * 32M). + +Severity : normal +Frequency : start MDS on uncleanly shutdowned MDS device +Bugzilla : 16839 +Descriptoin: ll_sync thread stay in waiting mds<>ost recovery finished +Details : stay in waiting mds<>ost recovery finished produce random bugs + due race between two ll_sync thread for one lov target. send + ACTIVATE event only if connect realy finished and import have + FULL state. + +Severity : normal +Frequency : rare, connect and disconnect target at same time +Bugzilla : 17310 +Descriptoin: ASSERTION(atomic_read(&imp->imp_inflight) == 0 +Details : don't call obd_disconnect under lov_lock. this long time + operation and can block ptlrpcd which answer to connect request. + +Severity : normal +Frequency : rare +Bugzilla : 18154 +Descriptoin: don't lose wakeup for imp_recovery_waitq +Details : recover_import_no_retry or invalidate_import and import_close can + both sleep on imp_recovery_waitq, but we was send only one wakeup + to sleep queue. + +Severity : normal Frequency : always with long access acl Bugzilla : 17636 Descriptoin: mds can't pack reply with long acl. diff --git a/lustre/autoconf/lustre-version.ac b/lustre/autoconf/lustre-version.ac index 4da8136..a7de56c 100644 --- a/lustre/autoconf/lustre-version.ac +++ b/lustre/autoconf/lustre-version.ac @@ -1,6 +1,6 @@ m4_define([LUSTRE_MAJOR],[1]) m4_define([LUSTRE_MINOR],[9]) -m4_define([LUSTRE_PATCH],[162]) +m4_define([LUSTRE_PATCH],[167]) m4_define([LUSTRE_FIX],[0]) dnl # don't forget to update the service tags info diff --git a/lustre/cmm/cmm_device.c b/lustre/cmm/cmm_device.c index 8245d2f..82c89dc 100644 --- a/lustre/cmm/cmm_device.c +++ b/lustre/cmm/cmm_device.c @@ -57,7 +57,7 @@ # include #endif -static struct obd_ops cmm_obd_device_ops = { +struct obd_ops cmm_obd_device_ops = { .o_owner = THIS_MODULE }; diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c index fa52599..fb3095c 100644 --- a/lustre/cmm/cmm_object.c +++ b/lustre/cmm/cmm_object.c @@ -362,6 +362,18 @@ static int cml_object_sync(const struct lu_env *env, struct md_object *mo) RETURN(rc); } +static dt_obj_version_t cml_version_get(const struct lu_env *env, + struct md_object *mo) +{ + return mo_version_get(env, md_object_next(mo)); +} + +static void cml_version_set(const struct lu_env *env, struct md_object *mo, + dt_obj_version_t version) +{ + return mo_version_set(env, md_object_next(mo), version); +} + static const struct md_object_operations cml_mo_ops = { .moo_permission = cml_permission, .moo_attr_get = cml_attr_get, @@ -379,6 +391,8 @@ static const struct md_object_operations cml_mo_ops = { .moo_readlink = cml_readlink, .moo_capa_get = cml_capa_get, .moo_object_sync = cml_object_sync, + .moo_version_get = cml_version_get, + .moo_version_set = cml_version_set, .moo_path = cml_path, }; @@ -953,6 +967,20 @@ static int cmr_object_sync(const struct lu_env *env, struct md_object *mo) return -EFAULT; } +static dt_obj_version_t cmr_version_get(const struct lu_env *env, + struct md_object *mo) +{ + /* Don't check remote object version */ + return 0; +} + +static void cmr_version_set(const struct lu_env *env, struct md_object *mo, + dt_obj_version_t version) +{ + /* No need to update remote object version here, it is done as a part + * of reintegration of partial operation on the remote server */ +} + static const struct md_object_operations cmr_mo_ops = { .moo_permission = cmr_permission, .moo_attr_get = cmr_attr_get, @@ -970,6 +998,8 @@ static const struct md_object_operations cmr_mo_ops = { .moo_readlink = cmr_readlink, .moo_capa_get = cmr_capa_get, .moo_object_sync = cmr_object_sync, + .moo_version_get = cmr_version_get, + .moo_version_set = cmr_version_set, .moo_path = cmr_path, }; diff --git a/lustre/include/Makefile.am b/lustre/include/Makefile.am index d18e1a9..7496e1d 100644 --- a/lustre/include/Makefile.am +++ b/lustre/include/Makefile.am @@ -46,4 +46,4 @@ EXTRA_DIST = ioctl.h liblustre.h lprocfs_status.h lustre_cfg.h \ md_object.h dt_object.h lustre_param.h lustre_mdt.h \ lustre_fid.h lustre_fld.h lustre_req_layout.h lustre_capa.h \ lustre_idmap.h lustre_eacl.h interval_tree.h obd_cksum.h \ - lu_ref.h cl_object.h lustre_acl.h lclient.h + lu_ref.h cl_object.h lustre_acl.h lclient.h lu_target.h diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h index be76a93..0bbd792 100644 --- a/lustre/include/dt_object.h +++ b/lustre/include/dt_object.h @@ -236,6 +236,9 @@ struct dt_object_format { enum dt_format_type dt_mode_to_dft(__u32 mode); +/** Version type. May differ in DMU and ldiskfs */ +typedef __u64 dt_obj_version_t; + /** * Per-dt-object operations. */ @@ -394,6 +397,10 @@ struct dt_object_operations { struct lustre_capa *old, __u64 opc); int (*do_object_sync)(const struct lu_env *, struct dt_object *); + dt_obj_version_t (*do_version_get)(const struct lu_env *env, + struct dt_object *dt); + void (*do_version_set)(const struct lu_env *env, struct dt_object *dt, + dt_obj_version_t new_version); /** * Get object info of next level. Currently, only get inode from osd. * This is only used by quota b=16542 @@ -636,6 +643,7 @@ struct dt_txn_callback { int (*dtc_txn_commit)(const struct lu_env *env, struct thandle *txn, void *cookie); void *dtc_cookie; + __u32 dtc_tag; struct list_head dtc_linkage; }; @@ -673,26 +681,50 @@ struct dt_object *dt_locate(const struct lu_env *env, struct dt_device *dev, const struct lu_fid *fid); -/** @} dt */ - +static inline dt_obj_version_t do_version_get(const struct lu_env *env, + struct dt_object *o) +{ + LASSERT(o->do_ops->do_version_get); + return o->do_ops->do_version_get(env, o); +} -static inline int dt_record_read(const struct lu_env *env, - struct dt_object *dt, struct lu_buf *buf, - loff_t *pos, void *arg) +static inline void do_version_set(const struct lu_env *env, + struct dt_object *o, dt_obj_version_t v) { - int rc; + LASSERT(o->do_ops->do_version_set); + return o->do_ops->do_version_set(env, o, v); +} - LASSERTF(dt != NULL, "dt is NULL when we want to read record\n"); +int dt_record_read(const struct lu_env *env, struct dt_object *dt, + struct lu_buf *buf, loff_t *pos); +int dt_record_write(const struct lu_env *env, struct dt_object *dt, + const struct lu_buf *buf, loff_t *pos, struct thandle *th); - rc = dt->do_body_ops->dbo_read(env, dt, buf, pos, arg); - if (rc == buf->lb_len) - rc = 0; - else if (rc >= 0) - rc = -EFAULT; - return rc; +static inline struct thandle *dt_trans_create(const struct lu_env *env, + struct dt_device *d) +{ + LASSERT(d->dd_ops->dt_trans_create); + return d->dd_ops->dt_trans_create(env, d); +} +static inline int dt_trans_start(const struct lu_env *env, + struct dt_device *d, + struct thandle *th) +{ + LASSERT(d->dd_ops->dt_trans_start); + return d->dd_ops->dt_trans_start(env, d, th); } +static inline void dt_trans_stop(const struct lu_env *env, + struct dt_device *d, + struct thandle *th) +{ + LASSERT(d->dd_ops->dt_trans_stop); + return d->dd_ops->dt_trans_stop(env, th); +} +/** @} dt */ + + static inline int dt_declare_record_write(const struct lu_env *env, struct dt_object *dt, int size, loff_t pos, @@ -706,25 +738,6 @@ static inline int dt_declare_record_write(const struct lu_env *env, return rc; } -static inline int dt_record_write(const struct lu_env *env, - struct dt_object *dt, - const struct lu_buf *buf, loff_t *pos, - struct thandle *th, - struct lustre_capa *capa, - int ignore_quota) -{ - int rc; - - LASSERTF(dt != NULL, "dt is NULL when we want to write record\n"); - LASSERT(th != NULL); - rc = dt->do_body_ops->dbo_write(env, dt, buf, pos, th, capa, ignore_quota); - if (rc == buf->lb_len) - rc = 0; - else if (rc >= 0) - rc = -EFAULT; - return rc; -} - static inline int dt_declare_create(const struct lu_env *env, struct dt_object *dt, struct lu_attr *attr, @@ -857,12 +870,6 @@ static inline int dt_statfs(const struct lu_env *env, struct dt_device *dev, return dev->dd_ops->dt_statfs(env, dev, sfs); } -static inline struct thandle * dt_trans_create(const struct lu_env *env, - struct dt_device *dev) -{ - return dev->dd_ops->dt_trans_create(env, dev); -} - static inline int dt_root_get(const struct lu_env *env, struct dt_device *dev, struct lu_fid *f) { diff --git a/lustre/include/lclient.h b/lustre/include/lclient.h index 974a03f..c0c6cd0 100644 --- a/lustre/include/lclient.h +++ b/lustre/include/lclient.h @@ -305,6 +305,8 @@ void ccc_transient_page_discard(const struct lu_env *env, int ccc_transient_page_prep(const struct lu_env *env, const struct cl_page_slice *slice, struct cl_io *io); +void ccc_lock_delete(const struct lu_env *env, + const struct cl_lock_slice *slice); void ccc_lock_fini(const struct lu_env *env,struct cl_lock_slice *slice); int ccc_lock_enqueue(const struct lu_env *env,const struct cl_lock_slice *slice, struct cl_io *io, __u32 enqflags); @@ -327,7 +329,8 @@ int ccc_io_one_lock(const struct lu_env *env, struct cl_io *io, loff_t start, loff_t end); void ccc_io_end(const struct lu_env *env, const struct cl_io_slice *ios); int ccc_prep_size(const struct lu_env *env, struct cl_object *obj, - struct cl_io *io, loff_t pos, int vfslock); + struct cl_io *io, loff_t start, size_t count, int vfslock, + int *exceed); void ccc_req_completion(const struct lu_env *env, const struct cl_req_slice *slice, int ioret); void ccc_req_attr_set(const struct lu_env *env,const struct cl_req_slice *slice, diff --git a/lustre/include/linux/lustre_fsfilt.h b/lustre/include/linux/lustre_fsfilt.h index 484d267..b9e01e6 100644 --- a/lustre/include/linux/lustre_fsfilt.h +++ b/lustre/include/linux/lustre_fsfilt.h @@ -495,7 +495,7 @@ static inline __u64 fsfilt_set_version(struct obd_device *obd, static inline __u64 fsfilt_get_version(struct obd_device *obd, struct inode *inode) { - if (obd->obd_fsops->fs_set_version) + if (obd->obd_fsops->fs_get_version) return obd->obd_fsops->fs_get_version(inode); return -EOPNOTSUPP; } diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index e7e3e8b..ea1abe2 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -497,6 +497,8 @@ extern int lprocfs_rd_conn_uuid(char *page, char **start, off_t off, int count, int *eof, void *data); extern int lprocfs_rd_import(char *page, char **start, off_t off, int count, int *eof, void *data); +extern int lprocfs_rd_state(char *page, char **start, off_t off, int count, + int *eof, void *data); extern int lprocfs_rd_connect_flags(char *page, char **start, off_t off, int count, int *eof, void *data); extern int lprocfs_rd_num_exports(char *page, char **start, off_t off, @@ -546,11 +548,9 @@ void lprocfs_oh_tally_log2(struct obd_histogram *oh, unsigned int value); void lprocfs_oh_clear(struct obd_histogram *oh); unsigned long lprocfs_oh_sum(struct obd_histogram *oh); -/* lprocfs_status.c: counter read/write functions */ -extern int lprocfs_counter_read(char *page, char **start, off_t off, - int count, int *eof, void *data); -extern int lprocfs_counter_write(struct file *file, const char *buffer, - unsigned long count, void *data); +void lprocfs_stats_collect(struct lprocfs_stats *stats, int idx, + struct lprocfs_counter *cnt); + /* lprocfs_status.c: recovery status */ int lprocfs_obd_rd_recovery_status(char *page, char **start, off_t off, @@ -810,8 +810,12 @@ static inline int lprocfs_rd_server_uuid(char *page, char **start, off_t off, static inline int lprocfs_rd_conn_uuid(char *page, char **start, off_t off, int count, int *eof, void *data) { return 0; } -static inline int lprocfs_rd_import(char *page, char **start, off_t off, int count, - int *eof, void *data) { return 0; } +static inline int lprocfs_rd_import(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ return 0; } +static inline int lprocfs_rd_state(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ return 0; } static inline int lprocfs_rd_connect_flags(char *page, char **start, off_t off, int count, int *eof, void *data) { return 0; } @@ -870,11 +874,8 @@ void lprocfs_oh_clear(struct obd_histogram *oh) {} static inline unsigned long lprocfs_oh_sum(struct obd_histogram *oh) { return 0; } static inline -int lprocfs_counter_read(char *page, char **start, off_t off, - int count, int *eof, void *data) { return 0; } -static inline -int lprocfs_counter_write(struct file *file, const char *buffer, - unsigned long count, void *data) { return 0; } +void lprocfs_stats_collect(struct lprocfs_stats *stats, int idx, + struct lprocfs_counter *cnt) {} static inline __u64 lprocfs_stats_collector(struct lprocfs_stats *stats, int idx, diff --git a/lustre/include/lu_target.h b/lustre/include/lu_target.h new file mode 100644 index 0000000..aae74e9 --- /dev/null +++ b/lustre/include/lu_target.h @@ -0,0 +1,80 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + */ + +#ifndef _LUSTRE_LU_TARGET_H +#define _LUSTRE_LU_TARGET_H + +#include +#include + +struct lu_target { + struct obd_device *lut_obd; + struct dt_device *lut_bottom; + /** last_rcvd file */ + struct dt_object *lut_last_rcvd; + /* transaction callbacks */ + struct dt_txn_callback lut_txn_cb; + /** server data in last_rcvd file */ + struct lr_server_data lut_lsd; + /** Server last transaction number */ + __u64 lut_last_transno; + /** Lock protecting last transaction number */ + spinlock_t lut_translock; + /** Lock protecting client bitmap */ + spinlock_t lut_client_bitmap_lock; + /** Bitmap of known clients */ + unsigned long lut_client_bitmap[LR_CLIENT_BITMAP_SIZE]; + /** Number of mounts */ + __u64 lut_mount_count; + __u32 lut_stale_export_age; + spinlock_t lut_trans_table_lock; +}; + +typedef void (*lut_cb_t)(struct lu_target *lut, __u64 transno, + void *data, int err); +struct lut_commit_cb { + lut_cb_t lut_cb_func; + void *lut_cb_data; +}; + +void lut_boot_epoch_update(struct lu_target *); +void lut_cb_last_committed(struct lu_target *, __u64, void *, int); +void lut_cb_client(struct lu_target *, __u64, void *, int); +int lut_init(const struct lu_env *, struct lu_target *, + struct obd_device *, struct dt_device *); +void lut_fini(const struct lu_env *, struct lu_target *); + +#endif /* __LUSTRE_LU_TARGET_H */ diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 74623ae..da3e30b 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -732,41 +732,41 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); #define MSG_CONNECT_TRANSNO 0x00000100 /* report transno */ /* Connect flags */ -#define OBD_CONNECT_RDONLY 0x1ULL /*client allowed read-only access*/ -#define OBD_CONNECT_INDEX 0x2ULL /*connect to specific LOV idx */ -#define OBD_CONNECT_MDS 0x4ULL /*connect from MDT to OST */ -#define OBD_CONNECT_GRANT 0x8ULL /*OSC acquires grant at connect */ -#define OBD_CONNECT_SRVLOCK 0x10ULL /*server takes locks for client */ -#define OBD_CONNECT_VERSION 0x20ULL /*Lustre versions in ocd */ -#define OBD_CONNECT_REQPORTAL 0x40ULL /*Separate non-IO request portal */ -#define OBD_CONNECT_ACL 0x80ULL /*access control lists */ -#define OBD_CONNECT_XATTR 0x100ULL /*client use extended attributes */ -#define OBD_CONNECT_CROW 0x200ULL /*MDS+OST create objects on write*/ -#define OBD_CONNECT_TRUNCLOCK 0x400ULL /*locks on server for punch */ -#define OBD_CONNECT_TRANSNO 0x800ULL /*replay sends initial transno */ -#define OBD_CONNECT_IBITS 0x1000ULL /*support for inodebits locks */ -#define OBD_CONNECT_JOIN 0x2000ULL /*files can be concatenated */ -#define OBD_CONNECT_ATTRFID 0x4000ULL /*Server supports GetAttr By Fid */ -#define OBD_CONNECT_NODEVOH 0x8000ULL /*No open handle on special nodes*/ -#define OBD_CONNECT_RMT_CLIENT 0x00010000ULL /*Remote client */ -#define OBD_CONNECT_RMT_CLIENT_FORCE 0x00020000ULL /*Remote client by force */ -#define OBD_CONNECT_BRW_SIZE 0x40000ULL /*Max bytes per rpc */ -#define OBD_CONNECT_QUOTA64 0x80000ULL /*64bit qunit_data.qd_count */ -#define OBD_CONNECT_MDS_CAPA 0x100000ULL /*MDS capability */ -#define OBD_CONNECT_OSS_CAPA 0x200000ULL /*OSS capability */ -#define OBD_CONNECT_CANCELSET 0x400000ULL /*Early batched cancels. */ -#define OBD_CONNECT_SOM 0x00800000ULL /*Size on MDS */ -#define OBD_CONNECT_AT 0x01000000ULL /*client uses adaptive timeouts */ -#define OBD_CONNECT_LRU_RESIZE 0x02000000ULL /*LRU resize feature. */ -#define OBD_CONNECT_MDS_MDS 0x04000000ULL /*MDS-MDS connection */ -#define OBD_CONNECT_REAL 0x08000000ULL /*real connection */ -#define OBD_CONNECT_CHANGE_QS 0x10000000ULL /*shrink/enlarge qunit b=10600 */ -#define OBD_CONNECT_CKSUM 0x20000000ULL /*support several cksum algos */ -#define OBD_CONNECT_FID 0x40000000ULL /*FID is supported by server */ -#define OBD_CONNECT_VBR 0x80000000ULL /*version based recovery */ -#define OBD_CONNECT_LOV_V3 0x100000000ULL /*client supports LOV v3 EA */ +#define OBD_CONNECT_RDONLY 0x1ULL /*client allowed read-only access*/ +#define OBD_CONNECT_INDEX 0x2ULL /*connect to specific LOV idx */ +#define OBD_CONNECT_MDS 0x4ULL /*connect from MDT to OST */ +#define OBD_CONNECT_GRANT 0x8ULL /*OSC acquires grant at connect */ +#define OBD_CONNECT_SRVLOCK 0x10ULL /*server takes locks for client */ +#define OBD_CONNECT_VERSION 0x20ULL /*Lustre versions in ocd */ +#define OBD_CONNECT_REQPORTAL 0x40ULL /*Separate non-IO request portal */ +#define OBD_CONNECT_ACL 0x80ULL /*access control lists */ +#define OBD_CONNECT_XATTR 0x100ULL /*client use extended attributes */ +#define OBD_CONNECT_CROW 0x200ULL /*MDS+OST create objects on write*/ +#define OBD_CONNECT_TRUNCLOCK 0x400ULL /*locks on server for punch */ +#define OBD_CONNECT_TRANSNO 0x800ULL /*replay sends initial transno */ +#define OBD_CONNECT_IBITS 0x1000ULL /*support for inodebits locks */ +#define OBD_CONNECT_JOIN 0x2000ULL /*files can be concatenated */ +#define OBD_CONNECT_ATTRFID 0x4000ULL /*Server supports GetAttr By Fid */ +#define OBD_CONNECT_NODEVOH 0x8000ULL /*No open handle on special nodes*/ +#define OBD_CONNECT_RMT_CLIENT 0x10000ULL /*Remote client */ +#define OBD_CONNECT_RMT_CLIENT_FORCE 0x20000ULL /*Remote client by force */ +#define OBD_CONNECT_BRW_SIZE 0x40000ULL /*Max bytes per rpc */ +#define OBD_CONNECT_QUOTA64 0x80000ULL /*64bit qunit_data.qd_count */ +#define OBD_CONNECT_MDS_CAPA 0x100000ULL /*MDS capability */ +#define OBD_CONNECT_OSS_CAPA 0x200000ULL /*OSS capability */ +#define OBD_CONNECT_CANCELSET 0x400000ULL /*Early batched cancels. */ +#define OBD_CONNECT_SOM 0x800000ULL /*Size on MDS */ +#define OBD_CONNECT_AT 0x1000000ULL /*client uses adaptive timeouts */ +#define OBD_CONNECT_LRU_RESIZE 0x2000000ULL /*LRU resize feature. */ +#define OBD_CONNECT_MDS_MDS 0x4000000ULL /*MDS-MDS connection */ +#define OBD_CONNECT_REAL 0x8000000ULL /*real connection */ +#define OBD_CONNECT_CHANGE_QS 0x10000000ULL /*shrink/enlarge qunit b=10600 */ +#define OBD_CONNECT_CKSUM 0x20000000ULL /*support several cksum algos */ +#define OBD_CONNECT_FID 0x40000000ULL /*FID is supported by server */ +#define OBD_CONNECT_VBR 0x80000000ULL /*version based recovery */ +#define OBD_CONNECT_LOV_V3 0x100000000ULL /*client supports LOV v3 EA */ #define OBD_CONNECT_GRANT_SHRINK 0x200000000ULL /* support grant shrink */ -#define OBD_CONNECT_SKIP_ORPHAN 0x400000000ULL /* don't reuse orphan objids */ +#define OBD_CONNECT_SKIP_ORPHAN 0x400000000ULL /* don't reuse orphan objids */ /* also update obd_connect_names[] for lprocfs_rd_connect_flags() * and lustre/utils/wirecheck.c */ @@ -785,7 +785,7 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); OBD_CONNECT_RMT_CLIENT_FORCE | \ OBD_CONNECT_MDS_CAPA | OBD_CONNECT_OSS_CAPA | \ OBD_CONNECT_MDS_MDS | OBD_CONNECT_FID | \ - LRU_RESIZE_CONNECT_FLAG | \ + LRU_RESIZE_CONNECT_FLAG | OBD_CONNECT_VBR | \ OBD_CONNECT_LOV_V3) #define OST_CONNECT_SUPPORTED (OBD_CONNECT_SRVLOCK | OBD_CONNECT_GRANT | \ OBD_CONNECT_REQPORTAL | OBD_CONNECT_VERSION | \ @@ -795,9 +795,9 @@ extern void lustre_swab_ptlrpc_body(struct ptlrpc_body *pb); LRU_RESIZE_CONNECT_FLAG | OBD_CONNECT_CKSUM | \ OBD_CONNECT_CHANGE_QS | \ OBD_CONNECT_OSS_CAPA | OBD_CONNECT_RMT_CLIENT | \ - OBD_CONNECT_RMT_CLIENT_FORCE | \ + OBD_CONNECT_RMT_CLIENT_FORCE | OBD_CONNECT_VBR | \ OBD_CONNECT_MDS | OBD_CONNECT_SKIP_ORPHAN | \ - OBD_CONNECT_GRANT_SHRINK) + OBD_CONNECT_GRANT_SHRINK) #define ECHO_CONNECT_SUPPORTED (0) #define MGS_CONNECT_SUPPORTED (OBD_CONNECT_VERSION | OBD_CONNECT_AT) diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index b9bbdf0..e0c064c 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -119,11 +119,7 @@ struct obd_statfs; #define LL_IOC_OBD_STATFS IOC_OBD_STATFS #define IOC_MDC_GETSTRIPE IOC_MDC_GETFILESTRIPE -/* Do not define O_CHECK_STALE as 0200000000, - * which is conflict with MDS_OPEN_OWNEROVERRIDE */ -#define O_CHECK_STALE 020000000 /* hopefully this does not conflict */ #define O_LOV_DELAY_CREATE 0100000000 /* hopefully this does not conflict */ -#define O_JOIN_FILE 0400000000 /* hopefully this does not conflict */ #define LL_FILE_IGNORE_LOCK 0x00000001 #define LL_FILE_GROUP_LOCKED 0x00000002 diff --git a/lustre/include/lustre_disk.h b/lustre/include/lustre_disk.h index 7439dbb..3155558 100644 --- a/lustre/include/lustre_disk.h +++ b/lustre/include/lustre_disk.h @@ -203,6 +203,11 @@ struct lustre_mount_data { /****************** last_rcvd file *********************/ +/** version recovery epoch */ +#define LR_EPOCH_BITS 32 +#define lr_epoch(a) ((a) >> LR_EPOCH_BITS) +#define LR_EXPIRE_INTERVALS 16 /**< number of intervals to track transno */ + #define LR_SERVER_SIZE 512 #define LR_CLIENT_START 8192 #define LR_CLIENT_SIZE 128 @@ -222,6 +227,8 @@ struct lustre_mount_data { #define LR_MAX_CLIENTS (CFS_PAGE_SIZE * 8) #endif +#define LR_CLIENT_BITMAP_SIZE ((LR_MAX_CLIENTS >> 3) / sizeof(long)) + /** COMPAT_146: this is an OST (temporary) */ #define OBD_COMPAT_OST 0x00000002 /** COMPAT_146: this is an MDT (temporary) */ @@ -265,7 +272,13 @@ struct lr_server_data { __u8 lsd_peeruuid[40]; /* UUID of MDS associated with this OST */ __u32 lsd_ost_index; /* index number of OST in LOV */ __u32 lsd_mdt_index; /* index number of MDT in LMV */ - __u8 lsd_padding[LR_SERVER_SIZE - 148]; + __u32 lsd_start_epoch; /* VBR: start epoch from last boot */ + /** transaction values since lsd_trans_table_time */ + __u64 lsd_trans_table[LR_EXPIRE_INTERVALS]; + /** start point of transno table below */ + __u32 lsd_trans_table_time; /* time of first slot in table above */ + __u32 lsd_expire_intervals; /* LR_EXPIRE_INTERVALS */ + __u8 lsd_padding[LR_SERVER_SIZE - 288]; }; /* Data stored per client in the last_rcvd file. In le32 order. */ @@ -280,9 +293,120 @@ struct lsd_client_data { __u64 lcd_last_close_xid; /* xid for the last transaction */ __u32 lcd_last_close_result; /* result from last RPC */ __u32 lcd_last_close_data; /* per-op data */ - __u8 lcd_padding[LR_CLIENT_SIZE - 88]; + /* VBR: last versions */ + __u64 lcd_pre_versions[4]; + __u32 lcd_last_epoch; + /** orphans handling for delayed export rely on that */ + __u32 lcd_first_epoch; + __u8 lcd_padding[LR_CLIENT_SIZE - 128]; }; +/* last_rcvd handling */ +static inline void lsd_le_to_cpu(struct lr_server_data *buf, + struct lr_server_data *lsd) +{ + int i; + memcpy(lsd->lsd_uuid, buf->lsd_uuid, sizeof (lsd->lsd_uuid)); + lsd->lsd_last_transno = le64_to_cpu(buf->lsd_last_transno); + lsd->lsd_compat14 = le64_to_cpu(buf->lsd_compat14); + lsd->lsd_mount_count = le64_to_cpu(buf->lsd_mount_count); + lsd->lsd_feature_compat = le32_to_cpu(buf->lsd_feature_compat); + lsd->lsd_feature_rocompat = le32_to_cpu(buf->lsd_feature_rocompat); + lsd->lsd_feature_incompat = le32_to_cpu(buf->lsd_feature_incompat); + lsd->lsd_server_size = le32_to_cpu(buf->lsd_server_size); + lsd->lsd_client_start = le32_to_cpu(buf->lsd_client_start); + lsd->lsd_client_size = le16_to_cpu(buf->lsd_client_size); + lsd->lsd_subdir_count = le16_to_cpu(buf->lsd_subdir_count); + lsd->lsd_catalog_oid = le64_to_cpu(buf->lsd_catalog_oid); + lsd->lsd_catalog_ogen = le32_to_cpu(buf->lsd_catalog_ogen); + memcpy(lsd->lsd_peeruuid, buf->lsd_peeruuid, sizeof(lsd->lsd_peeruuid)); + lsd->lsd_ost_index = le32_to_cpu(buf->lsd_ost_index); + lsd->lsd_mdt_index = le32_to_cpu(buf->lsd_mdt_index); + lsd->lsd_start_epoch = le32_to_cpu(buf->lsd_start_epoch); + for (i = 0; i < LR_EXPIRE_INTERVALS; i++) + lsd->lsd_trans_table[i] = le64_to_cpu(buf->lsd_trans_table[i]); + lsd->lsd_trans_table_time = le32_to_cpu(buf->lsd_trans_table_time); + lsd->lsd_expire_intervals = le32_to_cpu(buf->lsd_expire_intervals); +} + +static inline void lsd_cpu_to_le(struct lr_server_data *lsd, + struct lr_server_data *buf) +{ + int i; + memcpy(buf->lsd_uuid, lsd->lsd_uuid, sizeof (buf->lsd_uuid)); + buf->lsd_last_transno = cpu_to_le64(lsd->lsd_last_transno); + buf->lsd_compat14 = cpu_to_le64(lsd->lsd_compat14); + buf->lsd_mount_count = cpu_to_le64(lsd->lsd_mount_count); + buf->lsd_feature_compat = cpu_to_le32(lsd->lsd_feature_compat); + buf->lsd_feature_rocompat = cpu_to_le32(lsd->lsd_feature_rocompat); + buf->lsd_feature_incompat = cpu_to_le32(lsd->lsd_feature_incompat); + buf->lsd_server_size = cpu_to_le32(lsd->lsd_server_size); + buf->lsd_client_start = cpu_to_le32(lsd->lsd_client_start); + buf->lsd_client_size = cpu_to_le16(lsd->lsd_client_size); + buf->lsd_subdir_count = cpu_to_le16(lsd->lsd_subdir_count); + buf->lsd_catalog_oid = cpu_to_le64(lsd->lsd_catalog_oid); + buf->lsd_catalog_ogen = cpu_to_le32(lsd->lsd_catalog_ogen); + memcpy(buf->lsd_peeruuid, lsd->lsd_peeruuid, sizeof(buf->lsd_peeruuid)); + buf->lsd_ost_index = cpu_to_le32(lsd->lsd_ost_index); + buf->lsd_mdt_index = cpu_to_le32(lsd->lsd_mdt_index); + buf->lsd_start_epoch = cpu_to_le32(lsd->lsd_start_epoch); + for (i = 0; i < LR_EXPIRE_INTERVALS; i++) + buf->lsd_trans_table[i] = cpu_to_le64(lsd->lsd_trans_table[i]); + buf->lsd_trans_table_time = cpu_to_le32(lsd->lsd_trans_table_time); + buf->lsd_expire_intervals = cpu_to_le32(lsd->lsd_expire_intervals); +} + +static inline void lcd_le_to_cpu(struct lsd_client_data *buf, + struct lsd_client_data *lcd) +{ + memcpy(lcd->lcd_uuid, buf->lcd_uuid, sizeof (lcd->lcd_uuid)); + lcd->lcd_last_transno = le64_to_cpu(buf->lcd_last_transno); + lcd->lcd_last_xid = le64_to_cpu(buf->lcd_last_xid); + lcd->lcd_last_result = le32_to_cpu(buf->lcd_last_result); + lcd->lcd_last_data = le32_to_cpu(buf->lcd_last_data); + lcd->lcd_last_close_transno = le64_to_cpu(buf->lcd_last_close_transno); + lcd->lcd_last_close_xid = le64_to_cpu(buf->lcd_last_close_xid); + lcd->lcd_last_close_result = le32_to_cpu(buf->lcd_last_close_result); + lcd->lcd_last_close_data = le32_to_cpu(buf->lcd_last_close_data); + lcd->lcd_pre_versions[0] = le64_to_cpu(buf->lcd_pre_versions[0]); + lcd->lcd_pre_versions[1] = le64_to_cpu(buf->lcd_pre_versions[1]); + lcd->lcd_pre_versions[2] = le64_to_cpu(buf->lcd_pre_versions[2]); + lcd->lcd_pre_versions[3] = le64_to_cpu(buf->lcd_pre_versions[3]); + lcd->lcd_last_epoch = le32_to_cpu(buf->lcd_last_epoch); + lcd->lcd_first_epoch = le32_to_cpu(buf->lcd_first_epoch); +} + +static inline void lcd_cpu_to_le(struct lsd_client_data *lcd, + struct lsd_client_data *buf) +{ + memcpy(buf->lcd_uuid, lcd->lcd_uuid, sizeof (lcd->lcd_uuid)); + buf->lcd_last_transno = cpu_to_le64(lcd->lcd_last_transno); + buf->lcd_last_xid = cpu_to_le64(lcd->lcd_last_xid); + buf->lcd_last_result = cpu_to_le32(lcd->lcd_last_result); + buf->lcd_last_data = cpu_to_le32(lcd->lcd_last_data); + buf->lcd_last_close_transno = cpu_to_le64(lcd->lcd_last_close_transno); + buf->lcd_last_close_xid = cpu_to_le64(lcd->lcd_last_close_xid); + buf->lcd_last_close_result = cpu_to_le32(lcd->lcd_last_close_result); + buf->lcd_last_close_data = cpu_to_le32(lcd->lcd_last_close_data); + buf->lcd_pre_versions[0] = cpu_to_le64(lcd->lcd_pre_versions[0]); + buf->lcd_pre_versions[1] = cpu_to_le64(lcd->lcd_pre_versions[1]); + buf->lcd_pre_versions[2] = cpu_to_le64(lcd->lcd_pre_versions[2]); + buf->lcd_pre_versions[3] = cpu_to_le64(lcd->lcd_pre_versions[3]); + buf->lcd_last_epoch = cpu_to_le32(lcd->lcd_last_epoch); + buf->lcd_first_epoch = cpu_to_le32(lcd->lcd_first_epoch); +} + +static inline __u64 lcd_last_transno(struct lsd_client_data *lcd) +{ + return (lcd->lcd_last_transno > lcd->lcd_last_close_transno ? + lcd->lcd_last_transno : lcd->lcd_last_close_transno); +} + +static inline __u64 lcd_last_xid(struct lsd_client_data *lcd) +{ + return (lcd->lcd_last_xid > lcd->lcd_last_close_xid ? + lcd->lcd_last_xid : lcd->lcd_last_close_xid); +} /****************** superblock additional info *********************/ #ifdef __KERNEL__ @@ -322,7 +446,6 @@ struct lustre_mount_info { /****************** prototypes *********************/ #ifdef __KERNEL__ -#include /* obd_mount.c */ void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb)); @@ -330,10 +453,6 @@ void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb)); int lustre_common_put_super(struct super_block *sb); -int lustre_process_log(struct super_block *sb, char *logname, - struct config_llog_instance *cfg); -int lustre_end_log(struct super_block *sb, char *logname, - struct config_llog_instance *cfg); struct lustre_mount_info *server_get_mount(const char *name); struct lustre_mount_info *server_get_mount_2(const char *name); int server_put_mount(const char *name); diff --git a/lustre/include/lustre_export.h b/lustre/include/lustre_export.h index 0a6287b3..33b5248 100644 --- a/lustre/include/lustre_export.h +++ b/lustre/include/lustre_export.h @@ -42,24 +42,36 @@ #include #include -/* Data stored per client in the last_rcvd file. In le32 order. */ struct mds_client_data; struct mdt_client_data; struct mds_idmap_table; struct mdt_idmap_table; +struct lu_export_data { + /** Protects led_lcd below */ + struct semaphore led_lcd_lock; + /** Per-client data for each export */ + struct lsd_client_data *led_lcd; + /** Offset of record in last_rcvd file */ + loff_t led_lr_off; + /** Client index in last_rcvd file */ + int led_lr_idx; +}; + struct mdt_export_data { + struct lu_export_data med_led; struct list_head med_open_head; spinlock_t med_open_lock; /* lock med_open_head, mfd_list*/ - struct semaphore med_lcd_lock; - struct lsd_client_data *med_lcd; __u64 med_ibits_known; - loff_t med_lr_off; - int med_lr_idx; struct semaphore med_idmap_sem; struct lustre_idmap_table *med_idmap; }; +#define med_lcd_lock med_led.led_lcd_lock +#define med_lcd med_led.led_lcd +#define med_lr_off med_led.led_lr_off +#define med_lr_idx med_led.led_lr_idx + struct osc_creator { spinlock_t oscc_lock; struct list_head oscc_list; @@ -82,11 +94,8 @@ struct ec_export_data { /* echo client */ /* In-memory access to client data from OST struct */ struct filter_export_data { - spinlock_t fed_lock; /* protects fed_open_head */ - struct semaphore fed_lastrcvd_lock; - struct lsd_client_data *fed_lcd; - loff_t fed_lr_off; - int fed_lr_idx; + struct lu_export_data fed_led; + spinlock_t fed_lock; /**< protects fed_mod_list */ long fed_dirty; /* in bytes */ long fed_grant; /* in bytes */ struct list_head fed_mod_list; /* files being modified */ @@ -95,6 +104,11 @@ struct filter_export_data { __u32 fed_group; }; +#define fed_lcd_lock fed_led.led_lcd_lock +#define fed_lcd fed_led.led_lcd +#define fed_lr_off fed_led.led_lr_off +#define fed_lr_idx fed_led.led_lr_idx + typedef struct nid_stat_uuid { struct list_head ns_uuid_list; struct obd_uuid ns_uuid; @@ -138,7 +152,10 @@ struct obd_export { lustre_hash_t *exp_lock_hash; /* existing lock hash */ spinlock_t exp_lock_hash_lock; struct list_head exp_outstanding_replies; - time_t exp_last_request_time; + struct list_head exp_uncommitted_replies; + spinlock_t exp_uncommitted_replies_lock; + __u64 exp_last_committed; + cfs_time_t exp_last_request_time; struct list_head exp_req_replay_queue; spinlock_t exp_lock; /* protects flags int below */ /* ^ protects exp_outstanding_replies too */ @@ -148,6 +165,10 @@ struct obd_export { exp_in_recovery:1, exp_disconnected:1, exp_connecting:1, + /** VBR: export missed recovery */ + exp_delayed:1, + /** VBR: failed version checking */ + exp_vbr_failed:1, exp_req_replay_needed:1, exp_lock_replay_needed:1, exp_need_sync:1, @@ -162,16 +183,25 @@ struct obd_export { cfs_time_t exp_flvr_expire[2]; /* seconds */ union { + struct lu_export_data eu_target_data; struct mdt_export_data eu_mdt_data; struct filter_export_data eu_filter_data; struct ec_export_data eu_ec_data; } u; }; +#define exp_target_data u.eu_target_data #define exp_mdt_data u.eu_mdt_data #define exp_filter_data u.eu_filter_data #define exp_ec_data u.eu_ec_data +static inline int exp_expired(struct obd_export *exp, cfs_duration_t age) +{ + LASSERT(exp->exp_delayed); + return cfs_time_before(cfs_time_add(exp->exp_last_request_time, age), + cfs_time_current_sec()); +} + static inline int exp_connect_cancelset(struct obd_export *exp) { LASSERT(exp != NULL); @@ -198,6 +228,13 @@ static inline int client_is_remote(struct obd_export *exp) OBD_CONNECT_RMT_CLIENT); } +static inline int exp_connect_vbr(struct obd_export *exp) +{ + LASSERT(exp != NULL); + LASSERT(exp->exp_connection); + return !!(exp->exp_connect_flags & OBD_CONNECT_VBR); +} + static inline int imp_connect_lru_resize(struct obd_import *imp) { struct obd_connect_data *ocd; diff --git a/lustre/include/lustre_import.h b/lustre/include/lustre_import.h index f3fd466..be05058 100644 --- a/lustre/include/lustre_import.h +++ b/lustre/include/lustre_import.h @@ -111,6 +111,13 @@ struct imp_at { struct adaptive_timeout iat_service_estimate[IMP_AT_MAX_PORTALS]; }; +/* state history */ +#define IMP_STATE_HIST_LEN 16 +struct import_state_hist { + enum lustre_imp_state ish_state; + time_t ish_time; +}; + struct obd_import { struct portals_handle imp_handle; atomic_t imp_refcount; @@ -136,8 +143,11 @@ struct obd_import { atomic_t imp_inflight; atomic_t imp_unregistering; atomic_t imp_replay_inflight; - atomic_t imp_inval_count; + atomic_t imp_inval_count; /* in-progress invalidations */ + atomic_t imp_timeouts; enum lustre_imp_state imp_state; + struct import_state_hist imp_state_hist[IMP_STATE_HIST_LEN]; + int imp_state_hist_idx; int imp_generation; __u32 imp_conn_cnt; int imp_last_generation_checked; @@ -162,8 +172,11 @@ struct obd_import { imp_replayable:1, /* try to recover the import */ imp_dlm_fake:1, /* don't run recovery (timeout instead) */ imp_server_timeout:1, /* use 1/2 timeout on MDS' OSCs */ - imp_initial_recov:1, /* retry the initial connection */ + imp_initial_recov:1, /* retry the initial connection */ imp_initial_recov_bk:1, /* turn off init_recov after trying all failover nids */ + imp_delayed_recovery:1, /* VBR: imp in delayed recovery */ + imp_no_lock_replay:1, /* VBR: if gap was found then no lock replays */ + imp_vbr_failed:1, /* recovery by versions was failed */ imp_force_verify:1, /* force an immidiate ping */ imp_pingable:1, /* pingable */ imp_resend_replay:1, /* resend for replay */ diff --git a/lustre/include/lustre_lib.h b/lustre/include/lustre_lib.h index c99450e..bbcdd91 100644 --- a/lustre/include/lustre_lib.h +++ b/lustre/include/lustre_lib.h @@ -62,9 +62,8 @@ void ll_get_random_bytes(void *buf, int size); /* target.c */ struct ptlrpc_request; -struct recovd_data; -struct recovd_obd; struct obd_export; +struct lu_target; #include #include #include @@ -89,8 +88,6 @@ int target_handle_dqacq_callback(struct ptlrpc_request *req); #define OBD_RECOVERY_MAX_TIME (obd_timeout * 18) /* b13079 */ void target_cancel_recovery_timer(struct obd_device *obd); -int target_start_recovery_thread(struct obd_device *obd, - svc_handler_t handler); void target_stop_recovery_thread(struct obd_device *obd); void target_cleanup_recovery(struct obd_device *obd); int target_queue_recovery_request(struct ptlrpc_request *req, diff --git a/lustre/include/lustre_log.h b/lustre/include/lustre_log.h index eddaeef..ad6e6ca 100644 --- a/lustre/include/lustre_log.h +++ b/lustre/include/lustre_log.h @@ -61,7 +61,7 @@ #error Unsupported operating system. #endif -#include +#include #include #include @@ -294,7 +294,7 @@ struct llog_commit_master { /** * The refcount for lcm */ - atomic_t lcm_refcount; + atomic_t lcm_refcount; /** * Thread control structure. Used for control commit thread. */ @@ -313,7 +313,7 @@ struct llog_commit_master { char lcm_name[LCM_NAME_SIZE]; }; -static inline struct llog_commit_master +static inline struct llog_commit_master *lcm_get(struct llog_commit_master *lcm) { LASSERT(atomic_read(&lcm->lcm_refcount) > 0); @@ -321,13 +321,13 @@ static inline struct llog_commit_master return lcm; } -static inline void +static inline void lcm_put(struct llog_commit_master *lcm) { if (!atomic_dec_and_test(&lcm->lcm_refcount)) { return ; } - OBD_FREE_PTR(lcm); + OBD_FREE_PTR(lcm); } struct llog_canceld_ctxt { @@ -675,4 +675,9 @@ static inline int llog_connect(struct llog_ctxt *ctxt, RETURN(rc); } +int lustre_process_log(struct super_block *sb, char *logname, + struct config_llog_instance *cfg); +int lustre_end_log(struct super_block *sb, char *logname, + struct config_llog_instance *cfg); + #endif diff --git a/lustre/include/lustre_mds.h b/lustre/include/lustre_mds.h index dac9f11..c427feb 100644 --- a/lustre/include/lustre_mds.h +++ b/lustre/include/lustre_mds.h @@ -81,4 +81,9 @@ static inline int md_should_create(__u32 flags) !(flags & FMODE_WRITE)); } +/* these are local flags, used only on the client, private */ +#define M_CHECK_STALE 0200000000 +#define M_JOIN_FILE 0400000000 /* its counterpart is + * MDS_OPEN_JOIN_FILE */ + #endif diff --git a/lustre/include/lustre_net.h b/lustre/include/lustre_net.h index 70c3150..b1dcac3 100644 --- a/lustre/include/lustre_net.h +++ b/lustre/include/lustre_net.h @@ -927,6 +927,7 @@ int ptlrpc_replay_req(struct ptlrpc_request *req); int ptlrpc_unregister_reply(struct ptlrpc_request *req, int async); void ptlrpc_restart_req(struct ptlrpc_request *req); void ptlrpc_abort_inflight(struct obd_import *imp); +void ptlrpc_cleanup_imp(struct obd_import *imp); void ptlrpc_abort_set(struct ptlrpc_request_set *set); struct ptlrpc_request_set *ptlrpc_prep_set(void); @@ -1004,7 +1005,7 @@ struct ptlrpc_service_conf { /* ptlrpc/service.c */ void ptlrpc_save_lock (struct ptlrpc_request *req, struct lustre_handle *lock, int mode, int no_ack); -void ptlrpc_commit_replies (struct obd_device *obd); +void ptlrpc_commit_replies(struct obd_export *exp); void ptlrpc_dispatch_difficult_reply (struct ptlrpc_reply_state *rs); void ptlrpc_schedule_difficult_reply (struct ptlrpc_reply_state *rs); struct ptlrpc_service *ptlrpc_init_svc_conf(struct ptlrpc_service_conf *c, @@ -1105,6 +1106,7 @@ void lustre_msg_add_version(struct lustre_msg *msg, int version); __u32 lustre_msg_get_opc(struct lustre_msg *msg); __u64 lustre_msg_get_last_xid(struct lustre_msg *msg); __u64 lustre_msg_get_last_committed(struct lustre_msg *msg); +__u64 *lustre_msg_get_versions(struct lustre_msg *msg); __u64 lustre_msg_get_transno(struct lustre_msg *msg); __u64 lustre_msg_get_slv(struct lustre_msg *msg); __u32 lustre_msg_get_limit(struct lustre_msg *msg); @@ -1123,6 +1125,7 @@ void lustre_msg_set_type(struct lustre_msg *msg, __u32 type); void lustre_msg_set_opc(struct lustre_msg *msg, __u32 opc); void lustre_msg_set_last_xid(struct lustre_msg *msg, __u64 last_xid); void lustre_msg_set_last_committed(struct lustre_msg *msg,__u64 last_committed); +void lustre_msg_set_versions(struct lustre_msg *msg, __u64 *versions); void lustre_msg_set_transno(struct lustre_msg *msg, __u64 transno); void lustre_msg_set_status(struct lustre_msg *msg, __u32 status); void lustre_msg_set_conn_cnt(struct lustre_msg *msg, __u32 conn_cnt); @@ -1271,6 +1274,7 @@ int client_import_add_conn(struct obd_import *imp, struct obd_uuid *uuid, int priority); int client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid); int import_set_conn_priority(struct obd_import *imp, struct obd_uuid *uuid); +void client_destroy_import(struct obd_import *imp); /* ptlrpc/pinger.c */ enum timeout_event { @@ -1283,7 +1287,8 @@ int ptlrpc_pinger_del_import(struct obd_import *imp); int ptlrpc_add_timeout_client(int time, enum timeout_event event, timeout_cb_t cb, void *data, struct list_head *obd_list); -int ptlrpc_del_timeout_client(struct list_head *obd_list); +int ptlrpc_del_timeout_client(struct list_head *obd_list, + enum timeout_event event); struct ptlrpc_request * ptlrpc_prep_ping(struct obd_import *imp); int ptlrpc_obd_ping(struct obd_device *obd); cfs_time_t ptlrpc_suspend_wakeup_time(void); diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h index 8832552..f69fac5 100644 --- a/lustre/include/md_object.h +++ b/lustre/include/md_object.h @@ -56,7 +56,7 @@ /* * super-class definitions. */ -#include +#include #include struct md_device; @@ -246,7 +246,10 @@ struct md_object_operations { struct lustre_capa *, int renewal); int (*moo_object_sync)(const struct lu_env *, struct md_object *); - + dt_obj_version_t (*moo_version_get)(const struct lu_env *, + struct md_object *); + void (*moo_version_set)(const struct lu_env *, struct md_object *, + dt_obj_version_t); int (*moo_path)(const struct lu_env *env, struct md_object *obj, char *path, int pathlen, __u64 *recno, int *linkno); }; @@ -408,11 +411,13 @@ struct md_device_operations { }; enum md_upcall_event { - /**sync the md layer*/ + /** Sync the md layer*/ MD_LOV_SYNC = (1 << 0), /** Just for split, no need trans, for replay */ MD_NO_TRANS = (1 << 1), - MD_LOV_CONFIG = (1 << 2) + MD_LOV_CONFIG = (1 << 2), + /** Trigger quota recovery */ + MD_LOV_QUOTA = (1 << 3) }; struct md_upcall { @@ -704,6 +709,20 @@ static inline int mo_object_sync(const struct lu_env *env, struct md_object *m) return m->mo_ops->moo_object_sync(env, m); } +static inline dt_obj_version_t mo_version_get(const struct lu_env *env, + struct md_object *m) +{ + LASSERT(m->mo_ops->moo_version_get); + return m->mo_ops->moo_version_get(env, m); +} + +static inline void mo_version_set(const struct lu_env *env, + struct md_object *m, dt_obj_version_t ver) +{ + LASSERT(m->mo_ops->moo_version_set); + return m->mo_ops->moo_version_set(env, m, ver); +} + static inline int mdo_lookup(const struct lu_env *env, struct md_object *p, const struct lu_name *lname, diff --git a/lustre/include/obd.h b/lustre/include/obd.h index 21c3734..31f400d 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -60,7 +60,7 @@ #define IOC_MDC_MAX_NR 50 #include -#include +#include #include #include #include @@ -247,6 +247,20 @@ struct ost_server_data; /* hold common fields for "target" device */ struct obd_device_target { struct super_block *obt_sb; + /** last_rcvd file */ + struct file *obt_rcvd_filp; + /** server data in last_rcvd file */ + struct lr_server_data *obt_lsd; + /** Lock protecting client bitmap */ + spinlock_t obt_client_bitmap_lock; + /** Bitmap of known clients */ + unsigned long *obt_client_bitmap; + /** Server last transaction number */ + __u64 obt_last_transno; + /** Lock protecting last transaction number */ + spinlock_t obt_translock; + /** Number of mounts */ + __u64 obt_mount_count; atomic_t obt_quotachecking; struct lustre_quota_ctxt obt_qctxt; lustre_quota_version_t obt_qfmt; @@ -288,6 +302,7 @@ struct filter_ext { struct filter_obd { /* NB this field MUST be first */ struct obd_device_target fo_obt; + struct lu_target fo_lut; const char *fo_fstype; //struct vfsmount *fo_vfsmnt; @@ -301,12 +316,7 @@ struct filter_obd { spinlock_t fo_objidlock; /* protect fo_lastobjid */ - spinlock_t fo_translock; /* protect fsd_last_transno */ - //struct file *fo_rcvd_filp; - //struct file *fo_health_check_filp; - struct lr_server_data *fo_fsd; - unsigned long *fo_last_rcvd_slots; - __u64 fo_mount_count; + struct file *fo_health_check_filp; unsigned long fo_destroys_in_progress; struct semaphore fo_create_locks[FILTER_SUBDIR_COUNT]; @@ -373,6 +383,12 @@ struct filter_obd { int fo_sec_level; }; +#define fo_translock fo_obt.obt_translock +#define fo_rcvd_filp fo_obt.obt_rcvd_filp +#define fo_fsd fo_obt.obt_lsd +#define fo_last_rcvd_slots fo_obt.obt_client_bitmap +#define fo_mount_count fo_obt.obt_mount_count + struct timeout_item { enum timeout_event ti_event; cfs_time_t ti_timeout; @@ -381,6 +397,7 @@ struct timeout_item { struct list_head ti_obd_list; struct list_head ti_chain; }; + #define OSC_MAX_RIF_DEFAULT 8 #define OSC_MAX_RIF_MAX 256 #define OSC_MAX_DIRTY_DEFAULT (OSC_MAX_RIF_DEFAULT * 4) @@ -518,15 +535,10 @@ struct mds_obd { cfs_dentry_t *mds_fid_de; int mds_max_mdsize; int mds_max_cookiesize; - struct file *mds_rcvd_filp; - spinlock_t mds_transno_lock; - __u64 mds_last_transno; - __u64 mds_mount_count; __u64 mds_io_epoch; unsigned long mds_atime_diff; struct semaphore mds_epoch_sem; struct ll_fid mds_rootfid; - struct lr_server_data *mds_server_data; cfs_dentry_t *mds_pending_dir; cfs_dentry_t *mds_logs_dir; cfs_dentry_t *mds_objects_dir; @@ -550,8 +562,6 @@ struct mds_obd { __u32 mds_lov_objid_lastidx; struct file *mds_health_check_filp; - unsigned long *mds_client_bitmap; -// struct upcall_cache *mds_group_hash; struct lustre_quota_info mds_quota_info; struct semaphore mds_qonoff_sem; @@ -572,6 +582,13 @@ struct mds_obd { struct rw_semaphore mds_notify_lock; }; +#define mds_transno_lock mds_obt.obt_translock +#define mds_rcvd_filp mds_obt.obt_rcvd_filp +#define mds_server_data mds_obt.obt_lsd +#define mds_client_bitmap mds_obt.obt_client_bitmap +#define mds_mount_count mds_obt.obt_mount_count +#define mds_last_transno mds_obt.obt_last_transno + /* lov objid */ extern __u32 mds_max_ost_index; @@ -678,6 +695,7 @@ struct lov_qos { struct lov_tgt_desc { struct list_head ltd_kill; struct obd_uuid ltd_uuid; + struct obd_device *ltd_obd; struct obd_export *ltd_exp; struct ltd_qos ltd_qos; /* qos info per target */ __u32 ltd_gen; @@ -835,6 +853,8 @@ struct obd_trans_info { /* initial thread handling transaction */ struct ptlrpc_thread * oti_thread; __u32 oti_conn_cnt; + /** VBR: versions */ + __u64 oti_pre_version; struct obd_uuid *oti_ost_uuid; }; @@ -850,7 +870,15 @@ static inline void oti_init(struct obd_trans_info *oti, return; oti->oti_xid = req->rq_xid; + /** VBR: take versions from request */ + if (req->rq_reqmsg != NULL && + lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) { + __u64 *pre_version = lustre_msg_get_versions(req->rq_reqmsg); + oti->oti_pre_version = pre_version ? pre_version[0] : 0; + oti->oti_transno = lustre_msg_get_transno(req->rq_reqmsg); + } + /** called from mds_create_objects */ if (req->rq_repmsg != NULL) oti->oti_transno = lustre_msg_get_transno(req->rq_repmsg); oti->oti_thread = req->rq_svc_thread; @@ -904,7 +932,9 @@ enum obd_notify_event { OBD_NOTIFY_SYNC_NONBLOCK, OBD_NOTIFY_SYNC, /* Configuration event */ - OBD_NOTIFY_CONFIG + OBD_NOTIFY_CONFIG, + /* Trigger quota recovery */ + OBD_NOTIFY_QUOTA }; /* bit-mask flags for config events */ @@ -996,7 +1026,8 @@ struct obd_device { unsigned long obd_attached:1, /* finished attach */ obd_set_up:1, /* finished setup */ obd_recovering:1, /* there are recoverable clients */ - obd_abort_recovery:1,/* somebody ioctl'ed us to abort */ + obd_abort_recovery:1,/* recovery expired */ + obd_version_recov:1, /* obd uses version checking */ obd_replayable:1, /* recovery is enabled; inform clients */ obd_no_transno:1, /* no committed-transno notification */ obd_no_recov:1, /* fail instead of retry messages */ @@ -1019,6 +1050,7 @@ struct obd_device { atomic_t obd_refcount; cfs_waitq_t obd_refcount_waitq; struct list_head obd_exports; + struct list_head obd_delayed_exports; int obd_num_exports; spinlock_t obd_nid_lock; struct ldlm_namespace *obd_namespace; @@ -1047,13 +1079,12 @@ struct obd_device { int obd_max_recoverable_clients; int obd_connected_clients; int obd_recoverable_clients; + int obd_delayed_clients; spinlock_t obd_processing_task_lock; /* BH lock (timer) */ __u64 obd_next_recovery_transno; int obd_replayed_requests; int obd_requests_queued_for_recovery; cfs_waitq_t obd_next_transno_waitq; - struct list_head obd_uncommitted_replies; - spinlock_t obd_uncommitted_replies_lock; cfs_timer_t obd_recovery_timer; time_t obd_recovery_start; /* seconds */ time_t obd_recovery_end; /* seconds, for lprocfs_status */ @@ -1577,22 +1608,24 @@ int lvfs_check_io_health(struct obd_device *obd, struct file *file); #define OBD_CALC_STRIPE_END 2 static inline void obd_transno_commit_cb(struct obd_device *obd, __u64 transno, - int error) + struct obd_export *exp, int error) { if (error) { CERROR("%s: transno "LPU64" commit error: %d\n", obd->obd_name, transno, error); return; } - if (transno > obd->obd_last_committed) { - CDEBUG(D_INFO, "%s: transno "LPD64" committed\n", + if (exp && transno > exp->exp_last_committed) { + CDEBUG(D_HA, "%s: transno "LPU64" committed\n", obd->obd_name, transno); - obd->obd_last_committed = transno; - ptlrpc_commit_replies (obd); + exp->exp_last_committed = transno; + ptlrpc_commit_replies(exp); } else { - CDEBUG(D_INFO, "%s: transno "LPD64" committed\n", + CDEBUG(D_INFO, "%s: transno "LPU64" committed\n", obd->obd_name, transno); } + if (transno > obd->obd_last_committed) + obd->obd_last_committed = transno; } static inline void init_obd_quota_ops(quota_interface_t *interface, diff --git a/lustre/include/obd_support.h b/lustre/include/obd_support.h index 7096eaa..860667d 100644 --- a/lustre/include/obd_support.h +++ b/lustre/include/obd_support.h @@ -123,6 +123,9 @@ int obd_alloc_fail(const void *ptr, const char *name, const char *type, chance to generate adaptive timeout data. */ #define INITIAL_CONNECT_TIMEOUT max(CONNECTION_SWITCH_MIN,obd_timeout/2) #endif +/* The max delay between connects is SWITCH_MAX + SWITCH_INC + INITIAL */ +#define RECONNECT_DELAY_MAX (CONNECTION_SWITCH_MAX + CONNECTION_SWITCH_INC + \ + INITIAL_CONNECT_TIMEOUT) #define LONG_UNLINK 300 /* Unlink should happen before now */ /** @@ -196,6 +199,7 @@ int obd_alloc_fail(const void *ptr, const char *name, const char *type, #define OBD_FAIL_MDS_DROP_QUOTA_REQ 0x13d #define OBD_FAIL_MDS_REMOVE_COMMON_EA 0x13e #define OBD_FAIL_MDS_ALLOW_COMMON_EA_SETTING 0x13f +#define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141 /* CMD */ #define OBD_FAIL_MDS_IS_SUBDIR_NET 0x180 @@ -289,6 +293,7 @@ int obd_alloc_fail(const void *ptr, const char *name, const char *type, #define OBD_FAIL_OSC_CKSUM_ADLER_ONLY 0x40c #define OBD_FAIL_OSC_DIO_PAUSE 0x40d #define OBD_FAIL_OSC_OBJECT_CONTENTION 0x40e +#define OBD_FAIL_OSC_CP_CANCEL_RACE 0x40f #define OBD_FAIL_PTLRPC 0x500 #define OBD_FAIL_PTLRPC_ACK 0x501 @@ -327,6 +332,7 @@ int obd_alloc_fail(const void *ptr, const char *name, const char *type, #define OBD_FAIL_TGT_REPLAY_DROP 0x707 #define OBD_FAIL_TGT_FAKE_EXP 0x708 #define OBD_FAIL_TGT_REPLAY_DELAY 0x709 +#define OBD_FAIL_TGT_LAST_REPLAY 0x710 #define OBD_FAIL_MDC_REVALIDATE_PAUSE 0x800 #define OBD_FAIL_MDC_ENQUEUE_PAUSE 0x801 @@ -715,7 +721,7 @@ do { \ }) #define OBD_SLAB_ALLOC(ptr, slab, type, size) \ do { \ - LASSERT(!in_interrupt()); \ + LASSERT(ergo(type != CFS_ALLOC_ATOMIC, !in_interrupt())); \ (ptr) = cfs_mem_cache_alloc(slab, (type)); \ if (likely((ptr) != NULL && \ (!HAS_FAIL_ALLOC_FLAG || obd_alloc_fail_rate == 0 || \ diff --git a/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-i686-smp.config b/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-i686-smp.config new file mode 100644 index 0000000..f37a1b7 --- /dev/null +++ b/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-i686-smp.config @@ -0,0 +1,3191 @@ +# i386 +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.18-prep +# Thu Feb 19 13:10:17 2009 +# +CONFIG_X86_32=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_SEMAPHORE_SLEEPERS=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_DMI=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_LOCK_KERNEL=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +# CONFIG_IKCONFIG is not set +CONFIG_CPUSETS=y +CONFIG_RELAY=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +CONFIG_KALLSYMS_EXTRA_PASS=y +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_TRACEPOINTS=y +CONFIG_MARKERS=y +CONFIG_TRACEPROBES=m +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SRCVERSION_ALL=y +CONFIG_MODULE_SIG=y +# CONFIG_MODULE_SIG_FORCE is not set +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Process debugging support +# +CONFIG_PTRACE=y +CONFIG_UTRACE=y + +# +# Block layer +# +CONFIG_LBD=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_LSF=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +CONFIG_DEFAULT_DEADLINE=y +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="deadline" + +# +# Processor type and features +# +CONFIG_SMP=y +# CONFIG_X86_PC is not set +CONFIG_X86_XEN=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +CONFIG_M686=y +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MEFFICEON is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MGEODEGX1 is not set +# CONFIG_MGEODE_LX is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +CONFIG_X86_GENERIC=y +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +# CONFIG_TICK_DIVIDER is not set +CONFIG_NR_CPUS=32 +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_VOLUNTARY=y +# CONFIG_PREEMPT is not set +CONFIG_PREEMPT_BKL=y +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_VM86=y +CONFIG_TOSHIBA=m +CONFIG_I8K=m +# CONFIG_X86_REBOOTFIXUPS is not set +CONFIG_MICROCODE=m +CONFIG_X86_CPUID=m +CONFIG_SWIOTLB=y + +# +# Firmware Drivers +# +CONFIG_DELL_RBU=m +CONFIG_DCDBAS=m +CONFIG_ISCSI_IBFT_FIND=y +CONFIG_ISCSI_IBFT=m +# CONFIG_NOHIGHMEM is not set +# CONFIG_HIGHMEM4G is not set +CONFIG_HIGHMEM64G=y +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_HIGHMEM=y +CONFIG_X86_PAE=y +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +CONFIG_RESOURCES_64BIT=y +CONFIG_MTRR=y +CONFIG_REGPARM=y +# CONFIG_SECCOMP is not set +# CONFIG_VGA_NOPROBE is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_KEXEC=y +CONFIG_CRASH_DUMP=y +CONFIG_RELOCATABLE=y +CONFIG_PHYSICAL_ALIGN=0x400000 +CONFIG_HOTPLUG_CPU=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_VIDEO=m +# CONFIG_ACPI_HOTKEY is not set +CONFIG_ACPI_FAN=y +CONFIG_ACPI_DOCK=y +CONFIG_ACPI_BAY=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_ASUS=m +# CONFIG_ACPI_IBM is not set +CONFIG_ACPI_TOSHIBA=m +CONFIG_ACPI_BLACKLIST_YEAR=1999 +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_SYSTEM=y +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_SBS=m +CONFIG_THINKPAD_ACPI=m +# CONFIG_THINKPAD_ACPI_DEBUG is not set +CONFIG_THINKPAD_ACPI_BAY=y +CONFIG_THINKPAD_ACPI_VIDEO=y +CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_CPU_FREQ_DEBUG=y +CONFIG_CPU_FREQ_STAT=m +CONFIG_CPU_FREQ_STAT_DETAILS=y +# 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_GOV_CONSERVATIVE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=m +# CONFIG_X86_POWERNOW_K6 is not set +CONFIG_X86_POWERNOW_K7=y +CONFIG_X86_POWERNOW_K7_ACPI=y +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_POWERNOW_K8_ACPI=y +# CONFIG_X86_GX_SUSPMOD is not set +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +CONFIG_X86_SPEEDSTEP_ICH=y +CONFIG_X86_SPEEDSTEP_SMI=y +CONFIG_X86_P4_CLOCKMOD=m +# CONFIG_X86_CPUFREQ_NFORCE2 is not set +CONFIG_X86_LONGRUN=y +# CONFIG_X86_LONGHAUL is not set + +# +# shared options +# +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +CONFIG_X86_SPEEDSTEP_LIB=y +# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +# CONFIG_PCI_GOXEN_FE is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_XEN_PCIDEV_FRONTEND=y +# CONFIG_XEN_PCIDEV_FE_DEBUG is not set +CONFIG_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_PCI_DOMAINS=y +# CONFIG_PCI_DEBUG is not set +CONFIG_ISA_DMA_API=y +# CONFIG_SCx200 is not set +CONFIG_K8_NB=y + +# +# PCCARD (PCMCIA/CardBus) support +# +CONFIG_PCCARD=y +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y +CONFIG_CARDBUS=y + +# +# PC-card bridges +# +CONFIG_YENTA=y +CONFIG_YENTA_O2=y +CONFIG_YENTA_RICOH=y +CONFIG_YENTA_TI=y +CONFIG_YENTA_ENE_TUNE=y +CONFIG_YENTA_TOSHIBA=y +CONFIG_PD6729=m +# CONFIG_I82092 is not set +CONFIG_PCCARD_NONSTATIC=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_ACPI_IBM=m +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_SHPC is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_MISC=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_NALGO=m +CONFIG_XFRM_USER=y +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_ASK_IP_FIB_HASH=y +# CONFIG_IP_FIB_TRIE is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_MULTIPATH=y +# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_DIAG=m +CONFIG_INET_TCP_DIAG=m +CONFIG_TCP_CONG_ADVANCED=y + +# +# TCP congestion control +# +CONFIG_TCP_CONG_BIC=y +CONFIG_TCP_CONG_CUBIC=m +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_INET_LRO=y + +# +# 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_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_IPV6_TUNNEL=m +# CONFIG_IPV6_SUBTREES is not set +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_ROUTE_FWMARK=y +CONFIG_NETWORK_SECMARK=y +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_CT_ACCT=y +CONFIG_IP_NF_CONNTRACK_MARK=y +CONFIG_IP_NF_CONNTRACK_SECMARK=y +CONFIG_IP_NF_CONNTRACK_EVENTS=y +CONFIG_IP_NF_CONNTRACK_NETLINK=m +CONFIG_IP_NF_CT_PROTO_SCTP=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_NETBIOS_NS=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_PPTP=m +CONFIG_IP_NF_H323=m +CONFIG_IP_NF_SIP=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_HASHLIMIT=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_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_NAT_PPTP=m +CONFIG_IP_NF_NAT_H323=m +CONFIG_IP_NF_NAT_SIP=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration (EXPERIMENTAL) +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_RAW=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_ULOG=m + +# +# DCCP Configuration (EXPERIMENTAL) +# +CONFIG_IP_DCCP=m +CONFIG_INET_DCCP_DIAG=m +CONFIG_IP_DCCP_ACKVEC=y + +# +# DCCP CCIDs Configuration (EXPERIMENTAL) +# +CONFIG_IP_DCCP_CCID2=m +CONFIG_IP_DCCP_CCID3=m +CONFIG_IP_DCCP_TFRC_LIB=m + +# +# DCCP Kernel Hacking +# +# CONFIG_IP_DCCP_DEBUG is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y + +# +# TIPC Configuration (EXPERIMENTAL) +# +CONFIG_TIPC=m +# CONFIG_TIPC_ADVANCED is not set +# CONFIG_TIPC_DEBUG is not set +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_DECNET is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +# CONFIG_NET_SCH_CLK_JIFFIES is not set +CONFIG_NET_SCH_CLK_GETTIMEOFDAY=y +# CONFIG_NET_SCH_CLK_CPU is not set + +# +# Queueing/Scheduling +# +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_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_STACK=32 +CONFIG_NET_EMATCH_CMP=m +CONFIG_NET_EMATCH_NBYTE=m +CONFIG_NET_EMATCH_U32=m +CONFIG_NET_EMATCH_META=m +CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_CLS_IND=y +CONFIG_NET_ESTIMATOR=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NET_TCPPROBE is not set +# 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_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=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=y +# CONFIG_TUX_DEBUG is not set +CONFIG_NETLABEL=y +CONFIG_FIB_RULES=y + +# +# Wireless +# +CONFIG_CFG80211=m +CONFIG_NL80211=y +CONFIG_WIRELESS_EXT=y +CONFIG_NET_WIRELESS_RTNETLINK=y +CONFIG_MAC80211=m + +# +# Rate control algorithm selection +# +CONFIG_MAC80211_RC_DEFAULT_PID=y +# CONFIG_MAC80211_RC_DEFAULT_NONE is not set + +# +# Selecting 'y' for an algorithm will +# + +# +# build the algorithm into mac80211. +# +CONFIG_MAC80211_RC_DEFAULT="pid" +CONFIG_MAC80211_RC_PID=y +# CONFIG_MAC80211_MESH is not set +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=m +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IEEE80211_SOFTMAC=m +CONFIG_IEEE80211_SOFTMAC_DEBUG=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=m +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_REDBOOT_PARTS=m +CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +CONFIG_MTD_CMDLINE_PARTS=y + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +# CONFIG_INFTL is not set +CONFIG_RFD_FTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_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_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_PNC2000 is not set +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_TS5500=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +CONFIG_MTD_SCB2_FLASH=m +# CONFIG_MTD_NETtel is not set +# CONFIG_MTD_DILNETPC is not set +# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 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_BLOCK2MTD=m + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_ECC_SMC=y +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set +CONFIG_MTD_NAND_NANDSIM=m + +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_SERIAL=m +# CONFIG_PARPORT_PC_FIFO is not set +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +CONFIG_PARPORT_NOT_PC=y +# CONFIG_PARPORT_GSC is not set +# CONFIG_PARPORT_AX88796 is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_PNPACPI=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_BPCK6=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +CONFIG_PARIDE_EPATC8=y +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +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_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=4096 +CONFIG_BLK_DEV_INITRD=y +CONFIG_CDROM_PKTCDVD=m +CONFIG_CDROM_PKTCDVD_BUFFERS=8 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set +CONFIG_ATA_OVER_ETH=m + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +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_IDECD=m +# CONFIG_BLK_DEV_IDETAPE is not set +CONFIG_BLK_DEV_IDEFLOPPY=y +CONFIG_BLK_DEV_IDESCSI=m +CONFIG_IDE_TASK_IOCTL=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +CONFIG_BLK_DEV_CMD640=y +CONFIG_BLK_DEV_CMD640_ENHANCED=y +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_GENERIC=y +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_RZ1000=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_AEC62XX=y +CONFIG_BLK_DEV_ALI15X3=y +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=y +CONFIG_BLK_DEV_ATIIXP=y +CONFIG_BLK_DEV_CMD64X=y +CONFIG_BLK_DEV_TRIFLEX=y +# CONFIG_BLK_DEV_CY82C693 is not set +CONFIG_BLK_DEV_CS5520=y +CONFIG_BLK_DEV_CS5530=y +CONFIG_BLK_DEV_CS5535=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_IT821X=y +# CONFIG_BLK_DEV_NS87415 is not set +CONFIG_BLK_DEV_PDC202XX_OLD=y +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=y +CONFIG_BLK_DEV_SVWKS=y +CONFIG_BLK_DEV_SIIMAGE=y +CONFIG_BLK_DEV_SIS5513=y +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +CONFIG_BLK_DEV_VIA82CXXX=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_RAID_ATTRS=m +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +CONFIG_SCSI_NETLINK=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_SD_IOSTATS=y +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m +CONFIG_SCSI_ISCSI_ATTRS=m +CONFIG_SCSI_SAS_ATTRS=m +CONFIG_SCSI_SAS_LIBSAS=m +CONFIG_SCSI_SAS_ATA=y +# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set + +# +# SCSI low-level drivers +# +CONFIG_LIBFC=m +CONFIG_FCOE=m +CONFIG_ISCSI_TCP=m +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_AIC7XXX_CMDS_PER_DEVICE=4 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=4 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# 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_AIC94XX=m +# CONFIG_AIC94XX_DEBUG is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set +CONFIG_SCSI_ARCMSR=m +CONFIG_MEGARAID_NEWGEN=y +CONFIG_MEGARAID_MM=m +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_HPTIOP=m +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +CONFIG_SCSI_GDTH=m +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_STEX=m +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_MMIO=y +# CONFIG_SCSI_IPR is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_QLA_FC=m +CONFIG_SCSI_QLA_ISCSI=m +CONFIG_SCSI_LPFC=m +CONFIG_SCSI_DC395x=m +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set + +# +# PCMCIA SCSI adapter support +# +# CONFIG_PCMCIA_AHA152X is not set +CONFIG_PCMCIA_FDOMAIN=m +# CONFIG_PCMCIA_NINJA_SCSI is not set +# CONFIG_PCMCIA_QLOGIC is not set +# CONFIG_PCMCIA_SYM53C500 is not set +CONFIG_SCSI_DH=m +CONFIG_SCSI_DH_RDAC=m +CONFIG_ATA=m +# CONFIG_ATA_NONSTANDARD is not set +CONFIG_ATA_ACPI=y +CONFIG_SATA_PMP=y +CONFIG_SATA_AHCI=m +CONFIG_SATA_SIL24=m +CONFIG_ATA_SFF=y +CONFIG_SATA_SVW=m +CONFIG_ATA_PIIX=m +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_PDC_ADMA=m +CONFIG_SATA_QSTOR=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SX4=m +CONFIG_SATA_SIL=m +CONFIG_SATA_SIS=m +CONFIG_SATA_ULI=m +CONFIG_SATA_VIA=m +CONFIG_SATA_VITESSE=m +CONFIG_SATA_INIC162X=m +# CONFIG_PATA_ACPI is not set +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CS5520 is not set +# CONFIG_PATA_CS5530 is not set +# CONFIG_PATA_CS5535 is not set +# CONFIG_PATA_CS5536 is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_TRIFLEX is not set +CONFIG_PATA_MARVELL=m +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PCMCIA is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RZ1000 is not set +# CONFIG_PATA_SC1200 is not set +# CONFIG_PATA_SERVERWORKS is not set +CONFIG_PATA_PDC2027X=m +CONFIG_PATA_SIL680=m +CONFIG_PATA_SIS=m +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set +# CONFIG_PATA_SCH is not set +CONFIG_ATA_INTEL_COMBINED=y + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID10=m +CONFIG_MD_RAID456=m +CONFIG_MD_RAID5_RESHAPE=y +CONFIG_MD_MULTIPATH=m +CONFIG_MD_FAULTY=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_EMC=m +CONFIG_DM_MULTIPATH_RDAC=m +CONFIG_DM_MULTIPATH_HP=m +CONFIG_DM_RAID45=m +CONFIG_DM_UEVENT=y + +# +# Fusion MPT device support +# +CONFIG_FUSION=y +CONFIG_FUSION_SPI=m +CONFIG_FUSION_FC=m +CONFIG_FUSION_SAS=m +CONFIG_FUSION_MAX_SGE=128 +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m +CONFIG_FUSION_LOGGING=y + +# +# Enable only one of the two stacks, unless you know what you are doing +# +CONFIG_FIREWIRE=m +CONFIG_FIREWIRE_OHCI=m +CONFIG_FIREWIRE_OHCI_DEBUG=y +CONFIG_FIREWIRE_SBP2=m + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +CONFIG_I2O=m +# CONFIG_I2O_LCT_NOTIFY_ON_CHANGES is not set +CONFIG_I2O_EXT_ADAPTEC=y +CONFIG_I2O_EXT_ADAPTEC_DMA64=y +CONFIG_I2O_CONFIG=m +CONFIG_I2O_CONFIG_OLD_IOCTL=y +CONFIG_I2O_BUS=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Network device support +# +CONFIG_NETDEVICES=y +CONFIG_IFB=m +CONFIG_DUMMY=m +CONFIG_BONDING=m +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_NET_SB1000 is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +CONFIG_PHYLIB=m + +# +# MII PHY device drivers +# +CONFIG_MARVELL_PHY=m +CONFIG_DAVICOM_PHY=m +CONFIG_QSEMI_PHY=m +CONFIG_LXT_PHY=m +CONFIG_CICADA_PHY=m +CONFIG_VITESSE_PHY=m +CONFIG_SMSC_PHY=m +CONFIG_FIXED_PHY=m +CONFIG_FIXED_MII_10_FDX=y +CONFIG_FIXED_MII_100_FDX=y + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_CASSINI=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +CONFIG_TULIP_MMIO=y +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_ULI526X=m +CONFIG_PCMCIA_XIRCOM=m +# CONFIG_HP100 is not set +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_B44=m +CONFIG_FORCEDETH=m +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +CONFIG_E100=m +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_RHINE_NAPI=y +CONFIG_NET_POCKET=y +# CONFIG_ATP is not set +# CONFIG_DE600 is not set +# CONFIG_DE620 is not set + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set +CONFIG_DL2K=m +CONFIG_E1000=m +CONFIG_E1000_NAPI=y +# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set +CONFIG_E1000E=m +CONFIG_IGB=m +CONFIG_NS83820=m +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_R8169=m +CONFIG_R8169_VLAN=y +CONFIG_SIS190=m +CONFIG_SKGE=m +CONFIG_SKY2=m +# CONFIG_SK98LIN is not set +CONFIG_VIA_VELOCITY=m +CONFIG_TIGON3=m +CONFIG_BNX2=m +CONFIG_QLA3XXX=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_CHELSIO_T1=m +# CONFIG_CHELSIO_T3 is not set +CONFIG_IXGBE=m +CONFIG_IXGB=m +CONFIG_IXGB_NAPI=y +CONFIG_S2IO=m +CONFIG_S2IO_NAPI=y +CONFIG_MYRI10GE=m +CONFIG_ENIC=m +CONFIG_NETXEN_NIC=m +CONFIG_NIU=m +CONFIG_BNX2X=m +# CONFIG_MLX4_CORE is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +# CONFIG_TMS380TR is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +# CONFIG_STRIP is not set +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +# CONFIG_PCMCIA_RAYCS is not set + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IPW2100=m +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +CONFIG_IPW2200_MONITOR=y +CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_QOS=y +# CONFIG_IPW2200_DEBUG is not set +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_NORTEL_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_PCMCIA_SPECTRUM=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_USB_ZD1201=m +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP_FIRMWARE_NVRAM=y +CONFIG_HOSTAP_PLX=m +CONFIG_HOSTAP_PCI=m +CONFIG_HOSTAP_CS=m +CONFIG_BCM43XX=m +CONFIG_BCM43XX_DEBUG=y +CONFIG_BCM43XX_DMA=y +CONFIG_BCM43XX_PIO=y +CONFIG_BCM43XX_DMA_AND_PIO_MODE=y +# CONFIG_BCM43XX_DMA_MODE is not set +# CONFIG_BCM43XX_PIO_MODE is not set +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_NET_WIRELESS=y +CONFIG_ATH5K=m +# CONFIG_ATH5K_DEBUG is not set +CONFIG_IWLWIFI=m +CONFIG_IWLCORE=m +# CONFIG_IWLWIFI_LEDS is not set +# CONFIG_IWLWIFI_RFKILL is not set +# CONFIG_IWLWIFI_DEBUG is not set +CONFIG_IWLAGN=m +CONFIG_IWLAGN_SPECTRUM_MEASUREMENT=y +# CONFIG_IWLAGN_LEDS is not set +CONFIG_IWL4965=y +CONFIG_IWL5000=y +CONFIG_IWL3945=m +# CONFIG_IWL3945_RFKILL is not set +CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y +# CONFIG_IWL3945_LEDS is not set +# CONFIG_IWL3945_DEBUG is not set +CONFIG_RT2X00=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_PCI=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2400PCI=m +# CONFIG_RT2400PCI_RFKILL is not set +# CONFIG_RT2400PCI_LEDS is not set +CONFIG_RT2500PCI=m +# CONFIG_RT2500PCI_RFKILL is not set +# CONFIG_RT2500PCI_LEDS is not set +CONFIG_RT61PCI=m +# CONFIG_RT61PCI_RFKILL is not set +# CONFIG_RT61PCI_LEDS is not set +CONFIG_RT2500USB=m +# CONFIG_RT2500USB_LEDS is not set +CONFIG_RT73USB=m +# CONFIG_RT73USB_LEDS is not set +# CONFIG_RT2X00_DEBUG is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# ATM drivers +# +# CONFIG_ATM_DUMMY is not set +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_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 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_IA 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_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +# CONFIG_SHAPER is not set +CONFIG_NETCONSOLE=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=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 + +# +# ISDN feature submodules +# +CONFIG_ISDN_DIVERSION=m + +# +# ISDN4Linux hardware drivers +# + +# +# 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 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# 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 + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +# CONFIG_HISAX_HFCUSB is not set +CONFIG_HISAX_HFC4S8S=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# + +# +# Siemens Gigaset +# +CONFIG_ISDN_DRV_GIGASET=m +CONFIG_GIGASET_BASE=m +CONFIG_GIGASET_M105=m +# CONFIG_GIGASET_DEBUG is not set +# CONFIG_GIGASET_UNDOCREQ is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +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 +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=m +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG 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_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_SERIAL=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_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_TWIDJOY=m +# 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_TOUCHSCREEN_ELO=m +CONFIG_TOUCHSCREEN_MTOUCH=m +CONFIG_TOUCHSCREEN_MK712=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_WISTRON_BTNS=m +CONFIG_INPUT_UINPUT=m + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PARKBD is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_RAW=m +CONFIG_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_FM801=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_SERIAL_NONSTANDARD=y +# CONFIG_COMPUTONE is not set +# CONFIG_ROCKETPORT is not set +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_DIGIEPCA is not set +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_SYNCLINK_GT=m +CONFIG_N_HDLC=m +# CONFIG_SPECIALIX is not set +# CONFIG_SX is not set +# CONFIG_RIO is not set +# CONFIG_STALDRV is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_PCI=m +CONFIG_SERIAL_8250_PNP=m +CONFIG_SERIAL_8250_CS=m +CONFIG_SERIAL_8250_NR_UARTS=32 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250_DETECT_IRQ=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=m +CONFIG_SERIAL_JSM=m +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=y +CONFIG_IPMI_PANIC_STRING=y +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 is not set +# CONFIG_ADVANTECH_WDT is not set +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +# CONFIG_SC520_WDT is not set +# CONFIG_EUROTECH_WDT is not set +# CONFIG_IB700_WDT is not set +CONFIG_IBMASR=m +# CONFIG_WAFER_WDT is not set +CONFIG_I6300ESB_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_HP_WATCHDOG=m +# CONFIG_SC1200_WDT is not set +# CONFIG_60XX_WDT is not set +# CONFIG_SBC8360_WDT is not set +# CONFIG_CPU5_WDT is not set +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_W83977F_WDT=m +CONFIG_MACHZ_WDT=m +# CONFIG_SBC_EPX_C3_WATCHDOG is not set + +# +# 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=y +CONFIG_HW_RANDOM_INTEL=m +CONFIG_HW_RANDOM_AMD=m +CONFIG_HW_RANDOM_GEODE=m +CONFIG_HW_RANDOM_VIA=m +CONFIG_NVRAM=y +CONFIG_RTC=y +CONFIG_DTLK=m +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +CONFIG_SONYPI=m + +# +# Ftape, the floppy tape device driver +# +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_NVIDIA=y +CONFIG_AGP_SIS=y +CONFIG_AGP_SWORKS=y +CONFIG_AGP_VIA=y +CONFIG_AGP_EFFICEON=y +CONFIG_DRM=m +# CONFIG_DRM_TDFX is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_I915=m +CONFIG_DRM_MGA=m +# CONFIG_DRM_SIS is not set +CONFIG_DRM_VIA=m +CONFIG_DRM_SAVAGE=m + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +CONFIG_CARDMAN_4000=m +CONFIG_CARDMAN_4040=m +# CONFIG_MWAVE is not set +CONFIG_PC8736x_GPIO=m +CONFIG_NSC_GPIO=m +CONFIG_CS5535_GPIO=m +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=8192 +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +# CONFIG_HPET_MMAP is not set +CONFIG_HANGCHECK_TIMER=m +# CONFIG_TCG_TPM is not set +CONFIG_TELCLOCK=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +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_AMD756_S4882=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +# CONFIG_I2C_OCORES is not set +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +# CONFIG_SCx200_ACB is not set +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_STUB=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m +# CONFIG_I2C_PCA_ISA is not set + +# +# Miscellaneous I2C Chip support +# +CONFIG_SENSORS_DS1337=m +CONFIG_SENSORS_DS1374=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCA9539=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_MAX6875=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 + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=m +CONFIG_HWMON_VID=m +CONFIG_SENSORS_ABITUGURU=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1026=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_K8TEMP=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_ATXP1=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_F71805F=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_FSCPOS=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM63=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_LM87=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_LM92=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_PC87360=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_SMSC47M1=m +CONFIG_SENSORS_SMSC47M192=m +CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_VT8231=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83791D=m +CONFIG_SENSORS_W83792D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m +CONFIG_SENSORS_W83627EHF=m +CONFIG_SENSORS_HDAPS=m +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Misc devices +# +CONFIG_IBM_ASM=m +CONFIG_EEPROM_93CX6=m +CONFIG_HP_ILO=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_V4L2=y + +# +# Video Capture Adapters +# + +# +# Video Capture Adapters +# +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_VIVI is not set +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_SAA6588=m +# 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_CPIA2=m +# 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_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 + +# +# Encoders and Decoders +# +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_TLV320AIC23B=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_CX25840=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_SAA7127=m +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m + +# +# V4L USB devices +# +CONFIG_USB_VIDEO_CLASS=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_24XXX=y +CONFIG_VIDEO_PVRUSB2_SYSFS=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_USBVIDEO=m +CONFIG_USB_VICAM=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_QUICKCAM_MESSENGER=m +CONFIG_USB_ET61X251=m +CONFIG_VIDEO_OVCAMCHIP=m +CONFIG_USB_W9968CF=m +CONFIG_USB_OV511=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_ZC0301=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set + +# +# Radio Adapters +# +# CONFIG_RADIO_GEMTEK_PCI is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_MAESTRO is not set +CONFIG_USB_DSBR=m + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_USB_DABUSB=m + +# +# Graphics support +# +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=y +# CONFIG_FB_HGA is not set +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_NVIDIA=m +CONFIG_FB_NVIDIA_I2C=y +CONFIG_FB_RIVA=m +# CONFIG_FB_RIVA_I2C is not set +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_I810=m +CONFIG_FB_I810_GTF=y +CONFIG_FB_I810_I2C=y +CONFIG_FB_INTEL=m +# CONFIG_FB_INTEL_DEBUG is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +CONFIG_FB_SAVAGE=m +CONFIG_FB_SAVAGE_I2C=y +CONFIG_FB_SAVAGE_ACCEL=y +# CONFIG_FB_SIS 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_CYBLA=m +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_GEODE is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_VGACON_SOFT_SCROLLBACK=y +CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64 +CONFIG_VIDEO_SELECT=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_BACKLIGHT_CLASS_DEVICE=m +CONFIG_BACKLIGHT_DEVICE=y +CONFIG_LCD_CLASS_DEVICE=m +CONFIG_LCD_DEVICE=y + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y +CONFIG_SND_DYNAMIC_MINORS=y +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_VMASTER=y + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +# CONFIG_SND_MTS64 is not set +# CONFIG_SND_SERIAL_U16550 is not set +CONFIG_SND_MPU401=m +# CONFIG_SND_PORTMAN2X4 is not set + +# +# PCI devices +# +CONFIG_SND_AD1889=m +CONFIG_SND_ALS300=m +CONFIG_SND_ALS4000=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_BT87X_OVERCLOCK is not set +CONFIG_SND_CA0106=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_CS4281=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS5535AUDIO=m +CONFIG_SND_DARLA20=m +CONFIG_SND_GINA20=m +CONFIG_SND_LAYLA20=m +CONFIG_SND_DARLA24=m +CONFIG_SND_GINA24=m +CONFIG_SND_LAYLA24=m +CONFIG_SND_MONA=m +CONFIG_SND_MIA=m +CONFIG_SND_ECHO3G=m +CONFIG_SND_INDIGO=m +CONFIG_SND_INDIGOIO=m +CONFIG_SND_INDIGODJ=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_EMU10K1X=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X_BOOL=y +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_HDA_POWER_SAVE=y +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 +CONFIG_SND_HDA_INTEL=m +CONFIG_SND_HDSP=m +CONFIG_SND_HDSPM=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_PCXHR=m +CONFIG_SND_RIPTIDE=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VIA82XX_MODEM=m +CONFIG_SND_VX222=m +CONFIG_SND_YMFPCI=m +# CONFIG_SND_AC97_POWER_SAVE is not set + +# +# USB devices +# +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_USX2Y=m + +# +# PCMCIA devices +# +# CONFIG_SND_VXPOCKET is not set +# CONFIG_SND_PDAUDIOCF is not set + +# +# SoC audio support +# +# CONFIG_SND_SOC is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_AC97_BUS=m + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_ISP116X_HCD=m +CONFIG_USB_OHCI_HCD=m +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_UHCI_HCD=m +CONFIG_USB_SL811_HCD=m +CONFIG_USB_SL811_CS=m + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +CONFIG_USB_HIDINPUT_POWERBOOK=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_ACECAD=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_TOUCHSCREEN=m +CONFIG_USB_TOUCHSCREEN_EGALAX=y +CONFIG_USB_TOUCHSCREEN_PANJIT=y +CONFIG_USB_TOUCHSCREEN_3M=y +CONFIG_USB_TOUCHSCREEN_ITM=y +# CONFIG_USB_YEALINK is not set +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m +CONFIG_USB_ATI_REMOTE2=m +CONFIG_USB_KEYSPAN_REMOTE=m +CONFIG_USB_APPLETOUCH=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m + +# +# USB Network Adapters +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_MON=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_AIRPRIME=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP2101=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_FUNSOFT=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KEYSPAN_MPR=y +CONFIG_USB_SERIAL_KEYSPAN_USA28=y +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_HP4X=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_EMI62=m +CONFIG_USB_EMI26=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +CONFIG_USB_PHIDGETKIT=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_IDMOUSE=m +CONFIG_USB_APPLEDISPLAY=m +CONFIG_USB_SISUSBVGA=m +CONFIG_USB_SISUSBVGA_CON=y +CONFIG_USB_LD=m +CONFIG_USB_TEST=m + +# +# USB DSL modem support +# +CONFIG_USB_ATM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_CXACRU=m +CONFIG_USB_UEAGLEATM=m +CONFIG_USB_XUSBATM=m + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +CONFIG_MMC=m +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_BLOCK=m +CONFIG_MMC_SDHCI=m +CONFIG_MMC_WBSD=m + +# +# LED devices +# +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +# CONFIG_INFINIBAND is not set + +# +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) +# +CONFIG_EDAC=y + +# +# Reporting subsystems +# +# CONFIG_EDAC_DEBUG is not set +CONFIG_EDAC_MM_EDAC=m +CONFIG_EDAC_AMD76X=m +CONFIG_EDAC_E7XXX=m +CONFIG_EDAC_E752X=m +CONFIG_EDAC_I82875P=m +CONFIG_EDAC_I3000=m +CONFIG_EDAC_I5000=m +CONFIG_EDAC_I82860=m +CONFIG_EDAC_K8=m +CONFIG_EDAC_R82600=m +CONFIG_EDAC_POLL=y + +# +# Real Time Clock +# +CONFIG_RTC_LIB=m +CONFIG_RTC_CLASS=m + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=m +CONFIG_RTC_INTF_PROC=m +CONFIG_RTC_INTF_DEV=m +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set + +# +# RTC drivers +# +CONFIG_RTC_DRV_X1205=m +CONFIG_RTC_DRV_DS1307=m +CONFIG_RTC_DRV_DS1553=m +CONFIG_RTC_DRV_ISL1208=m +CONFIG_RTC_DRV_DS1672=m +CONFIG_RTC_DRV_DS1742=m +CONFIG_RTC_DRV_PCF8563=m +CONFIG_RTC_DRV_PCF8583=m +CONFIG_RTC_DRV_RS5C372=m +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_TEST is not set +CONFIG_RTC_DRV_V3020=m + +# +# DMA Engine support +# +CONFIG_DMA_ENGINE=y + +# +# DMA Clients +# +CONFIG_NET_DMA=y + +# +# DMA Devices +# +CONFIG_INTEL_IOATDMA=m + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT2_FS_XIP=y +CONFIG_FS_XIP=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_EXT4DEV_FS=m +CONFIG_EXT4DEV_FS_XATTR=y +CONFIG_EXT4DEV_FS_POSIX_ACL=y +CONFIG_EXT4DEV_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# CONFIG_XFS_FS is not set +CONFIG_GFS2_FS=m +CONFIG_GFS2_FS_LOCKING_NOLOCK=m +CONFIG_GFS2_FS_LOCKING_DLM=m +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_QUOTA=y +# CONFIG_QFMT_V1 is not set +CONFIG_QFMT_V2=y +CONFIG_QUOTACTL=y +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m +# CONFIG_FUSE_FS is not set + +# +# Caches +# +CONFIG_FSCACHE=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=y +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y +CONFIG_CACHEFILES=m +CONFIG_CACHEFILES_DEBUG=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_VMCORE=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +CONFIG_CONFIGFS_FS=m + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +CONFIG_ECRYPT_FS=m +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +# CONFIG_BEFS_FS 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_WRITEBUFFER=y +CONFIG_JFFS2_SUMMARY=y +# CONFIG_JFFS2_FS_XATTR is not set +# 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_SQUASHFS=m +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_SQUASHFS_VMALLOC is not set +CONFIG_VXFS_FS=m +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_NFS_FSCACHE=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_RPCSEC_GSS_SPKM3=m +# CONFIG_SMB_FS is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_DFS_UPCALL=y +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +# CONFIG_LDM_PARTITION is not set +CONFIG_SGI_PARTITION=y +# CONFIG_ULTRIX_PARTITION is not set +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_EFI_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Distributed Lock Manager +# +CONFIG_DLM=m +CONFIG_DLM_DEBUG=y + +# +# Instrumentation Support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m +CONFIG_KPROBES=y + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_PRINTK_TIME is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_SCHEDSTATS=y +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_HIGHMEM=y +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_FS=y +# CONFIG_DEBUG_VM is not set +CONFIG_DEBUG_LIST=y +# CONFIG_FRAME_POINTER is not set +# CONFIG_FORCED_INLINING is not set +CONFIG_BOOT_DELAY=y +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_SAMPLES=y +CONFIG_SAMPLE_MARKERS=m +CONFIG_SAMPLE_TRACEPOINTS=m +CONFIG_EARLY_PRINTK=y +CONFIG_DEBUG_STACKOVERFLOW=y +CONFIG_DEBUG_STACK_USAGE=y +# CONFIG_DEBUG_PAGEALLOC is not set +CONFIG_DEBUG_RODATA=y +# CONFIG_4KSTACKS is not set +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +CONFIG_KEYS=y +CONFIG_KEYS_DEBUG_PROC_KEYS=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_NETWORK_XFRM=y +CONFIG_SECURITY_CAPABILITIES=y +# CONFIG_SECURITY_ROOTPLUG is not set +# CONFIG_SECURITY_SECLVL 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_CHECKREQPROT_VALUE=1 +CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT=y +# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_API=m +CONFIG_CRYPTO_FIPS=y +CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_SEQIV=m +CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_RNG=m +CONFIG_CRYPTO_MANAGER=m +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NHMAC=m +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_TGR192=m +CONFIG_CRYPTO_ECB=m +CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_CTR=m +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_AES_586=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_SIGNATURE=y +CONFIG_CRYPTO_SIGNATURE_DSA=y +CONFIG_CRYPTO_MPILIB=y + +# +# Random Number Generation +# +CONFIG_CRYPTO_ANSI_CPRNG=m + +# +# Hardware crypto devices +# +CONFIG_CRYPTO_DEV_PADLOCK=m +CONFIG_CRYPTO_DEV_PADLOCK_AES=y +CONFIG_XEN=y +CONFIG_XEN_INTERFACE_VERSION=0x00030203 + +# +# XEN +# +CONFIG_XEN_PRIVILEGED_GUEST=y +# CONFIG_XEN_UNPRIVILEGED_GUEST is not set +CONFIG_XEN_PRIVCMD=y +CONFIG_XEN_XENBUS_DEV=y +CONFIG_XEN_BACKEND=y +CONFIG_XEN_BLKDEV_BACKEND=m +CONFIG_XEN_BLKDEV_TAP=m +CONFIG_XEN_NETDEV_BACKEND=m +# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set +CONFIG_XEN_NETDEV_LOOPBACK=m +CONFIG_XEN_PCIDEV_BACKEND=m +CONFIG_XEN_PCIDEV_BACKEND_VPCI=y +# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set +# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set +# CONFIG_XEN_PCIDEV_BE_DEBUG is not set +# CONFIG_XEN_TPMDEV_BACKEND is not set +CONFIG_XEN_BLKDEV_FRONTEND=m +CONFIG_XEN_NETDEV_FRONTEND=m +CONFIG_XEN_FRAMEBUFFER=y +CONFIG_XEN_KEYBOARD=y +CONFIG_XEN_SCRUB_PAGES=y +# CONFIG_XEN_DISABLE_SERIAL is not set +CONFIG_XEN_SYSFS=y +CONFIG_XEN_COMPAT_030002_AND_LATER=y +# CONFIG_XEN_COMPAT_LATEST_ONLY is not set +CONFIG_XEN_COMPAT_030002=y +CONFIG_HAVE_ARCH_ALLOC_SKB=y +CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y +CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y +CONFIG_NO_IDLE_HZ=y +CONFIG_XEN_UTIL=y +CONFIG_XEN_BALLOON=y +CONFIG_XEN_DEVMEM=y +CONFIG_XEN_SKBUFF=y +CONFIG_XEN_REBOOT=y +CONFIG_XEN_SMPBOOT=y + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC16=m +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +CONFIG_LIBCRC32C=y +CONFIG_AUDIT_GENERIC=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_REED_SOLOMON=m +CONFIG_REED_SOLOMON_DEC16=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_X86_SMP=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_X86_TRAMPOLINE=y +CONFIG_X86_NO_TSS=y +CONFIG_X86_NO_IDT=y +CONFIG_KTIME_SCALAR=y diff --git a/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-i686.config b/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-i686.config new file mode 100644 index 0000000..f37a1b7 --- /dev/null +++ b/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-i686.config @@ -0,0 +1,3191 @@ +# i386 +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.18-prep +# Thu Feb 19 13:10:17 2009 +# +CONFIG_X86_32=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_SEMAPHORE_SLEEPERS=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_DMI=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_LOCK_KERNEL=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +# CONFIG_IKCONFIG is not set +CONFIG_CPUSETS=y +CONFIG_RELAY=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +CONFIG_KALLSYMS_EXTRA_PASS=y +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_TRACEPOINTS=y +CONFIG_MARKERS=y +CONFIG_TRACEPROBES=m +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SRCVERSION_ALL=y +CONFIG_MODULE_SIG=y +# CONFIG_MODULE_SIG_FORCE is not set +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Process debugging support +# +CONFIG_PTRACE=y +CONFIG_UTRACE=y + +# +# Block layer +# +CONFIG_LBD=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_LSF=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +CONFIG_DEFAULT_DEADLINE=y +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="deadline" + +# +# Processor type and features +# +CONFIG_SMP=y +# CONFIG_X86_PC is not set +CONFIG_X86_XEN=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +CONFIG_M686=y +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MEFFICEON is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MGEODEGX1 is not set +# CONFIG_MGEODE_LX is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +CONFIG_X86_GENERIC=y +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_CMPXCHG64=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +# CONFIG_TICK_DIVIDER is not set +CONFIG_NR_CPUS=32 +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_VOLUNTARY=y +# CONFIG_PREEMPT is not set +CONFIG_PREEMPT_BKL=y +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_VM86=y +CONFIG_TOSHIBA=m +CONFIG_I8K=m +# CONFIG_X86_REBOOTFIXUPS is not set +CONFIG_MICROCODE=m +CONFIG_X86_CPUID=m +CONFIG_SWIOTLB=y + +# +# Firmware Drivers +# +CONFIG_DELL_RBU=m +CONFIG_DCDBAS=m +CONFIG_ISCSI_IBFT_FIND=y +CONFIG_ISCSI_IBFT=m +# CONFIG_NOHIGHMEM is not set +# CONFIG_HIGHMEM4G is not set +CONFIG_HIGHMEM64G=y +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_HIGHMEM=y +CONFIG_X86_PAE=y +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +CONFIG_RESOURCES_64BIT=y +CONFIG_MTRR=y +CONFIG_REGPARM=y +# CONFIG_SECCOMP is not set +# CONFIG_VGA_NOPROBE is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_KEXEC=y +CONFIG_CRASH_DUMP=y +CONFIG_RELOCATABLE=y +CONFIG_PHYSICAL_ALIGN=0x400000 +CONFIG_HOTPLUG_CPU=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_VIDEO=m +# CONFIG_ACPI_HOTKEY is not set +CONFIG_ACPI_FAN=y +CONFIG_ACPI_DOCK=y +CONFIG_ACPI_BAY=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_ASUS=m +# CONFIG_ACPI_IBM is not set +CONFIG_ACPI_TOSHIBA=m +CONFIG_ACPI_BLACKLIST_YEAR=1999 +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_SYSTEM=y +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_SBS=m +CONFIG_THINKPAD_ACPI=m +# CONFIG_THINKPAD_ACPI_DEBUG is not set +CONFIG_THINKPAD_ACPI_BAY=y +CONFIG_THINKPAD_ACPI_VIDEO=y +CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_CPU_FREQ_DEBUG=y +CONFIG_CPU_FREQ_STAT=m +CONFIG_CPU_FREQ_STAT_DETAILS=y +# 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_GOV_CONSERVATIVE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=m +# CONFIG_X86_POWERNOW_K6 is not set +CONFIG_X86_POWERNOW_K7=y +CONFIG_X86_POWERNOW_K7_ACPI=y +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_POWERNOW_K8_ACPI=y +# CONFIG_X86_GX_SUSPMOD is not set +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +CONFIG_X86_SPEEDSTEP_ICH=y +CONFIG_X86_SPEEDSTEP_SMI=y +CONFIG_X86_P4_CLOCKMOD=m +# CONFIG_X86_CPUFREQ_NFORCE2 is not set +CONFIG_X86_LONGRUN=y +# CONFIG_X86_LONGHAUL is not set + +# +# shared options +# +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +CONFIG_X86_SPEEDSTEP_LIB=y +# CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK is not set + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +# CONFIG_PCI_GOXEN_FE is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_XEN_PCIDEV_FRONTEND=y +# CONFIG_XEN_PCIDEV_FE_DEBUG is not set +CONFIG_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_PCI_DOMAINS=y +# CONFIG_PCI_DEBUG is not set +CONFIG_ISA_DMA_API=y +# CONFIG_SCx200 is not set +CONFIG_K8_NB=y + +# +# PCCARD (PCMCIA/CardBus) support +# +CONFIG_PCCARD=y +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y +CONFIG_CARDBUS=y + +# +# PC-card bridges +# +CONFIG_YENTA=y +CONFIG_YENTA_O2=y +CONFIG_YENTA_RICOH=y +CONFIG_YENTA_TI=y +CONFIG_YENTA_ENE_TUNE=y +CONFIG_YENTA_TOSHIBA=y +CONFIG_PD6729=m +# CONFIG_I82092 is not set +CONFIG_PCCARD_NONSTATIC=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_ACPI_IBM=m +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_SHPC is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_MISC=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_NALGO=m +CONFIG_XFRM_USER=y +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_ASK_IP_FIB_HASH=y +# CONFIG_IP_FIB_TRIE is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_MULTIPATH=y +# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_DIAG=m +CONFIG_INET_TCP_DIAG=m +CONFIG_TCP_CONG_ADVANCED=y + +# +# TCP congestion control +# +CONFIG_TCP_CONG_BIC=y +CONFIG_TCP_CONG_CUBIC=m +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_INET_LRO=y + +# +# 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_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_IPV6_TUNNEL=m +# CONFIG_IPV6_SUBTREES is not set +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_ROUTE_FWMARK=y +CONFIG_NETWORK_SECMARK=y +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_CT_ACCT=y +CONFIG_IP_NF_CONNTRACK_MARK=y +CONFIG_IP_NF_CONNTRACK_SECMARK=y +CONFIG_IP_NF_CONNTRACK_EVENTS=y +CONFIG_IP_NF_CONNTRACK_NETLINK=m +CONFIG_IP_NF_CT_PROTO_SCTP=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_NETBIOS_NS=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_PPTP=m +CONFIG_IP_NF_H323=m +CONFIG_IP_NF_SIP=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_HASHLIMIT=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_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_NAT_PPTP=m +CONFIG_IP_NF_NAT_H323=m +CONFIG_IP_NF_NAT_SIP=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration (EXPERIMENTAL) +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_RAW=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_ULOG=m + +# +# DCCP Configuration (EXPERIMENTAL) +# +CONFIG_IP_DCCP=m +CONFIG_INET_DCCP_DIAG=m +CONFIG_IP_DCCP_ACKVEC=y + +# +# DCCP CCIDs Configuration (EXPERIMENTAL) +# +CONFIG_IP_DCCP_CCID2=m +CONFIG_IP_DCCP_CCID3=m +CONFIG_IP_DCCP_TFRC_LIB=m + +# +# DCCP Kernel Hacking +# +# CONFIG_IP_DCCP_DEBUG is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y + +# +# TIPC Configuration (EXPERIMENTAL) +# +CONFIG_TIPC=m +# CONFIG_TIPC_ADVANCED is not set +# CONFIG_TIPC_DEBUG is not set +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_DECNET is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +# CONFIG_NET_SCH_CLK_JIFFIES is not set +CONFIG_NET_SCH_CLK_GETTIMEOFDAY=y +# CONFIG_NET_SCH_CLK_CPU is not set + +# +# Queueing/Scheduling +# +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_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_STACK=32 +CONFIG_NET_EMATCH_CMP=m +CONFIG_NET_EMATCH_NBYTE=m +CONFIG_NET_EMATCH_U32=m +CONFIG_NET_EMATCH_META=m +CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_CLS_IND=y +CONFIG_NET_ESTIMATOR=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NET_TCPPROBE is not set +# 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_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=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=y +# CONFIG_TUX_DEBUG is not set +CONFIG_NETLABEL=y +CONFIG_FIB_RULES=y + +# +# Wireless +# +CONFIG_CFG80211=m +CONFIG_NL80211=y +CONFIG_WIRELESS_EXT=y +CONFIG_NET_WIRELESS_RTNETLINK=y +CONFIG_MAC80211=m + +# +# Rate control algorithm selection +# +CONFIG_MAC80211_RC_DEFAULT_PID=y +# CONFIG_MAC80211_RC_DEFAULT_NONE is not set + +# +# Selecting 'y' for an algorithm will +# + +# +# build the algorithm into mac80211. +# +CONFIG_MAC80211_RC_DEFAULT="pid" +CONFIG_MAC80211_RC_PID=y +# CONFIG_MAC80211_MESH is not set +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=m +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IEEE80211_SOFTMAC=m +CONFIG_IEEE80211_SOFTMAC_DEBUG=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=m +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_REDBOOT_PARTS=m +CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +CONFIG_MTD_CMDLINE_PARTS=y + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +# CONFIG_INFTL is not set +CONFIG_RFD_FTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_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_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_PNC2000 is not set +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_TS5500=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +CONFIG_MTD_SCB2_FLASH=m +# CONFIG_MTD_NETtel is not set +# CONFIG_MTD_DILNETPC is not set +# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 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_BLOCK2MTD=m + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_ECC_SMC=y +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set +CONFIG_MTD_NAND_NANDSIM=m + +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_SERIAL=m +# CONFIG_PARPORT_PC_FIFO is not set +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +CONFIG_PARPORT_NOT_PC=y +# CONFIG_PARPORT_GSC is not set +# CONFIG_PARPORT_AX88796 is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_PNPACPI=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_BPCK6=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +CONFIG_PARIDE_EPATC8=y +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +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_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=4096 +CONFIG_BLK_DEV_INITRD=y +CONFIG_CDROM_PKTCDVD=m +CONFIG_CDROM_PKTCDVD_BUFFERS=8 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set +CONFIG_ATA_OVER_ETH=m + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +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_IDECD=m +# CONFIG_BLK_DEV_IDETAPE is not set +CONFIG_BLK_DEV_IDEFLOPPY=y +CONFIG_BLK_DEV_IDESCSI=m +CONFIG_IDE_TASK_IOCTL=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +CONFIG_BLK_DEV_CMD640=y +CONFIG_BLK_DEV_CMD640_ENHANCED=y +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_GENERIC=y +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_RZ1000=y +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_AEC62XX=y +CONFIG_BLK_DEV_ALI15X3=y +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=y +CONFIG_BLK_DEV_ATIIXP=y +CONFIG_BLK_DEV_CMD64X=y +CONFIG_BLK_DEV_TRIFLEX=y +# CONFIG_BLK_DEV_CY82C693 is not set +CONFIG_BLK_DEV_CS5520=y +CONFIG_BLK_DEV_CS5530=y +CONFIG_BLK_DEV_CS5535=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_IT821X=y +# CONFIG_BLK_DEV_NS87415 is not set +CONFIG_BLK_DEV_PDC202XX_OLD=y +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=y +CONFIG_BLK_DEV_SVWKS=y +CONFIG_BLK_DEV_SIIMAGE=y +CONFIG_BLK_DEV_SIS5513=y +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +CONFIG_BLK_DEV_VIA82CXXX=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_RAID_ATTRS=m +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +CONFIG_SCSI_NETLINK=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_SD_IOSTATS=y +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m +CONFIG_SCSI_ISCSI_ATTRS=m +CONFIG_SCSI_SAS_ATTRS=m +CONFIG_SCSI_SAS_LIBSAS=m +CONFIG_SCSI_SAS_ATA=y +# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set + +# +# SCSI low-level drivers +# +CONFIG_LIBFC=m +CONFIG_FCOE=m +CONFIG_ISCSI_TCP=m +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_AIC7XXX_CMDS_PER_DEVICE=4 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=4 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# 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_AIC94XX=m +# CONFIG_AIC94XX_DEBUG is not set +# CONFIG_SCSI_DPT_I2O is not set +# CONFIG_SCSI_ADVANSYS is not set +CONFIG_SCSI_ARCMSR=m +CONFIG_MEGARAID_NEWGEN=y +CONFIG_MEGARAID_MM=m +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_HPTIOP=m +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +CONFIG_SCSI_GDTH=m +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_STEX=m +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_MMIO=y +# CONFIG_SCSI_IPR is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_QLA_FC=m +CONFIG_SCSI_QLA_ISCSI=m +CONFIG_SCSI_LPFC=m +CONFIG_SCSI_DC395x=m +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_NSP32 is not set +# CONFIG_SCSI_DEBUG is not set + +# +# PCMCIA SCSI adapter support +# +# CONFIG_PCMCIA_AHA152X is not set +CONFIG_PCMCIA_FDOMAIN=m +# CONFIG_PCMCIA_NINJA_SCSI is not set +# CONFIG_PCMCIA_QLOGIC is not set +# CONFIG_PCMCIA_SYM53C500 is not set +CONFIG_SCSI_DH=m +CONFIG_SCSI_DH_RDAC=m +CONFIG_ATA=m +# CONFIG_ATA_NONSTANDARD is not set +CONFIG_ATA_ACPI=y +CONFIG_SATA_PMP=y +CONFIG_SATA_AHCI=m +CONFIG_SATA_SIL24=m +CONFIG_ATA_SFF=y +CONFIG_SATA_SVW=m +CONFIG_ATA_PIIX=m +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_PDC_ADMA=m +CONFIG_SATA_QSTOR=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SX4=m +CONFIG_SATA_SIL=m +CONFIG_SATA_SIS=m +CONFIG_SATA_ULI=m +CONFIG_SATA_VIA=m +CONFIG_SATA_VITESSE=m +CONFIG_SATA_INIC162X=m +# CONFIG_PATA_ACPI is not set +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CS5520 is not set +# CONFIG_PATA_CS5530 is not set +# CONFIG_PATA_CS5535 is not set +# CONFIG_PATA_CS5536 is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_TRIFLEX is not set +CONFIG_PATA_MARVELL=m +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PCMCIA is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RZ1000 is not set +# CONFIG_PATA_SC1200 is not set +# CONFIG_PATA_SERVERWORKS is not set +CONFIG_PATA_PDC2027X=m +CONFIG_PATA_SIL680=m +CONFIG_PATA_SIS=m +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set +# CONFIG_PATA_SCH is not set +CONFIG_ATA_INTEL_COMBINED=y + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID10=m +CONFIG_MD_RAID456=m +CONFIG_MD_RAID5_RESHAPE=y +CONFIG_MD_MULTIPATH=m +CONFIG_MD_FAULTY=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_EMC=m +CONFIG_DM_MULTIPATH_RDAC=m +CONFIG_DM_MULTIPATH_HP=m +CONFIG_DM_RAID45=m +CONFIG_DM_UEVENT=y + +# +# Fusion MPT device support +# +CONFIG_FUSION=y +CONFIG_FUSION_SPI=m +CONFIG_FUSION_FC=m +CONFIG_FUSION_SAS=m +CONFIG_FUSION_MAX_SGE=128 +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m +CONFIG_FUSION_LOGGING=y + +# +# Enable only one of the two stacks, unless you know what you are doing +# +CONFIG_FIREWIRE=m +CONFIG_FIREWIRE_OHCI=m +CONFIG_FIREWIRE_OHCI_DEBUG=y +CONFIG_FIREWIRE_SBP2=m + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +CONFIG_I2O=m +# CONFIG_I2O_LCT_NOTIFY_ON_CHANGES is not set +CONFIG_I2O_EXT_ADAPTEC=y +CONFIG_I2O_EXT_ADAPTEC_DMA64=y +CONFIG_I2O_CONFIG=m +CONFIG_I2O_CONFIG_OLD_IOCTL=y +CONFIG_I2O_BUS=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Network device support +# +CONFIG_NETDEVICES=y +CONFIG_IFB=m +CONFIG_DUMMY=m +CONFIG_BONDING=m +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_NET_SB1000 is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +CONFIG_PHYLIB=m + +# +# MII PHY device drivers +# +CONFIG_MARVELL_PHY=m +CONFIG_DAVICOM_PHY=m +CONFIG_QSEMI_PHY=m +CONFIG_LXT_PHY=m +CONFIG_CICADA_PHY=m +CONFIG_VITESSE_PHY=m +CONFIG_SMSC_PHY=m +CONFIG_FIXED_PHY=m +CONFIG_FIXED_MII_10_FDX=y +CONFIG_FIXED_MII_100_FDX=y + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_CASSINI=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +CONFIG_TULIP_MMIO=y +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_ULI526X=m +CONFIG_PCMCIA_XIRCOM=m +# CONFIG_HP100 is not set +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_B44=m +CONFIG_FORCEDETH=m +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +CONFIG_E100=m +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_RHINE_NAPI=y +CONFIG_NET_POCKET=y +# CONFIG_ATP is not set +# CONFIG_DE600 is not set +# CONFIG_DE620 is not set + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set +CONFIG_DL2K=m +CONFIG_E1000=m +CONFIG_E1000_NAPI=y +# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set +CONFIG_E1000E=m +CONFIG_IGB=m +CONFIG_NS83820=m +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_R8169=m +CONFIG_R8169_VLAN=y +CONFIG_SIS190=m +CONFIG_SKGE=m +CONFIG_SKY2=m +# CONFIG_SK98LIN is not set +CONFIG_VIA_VELOCITY=m +CONFIG_TIGON3=m +CONFIG_BNX2=m +CONFIG_QLA3XXX=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_CHELSIO_T1=m +# CONFIG_CHELSIO_T3 is not set +CONFIG_IXGBE=m +CONFIG_IXGB=m +CONFIG_IXGB_NAPI=y +CONFIG_S2IO=m +CONFIG_S2IO_NAPI=y +CONFIG_MYRI10GE=m +CONFIG_ENIC=m +CONFIG_NETXEN_NIC=m +CONFIG_NIU=m +CONFIG_BNX2X=m +# CONFIG_MLX4_CORE is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +# CONFIG_TMS380TR is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +# CONFIG_STRIP is not set +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +# CONFIG_PCMCIA_RAYCS is not set + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IPW2100=m +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +CONFIG_IPW2200_MONITOR=y +CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_QOS=y +# CONFIG_IPW2200_DEBUG is not set +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_NORTEL_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_PCMCIA_SPECTRUM=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_USB_ZD1201=m +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP_FIRMWARE_NVRAM=y +CONFIG_HOSTAP_PLX=m +CONFIG_HOSTAP_PCI=m +CONFIG_HOSTAP_CS=m +CONFIG_BCM43XX=m +CONFIG_BCM43XX_DEBUG=y +CONFIG_BCM43XX_DMA=y +CONFIG_BCM43XX_PIO=y +CONFIG_BCM43XX_DMA_AND_PIO_MODE=y +# CONFIG_BCM43XX_DMA_MODE is not set +# CONFIG_BCM43XX_PIO_MODE is not set +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_NET_WIRELESS=y +CONFIG_ATH5K=m +# CONFIG_ATH5K_DEBUG is not set +CONFIG_IWLWIFI=m +CONFIG_IWLCORE=m +# CONFIG_IWLWIFI_LEDS is not set +# CONFIG_IWLWIFI_RFKILL is not set +# CONFIG_IWLWIFI_DEBUG is not set +CONFIG_IWLAGN=m +CONFIG_IWLAGN_SPECTRUM_MEASUREMENT=y +# CONFIG_IWLAGN_LEDS is not set +CONFIG_IWL4965=y +CONFIG_IWL5000=y +CONFIG_IWL3945=m +# CONFIG_IWL3945_RFKILL is not set +CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y +# CONFIG_IWL3945_LEDS is not set +# CONFIG_IWL3945_DEBUG is not set +CONFIG_RT2X00=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_PCI=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2400PCI=m +# CONFIG_RT2400PCI_RFKILL is not set +# CONFIG_RT2400PCI_LEDS is not set +CONFIG_RT2500PCI=m +# CONFIG_RT2500PCI_RFKILL is not set +# CONFIG_RT2500PCI_LEDS is not set +CONFIG_RT61PCI=m +# CONFIG_RT61PCI_RFKILL is not set +# CONFIG_RT61PCI_LEDS is not set +CONFIG_RT2500USB=m +# CONFIG_RT2500USB_LEDS is not set +CONFIG_RT73USB=m +# CONFIG_RT73USB_LEDS is not set +# CONFIG_RT2X00_DEBUG is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# ATM drivers +# +# CONFIG_ATM_DUMMY is not set +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_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 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_IA 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_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +# CONFIG_SHAPER is not set +CONFIG_NETCONSOLE=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=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 + +# +# ISDN feature submodules +# +CONFIG_ISDN_DIVERSION=m + +# +# ISDN4Linux hardware drivers +# + +# +# 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 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# 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 + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +# CONFIG_HISAX_HFCUSB is not set +CONFIG_HISAX_HFC4S8S=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# + +# +# Siemens Gigaset +# +CONFIG_ISDN_DRV_GIGASET=m +CONFIG_GIGASET_BASE=m +CONFIG_GIGASET_M105=m +# CONFIG_GIGASET_DEBUG is not set +# CONFIG_GIGASET_UNDOCREQ is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +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 +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=m +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG 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_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_SERIAL=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_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_TWIDJOY=m +# 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_TOUCHSCREEN_ELO=m +CONFIG_TOUCHSCREEN_MTOUCH=m +CONFIG_TOUCHSCREEN_MK712=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_WISTRON_BTNS=m +CONFIG_INPUT_UINPUT=m + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PARKBD is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_RAW=m +CONFIG_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_FM801=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_SERIAL_NONSTANDARD=y +# CONFIG_COMPUTONE is not set +# CONFIG_ROCKETPORT is not set +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_DIGIEPCA is not set +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_SYNCLINK_GT=m +CONFIG_N_HDLC=m +# CONFIG_SPECIALIX is not set +# CONFIG_SX is not set +# CONFIG_RIO is not set +# CONFIG_STALDRV is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_PCI=m +CONFIG_SERIAL_8250_PNP=m +CONFIG_SERIAL_8250_CS=m +CONFIG_SERIAL_8250_NR_UARTS=32 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250_DETECT_IRQ=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=m +CONFIG_SERIAL_JSM=m +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=y +CONFIG_IPMI_PANIC_STRING=y +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 is not set +# CONFIG_ADVANTECH_WDT is not set +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +# CONFIG_SC520_WDT is not set +# CONFIG_EUROTECH_WDT is not set +# CONFIG_IB700_WDT is not set +CONFIG_IBMASR=m +# CONFIG_WAFER_WDT is not set +CONFIG_I6300ESB_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_HP_WATCHDOG=m +# CONFIG_SC1200_WDT is not set +# CONFIG_60XX_WDT is not set +# CONFIG_SBC8360_WDT is not set +# CONFIG_CPU5_WDT is not set +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_W83977F_WDT=m +CONFIG_MACHZ_WDT=m +# CONFIG_SBC_EPX_C3_WATCHDOG is not set + +# +# 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=y +CONFIG_HW_RANDOM_INTEL=m +CONFIG_HW_RANDOM_AMD=m +CONFIG_HW_RANDOM_GEODE=m +CONFIG_HW_RANDOM_VIA=m +CONFIG_NVRAM=y +CONFIG_RTC=y +CONFIG_DTLK=m +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set +CONFIG_SONYPI=m + +# +# Ftape, the floppy tape device driver +# +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_NVIDIA=y +CONFIG_AGP_SIS=y +CONFIG_AGP_SWORKS=y +CONFIG_AGP_VIA=y +CONFIG_AGP_EFFICEON=y +CONFIG_DRM=m +# CONFIG_DRM_TDFX is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_I915=m +CONFIG_DRM_MGA=m +# CONFIG_DRM_SIS is not set +CONFIG_DRM_VIA=m +CONFIG_DRM_SAVAGE=m + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +CONFIG_CARDMAN_4000=m +CONFIG_CARDMAN_4040=m +# CONFIG_MWAVE is not set +CONFIG_PC8736x_GPIO=m +CONFIG_NSC_GPIO=m +CONFIG_CS5535_GPIO=m +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=8192 +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +# CONFIG_HPET_MMAP is not set +CONFIG_HANGCHECK_TIMER=m +# CONFIG_TCG_TPM is not set +CONFIG_TELCLOCK=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +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_AMD756_S4882=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +# CONFIG_I2C_OCORES is not set +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +# CONFIG_SCx200_ACB is not set +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_STUB=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m +# CONFIG_I2C_PCA_ISA is not set + +# +# Miscellaneous I2C Chip support +# +CONFIG_SENSORS_DS1337=m +CONFIG_SENSORS_DS1374=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCA9539=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_MAX6875=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 + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=m +CONFIG_HWMON_VID=m +CONFIG_SENSORS_ABITUGURU=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1026=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_K8TEMP=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_ATXP1=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_F71805F=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_FSCPOS=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM63=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_LM87=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_LM92=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_PC87360=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_SMSC47M1=m +CONFIG_SENSORS_SMSC47M192=m +CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_VT8231=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83791D=m +CONFIG_SENSORS_W83792D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m +CONFIG_SENSORS_W83627EHF=m +CONFIG_SENSORS_HDAPS=m +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Misc devices +# +CONFIG_IBM_ASM=m +CONFIG_EEPROM_93CX6=m +CONFIG_HP_ILO=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_V4L2=y + +# +# Video Capture Adapters +# + +# +# Video Capture Adapters +# +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_VIVI is not set +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_SAA6588=m +# 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_CPIA2=m +# 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_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 + +# +# Encoders and Decoders +# +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_TLV320AIC23B=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_CX25840=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_SAA7127=m +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m + +# +# V4L USB devices +# +CONFIG_USB_VIDEO_CLASS=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_24XXX=y +CONFIG_VIDEO_PVRUSB2_SYSFS=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_USBVIDEO=m +CONFIG_USB_VICAM=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_QUICKCAM_MESSENGER=m +CONFIG_USB_ET61X251=m +CONFIG_VIDEO_OVCAMCHIP=m +CONFIG_USB_W9968CF=m +CONFIG_USB_OV511=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_ZC0301=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set + +# +# Radio Adapters +# +# CONFIG_RADIO_GEMTEK_PCI is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_MAESTRO is not set +CONFIG_USB_DSBR=m + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_USB_DABUSB=m + +# +# Graphics support +# +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=y +# CONFIG_FB_HGA is not set +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_NVIDIA=m +CONFIG_FB_NVIDIA_I2C=y +CONFIG_FB_RIVA=m +# CONFIG_FB_RIVA_I2C is not set +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_I810=m +CONFIG_FB_I810_GTF=y +CONFIG_FB_I810_I2C=y +CONFIG_FB_INTEL=m +# CONFIG_FB_INTEL_DEBUG is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +CONFIG_FB_SAVAGE=m +CONFIG_FB_SAVAGE_I2C=y +CONFIG_FB_SAVAGE_ACCEL=y +# CONFIG_FB_SIS 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_CYBLA=m +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_GEODE is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_VGACON_SOFT_SCROLLBACK=y +CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64 +CONFIG_VIDEO_SELECT=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_BACKLIGHT_CLASS_DEVICE=m +CONFIG_BACKLIGHT_DEVICE=y +CONFIG_LCD_CLASS_DEVICE=m +CONFIG_LCD_DEVICE=y + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y +CONFIG_SND_DYNAMIC_MINORS=y +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_VMASTER=y + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +# CONFIG_SND_MTS64 is not set +# CONFIG_SND_SERIAL_U16550 is not set +CONFIG_SND_MPU401=m +# CONFIG_SND_PORTMAN2X4 is not set + +# +# PCI devices +# +CONFIG_SND_AD1889=m +CONFIG_SND_ALS300=m +CONFIG_SND_ALS4000=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_BT87X_OVERCLOCK is not set +CONFIG_SND_CA0106=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_CS4281=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS5535AUDIO=m +CONFIG_SND_DARLA20=m +CONFIG_SND_GINA20=m +CONFIG_SND_LAYLA20=m +CONFIG_SND_DARLA24=m +CONFIG_SND_GINA24=m +CONFIG_SND_LAYLA24=m +CONFIG_SND_MONA=m +CONFIG_SND_MIA=m +CONFIG_SND_ECHO3G=m +CONFIG_SND_INDIGO=m +CONFIG_SND_INDIGOIO=m +CONFIG_SND_INDIGODJ=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_EMU10K1X=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X_BOOL=y +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_HDA_POWER_SAVE=y +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 +CONFIG_SND_HDA_INTEL=m +CONFIG_SND_HDSP=m +CONFIG_SND_HDSPM=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_PCXHR=m +CONFIG_SND_RIPTIDE=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VIA82XX_MODEM=m +CONFIG_SND_VX222=m +CONFIG_SND_YMFPCI=m +# CONFIG_SND_AC97_POWER_SAVE is not set + +# +# USB devices +# +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_USX2Y=m + +# +# PCMCIA devices +# +# CONFIG_SND_VXPOCKET is not set +# CONFIG_SND_PDAUDIOCF is not set + +# +# SoC audio support +# +# CONFIG_SND_SOC is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_AC97_BUS=m + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_ISP116X_HCD=m +CONFIG_USB_OHCI_HCD=m +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_UHCI_HCD=m +CONFIG_USB_SL811_HCD=m +CONFIG_USB_SL811_CS=m + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +CONFIG_USB_HIDINPUT_POWERBOOK=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_ACECAD=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_TOUCHSCREEN=m +CONFIG_USB_TOUCHSCREEN_EGALAX=y +CONFIG_USB_TOUCHSCREEN_PANJIT=y +CONFIG_USB_TOUCHSCREEN_3M=y +CONFIG_USB_TOUCHSCREEN_ITM=y +# CONFIG_USB_YEALINK is not set +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m +CONFIG_USB_ATI_REMOTE2=m +CONFIG_USB_KEYSPAN_REMOTE=m +CONFIG_USB_APPLETOUCH=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m + +# +# USB Network Adapters +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_MON=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_AIRPRIME=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP2101=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_FUNSOFT=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KEYSPAN_MPR=y +CONFIG_USB_SERIAL_KEYSPAN_USA28=y +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_HP4X=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_EMI62=m +CONFIG_USB_EMI26=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +CONFIG_USB_PHIDGETKIT=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_IDMOUSE=m +CONFIG_USB_APPLEDISPLAY=m +CONFIG_USB_SISUSBVGA=m +CONFIG_USB_SISUSBVGA_CON=y +CONFIG_USB_LD=m +CONFIG_USB_TEST=m + +# +# USB DSL modem support +# +CONFIG_USB_ATM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_CXACRU=m +CONFIG_USB_UEAGLEATM=m +CONFIG_USB_XUSBATM=m + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +CONFIG_MMC=m +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_BLOCK=m +CONFIG_MMC_SDHCI=m +CONFIG_MMC_WBSD=m + +# +# LED devices +# +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +# CONFIG_INFINIBAND is not set + +# +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) +# +CONFIG_EDAC=y + +# +# Reporting subsystems +# +# CONFIG_EDAC_DEBUG is not set +CONFIG_EDAC_MM_EDAC=m +CONFIG_EDAC_AMD76X=m +CONFIG_EDAC_E7XXX=m +CONFIG_EDAC_E752X=m +CONFIG_EDAC_I82875P=m +CONFIG_EDAC_I3000=m +CONFIG_EDAC_I5000=m +CONFIG_EDAC_I82860=m +CONFIG_EDAC_K8=m +CONFIG_EDAC_R82600=m +CONFIG_EDAC_POLL=y + +# +# Real Time Clock +# +CONFIG_RTC_LIB=m +CONFIG_RTC_CLASS=m + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=m +CONFIG_RTC_INTF_PROC=m +CONFIG_RTC_INTF_DEV=m +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set + +# +# RTC drivers +# +CONFIG_RTC_DRV_X1205=m +CONFIG_RTC_DRV_DS1307=m +CONFIG_RTC_DRV_DS1553=m +CONFIG_RTC_DRV_ISL1208=m +CONFIG_RTC_DRV_DS1672=m +CONFIG_RTC_DRV_DS1742=m +CONFIG_RTC_DRV_PCF8563=m +CONFIG_RTC_DRV_PCF8583=m +CONFIG_RTC_DRV_RS5C372=m +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_TEST is not set +CONFIG_RTC_DRV_V3020=m + +# +# DMA Engine support +# +CONFIG_DMA_ENGINE=y + +# +# DMA Clients +# +CONFIG_NET_DMA=y + +# +# DMA Devices +# +CONFIG_INTEL_IOATDMA=m + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT2_FS_XIP=y +CONFIG_FS_XIP=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_EXT4DEV_FS=m +CONFIG_EXT4DEV_FS_XATTR=y +CONFIG_EXT4DEV_FS_POSIX_ACL=y +CONFIG_EXT4DEV_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# CONFIG_XFS_FS is not set +CONFIG_GFS2_FS=m +CONFIG_GFS2_FS_LOCKING_NOLOCK=m +CONFIG_GFS2_FS_LOCKING_DLM=m +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_QUOTA=y +# CONFIG_QFMT_V1 is not set +CONFIG_QFMT_V2=y +CONFIG_QUOTACTL=y +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m +# CONFIG_FUSE_FS is not set + +# +# Caches +# +CONFIG_FSCACHE=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=y +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y +CONFIG_CACHEFILES=m +CONFIG_CACHEFILES_DEBUG=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_VMCORE=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +CONFIG_CONFIGFS_FS=m + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +CONFIG_ECRYPT_FS=m +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +# CONFIG_BEFS_FS 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_WRITEBUFFER=y +CONFIG_JFFS2_SUMMARY=y +# CONFIG_JFFS2_FS_XATTR is not set +# 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_SQUASHFS=m +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_SQUASHFS_VMALLOC is not set +CONFIG_VXFS_FS=m +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_NFS_FSCACHE=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_RPCSEC_GSS_SPKM3=m +# CONFIG_SMB_FS is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_DFS_UPCALL=y +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +# CONFIG_LDM_PARTITION is not set +CONFIG_SGI_PARTITION=y +# CONFIG_ULTRIX_PARTITION is not set +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_EFI_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Distributed Lock Manager +# +CONFIG_DLM=m +CONFIG_DLM_DEBUG=y + +# +# Instrumentation Support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m +CONFIG_KPROBES=y + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_PRINTK_TIME is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_SCHEDSTATS=y +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_HIGHMEM=y +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_FS=y +# CONFIG_DEBUG_VM is not set +CONFIG_DEBUG_LIST=y +# CONFIG_FRAME_POINTER is not set +# CONFIG_FORCED_INLINING is not set +CONFIG_BOOT_DELAY=y +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_SAMPLES=y +CONFIG_SAMPLE_MARKERS=m +CONFIG_SAMPLE_TRACEPOINTS=m +CONFIG_EARLY_PRINTK=y +CONFIG_DEBUG_STACKOVERFLOW=y +CONFIG_DEBUG_STACK_USAGE=y +# CONFIG_DEBUG_PAGEALLOC is not set +CONFIG_DEBUG_RODATA=y +# CONFIG_4KSTACKS is not set +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +CONFIG_KEYS=y +CONFIG_KEYS_DEBUG_PROC_KEYS=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_NETWORK_XFRM=y +CONFIG_SECURITY_CAPABILITIES=y +# CONFIG_SECURITY_ROOTPLUG is not set +# CONFIG_SECURITY_SECLVL 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_CHECKREQPROT_VALUE=1 +CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT=y +# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_API=m +CONFIG_CRYPTO_FIPS=y +CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_SEQIV=m +CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_RNG=m +CONFIG_CRYPTO_MANAGER=m +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NHMAC=m +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_TGR192=m +CONFIG_CRYPTO_ECB=m +CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_CTR=m +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_AES_586=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_SIGNATURE=y +CONFIG_CRYPTO_SIGNATURE_DSA=y +CONFIG_CRYPTO_MPILIB=y + +# +# Random Number Generation +# +CONFIG_CRYPTO_ANSI_CPRNG=m + +# +# Hardware crypto devices +# +CONFIG_CRYPTO_DEV_PADLOCK=m +CONFIG_CRYPTO_DEV_PADLOCK_AES=y +CONFIG_XEN=y +CONFIG_XEN_INTERFACE_VERSION=0x00030203 + +# +# XEN +# +CONFIG_XEN_PRIVILEGED_GUEST=y +# CONFIG_XEN_UNPRIVILEGED_GUEST is not set +CONFIG_XEN_PRIVCMD=y +CONFIG_XEN_XENBUS_DEV=y +CONFIG_XEN_BACKEND=y +CONFIG_XEN_BLKDEV_BACKEND=m +CONFIG_XEN_BLKDEV_TAP=m +CONFIG_XEN_NETDEV_BACKEND=m +# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set +CONFIG_XEN_NETDEV_LOOPBACK=m +CONFIG_XEN_PCIDEV_BACKEND=m +CONFIG_XEN_PCIDEV_BACKEND_VPCI=y +# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set +# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set +# CONFIG_XEN_PCIDEV_BE_DEBUG is not set +# CONFIG_XEN_TPMDEV_BACKEND is not set +CONFIG_XEN_BLKDEV_FRONTEND=m +CONFIG_XEN_NETDEV_FRONTEND=m +CONFIG_XEN_FRAMEBUFFER=y +CONFIG_XEN_KEYBOARD=y +CONFIG_XEN_SCRUB_PAGES=y +# CONFIG_XEN_DISABLE_SERIAL is not set +CONFIG_XEN_SYSFS=y +CONFIG_XEN_COMPAT_030002_AND_LATER=y +# CONFIG_XEN_COMPAT_LATEST_ONLY is not set +CONFIG_XEN_COMPAT_030002=y +CONFIG_HAVE_ARCH_ALLOC_SKB=y +CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y +CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y +CONFIG_NO_IDLE_HZ=y +CONFIG_XEN_UTIL=y +CONFIG_XEN_BALLOON=y +CONFIG_XEN_DEVMEM=y +CONFIG_XEN_SKBUFF=y +CONFIG_XEN_REBOOT=y +CONFIG_XEN_SMPBOOT=y + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC16=m +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +CONFIG_LIBCRC32C=y +CONFIG_AUDIT_GENERIC=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_REED_SOLOMON=m +CONFIG_REED_SOLOMON_DEC16=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_X86_SMP=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_X86_TRAMPOLINE=y +CONFIG_X86_NO_TSS=y +CONFIG_X86_NO_IDT=y +CONFIG_KTIME_SCALAR=y diff --git a/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-x86_64-smp.config b/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-x86_64-smp.config new file mode 100644 index 0000000..9729ec7 --- /dev/null +++ b/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-x86_64-smp.config @@ -0,0 +1,3079 @@ +# x86_64 +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.18-prep +# Wed Mar 25 15:13:26 2009 +# +CONFIG_X86_64=y +CONFIG_64BIT=y +CONFIG_X86=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_SEMAPHORE_SLEEPERS=y +CONFIG_MMU=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_X86_CMPXCHG=y +CONFIG_EARLY_PRINTK=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_DMI=y +CONFIG_AUDIT_ARCH=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_LOCK_KERNEL=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +# CONFIG_IKCONFIG is not set +CONFIG_CPUSETS=y +CONFIG_RELAY=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +CONFIG_KALLSYMS_EXTRA_PASS=y +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_TRACEPOINTS=y +CONFIG_MARKERS=y +CONFIG_TRACEPROBES=m +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SRCVERSION_ALL=y +CONFIG_MODULE_SIG=y +# CONFIG_MODULE_SIG_FORCE is not set +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Process debugging support +# +CONFIG_PTRACE=y +CONFIG_UTRACE=y + +# +# Block layer +# +CONFIG_LBD=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_LSF=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +CONFIG_DEFAULT_DEADLINE=y +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="deadline" + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_VSMP is not set +# CONFIG_MK8 is not set +# CONFIG_MPSC is not set +CONFIG_GENERIC_CPU=y +CONFIG_X86_64_XEN=y +CONFIG_X86_NO_TSS=y +CONFIG_X86_NO_IDT=y +CONFIG_X86_L1_CACHE_BYTES=128 +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_X86_INTERNODE_CACHE_BYTES=128 +CONFIG_X86_GOOD_APIC=y +CONFIG_MICROCODE=m +CONFIG_X86_MSR=y +CONFIG_X86_CPUID=y +# CONFIG_EFI is not set +CONFIG_X86_IO_APIC=y +CONFIG_X86_XEN_GENAPIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_MTRR=y +CONFIG_SMP=y +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_VOLUNTARY=y +# CONFIG_PREEMPT is not set +CONFIG_PREEMPT_BKL=y +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_ARCH_FLATMEM_ENABLE=y +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +CONFIG_RESOURCES_64BIT=y +CONFIG_NR_CPUS=255 +CONFIG_HOTPLUG_CPU=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_TRACK_DIRTY_PAGES=y +# CONFIG_TICK_DIVIDER is not set +# CONFIG_CALGARY_IOMMU is not set +CONFIG_AMD_IOMMU=y +CONFIG_IOMMU_HELPER=y +CONFIG_SWIOTLB=y +CONFIG_KEXEC=y +CONFIG_CRASH_DUMP=y +# CONFIG_SECCOMP is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_REORDER=y +CONFIG_K8_NB=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_ISA_DMA_API=y +CONFIG_GENERIC_PENDING_IRQ=y + +# +# Power management options +# +CONFIG_PM=y + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_VIDEO=m +# CONFIG_ACPI_HOTKEY is not set +CONFIG_ACPI_FAN=y +CONFIG_ACPI_DOCK=y +CONFIG_ACPI_BAY=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_ASUS=m +# CONFIG_ACPI_IBM is not set +CONFIG_ACPI_TOSHIBA=m +CONFIG_ACPI_BLACKLIST_YEAR=0 +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_SYSTEM=y +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_SBS=m +CONFIG_THINKPAD_ACPI=m +# CONFIG_THINKPAD_ACPI_DEBUG is not set +CONFIG_THINKPAD_ACPI_BAY=y +CONFIG_THINKPAD_ACPI_VIDEO=y +CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=m +CONFIG_CPU_FREQ_DEBUG=y +CONFIG_CPU_FREQ_STAT=m +CONFIG_CPU_FREQ_STAT_DETAILS=y +# 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_GOV_CONSERVATIVE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_POWERNOW_K8_ACPI=y +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_ACPI_CPUFREQ=m + +# +# shared options +# +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +# CONFIG_X86_SPEEDSTEP_LIB is not set + +# +# Bus options (PCI etc.) +# +CONFIG_PCI=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_XEN_PCIDEV_FRONTEND=y +# CONFIG_XEN_PCIDEV_FE_DEBUG is not set +CONFIG_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_PCI_DOMAINS=y +# CONFIG_PCI_DEBUG is not set + +# +# PCCARD (PCMCIA/CardBus) support +# +CONFIG_PCCARD=y +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y +CONFIG_CARDBUS=y + +# +# PC-card bridges +# +CONFIG_YENTA=y +CONFIG_YENTA_O2=y +CONFIG_YENTA_RICOH=y +CONFIG_YENTA_TI=y +CONFIG_YENTA_ENE_TUNE=y +CONFIG_YENTA_TOSHIBA=y +CONFIG_PD6729=m +# CONFIG_I82092 is not set +CONFIG_PCCARD_NONSTATIC=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_ACPI_IBM=m +# CONFIG_HOTPLUG_PCI_CPCI 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_MISC=y +CONFIG_IA32_EMULATION=y +# CONFIG_IA32_AOUT is not set +CONFIG_COMPAT=y +CONFIG_SYSVIPC_COMPAT=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_NALGO=m +CONFIG_XFRM_USER=y +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_ASK_IP_FIB_HASH=y +# CONFIG_IP_FIB_TRIE is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_MULTIPATH=y +# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_DIAG=m +CONFIG_INET_TCP_DIAG=m +CONFIG_TCP_CONG_ADVANCED=y + +# +# TCP congestion control +# +CONFIG_TCP_CONG_BIC=y +CONFIG_TCP_CONG_CUBIC=m +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_INET_LRO=y + +# +# 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_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_IPV6_TUNNEL=m +# CONFIG_IPV6_SUBTREES is not set +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_ROUTE_FWMARK=y +CONFIG_NETWORK_SECMARK=y +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_CT_ACCT=y +CONFIG_IP_NF_CONNTRACK_MARK=y +CONFIG_IP_NF_CONNTRACK_SECMARK=y +CONFIG_IP_NF_CONNTRACK_EVENTS=y +CONFIG_IP_NF_CONNTRACK_NETLINK=m +CONFIG_IP_NF_CT_PROTO_SCTP=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_NETBIOS_NS=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_PPTP=m +CONFIG_IP_NF_H323=m +CONFIG_IP_NF_SIP=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_HASHLIMIT=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_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_NAT_PPTP=m +CONFIG_IP_NF_NAT_H323=m +CONFIG_IP_NF_NAT_SIP=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration (EXPERIMENTAL) +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_RAW=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_ULOG=m + +# +# DCCP Configuration (EXPERIMENTAL) +# +CONFIG_IP_DCCP=m +CONFIG_INET_DCCP_DIAG=m +CONFIG_IP_DCCP_ACKVEC=y + +# +# DCCP CCIDs Configuration (EXPERIMENTAL) +# +CONFIG_IP_DCCP_CCID2=m +CONFIG_IP_DCCP_CCID3=m +CONFIG_IP_DCCP_TFRC_LIB=m + +# +# DCCP Kernel Hacking +# +# CONFIG_IP_DCCP_DEBUG is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y + +# +# TIPC Configuration (EXPERIMENTAL) +# +CONFIG_TIPC=m +# CONFIG_TIPC_ADVANCED is not set +# CONFIG_TIPC_DEBUG is not set +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_DECNET is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +# CONFIG_NET_SCH_CLK_JIFFIES is not set +CONFIG_NET_SCH_CLK_GETTIMEOFDAY=y +# CONFIG_NET_SCH_CLK_CPU is not set + +# +# Queueing/Scheduling +# +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_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_STACK=32 +CONFIG_NET_EMATCH_CMP=m +CONFIG_NET_EMATCH_NBYTE=m +CONFIG_NET_EMATCH_U32=m +CONFIG_NET_EMATCH_META=m +CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_CLS_IND=y +CONFIG_NET_ESTIMATOR=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NET_TCPPROBE is not set +# 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_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=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=y +# CONFIG_TUX_DEBUG is not set +CONFIG_NETLABEL=y +CONFIG_FIB_RULES=y + +# +# Wireless +# +CONFIG_CFG80211=m +CONFIG_NL80211=y +CONFIG_WIRELESS_EXT=y +CONFIG_NET_WIRELESS_RTNETLINK=y +CONFIG_MAC80211=m + +# +# Rate control algorithm selection +# +CONFIG_MAC80211_RC_DEFAULT_PID=y +# CONFIG_MAC80211_RC_DEFAULT_NONE is not set + +# +# Selecting 'y' for an algorithm will +# + +# +# build the algorithm into mac80211. +# +CONFIG_MAC80211_RC_DEFAULT="pid" +CONFIG_MAC80211_RC_PID=y +# CONFIG_MAC80211_MESH is not set +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=m +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IEEE80211_SOFTMAC=m +CONFIG_IEEE80211_SOFTMAC_DEBUG=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=m +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_REDBOOT_PARTS=m +CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +CONFIG_MTD_CMDLINE_PARTS=y + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +# CONFIG_INFTL is not set +CONFIG_RFD_FTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_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_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_PNC2000 is not set +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_TS5500=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +CONFIG_MTD_SCB2_FLASH=m +# CONFIG_MTD_NETtel is not set +# CONFIG_MTD_DILNETPC is not set +# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 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_BLOCK2MTD=m + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_ECC_SMC=y +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set +CONFIG_MTD_NAND_NANDSIM=m + +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_SERIAL=m +# CONFIG_PARPORT_PC_FIFO is not set +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +CONFIG_PARPORT_NOT_PC=y +# CONFIG_PARPORT_GSC is not set +# CONFIG_PARPORT_AX88796 is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_PNPACPI=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +CONFIG_PARIDE_EPATC8=y +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +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_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=4096 +CONFIG_BLK_DEV_INITRD=y +CONFIG_CDROM_PKTCDVD=m +CONFIG_CDROM_PKTCDVD_BUFFERS=8 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set +CONFIG_ATA_OVER_ETH=m + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +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_IDECD=m +# CONFIG_BLK_DEV_IDETAPE is not set +CONFIG_BLK_DEV_IDEFLOPPY=y +CONFIG_BLK_DEV_IDESCSI=m +CONFIG_IDE_TASK_IOCTL=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +# CONFIG_BLK_DEV_CMD640 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_GENERIC=y +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_AEC62XX=y +CONFIG_BLK_DEV_ALI15X3=y +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=y +CONFIG_BLK_DEV_ATIIXP=y +CONFIG_BLK_DEV_CMD64X=y +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +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_IT821X=y +# CONFIG_BLK_DEV_NS87415 is not set +CONFIG_BLK_DEV_PDC202XX_OLD=y +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=y +CONFIG_BLK_DEV_SVWKS=y +CONFIG_BLK_DEV_SIIMAGE=y +CONFIG_BLK_DEV_SIS5513=y +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +CONFIG_BLK_DEV_VIA82CXXX=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_RAID_ATTRS=m +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +CONFIG_SCSI_NETLINK=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_SD_IOSTATS=y +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m +CONFIG_SCSI_ISCSI_ATTRS=m +CONFIG_SCSI_SAS_ATTRS=m +CONFIG_SCSI_SAS_LIBSAS=m +CONFIG_SCSI_SAS_ATA=y +# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set + +# +# SCSI low-level drivers +# +CONFIG_LIBFC=m +CONFIG_FCOE=m +CONFIG_ISCSI_TCP=m +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_AIC7XXX_CMDS_PER_DEVICE=4 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=4 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# 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_AIC94XX=m +# CONFIG_AIC94XX_DEBUG is not set +CONFIG_SCSI_ARCMSR=m +CONFIG_MEGARAID_NEWGEN=y +CONFIG_MEGARAID_MM=m +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_HPTIOP=m +# CONFIG_SCSI_BUSLOGIC is not set +CONFIG_FCOE_FNIC=m +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +CONFIG_SCSI_GDTH=m +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_STEX=m +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_MMIO=y +# CONFIG_SCSI_IPR is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_QLA_FC=m +CONFIG_SCSI_QLA_ISCSI=m +CONFIG_SCSI_LPFC=m +CONFIG_SCSI_DC395x=m +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_DEBUG is not set + +# +# PCMCIA SCSI adapter support +# +# CONFIG_PCMCIA_FDOMAIN is not set +# CONFIG_PCMCIA_QLOGIC is not set +# CONFIG_PCMCIA_SYM53C500 is not set +CONFIG_SCSI_DH=m +CONFIG_SCSI_DH_RDAC=m +CONFIG_ATA=m +# CONFIG_ATA_NONSTANDARD is not set +CONFIG_ATA_ACPI=y +CONFIG_SATA_PMP=y +CONFIG_SATA_AHCI=m +CONFIG_SATA_SIL24=m +CONFIG_ATA_SFF=y +CONFIG_SATA_SVW=m +CONFIG_ATA_PIIX=m +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_PDC_ADMA=m +CONFIG_SATA_QSTOR=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SX4=m +CONFIG_SATA_SIL=m +CONFIG_SATA_SIS=m +CONFIG_SATA_ULI=m +CONFIG_SATA_VIA=m +CONFIG_SATA_VITESSE=m +CONFIG_SATA_INIC162X=m +# CONFIG_PATA_ACPI is not set +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CS5520 is not set +# CONFIG_PATA_CS5530 is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_TRIFLEX is not set +CONFIG_PATA_MARVELL=m +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PCMCIA is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RZ1000 is not set +# CONFIG_PATA_SC1200 is not set +# CONFIG_PATA_SERVERWORKS is not set +CONFIG_PATA_PDC2027X=m +CONFIG_PATA_SIL680=m +CONFIG_PATA_SIS=m +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set +# CONFIG_PATA_SCH is not set +CONFIG_ATA_INTEL_COMBINED=y + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID10=m +CONFIG_MD_RAID456=m +CONFIG_MD_RAID5_RESHAPE=y +CONFIG_MD_MULTIPATH=m +CONFIG_MD_FAULTY=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_EMC=m +CONFIG_DM_MULTIPATH_RDAC=m +CONFIG_DM_MULTIPATH_HP=m +CONFIG_DM_RAID45=m +CONFIG_DM_UEVENT=y + +# +# Fusion MPT device support +# +CONFIG_FUSION=y +CONFIG_FUSION_SPI=m +CONFIG_FUSION_FC=m +CONFIG_FUSION_SAS=m +CONFIG_FUSION_MAX_SGE=128 +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m +CONFIG_FUSION_LOGGING=y + +# +# Enable only one of the two stacks, unless you know what you are doing +# +CONFIG_FIREWIRE=m +CONFIG_FIREWIRE_OHCI=m +CONFIG_FIREWIRE_OHCI_DEBUG=y +CONFIG_FIREWIRE_SBP2=m + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +CONFIG_I2O=m +# CONFIG_I2O_LCT_NOTIFY_ON_CHANGES is not set +CONFIG_I2O_EXT_ADAPTEC=y +CONFIG_I2O_EXT_ADAPTEC_DMA64=y +CONFIG_I2O_CONFIG=m +CONFIG_I2O_CONFIG_OLD_IOCTL=y +CONFIG_I2O_BUS=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Network device support +# +CONFIG_NETDEVICES=y +CONFIG_IFB=m +CONFIG_DUMMY=m +CONFIG_BONDING=m +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_NET_SB1000 is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +CONFIG_PHYLIB=m + +# +# MII PHY device drivers +# +CONFIG_MARVELL_PHY=m +CONFIG_DAVICOM_PHY=m +CONFIG_QSEMI_PHY=m +CONFIG_LXT_PHY=m +CONFIG_CICADA_PHY=m +CONFIG_VITESSE_PHY=m +CONFIG_SMSC_PHY=m +CONFIG_FIXED_PHY=m +CONFIG_FIXED_MII_10_FDX=y +CONFIG_FIXED_MII_100_FDX=y + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_CASSINI=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +CONFIG_TULIP_MMIO=y +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_ULI526X=m +CONFIG_PCMCIA_XIRCOM=m +# CONFIG_HP100 is not set +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_B44=m +CONFIG_FORCEDETH=m +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +CONFIG_E100=m +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_RHINE_NAPI=y +CONFIG_NET_POCKET=y +# CONFIG_ATP is not set +# CONFIG_DE600 is not set +# CONFIG_DE620 is not set + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set +CONFIG_DL2K=m +CONFIG_E1000=m +CONFIG_E1000_NAPI=y +# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set +CONFIG_E1000E=m +CONFIG_IGB=m +CONFIG_NS83820=m +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_R8169=m +CONFIG_R8169_VLAN=y +CONFIG_SIS190=m +CONFIG_SKGE=m +CONFIG_SKY2=m +# CONFIG_SK98LIN is not set +CONFIG_VIA_VELOCITY=m +CONFIG_TIGON3=m +CONFIG_BNX2=m +CONFIG_QLA3XXX=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_CHELSIO_T1=m +# CONFIG_CHELSIO_T3 is not set +CONFIG_IXGBE=m +CONFIG_IXGB=m +CONFIG_IXGB_NAPI=y +CONFIG_S2IO=m +CONFIG_S2IO_NAPI=y +CONFIG_MYRI10GE=m +CONFIG_ENIC=m +CONFIG_NETXEN_NIC=m +CONFIG_NIU=m +CONFIG_BNX2X=m +# CONFIG_MLX4_CORE is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_3C359=m +# CONFIG_TMS380TR is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +# CONFIG_STRIP is not set +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +# CONFIG_PCMCIA_RAYCS is not set + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IPW2100=m +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +CONFIG_IPW2200_MONITOR=y +CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_QOS=y +# CONFIG_IPW2200_DEBUG is not set +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_NORTEL_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_PCMCIA_SPECTRUM=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_USB_ZD1201=m +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP_FIRMWARE_NVRAM=y +CONFIG_HOSTAP_PLX=m +CONFIG_HOSTAP_PCI=m +CONFIG_HOSTAP_CS=m +CONFIG_BCM43XX=m +CONFIG_BCM43XX_DEBUG=y +CONFIG_BCM43XX_DMA=y +CONFIG_BCM43XX_PIO=y +CONFIG_BCM43XX_DMA_AND_PIO_MODE=y +# CONFIG_BCM43XX_DMA_MODE is not set +# CONFIG_BCM43XX_PIO_MODE is not set +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_NET_WIRELESS=y +CONFIG_ATH5K=m +# CONFIG_ATH5K_DEBUG is not set +CONFIG_IWLWIFI=m +CONFIG_IWLCORE=m +# CONFIG_IWLWIFI_LEDS is not set +# CONFIG_IWLWIFI_RFKILL is not set +# CONFIG_IWLWIFI_DEBUG is not set +CONFIG_IWLAGN=m +CONFIG_IWLAGN_SPECTRUM_MEASUREMENT=y +# CONFIG_IWLAGN_LEDS is not set +CONFIG_IWL4965=y +CONFIG_IWL5000=y +CONFIG_IWL3945=m +# CONFIG_IWL3945_RFKILL is not set +CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y +# CONFIG_IWL3945_LEDS is not set +# CONFIG_IWL3945_DEBUG is not set +CONFIG_RT2X00=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_PCI=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2400PCI=m +# CONFIG_RT2400PCI_RFKILL is not set +# CONFIG_RT2400PCI_LEDS is not set +CONFIG_RT2500PCI=m +# CONFIG_RT2500PCI_RFKILL is not set +# CONFIG_RT2500PCI_LEDS is not set +CONFIG_RT61PCI=m +# CONFIG_RT61PCI_RFKILL is not set +# CONFIG_RT61PCI_LEDS is not set +CONFIG_RT2500USB=m +# CONFIG_RT2500USB_LEDS is not set +CONFIG_RT73USB=m +# CONFIG_RT73USB_LEDS is not set +# CONFIG_RT2X00_DEBUG is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# ATM drivers +# +# CONFIG_ATM_DUMMY is not set +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_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +# CONFIG_SHAPER is not set +CONFIG_NETCONSOLE=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=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 + +# +# ISDN feature submodules +# +CONFIG_ISDN_DIVERSION=m + +# +# ISDN4Linux hardware drivers +# + +# +# 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 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# 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 + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +# CONFIG_HISAX_HFCUSB is not set +CONFIG_HISAX_HFC4S8S=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# + +# +# Siemens Gigaset +# +CONFIG_ISDN_DRV_GIGASET=m +CONFIG_GIGASET_BASE=m +CONFIG_GIGASET_M105=m +# CONFIG_GIGASET_DEBUG is not set +# CONFIG_GIGASET_UNDOCREQ is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +# CONFIG_CAPI_EICON is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=m +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG 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_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_SERIAL=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_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_TWIDJOY=m +# 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_TOUCHSCREEN_ELO=m +CONFIG_TOUCHSCREEN_MTOUCH=m +CONFIG_TOUCHSCREEN_MK712=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PARKBD is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_RAW=m +CONFIG_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_FM801=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_SERIAL_NONSTANDARD=y +# CONFIG_COMPUTONE is not set +# CONFIG_ROCKETPORT is not set +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_DIGIEPCA is not set +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_SYNCLINK_GT=m +CONFIG_N_HDLC=m +# CONFIG_SPECIALIX is not set +# CONFIG_SX is not set +# CONFIG_RIO is not set +# CONFIG_STALDRV is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_PCI=m +CONFIG_SERIAL_8250_PNP=m +CONFIG_SERIAL_8250_CS=m +CONFIG_SERIAL_8250_NR_UARTS=32 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250_DETECT_IRQ=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=m +CONFIG_SERIAL_JSM=m +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=y +CONFIG_IPMI_PANIC_STRING=y +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 is not set +# CONFIG_ADVANTECH_WDT is not set +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +# CONFIG_SC520_WDT is not set +# CONFIG_EUROTECH_WDT is not set +# CONFIG_IB700_WDT is not set +CONFIG_IBMASR=m +# CONFIG_WAFER_WDT is not set +CONFIG_I6300ESB_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_HP_WATCHDOG=m +# CONFIG_SC1200_WDT is not set +# CONFIG_60XX_WDT is not set +# CONFIG_SBC8360_WDT is not set +# CONFIG_CPU5_WDT is not set +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_W83977F_WDT=m +CONFIG_MACHZ_WDT=m +# CONFIG_SBC_EPX_C3_WATCHDOG is not set + +# +# 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=y +CONFIG_HW_RANDOM_INTEL=m +CONFIG_HW_RANDOM_AMD=m +# CONFIG_HW_RANDOM_GEODE is not set +CONFIG_NVRAM=y +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=y +CONFIG_AGP_SIS=y +CONFIG_AGP_VIA=y +CONFIG_DRM=m +# CONFIG_DRM_TDFX is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_I915=m +CONFIG_DRM_MGA=m +# CONFIG_DRM_SIS is not set +CONFIG_DRM_VIA=m +CONFIG_DRM_SAVAGE=m + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +CONFIG_CARDMAN_4000=m +CONFIG_CARDMAN_4040=m +# CONFIG_MWAVE is not set +CONFIG_PC8736x_GPIO=m +CONFIG_NSC_GPIO=m +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=8192 +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +# CONFIG_HPET_MMAP is not set +CONFIG_HANGCHECK_TIMER=m +# CONFIG_TCG_TPM is not set +CONFIG_TELCLOCK=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ALGOPCA=m + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD756_S4882=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +# CONFIG_I2C_I810 is not set +CONFIG_I2C_PIIX4=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +# CONFIG_I2C_OCORES is not set +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +CONFIG_I2C_SIS96X=m +CONFIG_I2C_STUB=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m +# CONFIG_I2C_PCA_ISA is not set + +# +# Miscellaneous I2C Chip support +# +CONFIG_SENSORS_DS1337=m +CONFIG_SENSORS_DS1374=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCA9539=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_MAX6875=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 + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=m +CONFIG_HWMON_VID=m +CONFIG_SENSORS_ABITUGURU=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1026=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_K8TEMP=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_ATXP1=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_F71805F=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_FSCPOS=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM63=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_LM87=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_LM92=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_PC87360=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_SMSC47M1=m +CONFIG_SENSORS_SMSC47M192=m +CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_VT8231=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83791D=m +CONFIG_SENSORS_W83792D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m +CONFIG_SENSORS_W83627EHF=m +CONFIG_SENSORS_HDAPS=m +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Misc devices +# +# CONFIG_IBM_ASM is not set +CONFIG_EEPROM_93CX6=m +CONFIG_HP_ILO=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_V4L2=y + +# +# Video Capture Adapters +# + +# +# Video Capture Adapters +# +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_VIVI is not set +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_SAA6588=m +# 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_CPIA2=m +# 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_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 + +# +# Encoders and Decoders +# +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_TLV320AIC23B=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_CX25840=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_SAA7127=m +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m + +# +# V4L USB devices +# +CONFIG_USB_VIDEO_CLASS=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_24XXX=y +CONFIG_VIDEO_PVRUSB2_SYSFS=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_USBVIDEO=m +CONFIG_USB_VICAM=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_QUICKCAM_MESSENGER=m +CONFIG_USB_ET61X251=m +CONFIG_VIDEO_OVCAMCHIP=m +CONFIG_USB_W9968CF=m +CONFIG_USB_OV511=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_ZC0301=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set + +# +# Radio Adapters +# +# CONFIG_RADIO_GEMTEK_PCI is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_MAESTRO is not set +CONFIG_USB_DSBR=m + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_USB_DABUSB=m + +# +# Graphics support +# +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=y +# CONFIG_FB_HGA is not set +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_NVIDIA=m +CONFIG_FB_NVIDIA_I2C=y +CONFIG_FB_RIVA=m +# CONFIG_FB_RIVA_I2C is not set +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_INTEL=m +# CONFIG_FB_INTEL_DEBUG is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +CONFIG_FB_SAVAGE=m +CONFIG_FB_SAVAGE_I2C=y +CONFIG_FB_SAVAGE_ACCEL=y +# CONFIG_FB_SIS 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_GEODE is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_VGACON_SOFT_SCROLLBACK=y +CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64 +CONFIG_VIDEO_SELECT=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_BACKLIGHT_CLASS_DEVICE=m +CONFIG_BACKLIGHT_DEVICE=y +CONFIG_LCD_CLASS_DEVICE=m +CONFIG_LCD_DEVICE=y + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y +CONFIG_SND_DYNAMIC_MINORS=y +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_VMASTER=y + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +# CONFIG_SND_MTS64 is not set +# CONFIG_SND_SERIAL_U16550 is not set +CONFIG_SND_MPU401=m +# CONFIG_SND_PORTMAN2X4 is not set + +# +# PCI devices +# +CONFIG_SND_AD1889=m +CONFIG_SND_ALS300=m +CONFIG_SND_ALS4000=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_BT87X_OVERCLOCK is not set +CONFIG_SND_CA0106=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_CS4281=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_DARLA20=m +CONFIG_SND_GINA20=m +CONFIG_SND_LAYLA20=m +CONFIG_SND_DARLA24=m +CONFIG_SND_GINA24=m +CONFIG_SND_LAYLA24=m +CONFIG_SND_MONA=m +CONFIG_SND_MIA=m +CONFIG_SND_ECHO3G=m +CONFIG_SND_INDIGO=m +CONFIG_SND_INDIGOIO=m +CONFIG_SND_INDIGODJ=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_EMU10K1X=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X_BOOL=y +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_HDA_POWER_SAVE=y +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 +CONFIG_SND_HDA_INTEL=m +CONFIG_SND_HDSP=m +CONFIG_SND_HDSPM=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_PCXHR=m +CONFIG_SND_RIPTIDE=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VIA82XX_MODEM=m +CONFIG_SND_VX222=m +CONFIG_SND_YMFPCI=m +# CONFIG_SND_AC97_POWER_SAVE is not set + +# +# USB devices +# +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_USX2Y=m + +# +# PCMCIA devices +# +# CONFIG_SND_VXPOCKET is not set +# CONFIG_SND_PDAUDIOCF is not set + +# +# SoC audio support +# +# CONFIG_SND_SOC is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_AC97_BUS=m + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_ISP116X_HCD=m +CONFIG_USB_OHCI_HCD=m +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_UHCI_HCD=m +CONFIG_USB_SL811_HCD=m +CONFIG_USB_SL811_CS=m + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_ACECAD=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_TOUCHSCREEN=m +CONFIG_USB_TOUCHSCREEN_EGALAX=y +CONFIG_USB_TOUCHSCREEN_PANJIT=y +CONFIG_USB_TOUCHSCREEN_3M=y +CONFIG_USB_TOUCHSCREEN_ITM=y +# CONFIG_USB_YEALINK is not set +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m +CONFIG_USB_ATI_REMOTE2=m +CONFIG_USB_KEYSPAN_REMOTE=m +CONFIG_USB_APPLETOUCH=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m + +# +# USB Network Adapters +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_MON=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_AIRPRIME=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP2101=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_FUNSOFT=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KEYSPAN_MPR=y +CONFIG_USB_SERIAL_KEYSPAN_USA28=y +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_HP4X=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_EMI62=m +CONFIG_USB_EMI26=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +CONFIG_USB_PHIDGETKIT=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_IDMOUSE=m +CONFIG_USB_APPLEDISPLAY=m +CONFIG_USB_SISUSBVGA=m +CONFIG_USB_SISUSBVGA_CON=y +CONFIG_USB_LD=m +CONFIG_USB_TEST=m + +# +# USB DSL modem support +# +CONFIG_USB_ATM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_CXACRU=m +CONFIG_USB_UEAGLEATM=m +CONFIG_USB_XUSBATM=m + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +CONFIG_MMC=m +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_BLOCK=m +CONFIG_MMC_SDHCI=m +CONFIG_MMC_WBSD=m + +# +# LED devices +# +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +# CONFIG_INFINIBAND is not set + +# +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) +# +CONFIG_EDAC=y + +# +# Reporting subsystems +# +# CONFIG_EDAC_DEBUG is not set +CONFIG_EDAC_MM_EDAC=m +CONFIG_EDAC_E752X=m +CONFIG_EDAC_I3000=m +CONFIG_EDAC_I5000=m +CONFIG_EDAC_K8=m +CONFIG_EDAC_POLL=y + +# +# Real Time Clock +# +CONFIG_RTC_LIB=m +CONFIG_RTC_CLASS=m + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=m +CONFIG_RTC_INTF_PROC=m +CONFIG_RTC_INTF_DEV=m +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set + +# +# RTC drivers +# +CONFIG_RTC_DRV_X1205=m +CONFIG_RTC_DRV_DS1307=m +CONFIG_RTC_DRV_DS1553=m +CONFIG_RTC_DRV_ISL1208=m +CONFIG_RTC_DRV_DS1672=m +CONFIG_RTC_DRV_DS1742=m +CONFIG_RTC_DRV_PCF8563=m +CONFIG_RTC_DRV_PCF8583=m +CONFIG_RTC_DRV_RS5C372=m +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_TEST is not set +CONFIG_RTC_DRV_V3020=m + +# +# DMA Engine support +# +CONFIG_DMA_ENGINE=y + +# +# DMA Clients +# +CONFIG_NET_DMA=y + +# +# DMA Devices +# +CONFIG_INTEL_IOATDMA=m + +# +# Firmware Drivers +# +CONFIG_DELL_RBU=m +CONFIG_DCDBAS=m +CONFIG_ISCSI_IBFT_FIND=y +CONFIG_ISCSI_IBFT=m + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT2_FS_XIP=y +CONFIG_FS_XIP=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_EXT4DEV_FS=m +CONFIG_EXT4DEV_FS_XATTR=y +CONFIG_EXT4DEV_FS_POSIX_ACL=y +CONFIG_EXT4DEV_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# CONFIG_XFS_FS is not set +CONFIG_GFS2_FS=m +CONFIG_GFS2_FS_LOCKING_NOLOCK=m +CONFIG_GFS2_FS_LOCKING_DLM=m +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_QUOTA=y +# CONFIG_QFMT_V1 is not set +CONFIG_QFMT_V2=y +CONFIG_QUOTACTL=y +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m +# CONFIG_FUSE_FS is not set + +# +# Caches +# +CONFIG_FSCACHE=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=y +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y +CONFIG_CACHEFILES=m +CONFIG_CACHEFILES_DEBUG=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_VMCORE=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +CONFIG_CONFIGFS_FS=m + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +CONFIG_ECRYPT_FS=m +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +# CONFIG_BEFS_FS 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_WRITEBUFFER=y +CONFIG_JFFS2_SUMMARY=y +# CONFIG_JFFS2_FS_XATTR is not set +# 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_SQUASHFS=m +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_SQUASHFS_VMALLOC is not set +CONFIG_VXFS_FS=m +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_NFS_FSCACHE=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_RPCSEC_GSS_SPKM3=m +# CONFIG_SMB_FS is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_DFS_UPCALL=y +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +# CONFIG_LDM_PARTITION is not set +CONFIG_SGI_PARTITION=y +# CONFIG_ULTRIX_PARTITION is not set +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_EFI_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Distributed Lock Manager +# +CONFIG_DLM=m +CONFIG_DLM_DEBUG=y + +# +# Instrumentation Support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m +CONFIG_KPROBES=y + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_PRINTK_TIME is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_SCHEDSTATS=y +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_FS=y +# CONFIG_DEBUG_VM is not set +CONFIG_DEBUG_LIST=y +# CONFIG_FRAME_POINTER is not set +# CONFIG_FORCED_INLINING is not set +CONFIG_BOOT_DELAY=y +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_SAMPLES=y +CONFIG_SAMPLE_MARKERS=m +CONFIG_SAMPLE_TRACEPOINTS=m +CONFIG_DEBUG_RODATA=y +CONFIG_DEBUG_STACKOVERFLOW=y +# CONFIG_DEBUG_STACK_USAGE is not set + +# +# Security options +# +CONFIG_KEYS=y +CONFIG_KEYS_DEBUG_PROC_KEYS=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_NETWORK_XFRM=y +CONFIG_SECURITY_CAPABILITIES=y +# CONFIG_SECURITY_ROOTPLUG is not set +# CONFIG_SECURITY_SECLVL 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_CHECKREQPROT_VALUE=1 +CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT=y +# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_API=m +CONFIG_CRYPTO_FIPS=y +CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_SEQIV=m +CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_RNG=m +CONFIG_CRYPTO_MANAGER=m +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NHMAC=m +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_TGR192=m +CONFIG_CRYPTO_ECB=m +CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_CTR=m +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_AES_X86_64=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_SIGNATURE=y +CONFIG_CRYPTO_SIGNATURE_DSA=y +CONFIG_CRYPTO_MPILIB=y + +# +# Random Number Generation +# +CONFIG_CRYPTO_ANSI_CPRNG=m + +# +# Hardware crypto devices +# +CONFIG_XEN=y +CONFIG_XEN_INTERFACE_VERSION=0x00030203 + +# +# XEN +# +CONFIG_XEN_PRIVILEGED_GUEST=y +# CONFIG_XEN_UNPRIVILEGED_GUEST is not set +CONFIG_XEN_PRIVCMD=y +CONFIG_XEN_XENBUS_DEV=y +CONFIG_XEN_BACKEND=y +CONFIG_XEN_BLKDEV_BACKEND=m +CONFIG_XEN_BLKDEV_TAP=m +CONFIG_XEN_NETDEV_BACKEND=m +# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set +CONFIG_XEN_NETDEV_LOOPBACK=m +CONFIG_XEN_PCIDEV_BACKEND=m +CONFIG_XEN_PCIDEV_BACKEND_VPCI=y +# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set +# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set +# CONFIG_XEN_PCIDEV_BE_DEBUG is not set +# CONFIG_XEN_TPMDEV_BACKEND is not set +CONFIG_XEN_BLKDEV_FRONTEND=m +CONFIG_XEN_NETDEV_FRONTEND=m +CONFIG_XEN_FRAMEBUFFER=y +CONFIG_XEN_KEYBOARD=y +CONFIG_XEN_SCRUB_PAGES=y +# CONFIG_XEN_DISABLE_SERIAL is not set +CONFIG_XEN_SYSFS=y +CONFIG_XEN_COMPAT_030002_AND_LATER=y +# CONFIG_XEN_COMPAT_LATEST_ONLY is not set +CONFIG_XEN_COMPAT_030002=y +CONFIG_HAVE_ARCH_ALLOC_SKB=y +CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y +CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y +CONFIG_NO_IDLE_HZ=y +CONFIG_XEN_UTIL=y +CONFIG_XEN_BALLOON=y +CONFIG_XEN_DEVMEM=y +CONFIG_XEN_SKBUFF=y +CONFIG_XEN_REBOOT=y +CONFIG_XEN_SMPBOOT=y + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC16=m +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +CONFIG_LIBCRC32C=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_REED_SOLOMON=m +CONFIG_REED_SOLOMON_DEC16=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-x86_64.config b/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-x86_64.config new file mode 100644 index 0000000..9729ec7 --- /dev/null +++ b/lustre/kernel_patches/kernel_configs/kernel-2.6.18-2.6-rhel5-xen-x86_64.config @@ -0,0 +1,3079 @@ +# x86_64 +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.18-prep +# Wed Mar 25 15:13:26 2009 +# +CONFIG_X86_64=y +CONFIG_64BIT=y +CONFIG_X86=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_SEMAPHORE_SLEEPERS=y +CONFIG_MMU=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_X86_CMPXCHG=y +CONFIG_EARLY_PRINTK=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_IOMAP=y +CONFIG_ARCH_MAY_HAVE_PC_FDC=y +CONFIG_DMI=y +CONFIG_AUDIT_ARCH=y +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_LOCK_KERNEL=y +CONFIG_INIT_ENV_ARG_LIMIT=32 + +# +# General setup +# +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_AUDIT=y +CONFIG_AUDITSYSCALL=y +# CONFIG_IKCONFIG is not set +CONFIG_CPUSETS=y +CONFIG_RELAY=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL=y +CONFIG_KALLSYMS=y +CONFIG_KALLSYMS_ALL=y +CONFIG_KALLSYMS_EXTRA_PASS=y +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SHMEM=y +CONFIG_SLAB=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_TRACEPOINTS=y +CONFIG_MARKERS=y +CONFIG_TRACEPROBES=m +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +# CONFIG_SLOB is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SRCVERSION_ALL=y +CONFIG_MODULE_SIG=y +# CONFIG_MODULE_SIG_FORCE is not set +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Process debugging support +# +CONFIG_PTRACE=y +CONFIG_UTRACE=y + +# +# Block layer +# +CONFIG_LBD=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_LSF=y + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_DEFAULT_AS is not set +CONFIG_DEFAULT_DEADLINE=y +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="deadline" + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_VSMP is not set +# CONFIG_MK8 is not set +# CONFIG_MPSC is not set +CONFIG_GENERIC_CPU=y +CONFIG_X86_64_XEN=y +CONFIG_X86_NO_TSS=y +CONFIG_X86_NO_IDT=y +CONFIG_X86_L1_CACHE_BYTES=128 +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_X86_INTERNODE_CACHE_BYTES=128 +CONFIG_X86_GOOD_APIC=y +CONFIG_MICROCODE=m +CONFIG_X86_MSR=y +CONFIG_X86_CPUID=y +# CONFIG_EFI is not set +CONFIG_X86_IO_APIC=y +CONFIG_X86_XEN_GENAPIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_MTRR=y +CONFIG_SMP=y +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_VOLUNTARY=y +# CONFIG_PREEMPT is not set +CONFIG_PREEMPT_BKL=y +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_ARCH_FLATMEM_ENABLE=y +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +CONFIG_RESOURCES_64BIT=y +CONFIG_NR_CPUS=255 +CONFIG_HOTPLUG_CPU=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +CONFIG_TRACK_DIRTY_PAGES=y +# CONFIG_TICK_DIVIDER is not set +# CONFIG_CALGARY_IOMMU is not set +CONFIG_AMD_IOMMU=y +CONFIG_IOMMU_HELPER=y +CONFIG_SWIOTLB=y +CONFIG_KEXEC=y +CONFIG_CRASH_DUMP=y +# CONFIG_SECCOMP is not set +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +# CONFIG_HZ_1000 is not set +CONFIG_HZ=250 +CONFIG_REORDER=y +CONFIG_K8_NB=y +CONFIG_GENERIC_HARDIRQS=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_ISA_DMA_API=y +CONFIG_GENERIC_PENDING_IRQ=y + +# +# Power management options +# +CONFIG_PM=y + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_VIDEO=m +# CONFIG_ACPI_HOTKEY is not set +CONFIG_ACPI_FAN=y +CONFIG_ACPI_DOCK=y +CONFIG_ACPI_BAY=y +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_HOTPLUG_CPU=y +CONFIG_ACPI_THERMAL=y +CONFIG_ACPI_ASUS=m +# CONFIG_ACPI_IBM is not set +CONFIG_ACPI_TOSHIBA=m +CONFIG_ACPI_BLACKLIST_YEAR=0 +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_SYSTEM=y +CONFIG_ACPI_CONTAINER=y +CONFIG_ACPI_SBS=m +CONFIG_THINKPAD_ACPI=m +# CONFIG_THINKPAD_ACPI_DEBUG is not set +CONFIG_THINKPAD_ACPI_BAY=y +CONFIG_THINKPAD_ACPI_VIDEO=y +CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_TABLE=m +CONFIG_CPU_FREQ_DEBUG=y +CONFIG_CPU_FREQ_STAT=m +CONFIG_CPU_FREQ_STAT_DETAILS=y +# 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_GOV_CONSERVATIVE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_POWERNOW_K8_ACPI=y +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_ACPI_CPUFREQ=m + +# +# shared options +# +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +# CONFIG_X86_SPEEDSTEP_LIB is not set + +# +# Bus options (PCI etc.) +# +CONFIG_PCI=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_XEN_PCIDEV_FRONTEND=y +# CONFIG_XEN_PCIDEV_FE_DEBUG is not set +CONFIG_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_PCI_DOMAINS=y +# CONFIG_PCI_DEBUG is not set + +# +# PCCARD (PCMCIA/CardBus) support +# +CONFIG_PCCARD=y +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y +CONFIG_CARDBUS=y + +# +# PC-card bridges +# +CONFIG_YENTA=y +CONFIG_YENTA_O2=y +CONFIG_YENTA_RICOH=y +CONFIG_YENTA_TI=y +CONFIG_YENTA_ENE_TUNE=y +CONFIG_YENTA_TOSHIBA=y +CONFIG_PD6729=m +# CONFIG_I82092 is not set +CONFIG_PCCARD_NONSTATIC=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_ACPI_IBM=m +# CONFIG_HOTPLUG_PCI_CPCI 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_MISC=y +CONFIG_IA32_EMULATION=y +# CONFIG_IA32_AOUT is not set +CONFIG_COMPAT=y +CONFIG_SYSVIPC_COMPAT=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_NETDEBUG is not set +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_NALGO=m +CONFIG_XFRM_USER=y +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_ASK_IP_FIB_HASH=y +# CONFIG_IP_FIB_TRIE is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_MULTIPATH=y +# CONFIG_IP_ROUTE_MULTIPATH_CACHED is not set +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_DIAG=m +CONFIG_INET_TCP_DIAG=m +CONFIG_TCP_CONG_ADVANCED=y + +# +# TCP congestion control +# +CONFIG_TCP_CONG_BIC=y +CONFIG_TCP_CONG_CUBIC=m +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_INET_LRO=y + +# +# 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_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_IPV6_TUNNEL=m +# CONFIG_IPV6_SUBTREES is not set +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_ROUTE_FWMARK=y +CONFIG_NETWORK_SECMARK=y +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NETFILTER_XTABLES=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_SECMARK=m +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_CT_ACCT=y +CONFIG_IP_NF_CONNTRACK_MARK=y +CONFIG_IP_NF_CONNTRACK_SECMARK=y +CONFIG_IP_NF_CONNTRACK_EVENTS=y +CONFIG_IP_NF_CONNTRACK_NETLINK=m +CONFIG_IP_NF_CT_PROTO_SCTP=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_NETBIOS_NS=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_PPTP=m +CONFIG_IP_NF_H323=m +CONFIG_IP_NF_SIP=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_HASHLIMIT=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_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_NAT_PPTP=m +CONFIG_IP_NF_NAT_H323=m +CONFIG_IP_NF_NAT_SIP=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_CLUSTERIP=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration (EXPERIMENTAL) +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_RAW=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_ULOG=m + +# +# DCCP Configuration (EXPERIMENTAL) +# +CONFIG_IP_DCCP=m +CONFIG_INET_DCCP_DIAG=m +CONFIG_IP_DCCP_ACKVEC=y + +# +# DCCP CCIDs Configuration (EXPERIMENTAL) +# +CONFIG_IP_DCCP_CCID2=m +CONFIG_IP_DCCP_CCID3=m +CONFIG_IP_DCCP_TFRC_LIB=m + +# +# DCCP Kernel Hacking +# +# CONFIG_IP_DCCP_DEBUG is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y + +# +# TIPC Configuration (EXPERIMENTAL) +# +CONFIG_TIPC=m +# CONFIG_TIPC_ADVANCED is not set +# CONFIG_TIPC_DEBUG is not set +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_DECNET is not set +CONFIG_LLC=y +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +# CONFIG_NET_SCH_CLK_JIFFIES is not set +CONFIG_NET_SCH_CLK_GETTIMEOFDAY=y +# CONFIG_NET_SCH_CLK_CPU is not set + +# +# Queueing/Scheduling +# +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_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_STACK=32 +CONFIG_NET_EMATCH_CMP=m +CONFIG_NET_EMATCH_NBYTE=m +CONFIG_NET_EMATCH_U32=m +CONFIG_NET_EMATCH_META=m +CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_IPT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_CLS_IND=y +CONFIG_NET_ESTIMATOR=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NET_TCPPROBE is not set +# 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_HCIBCM203X=m +CONFIG_BT_HCIBPA10X=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=y +# CONFIG_TUX_DEBUG is not set +CONFIG_NETLABEL=y +CONFIG_FIB_RULES=y + +# +# Wireless +# +CONFIG_CFG80211=m +CONFIG_NL80211=y +CONFIG_WIRELESS_EXT=y +CONFIG_NET_WIRELESS_RTNETLINK=y +CONFIG_MAC80211=m + +# +# Rate control algorithm selection +# +CONFIG_MAC80211_RC_DEFAULT_PID=y +# CONFIG_MAC80211_RC_DEFAULT_NONE is not set + +# +# Selecting 'y' for an algorithm will +# + +# +# build the algorithm into mac80211. +# +CONFIG_MAC80211_RC_DEFAULT="pid" +CONFIG_MAC80211_RC_PID=y +# CONFIG_MAC80211_MESH is not set +CONFIG_MAC80211_LEDS=y +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT is not set +# CONFIG_MAC80211_DEBUG is not set +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=m +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IEEE80211_SOFTMAC=m +CONFIG_IEEE80211_SOFTMAC_DEBUG=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set + +# +# Connector - unified userspace <-> kernelspace linker +# +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_CONCAT=m +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_REDBOOT_PARTS=m +CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +CONFIG_MTD_CMDLINE_PARTS=y + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +# CONFIG_INFTL is not set +CONFIG_RFD_FTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_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_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_PNC2000 is not set +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_TS5500=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +CONFIG_MTD_SCB2_FLASH=m +# CONFIG_MTD_NETtel is not set +# CONFIG_MTD_DILNETPC is not set +# CONFIG_MTD_L440GX is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 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_BLOCK2MTD=m + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_ECC_SMC=y +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set +CONFIG_MTD_NAND_NANDSIM=m + +# +# OneNAND Flash Device Drivers +# +# CONFIG_MTD_ONENAND is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_SERIAL=m +# CONFIG_PARPORT_PC_FIFO is not set +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +CONFIG_PARPORT_NOT_PC=y +# CONFIG_PARPORT_GSC is not set +# CONFIG_PARPORT_AX88796 is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_PNPACPI=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +CONFIG_PARIDE_EPATC8=y +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +# CONFIG_BLK_DEV_UMEM is not set +# CONFIG_BLK_DEV_COW_COMMON is not set +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_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=4096 +CONFIG_BLK_DEV_INITRD=y +CONFIG_CDROM_PKTCDVD=m +CONFIG_CDROM_PKTCDVD_BUFFERS=8 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set +CONFIG_ATA_OVER_ETH=m + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +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_IDECD=m +# CONFIG_BLK_DEV_IDETAPE is not set +CONFIG_BLK_DEV_IDEFLOPPY=y +CONFIG_BLK_DEV_IDESCSI=m +CONFIG_IDE_TASK_IOCTL=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=y +# CONFIG_BLK_DEV_CMD640 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_GENERIC=y +# CONFIG_BLK_DEV_OPTI621 is not set +# CONFIG_BLK_DEV_RZ1000 is not set +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_AEC62XX=y +CONFIG_BLK_DEV_ALI15X3=y +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=y +CONFIG_BLK_DEV_ATIIXP=y +CONFIG_BLK_DEV_CMD64X=y +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +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_IT821X=y +# CONFIG_BLK_DEV_NS87415 is not set +CONFIG_BLK_DEV_PDC202XX_OLD=y +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=y +CONFIG_BLK_DEV_SVWKS=y +CONFIG_BLK_DEV_SIIMAGE=y +CONFIG_BLK_DEV_SIS5513=y +# CONFIG_BLK_DEV_SLC90E66 is not set +# CONFIG_BLK_DEV_TRM290 is not set +CONFIG_BLK_DEV_VIA82CXXX=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_RAID_ATTRS=m +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +CONFIG_SCSI_NETLINK=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_SD_IOSTATS=y +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m +CONFIG_SCSI_ISCSI_ATTRS=m +CONFIG_SCSI_SAS_ATTRS=m +CONFIG_SCSI_SAS_LIBSAS=m +CONFIG_SCSI_SAS_ATA=y +# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set + +# +# SCSI low-level drivers +# +CONFIG_LIBFC=m +CONFIG_FCOE=m +CONFIG_ISCSI_TCP=m +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_AIC7XXX_CMDS_PER_DEVICE=4 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_DEBUG_ENABLE is not set +CONFIG_AIC7XXX_DEBUG_MASK=0 +# CONFIG_AIC7XXX_REG_PRETTY_PRINT is not set +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=4 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# 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_AIC94XX=m +# CONFIG_AIC94XX_DEBUG is not set +CONFIG_SCSI_ARCMSR=m +CONFIG_MEGARAID_NEWGEN=y +CONFIG_MEGARAID_MM=m +CONFIG_MEGARAID_MAILBOX=m +CONFIG_MEGARAID_LEGACY=m +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_HPTIOP=m +# CONFIG_SCSI_BUSLOGIC is not set +CONFIG_FCOE_FNIC=m +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_EATA is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +CONFIG_SCSI_GDTH=m +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_STEX=m +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_MMIO=y +# CONFIG_SCSI_IPR is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_QLA_FC=m +CONFIG_SCSI_QLA_ISCSI=m +CONFIG_SCSI_LPFC=m +CONFIG_SCSI_DC395x=m +# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_DEBUG is not set + +# +# PCMCIA SCSI adapter support +# +# CONFIG_PCMCIA_FDOMAIN is not set +# CONFIG_PCMCIA_QLOGIC is not set +# CONFIG_PCMCIA_SYM53C500 is not set +CONFIG_SCSI_DH=m +CONFIG_SCSI_DH_RDAC=m +CONFIG_ATA=m +# CONFIG_ATA_NONSTANDARD is not set +CONFIG_ATA_ACPI=y +CONFIG_SATA_PMP=y +CONFIG_SATA_AHCI=m +CONFIG_SATA_SIL24=m +CONFIG_ATA_SFF=y +CONFIG_SATA_SVW=m +CONFIG_ATA_PIIX=m +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_PDC_ADMA=m +CONFIG_SATA_QSTOR=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SX4=m +CONFIG_SATA_SIL=m +CONFIG_SATA_SIS=m +CONFIG_SATA_ULI=m +CONFIG_SATA_VIA=m +CONFIG_SATA_VITESSE=m +CONFIG_SATA_INIC162X=m +# CONFIG_PATA_ACPI is not set +# CONFIG_PATA_ALI is not set +# CONFIG_PATA_AMD is not set +# CONFIG_PATA_ARTOP is not set +# CONFIG_PATA_ATIIXP is not set +# CONFIG_PATA_CMD640_PCI is not set +# CONFIG_PATA_CMD64X is not set +# CONFIG_PATA_CS5520 is not set +# CONFIG_PATA_CS5530 is not set +# CONFIG_PATA_CYPRESS is not set +# CONFIG_PATA_EFAR is not set +# CONFIG_ATA_GENERIC is not set +# CONFIG_PATA_HPT366 is not set +# CONFIG_PATA_HPT37X is not set +# CONFIG_PATA_HPT3X2N is not set +# CONFIG_PATA_HPT3X3 is not set +# CONFIG_PATA_IT821X is not set +# CONFIG_PATA_IT8213 is not set +# CONFIG_PATA_JMICRON is not set +# CONFIG_PATA_TRIFLEX is not set +CONFIG_PATA_MARVELL=m +# CONFIG_PATA_MPIIX is not set +# CONFIG_PATA_OLDPIIX is not set +# CONFIG_PATA_NETCELL is not set +# CONFIG_PATA_NINJA32 is not set +# CONFIG_PATA_NS87410 is not set +# CONFIG_PATA_NS87415 is not set +# CONFIG_PATA_OPTI is not set +# CONFIG_PATA_OPTIDMA is not set +# CONFIG_PATA_PCMCIA is not set +# CONFIG_PATA_PDC_OLD is not set +# CONFIG_PATA_RADISYS is not set +# CONFIG_PATA_RZ1000 is not set +# CONFIG_PATA_SC1200 is not set +# CONFIG_PATA_SERVERWORKS is not set +CONFIG_PATA_PDC2027X=m +CONFIG_PATA_SIL680=m +CONFIG_PATA_SIS=m +# CONFIG_PATA_VIA is not set +# CONFIG_PATA_WINBOND is not set +# CONFIG_PATA_SCH is not set +CONFIG_ATA_INTEL_COMBINED=y + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID10=m +CONFIG_MD_RAID456=m +CONFIG_MD_RAID5_RESHAPE=y +CONFIG_MD_MULTIPATH=m +CONFIG_MD_FAULTY=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_EMC=m +CONFIG_DM_MULTIPATH_RDAC=m +CONFIG_DM_MULTIPATH_HP=m +CONFIG_DM_RAID45=m +CONFIG_DM_UEVENT=y + +# +# Fusion MPT device support +# +CONFIG_FUSION=y +CONFIG_FUSION_SPI=m +CONFIG_FUSION_FC=m +CONFIG_FUSION_SAS=m +CONFIG_FUSION_MAX_SGE=128 +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m +CONFIG_FUSION_LOGGING=y + +# +# Enable only one of the two stacks, unless you know what you are doing +# +CONFIG_FIREWIRE=m +CONFIG_FIREWIRE_OHCI=m +CONFIG_FIREWIRE_OHCI_DEBUG=y +CONFIG_FIREWIRE_SBP2=m + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_IEEE1394 is not set + +# +# I2O device support +# +CONFIG_I2O=m +# CONFIG_I2O_LCT_NOTIFY_ON_CHANGES is not set +CONFIG_I2O_EXT_ADAPTEC=y +CONFIG_I2O_EXT_ADAPTEC_DMA64=y +CONFIG_I2O_CONFIG=m +CONFIG_I2O_CONFIG_OLD_IOCTL=y +CONFIG_I2O_BUS=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Network device support +# +CONFIG_NETDEVICES=y +CONFIG_IFB=m +CONFIG_DUMMY=m +CONFIG_BONDING=m +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_NET_SB1000 is not set + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set + +# +# PHY device support +# +CONFIG_PHYLIB=m + +# +# MII PHY device drivers +# +CONFIG_MARVELL_PHY=m +CONFIG_DAVICOM_PHY=m +CONFIG_QSEMI_PHY=m +CONFIG_LXT_PHY=m +CONFIG_CICADA_PHY=m +CONFIG_VITESSE_PHY=m +CONFIG_SMSC_PHY=m +CONFIG_FIXED_PHY=m +CONFIG_FIXED_MII_10_FDX=y +CONFIG_FIXED_MII_100_FDX=y + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_CASSINI=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +CONFIG_TULIP_MMIO=y +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_ULI526X=m +CONFIG_PCMCIA_XIRCOM=m +# CONFIG_HP100 is not set +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_B44=m +CONFIG_FORCEDETH=m +# CONFIG_DGRS is not set +# CONFIG_EEPRO100 is not set +CONFIG_E100=m +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_RHINE_NAPI=y +CONFIG_NET_POCKET=y +# CONFIG_ATP is not set +# CONFIG_DE600 is not set +# CONFIG_DE620 is not set + +# +# Ethernet (1000 Mbit) +# +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set +CONFIG_DL2K=m +CONFIG_E1000=m +CONFIG_E1000_NAPI=y +# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set +CONFIG_E1000E=m +CONFIG_IGB=m +CONFIG_NS83820=m +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +CONFIG_R8169=m +CONFIG_R8169_VLAN=y +CONFIG_SIS190=m +CONFIG_SKGE=m +CONFIG_SKY2=m +# CONFIG_SK98LIN is not set +CONFIG_VIA_VELOCITY=m +CONFIG_TIGON3=m +CONFIG_BNX2=m +CONFIG_QLA3XXX=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_CHELSIO_T1=m +# CONFIG_CHELSIO_T3 is not set +CONFIG_IXGBE=m +CONFIG_IXGB=m +CONFIG_IXGB_NAPI=y +CONFIG_S2IO=m +CONFIG_S2IO_NAPI=y +CONFIG_MYRI10GE=m +CONFIG_ENIC=m +CONFIG_NETXEN_NIC=m +CONFIG_NIU=m +CONFIG_BNX2X=m +# CONFIG_MLX4_CORE is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_3C359=m +# CONFIG_TMS380TR is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +# CONFIG_STRIP is not set +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +# CONFIG_PCMCIA_RAYCS is not set + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IPW2100=m +CONFIG_IPW2100_MONITOR=y +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +CONFIG_IPW2200_MONITOR=y +CONFIG_IPW2200_RADIOTAP=y +CONFIG_IPW2200_PROMISCUOUS=y +CONFIG_IPW2200_QOS=y +# CONFIG_IPW2200_DEBUG is not set +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_NORTEL_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_PCMCIA_SPECTRUM=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_USB_ZD1201=m +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP_FIRMWARE_NVRAM=y +CONFIG_HOSTAP_PLX=m +CONFIG_HOSTAP_PCI=m +CONFIG_HOSTAP_CS=m +CONFIG_BCM43XX=m +CONFIG_BCM43XX_DEBUG=y +CONFIG_BCM43XX_DMA=y +CONFIG_BCM43XX_PIO=y +CONFIG_BCM43XX_DMA_AND_PIO_MODE=y +# CONFIG_BCM43XX_DMA_MODE is not set +# CONFIG_BCM43XX_PIO_MODE is not set +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_NET_WIRELESS=y +CONFIG_ATH5K=m +# CONFIG_ATH5K_DEBUG is not set +CONFIG_IWLWIFI=m +CONFIG_IWLCORE=m +# CONFIG_IWLWIFI_LEDS is not set +# CONFIG_IWLWIFI_RFKILL is not set +# CONFIG_IWLWIFI_DEBUG is not set +CONFIG_IWLAGN=m +CONFIG_IWLAGN_SPECTRUM_MEASUREMENT=y +# CONFIG_IWLAGN_LEDS is not set +CONFIG_IWL4965=y +CONFIG_IWL5000=y +CONFIG_IWL3945=m +# CONFIG_IWL3945_RFKILL is not set +CONFIG_IWL3945_SPECTRUM_MEASUREMENT=y +# CONFIG_IWL3945_LEDS is not set +# CONFIG_IWL3945_DEBUG is not set +CONFIG_RT2X00=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_PCI=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2400PCI=m +# CONFIG_RT2400PCI_RFKILL is not set +# CONFIG_RT2400PCI_LEDS is not set +CONFIG_RT2500PCI=m +# CONFIG_RT2500PCI_RFKILL is not set +# CONFIG_RT2500PCI_LEDS is not set +CONFIG_RT61PCI=m +# CONFIG_RT61PCI_RFKILL is not set +# CONFIG_RT61PCI_LEDS is not set +CONFIG_RT2500USB=m +# CONFIG_RT2500USB_LEDS is not set +CONFIG_RT73USB=m +# CONFIG_RT73USB_LEDS is not set +# CONFIG_RT2X00_DEBUG is not set + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# ATM drivers +# +# CONFIG_ATM_DUMMY is not set +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_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +# CONFIG_SHAPER is not set +CONFIG_NETCONSOLE=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=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 + +# +# ISDN feature submodules +# +CONFIG_ISDN_DIVERSION=m + +# +# ISDN4Linux hardware drivers +# + +# +# 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 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# 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 + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +# CONFIG_HISAX_HFCUSB is not set +CONFIG_HISAX_HFC4S8S=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# + +# +# Siemens Gigaset +# +CONFIG_ISDN_DRV_GIGASET=m +CONFIG_GIGASET_BASE=m +CONFIG_GIGASET_M105=m +# CONFIG_GIGASET_DEBUG is not set +# CONFIG_GIGASET_UNDOCREQ is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +# CONFIG_CAPI_EICON is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=m +# CONFIG_INPUT_TSDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG 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_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_SERIAL=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_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_TWIDJOY=m +# 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_TOUCHSCREEN_ELO=m +CONFIG_TOUCHSCREEN_MTOUCH=m +CONFIG_TOUCHSCREEN_MK712=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Hardware I/O ports +# +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=y +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PARKBD is not set +# CONFIG_SERIO_PCIPS2 is not set +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_RAW=m +CONFIG_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_FM801=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_SERIAL_NONSTANDARD=y +# CONFIG_COMPUTONE is not set +# CONFIG_ROCKETPORT is not set +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_DIGIEPCA is not set +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_SYNCLINK_GT=m +CONFIG_N_HDLC=m +# CONFIG_SPECIALIX is not set +# CONFIG_SX is not set +# CONFIG_RIO is not set +# CONFIG_STALDRV is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_PCI=m +CONFIG_SERIAL_8250_PNP=m +CONFIG_SERIAL_8250_CS=m +CONFIG_SERIAL_8250_NR_UARTS=32 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250_DETECT_IRQ=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=m +CONFIG_SERIAL_JSM=m +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=y +CONFIG_IPMI_PANIC_STRING=y +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 is not set +# CONFIG_ADVANTECH_WDT is not set +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +# CONFIG_SC520_WDT is not set +# CONFIG_EUROTECH_WDT is not set +# CONFIG_IB700_WDT is not set +CONFIG_IBMASR=m +# CONFIG_WAFER_WDT is not set +CONFIG_I6300ESB_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_HP_WATCHDOG=m +# CONFIG_SC1200_WDT is not set +# CONFIG_60XX_WDT is not set +# CONFIG_SBC8360_WDT is not set +# CONFIG_CPU5_WDT is not set +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_W83977F_WDT=m +CONFIG_MACHZ_WDT=m +# CONFIG_SBC_EPX_C3_WATCHDOG is not set + +# +# 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=y +CONFIG_HW_RANDOM_INTEL=m +CONFIG_HW_RANDOM_AMD=m +# CONFIG_HW_RANDOM_GEODE is not set +CONFIG_NVRAM=y +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=y +CONFIG_AGP_SIS=y +CONFIG_AGP_VIA=y +CONFIG_DRM=m +# CONFIG_DRM_TDFX is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_I915=m +CONFIG_DRM_MGA=m +# CONFIG_DRM_SIS is not set +CONFIG_DRM_VIA=m +CONFIG_DRM_SAVAGE=m + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +CONFIG_CARDMAN_4000=m +CONFIG_CARDMAN_4040=m +# CONFIG_MWAVE is not set +CONFIG_PC8736x_GPIO=m +CONFIG_NSC_GPIO=m +CONFIG_RAW_DRIVER=y +CONFIG_MAX_RAW_DEVS=8192 +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +# CONFIG_HPET_MMAP is not set +CONFIG_HANGCHECK_TIMER=m +# CONFIG_TCG_TPM is not set +CONFIG_TELCLOCK=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ALGOPCA=m + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD756_S4882=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +# CONFIG_I2C_I810 is not set +CONFIG_I2C_PIIX4=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +# CONFIG_I2C_OCORES is not set +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +CONFIG_I2C_SIS96X=m +CONFIG_I2C_STUB=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m +# CONFIG_I2C_PCA_ISA is not set + +# +# Miscellaneous I2C Chip support +# +CONFIG_SENSORS_DS1337=m +CONFIG_SENSORS_DS1374=m +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCA9539=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_MAX6875=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 + +# +# SPI support +# +# CONFIG_SPI is not set +# CONFIG_SPI_MASTER is not set + +# +# Dallas's 1-wire bus +# +# CONFIG_W1 is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=m +CONFIG_HWMON_VID=m +CONFIG_SENSORS_ABITUGURU=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1026=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_K8TEMP=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_ATXP1=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_F71805F=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_FSCPOS=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_GL520SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM63=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_LM87=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_LM92=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_PC87360=m +CONFIG_SENSORS_SIS5595=m +CONFIG_SENSORS_SMSC47M1=m +CONFIG_SENSORS_SMSC47M192=m +CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_VT8231=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83791D=m +CONFIG_SENSORS_W83792D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m +CONFIG_SENSORS_W83627EHF=m +CONFIG_SENSORS_HDAPS=m +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Misc devices +# +# CONFIG_IBM_ASM is not set +CONFIG_EEPROM_93CX6=m +CONFIG_HP_ILO=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y +CONFIG_VIDEO_V4L2=y + +# +# Video Capture Adapters +# + +# +# Video Capture Adapters +# +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_VIVI is not set +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_SAA6588=m +# 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_CPIA2=m +# 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_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 + +# +# Encoders and Decoders +# +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_TLV320AIC23B=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_CX25840=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_SAA7127=m +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m + +# +# V4L USB devices +# +CONFIG_USB_VIDEO_CLASS=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_24XXX=y +CONFIG_VIDEO_PVRUSB2_SYSFS=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_USBVIDEO=m +CONFIG_USB_VICAM=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_QUICKCAM_MESSENGER=m +CONFIG_USB_ET61X251=m +CONFIG_VIDEO_OVCAMCHIP=m +CONFIG_USB_W9968CF=m +CONFIG_USB_OV511=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_ZC0301=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set + +# +# Radio Adapters +# +# CONFIG_RADIO_GEMTEK_PCI is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_MAESTRO is not set +CONFIG_USB_DSBR=m + +# +# Digital Video Broadcasting Devices +# +# CONFIG_DVB is not set +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_USB_DABUSB=m + +# +# Graphics support +# +# CONFIG_FIRMWARE_EDID is not set +CONFIG_FB=y +CONFIG_FB_CFB_FILLRECT=y +CONFIG_FB_CFB_COPYAREA=y +CONFIG_FB_CFB_IMAGEBLIT=y +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ARC is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=y +# CONFIG_FB_HGA is not set +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_NVIDIA=m +CONFIG_FB_NVIDIA_I2C=y +CONFIG_FB_RIVA=m +# CONFIG_FB_RIVA_I2C is not set +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_INTEL=m +# CONFIG_FB_INTEL_DEBUG is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +CONFIG_FB_SAVAGE=m +CONFIG_FB_SAVAGE_I2C=y +CONFIG_FB_SAVAGE_ACCEL=y +# CONFIG_FB_SIS 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_GEODE is not set +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_VGACON_SOFT_SCROLLBACK=y +CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64 +CONFIG_VIDEO_SELECT=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_BACKLIGHT_CLASS_DEVICE=m +CONFIG_BACKLIGHT_DEVICE=y +CONFIG_LCD_CLASS_DEVICE=m +CONFIG_LCD_DEVICE=y + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y +CONFIG_SND_DYNAMIC_MINORS=y +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_VMASTER=y + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +# CONFIG_SND_MTS64 is not set +# CONFIG_SND_SERIAL_U16550 is not set +CONFIG_SND_MPU401=m +# CONFIG_SND_PORTMAN2X4 is not set + +# +# PCI devices +# +CONFIG_SND_AD1889=m +CONFIG_SND_ALS300=m +CONFIG_SND_ALS4000=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_BT87X_OVERCLOCK is not set +CONFIG_SND_CA0106=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_CS4281=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_DARLA20=m +CONFIG_SND_GINA20=m +CONFIG_SND_LAYLA20=m +CONFIG_SND_DARLA24=m +CONFIG_SND_GINA24=m +CONFIG_SND_LAYLA24=m +CONFIG_SND_MONA=m +CONFIG_SND_MIA=m +CONFIG_SND_ECHO3G=m +CONFIG_SND_INDIGO=m +CONFIG_SND_INDIGOIO=m +CONFIG_SND_INDIGODJ=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_EMU10K1X=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X_BOOL=y +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_HDA_POWER_SAVE=y +CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 +CONFIG_SND_HDA_INTEL=m +CONFIG_SND_HDSP=m +CONFIG_SND_HDSPM=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_PCXHR=m +CONFIG_SND_RIPTIDE=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VIA82XX_MODEM=m +CONFIG_SND_VX222=m +CONFIG_SND_YMFPCI=m +# CONFIG_SND_AC97_POWER_SAVE is not set + +# +# USB devices +# +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_USB_USX2Y=m + +# +# PCMCIA devices +# +# CONFIG_SND_VXPOCKET is not set +# CONFIG_SND_PDAUDIOCF is not set + +# +# SoC audio support +# +# CONFIG_SND_SOC is not set + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_AC97_BUS=m + +# +# USB support +# +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +# CONFIG_USB_BANDWIDTH is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_SUSPEND is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_TT_NEWSCHED=y +CONFIG_USB_ISP116X_HCD=m +CONFIG_USB_OHCI_HCD=m +# CONFIG_USB_OHCI_BIG_ENDIAN is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_UHCI_HCD=m +CONFIG_USB_SL811_HCD=m +CONFIG_USB_SL811_CS=m + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_ACECAD=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_TOUCHSCREEN=m +CONFIG_USB_TOUCHSCREEN_EGALAX=y +CONFIG_USB_TOUCHSCREEN_PANJIT=y +CONFIG_USB_TOUCHSCREEN_3M=y +CONFIG_USB_TOUCHSCREEN_ITM=y +# CONFIG_USB_YEALINK is not set +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m +CONFIG_USB_ATI_REMOTE2=m +CONFIG_USB_KEYSPAN_REMOTE=m +CONFIG_USB_APPLETOUCH=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m + +# +# USB Network Adapters +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_MON=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_AIRPRIME=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP2101=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_FUNSOFT=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KEYSPAN_MPR=y +CONFIG_USB_SERIAL_KEYSPAN_USA28=y +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y +CONFIG_USB_SERIAL_KEYSPAN_USA19=y +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_HP4X=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_EMI62=m +CONFIG_USB_EMI26=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +CONFIG_USB_PHIDGETKIT=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_IDMOUSE=m +CONFIG_USB_APPLEDISPLAY=m +CONFIG_USB_SISUSBVGA=m +CONFIG_USB_SISUSBVGA_CON=y +CONFIG_USB_LD=m +CONFIG_USB_TEST=m + +# +# USB DSL modem support +# +CONFIG_USB_ATM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_CXACRU=m +CONFIG_USB_UEAGLEATM=m +CONFIG_USB_XUSBATM=m + +# +# USB Gadget Support +# +# CONFIG_USB_GADGET is not set + +# +# MMC/SD Card support +# +CONFIG_MMC=m +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_BLOCK=m +CONFIG_MMC_SDHCI=m +CONFIG_MMC_WBSD=m + +# +# LED devices +# +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +# CONFIG_INFINIBAND is not set + +# +# EDAC - error detection and reporting (RAS) (EXPERIMENTAL) +# +CONFIG_EDAC=y + +# +# Reporting subsystems +# +# CONFIG_EDAC_DEBUG is not set +CONFIG_EDAC_MM_EDAC=m +CONFIG_EDAC_E752X=m +CONFIG_EDAC_I3000=m +CONFIG_EDAC_I5000=m +CONFIG_EDAC_K8=m +CONFIG_EDAC_POLL=y + +# +# Real Time Clock +# +CONFIG_RTC_LIB=m +CONFIG_RTC_CLASS=m + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=m +CONFIG_RTC_INTF_PROC=m +CONFIG_RTC_INTF_DEV=m +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set + +# +# RTC drivers +# +CONFIG_RTC_DRV_X1205=m +CONFIG_RTC_DRV_DS1307=m +CONFIG_RTC_DRV_DS1553=m +CONFIG_RTC_DRV_ISL1208=m +CONFIG_RTC_DRV_DS1672=m +CONFIG_RTC_DRV_DS1742=m +CONFIG_RTC_DRV_PCF8563=m +CONFIG_RTC_DRV_PCF8583=m +CONFIG_RTC_DRV_RS5C372=m +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_TEST is not set +CONFIG_RTC_DRV_V3020=m + +# +# DMA Engine support +# +CONFIG_DMA_ENGINE=y + +# +# DMA Clients +# +CONFIG_NET_DMA=y + +# +# DMA Devices +# +CONFIG_INTEL_IOATDMA=m + +# +# Firmware Drivers +# +CONFIG_DELL_RBU=m +CONFIG_DCDBAS=m +CONFIG_ISCSI_IBFT_FIND=y +CONFIG_ISCSI_IBFT=m + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT2_FS_XIP=y +CONFIG_FS_XIP=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_EXT4DEV_FS=m +CONFIG_EXT4DEV_FS_XATTR=y +CONFIG_EXT4DEV_FS_POSIX_ACL=y +CONFIG_EXT4DEV_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# CONFIG_XFS_FS is not set +CONFIG_GFS2_FS=m +CONFIG_GFS2_FS_LOCKING_NOLOCK=m +CONFIG_GFS2_FS_LOCKING_DLM=m +# CONFIG_OCFS2_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_QUOTA=y +# CONFIG_QFMT_V1 is not set +CONFIG_QFMT_V2=y +CONFIG_QUOTACTL=y +CONFIG_DNOTIFY=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m +# CONFIG_FUSE_FS is not set + +# +# Caches +# +CONFIG_FSCACHE=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=y +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y +CONFIG_CACHEFILES=m +CONFIG_CACHEFILES_DEBUG=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_VMCORE=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y +CONFIG_CONFIGFS_FS=m + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +CONFIG_ECRYPT_FS=m +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +# CONFIG_BEFS_FS 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_WRITEBUFFER=y +CONFIG_JFFS2_SUMMARY=y +# CONFIG_JFFS2_FS_XATTR is not set +# 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_SQUASHFS=m +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_SQUASHFS_VMALLOC is not set +CONFIG_VXFS_FS=m +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_NFS_FSCACHE=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_NFS_ACL_SUPPORT=m +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_RPCSEC_GSS_SPKM3=m +# CONFIG_SMB_FS is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_DFS_UPCALL=y +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set +# CONFIG_9P_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +# CONFIG_LDM_PARTITION is not set +CONFIG_SGI_PARTITION=y +# CONFIG_ULTRIX_PARTITION is not set +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_EFI_PARTITION=y + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Distributed Lock Manager +# +CONFIG_DLM=m +CONFIG_DLM_DEBUG=y + +# +# Instrumentation Support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m +CONFIG_KPROBES=y + +# +# Kernel hacking +# +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_PRINTK_TIME is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_KERNEL=y +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_SCHEDSTATS=y +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_RT_MUTEX_TESTER is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_INFO=y +CONFIG_DEBUG_FS=y +# CONFIG_DEBUG_VM is not set +CONFIG_DEBUG_LIST=y +# CONFIG_FRAME_POINTER is not set +# CONFIG_FORCED_INLINING is not set +CONFIG_BOOT_DELAY=y +# CONFIG_RCU_TORTURE_TEST is not set +CONFIG_SAMPLES=y +CONFIG_SAMPLE_MARKERS=m +CONFIG_SAMPLE_TRACEPOINTS=m +CONFIG_DEBUG_RODATA=y +CONFIG_DEBUG_STACKOVERFLOW=y +# CONFIG_DEBUG_STACK_USAGE is not set + +# +# Security options +# +CONFIG_KEYS=y +CONFIG_KEYS_DEBUG_PROC_KEYS=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_NETWORK_XFRM=y +CONFIG_SECURITY_CAPABILITIES=y +# CONFIG_SECURITY_ROOTPLUG is not set +# CONFIG_SECURITY_SECLVL 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_CHECKREQPROT_VALUE=1 +CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT=y +# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_API=m +CONFIG_CRYPTO_FIPS=y +CONFIG_CRYPTO_ALGAPI=m +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_BLKCIPHER=m +CONFIG_CRYPTO_SEQIV=m +CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_RNG=m +CONFIG_CRYPTO_MANAGER=m +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NHMAC=m +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=m +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_TGR192=m +CONFIG_CRYPTO_ECB=m +CONFIG_CRYPTO_CBC=m +CONFIG_CRYPTO_CTR=m +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_AES_X86_64=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_SIGNATURE=y +CONFIG_CRYPTO_SIGNATURE_DSA=y +CONFIG_CRYPTO_MPILIB=y + +# +# Random Number Generation +# +CONFIG_CRYPTO_ANSI_CPRNG=m + +# +# Hardware crypto devices +# +CONFIG_XEN=y +CONFIG_XEN_INTERFACE_VERSION=0x00030203 + +# +# XEN +# +CONFIG_XEN_PRIVILEGED_GUEST=y +# CONFIG_XEN_UNPRIVILEGED_GUEST is not set +CONFIG_XEN_PRIVCMD=y +CONFIG_XEN_XENBUS_DEV=y +CONFIG_XEN_BACKEND=y +CONFIG_XEN_BLKDEV_BACKEND=m +CONFIG_XEN_BLKDEV_TAP=m +CONFIG_XEN_NETDEV_BACKEND=m +# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set +CONFIG_XEN_NETDEV_LOOPBACK=m +CONFIG_XEN_PCIDEV_BACKEND=m +CONFIG_XEN_PCIDEV_BACKEND_VPCI=y +# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set +# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set +# CONFIG_XEN_PCIDEV_BE_DEBUG is not set +# CONFIG_XEN_TPMDEV_BACKEND is not set +CONFIG_XEN_BLKDEV_FRONTEND=m +CONFIG_XEN_NETDEV_FRONTEND=m +CONFIG_XEN_FRAMEBUFFER=y +CONFIG_XEN_KEYBOARD=y +CONFIG_XEN_SCRUB_PAGES=y +# CONFIG_XEN_DISABLE_SERIAL is not set +CONFIG_XEN_SYSFS=y +CONFIG_XEN_COMPAT_030002_AND_LATER=y +# CONFIG_XEN_COMPAT_LATEST_ONLY is not set +CONFIG_XEN_COMPAT_030002=y +CONFIG_HAVE_ARCH_ALLOC_SKB=y +CONFIG_HAVE_ARCH_DEV_ALLOC_SKB=y +CONFIG_HAVE_IRQ_IGNORE_UNHANDLED=y +CONFIG_NO_IDLE_HZ=y +CONFIG_XEN_UTIL=y +CONFIG_XEN_BALLOON=y +CONFIG_XEN_DEVMEM=y +CONFIG_XEN_SKBUFF=y +CONFIG_XEN_REBOOT=y +CONFIG_XEN_SMPBOOT=y + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC16=m +CONFIG_CRC_ITU_T=m +CONFIG_CRC32=y +CONFIG_LIBCRC32C=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_REED_SOLOMON=m +CONFIG_REED_SOLOMON_DEC16=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/lustre/kernel_patches/patches/small-fixes-about-jbd.patch b/lustre/kernel_patches/patches/small-fixes-about-jbd.patch new file mode 100644 index 0000000..d39a174 --- /dev/null +++ b/lustre/kernel_patches/patches/small-fixes-about-jbd.patch @@ -0,0 +1,13 @@ +diff -pur linux-2.6.18-128.orig/fs/jbd/commit.c linux-2.6.18-128/fs/jbd/commit.c +--- linux-2.6.18-128.orig/fs/jbd/commit.c 2009-04-10 16:31:40.000000000 +0800 ++++ linux-2.6.18-128/fs/jbd/commit.c 2009-04-10 16:33:14.000000000 +0800 +@@ -862,7 +862,8 @@ wait_for_iobuf: + if (err) + __journal_abort_hard(journal); + } +- err = journal_wait_on_commit_record(cbh); ++ if (!err && !is_journal_aborted(journal)) ++ err = journal_wait_on_commit_record(cbh); + + if (err) + journal_abort(journal, err); diff --git a/lustre/kernel_patches/series/2.6-rhel5.series b/lustre/kernel_patches/series/2.6-rhel5.series index 16831b3..7818b6b 100644 --- a/lustre/kernel_patches/series/2.6-rhel5.series +++ b/lustre/kernel_patches/series/2.6-rhel5.series @@ -21,3 +21,4 @@ md-rebuild-policy.patch jbd-journal-chksum-2.6.18-vanilla.patch quota-large-limits-rhel5.patch raid5-mmp-unplug-dev.patch +small-fixes-about-jbd.patch diff --git a/lustre/lclient/lcommon_cl.c b/lustre/lclient/lcommon_cl.c index 2b96562..569f165 100644 --- a/lustre/lclient/lcommon_cl.c +++ b/lustre/lclient/lcommon_cl.c @@ -560,11 +560,15 @@ int ccc_transient_page_prep(const struct lu_env *env, * */ +void ccc_lock_delete(const struct lu_env *env, + const struct cl_lock_slice *slice) +{ + CLOBINVRNT(env, slice->cls_obj, ccc_object_invariant(slice->cls_obj)); +} + void ccc_lock_fini(const struct lu_env *env, struct cl_lock_slice *slice) { struct ccc_lock *clk = cl2ccc_lock(slice); - - CLOBINVRNT(env, slice->cls_obj, ccc_object_invariant(slice->cls_obj)); OBD_SLAB_FREE_PTR(clk, ccc_lock_kmem); } @@ -781,10 +785,12 @@ static void ccc_object_size_unlock(struct cl_object *obj, int vfslock) * the resulting races. */ int ccc_prep_size(const struct lu_env *env, struct cl_object *obj, - struct cl_io *io, loff_t pos, int vfslock) + struct cl_io *io, loff_t start, size_t count, int vfslock, + int *exceed) { struct cl_attr *attr = &ccc_env_info(env)->cti_attr; struct inode *inode = ccc_object_inode(obj); + loff_t pos = start + count - 1; loff_t kms; int result; @@ -818,7 +824,21 @@ int ccc_prep_size(const struct lu_env *env, struct cl_object *obj, * of the buffer (C) */ ccc_object_size_unlock(obj, vfslock); - return cl_glimpse_lock(env, io, inode, obj); + result = cl_glimpse_lock(env, io, inode, obj); + if (result == 0 && exceed != NULL) { + /* If objective page index exceed end-of-file + * page index, return directly. Do not expect + * kernel will check such case correctly. + * linux-2.6.18-128.1.1 miss to do that. + * --bug 17336 */ + size_t size = cl_isize_read(inode); + unsigned long cur_index = start >> CFS_PAGE_SHIFT; + + if ((size == 0 && cur_index != 0) || + (((size - 1) >> CFS_PAGE_SHIFT) < cur_index)) + *exceed = 1; + } + return result; } else { /* * region is within kms and, hence, within real file @@ -1155,7 +1175,6 @@ void cl_inode_fini(struct inode *inode) int emergency; if (clob != NULL) { - struct lu_object_header *head = clob->co_lu.lo_header; void *cookie; cookie = cl_env_reenter(); @@ -1174,8 +1193,6 @@ void cl_inode_fini(struct inode *inode) */ cl_object_kill(env, clob); lu_object_ref_del(&clob->co_lu, "inode", inode); - /* XXX temporary: this is racy */ - LASSERT(atomic_read(&head->loh_ref) == 1); cl_object_put(env, clob); lli->lli_clob = NULL; if (emergency) { diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index 2c498dc..8e34c04 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -99,7 +99,7 @@ static int import_set_conn(struct obd_import *imp, struct obd_uuid *uuid, if (create) { imp_conn->oic_conn = ptlrpc_conn; imp_conn->oic_uuid = *uuid; - item->oic_last_attempt = 0; + imp_conn->oic_last_attempt = 0; if (priority) list_add(&imp_conn->oic_item, &imp->imp_conn_list); else @@ -188,7 +188,7 @@ out: RETURN(rc); } -static void destroy_import(struct obd_import *imp) +void client_destroy_import(struct obd_import *imp) { /* drop security policy instance after all rpc finished/aborted * to let all busy contexts be released. */ @@ -400,15 +400,15 @@ int client_connect_import(const struct lu_env *env, *exp = NULL; down_write(&cli->cl_sem); + if (cli->cl_conn_count > 0 ) + GOTO(out_sem, rc = -EALREADY); + rc = class_connect(&conn, obd, cluuid); if (rc) GOTO(out_sem, rc); - - *exp = class_conn2export(&conn); - + cli->cl_conn_count++; - if (cli->cl_conn_count > 1) - GOTO(out_sem, rc); + *exp = class_conn2export(&conn); if (obd->obd_namespace != NULL) CERROR("already have namespace!\n"); @@ -539,7 +539,7 @@ int client_disconnect_export(struct obd_export *exp) ptlrpc_free_rq_pool(imp->imp_rq_pool); imp->imp_rq_pool = NULL; } - destroy_import(imp); + client_destroy_import(imp); cli->cl_import = NULL; EXIT; @@ -962,7 +962,7 @@ dont_check_exports: atomic_inc(&target->obd_lock_replay_clients); if (target->obd_connected_clients == target->obd_max_recoverable_clients) - wake_up(&target->obd_next_transno_waitq); + cfs_waitq_signal(&target->obd_next_transno_waitq); } spin_unlock_bh(&target->obd_processing_task_lock); tmp = req_capsule_client_get(&req->rq_pill, &RMF_CONN); @@ -986,7 +986,7 @@ dont_check_exports: */ sptlrpc_import_inval_all_ctx(export->exp_imp_reverse); - destroy_import(export->exp_imp_reverse); + client_destroy_import(export->exp_imp_reverse); } /* for the rest part, we return -ENOTCONN in case of errors @@ -1055,7 +1055,7 @@ void target_destroy_export(struct obd_export *exp) /* exports created from last_rcvd data, and "fake" exports created by lctl don't have an import */ if (exp->exp_imp_reverse != NULL) - destroy_import(exp->exp_imp_reverse); + client_destroy_import(exp->exp_imp_reverse); /* We cancel locks at disconnect time, but this will catch any locks * granted in a race with recovery-induced disconnect. */ @@ -1189,7 +1189,7 @@ static void target_finish_recovery(struct obd_device *obd) list_empty(&obd->obd_final_req_queue)) { obd->obd_processing_task = 0; } else { - CERROR("%s: Recovery queues ( %s%s%s) are empty\n", + CERROR("%s: Recovery queues ( %s%s%s) are not empty\n", obd->obd_name, list_empty(&obd->obd_req_replay_queue) ? "" : "req ", list_empty(&obd->obd_lock_replay_queue) ? "" : "lock ", @@ -1465,7 +1465,8 @@ static int check_for_next_transno(struct obd_device *obd) * to replay requests that demand on already committed ones * also, we can replay first non-committed transation */ LASSERT(req_transno != 0); - if (req_transno == obd->obd_last_committed + 1) { + if (obd->obd_version_recov || + req_transno == obd->obd_last_committed + 1) { obd->obd_next_recovery_transno = req_transno; } else if (req_transno > obd->obd_last_committed) { /* can't continue recovery: have no needed transno */ @@ -1564,6 +1565,11 @@ static struct ptlrpc_request *target_next_final_ping(struct obd_device *obd) req = list_entry(obd->obd_final_req_queue.next, struct ptlrpc_request, rq_list); list_del_init(&req->rq_list); + if (req->rq_export->exp_in_recovery) { + spin_lock(&req->rq_export->exp_lock); + req->rq_export->exp_in_recovery = 0; + spin_unlock(&req->rq_export->exp_lock); + } } else { req = NULL; } @@ -1571,6 +1577,11 @@ static struct ptlrpc_request *target_next_final_ping(struct obd_device *obd) return req; } +static inline int req_vbr_done(struct obd_export *exp) +{ + return (exp->exp_vbr_failed == 0); +} + static inline int req_replay_done(struct obd_export *exp) { return (exp->exp_req_replay_needed == 0); @@ -1588,7 +1599,7 @@ static inline int connect_done(struct obd_export *exp) static int check_for_clients(struct obd_device *obd) { - if (obd->obd_abort_recovery) + if (obd->obd_abort_recovery || obd->obd_version_recov) return 1; LASSERT(obd->obd_connected_clients <= obd->obd_max_recoverable_clients); if (obd->obd_no_conn == 0 && @@ -1631,15 +1642,10 @@ static int handle_recovery_req(struct ptlrpc_thread *thread, RETURN(0); } -static void resume_recovery_timer(struct obd_device *obd) -{ - /* to be safe, make it at least OBD_RECOVERY_FACTOR * obd_timeout */ - reset_recovery_timer(obd, OBD_RECOVERY_FACTOR * obd_timeout, 1); -} - static int target_recovery_thread(void *arg) { - struct obd_device *obd = arg; + struct lu_target *lut = arg; + struct obd_device *obd = lut->lut_obd; struct ptlrpc_request *req; struct target_recovery_data *trd = &obd->obd_recovery_data; struct l_wait_info lwi = { 0 }; @@ -1665,8 +1671,8 @@ static int target_recovery_thread(void *arg) env.le_ctx.lc_thread = thread; CERROR("%s: started recovery thread pid %d\n", obd->obd_name, - current->pid); - trd->trd_processing_task = current->pid; + cfs_curproc_pid()); + trd->trd_processing_task = cfs_curproc_pid(); obd->obd_recovering = 1; complete(&trd->trd_starting); @@ -1676,29 +1682,31 @@ static int target_recovery_thread(void *arg) l_wait_event(obd->obd_next_transno_waitq, check_for_clients(obd), &lwi); - spin_lock_bh(&obd->obd_processing_task_lock); - target_cancel_recovery_timer(obd); - spin_unlock_bh(&obd->obd_processing_task_lock); - /* If some clients haven't connected in time, evict them */ - if (obd->obd_abort_recovery) { + if (obd->obd_connected_clients < obd->obd_max_recoverable_clients) { CWARN("Some clients haven't connect in time (%d/%d)," "evict them\n", obd->obd_connected_clients, obd->obd_max_recoverable_clients); - obd->obd_abort_recovery = obd->obd_stopping; - class_disconnect_stale_exports(obd, connect_done, - exp_flags_from_obd(obd) | + class_disconnect_stale_exports(obd, connect_done, + exp_flags_from_obd(obd) | OBD_OPT_ABORT_RECOV); + /** + * if recovery proceeds with versions then some clients may be + * timed out waiting for others and trying to reconnect. + * Extend timer for such reconnect cases. + */ + if (obd->obd_version_recov) + reset_recovery_timer(obd, RECONNECT_DELAY_MAX * 2, 1); } + /* next stage: replay requests */ delta = jiffies; obd->obd_req_replaying = 1; CDEBUG(D_INFO, "1: request replay stage - %d clients from t"LPU64"\n", - atomic_read(&obd->obd_req_replay_clients), - obd->obd_next_recovery_transno); - resume_recovery_timer(obd); + atomic_read(&obd->obd_req_replay_clients), + obd->obd_next_recovery_transno); while ((req = target_next_replay_req(obd))) { - LASSERT(trd->trd_processing_task == current->pid); + LASSERT(trd->trd_processing_task == cfs_curproc_pid()); DEBUG_REQ(D_HA, req, "processing t"LPD64" from %s", lustre_msg_get_transno(req->rq_reqmsg), libcfs_nid2str(req->rq_peer.nid)); @@ -1710,56 +1718,55 @@ static int target_recovery_thread(void *arg) spin_unlock_bh(&obd->obd_processing_task_lock); } - spin_lock_bh(&obd->obd_processing_task_lock); - target_cancel_recovery_timer(obd); - spin_unlock_bh(&obd->obd_processing_task_lock); - /* If some clients haven't replayed requests in time, evict them */ if (obd->obd_abort_recovery) { - CDEBUG(D_ERROR, "req replay timed out, aborting ...\n"); - obd->obd_abort_recovery = obd->obd_stopping; - class_disconnect_stale_exports(obd, req_replay_done, - exp_flags_from_obd(obd) | + CDEBUG(D_WARNING, "req replay is aborted\n"); + class_disconnect_stale_exports(obd, req_replay_done, + exp_flags_from_obd(obd) | OBD_OPT_ABORT_RECOV); abort_req_replay_queue(obd); } + LASSERT(list_empty(&obd->obd_req_replay_queue)); /* The second stage: replay locks */ CDEBUG(D_INFO, "2: lock replay stage - %d clients\n", atomic_read(&obd->obd_lock_replay_clients)); - resume_recovery_timer(obd); while ((req = target_next_replay_lock(obd))) { - LASSERT(trd->trd_processing_task == current->pid); - DEBUG_REQ(D_HA|D_WARNING, req, "processing lock from %s: ", + LASSERT(trd->trd_processing_task == cfs_curproc_pid()); + DEBUG_REQ(D_HA, req, "processing lock from %s: ", libcfs_nid2str(req->rq_peer.nid)); handle_recovery_req(thread, req, trd->trd_recovery_handler); obd->obd_replayed_locks++; } - spin_lock_bh(&obd->obd_processing_task_lock); - target_cancel_recovery_timer(obd); - spin_unlock_bh(&obd->obd_processing_task_lock); /* If some clients haven't replayed requests in time, evict them */ if (obd->obd_abort_recovery) { int stale; - CERROR("lock replay timed out, aborting ...\n"); - obd->obd_abort_recovery = obd->obd_stopping; - stale = class_disconnect_stale_exports(obd, lock_replay_done, - exp_flags_from_obd(obd) | + CERROR("lock replay is aborted\n"); + stale = class_disconnect_stale_exports(obd, lock_replay_done, + exp_flags_from_obd(obd) | OBD_OPT_ABORT_RECOV); abort_lock_replay_queue(obd); } + LASSERT(list_empty(&obd->obd_lock_replay_queue)); + /* The third stage: reply on final pings */ + CDEBUG(D_INFO, "3: final stage - process recovery completion pings\n"); + /** evict exports failed VBR */ + class_disconnect_stale_exports(obd, req_vbr_done, + exp_flags_from_obd(obd) | + OBD_OPT_ABORT_RECOV); + /** Update server last boot epoch */ + lut_boot_epoch_update(lut); /* We drop recoverying flag to forward all new requests * to regular mds_handle() since now */ spin_lock_bh(&obd->obd_processing_task_lock); obd->obd_recovering = obd->obd_abort_recovery = 0; + target_cancel_recovery_timer(obd); spin_unlock_bh(&obd->obd_processing_task_lock); - /* The third stage: reply on final pings */ - CDEBUG(D_INFO, "3: final stage - process recovery completion pings\n"); while ((req = target_next_final_ping(obd))) { - LASSERT(trd->trd_processing_task == current->pid); + LASSERT(trd->trd_processing_task == cfs_curproc_pid()); DEBUG_REQ(D_HA, req, "processing final ping from %s: ", libcfs_nid2str(req->rq_peer.nid)); handle_recovery_req(thread, req, @@ -1771,7 +1778,7 @@ static int target_recovery_thread(void *arg) delta, obd->obd_replayed_requests, obd->obd_replayed_locks); LASSERT(atomic_read(&obd->obd_req_replay_clients) == 0); LASSERT(atomic_read(&obd->obd_lock_replay_clients) == 0); - if (delta > obd_timeout * 2) { + if (delta > obd_timeout * OBD_RECOVERY_FACTOR) { CWARN("too long recovery - read logs\n"); libcfs_debug_dumplog(); } @@ -1784,8 +1791,10 @@ static int target_recovery_thread(void *arg) RETURN(rc); } -int target_start_recovery_thread(struct obd_device *obd, svc_handler_t handler) +static int target_start_recovery_thread(struct lu_target *lut, + svc_handler_t handler) { + struct obd_device *obd = lut->lut_obd; int rc = 0; struct target_recovery_data *trd = &obd->obd_recovery_data; @@ -1794,7 +1803,7 @@ int target_start_recovery_thread(struct obd_device *obd, svc_handler_t handler) init_completion(&trd->trd_finishing); trd->trd_recovery_handler = handler; - if (kernel_thread(target_recovery_thread, obd, 0) > 0) { + if (kernel_thread(target_recovery_thread, lut, 0) > 0) { wait_for_completion(&trd->trd_starting); LASSERT(obd->obd_recovering != 0); } else @@ -1810,7 +1819,7 @@ void target_stop_recovery_thread(struct obd_device *obd) struct target_recovery_data *trd = &obd->obd_recovery_data; CERROR("%s: Aborting recovery\n", obd->obd_name); obd->obd_abort_recovery = 1; - wake_up(&obd->obd_next_transno_waitq); + cfs_waitq_signal(&obd->obd_next_transno_waitq); spin_unlock_bh(&obd->obd_processing_task_lock); wait_for_completion(&trd->trd_finishing); } else { @@ -1834,21 +1843,26 @@ static void target_recovery_expired(unsigned long castmeharder) obd->obd_name, obd->obd_recoverable_clients, cfs_time_current_sec()- obd->obd_recovery_start, obd->obd_connected_clients); + spin_lock_bh(&obd->obd_processing_task_lock); - if (obd->obd_recovering) - obd->obd_abort_recovery = 1; + obd->obd_version_recov = 1; + CDEBUG(D_INFO, "VBR is used for %d clients from t"LPU64"\n", + atomic_read(&obd->obd_req_replay_clients), + obd->obd_next_recovery_transno); cfs_waitq_signal(&obd->obd_next_transno_waitq); spin_unlock_bh(&obd->obd_processing_task_lock); } -void target_recovery_init(struct obd_device *obd, svc_handler_t handler) +void target_recovery_init(struct lu_target *lut, svc_handler_t handler) { + struct obd_device *obd = lut->lut_obd; if (obd->obd_max_recoverable_clients == 0) return; CWARN("RECOVERY: service %s, %d recoverable clients, " "last_transno "LPU64"\n", obd->obd_name, obd->obd_max_recoverable_clients, obd->obd_last_committed); + LASSERT(obd->obd_stopping == 0); obd->obd_next_recovery_transno = obd->obd_last_committed + 1; obd->obd_recovery_start = 0; obd->obd_recovery_end = 0; @@ -1856,13 +1870,14 @@ void target_recovery_init(struct obd_device *obd, svc_handler_t handler) /* bz13079: this should be set to desired value for ost but not for mds */ obd->obd_recovery_max_time = OBD_RECOVERY_MAX_TIME; cfs_timer_init(&obd->obd_recovery_timer, target_recovery_expired, obd); - target_start_recovery_thread(obd, handler); + target_start_recovery_thread(lut, handler); } EXPORT_SYMBOL(target_recovery_init); #endif -int target_process_req_flags(struct obd_device *obd, struct ptlrpc_request *req) +static int target_process_req_flags(struct obd_device *obd, + struct ptlrpc_request *req) { struct obd_export *exp = req->rq_export; LASSERT(exp != NULL); @@ -1879,7 +1894,6 @@ int target_process_req_flags(struct obd_device *obd, struct ptlrpc_request *req) obd->obd_recoverable_clients--; if (atomic_read(&obd->obd_req_replay_clients) == 0) CDEBUG(D_HA, "all clients have replayed reqs\n"); - wake_up(&obd->obd_next_transno_waitq); } spin_unlock_bh(&obd->obd_processing_task_lock); } @@ -1895,7 +1909,6 @@ int target_process_req_flags(struct obd_device *obd, struct ptlrpc_request *req) atomic_dec(&obd->obd_lock_replay_clients); if (atomic_read(&obd->obd_lock_replay_clients) == 0) CDEBUG(D_HA, "all clients have replayed locks\n"); - wake_up(&obd->obd_next_transno_waitq); } spin_unlock_bh(&obd->obd_processing_task_lock); } @@ -1909,7 +1922,6 @@ int target_queue_recovery_request(struct ptlrpc_request *req, struct list_head *tmp; int inserted = 0; __u64 transno = lustre_msg_get_transno(req->rq_reqmsg); - ENTRY; if (obd->obd_recovery_data.trd_processing_task == cfs_curproc_pid()) { @@ -1927,6 +1939,7 @@ int target_queue_recovery_request(struct ptlrpc_request *req, RETURN(-ENOMEM); DEBUG_REQ(D_HA, req, "queue final req"); spin_lock_bh(&obd->obd_processing_task_lock); + cfs_waitq_signal(&obd->obd_next_transno_waitq); if (obd->obd_recovering) list_add_tail(&req->rq_list, &obd->obd_final_req_queue); else { @@ -1948,6 +1961,7 @@ int target_queue_recovery_request(struct ptlrpc_request *req, RETURN(-ENOMEM); DEBUG_REQ(D_HA, req, "queue lock replay req"); spin_lock_bh(&obd->obd_processing_task_lock); + cfs_waitq_signal(&obd->obd_next_transno_waitq); LASSERT(obd->obd_recovering); /* usually due to recovery abort */ if (!req->rq_export->exp_in_recovery) { @@ -1958,7 +1972,6 @@ int target_queue_recovery_request(struct ptlrpc_request *req, LASSERT(req->rq_export->exp_lock_replay_needed); list_add_tail(&req->rq_list, &obd->obd_lock_replay_queue); spin_unlock_bh(&obd->obd_processing_task_lock); - wake_up(&obd->obd_next_transno_waitq); RETURN(0); } @@ -2043,7 +2056,7 @@ int target_queue_recovery_request(struct ptlrpc_request *req, list_add_tail(&req->rq_list, &obd->obd_req_replay_queue); obd->obd_requests_queued_for_recovery++; - wake_up(&obd->obd_next_transno_waitq); + cfs_waitq_signal(&obd->obd_next_transno_waitq); spin_unlock_bh(&obd->obd_processing_task_lock); RETURN(0); } @@ -2156,21 +2169,18 @@ void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id) rs->rs_transno = req->rq_transno; rs->rs_export = exp; - spin_lock(&obd->obd_uncommitted_replies_lock); - + spin_lock(&exp->exp_uncommitted_replies_lock); CDEBUG(D_NET, "rs transno = "LPU64", last committed = "LPU64"\n", - rs->rs_transno, obd->obd_last_committed); - if (rs->rs_transno > obd->obd_last_committed) { + rs->rs_transno, exp->exp_last_committed); + if (rs->rs_transno > exp->exp_last_committed) { /* not committed already */ - list_add_tail (&rs->rs_obd_list, - &obd->obd_uncommitted_replies); + list_add_tail(&rs->rs_obd_list, + &exp->exp_uncommitted_replies); } + spin_unlock (&exp->exp_uncommitted_replies_lock); - spin_unlock (&obd->obd_uncommitted_replies_lock); - spin_lock (&exp->exp_lock); - - list_add_tail (&rs->rs_exp_list, &exp->exp_outstanding_replies); - + spin_lock(&exp->exp_lock); + list_add_tail(&rs->rs_exp_list, &exp->exp_outstanding_replies); spin_unlock(&exp->exp_lock); netrc = target_send_reply_msg (req, rc, fail_id); @@ -2191,7 +2201,7 @@ void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id) } spin_lock(&rs->rs_lock); - if (rs->rs_transno <= obd->obd_last_committed || + if (rs->rs_transno <= exp->exp_last_committed || (!rs->rs_on_net && !rs->rs_no_ack) || list_empty(&rs->rs_exp_list) || /* completed already */ list_empty(&rs->rs_obd_list)) { @@ -2214,26 +2224,19 @@ int target_handle_ping(struct ptlrpc_request *req) void target_committed_to_req(struct ptlrpc_request *req) { - struct obd_device *obd; - - if (req == NULL || req->rq_export == NULL) - return; - - obd = req->rq_export->exp_obd; - if (obd == NULL) - return; + struct obd_export *exp = req->rq_export; - if (!obd->obd_no_transno && req->rq_repmsg != NULL) + if (!exp->exp_obd->obd_no_transno && req->rq_repmsg != NULL) lustre_msg_set_last_committed(req->rq_repmsg, - obd->obd_last_committed); + exp->exp_last_committed); else DEBUG_REQ(D_IOCTL, req, "not sending last_committed update (%d/" - "%d)", obd->obd_no_transno, req->rq_repmsg == NULL); + "%d)", exp->exp_obd->obd_no_transno, + req->rq_repmsg == NULL); CDEBUG(D_INFO, "last_committed "LPU64", transno "LPU64", xid "LPU64"\n", - obd->obd_last_committed, req->rq_transno, req->rq_xid); + exp->exp_last_committed, req->rq_transno, req->rq_xid); } - EXPORT_SYMBOL(target_committed_to_req); int target_handle_qc_callback(struct ptlrpc_request *req) diff --git a/lustre/ldlm/ldlm_lockd.c b/lustre/ldlm/ldlm_lockd.c index ae31ec6..f6fe4a7 100644 --- a/lustre/ldlm/ldlm_lockd.c +++ b/lustre/ldlm/ldlm_lockd.c @@ -319,6 +319,7 @@ repeat: cont = 0; LDLM_LOCK_GET(lock); + spin_unlock_bh(&waiting_locks_spinlock); LDLM_DEBUG(lock, "prolong the busy lock"); ldlm_refresh_waiting_lock(lock, @@ -326,11 +327,11 @@ repeat: spin_lock_bh(&waiting_locks_spinlock); if (!cont) { - LDLM_LOCK_PUT(lock); + LDLM_LOCK_RELEASE(lock); break; } - LDLM_LOCK_PUT(lock); + LDLM_LOCK_RELEASE(lock); continue; } lock->l_resource->lr_namespace->ns_timeouts++; @@ -1692,21 +1693,6 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) req_capsule_init(&req->rq_pill, req, RCL_SERVER); if (req->rq_export == NULL) { - struct ldlm_request *dlm_req; - - CDEBUG(D_RPCTRACE, "operation %d from %s with bad " - "export cookie "LPX64"; this is " - "normal if this node rebooted with a lock held\n", - lustre_msg_get_opc(req->rq_reqmsg), - libcfs_id2str(req->rq_peer), - lustre_msg_get_handle(req->rq_reqmsg)->cookie); - - req_capsule_set(&req->rq_pill, &RQF_LDLM_CALLBACK); - dlm_req = req_capsule_client_get(&req->rq_pill, &RMF_DLM_REQ); - if (dlm_req != NULL) - CDEBUG(D_RPCTRACE, "--> lock cookie: "LPX64"\n", - dlm_req->lock_handle[0].cookie); - ldlm_callback_reply(req, -ENOTCONN); RETURN(0); } @@ -2557,7 +2543,6 @@ EXPORT_SYMBOL(client_obd_setup); EXPORT_SYMBOL(client_obd_cleanup); EXPORT_SYMBOL(client_connect_import); EXPORT_SYMBOL(client_disconnect_export); -EXPORT_SYMBOL(target_start_recovery_thread); EXPORT_SYMBOL(target_stop_recovery_thread); EXPORT_SYMBOL(target_handle_connect); EXPORT_SYMBOL(target_cleanup_recovery); diff --git a/lustre/liblustre/llite_cl.c b/lustre/liblustre/llite_cl.c index 59c7d68..0a29220 100644 --- a/lustre/liblustre/llite_cl.c +++ b/lustre/liblustre/llite_cl.c @@ -414,6 +414,7 @@ static int slp_lock_enqueue(const struct lu_env *env, } static const struct cl_lock_operations slp_lock_ops = { + .clo_delete = ccc_lock_delete, .clo_fini = ccc_lock_fini, .clo_enqueue = slp_lock_enqueue, .clo_wait = ccc_lock_wait, @@ -647,6 +648,7 @@ static int slp_io_start(const struct lu_env *env, const struct cl_io_slice *ios) struct llu_inode_info *lli = llu_i2info(inode); struct llu_io_session *session = cl2slp_io(env, ios)->sio_session; int write = io->ci_type == CIT_WRITE; + int exceed = 0; CLOBINVRNT(env, obj, ccc_object_invariant(obj)); @@ -668,8 +670,8 @@ static int slp_io_start(const struct lu_env *env, const struct cl_io_slice *ios) if (IS_ERR(iogroup)) RETURN(PTR_ERR(iogroup)); - err = ccc_prep_size(env, obj, io, pos + cnt - 1, 0); - if (err != 0) + err = ccc_prep_size(env, obj, io, pos, cnt, 0, &exceed); + if (err != 0 || (write == 0 && exceed != 0)) GOTO(out, err); CDEBUG(D_INODE, diff --git a/lustre/liblustre/llite_lib.c b/lustre/liblustre/llite_lib.c index 5a34a82..7baec8c 100644 --- a/lustre/liblustre/llite_lib.c +++ b/lustre/liblustre/llite_lib.c @@ -177,7 +177,7 @@ int liblustre_process_log(struct config_llog_instance *cfg, GOTO(out_cleanup, rc = -ENOMEM); ocd->ocd_connect_flags = OBD_CONNECT_VERSION | OBD_CONNECT_FID | - OBD_CONNECT_AT; + OBD_CONNECT_AT | OBD_CONNECT_VBR; #ifdef LIBLUSTRE_POSIX_ACL ocd->ocd_connect_flags |= OBD_CONNECT_ACL; #endif diff --git a/lustre/liblustre/super.c b/lustre/liblustre/super.c index 5e8acf3..0234909 100644 --- a/lustre/liblustre/super.c +++ b/lustre/liblustre/super.c @@ -2017,7 +2017,8 @@ llu_fsswop_mount(const char *source, sizeof(async), &async, NULL); ocd.ocd_connect_flags = OBD_CONNECT_IBITS | OBD_CONNECT_VERSION | - OBD_CONNECT_FID | OBD_CONNECT_AT; + OBD_CONNECT_FID | OBD_CONNECT_AT | + OBD_CONNECT_VBR; #ifdef LIBLUSTRE_POSIX_ACL ocd.ocd_connect_flags |= OBD_CONNECT_ACL; #endif diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index 0f7c7e6..985fff7 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -470,11 +470,11 @@ int ll_revalidate_it(struct dentry *de, int lookup_flags, do_lock: it->it_create_mode &= ~current->fs->umask; - it->it_flags |= O_CHECK_STALE; + it->it_create_mode |= M_CHECK_STALE; rc = md_intent_lock(exp, op_data, NULL, 0, it, lookup_flags, &req, ll_md_blocking_ast, 0); - it->it_flags &= ~O_CHECK_STALE; + it->it_create_mode &= ~M_CHECK_STALE; ll_finish_md_op_data(op_data); if (it->it_op == IT_GETATTR && !first) /* If there are too many locks on client-side, then some diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 7a8c316..79203b8 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -607,9 +607,9 @@ restart: would attempt to grab och_sem as well, that would result in a deadlock */ up(&lli->lli_och_sem); - it->it_flags |= O_CHECK_STALE; + it->it_create_mode |= M_CHECK_STALE; rc = ll_intent_file_open(file, NULL, 0, it); - it->it_flags &= ~O_CHECK_STALE; + it->it_create_mode &= ~M_CHECK_STALE; if (rc) { ll_file_data_put(fd); GOTO(out_openerr, rc); @@ -1464,7 +1464,8 @@ static int join_file(struct inode *head_inode, struct file *head_filp, { struct dentry *tail_dentry = tail_filp->f_dentry; struct lookup_intent oit = {.it_op = IT_OPEN, - .it_flags = head_filp->f_flags|O_JOIN_FILE}; + .it_flags = head_filp->f_flags, + .it_create_mode = M_JOIN_FILE}; struct ldlm_enqueue_info einfo = { LDLM_IBITS, LCK_CW, ll_md_blocking_ast, ldlm_completion_ast, NULL, NULL, NULL }; @@ -2177,14 +2178,14 @@ int ll_inode_revalidate_it(struct dentry *dentry, struct lookup_intent *it) if (IS_ERR(op_data)) RETURN(PTR_ERR(op_data)); - oit.it_flags |= O_CHECK_STALE; + oit.it_create_mode |= M_CHECK_STALE; rc = md_intent_lock(exp, op_data, NULL, 0, /* we are not interested in name based lookup */ &oit, 0, &req, ll_md_blocking_ast, 0); ll_finish_md_op_data(op_data); - oit.it_flags &= ~O_CHECK_STALE; + oit.it_create_mode &= ~M_CHECK_STALE; if (rc < 0) { rc = ll_inode_revalidate_fini(inode, rc); GOTO (out, rc); diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index b89b895..e780458 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -196,7 +196,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt) OBD_CONNECT_VERSION | OBD_CONNECT_MDS_CAPA | OBD_CONNECT_OSS_CAPA | OBD_CONNECT_CANCELSET| OBD_CONNECT_FID | OBD_CONNECT_AT | - OBD_CONNECT_LOV_V3 | OBD_CONNECT_RMT_CLIENT; + OBD_CONNECT_LOV_V3 | OBD_CONNECT_RMT_CLIENT | + OBD_CONNECT_VBR; #ifdef HAVE_LRU_RESIZE_SUPPORT if (sbi->ll_flags & LL_SBI_LRU_RESIZE) @@ -339,7 +340,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt) OBD_CONNECT_CANCELSET | OBD_CONNECT_FID | OBD_CONNECT_SRVLOCK | OBD_CONNECT_TRUNCLOCK| OBD_CONNECT_AT | OBD_CONNECT_RMT_CLIENT | - OBD_CONNECT_OSS_CAPA | OBD_CONNECT_GRANT_SHRINK; + OBD_CONNECT_OSS_CAPA | OBD_CONNECT_VBR| + OBD_CONNECT_GRANT_SHRINK; if (!OBD_FAIL_CHECK(OBD_FAIL_OSC_CONNECT_CKSUM)) { /* OBD_CONNECT_CKSUM should always be set, even if checksums are diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index d3f59a6..fce46bd 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -289,6 +289,17 @@ int ll_prepare_write(struct file *file, struct page *vmpage, unsigned from, } if (result == 0) { cl_page_assume(env, io, page); + if (cl_io_is_append(io)) { + struct cl_object *obj = io->ci_obj; + struct inode *inode = ccc_object_inode(obj); + /** + * In VFS file->page write loop, for appending, the + * write offset might be reset according to the new + * file size before holding i_mutex. So crw_pos should + * be reset here. BUG:17711. + */ + io->u.ci_wr.wr.crw_pos = i_size_read(inode); + } result = cl_io_prepare_write(env, io, page, from, to); if (result == 0) { struct vvp_io *vio; diff --git a/lustre/llite/statahead.c b/lustre/llite/statahead.c index e341675..c853210 100644 --- a/lustre/llite/statahead.c +++ b/lustre/llite/statahead.c @@ -1075,8 +1075,8 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp, int lookup) struct ll_inode_info *lli = ll_i2info(dir); struct ll_statahead_info *sai = lli->lli_sai; struct ll_sa_thread_args sta; - struct l_wait_info lwi = { 0 }; - int rc; + struct l_wait_info lwi = LWI_INTR(LWI_ON_SIGNAL_NOOP, NULL); + int rc = 0; ENTRY; LASSERT(lli->lli_opendir_pid == cfs_curproc_pid()); @@ -1120,9 +1120,10 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp, int lookup) /* * thread started already, avoid double-stat. */ - l_wait_event(sai->sai_waitq, - ll_sai_entry_stated(sai) || sa_is_stopped(sai), - &lwi); + rc = l_wait_event(sai->sai_waitq, + ll_sai_entry_stated(sai) || + sa_is_stopped(sai), + &lwi); } if (lookup) { @@ -1141,7 +1142,7 @@ int do_statahead_enter(struct inode *dir, struct dentry **dentryp, int lookup) /* * do nothing for revalidate. */ - RETURN(0); + RETURN(rc); } /* diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index 7adac17..727a5b7 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -456,15 +456,18 @@ static int vvp_io_read_start(const struct lu_env *env, loff_t pos = io->u.ci_rd.rd.crw_pos; size_t cnt = io->u.ci_rd.rd.crw_count; size_t tot = cio->cui_tot_count; + int exceed = 0; CLOBINVRNT(env, obj, ccc_object_invariant(obj)); LASSERT(vio->cui_oneshot == 0); - CDEBUG(D_VFSTRACE, "read: -> [%lli, %lli)\n", pos, pos + cnt); + CDEBUG(D_VFSTRACE, "read: -> [%lli, %lli)\n", pos, pos + (long long)cnt); - result = ccc_prep_size(env, obj, io, pos + tot - 1, 1); + result = ccc_prep_size(env, obj, io, pos, tot, 1, &exceed); if (result != 0) return result; + else if (exceed != 0) + goto out; LU_OBJECT_HEADER(D_INODE, env, &obj->co_lu, "Read ino %lu, "LPSZ" bytes, offset %lld, size %llu\n", @@ -493,6 +496,7 @@ static int vvp_io_read_start(const struct lu_env *env, result = lustre_generic_file_read(file, cio, &pos); } +out: if (result >= 0) { if (result < cnt) io->ci_continue = 0; @@ -518,14 +522,18 @@ static int vvp_io_write_start(const struct lu_env *env, ENTRY; - if (cl_io_is_append(io)) + if (cl_io_is_append(io)) { /* * PARALLEL IO This has to be changed for parallel IO doing * out-of-order writes. */ pos = io->u.ci_wr.wr.crw_pos = i_size_read(inode); +#ifndef HAVE_FILE_WRITEV + cio->cui_iocb->ki_pos = pos; +#endif + } - CDEBUG(D_VFSTRACE, "write: [%lli, %lli)\n", pos, pos + cnt); + CDEBUG(D_VFSTRACE, "write: [%lli, %lli)\n", pos, pos + (long long)cnt); if (cl2vvp_io(env, ios)->cui_oneshot > 0) result = 0; @@ -567,7 +575,7 @@ static int vvp_io_fault_start(const struct lu_env *env, /* offset of the last byte on the page */ offset = cl_offset(obj, fio->ft_index + 1) - 1; LASSERT(cl_index(obj, offset) == fio->ft_index); - result = ccc_prep_size(env, obj, io, offset, 0); + result = ccc_prep_size(env, obj, io, 0, offset + 1, 0, NULL); if (result != 0) return result; @@ -900,6 +908,9 @@ static int vvp_io_commit_write(const struct lu_env *env, */ result = vvp_page_sync_io(env, io, pg, cp, to, CRT_WRITE); + if (result) + CERROR("Write page %lu of inode %p failed %d\n", + pg->cp_index, inode, result); } else { tallyop = LPROC_LL_DIRTY_HITS; result = 0; diff --git a/lustre/llite/vvp_lock.c b/lustre/llite/vvp_lock.c index f0c487d..846934c 100644 --- a/lustre/llite/vvp_lock.c +++ b/lustre/llite/vvp_lock.c @@ -73,6 +73,7 @@ static unsigned long vvp_lock_weigh(const struct lu_env *env, } static const struct cl_lock_operations vvp_lock_ops = { + .clo_delete = ccc_lock_delete, .clo_fini = ccc_lock_fini, .clo_enqueue = ccc_lock_enqueue, .clo_wait = ccc_lock_wait, diff --git a/lustre/llite/vvp_page.c b/lustre/llite/vvp_page.c index 14e7fdb..cc3b57c 100644 --- a/lustre/llite/vvp_page.c +++ b/lustre/llite/vvp_page.c @@ -244,19 +244,30 @@ static void vvp_page_completion_common(const struct lu_env *env, LINVRNT(cl_page_is_vmlocked(env, clp)); - /* Don't assert the page writeback bit here because the lustre file - * may be as a backend of swap space. in this case, the page writeback - * is set by VM, and obvious we shouldn't clear it at all. Fortunately - * this type of pages are all TRANSIENT pages. */ - KLASSERT(ergo(clp->cp_type == CPT_CACHEABLE, !PageWriteback(vmpage))); - - vvp_vmpage_error(inode, vmpage, ioret); - if (anchor != NULL) { cp->cpg_sync_io = NULL; cl_sync_io_note(anchor, ioret); - } else if (clp->cp_type == CPT_CACHEABLE) + } else if (clp->cp_type == CPT_CACHEABLE) { + /* + * Don't assert the page writeback bit here because the lustre + * file may be as a backend of swap space. in this case, the + * page writeback is set by VM, and obvious we shouldn't clear + * it at all. Fortunately this type of pages are all TRANSIENT + * pages. + */ + LASSERT(!PageWriteback(vmpage)); + + /* + * Only mark the page error only when it's a cacheable page + * and NOT a sync io. + * + * For sync IO and direct IO(CPT_TRANSIENT), the error is able + * to be seen by application, so we don't need to mark a page + * as error at all. + */ + vvp_vmpage_error(inode, vmpage, ioret); unlock_page(vmpage); + } } static void vvp_page_completion_read(const struct lu_env *env, @@ -290,14 +301,18 @@ static void vvp_page_completion_write_common(const struct lu_env *env, { struct ccc_page *cp = cl2ccc_page(slice); - if (ioret == 0) { - cp->cpg_write_queued = 0; - /* - * Only ioret == 0, write succeed, then this page could be - * deleted from the pending_writing count. - */ - vvp_write_complete(cl2ccc(slice->cpl_obj), cp); - } + /* + * TODO: Actually it makes sense to add the page into oap pending + * list again and so that we don't need to take the page out from + * SoM write pending list, if we just meet a recoverable error, + * -ENOMEM, etc. + * To implement this, we just need to return a non zero value in + * ->cpo_completion method. The underlying transfer should be notified + * and then re-add the page into pending transfer queue. -jay + */ + cp->cpg_write_queued = 0; + vvp_write_complete(cl2ccc(slice->cpl_obj), cp); + vvp_page_completion_common(env, cp, ioret); } diff --git a/lustre/lov/lov_dev.c b/lustre/lov/lov_dev.c index cab0e3b..fd5e24a 100644 --- a/lustre/lov/lov_dev.c +++ b/lustre/lov/lov_dev.c @@ -243,18 +243,19 @@ static int lov_device_init(const struct lu_env *env, struct lu_device *d, struct lov_tgt_desc *desc; desc = ld->ld_lov->lov_tgts[i]; - if (desc->ltd_active) { - cl = cl_type_setup(env, d->ld_site, &lovsub_device_type, - desc->ltd_exp->exp_obd->obd_lu_dev); - if (IS_ERR(cl)) { - rc = PTR_ERR(cl); - break; - } - lsd = cl2lovsub_dev(cl); - lsd->acid_idx = i; - lsd->acid_super = ld; - ld->ld_target[i] = lsd; + if (desc == NULL) + continue; + + cl = cl_type_setup(env, d->ld_site, &lovsub_device_type, + desc->ltd_obd->obd_lu_dev); + if (IS_ERR(cl)) { + rc = PTR_ERR(cl); + break; } + lsd = cl2lovsub_dev(cl); + lsd->acid_idx = i; + lsd->acid_super = ld; + ld->ld_target[i] = lsd; } if (rc) @@ -424,12 +425,19 @@ static int lov_cl_add_target(const struct lu_env *env, struct lu_device *dev, tgt = obd->u.lov.lov_tgts[index]; LASSERT(tgt != NULL); + LASSERT(tgt->ltd_obd != NULL); + + if (!tgt->ltd_obd->obd_set_up) { + CERROR("Target %s not set up\n", obd_uuid2str(&tgt->ltd_uuid)); + RETURN(-EINVAL); + } rc = lov_expand_targets(env, ld); if (rc == 0 && ld->ld_flags & LOV_DEV_INITIALIZED) { LASSERT(dev->ld_site != NULL); + cl = cl_type_setup(env, dev->ld_site, &lovsub_device_type, - tgt->ltd_exp->exp_obd->obd_lu_dev); + tgt->ltd_obd->obd_lu_dev); if (!IS_ERR(cl)) { lsd = cl2lovsub_dev(cl); lsd->acid_idx = index; diff --git a/lustre/lov/lov_lock.c b/lustre/lov/lov_lock.c index 9c741f8..67700dd 100644 --- a/lustre/lov/lov_lock.c +++ b/lustre/lov/lov_lock.c @@ -1040,7 +1040,7 @@ static struct cl_lock_closure *lov_closure_get(const struct lu_env *env, struct cl_lock_closure *closure; closure = &lov_env_info(env)->lti_closure; - LINVRNT(list_empty(&closure->clc_list)); + LASSERT(list_empty(&closure->clc_list)); cl_lock_closure_init(env, closure, parent, 1); return closure; } diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index e51b0e2..d0b0d77 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -134,7 +134,7 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate, struct lov_obd *lov = &obd->u.lov; struct obd_uuid tgt_uuid; struct obd_device *tgt_obd; - struct obd_uuid lov_osc_uuid = { "LOV_OSC_UUID" }; + static struct obd_uuid lov_osc_uuid = { "LOV_OSC_UUID" }; struct obd_import *imp; #ifdef __KERNEL__ @@ -147,14 +147,8 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate, RETURN(-EINVAL); tgt_uuid = lov->lov_tgts[index]->ltd_uuid; + tgt_obd = lov->lov_tgts[index]->ltd_obd; - tgt_obd = class_find_client_obd(&tgt_uuid, LUSTRE_OSC_NAME, - &obd->obd_uuid); - - if (!tgt_obd) { - CERROR("Target %s not attached\n", obd_uuid2str(&tgt_uuid)); - RETURN(-EINVAL); - } if (!tgt_obd->obd_set_up) { CERROR("Target %s not set up\n", obd_uuid2str(&tgt_uuid)); RETURN(-EINVAL); @@ -201,11 +195,7 @@ int lov_connect_obd(struct obd_device *obd, __u32 index, int activate, } lov->lov_tgts[index]->ltd_reap = 0; - if (activate) { - lov->lov_tgts[index]->ltd_active = 1; - lov->desc.ld_active_tgt_count++; - lov->lov_tgts[index]->ltd_exp->exp_obd->obd_inactive = 0; - } + CDEBUG(D_CONFIG, "Connected tgt idx %d %s (%s) %sactive\n", index, obd_uuid2str(&tgt_uuid), tgt_obd->obd_name, activate ? "":"in"); @@ -453,7 +443,7 @@ static int lov_notify(struct obd_device *obd, struct obd_device *watched, { int rc = 0; ENTRY; - + if (ev == OBD_NOTIFY_ACTIVE || ev == OBD_NOTIFY_INACTIVE) { struct obd_uuid *uuid; @@ -524,6 +514,7 @@ int lov_add_target(struct obd_device *obd, struct obd_uuid *uuidp, { struct lov_obd *lov = &obd->u.lov; struct lov_tgt_desc *tgt; + struct obd_device *tgt_obd; int rc; ENTRY; @@ -536,6 +527,11 @@ int lov_add_target(struct obd_device *obd, struct obd_uuid *uuidp, RETURN(-EINVAL); } + tgt_obd = class_find_client_obd(uuidp, LUSTRE_OSC_NAME, + &obd->obd_uuid); + if (tgt_obd == NULL) + RETURN(-EINVAL); + mutex_down(&lov->lov_lock); if ((index < lov->lov_tgt_size) && (lov->lov_tgts[index] != NULL)) { @@ -587,6 +583,7 @@ int lov_add_target(struct obd_device *obd, struct obd_uuid *uuidp, memset(tgt, 0, sizeof(*tgt)); tgt->ltd_uuid = *uuidp; + tgt->ltd_obd = tgt_obd; /* XXX - add a sanity check on the generation number. */ tgt->ltd_gen = gen; tgt->ltd_index = index; diff --git a/lustre/lov/lov_object.c b/lustre/lov/lov_object.c index 2ecd756..8ef1413 100644 --- a/lustre/lov/lov_object.c +++ b/lustre/lov/lov_object.c @@ -218,6 +218,7 @@ static int lov_init_raid0(const struct lu_env *env, oinfo_get_fid(oinfo, ofid); subdev = lovsub2cl_dev(dev->ld_target[ost_idx]); subconf->u.coc_oinfo = oinfo; + LASSERTF(subdev != NULL, "not init ost %d\n", ost_idx); stripe = lov_sub_find(env, subdev, ofid, subconf); if (!IS_ERR(stripe)) result = lov_init_sub(env, lov, stripe, r0, i); diff --git a/lustre/lov/lov_pack.c b/lustre/lov/lov_pack.c index 17b9d47..a17d580 100644 --- a/lustre/lov/lov_pack.c +++ b/lustre/lov/lov_pack.c @@ -617,70 +617,69 @@ int lov_getstripe(struct obd_export *exp, struct lov_stripe_md *lsm, * lmm_stripe_count, (the header part is common to v1 and v3) */ lum_size = sizeof(struct lov_user_md_v1); if (copy_from_user(&lum, lump, lum_size)) - rc = -EFAULT; + GOTO(out_set, rc = -EFAULT); else if ((lum.lmm_magic != LOV_USER_MAGIC) && (lum.lmm_magic != LOV_USER_MAGIC_V3)) - rc = -EINVAL; - else { - if (lum.lmm_stripe_count && - (lum.lmm_stripe_count < lsm->lsm_stripe_count)) { - /* Return right size of stripe to user */ - lum.lmm_stripe_count = lsm->lsm_stripe_count; - rc = copy_to_user(lump, &lum, lum_size); - RETURN(-EOVERFLOW); - } - rc = lov_packmd(exp, &lmmk, lsm); - if (rc < 0) - RETURN(rc); - lmm_size = rc; - rc = 0; - - /* FIXME: Bug 1185 - copy fields properly when structs change */ - /* struct lov_user_md_v3 and struct lov_mds_md_v3 must be the same */ - CLASSERT(sizeof(lum) == sizeof(struct lov_mds_md_v3)); - CLASSERT(sizeof lum.lmm_objects[0] == - sizeof lmmk->lmm_objects[0]); - - if ((cpu_to_le32(LOV_MAGIC) != LOV_MAGIC) && - ((lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC_V1)) || - (lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC_V3)))) { - lustre_swab_lov_mds_md(lmmk); - lustre_swab_lov_user_md_objects( + GOTO(out_set, rc = -EINVAL); + + if (lum.lmm_stripe_count && + (lum.lmm_stripe_count < lsm->lsm_stripe_count)) { + /* Return right size of stripe to user */ + lum.lmm_stripe_count = lsm->lsm_stripe_count; + rc = copy_to_user(lump, &lum, lum_size); + GOTO(out_set, rc = -EOVERFLOW); + } + rc = lov_packmd(exp, &lmmk, lsm); + if (rc < 0) + GOTO(out_set, rc); + lmm_size = rc; + rc = 0; + + /* FIXME: Bug 1185 - copy fields properly when structs change */ + /* struct lov_user_md_v3 and struct lov_mds_md_v3 must be the same */ + CLASSERT(sizeof(lum) == sizeof(struct lov_mds_md_v3)); + CLASSERT(sizeof lum.lmm_objects[0] == sizeof lmmk->lmm_objects[0]); + + if ((cpu_to_le32(LOV_MAGIC) != LOV_MAGIC) && + ((lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC_V1)) || + (lmmk->lmm_magic == cpu_to_le32(LOV_MAGIC_V3)))) { + lustre_swab_lov_mds_md(lmmk); + lustre_swab_lov_user_md_objects( (struct lov_user_ost_data*)lmmk->lmm_objects, lmmk->lmm_stripe_count); + } + if (lum.lmm_magic == LOV_USER_MAGIC) { + /* User request for v1, we need skip lmm_pool_name */ + if (lmmk->lmm_magic == LOV_MAGIC_V3) { + memmove((char*)(&lmmk->lmm_stripe_count) + + sizeof(lmmk->lmm_stripe_count), + ((struct lov_mds_md_v3*)lmmk)->lmm_objects, + lmmk->lmm_stripe_count * + sizeof(struct lov_ost_data_v1)); + lmm_size -= LOV_MAXPOOLNAME; } - if (lum.lmm_magic == LOV_USER_MAGIC) { - /* User request for v1, we need skip lmm_pool_name */ - if (lmmk->lmm_magic == LOV_MAGIC_V3) { - memmove((char*)(&lmmk->lmm_stripe_count) + - sizeof(lmmk->lmm_stripe_count), - lmmk->lmm_objects, - lmmk->lmm_stripe_count * - sizeof(struct lov_ost_data_v1)); - lmm_size -= LOV_MAXPOOLNAME; - } - } else { - /* if v3 we just have to update the lum_size */ - lum_size = sizeof(struct lov_user_md_v3); - } - - /* User wasn't expecting this many OST entries */ - if (lum.lmm_stripe_count == 0) - lmm_size = lum_size; - else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count) - RETURN(-EOVERFLOW); - /* - * Have a difference between lov_mds_md & lov_user_md. - * So we have to re-order the data before copy to user. - */ - lum.lmm_stripe_count = lmmk->lmm_stripe_count; - ((struct lov_user_md*)lmmk)->lmm_stripe_offset = 0; - ((struct lov_user_md*)lmmk)->lmm_stripe_count = lum.lmm_stripe_count; - if (copy_to_user(lump, lmmk, lmm_size)) - rc = -EFAULT; - - obd_free_diskmd(exp, &lmmk); + } else { + /* if v3 we just have to update the lum_size */ + lum_size = sizeof(struct lov_user_md_v3); } + + /* User wasn't expecting this many OST entries */ + if (lum.lmm_stripe_count == 0) + lmm_size = lum_size; + else if (lum.lmm_stripe_count < lmmk->lmm_stripe_count) + GOTO(out_set, rc = -EOVERFLOW); + /* + * Have a difference between lov_mds_md & lov_user_md. + * So we have to re-order the data before copy to user. + */ + lum.lmm_stripe_count = lmmk->lmm_stripe_count; + ((struct lov_user_md*)lmmk)->lmm_stripe_offset = 0; + ((struct lov_user_md*)lmmk)->lmm_stripe_count = lum.lmm_stripe_count; + if (copy_to_user(lump, lmmk, lmm_size)) + rc = -EFAULT; + + obd_free_diskmd(exp, &lmmk); +out_set: set_fs(seg); RETURN(rc); } diff --git a/lustre/lov/lov_qos.c b/lustre/lov/lov_qos.c index 084e2f2..7842f8f 100644 --- a/lustre/lov/lov_qos.c +++ b/lustre/lov/lov_qos.c @@ -1088,6 +1088,10 @@ int qos_prep_create(struct obd_export *exp, struct lov_request_set *set) if (stripes < lsm->lsm_stripe_count) qos_shrink_lsm(set); + if (OBD_FAIL_CHECK(OBD_FAIL_MDS_LOV_PREP_CREATE)) { + qos_shrink_lsm(set); + rc = -EIO; + } if (oti && (src_oa->o_valid & OBD_MD_FLCOOKIE)) { oti_alloc_cookies(oti, set->set_count); diff --git a/lustre/lov/lov_request.c b/lustre/lov/lov_request.c index 249f0b1..706503f 100644 --- a/lustre/lov/lov_request.c +++ b/lustre/lov/lov_request.c @@ -723,6 +723,8 @@ int lov_prep_create_set(struct obd_export *exp, struct obd_info *oinfo, set->set_oti = oti; rc = qos_prep_create(exp, set); + /* qos_shrink_lsm() may have allocated a new lsm */ + *lsmp = oinfo->oi_md; if (rc) lov_fini_create_set(set, lsmp); else diff --git a/lustre/lov/lovsub_lock.c b/lustre/lov/lovsub_lock.c index d1f2757..162033d 100644 --- a/lustre/lov/lovsub_lock.c +++ b/lustre/lov/lovsub_lock.c @@ -86,12 +86,13 @@ static void lovsub_parent_unlock(const struct lu_env *env, struct lov_lock *lov) EXIT; } -static void lovsub_lock_state_one(const struct lu_env *env, - const struct lovsub_lock *lovsub, - struct lov_lock *lov) +static int lovsub_lock_state_one(const struct lu_env *env, + const struct lovsub_lock *lovsub, + struct lov_lock *lov) { - struct cl_lock *parent; - const struct cl_lock *child; + struct cl_lock *parent; + struct cl_lock *child; + int restart = 0; ENTRY; parent = lov->lls_cl.cls_lock; @@ -99,13 +100,24 @@ static void lovsub_lock_state_one(const struct lu_env *env, if (lovsub->lss_active != parent) { lovsub_parent_lock(env, lov); - if (child->cll_error != 0) + if (child->cll_error != 0 && parent->cll_error == 0) { + /* + * This is a deadlock case: + * cl_lock_error(for the parent lock) + * -> cl_lock_delete + * -> lov_lock_delete + * -> cl_lock_enclosure + * -> cl_lock_mutex_try(for the child lock) + */ + cl_lock_mutex_put(env, child); cl_lock_error(env, parent, child->cll_error); - else + restart = 1; + } else { cl_lock_signal(env, parent); + } lovsub_parent_unlock(env, lov); } - EXIT; + RETURN(restart); } /** @@ -119,23 +131,22 @@ static void lovsub_lock_state(const struct lu_env *env, { struct lovsub_lock *sub = cl2lovsub_lock(slice); struct lov_lock_link *scan; - struct lov_lock_link *temp; + int restart = 0; LASSERT(cl_lock_is_mutexed(slice->cls_lock)); ENTRY; - /* - * Use _safe() version, because - * - * lovsub_lock_state_one() - * ->cl_lock_error() - * ->cl_lock_delete() - * ->lov_lock_delete() - * - * can unlink parent from the parent list. - */ - list_for_each_entry_safe(scan, temp, &sub->lss_parents, lll_list) - lovsub_lock_state_one(env, sub, scan->lll_super); + do { + restart = 0; + list_for_each_entry(scan, &sub->lss_parents, lll_list) { + restart = lovsub_lock_state_one(env, sub, + scan->lll_super); + if (restart) { + cl_lock_mutex_get(env, slice->cls_lock); + break; + } + } + } while(restart); EXIT; } @@ -310,75 +321,148 @@ static int lovsub_lock_closure(const struct lu_env *env, } /** - * An implementation of cl_lock_operations::clo_delete() method. This is - * invoked in "bottom-to-top" delete, when lock destruction starts from the - * sub-lock (e.g, as a result of ldlm lock LRU policy). + * A helper function for lovsub_lock_delete() that deals with a given parent + * top-lock. */ -static void lovsub_lock_delete(const struct lu_env *env, - const struct cl_lock_slice *slice) +static int lovsub_lock_delete_one(const struct lu_env *env, + struct cl_lock *child, struct lov_lock *lov) { - struct lovsub_lock *sub = cl2lovsub_lock(slice); - struct lov_lock *lov; struct cl_lock *parent; - struct lov_lock_link *scan; - struct lov_lock_link *temp; - struct lov_lock_sub *subdata; - - LASSERT(cl_lock_is_mutexed(slice->cls_lock)); + int result; ENTRY; - list_for_each_entry_safe(scan, temp, &sub->lss_parents, lll_list) { - lov = scan->lll_super; - subdata = &lov->lls_sub[scan->lll_idx]; - parent = lov->lls_cl.cls_lock; - lovsub_parent_lock(env, lov); - subdata->sub_got = subdata->sub_descr; - lov_lock_unlink(env, scan, sub); - CDEBUG(D_DLMTRACE, "%p %p %i %i\n", parent, sub, - lov->lls_nr_filled, parent->cll_state); - switch (parent->cll_state) { - case CLS_NEW: - case CLS_QUEUING: - case CLS_ENQUEUED: - case CLS_FREEING: - cl_lock_signal(env, parent); - break; - case CLS_UNLOCKING: - /* - * Here lies a problem: a sub-lock is canceled while - * top-lock is being unlocked. Top-lock cannot be - * moved into CLS_NEW state, because unlocking has to - * succeed eventually by placing lock into CLS_CACHED - * (or failing it), see cl_unuse_try(). Nor can - * top-lock be left in CLS_CACHED state, because lov - * maintains an invariant that all sub-locks exist in - * CLS_CACHED (this allows cached top-lock to be - * reused immediately). Nor can we wait for top-lock - * state to change, because this can be synchronous to - * the current thread. + parent = lov->lls_cl.cls_lock; + result = 0; + + switch (parent->cll_state) { + case CLS_NEW: + case CLS_QUEUING: + case CLS_ENQUEUED: + case CLS_FREEING: + cl_lock_signal(env, parent); + break; + case CLS_UNLOCKING: + /* + * Here lies a problem: a sub-lock is canceled while top-lock + * is being unlocked. Top-lock cannot be moved into CLS_NEW + * state, because unlocking has to succeed eventually by + * placing lock into CLS_CACHED (or failing it), see + * cl_unuse_try(). Nor can top-lock be left in CLS_CACHED + * state, because lov maintains an invariant that all + * sub-locks exist in CLS_CACHED (this allows cached top-lock + * to be reused immediately). Nor can we wait for top-lock + * state to change, because this can be synchronous to the + * current thread. * - * We know for sure that lov_lock_unuse() will be - * called at least one more time to finish un-using, - * so leave a mark on the top-lock, that will be seen - * by the next call to lov_lock_unuse(). + * We know for sure that lov_lock_unuse() will be called at + * least one more time to finish un-using, so leave a mark on + * the top-lock, that will be seen by the next call to + * lov_lock_unuse(). + */ + lov->lls_unuse_race = 1; + break; + case CLS_CACHED: + /* + * if a sub-lock is canceled move its top-lock into CLS_NEW + * state to preserve an invariant that a top-lock in + * CLS_CACHED is immediately ready for re-use (i.e., has all + * sub-locks), and so that next attempt to re-use the top-lock + * enqueues missing sub-lock. + */ + cl_lock_state_set(env, parent, CLS_NEW); + /* + * if last sub-lock is canceled, destroy the top-lock (which + * is now `empty') proactively. + */ + if (lov->lls_nr_filled == 0) { + /* ... but unfortunately, this cannot be done easily, + * as cancellation of a top-lock might acquire mutices + * of its other sub-locks, violating lock ordering, + * see cl_lock_{cancel,delete}() preconditions. + * + * To work around this, the mutex of this sub-lock is + * released, top-lock is destroyed, and sub-lock mutex + * acquired again. The list of parents has to be + * re-scanned from the beginning after this. + * + * Only do this if no mutices other than on @child and + * @parent are held by the current thread. + * + * TODO: The lock modal here is too complex, because + * the lock may be canceled and deleted by voluntarily: + * cl_lock_request + * -> osc_lock_enqueue_wait + * -> osc_lock_cancel_wait + * -> cl_lock_delete + * -> lovsub_lock_delete + * -> cl_lock_cancel/delete + * -> ... + * + * The better choice is to spawn a kernel thread for + * this purpose. -jay */ - lov->lls_unuse_race = 1; - break; - case CLS_CACHED: - cl_lock_state_set(env, parent, CLS_NEW); - if (lov->lls_nr_filled == 0) { + if (cl_lock_nr_mutexed(env) == 2) { + cl_lock_mutex_put(env, child); cl_lock_cancel(env, parent); cl_lock_delete(env, parent); - cl_lock_signal(env, parent); + result = 1; } - break; - case CLS_HELD: - default: - CERROR("Impossible state: %i\n", parent->cll_state); - LBUG(); } - lovsub_parent_unlock(env, lov); + break; + case CLS_HELD: + default: + CERROR("Impossible state: %i\n", parent->cll_state); + LBUG(); } + + RETURN(result); +} + +/** + * An implementation of cl_lock_operations::clo_delete() method. This is + * invoked in "bottom-to-top" delete, when lock destruction starts from the + * sub-lock (e.g, as a result of ldlm lock LRU policy). + */ +static void lovsub_lock_delete(const struct lu_env *env, + const struct cl_lock_slice *slice) +{ + struct cl_lock *child = slice->cls_lock; + struct lovsub_lock *sub = cl2lovsub_lock(slice); + int restart; + + LASSERT(cl_lock_is_mutexed(child)); + + ENTRY; + /* + * Destruction of a sub-lock might take multiple iterations, because + * when the last sub-lock of a given top-lock is deleted, top-lock is + * canceled proactively, and this requires to release sub-lock + * mutex. Once sub-lock mutex has been released, list of its parents + * has to be re-scanned from the beginning. + */ + do { + struct lov_lock *lov; + struct lov_lock_link *scan; + struct lov_lock_link *temp; + struct lov_lock_sub *subdata; + + restart = 0; + list_for_each_entry_safe(scan, temp, + &sub->lss_parents, lll_list) { + lov = scan->lll_super; + subdata = &lov->lls_sub[scan->lll_idx]; + lovsub_parent_lock(env, lov); + subdata->sub_got = subdata->sub_descr; + lov_lock_unlink(env, scan, sub); + restart = lovsub_lock_delete_one(env, child, lov); + lovsub_parent_unlock(env, lov); + + if (restart) { + cl_lock_mutex_get(env, child); + break; + } + } + } while (restart); EXIT; } diff --git a/lustre/lvfs/fsfilt_ext3.c b/lustre/lvfs/fsfilt_ext3.c index 8dc6d4e..04f982c 100644 --- a/lustre/lvfs/fsfilt_ext3.c +++ b/lustre/lvfs/fsfilt_ext3.c @@ -146,6 +146,8 @@ static char *fsfilt_ext3_uuid(struct super_block *sb) */ static __u64 fsfilt_ext3_get_version(struct inode *inode) { + CDEBUG(D_INFO, "Get version "LPX64" for inode %lu\n", + EXT3_I(inode)->i_fs_version, inode->i_ino); return EXT3_I(inode)->i_fs_version; } @@ -156,7 +158,12 @@ static __u64 fsfilt_ext3_set_version(struct inode *inode, __u64 new_version) { __u64 old_version = EXT3_I(inode)->i_fs_version; + CDEBUG(D_INFO, "Set version "LPX64" (old "LPX64") for inode %lu\n", + new_version, old_version, inode->i_ino); (EXT3_I(inode))->i_fs_version = new_version; + /* version is set after all inode operations are finished, so we should + * mark it dirty here */ + inode->i_sb->s_op->dirty_inode(inode); return old_version; } diff --git a/lustre/mdc/lproc_mdc.c b/lustre/mdc/lproc_mdc.c index b8b1437..72d3790 100644 --- a/lustre/mdc/lproc_mdc.c +++ b/lustre/mdc/lproc_mdc.c @@ -147,7 +147,8 @@ static struct lprocfs_vars lprocfs_mdc_obd_vars[] = { { "max_rpcs_in_flight", mdc_rd_max_rpcs_in_flight, mdc_wr_max_rpcs_in_flight, 0 }, { "timeouts", lprocfs_rd_timeouts, 0, 0 }, - { "import", lprocfs_rd_import, 0, 0 }, + { "import", lprocfs_rd_import, 0, 0 }, + { "state", lprocfs_rd_state, 0, 0 }, { "changelog", 0, 0, 0, &mdc_changelog_fops, 0400 }, { 0 } }; diff --git a/lustre/mdc/mdc_internal.h b/lustre/mdc/mdc_internal.h index 00092f4..85164a0 100644 --- a/lustre/mdc/mdc_internal.h +++ b/lustre/mdc/mdc_internal.h @@ -38,6 +38,7 @@ #define _MDC_INTERNAL_H #include +#include #ifdef LPROCFS void lprocfs_mdc_init_vars(struct lprocfs_static_vars *lvars); diff --git a/lustre/mdc/mdc_lib.c b/lustre/mdc/mdc_lib.c index 7094b5a..d62321c 100644 --- a/lustre/mdc/mdc_lib.c +++ b/lustre/mdc/mdc_lib.c @@ -164,7 +164,7 @@ void mdc_create_pack(struct ptlrpc_request *req, struct md_op_data *op_data, } } -static __u32 mds_pack_open_flags(__u32 flags) +static __u32 mds_pack_open_flags(__u32 flags, __u32 mode) { __u32 cr_flags = (flags & (FMODE_READ | FMODE_WRITE | MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS | @@ -181,7 +181,7 @@ static __u32 mds_pack_open_flags(__u32 flags) cr_flags |= MDS_OPEN_SYNC; if (flags & O_DIRECTORY) cr_flags |= MDS_OPEN_DIRECTORY; - if (flags & O_JOIN_FILE) + if (mode & M_JOIN_FILE) cr_flags |= MDS_OPEN_JOIN_FILE; #ifdef FMODE_EXEC if (flags & FMODE_EXEC) @@ -226,7 +226,7 @@ void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data, rec->cr_fid2 = op_data->op_fid2; } rec->cr_mode = mode; - rec->cr_flags = mds_pack_open_flags(flags); + rec->cr_flags = mds_pack_open_flags(flags, mode); rec->cr_rdev = rdev; rec->cr_time = op_data->op_mod_time; rec->cr_suppgid1 = op_data->op_suppgids[0]; diff --git a/lustre/mdc/mdc_locks.c b/lustre/mdc/mdc_locks.c index 10bd3f5..2f22f1a 100644 --- a/lustre/mdc/mdc_locks.c +++ b/lustre/mdc/mdc_locks.c @@ -241,8 +241,8 @@ static struct ptlrpc_request *mdc_intent_open_pack(struct obd_export *exp, struct ptlrpc_request *req; struct obd_device *obddev = class_exp2obd(exp); struct ldlm_intent *lit; - int joinfile = !!((it->it_flags & O_JOIN_FILE) && - op_data->op_data); + int joinfile = !!((it->it_create_mode & M_JOIN_FILE) && + op_data->op_data); CFS_LIST_HEAD(cancels); int count = 0; int mode; @@ -630,7 +630,7 @@ int mdc_enqueue(struct obd_export *exp, struct ldlm_enqueue_info *einfo, policy = *(ldlm_policy_data_t *)lmm; res_id.name[3] = LDLM_FLOCK; } else if (it->it_op & IT_OPEN) { - int joinfile = !!((it->it_flags & O_JOIN_FILE) && + int joinfile = !!((it->it_create_mode & M_JOIN_FILE) && op_data->op_data); req = mdc_intent_open_pack(exp, it, op_data, lmm, lmmsize, @@ -640,7 +640,7 @@ int mdc_enqueue(struct obd_export *exp, struct ldlm_enqueue_info *einfo, einfo->ei_cbdata = NULL; lmm = NULL; } else - it->it_flags &= ~O_JOIN_FILE; + it->it_create_mode &= ~M_JOIN_FILE; } else if (it->it_op & IT_UNLINK) req = mdc_intent_unlink_pack(exp, it, op_data); else if (it->it_op & (IT_GETATTR | IT_LOOKUP)) @@ -723,7 +723,7 @@ static int mdc_finish_intent_lock(struct obd_export *exp, /* If we were revalidating a fid/name pair, mark the intent in * case we fail and get called again from lookup */ if (fid_is_sane(&op_data->op_fid2) && - it->it_flags & O_CHECK_STALE && + it->it_create_mode & M_CHECK_STALE && it->it_op != IT_GETATTR) { it_set_disposition(it, DISP_ENQ_COMPLETE); @@ -911,7 +911,7 @@ int mdc_intent_lock(struct obd_export *exp, struct md_op_data *op_data, if (rc < 0) RETURN(rc); } else if (!fid_is_sane(&op_data->op_fid2) || - !(it->it_flags & O_CHECK_STALE)) { + !(it->it_create_mode & M_CHECK_STALE)) { /* DISP_ENQ_COMPLETE set means there is extra reference on * request referenced from this intent, saved for subsequent * lookup. This path is executed when we proceed to this diff --git a/lustre/mdd/mdd_device.c b/lustre/mdd/mdd_device.c index f1381ac..7a48658 100644 --- a/lustre/mdd/mdd_device.c +++ b/lustre/mdd/mdd_device.c @@ -84,6 +84,7 @@ static int mdd_device_init(const struct lu_env *env, struct lu_device *d, mdd->mdd_txn_cb.dtc_txn_stop = mdd_txn_stop_cb; mdd->mdd_txn_cb.dtc_txn_commit = mdd_txn_commit_cb; mdd->mdd_txn_cb.dtc_cookie = mdd; + mdd->mdd_txn_cb.dtc_tag = LCT_MD_THREAD; CFS_INIT_LIST_HEAD(&mdd->mdd_txn_cb.dtc_linkage); mdd->mdd_atime_diff = MAX_ATIME_DIFF; @@ -479,6 +480,20 @@ static int dot_lustre_close(const struct lu_env *env, struct md_object *obj, return 0; } +static dt_obj_version_t dot_lustre_version_get(const struct lu_env *env, + struct md_object *obj) +{ + return 0; +} + +static void dot_lustre_version_set(const struct lu_env *env, + struct md_object *obj, + dt_obj_version_t version) +{ + return; +} + + static struct md_object_operations mdd_dot_lustre_obj_ops = { .moo_attr_get = dot_lustre_attr_get, .moo_attr_set = dot_lustre_attr_set, @@ -486,6 +501,8 @@ static struct md_object_operations mdd_dot_lustre_obj_ops = { .moo_open = dot_lustre_mdd_open, .moo_close = dot_lustre_close, .moo_readpage = mdd_readpage, + .moo_version_get = dot_lustre_version_get, + .moo_version_set = dot_lustre_version_set, .moo_path = dot_lustre_path }; diff --git a/lustre/mdd/mdd_lov.c b/lustre/mdd/mdd_lov.c index 197ffd6..982313a 100644 --- a/lustre/mdd/mdd_lov.c +++ b/lustre/mdd/mdd_lov.c @@ -77,6 +77,11 @@ static int mdd_notify(struct obd_device *host, struct obd_device *watched, case OBD_NOTIFY_CONFIG: rc = md_do_upcall(NULL, &mdd->mdd_md_dev, MD_LOV_CONFIG); break; +#ifdef HAVE_QUOTA_SUPPORT + case OBD_NOTIFY_QUOTA: + rc = md_do_upcall(NULL, &mdd->mdd_md_dev, MD_LOV_QUOTA); + break; +#endif default: CDEBUG(D_INFO, "Unhandled notification %#x\n", ev); } diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index de0eda8..72a591d 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -2128,6 +2128,8 @@ static int mdd_dir_page_build(const struct lu_env *env, struct mdd_device *mdd, memcpy(ent->lde_name, name, len); result = mdd_append_attrs(env, mdd, attr, iops, it, ent); + if (result == -ESTALE) + goto next; if (result != 0) goto out; } else { @@ -2150,6 +2152,8 @@ static int mdd_dir_page_build(const struct lu_env *env, struct mdd_device *mdd, next: result = iops->next(env, it); + if (result == -ESTALE) + goto next; } while (result == 0); out: @@ -2311,6 +2315,24 @@ static int mdd_object_sync(const struct lu_env *env, struct md_object *obj) return next->do_ops->do_object_sync(env, next); } +static dt_obj_version_t mdd_version_get(const struct lu_env *env, + struct md_object *obj) +{ + struct mdd_object *mdd_obj = md2mdd_obj(obj); + + LASSERT(mdd_object_exists(mdd_obj)); + return do_version_get(env, mdd_object_child(mdd_obj)); +} + +static void mdd_version_set(const struct lu_env *env, struct md_object *obj, + dt_obj_version_t version) +{ + struct mdd_object *mdd_obj = md2mdd_obj(obj); + + LASSERT(mdd_object_exists(mdd_obj)); + return do_version_set(env, mdd_object_child(mdd_obj), version); +} + const struct md_object_operations mdd_obj_ops = { .moo_permission = mdd_permission, .moo_attr_get = mdd_attr_get, @@ -2328,5 +2350,7 @@ const struct md_object_operations mdd_obj_ops = { .moo_readlink = mdd_readlink, .moo_capa_get = mdd_capa_get, .moo_object_sync = mdd_object_sync, + .moo_version_get = mdd_version_get, + .moo_version_set = mdd_version_set, .moo_path = mdd_path, }; diff --git a/lustre/mdd/mdd_orphans.c b/lustre/mdd/mdd_orphans.c index c461fee..12a7f59 100644 --- a/lustre/mdd/mdd_orphans.c +++ b/lustre/mdd/mdd_orphans.c @@ -416,7 +416,7 @@ static int orph_index_iterate(const struct lu_env *env, iops = &dor->do_index_ops->dio_it; it = iops->init(env, dor, BYPASS_CAPA); if (it != NULL) { - result = iops->get(env, it, (const void *)""); + result = iops->load(env, it, 0); if (result > 0) { /* main cycle */ do { diff --git a/lustre/mds/mds_lov.c b/lustre/mds/mds_lov.c index 51b2fbc..afb7564 100644 --- a/lustre/mds/mds_lov.c +++ b/lustre/mds/mds_lov.c @@ -64,15 +64,16 @@ static void mds_lov_dump_objids(const char *label, struct obd_device *obd) GOTO(skip_bitmap, i); } - for(i=0;i<((mds->mds_lov_page_dirty->size/BITS_PER_LONG)+1);i++) - CDEBUG(D_INFO, "%u - %lx\n", i, mds->mds_lov_page_dirty->data[i]); + for(i = 0; i < mds->mds_lov_page_dirty->size / BITS_PER_LONG + 1; i++) + CDEBUG(D_INFO, "%u - %lx\n", i, + mds->mds_lov_page_dirty->data[i]); skip_bitmap: if (mds->mds_lov_page_array == NULL) { CERROR("not init page array!\n"); GOTO(skip_array, i); } - for(i=0;imds_lov_page_array[i]; if (data == NULL) @@ -81,7 +82,8 @@ skip_bitmap: for(j=0; j < OBJID_PER_PAGE(); j++) { if (data[j] == 0) continue; - CDEBUG(D_INFO,"objid page %u idx %u - %llu \n", i,j,data[j]); + CDEBUG(D_INFO,"objid page %u idx %u - "LPU64" \n", + i, j, data[j]); } } skip_array: @@ -150,7 +152,7 @@ void mds_lov_destroy_objids(struct obd_device *obd) } if (mds->mds_lov_objid_filp) { - rc = filp_close((struct file *)mds->mds_lov_objid_filp, 0); + rc = filp_close((struct file *)mds->mds_lov_objid_filp, NULL); mds->mds_lov_objid_filp = NULL; if (rc) CERROR("%s file won't close, rc=%d\n", LOV_OBJID, rc); @@ -301,7 +303,6 @@ void mds_lov_update_objids(struct obd_device *obd, struct lov_mds_md *lmm) } EXPORT_SYMBOL(mds_lov_update_objids); - static int mds_lov_update_from_read(struct mds_obd *mds, obd_id *data, __u32 count) { @@ -332,7 +333,7 @@ static int mds_lov_read_objids(struct obd_device *obd) { struct mds_obd *mds = &obd->u.mds; loff_t off = 0; - int i, rc, count = 0, page = 0; + int i, rc = 0, count = 0, page = 0; unsigned long size; ENTRY; @@ -345,8 +346,8 @@ static int mds_lov_read_objids(struct obd_device *obd) page = (size / (OBJID_PER_PAGE() * sizeof(obd_id))) + 1; CDEBUG(D_INFO, "file size %lu pages %d\n", size, page); - for (i = 0; i < page; i++) { + obd_id *data; loff_t off_old = off; LASSERT(mds->mds_lov_page_array[i] == NULL); @@ -354,21 +355,23 @@ static int mds_lov_read_objids(struct obd_device *obd) if (mds->mds_lov_page_array[i] == NULL) GOTO(out, rc = -ENOMEM); - rc = fsfilt_read_record(obd, mds->mds_lov_objid_filp, mds->mds_lov_page_array[i], + data = mds->mds_lov_page_array[i]; + + rc = fsfilt_read_record(obd, mds->mds_lov_objid_filp, data, OBJID_PER_PAGE()*sizeof(obd_id), &off); if (rc < 0) { CERROR("Error reading objids %d\n", rc); GOTO(out, rc); } - count += (off - off_old)/sizeof(obd_id); - if (mds_lov_update_from_read(mds, mds->mds_lov_page_array[i], count)) { - CERROR("Can't update mds data\n"); - GOTO(out, rc = -EIO); - } + count += (off - off_old) / sizeof(obd_id); + if (mds_lov_update_from_read(mds, data, count)) { + CERROR("Can't update mds data\n"); + GOTO(out, rc = -EIO); + } if (off == off_old) - break; // eof + break; /* eof */ } mds->mds_lov_objid_lastpage = i; mds->mds_lov_objid_lastidx = count % OBJID_PER_PAGE(); @@ -378,13 +381,13 @@ static int mds_lov_read_objids(struct obd_device *obd) out: mds_lov_dump_objids("read",obd); - RETURN(0); + RETURN(rc); } int mds_lov_write_objids(struct obd_device *obd) { struct mds_obd *mds = &obd->u.mds; - int i, rc = 0; + int i = 0, rc = 0; ENTRY; if (cfs_bitmap_check_empty(mds->mds_lov_page_dirty)) @@ -403,6 +406,7 @@ int mds_lov_write_objids(struct obd_device *obd) if (i == mds->mds_lov_objid_lastpage) size = (mds->mds_lov_objid_lastidx+1) * sizeof(obd_id); + CDEBUG(D_INFO, "write %lld - %u\n", off, size); rc = fsfilt_write_record(obd, mds->mds_lov_objid_filp, data, size, &off, 0); if (rc < 0) @@ -441,8 +445,14 @@ static int mds_lov_get_objid(struct obd_device * obd, if (rc) GOTO(out, rc); + /* workaround for clean filter */ + if (data[off] == 0) + data[off] = 1; + cfs_bitmap_set(mds->mds_lov_page_dirty, page); } + CDEBUG(D_INFO, "idx "LPU64" - %p - %d/%d - "LPU64"\n", + idx, data, page, off, data[off]); out: RETURN(rc); } @@ -466,6 +476,7 @@ int mds_lov_clear_orphans(struct mds_obd *mds, struct obd_uuid *ost_uuid) oa.o_valid = OBD_MD_FLFLAGS | OBD_MD_FLGROUP; if (ost_uuid != NULL) oti.oti_ost_uuid = ost_uuid; + rc = obd_create(mds->mds_osc_exp, &oa, &empty_ea, &oti); RETURN(rc); @@ -523,7 +534,6 @@ static int mds_lov_update_desc(struct obd_device *obd, int idx, if (rc != 0) GOTO(out, rc ); - /* If we added a target we have to reconnect the llogs */ /* We only _need_ to do this at first add (idx), or the first time after recovery. However, it should now be safe to call anytime. */ @@ -801,15 +811,17 @@ static int __mds_lov_synchronize(void *data) GOTO(out, rc); } +#ifdef HAVE_QUOTA_SUPPORT if (obd->obd_upcall.onu_owner) { /* * This is a hack for mds_notify->mdd_notify. When the mds obd * in mdd is removed, This hack should be removed. */ LASSERT(obd->obd_upcall.onu_upcall != NULL); - rc = obd->obd_upcall.onu_upcall(obd, NULL, OBD_NOTIFY_ACTIVE, + rc = obd->obd_upcall.onu_upcall(obd, NULL, OBD_NOTIFY_QUOTA, obd->obd_upcall.onu_owner); } +#endif EXIT; out: up_read(&mds->mds_notify_lock); @@ -907,7 +919,6 @@ int mds_notify(struct obd_device *obd, struct obd_device *watched, case OBD_NOTIFY_SYNC_NONBLOCK: /* sync event should be pass lov idx as argument */ break; - case OBD_NOTIFY_CONFIG: default: RETURN(0); } diff --git a/lustre/mdt/mdt_capa.c b/lustre/mdt/mdt_capa.c index 5bc6235..d817d4e 100644 --- a/lustre/mdt/mdt_capa.c +++ b/lustre/mdt/mdt_capa.c @@ -105,9 +105,9 @@ static int write_capa_keys(const struct lu_env *env, for (i = 0; i < 2; i++) { lck_cpu_to_le(tmp, &keys[i]); - rc = mdt_record_write(env, mdt->mdt_ck_obj, - mdt_buf_const(env, tmp, sizeof(*tmp)), - &off, th); + rc = dt_record_write(env, mdt->mdt_ck_obj, + mdt_buf_const(env, tmp, sizeof(*tmp)), + &off, th); if (rc) break; } @@ -131,8 +131,8 @@ static int read_capa_keys(const struct lu_env *env, tmp = &mti->mti_capa_key; for (i = 0; i < 2; i++) { - rc = mdt_record_read(env, mdt->mdt_ck_obj, - mdt_buf(env, tmp, sizeof(*tmp)), &off); + rc = dt_record_read(env, mdt->mdt_ck_obj, + mdt_buf(env, tmp, sizeof(*tmp)), &off); if (rc) return rc; diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c index e8b24f9..91c9351 100644 --- a/lustre/mdt/mdt_handler.c +++ b/lustre/mdt/mdt_handler.c @@ -2652,6 +2652,10 @@ static void mdt_thread_info_init(struct ptlrpc_request *req, info->mti_fail_id = OBD_FAIL_MDS_ALL_REPLY_NET; info->mti_transno = lustre_msg_get_transno(req->rq_reqmsg); + info->mti_mos[0] = NULL; + info->mti_mos[1] = NULL; + info->mti_mos[2] = NULL; + info->mti_mos[3] = NULL; memset(&info->mti_attr, 0, sizeof(info->mti_attr)); info->mti_body = NULL; @@ -3355,7 +3359,8 @@ static int mdt_intent_reint(enum mdt_it_code opcode, rep->lock_policy_res2 = clear_serious(rc); lhc->mlh_reg_lh.cookie = 0ull; - if (rc == -ENOTCONN || rc == -ENODEV) { + if (rc == -ENOTCONN || rc == -ENODEV || + rc == -EOVERFLOW) { /**< if VBR failure then return error */ /* * If it is the disconnect error (ENODEV & ENOCONN), the error * will be returned by rq_status, and client at ptlrpc layer @@ -4303,6 +4308,7 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m) int waited = 0; ENTRY; + target_recovery_fini(obd); /* At this point, obd exports might still be on the "obd_zombie_exports" * list, and obd_zombie_impexp_thread() is trying to destroy them. * We wait a little bit until all exports (except the self-export) @@ -4326,7 +4332,6 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m) ping_evictor_stop(); - target_recovery_fini(obd); mdt_stop_ptlrpc_service(m); mdt_llog_ctxt_unclone(env, m, LLOG_CHANGELOG_ORIG_CTXT); mdt_obd_llog_cleanup(obd); @@ -4334,6 +4339,7 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m) #ifdef HAVE_QUOTA_SUPPORT next->md_ops->mdo_quota.mqo_cleanup(env, next); #endif + lut_fini(env, &m->mdt_lut); mdt_fs_cleanup(env, m); upcall_cache_cleanup(m->mdt_identity_cache); m->mdt_identity_cache = NULL; @@ -4371,8 +4377,8 @@ static void mdt_fini(const struct lu_env *env, struct mdt_device *m) } lprocfs_free_per_client_stats(obd); lprocfs_free_obd_stats(obd); - ptlrpc_lprocfs_unregister_obd(d->ld_obd); - lprocfs_obd_cleanup(d->ld_obd); + ptlrpc_lprocfs_unregister_obd(obd); + lprocfs_obd_cleanup(obd); if (ls) { struct md_site *mite; @@ -4603,10 +4609,14 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, GOTO(err_fini_proc, rc); } - rc = mdt_fld_init(env, obd->obd_name, m); + rc = lut_init(env, &m->mdt_lut, obd, m->mdt_bottom); if (rc) GOTO(err_fini_stack, rc); + rc = mdt_fld_init(env, obd->obd_name, m); + if (rc) + GOTO(err_lut, rc); + rc = mdt_seq_init(env, obd->obd_name, m); if (rc) GOTO(err_fini_fld, rc); @@ -4663,7 +4673,7 @@ static int mdt_init0(const struct lu_env *env, struct mdt_device *m, GOTO(err_llog_cleanup, rc); #endif - target_recovery_init(obd, mdt_recovery_handle); + target_recovery_init(&m->mdt_lut, mdt_recovery_handle); rc = mdt_start_ptlrpc_service(m); if (rc) @@ -4713,6 +4723,8 @@ err_fini_seq: mdt_seq_fini(env, m); err_fini_fld: mdt_fld_fini(env, m); +err_lut: + lut_fini(env, &m->mdt_lut); err_fini_stack: mdt_stack_fini(env, m, md2lu_dev(m->mdt_child)); err_fini_proc: @@ -5260,10 +5272,6 @@ static int mdt_upcall(const struct lu_env *env, struct md_device *md, CDEBUG(D_INFO, "get max mdsize %d max cookiesize %d\n", m->mdt_max_mdsize, m->mdt_max_cookiesize); mdt_allow_cli(m, CONFIG_SYNC); -#ifdef HAVE_QUOTA_SUPPORT - if (md->md_lu_dev.ld_obd->obd_recovering == 0) - next->md_ops->mdo_quota.mqo_recovery(env, next); -#endif break; case MD_NO_TRANS: mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key); @@ -5274,6 +5282,12 @@ static int mdt_upcall(const struct lu_env *env, struct md_device *md, /* Check that MDT is not yet configured */ LASSERT(!m->mdt_fl_cfglog); break; +#ifdef HAVE_QUOTA_SUPPORT + case MD_LOV_QUOTA: + if (md->md_lu_dev.ld_obd->obd_recovering == 0) + next->md_ops->mdo_quota.mqo_recovery(env, next); + break; +#endif default: CERROR("invalid event\n"); rc = -EINVAL; diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 01852c0..6028dba 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -60,29 +60,18 @@ * struct lustre_handle */ #include +#include +#include #include -#include #include #include #include -/* LR_CLIENT_SIZE, etc. */ -#include #include #include #include #include #include -static inline __u64 lcd_last_transno(struct lsd_client_data *lcd) -{ - return max(lcd->lcd_last_transno, lcd->lcd_last_close_transno); -} - -static inline __u64 lcd_last_xid(struct lsd_client_data *lcd) -{ - return max(lcd->lcd_last_xid, lcd->lcd_last_close_xid); -} - /* check if request's xid is equal to last one or not*/ static inline int req_xid_is_last(struct ptlrpc_request *req) { @@ -120,6 +109,8 @@ struct mdt_device { /* underlying device */ struct md_device *mdt_child; struct dt_device *mdt_bottom; + /** target device */ + struct lu_target mdt_lut; /* * Options bit-fields. */ @@ -138,25 +129,13 @@ struct mdt_device { spinlock_t mdt_ioepoch_lock; __u64 mdt_ioepoch; - /* Transaction related stuff here */ - spinlock_t mdt_transno_lock; - __u64 mdt_last_transno; - /* transaction callbacks */ struct dt_txn_callback mdt_txn_cb; - /* last_rcvd file */ - struct dt_object *mdt_last_rcvd; /* these values should be updated from lov if necessary. * or should be placed somewhere else. */ int mdt_max_mdsize; int mdt_max_cookiesize; - __u64 mdt_mount_count; - - /* last_rcvd data */ - struct lr_server_data mdt_lsd; - spinlock_t mdt_client_bitmap_lock; - unsigned long mdt_client_bitmap[(LR_MAX_CLIENTS >> 3) / sizeof(long)]; struct upcall_cache *mdt_identity_cache; @@ -188,6 +167,14 @@ struct mdt_device { int mdt_sec_level; }; +#define mdt_transno_lock mdt_lut.lut_translock +#define mdt_last_transno mdt_lut.lut_last_transno +#define mdt_last_rcvd mdt_lut.lut_last_rcvd +#define mdt_mount_count mdt_lut.lut_mount_count +#define mdt_lsd mdt_lut.lut_lsd +#define mdt_client_bitmap_lock mdt_lut.lut_client_bitmap_lock +#define mdt_client_bitmap mdt_lut.lut_client_bitmap + #define MDT_SERVICE_WATCHDOG_FACTOR (2000) #define MDT_ROCOMPAT_SUPP (OBD_ROCOMPAT_LOVOBJID) #define MDT_INCOMPAT_SUPP (OBD_INCOMPAT_MDT | OBD_INCOMPAT_COMMON_LR) @@ -332,6 +319,9 @@ struct mdt_thread_info { */ struct mdt_reint_record mti_rr; + /** md objects included in operation */ + struct mdt_object *mti_mos[PTLRPC_NUM_VERSIONS]; + /* * Operation specification (currently create and lookup) */ @@ -381,6 +371,11 @@ struct mdt_thread_info { struct md_attr mti_tmp_attr; }; +#define mti_parent mti_mos[0] +#define mti_child mti_mos[1] +#define mti_parent1 mti_mos[2] +#define mti_child1 mti_mos[3] + typedef void (*mdt_cb_t)(const struct mdt_device *mdt, __u64 transno, void *data, int err); struct mdt_commit_cb { @@ -395,13 +390,13 @@ struct mdt_commit_cb { struct mdt_txn_info { __u64 txi_transno; unsigned int txi_cb_count; - struct mdt_commit_cb txi_cb[MDT_MAX_COMMIT_CB]; + struct lut_commit_cb txi_cb[MDT_MAX_COMMIT_CB]; }; extern struct lu_context_key mdt_txn_key; static inline void mdt_trans_add_cb(const struct thandle *th, - mdt_cb_t cb_func, void *cb_data) + lut_cb_t cb_func, void *cb_data) { struct mdt_txn_info *txi; @@ -409,8 +404,8 @@ static inline void mdt_trans_add_cb(const struct thandle *th, LASSERT(txi->txi_cb_count < ARRAY_SIZE(txi->txi_cb)); /* add new callback */ - txi->txi_cb[txi->txi_cb_count].mdt_cb_func = cb_func; - txi->txi_cb[txi->txi_cb_count].mdt_cb_data = cb_data; + txi->txi_cb[txi->txi_cb_count].lut_cb_func = cb_func; + txi->txi_cb[txi->txi_cb_count].lut_cb_data = cb_data; txi->txi_cb_count++; } @@ -539,7 +534,7 @@ void mdt_reconstruct_generic(struct mdt_thread_info *mti, struct mdt_lock_handle *lhc); extern void target_recovery_fini(struct obd_device *obd); -extern void target_recovery_init(struct obd_device *obd, +extern void target_recovery_init(struct lu_target *lut, svc_handler_t handler); int mdt_fs_setup(const struct lu_env *, struct mdt_device *, struct obd_device *, struct lustre_sb_info *lsi); @@ -614,6 +609,7 @@ int mdt_check_ucred(struct mdt_thread_info *); int mdt_init_ucred(struct mdt_thread_info *, struct mdt_body *); int mdt_init_ucred_reint(struct mdt_thread_info *); void mdt_exit_ucred(struct mdt_thread_info *); +int mdt_version_get_check(struct mdt_thread_info *, int); /* mdt_idmap.c */ int mdt_init_sec_level(struct mdt_thread_info *); diff --git a/lustre/mdt/mdt_open.c b/lustre/mdt/mdt_open.c index 0f29b77..cfa4961 100644 --- a/lustre/mdt/mdt_open.c +++ b/lustre/mdt/mdt_open.c @@ -906,6 +906,10 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) } msg_flags = lustre_msg_get_flags(req->rq_reqmsg); + if ((create_flags & (MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS)) && + info->mti_spec.u.sp_ea.eadata == NULL) + GOTO(out, result = err_serious(-EINVAL)); + CDEBUG(D_INODE, "I am going to open "DFID"/(%s->"DFID") " "cr_flag=0%o mode=0%06o msg_flag=0x%x\n", PFID(rr->rr_fid1), rr->rr_name, @@ -1003,6 +1007,12 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc) /* Not found and with MDS_OPEN_CREAT: let's create it. */ mdt_set_disposition(info, ldlm_rep, DISP_OPEN_CREATE); + info->mti_mos[0] = parent; + info->mti_mos[1] = child; + result = mdt_version_get_check(info, 0); + if (result) + GOTO(out_child, result); + /* Let lower layers know what is lock mode on directory. */ info->mti_spec.sp_cr_mode = mdt_dlm_mode2mdl_mode(lh->mlh_pdo_mode); diff --git a/lustre/mdt/mdt_recovery.c b/lustre/mdt/mdt_recovery.c index cad6659..c2b37d5 100644 --- a/lustre/mdt/mdt_recovery.c +++ b/lustre/mdt/mdt_recovery.c @@ -152,61 +152,6 @@ void mdt_trans_stop(const struct lu_env *env, mdt->mdt_bottom->dd_ops->dt_trans_stop(env, th); } -/* last_rcvd handling */ -static inline void lsd_le_to_cpu(struct lr_server_data *buf, - struct lr_server_data *lsd) -{ - memcpy(lsd->lsd_uuid, buf->lsd_uuid, sizeof (lsd->lsd_uuid)); - lsd->lsd_last_transno = le64_to_cpu(buf->lsd_last_transno); - lsd->lsd_mount_count = le64_to_cpu(buf->lsd_mount_count); - lsd->lsd_feature_compat = le32_to_cpu(buf->lsd_feature_compat); - lsd->lsd_feature_rocompat = le32_to_cpu(buf->lsd_feature_rocompat); - lsd->lsd_feature_incompat = le32_to_cpu(buf->lsd_feature_incompat); - lsd->lsd_server_size = le32_to_cpu(buf->lsd_server_size); - lsd->lsd_client_start = le32_to_cpu(buf->lsd_client_start); - lsd->lsd_client_size = le16_to_cpu(buf->lsd_client_size); -} - -static inline void lsd_cpu_to_le(struct lr_server_data *lsd, - struct lr_server_data *buf) -{ - memcpy(buf->lsd_uuid, lsd->lsd_uuid, sizeof (lsd->lsd_uuid)); - buf->lsd_last_transno = cpu_to_le64(lsd->lsd_last_transno); - buf->lsd_mount_count = cpu_to_le64(lsd->lsd_mount_count); - buf->lsd_feature_compat = cpu_to_le32(lsd->lsd_feature_compat); - buf->lsd_feature_rocompat = cpu_to_le32(lsd->lsd_feature_rocompat); - buf->lsd_feature_incompat = cpu_to_le32(lsd->lsd_feature_incompat); - buf->lsd_server_size = cpu_to_le32(lsd->lsd_server_size); - buf->lsd_client_start = cpu_to_le32(lsd->lsd_client_start); - buf->lsd_client_size = cpu_to_le16(lsd->lsd_client_size); -} - -static inline void lcd_le_to_cpu(struct lsd_client_data *buf, - struct lsd_client_data *lcd) -{ - memcpy(lcd->lcd_uuid, buf->lcd_uuid, sizeof (lcd->lcd_uuid)); - lcd->lcd_last_transno = le64_to_cpu(buf->lcd_last_transno); - lcd->lcd_last_xid = le64_to_cpu(buf->lcd_last_xid); - lcd->lcd_last_result = le32_to_cpu(buf->lcd_last_result); - lcd->lcd_last_data = le32_to_cpu(buf->lcd_last_data); - lcd->lcd_last_close_transno = le64_to_cpu(buf->lcd_last_close_transno); - lcd->lcd_last_close_xid = le64_to_cpu(buf->lcd_last_close_xid); - lcd->lcd_last_close_result = le32_to_cpu(buf->lcd_last_close_result); -} - -static inline void lcd_cpu_to_le(struct lsd_client_data *lcd, - struct lsd_client_data *buf) -{ - memcpy(buf->lcd_uuid, lcd->lcd_uuid, sizeof (lcd->lcd_uuid)); - buf->lcd_last_transno = cpu_to_le64(lcd->lcd_last_transno); - buf->lcd_last_xid = cpu_to_le64(lcd->lcd_last_xid); - buf->lcd_last_result = cpu_to_le32(lcd->lcd_last_result); - buf->lcd_last_data = cpu_to_le32(lcd->lcd_last_data); - buf->lcd_last_close_transno = cpu_to_le64(lcd->lcd_last_close_transno); - buf->lcd_last_close_xid = cpu_to_le64(lcd->lcd_last_close_xid); - buf->lcd_last_close_result = cpu_to_le32(lcd->lcd_last_close_result); -} - static inline int mdt_last_rcvd_header_read(const struct lu_env *env, struct mdt_device *mdt) { @@ -216,9 +161,9 @@ static inline int mdt_last_rcvd_header_read(const struct lu_env *env, mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key); mti->mti_off = 0; - rc = mdt_record_read(env, mdt->mdt_last_rcvd, - mdt_buf(env, &mti->mti_lsd, sizeof(mti->mti_lsd)), - &mti->mti_off); + rc = dt_record_read(env, mdt->mdt_last_rcvd, + mdt_buf(env, &mti->mti_lsd, sizeof(mti->mti_lsd)), + &mti->mti_off); if (rc == 0) lsd_le_to_cpu(&mti->mti_lsd, &mdt->mdt_lsd); @@ -230,13 +175,6 @@ static inline int mdt_last_rcvd_header_read(const struct lu_env *env, return rc; } -static void mdt_client_cb(const struct mdt_device *mdt, __u64 transno, - void *data, int err) -{ - struct obd_device *obd = mdt2obd_dev(mdt); - target_client_add_cb(obd, transno, data, err); -} - static inline int mdt_last_rcvd_header_write(const struct lu_env *env, struct mdt_device *mdt, struct thandle *th, @@ -258,12 +196,12 @@ static inline int mdt_last_rcvd_header_write(const struct lu_env *env, lsd_cpu_to_le(&mdt->mdt_lsd, &mti->mti_lsd); if (need_sync && mti->mti_exp) - mdt_trans_add_cb(th, mdt_client_cb, mti->mti_exp); + mdt_trans_add_cb(th, lut_cb_client, mti->mti_exp); - rc = mdt_record_write(env, mdt->mdt_last_rcvd, - mdt_buf_const(env, &mti->mti_lsd, - sizeof(mti->mti_lsd)), - &mti->mti_off, th); + rc = dt_record_write(env, mdt->mdt_last_rcvd, + mdt_buf_const(env, &mti->mti_lsd, + sizeof(mti->mti_lsd)), + &mti->mti_off, th); CDEBUG(D_INFO, "write last_rcvd header rc = %d:\n" "uuid = %s\nlast_transno = "LPU64"\n", @@ -420,6 +358,8 @@ static int mdt_clients_data_init(const struct lu_env *env, rc = mdt_client_add(env, mdt, cl_idx); /* can't fail existing */ LASSERTF(rc == 0, "rc = %d\n", rc); + /* VBR: set export last committed version */ + exp->exp_last_committed = last_transno; lcd = NULL; spin_lock(&exp->exp_lock); exp->exp_connecting = 0; @@ -566,7 +506,7 @@ static int mdt_server_data_init(const struct lu_env *env, RETURN(0); err_client: - target_recovery_fini(obd); + class_disconnect_exports(obd); out: return rc; } @@ -686,13 +626,13 @@ int mdt_client_new(const struct lu_env *env, struct mdt_device *mdt) if (rc) GOTO(cleanup, rc); - /* + /* * Until this operations will be committed the sync is needed * for this export. This should be done _after_ starting the * transaction so that many connecting clients will not bring - * server down with lots of sync writes. + * server down with lots of sync writes. */ - mdt_trans_add_cb(th, mdt_client_cb, mti->mti_exp); + mdt_trans_add_cb(th, lut_cb_client, mti->mti_exp); spin_lock(&mti->mti_exp->exp_lock); mti->mti_exp->exp_need_sync = 1; spin_unlock(&mti->mti_exp->exp_lock); @@ -836,9 +776,9 @@ int mdt_client_del(const struct lu_env *env, struct mdt_device *mdt) if (need_sync) { /* * Until this operations will be committed the sync - * is needed for this export. + * is needed for this export. */ - mdt_trans_add_cb(th, mdt_client_cb, exp); + mdt_trans_add_cb(th, lut_cb_client, exp); } mutex_down(&med->med_lcd_lock); @@ -858,10 +798,10 @@ cleanup: clear_bit(med->med_lr_idx, mdt->mdt_client_bitmap); spin_unlock(&mdt->mdt_client_bitmap_lock); - /* + /* * 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. + * transactions have been committed. */ mdt_server_data_update_noth(env, mdt, need_sync); @@ -885,7 +825,6 @@ static int mdt_last_rcvd_update(struct mdt_thread_info *mti, loff_t off; int err; __s32 rc = th->th_result; - __u64 *transno_p; ENTRY; LASSERT(req); @@ -904,14 +843,25 @@ static int mdt_last_rcvd_update(struct mdt_thread_info *mti, } off = med->med_lr_off; + LASSERT(ergo(mti->mti_transno == 0, rc != 0)); mutex_down(&med->med_lcd_lock); if (lustre_msg_get_opc(req->rq_reqmsg) == MDS_CLOSE || lustre_msg_get_opc(req->rq_reqmsg) == MDS_DONE_WRITING) { - transno_p = &lcd->lcd_last_close_transno; + if (mti->mti_transno != 0) + lcd->lcd_last_close_transno = mti->mti_transno; lcd->lcd_last_close_xid = req->rq_xid; lcd->lcd_last_close_result = rc; } else { - transno_p = &lcd->lcd_last_transno; + /* VBR: save versions in last_rcvd for reconstruct. */ + __u64 *pre_versions = lustre_msg_get_versions(req->rq_repmsg); + if (pre_versions) { + lcd->lcd_pre_versions[0] = pre_versions[0]; + lcd->lcd_pre_versions[1] = pre_versions[1]; + lcd->lcd_pre_versions[2] = pre_versions[2]; + lcd->lcd_pre_versions[3] = pre_versions[3]; + } + if (mti->mti_transno != 0) + lcd->lcd_last_transno = mti->mti_transno; lcd->lcd_last_xid = req->rq_xid; lcd->lcd_last_result = rc; /*XXX: save intent_disposition in mdt_thread_info? @@ -920,20 +870,6 @@ static int mdt_last_rcvd_update(struct mdt_thread_info *mti, lcd->lcd_last_data = mti->mti_opdata; } - /* - * When we store zero transno in lcd we can lost last transno value - * because lcd contains 0, but lsd is not yet written - * The server data should be updated also if the latest - * transno is rewritten by zero. See the bug 11125 for details. - */ - if (mti->mti_transno == 0 && - *transno_p == mdt->mdt_last_transno) - mdt_server_data_update(mti->mti_env, mdt, th, - (mti->mti_exp && - mti->mti_exp->exp_need_sync)); - - *transno_p = mti->mti_transno; - if (off <= 0) { CERROR("client idx %d has offset %lld\n", med->med_lr_idx, off); err = -EINVAL; @@ -966,6 +902,17 @@ static int mdt_txn_start_cb(const struct lu_env *env, return rc; } +/* Set new object versions */ +static void mdt_versions_set(struct mdt_thread_info *info) +{ + int i; + for (i = 0; i < PTLRPC_NUM_VERSIONS; i++) + if (info->mti_mos[i] != NULL) + mo_version_set(info->mti_env, + mdt_object_child(info->mti_mos[i]), + info->mti_transno); +} + /* Update last_rcvd records with latests transaction data */ static int mdt_txn_stop_cb(const struct lu_env *env, struct thandle *txn, void *cookie) @@ -1000,7 +947,6 @@ static int mdt_txn_stop_cb(const struct lu_env *env, if (mti->mti_transno != 0) { CERROR("Replay transno "LPU64" failed: rc %i\n", mti->mti_transno, txn->th_result); - mti->mti_transno = 0; } } else if (mti->mti_transno == 0) { mti->mti_transno = ++ mdt->mdt_last_transno; @@ -1010,9 +956,14 @@ static int mdt_txn_stop_cb(const struct lu_env *env, mdt->mdt_last_transno = mti->mti_transno; } + spin_unlock(&mdt->mdt_transno_lock); /* sometimes the reply message has not been successfully packed */ LASSERT(req != NULL && req->rq_repmsg != NULL); + /** VBR: set new versions */ + if (txn->th_result == 0) + mdt_versions_set(mti); + /* filling reply data */ CDEBUG(D_INODE, "transno = %llu, last_committed = %llu\n", mti->mti_transno, req->rq_export->exp_obd->obd_last_committed); @@ -1023,7 +974,10 @@ static int mdt_txn_stop_cb(const struct lu_env *env, lcd_last_xid(req->rq_export->exp_mdt_data.med_lcd)); /* save transno for the commit callback */ txi->txi_transno = mti->mti_transno; - spin_unlock(&mdt->mdt_transno_lock); + + /* add separate commit callback for transaction handling because we need + * export as parameter */ + mdt_trans_add_cb(txn, lut_cb_last_committed, mti->mti_exp); return mdt_last_rcvd_update(mti, txn); } @@ -1033,29 +987,15 @@ static int mdt_txn_commit_cb(const struct lu_env *env, struct thandle *txn, void *cookie) { struct mdt_device *mdt = cookie; - struct obd_device *obd = mdt2obd_dev(mdt); struct mdt_txn_info *txi; int i; txi = lu_context_key_get(&txn->th_ctx, &mdt_txn_key); - /* copy of obd_transno_commit_cb() but with locking */ - spin_lock(&mdt->mdt_transno_lock); - if (txi->txi_transno > obd->obd_last_committed) { - obd->obd_last_committed = txi->txi_transno; - spin_unlock(&mdt->mdt_transno_lock); - ptlrpc_commit_replies(obd); - } else - spin_unlock(&mdt->mdt_transno_lock); - - if (txi->txi_transno) - CDEBUG(D_HA, "%s: transno "LPD64" is committed\n", - obd->obd_name, txi->txi_transno); - /* iterate through all additional callbacks */ for (i = 0; i < txi->txi_cb_count; i++) { - txi->txi_cb[i].mdt_cb_func(mdt, txi->txi_transno, - txi->txi_cb[i].mdt_cb_data, 0); + txi->txi_cb[i].lut_cb_func(&mdt->mdt_lut, txi->txi_transno, + txi->txi_cb[i].lut_cb_data, 0); } return 0; } @@ -1077,21 +1017,14 @@ int mdt_fs_setup(const struct lu_env *env, struct mdt_device *mdt, mdt->mdt_txn_cb.dtc_txn_stop = mdt_txn_stop_cb; mdt->mdt_txn_cb.dtc_txn_commit = mdt_txn_commit_cb; mdt->mdt_txn_cb.dtc_cookie = mdt; + mdt->mdt_txn_cb.dtc_tag = LCT_MD_THREAD; CFS_INIT_LIST_HEAD(&mdt->mdt_txn_cb.dtc_linkage); dt_txn_callback_add(mdt->mdt_bottom, &mdt->mdt_txn_cb); - o = dt_store_open(env, mdt->mdt_bottom, "", LAST_RCVD, &fid); - if (!IS_ERR(o)) { - mdt->mdt_last_rcvd = o; - rc = mdt_server_data_init(env, mdt, lsi); - if (rc) - GOTO(put_last_rcvd, rc); - } else { - rc = PTR_ERR(o); - CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc); + rc = mdt_server_data_init(env, mdt, lsi); + if (rc) RETURN(rc); - } o = dt_store_open(env, mdt->mdt_bottom, "", CAPA_KEYS, &fid); if (!IS_ERR(o)) { @@ -1102,16 +1035,15 @@ int mdt_fs_setup(const struct lu_env *env, struct mdt_device *mdt, } else { rc = PTR_ERR(o); CERROR("cannot open %s: rc = %d\n", CAPA_KEYS, rc); - GOTO(put_last_rcvd, rc); + GOTO(disconnect_exports, rc); } RETURN(0); put_ck_object: lu_object_put(env, &o->do_lu); mdt->mdt_ck_obj = NULL; -put_last_rcvd: - lu_object_put(env, &mdt->mdt_last_rcvd->do_lu); - mdt->mdt_last_rcvd = NULL; +disconnect_exports: + class_disconnect_exports(obd); return rc; } @@ -1121,9 +1053,6 @@ void mdt_fs_cleanup(const struct lu_env *env, struct mdt_device *mdt) /* Remove transaction callback */ dt_txn_callback_del(mdt->mdt_bottom, &mdt->mdt_txn_cb); - if (mdt->mdt_last_rcvd) - lu_object_put(env, &mdt->mdt_last_rcvd->do_lu); - mdt->mdt_last_rcvd = NULL; if (mdt->mdt_ck_obj) lu_object_put(env, &mdt->mdt_ck_obj->do_lu); mdt->mdt_ck_obj = NULL; @@ -1182,6 +1111,20 @@ static void mdt_steal_ack_locks(struct ptlrpc_request *req) spin_unlock(&exp->exp_lock); } +/** + * VBR: restore versions + */ +void mdt_vbr_reconstruct(struct ptlrpc_request *req, + struct lsd_client_data *lcd) +{ + __u64 pre_versions[4] = {0}; + pre_versions[0] = lcd->lcd_pre_versions[0]; + pre_versions[1] = lcd->lcd_pre_versions[1]; + pre_versions[2] = lcd->lcd_pre_versions[2]; + pre_versions[3] = lcd->lcd_pre_versions[3]; + lustre_msg_set_versions(req->rq_repmsg, pre_versions); +} + void mdt_req_from_lcd(struct ptlrpc_request *req, struct lsd_client_data *lcd) { @@ -1192,14 +1135,18 @@ void mdt_req_from_lcd(struct ptlrpc_request *req, lustre_msg_get_opc(req->rq_repmsg) == MDS_DONE_WRITING) { req->rq_transno = lcd->lcd_last_close_transno; req->rq_status = lcd->lcd_last_close_result; - lustre_msg_set_transno(req->rq_repmsg, req->rq_transno); - lustre_msg_set_status(req->rq_repmsg, req->rq_status); } else { req->rq_transno = lcd->lcd_last_transno; req->rq_status = lcd->lcd_last_result; - lustre_msg_set_transno(req->rq_repmsg, req->rq_transno); - lustre_msg_set_status(req->rq_repmsg, req->rq_status); + mdt_vbr_reconstruct(req, lcd); } + if (req->rq_status != 0) + req->rq_transno = 0; + lustre_msg_set_transno(req->rq_repmsg, req->rq_transno); + lustre_msg_set_status(req->rq_repmsg, req->rq_status); + DEBUG_REQ(D_RPCTRACE, req, "restoring transno "LPD64"/status %d", + req->rq_transno, req->rq_status); + mdt_steal_ack_locks(req); } diff --git a/lustre/mdt/mdt_reint.c b/lustre/mdt/mdt_reint.c index 4de1f39..26f923d 100644 --- a/lustre/mdt/mdt_reint.c +++ b/lustre/mdt/mdt_reint.c @@ -96,6 +96,51 @@ static int mdt_create_pack_capa(struct mdt_thread_info *info, int rc, RETURN(rc); } +int mdt_version_get_check(struct mdt_thread_info *info, int index) +{ + /** version recovery */ + struct md_object *mo; + struct ptlrpc_request *req = mdt_info_req(info); + __u64 curr_version, *pre_versions; + ENTRY; + + if (!exp_connect_vbr(req->rq_export)) + RETURN(0); + + LASSERT(info->mti_mos[index]); + LASSERT(mdt_object_exists(info->mti_mos[index])); + mo = mdt_object_child(info->mti_mos[index]); + + curr_version = mo_version_get(info->mti_env, mo); + CDEBUG(D_INODE, "Version is "LPX64"\n", curr_version); + /** VBR: version is checked always because costs nothing */ + if (lustre_msg_get_transno(req->rq_reqmsg) != 0) { + pre_versions = lustre_msg_get_versions(req->rq_reqmsg); + LASSERT(index < PTLRPC_NUM_VERSIONS); + /** Sanity check for malformed buffers */ + if (pre_versions == NULL) { + CERROR("No versions in request buffer\n"); + spin_lock(&req->rq_export->exp_lock); + req->rq_export->exp_vbr_failed = 1; + spin_unlock(&req->rq_export->exp_lock); + RETURN(-EOVERFLOW); + } else if (pre_versions[index] != curr_version) { + CDEBUG(D_INODE, "Version mismatch "LPX64" != "LPX64"\n", + pre_versions[index], curr_version); + spin_lock(&req->rq_export->exp_lock); + req->rq_export->exp_vbr_failed = 1; + spin_unlock(&req->rq_export->exp_lock); + RETURN(-EOVERFLOW); + } + } + /** save pre-versions in reply */ + LASSERT(req->rq_repmsg != NULL); + pre_versions = lustre_msg_get_versions(req->rq_repmsg); + if (pre_versions) + pre_versions[index] = curr_version; + RETURN(0); +} + static int mdt_md_create(struct mdt_thread_info *info) { struct mdt_device *mdt = info->mti_mdt; @@ -136,6 +181,12 @@ static int mdt_md_create(struct mdt_thread_info *info) mdt_fail_write(info->mti_env, info->mti_mdt->mdt_bottom, OBD_FAIL_MDS_REINT_CREATE_WRITE); + info->mti_mos[0] = parent; + info->mti_mos[1] = child; + rc = mdt_version_get_check(info, 0); + if (rc) + GOTO(out_put_child, rc); + /* Let lower layer know current lock mode. */ info->mti_spec.sp_cr_mode = mdt_dlm_mode2mdl_mode(lh->mlh_pdo_mode); @@ -158,6 +209,7 @@ static int mdt_md_create(struct mdt_thread_info *info) mdt_pack_attr2body(info, repbody, &ma->ma_attr, mdt_object_fid(child)); } +out_put_child: mdt_object_put(info->mti_env, child); } else rc = PTR_ERR(child); @@ -227,6 +279,7 @@ int mdt_attr_set(struct mdt_thread_info *info, struct mdt_object *mo, int flags) struct md_attr *ma = &info->mti_attr; struct mdt_lock_handle *lh; int som_update = 0; + int do_vbr = ma->ma_attr.la_valid & (LA_MODE|LA_UID|LA_GID); int rc; ENTRY; @@ -271,6 +324,14 @@ int mdt_attr_set(struct mdt_thread_info *info, struct mdt_object *mo, int flags) if (unlikely(ma->ma_attr.la_valid == LA_CTIME)) ma->ma_attr_flags |= MDS_VTX_BYPASS; + /* VBR: update version if attr changed are important for recovery */ + if (do_vbr) { + info->mti_mos[0] = mo; + rc = mdt_version_get_check(info, 0); + if (rc) + GOTO(out_unlock, rc); + } + /* all attrs are packed into mti_attr in unpack_setattr */ rc = mo_attr_set(info->mti_env, mdt_object_child(mo), ma); if (rc != 0) @@ -315,6 +376,7 @@ static int mdt_reint_setattr(struct mdt_thread_info *info, if (IS_ERR(mo)) GOTO(out, rc = PTR_ERR(mo)); + /* start a log jounal handle if needed */ if (!(mdt_conn_flags(info) & OBD_CONNECT_SOM)) { if ((ma->ma_attr.la_valid & LA_SIZE) || (rr->rr_flags & MRF_SETATTR_LOCKED)) { @@ -497,6 +559,11 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, GOTO(out, rc); } + info->mti_mos[0] = mp; + rc = mdt_version_get_check(info, 0); + if (rc) + GOTO(out_unlock_parent, rc); + mdt_reint_init_ma(info, ma); if (!ma->ma_lmm || !ma->ma_cookie) GOTO(out_unlock_parent, rc = -EINVAL); @@ -542,6 +609,11 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, mdt_fail_write(info->mti_env, info->mti_mdt->mdt_bottom, OBD_FAIL_MDS_REINT_UNLINK_WRITE); + info->mti_mos[1] = mc; + rc = mdt_version_get_check(info, 1); + if (rc) + GOTO(out_unlock_child, rc); + /* * Now we can only make sure we need MA_INODE, in mdd layer, will check * whether need MA_LOV and MA_COOKIE. @@ -555,6 +627,7 @@ static int mdt_reint_unlink(struct mdt_thread_info *info, mdt_handle_last_unlink(info, mc, ma); EXIT; +out_unlock_child: mdt_object_unlock_put(info, mc, child_lh, rc); out_unlock_parent: mdt_object_unlock_put(info, mp, parent_lh, rc); @@ -614,6 +687,11 @@ static int mdt_reint_link(struct mdt_thread_info *info, if (IS_ERR(mp)) RETURN(PTR_ERR(mp)); + info->mti_mos[0] = mp; + rc = mdt_version_get_check(info, 0); + if (rc) + GOTO(out_unlock_parent, rc); + /* step 2: find & lock the source */ lhs = &info->mti_lh[MDT_LH_CHILD]; mdt_lock_reg_init(lhs, LCK_EX); @@ -633,11 +711,17 @@ static int mdt_reint_link(struct mdt_thread_info *info, mdt_fail_write(info->mti_env, info->mti_mdt->mdt_bottom, OBD_FAIL_MDS_REINT_LINK_WRITE); + info->mti_mos[1] = ms; + rc = mdt_version_get_check(info, 1); + if (rc) + GOTO(out_unlock_child, rc); + lname = mdt_name(info->mti_env, (char *)rr->rr_name, rr->rr_namelen); rc = mdo_link(info->mti_env, mdt_object_child(mp), mdt_object_child(ms), lname, ma); EXIT; +out_unlock_child: mdt_object_unlock_put(info, ms, lhs, rc); out_unlock_parent: mdt_object_unlock_put(info, mp, lhp, rc); @@ -871,6 +955,11 @@ static int mdt_reint_rename(struct mdt_thread_info *info, if (IS_ERR(msrcdir)) GOTO(out_rename_lock, rc = PTR_ERR(msrcdir)); + info->mti_mos[0] = msrcdir; + rc = mdt_version_get_check(info, 0); + if (rc) + GOTO(out_unlock_source, rc); + /* step 2: find & lock the target dir. */ lh_tgtdirp = &info->mti_lh[MDT_LH_CHILD]; mdt_lock_pdo_init(lh_tgtdirp, LCK_PW, rr->rr_tgt, @@ -892,7 +981,14 @@ static int mdt_reint_rename(struct mdt_thread_info *info, rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp, MDS_INODELOCK_UPDATE, MDT_LOCAL_LOCK); - if (rc != 0) + if (rc != 0) { + mdt_object_put(info->mti_env, mtgtdir); + GOTO(out_unlock_source, rc); + } + + info->mti_mos[1] = mtgtdir; + rc = mdt_version_get_check(info, 1); + if (rc) GOTO(out_unlock_target, rc); } } @@ -920,6 +1016,12 @@ static int mdt_reint_rename(struct mdt_thread_info *info, mdt_object_put(info->mti_env, mold); GOTO(out_unlock_target, rc); } + + info->mti_mos[2] = mold; + rc = mdt_version_get_check(info, 2); + if (rc) + GOTO(out_unlock_old, rc); + mdt_set_capainfo(info, 2, old_fid, BYPASS_CAPA); /* step 4: find & lock the new object. */ @@ -947,6 +1049,12 @@ static int mdt_reint_rename(struct mdt_thread_info *info, mdt_object_put(info->mti_env, mnew); GOTO(out_unlock_old, rc); } + + info->mti_mos[3] = mnew; + rc = mdt_version_get_check(info, 3); + if (rc) + GOTO(out_unlock_new, rc); + mdt_set_capainfo(info, 3, new_fid, BYPASS_CAPA); } else if (rc != -EREMOTE && rc != -ENOENT) GOTO(out_unlock_old, rc); diff --git a/lustre/mdt/mdt_xattr.c b/lustre/mdt/mdt_xattr.c index 8e646b2..ae04caf 100644 --- a/lustre/mdt/mdt_xattr.c +++ b/lustre/mdt/mdt_xattr.c @@ -62,7 +62,7 @@ static int mdt_getxattr_pack_reply(struct mdt_thread_info * info) static const char user_string[] = "user."; int size, rc; ENTRY; - + if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETXATTR_PACK)) RETURN(-ENOMEM); @@ -75,7 +75,7 @@ static int mdt_getxattr_pack_reply(struct mdt_thread_info * info) if (!(req->rq_export->exp_connect_flags & OBD_CONNECT_XATTR) && !strncmp(xattr_name, user_string, sizeof(user_string) - 1)) RETURN(-EOPNOTSUPP); - + size = mo_xattr_get(info->mti_env, mdt_object_child(info->mti_object), &LU_BUF_NULL, xattr_name); @@ -352,6 +352,11 @@ int mdt_reint_setxattr(struct mdt_thread_info *info, if (IS_ERR(obj)) GOTO(out, rc = PTR_ERR(obj)); + info->mti_mos[0] = obj; + rc = mdt_version_get_check(info, 0); + if (rc) + GOTO(out_unlock, rc); + if (unlikely(!(valid & OBD_MD_FLCTIME))) { CWARN("client miss to set OBD_MD_FLCTIME when " "setxattr: [object "DFID"] [valid %llu]\n", diff --git a/lustre/mgc/lproc_mgc.c b/lustre/mgc/lproc_mgc.c index ba98f1b..baaa46f 100644 --- a/lustre/mgc/lproc_mgc.c +++ b/lustre/mgc/lproc_mgc.c @@ -48,7 +48,8 @@ static struct lprocfs_vars lprocfs_mgc_obd_vars[] = { { "connect_flags", lprocfs_rd_connect_flags, 0, 0 }, { "mgs_server_uuid", lprocfs_rd_server_uuid, 0, 0 }, { "mgs_conn_uuid", lprocfs_rd_conn_uuid, 0, 0 }, - { "import", lprocfs_rd_import, 0, 0 }, + { "import", lprocfs_rd_import, 0, 0 }, + { "state", lprocfs_rd_state, 0, 0 }, { 0 } }; diff --git a/lustre/obdclass/cl_internal.h b/lustre/obdclass/cl_internal.h index 578fdc7..b14a583 100644 --- a/lustre/obdclass/cl_internal.h +++ b/lustre/obdclass/cl_internal.h @@ -43,6 +43,36 @@ #define CLT_PVEC_SIZE (14) /** + * Possible levels of the nesting. Currently this is 2: there are "top" + * entities (files, extent locks), and "sub" entities (stripes and stripe + * locks). This is used only for debugging counters right now. + */ +enum clt_nesting_level { + CNL_TOP, + CNL_SUB, + CNL_NR +}; + +/** + * Counters used to check correctness of cl_lock interface usage. + */ +struct cl_thread_counters { + /** + * Number of outstanding calls to cl_lock_mutex_get() made by the + * current thread. For debugging. + */ + int ctc_nr_locks_locked; + /** List of locked locks. */ + struct lu_ref ctc_locks_locked; + /** Number of outstanding holds on locks. */ + int ctc_nr_held; + /** Number of outstanding uses on locks. */ + int ctc_nr_used; + /** Number of held extent locks. */ + int ctc_nr_locks_acquired; +}; + +/** * Thread local state internal for generic cl-code. */ struct cl_thread_info { @@ -58,24 +88,9 @@ struct cl_thread_info { struct cl_lock_descr clt_descr; struct cl_page_list clt_list; /** - * \name debugging. - * - * Counters used to check correctness of cl_lock interface usage. - * @{ + * Counters for every level of lock nesting. */ - /** - * Number of outstanding calls to cl_lock_mutex_get() made by the - * current thread. For debugging. - */ - int clt_nr_locks_locked; - /** List of locked locks. */ - struct lu_ref clt_locks_locked; - /** Number of outstanding holds on the top-level locks. */ - int clt_nr_held; - /** Number of outstanding uses on the top-level locks. */ - int clt_nr_used; - /** Number of held top-level extent locks. */ - int clt_nr_locks_acquired; + struct cl_thread_counters clt_counters[CNL_NR]; /** @} debugging */ /* diff --git a/lustre/obdclass/cl_io.c b/lustre/obdclass/cl_io.c index 1b10e2a..e36bc31 100644 --- a/lustre/obdclass/cl_io.c +++ b/lustre/obdclass/cl_io.c @@ -228,7 +228,7 @@ int cl_io_rw_init(const struct lu_env *env, struct cl_io *io, LU_OBJECT_HEADER(D_VFSTRACE, env, &io->ci_obj->co_lu, "io range: %i [%llu, %llu) %i %i\n", - iot, (__u64)pos, (__u64)pos + count, + iot, (__u64)pos, (__u64)(pos + count), io->u.ci_rw.crw_nonblock, io->u.ci_wr.wr_append); io->u.ci_rw.crw_pos = pos; io->u.ci_rw.crw_count = count; @@ -466,7 +466,7 @@ void cl_io_unlock(const struct lu_env *env, struct cl_io *io) scan->cis_iop->op[io->ci_type].cio_unlock(env, scan); } io->ci_state = CIS_UNLOCKED; - LASSERT(cl_env_info(env)->clt_nr_locks_acquired == 0); + LASSERT(!cl_env_info(env)->clt_counters[CNL_TOP].ctc_nr_locks_acquired); EXIT; } EXPORT_SYMBOL(cl_io_unlock); diff --git a/lustre/obdclass/cl_lock.c b/lustre/obdclass/cl_lock.c index e087eca..b75685f 100644 --- a/lustre/obdclass/cl_lock.c +++ b/lustre/obdclass/cl_lock.c @@ -104,6 +104,29 @@ static int cl_lock_invariant(const struct lu_env *env, return result; } +/** + * Returns lock "nesting": 0 for a top-lock and 1 for a sub-lock. + */ +static enum clt_nesting_level cl_lock_nesting(const struct cl_lock *lock) +{ + return cl_object_header(lock->cll_descr.cld_obj)->coh_nesting; +} + +/** + * Returns a set of counters for this lock, depending on a lock nesting. + */ +static struct cl_thread_counters *cl_lock_counters(const struct lu_env *env, + const struct cl_lock *lock) +{ + struct cl_thread_info *info; + enum clt_nesting_level nesting; + + info = cl_env_info(env); + nesting = cl_lock_nesting(lock); + LASSERT(nesting < ARRAY_SIZE(info->clt_counters)); + return &info->clt_counters[nesting]; +} + #define RETIP ((unsigned long)__builtin_return_address(0)) #ifdef CONFIG_LOCKDEP @@ -117,7 +140,7 @@ static void cl_lock_lockdep_init(struct cl_lock *lock) static void cl_lock_lockdep_acquire(const struct lu_env *env, struct cl_lock *lock, __u32 enqflags) { - cl_env_info(env)->clt_nr_locks_acquired++; + cl_lock_counters(env, lock)->ctc_nr_locks_acquired++; lock_acquire(&lock->dep_map, !!(enqflags & CEF_ASYNC), /* try: */ 0, lock->cll_descr.cld_mode <= CLM_READ, /* check: */ 2, RETIP); @@ -126,7 +149,7 @@ static void cl_lock_lockdep_acquire(const struct lu_env *env, static void cl_lock_lockdep_release(const struct lu_env *env, struct cl_lock *lock) { - cl_env_info(env)->clt_nr_locks_acquired--; + cl_lock_counters(env, lock)->ctc_nr_locks_acquired--; lock_release(&lock->dep_map, 0, RETIP); } @@ -545,23 +568,23 @@ const struct cl_lock_slice *cl_lock_at(const struct cl_lock *lock, } EXPORT_SYMBOL(cl_lock_at); -static void cl_lock_trace(struct cl_thread_info *info, +static void cl_lock_trace(struct cl_thread_counters *counters, const char *prefix, const struct cl_lock *lock) { CDEBUG(D_DLMTRACE|D_TRACE, "%s: %i@%p %p %i %i\n", prefix, atomic_read(&lock->cll_ref), lock, lock->cll_guarder, - lock->cll_depth, info->clt_nr_locks_locked); + lock->cll_depth, counters->ctc_nr_locks_locked); } static void cl_lock_mutex_tail(const struct lu_env *env, struct cl_lock *lock) { - struct cl_thread_info *info; + struct cl_thread_counters *counters; - info = cl_env_info(env); + counters = cl_lock_counters(env, lock); lock->cll_depth++; - info->clt_nr_locks_locked++; - lu_ref_add(&info->clt_locks_locked, "cll_guard", lock); - cl_lock_trace(info, "got mutex", lock); + counters->ctc_nr_locks_locked++; + lu_ref_add(&counters->ctc_locks_locked, "cll_guard", lock); + cl_lock_trace(counters, "got mutex", lock); } /** @@ -583,9 +606,17 @@ void cl_lock_mutex_get(const struct lu_env *env, struct cl_lock *lock) LINVRNT(lock->cll_depth > 0); } else { struct cl_object_header *hdr; + struct cl_thread_info *info; + int i; LINVRNT(lock->cll_guarder != cfs_current()); hdr = cl_object_header(lock->cll_descr.cld_obj); + /* + * Check that mutices are taken in the bottom-to-top order. + */ + info = cl_env_info(env); + for (i = 0; i < hdr->coh_nesting; ++i) + LASSERT(info->clt_counters[i].ctc_nr_locks_locked == 0); mutex_lock_nested(&lock->cll_guard, hdr->coh_nesting); lock->cll_guarder = cfs_current(); LINVRNT(lock->cll_depth == 0); @@ -635,19 +666,19 @@ EXPORT_SYMBOL(cl_lock_mutex_try); */ void cl_lock_mutex_put(const struct lu_env *env, struct cl_lock *lock) { - struct cl_thread_info *info; + struct cl_thread_counters *counters; LINVRNT(cl_lock_invariant(env, lock)); LINVRNT(cl_lock_is_mutexed(lock)); LINVRNT(lock->cll_guarder == cfs_current()); LINVRNT(lock->cll_depth > 0); - info = cl_env_info(env); - LINVRNT(info->clt_nr_locks_locked > 0); + counters = cl_lock_counters(env, lock); + LINVRNT(counters->ctc_nr_locks_locked > 0); - cl_lock_trace(info, "put mutex", lock); - lu_ref_del(&info->clt_locks_locked, "cll_guard", lock); - info->clt_nr_locks_locked--; + cl_lock_trace(counters, "put mutex", lock); + lu_ref_del(&counters->ctc_locks_locked, "cll_guard", lock); + counters->ctc_nr_locks_locked--; if (--lock->cll_depth == 0) { lock->cll_guarder = NULL; mutex_unlock(&lock->cll_guard); @@ -669,7 +700,19 @@ EXPORT_SYMBOL(cl_lock_is_mutexed); */ int cl_lock_nr_mutexed(const struct lu_env *env) { - return cl_env_info(env)->clt_nr_locks_locked; + struct cl_thread_info *info; + int i; + int locked; + + /* + * NOTE: if summation across all nesting levels (currently 2) proves + * too expensive, a summary counter can be added to + * struct cl_thread_info. + */ + info = cl_env_info(env); + for (i = 0, locked = 0; i < ARRAY_SIZE(info->clt_counters); ++i) + locked += info->clt_counters[i].ctc_nr_locks_locked; + return locked; } EXPORT_SYMBOL(cl_lock_nr_mutexed); @@ -737,33 +780,43 @@ static void cl_lock_delete0(const struct lu_env *env, struct cl_lock *lock) EXIT; } +/** + * Mod(ifie)s cl_lock::cll_holds counter for a given lock. Also, for a + * top-lock (nesting == 0) accounts for this modification in the per-thread + * debugging counters. Sub-lock holds can be released by a thread different + * from one that acquired it. + */ static void cl_lock_hold_mod(const struct lu_env *env, struct cl_lock *lock, int delta) { - struct cl_thread_info *cti; - struct cl_object_header *hdr; + struct cl_thread_counters *counters; + enum clt_nesting_level nesting; - cti = cl_env_info(env); - hdr = cl_object_header(lock->cll_descr.cld_obj); lock->cll_holds += delta; - if (hdr->coh_nesting == 0) { - cti->clt_nr_held += delta; - LASSERT(cti->clt_nr_held >= 0); + nesting = cl_lock_nesting(lock); + if (nesting == CNL_TOP) { + counters = &cl_env_info(env)->clt_counters[CNL_TOP]; + counters->ctc_nr_held += delta; + LASSERT(counters->ctc_nr_held >= 0); } } +/** + * Mod(ifie)s cl_lock::cll_users counter for a given lock. See + * cl_lock_hold_mod() for the explanation of the debugging code. + */ static void cl_lock_used_mod(const struct lu_env *env, struct cl_lock *lock, int delta) { - struct cl_thread_info *cti; - struct cl_object_header *hdr; + struct cl_thread_counters *counters; + enum clt_nesting_level nesting; - cti = cl_env_info(env); - hdr = cl_object_header(lock->cll_descr.cld_obj); lock->cll_users += delta; - if (hdr->coh_nesting == 0) { - cti->clt_nr_used += delta; - LASSERT(cti->clt_nr_used >= 0); + nesting = cl_lock_nesting(lock); + if (nesting == CNL_TOP) { + counters = &cl_env_info(env)->clt_counters[CNL_TOP]; + counters->ctc_nr_used += delta; + LASSERT(counters->ctc_nr_used >= 0); } } @@ -1516,6 +1569,11 @@ EXPORT_SYMBOL(cl_lock_closure_fini); * cl_lock_put() to finish it. * * \pre atomic_read(&lock->cll_ref) > 0 + * \pre ergo(cl_lock_nesting(lock) == CNL_TOP, + * cl_lock_nr_mutexed(env) == 1) + * [i.e., if a top-lock is deleted, mutices of no other locks can be + * held, as deletion of sub-locks might require releasing a top-lock + * mutex] * * \see cl_lock_operations::clo_delete() * \see cl_lock::cll_holds @@ -1524,6 +1582,8 @@ void cl_lock_delete(const struct lu_env *env, struct cl_lock *lock) { LINVRNT(cl_lock_is_mutexed(lock)); LINVRNT(cl_lock_invariant(env, lock)); + LASSERT(ergo(cl_lock_nesting(lock) == CNL_TOP, + cl_lock_nr_mutexed(env) == 1)); ENTRY; if (lock->cll_holds == 0) @@ -1575,6 +1635,7 @@ void cl_lock_cancel(const struct lu_env *env, struct cl_lock *lock) { LINVRNT(cl_lock_is_mutexed(lock)); LINVRNT(cl_lock_invariant(env, lock)); + ENTRY; if (lock->cll_holds == 0) cl_lock_cancel0(env, lock); diff --git a/lustre/obdclass/cl_object.c b/lustre/obdclass/cl_object.c index 35a7cf5..e873554 100644 --- a/lustre/obdclass/cl_object.c +++ b/lustre/obdclass/cl_object.c @@ -995,8 +995,12 @@ static void *cl_key_init(const struct lu_context *ctx, struct cl_thread_info *info; info = cl0_key_init(ctx, key); - if (!IS_ERR(info)) - lu_ref_init(&info->clt_locks_locked); + if (!IS_ERR(info)) { + int i; + + for (i = 0; i < ARRAY_SIZE(info->clt_counters); ++i) + lu_ref_init(&info->clt_counters[i].ctc_locks_locked); + } return info; } @@ -1004,9 +1008,11 @@ static void cl_key_fini(const struct lu_context *ctx, struct lu_context_key *key, void *data) { struct cl_thread_info *info; + int i; info = data; - lu_ref_fini(&info->clt_locks_locked); + for (i = 0; i < ARRAY_SIZE(info->clt_counters); ++i) + lu_ref_fini(&info->clt_counters[i].ctc_locks_locked); cl0_key_fini(ctx, key, data); } @@ -1014,14 +1020,16 @@ static void cl_key_exit(const struct lu_context *ctx, struct lu_context_key *key, void *data) { struct cl_thread_info *info = data; + int i; - LASSERT(info->clt_nr_locks_locked == 0); - LASSERT(info->clt_nr_held == 0); - LASSERT(info->clt_nr_used == 0); - LASSERT(info->clt_nr_locks_acquired == 0); - - lu_ref_fini(&info->clt_locks_locked); - lu_ref_init(&info->clt_locks_locked); + for (i = 0; i < ARRAY_SIZE(info->clt_counters); ++i) { + LASSERT(info->clt_counters[i].ctc_nr_held == 0); + LASSERT(info->clt_counters[i].ctc_nr_used == 0); + LASSERT(info->clt_counters[i].ctc_nr_locks_acquired == 0); + LASSERT(info->clt_counters[i].ctc_nr_locks_locked == 0); + lu_ref_fini(&info->clt_counters[i].ctc_locks_locked); + lu_ref_init(&info->clt_counters[i].ctc_locks_locked); + } } static struct lu_context_key cl_key = { diff --git a/lustre/obdclass/dt_object.c b/lustre/obdclass/dt_object.c index 3164498..f1c174d 100644 --- a/lustre/obdclass/dt_object.c +++ b/lustre/obdclass/dt_object.c @@ -97,7 +97,8 @@ int dt_txn_hook_start(const struct lu_env *env, result = 0; list_for_each_entry(cb, &dev->dd_txn_callbacks, dtc_linkage) { - if (cb->dtc_txn_start == NULL) + if (cb->dtc_txn_start == NULL || + !(cb->dtc_tag & env->le_ctx.lc_tags)) continue; result = cb->dtc_txn_start(env, th, cb->dtc_cookie); if (result < 0) @@ -115,7 +116,8 @@ int dt_txn_hook_stop(const struct lu_env *env, struct thandle *txn) result = 0; list_for_each_entry(cb, &dev->dd_txn_callbacks, dtc_linkage) { - if (cb->dtc_txn_stop == NULL) + if (cb->dtc_txn_stop == NULL || + !(cb->dtc_tag & env->le_ctx.lc_tags)) continue; result = cb->dtc_txn_stop(env, txn, cb->dtc_cookie); if (result < 0) @@ -133,7 +135,8 @@ int dt_txn_hook_commit(const struct lu_env *env, struct thandle *txn) result = 0; list_for_each_entry(cb, &dev->dd_txn_callbacks, dtc_linkage) { - if (cb->dtc_txn_commit == NULL) + if (cb->dtc_txn_commit == NULL || + !(cb->dtc_tag & env->le_ctx.lc_tags)) continue; result = cb->dtc_txn_commit(env, txn, cb->dtc_cookie); if (result < 0) @@ -400,5 +403,38 @@ void dt_global_fini(void) lu_context_key_degister(&dt_key); } +int dt_record_read(const struct lu_env *env, struct dt_object *dt, + struct lu_buf *buf, loff_t *pos) +{ + int rc; + + LASSERTF(dt != NULL, "dt is NULL when we want to read record\n"); + + rc = dt->do_body_ops->dbo_read(env, dt, buf, pos, BYPASS_CAPA); + + if (rc == buf->lb_len) + rc = 0; + else if (rc >= 0) + rc = -EFAULT; + return rc; +} +EXPORT_SYMBOL(dt_record_read); + +int dt_record_write(const struct lu_env *env, struct dt_object *dt, + const struct lu_buf *buf, loff_t *pos, struct thandle *th) +{ + int rc; + + LASSERTF(dt != NULL, "dt is NULL when we want to write record\n"); + LASSERT(th != NULL); + rc = dt->do_body_ops->dbo_write(env, dt, buf, pos, th, BYPASS_CAPA, 1); + if (rc == buf->lb_len) + rc = 0; + else if (rc >= 0) + rc = -EFAULT; + return rc; +} +EXPORT_SYMBOL(dt_record_write); + const struct dt_index_features dt_directory_features; EXPORT_SYMBOL(dt_directory_features); diff --git a/lustre/obdclass/genops.c b/lustre/obdclass/genops.c index 615b2f9..cb3c85d 100644 --- a/lustre/obdclass/genops.c +++ b/lustre/obdclass/genops.c @@ -723,6 +723,7 @@ static void class_export_destroy(struct obd_export *exp) ptlrpc_put_connection_superhack(exp->exp_connection); LASSERT(list_empty(&exp->exp_outstanding_replies)); + LASSERT(list_empty(&exp->exp_uncommitted_replies)); LASSERT(list_empty(&exp->exp_req_replay_queue)); LASSERT(list_empty(&exp->exp_queued_rpc)); obd_destroy_export(exp); @@ -781,6 +782,8 @@ struct obd_export *class_new_export(struct obd_device *obd, atomic_set(&export->exp_rpc_count, 0); export->exp_obd = obd; CFS_INIT_LIST_HEAD(&export->exp_outstanding_replies); + spin_lock_init(&export->exp_uncommitted_replies_lock); + CFS_INIT_LIST_HEAD(&export->exp_uncommitted_replies); CFS_INIT_LIST_HEAD(&export->exp_req_replay_queue); CFS_INIT_LIST_HEAD(&export->exp_handle.h_link); CFS_INIT_LIST_HEAD(&export->exp_queued_rpc); @@ -837,6 +840,15 @@ void class_unlink_export(struct obd_export *exp) exp->exp_obd->obd_num_exports--; spin_unlock(&exp->exp_obd->obd_dev_lock); + /* Keep these counter valid always */ + spin_lock_bh(&exp->exp_obd->obd_processing_task_lock); + if (exp->exp_delayed) + exp->exp_obd->obd_delayed_clients--; + else if (exp->exp_in_recovery) + exp->exp_obd->obd_recoverable_clients--; + else if (exp->exp_obd->obd_recovering) + exp->exp_obd->obd_max_recoverable_clients--; + spin_unlock_bh(&exp->exp_obd->obd_processing_task_lock); class_export_put(exp); } EXPORT_SYMBOL(class_unlink_export); @@ -1125,9 +1137,10 @@ void class_disconnect_exports(struct obd_device *obd) ENTRY; /* Move all of the exports from obd_exports to a work list, en masse. */ + CFS_INIT_LIST_HEAD(&work_list); spin_lock(&obd->obd_dev_lock); - list_add(&work_list, &obd->obd_exports); - list_del_init(&obd->obd_exports); + list_splice_init(&obd->obd_exports, &work_list); + list_splice_init(&obd->obd_delayed_exports, &work_list); spin_unlock(&obd->obd_dev_lock); if (!list_empty(&work_list)) { @@ -1161,8 +1174,7 @@ int class_disconnect_stale_exports(struct obd_device *obd, if (test_export(exp)) continue; - list_del(&exp->exp_obd_chain); - list_add(&exp->exp_obd_chain, &work_list); + list_move(&exp->exp_obd_chain, &work_list); /* don't count self-export as client */ if (obd_uuid_equals(&exp->exp_client_uuid, &exp->exp_obd->obd_uuid)) @@ -1371,6 +1383,7 @@ static void obd_zombie_export_add(struct obd_export *exp) { * Add import to the obd_zombe thread and notify it. */ static void obd_zombie_import_add(struct obd_import *imp) { + LASSERT(imp->imp_sec == NULL); spin_lock(&obd_zombie_impexp_lock); LASSERT(list_empty(&imp->imp_zombie_chain)); list_add(&imp->imp_zombie_chain, &obd_zombie_imports); diff --git a/lustre/obdclass/llog_obd.c b/lustre/obdclass/llog_obd.c index 2178f9e..41fb346 100644 --- a/lustre/obdclass/llog_obd.c +++ b/lustre/obdclass/llog_obd.c @@ -91,10 +91,10 @@ int __llog_ctxt_put(struct llog_ctxt *ctxt) } olg->olg_ctxts[ctxt->loc_idx] = NULL; spin_unlock(&olg->olg_lock); - + if (ctxt->loc_lcm) lcm_put(ctxt->loc_lcm); - + obd = ctxt->loc_obd; spin_lock(&obd->obd_dev_lock); spin_unlock(&obd->obd_dev_lock); /* sync with llog ctxt user thread */ diff --git a/lustre/obdclass/llog_test.c b/lustre/obdclass/llog_test.c index ce887c8..9f35232 100644 --- a/lustre/obdclass/llog_test.c +++ b/lustre/obdclass/llog_test.c @@ -517,11 +517,13 @@ static int llog_test_6(struct obd_device *obd, char *name) rc = obd_connect(NULL, &exp, mgc_obd, &uuid, NULL /* obd_connect_data */, NULL); - if (rc) { - CERROR("6: failed to connect to MGC: %s\n", mgc_obd->obd_name); - GOTO(ctxt_release, rc); + if (rc != -EALREADY) { + CERROR("6: connect on connected MDC (%s) failed to return" + " -EALREADY", mgc_obd->obd_name); + if (rc == 0) + obd_disconnect(exp); + GOTO(ctxt_release, rc = -EINVAL); } - LASSERTF(exp->exp_obd == mgc_obd, "%p - %p - %p\n", exp, exp->exp_obd, mgc_obd); nctxt = llog_get_context(mgc_obd, LLOG_CONFIG_REPL_CTXT); rc = llog_create(nctxt, &llh, NULL, name); @@ -551,9 +553,6 @@ parse_out: if (rc) { CERROR("6: llog_close failed: rc = %d\n", rc); } - CDEBUG(D_INFO, "obd %p - %p - %p - %p\n", - mgc_obd, exp, exp->exp_obd, exp->exp_obd->obd_type); - rc = obd_disconnect(exp); ctxt_release: llog_ctxt_put(ctxt); RETURN(rc); diff --git a/lustre/obdclass/lprocfs_status.c b/lustre/obdclass/lprocfs_status.c index 239b00d..9ce1cb4 100644 --- a/lustre/obdclass/lprocfs_status.c +++ b/lustre/obdclass/lprocfs_status.c @@ -644,20 +644,66 @@ int lprocfs_rd_conn_uuid(char *page, char **start, off_t off, int count, return rc; } -#define flag2str(flag) \ - if (imp->imp_##flag && max - len > 0) \ - len += snprintf(str + len, max - len, " " #flag); +/** add up per-cpu counters */ +void lprocfs_stats_collect(struct lprocfs_stats *stats, int idx, + struct lprocfs_counter *cnt) +{ + unsigned int num_cpu; + struct lprocfs_counter t; + struct lprocfs_counter *percpu_cntr; + int centry, i; + + memset(cnt, 0, sizeof(*cnt)); + + if (stats == NULL) { + /* set count to 1 to avoid divide-by-zero errs in callers */ + cnt->lc_count = 1; + return; + } + + cnt->lc_min = LC_MIN_INIT; + + if (stats->ls_flags & LPROCFS_STATS_FLAG_NOPERCPU) + num_cpu = 1; + else + num_cpu = num_possible_cpus(); + + for (i = 0; i < num_cpu; i++) { + percpu_cntr = &(stats->ls_percpu[i])->lp_cntr[idx]; + + do { + centry = atomic_read(&percpu_cntr->lc_cntl.la_entry); + t.lc_count = percpu_cntr->lc_count; + t.lc_sum = percpu_cntr->lc_sum; + t.lc_min = percpu_cntr->lc_min; + t.lc_max = percpu_cntr->lc_max; + t.lc_sumsquare = percpu_cntr->lc_sumsquare; + } while (centry != atomic_read(&percpu_cntr->lc_cntl.la_entry) && + centry != atomic_read(&percpu_cntr->lc_cntl.la_exit)); + cnt->lc_count += t.lc_count; + cnt->lc_sum += t.lc_sum; + if (t.lc_min < cnt->lc_min) + cnt->lc_min = t.lc_min; + if (t.lc_max > cnt->lc_max) + cnt->lc_max = t.lc_max; + cnt->lc_sumsquare += t.lc_sumsquare; + } + + cnt->lc_units = stats->ls_percpu[0]->lp_cntr[idx].lc_units; +} /** * Append a space separated list of current set flags to str. */ -static int obd_import_flags2str(struct obd_import *imp, char *str, - int max) +#define flag2str(flag) \ + if (imp->imp_##flag && max - len > 0) \ + len += snprintf(str + len, max - len, "%s" #flag, len ? ", " : ""); +static int obd_import_flags2str(struct obd_import *imp, char *str, int max) { int len = 0; if (imp->imp_obd->obd_no_recov) - len += snprintf(str, max - len, " no_recov"); + len += snprintf(str, max - len, "no_recov"); flag2str(invalid); flag2str(deactive); @@ -669,48 +715,202 @@ static int obd_import_flags2str(struct obd_import *imp, char *str, } #undef flags2str +static const char *obd_connect_names[] = { + "read_only", + "lov_index", + "unused", + "write_grant", + "server_lock", + "version", + "request_portal", + "acl", + "xattr", + "create_on_write", + "truncate_lock", + "initial_transno", + "inode_bit_locks", + "join_file", + "getattr_by_fid", + "no_oh_for_devices", + "local_client", + "remote_client", + "max_byte_per_rpc", + "64bit_qdata", + "mds_capability", + "oss_capability", + "early_lock_cancel", + "size_on_mds", + "adaptive_timeouts", + "lru_resize", + "mds_mds_connection", + "real_conn", + "change_qunit_size", + "alt_checksum_algorithm", + "fid_is_enabled", + "version_recovery", + "pools", + "grant_shrink", + "skip_orphan", + NULL +}; + +static int obd_connect_flags2str(char *page, int count, __u64 flags, char *sep) +{ + __u64 mask = 1; + int i, ret = 0; + + for (i = 0; obd_connect_names[i] != NULL; i++, mask <<= 1) { + if (flags & mask) + ret += snprintf(page + ret, count - ret, "%s%s", + ret ? sep : "", obd_connect_names[i]); + } + if (flags & ~(mask - 1)) + ret += snprintf(page + ret, count - ret, + "%sunknown flags "LPX64, + ret ? sep : "", flags & ~(mask - 1)); + return ret; +} + int lprocfs_rd_import(char *page, char **start, off_t off, int count, int *eof, void *data) { + struct lprocfs_counter ret; struct obd_device *obd = (struct obd_device *)data; struct obd_import *imp; - char *imp_state_name = NULL; - int rc = 0; + int i, j, k, rw = 0; LASSERT(obd != NULL); LPROCFS_CLIMP_CHECK(obd); imp = obd->u.cli.cl_import; - imp_state_name = ptlrpc_import_state_name(imp->imp_state); *eof = 1; - rc = snprintf(page, count, - "import: %s\n" - " target: %s@%s\n" - " state: %s\n" - " inflight: %u\n" - " unregistering: %u\n" - " conn_cnt: %u\n" - " generation: %u\n" - " inval_cnt: %u\n" - " last_replay_transno: "LPU64"\n" - " peer_committed_transno: "LPU64"\n" - " last_trasno_checked: "LPU64"\n" - " flags:", - obd->obd_name, - obd2cli_tgt(obd), imp->imp_connection->c_remote_uuid.uuid, - imp_state_name, - atomic_read(&imp->imp_inflight), - atomic_read(&imp->imp_unregistering), + i = snprintf(page, count, + "import:\n" + " name: %s\n" + " target: %s\n" + " current_connection: %s\n" + " state: %s\n" + " connect_flags: [", + obd->obd_name, + obd2cli_tgt(obd), + imp->imp_connection->c_remote_uuid.uuid, + ptlrpc_import_state_name(imp->imp_state)); + i += obd_connect_flags2str(page + i, count - i, + imp->imp_connect_data.ocd_connect_flags, + ", "); + i += snprintf(page + i, count - i, + "]\n" + " import_flags: ["); + i += obd_import_flags2str(imp, page + i, count - i); + + i += snprintf(page + i, count - i, + "]\n" + " connection:\n" + " connection_attempts: %u\n" + " generation: %u\n" + " in-progress_invalidations: %u\n", imp->imp_conn_cnt, imp->imp_generation, - atomic_read(&imp->imp_inval_count), + atomic_read(&imp->imp_inval_count)); + + lprocfs_stats_collect(obd->obd_svc_stats, PTLRPC_REQWAIT_CNTR, &ret); + do_div(ret.lc_sum, ret.lc_count); + i += snprintf(page + i, count - i, + " rpcs:\n" + " inflight: %u\n" + " unregistering: %u\n" + " timeouts: %u\n" + " avg_waittime: "LPU64" %s\n", + atomic_read(&imp->imp_inflight), + atomic_read(&imp->imp_unregistering), + atomic_read(&imp->imp_timeouts), + ret.lc_sum, ret.lc_units); + + k = 0; + for(j = 0; j < IMP_AT_MAX_PORTALS; j++) { + if (imp->imp_at.iat_portal[j] == 0) + break; + k = max_t(unsigned int, k, + at_get(&imp->imp_at.iat_service_estimate[j])); + } + i += snprintf(page + i, count - i, + " service_estimates:\n" + " services: %u sec\n" + " network: %u sec\n", + k, + at_get(&imp->imp_at.iat_net_latency)); + + i += snprintf(page + i, count - i, + " transactions:\n" + " last_replay: "LPU64"\n" + " peer_committed: "LPU64"\n" + " last_checked: "LPU64"\n", imp->imp_last_replay_transno, imp->imp_peer_committed_transno, imp->imp_last_transno_checked); - rc += obd_import_flags2str(imp, page + rc, count - rc); - rc += snprintf(page+rc, count - rc, "\n"); + + /* avg data rates */ + for (rw = 0; rw <= 1; rw++) { + lprocfs_stats_collect(obd->obd_svc_stats, + PTLRPC_LAST_CNTR + BRW_READ_BYTES + rw, + &ret); + if (ret.lc_sum > 0) { + do_div(ret.lc_sum, ret.lc_count); + i += snprintf(page + i, count - i, + " %s_data_averages:\n" + " bytes_per_rpc: "LPU64"\n", + rw ? "write" : "read", + ret.lc_sum); + } + k = (int)ret.lc_sum; + j = opcode_offset(OST_READ + rw) + EXTRA_MAX_OPCODES; + lprocfs_stats_collect(obd->obd_svc_stats, j, &ret); + if (ret.lc_sum > 0) { + do_div(ret.lc_sum, ret.lc_count); + i += snprintf(page + i, count - i, + " %s_per_rpc: "LPU64"\n", + ret.lc_units, ret.lc_sum); + j = (int)ret.lc_sum; + if (j > 0) + i += snprintf(page + i, count - i, + " MB_per_sec: %u.%.02u\n", + k / j, (100 * k / j) % 100); + } + } + LPROCFS_CLIMP_EXIT(obd); - return rc; + return i; +} + +int lprocfs_rd_state(char *page, char **start, off_t off, int count, + int *eof, void *data) +{ + struct obd_device *obd = (struct obd_device *)data; + struct obd_import *imp; + int i, j, k; + + LASSERT(obd != NULL); + LPROCFS_CLIMP_CHECK(obd); + imp = obd->u.cli.cl_import; + *eof = 1; + + i = snprintf(page, count, "current_state: %s\n", + ptlrpc_import_state_name(imp->imp_state)); + i += snprintf(page + i, count - i, + "state_history:\n"); + k = imp->imp_state_hist_idx; + for (j = 0; j < IMP_STATE_HIST_LEN; j++) { + struct import_state_hist *ish = + &imp->imp_state_hist[(k + j) % IMP_STATE_HIST_LEN]; + if (ish->ish_state == 0) + continue; + i += snprintf(page + i, count - i, " - ["CFS_TIME_T", %s]\n", + ish->ish_time, + ptlrpc_import_state_name(ish->ish_state)); + } + + LPROCFS_CLIMP_EXIT(obd); + return i; } int lprocfs_at_hist_helper(char *page, int count, int rc, @@ -776,64 +976,18 @@ int lprocfs_rd_timeouts(char *page, char **start, off_t off, int count, return rc; } -static const char *obd_connect_names[] = { - "read_only", - "lov_index", - "unused", - "write_grant", - "server_lock", - "version", - "request_portal", - "acl", - "xattr", - "create_on_write", - "truncate_lock", - "initial_transno", - "inode_bit_locks", - "join_file", - "getattr_by_fid", - "no_oh_for_devices", - "local_client", - "remote_client", - "max_byte_per_rpc", - "64bit_qdata", - "mds_capability", - "oss_capability", - "early_lock_cancel", - "size_on_mds", - "adaptive_timeouts", - "lru_resize", - "mds_mds_connection", - "real_conn", - "change_qunit_size", - "alt_checksum_algorithm", - "fid_is_enabled", - "version_recovery", - "pools", - "", /* reserved for simplified interop */ - "skip_orphan", - NULL -}; - int lprocfs_rd_connect_flags(char *page, char **start, off_t off, int count, int *eof, void *data) { struct obd_device *obd = data; - __u64 mask = 1, flags; - int i, ret = 0; + __u64 flags; + int ret = 0; LPROCFS_CLIMP_CHECK(obd); flags = obd->u.cli.cl_import->imp_connect_data.ocd_connect_flags; ret = snprintf(page, count, "flags="LPX64"\n", flags); - for (i = 0; obd_connect_names[i] != NULL; i++, mask <<= 1) { - if (flags & mask) - ret += snprintf(page + ret, count - ret, "%s\n", - obd_connect_names[i]); - } - if (flags & ~(mask - 1)) - ret += snprintf(page + ret, count - ret, - "unknown flags "LPX64"\n", flags & ~(mask - 1)); - + ret += obd_connect_flags2str(page + ret, count - ret, flags, "\n"); + ret += snprintf(page + ret, count - ret, "\n"); LPROCFS_CLIMP_EXIT(obd); return ret; } @@ -1075,10 +1229,9 @@ static void *lprocfs_stats_seq_next(struct seq_file *p, void *v, loff_t *pos) static int lprocfs_stats_seq_show(struct seq_file *p, void *v) { struct lprocfs_stats *stats = p->private; - struct lprocfs_counter *cntr = v; - struct lprocfs_counter t, ret = { .lc_min = LC_MIN_INIT }; - int i, idx, rc = 0; - unsigned int num_cpu; + struct lprocfs_counter *cntr = v; + struct lprocfs_counter ret; + int idx, rc = 0; if (cntr == &(stats->ls_percpu[0])->lp_cntr[0]) { struct timeval now; @@ -1090,39 +1243,14 @@ static int lprocfs_stats_seq_show(struct seq_file *p, void *v) } idx = cntr - &(stats->ls_percpu[0])->lp_cntr[0]; - if (stats->ls_flags & LPROCFS_STATS_FLAG_NOPERCPU) - num_cpu = 1; - else - num_cpu = num_possible_cpus(); - - for (i = 0; i < num_cpu; i++) { - struct lprocfs_counter *percpu_cntr = - &(stats->ls_percpu[i])->lp_cntr[idx]; - int centry; - - do { - centry = atomic_read(&percpu_cntr->lc_cntl.la_entry); - t.lc_count = percpu_cntr->lc_count; - t.lc_sum = percpu_cntr->lc_sum; - t.lc_min = percpu_cntr->lc_min; - t.lc_max = percpu_cntr->lc_max; - t.lc_sumsquare = percpu_cntr->lc_sumsquare; - } while (centry != atomic_read(&percpu_cntr->lc_cntl.la_entry) && - centry != atomic_read(&percpu_cntr->lc_cntl.la_exit)); - ret.lc_count += t.lc_count; - ret.lc_sum += t.lc_sum; - if (t.lc_min < ret.lc_min) - ret.lc_min = t.lc_min; - if (t.lc_max > ret.lc_max) - ret.lc_max = t.lc_max; - ret.lc_sumsquare += t.lc_sumsquare; - } + lprocfs_stats_collect(stats, idx, &ret); if (ret.lc_count == 0) goto out; rc = seq_printf(p, "%-25s "LPD64" samples [%s]", cntr->lc_name, ret.lc_count, cntr->lc_units); + if (rc < 0) goto out; @@ -1694,7 +1822,6 @@ int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid) lprocfs_exp_rd_hash, NULL, new_stat, NULL); if (IS_ERR(entry)) { CWARN("Error adding the hash file\n"); - lprocfs_remove(&new_stat->nid_proc); rc = PTR_ERR(entry); GOTO(destroy_new_ns, rc); } @@ -1709,6 +1836,8 @@ int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid) RETURN(rc); destroy_new_ns: + if (new_stat->nid_proc != NULL) + lprocfs_remove(&new_stat->nid_proc); lustre_hash_del(obd->obd_nid_stats_hash, nid, &new_stat->nid_hash); OBD_FREE_PTR(new_ns_uuid); @@ -2425,6 +2554,7 @@ EXPORT_SYMBOL(lprocfs_rd_num_exports); EXPORT_SYMBOL(lprocfs_rd_numrefs); EXPORT_SYMBOL(lprocfs_at_hist_helper); EXPORT_SYMBOL(lprocfs_rd_import); +EXPORT_SYMBOL(lprocfs_rd_state); EXPORT_SYMBOL(lprocfs_rd_timeouts); EXPORT_SYMBOL(lprocfs_rd_blksize); EXPORT_SYMBOL(lprocfs_rd_kbytestotal); @@ -2438,4 +2568,5 @@ EXPORT_SYMBOL(lprocfs_write_frac_helper); EXPORT_SYMBOL(lprocfs_read_frac_helper); EXPORT_SYMBOL(lprocfs_write_u64_helper); EXPORT_SYMBOL(lprocfs_write_frac_u64_helper); +EXPORT_SYMBOL(lprocfs_stats_collect); #endif /* LPROCFS*/ diff --git a/lustre/obdclass/lu_object.c b/lustre/obdclass/lu_object.c index 4fd6f0d..8c55d6b 100644 --- a/lustre/obdclass/lu_object.c +++ b/lustre/obdclass/lu_object.c @@ -1092,11 +1092,11 @@ void lu_context_key_degister(struct lu_context_key *key) lu_context_key_quiesce(key); ++key_set_version; + spin_lock(&lu_keys_guard); key_fini(&lu_shrink_env.le_ctx, key->lct_index); if (atomic_read(&key->lct_used) > 1) CERROR("key has instances.\n"); - spin_lock(&lu_keys_guard); lu_keys[key->lct_index] = NULL; spin_unlock(&lu_keys_guard); } @@ -1240,6 +1240,7 @@ static void keys_fini(struct lu_context *ctx) { int i; + spin_lock(&lu_keys_guard); if (ctx->lc_value != NULL) { for (i = 0; i < ARRAY_SIZE(lu_keys); ++i) key_fini(ctx, i); @@ -1247,6 +1248,7 @@ static void keys_fini(struct lu_context *ctx) ARRAY_SIZE(lu_keys) * sizeof ctx->lc_value[0]); ctx->lc_value = NULL; } + spin_unlock(&lu_keys_guard); } static int keys_fill(struct lu_context *ctx) @@ -1427,8 +1429,11 @@ static int lu_cache_shrink(int nr, unsigned int gfp_mask) int remain = nr; CFS_LIST_HEAD(splice); - if (nr != 0 && !(gfp_mask & __GFP_FS)) - return -1; + if (nr != 0) { + if (!(gfp_mask & __GFP_FS)) + return -1; + CDEBUG(D_INODE, "Shrink %d objects\n", nr); + } down(&lu_sites_guard); list_for_each_entry_safe(s, tmp, &lu_sites, ls_linkage) { @@ -1443,11 +1448,15 @@ static int lu_cache_shrink(int nr, unsigned int gfp_mask) read_lock(&s->ls_guard); cached += s->ls_total - s->ls_busy; read_unlock(&s->ls_guard); - if (remain <= 0) + if (nr && remain <= 0) break; } list_splice(&splice, lu_sites.prev); up(&lu_sites_guard); + + cached = (cached / 100) * sysctl_vfs_cache_pressure; + if (nr == 0) + CDEBUG(D_INODE, "%d objects cached\n", cached); return cached; } diff --git a/lustre/obdclass/md_local_object.c b/lustre/obdclass/md_local_object.c index 7446cd8..1372e2c 100644 --- a/lustre/obdclass/md_local_object.c +++ b/lustre/obdclass/md_local_object.c @@ -292,7 +292,7 @@ static struct md_object *llo_create_obj(const struct lu_env *env, spec->sp_ck_split = 0; if (feat == &dt_directory_features) - la->la_mode = S_IFDIR; + la->la_mode = S_IFDIR | S_IXUGO; else la->la_mode = S_IFREG; diff --git a/lustre/obdclass/obd_config.c b/lustre/obdclass/obd_config.c index 74b94e4..f5d7316 100644 --- a/lustre/obdclass/obd_config.c +++ b/lustre/obdclass/obd_config.c @@ -247,14 +247,15 @@ int class_attach(struct lustre_cfg *lcfg) LASSERTF(obd->obd_magic == OBD_DEVICE_MAGIC, "obd %p obd_magic %08X != %08X\n", obd, obd->obd_magic, OBD_DEVICE_MAGIC); - LASSERTF(strncmp(obd->obd_name, name, strlen(name)) == 0, "%p obd_name %s != %s\n", - obd, obd->obd_name, name); + LASSERTF(strncmp(obd->obd_name, name, strlen(name)) == 0, + "%p obd_name %s != %s\n", obd, obd->obd_name, name); rwlock_init(&obd->obd_pool_lock); obd->obd_pool_limit = 0; obd->obd_pool_slv = 0; CFS_INIT_LIST_HEAD(&obd->obd_exports); + CFS_INIT_LIST_HEAD(&obd->obd_delayed_exports); CFS_INIT_LIST_HEAD(&obd->obd_exports_timed); CFS_INIT_LIST_HEAD(&obd->obd_nid_stats); spin_lock_init(&obd->obd_nid_lock); @@ -277,9 +278,6 @@ int class_attach(struct lustre_cfg *lcfg) llog_group_init(&obd->obd_olg, FILTER_GROUP_LLOG); - spin_lock_init(&obd->obd_uncommitted_replies_lock); - CFS_INIT_LIST_HEAD(&obd->obd_uncommitted_replies); - len = strlen(uuid); if (len >= sizeof(obd->obd_uuid)) { CERROR("uuid must be < %d bytes long\n", @@ -499,7 +497,7 @@ int class_cleanup(struct obd_device *obd, struct lustre_cfg *lcfg) /* Leave this on forever */ obd->obd_stopping = 1; spin_unlock(&obd->obd_dev_lock); - + if (lcfg->lcfg_bufcount >= 2 && LUSTRE_CFG_BUFLEN(lcfg, 1) > 0) { for (flag = lustre_cfg_string(lcfg, 1); *flag != 0; flag++) switch (*flag) { @@ -859,7 +857,7 @@ int class_process_config(struct lustre_cfg *lcfg) ldlm_timeout = max(lcfg->lcfg_num, 1U); if (ldlm_timeout >= obd_timeout) ldlm_timeout = max(obd_timeout / 3, 1U); - + GOTO(out, err = 0); } case LCFG_SET_UPCALL: { diff --git a/lustre/obdclass/obd_mount.c b/lustre/obdclass/obd_mount.c index 4afa2bf..d8231f6 100644 --- a/lustre/obdclass/obd_mount.c +++ b/lustre/obdclass/obd_mount.c @@ -318,7 +318,7 @@ static int ldd_write(struct dt_device *dt, struct lustre_disk_data *ldd) rc = dt->dd_ops->dt_trans_start(&env, dt, th); LASSERT(rc == 0); - rc = dt_record_write(&env, file, &buf, &pos, th, BYPASS_CAPA, 1); + rc = dt_record_write(&env, file, &buf, &pos, th); dt->dd_ops->dt_trans_stop(&env, th); diff --git a/lustre/obdfilter/filter.c b/lustre/obdfilter/filter.c index 76e558f..51344ba 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -87,12 +87,38 @@ cfs_mem_cache_t *ll_fmd_cachep; static void filter_commit_cb(struct obd_device *obd, __u64 transno, void *cb_data, int error) { - obd_transno_commit_cb(obd, transno, error); + struct obd_export *exp = cb_data; + obd_transno_commit_cb(obd, transno, exp, error); +} + +int filter_version_get_check(struct obd_export *exp, + struct obd_trans_info *oti, struct inode *inode) +{ + __u64 curr_version; + + if (inode == NULL || oti == NULL) + RETURN(0); + + curr_version = fsfilt_get_version(exp->exp_obd, inode); + if ((__s64)curr_version == -EOPNOTSUPP) + RETURN(0); + /* VBR: version is checked always because costs nothing */ + if (oti->oti_pre_version != 0 && + oti->oti_pre_version != curr_version) { + CDEBUG(D_INODE, "Version mismatch "LPX64" != "LPX64"\n", + oti->oti_pre_version, curr_version); + spin_lock(&exp->exp_lock); + exp->exp_vbr_failed = 1; + spin_unlock(&exp->exp_lock); + RETURN (-EOVERFLOW); + } + oti->oti_pre_version = curr_version; + RETURN(0); } /* Assumes caller has already pushed us into the kernel context. */ -int filter_finish_transno(struct obd_export *exp, struct obd_trans_info *oti, - int rc, int force_sync) +int filter_finish_transno(struct obd_export *exp, struct inode *inode, + struct obd_trans_info *oti, int rc, int force_sync) { struct filter_obd *filter = &exp->exp_obd->u.filter; struct filter_export_data *fed = &exp->exp_filter_data; @@ -109,24 +135,28 @@ int filter_finish_transno(struct obd_export *exp, struct obd_trans_info *oti, RETURN(rc); /* we don't allocate new transnos for replayed requests */ + spin_lock(&filter->fo_translock); if (oti->oti_transno == 0) { - spin_lock(&filter->fo_translock); last_rcvd = le64_to_cpu(filter->fo_fsd->lsd_last_transno) + 1; filter->fo_fsd->lsd_last_transno = cpu_to_le64(last_rcvd); - spin_unlock(&filter->fo_translock); - oti->oti_transno = last_rcvd; } else { - spin_lock(&filter->fo_translock); last_rcvd = oti->oti_transno; if (last_rcvd > le64_to_cpu(filter->fo_fsd->lsd_last_transno)) filter->fo_fsd->lsd_last_transno = cpu_to_le64(last_rcvd); + } + oti->oti_transno = last_rcvd; + if (last_rcvd <= le64_to_cpu(lcd->lcd_last_transno)) { spin_unlock(&filter->fo_translock); + LBUG(); } lcd->lcd_last_transno = cpu_to_le64(last_rcvd); + lcd->lcd_pre_versions[0] = cpu_to_le64(oti->oti_pre_version); + lcd->lcd_last_xid = cpu_to_le64(oti->oti_xid); + spin_unlock(&filter->fo_translock); - /* could get xid from oti, if it's ever needed */ - lcd->lcd_last_xid = 0; + if (inode) + fsfilt_set_version(exp->exp_obd, inode, last_rcvd); off = fed->fed_lr_off; if (off <= 0) { @@ -139,13 +169,13 @@ int filter_finish_transno(struct obd_export *exp, struct obd_trans_info *oti, last_rcvd, oti->oti_handle, filter_commit_cb, - NULL); + exp); err = fsfilt_write_record(exp->exp_obd, filter->fo_rcvd_filp, lcd, sizeof(*lcd), &off, force_sync | exp->exp_need_sync); if (force_sync) - filter_commit_cb(exp->exp_obd, last_rcvd, NULL, err); + filter_commit_cb(exp->exp_obd, last_rcvd, exp, err); } if (err) { log_pri = D_ERROR; @@ -328,6 +358,9 @@ static int filter_client_add(struct obd_device *obd, struct obd_export *exp, rc = PTR_ERR(handle); CERROR("unable to start transaction: rc %d\n", rc); } else { + fed->fed_lcd->lcd_last_epoch = + filter->fo_fsd->lsd_start_epoch; + exp->exp_last_request_time = cfs_time_current_sec(); rc = fsfilt_add_journal_cb(obd, 0, handle, target_client_add_cb, exp); if (rc == 0) { @@ -618,7 +651,7 @@ static int filter_init_export(struct obd_export *exp) static int filter_free_server_data(struct filter_obd *filter) { - OBD_FREE(filter->fo_fsd, sizeof(*filter->fo_fsd)); + OBD_FREE_PTR(filter->fo_fsd); filter->fo_fsd = NULL; OBD_FREE(filter->fo_last_rcvd_slots, LR_MAX_CLIENTS / 8); filter->fo_last_rcvd_slots = NULL; @@ -639,7 +672,6 @@ int filter_update_server_data(struct obd_device *obd, struct file *filp, CDEBUG(D_INODE, "server last_mount: "LPU64"\n", le64_to_cpu(fsd->lsd_mount_count)); - fsd->lsd_compat14 = fsd->lsd_last_transno; rc = fsfilt_write_record(obd, filp, fsd, sizeof(*fsd), &off, force_sync); if (rc) CERROR("error writing lr_server_data: rc = %d\n", rc); @@ -683,6 +715,7 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp) struct inode *inode = filp->f_dentry->d_inode; unsigned long last_rcvd_size = i_size_read(inode); __u64 mount_count; + __u32 start_epoch; int cl_idx; loff_t off = 0; int rc; @@ -754,7 +787,11 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp) GOTO(err_fsd, rc = -EINVAL); } - CDEBUG(D_INODE, "%s: server last_transno : "LPU64"\n", + start_epoch = le32_to_cpu(fsd->lsd_start_epoch); + + CDEBUG(D_INODE, "%s: server start_epoch : %#x\n", + obd->obd_name, start_epoch); + CDEBUG(D_INODE, "%s: server last_transno : "LPX64"\n", obd->obd_name, le64_to_cpu(fsd->lsd_last_transno)); CDEBUG(D_INODE, "%s: server mount_count: "LPU64"\n", obd->obd_name, mount_count + 1); @@ -834,12 +871,16 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp) /* can't fail for existing client */ LASSERTF(rc == 0, "rc = %d\n", rc); - lcd = NULL; + /* VBR: set export last committed */ + exp->exp_last_committed = last_rcvd; spin_lock(&exp->exp_lock); exp->exp_connecting = 0; exp->exp_in_recovery = 0; spin_unlock(&exp->exp_lock); + spin_lock_bh(&obd->obd_processing_task_lock); obd->obd_max_recoverable_clients++; + spin_unlock_bh(&obd->obd_processing_task_lock); + lcd = NULL; class_export_put(exp); } @@ -856,7 +897,7 @@ static int filter_init_server_data(struct obd_device *obd, struct file * filp) obd->obd_last_committed = le64_to_cpu(fsd->lsd_last_transno); - target_recovery_init(obd, ost_handle); + target_recovery_init(&filter->fo_lut, ost_handle); out: filter->fo_mount_count = mount_count + 1; @@ -1308,6 +1349,9 @@ static int filter_prep(struct obd_device *obd) GOTO(err_filp, rc = -EOPNOTSUPP); } + /** lu_target has very limited use in filter now */ + lut_init(NULL, &filter->fo_lut, obd, NULL); + rc = filter_init_server_data(obd, file); if (rc) { CERROR("cannot read %s: rc = %d\n", LAST_RCVD, rc); @@ -2069,10 +2113,11 @@ int filter_common_setup(struct obd_device *obd, struct lustre_cfg* lcfg, spin_lock_init(&filter->fo_llog_list_lock); filter->fo_fl_oss_capa = 1; + CFS_INIT_LIST_HEAD(&filter->fo_capa_keys); filter->fo_capa_hash = init_capa_hash(); if (filter->fo_capa_hash == NULL) - GOTO(err_ops, rc = -ENOMEM); + GOTO(err_post, rc = -ENOMEM); sprintf(ns_name, "filter-%s", obd->obd_uuid.uuid); obd->obd_namespace = ldlm_namespace_new(obd, ns_name, LDLM_NAMESPACE_SERVER, @@ -2584,6 +2629,8 @@ static int filter_precleanup(struct obd_device *obd, case OBD_CLEANUP_EARLY: break; case OBD_CLEANUP_EXPORTS: + /* Stop recovery before namespace cleanup. */ + target_stop_recovery_thread(obd); target_cleanup_recovery(obd); rc = filter_llog_preclean(obd); break; @@ -2615,10 +2662,6 @@ static int filter_cleanup(struct obd_device *obd) lprocfs_obd_cleanup(obd); lquota_cleanup(filter_quota_interface_ref, obd); - /* Stop recovery before namespace cleanup. */ - target_stop_recovery_thread(obd); - target_cleanup_recovery(obd); - ldlm_namespace_free(obd->obd_namespace, NULL, obd->obd_force); obd->obd_namespace = NULL; @@ -3106,7 +3149,6 @@ static void filter_revimp_update(struct obd_export *exp) static int filter_ping(struct obd_export *exp) { filter_fmd_expire(exp); - return 0; } @@ -3246,6 +3288,11 @@ int filter_setattr_internal(struct obd_export *exp, struct dentry *dentry, old_size = i_size_read(inode); } + /* VBR: version recovery check */ + rc = filter_version_get_check(exp, oti, inode); + if (rc) + GOTO(out_unlock, rc); + /* If the inode still has SUID+SGID bits set (see filter_precreate()) * then we will accept the UID+GID sent by the client during write for * initializing the ownership of this inode. We only allow this to @@ -3308,7 +3355,7 @@ int filter_setattr_internal(struct obd_export *exp, struct dentry *dentry, * sure we have one left for the last_rcvd update. */ err = fsfilt_extend(exp->exp_obd, inode, 1, handle); - rc = filter_finish_transno(exp, oti, rc, sync); + rc = filter_finish_transno(exp, inode, oti, rc, sync); if (sync) { filter_cancel_cookies_cb(exp->exp_obd, 0, fcc, rc); fcc = NULL; @@ -4047,6 +4094,12 @@ int filter_destroy(struct obd_export *exp, struct obdo *oa, * (see BUG 4180) -bzzz */ LOCK_INODE_MUTEX(dchild->d_inode); + + /* VBR: version recovery check */ + rc = filter_version_get_check(exp, oti, dchild->d_inode); + if (rc) + GOTO(cleanup, rc); + handle = fsfilt_start_log(obd, dchild->d_inode, FSFILT_OP_SETATTR, NULL, 1); if (IS_ERR(handle)) { @@ -4103,7 +4156,7 @@ cleanup: * on commit. then we call callback directly to free * the fcc. */ - rc = filter_finish_transno(exp, oti, rc, sync); + rc = filter_finish_transno(exp, NULL, oti, rc, sync); if (sync) { filter_cancel_cookies_cb(obd, 0, fcc, rc); fcc = NULL; diff --git a/lustre/obdfilter/filter_internal.h b/lustre/obdfilter/filter_internal.h index 9cb6de03..dbe4fae 100644 --- a/lustre/obdfilter/filter_internal.h +++ b/lustre/obdfilter/filter_internal.h @@ -40,7 +40,6 @@ #ifdef __KERNEL__ # include #endif -#include #include #include #include @@ -127,7 +126,7 @@ enum { extern int *obdfilter_created_scratchpad; extern void target_recovery_fini(struct obd_device *obd); -extern void target_recovery_init(struct obd_device *obd, +extern void target_recovery_init(struct lu_target *lut, svc_handler_t handler); /* filter.c */ @@ -138,8 +137,8 @@ struct dentry *__filter_oa2dentry(struct obd_device *obd, struct obdo *oa, const char *what, int quiet); #define filter_oa2dentry(obd, oa) __filter_oa2dentry(obd, oa, __FUNCTION__, 0) -int filter_finish_transno(struct obd_export *, struct obd_trans_info *, int rc, - int force_sync); +int filter_finish_transno(struct obd_export *, struct inode *, + struct obd_trans_info *, int rc, int force_sync); __u64 filter_next_id(struct filter_obd *, struct obdo *); __u64 filter_last_id(struct filter_obd *, obd_gr group); int filter_update_fidea(struct obd_export *exp, struct inode *inode, diff --git a/lustre/obdfilter/filter_io_26.c b/lustre/obdfilter/filter_io_26.c index 95835a3..3bd68f6 100644 --- a/lustre/obdfilter/filter_io_26.c +++ b/lustre/obdfilter/filter_io_26.c @@ -500,7 +500,7 @@ int filter_direct_io(int rw, struct dentry *dchild, struct filter_iobuf *iobuf, UNLOCK_INODE_MUTEX(inode); - rc2 = filter_finish_transno(exp, oti, 0, 0); + rc2 = filter_finish_transno(exp, inode, oti, 0, 0); if (rc2 != 0) { CERROR("can't close transaction: %d\n", rc2); if (rc == 0) diff --git a/lustre/osc/lproc_osc.c b/lustre/osc/lproc_osc.c index d17dbf8..30c18f0 100644 --- a/lustre/osc/lproc_osc.c +++ b/lustre/osc/lproc_osc.c @@ -552,7 +552,8 @@ static struct lprocfs_vars lprocfs_osc_obd_vars[] = { osc_wr_contention_seconds, 0 }, { "lockless_truncate", osc_rd_lockless_truncate, osc_wr_lockless_truncate, 0 }, - { "import", lprocfs_rd_import, 0, 0 }, + { "import", lprocfs_rd_import, 0, 0 }, + { "state", lprocfs_rd_state, 0, 0 }, { 0 } }; diff --git a/lustre/osc/osc_lock.c b/lustre/osc/osc_lock.c index ef82a95..a462130 100644 --- a/lustre/osc/osc_lock.c +++ b/lustre/osc/osc_lock.c @@ -210,8 +210,7 @@ static void osc_lock_fini(const struct lu_env *env, */ if (ols->ols_hold) osc_lock_unuse(env, slice); - if (ols->ols_lock != NULL) - osc_lock_detach(env, ols); + LASSERT(ols->ols_lock == NULL); OBD_SLAB_FREE_PTR(ols, osc_lock_kmem); } @@ -786,6 +785,7 @@ static int osc_ldlm_completion_ast(struct ldlm_lock *dlmlock, ; else if (dlmlock->l_granted_mode != LCK_MINMODE) osc_lock_granted(env, olck, dlmlock, dlmrc); + unlock_res_and_lock(dlmlock); if (dlmrc != 0) cl_lock_error(env, lock, dlmrc); unlock_res_and_lock(dlmlock); @@ -944,6 +944,20 @@ static void osc_lock_build_einfo(const struct lu_env *env, einfo->ei_cbdata = lock; /* value to be put into ->l_ast_data */ } +static int osc_lock_delete0(struct cl_lock *conflict) +{ + struct cl_env_nest nest; + struct lu_env *env; + int rc = 0; + + env = cl_env_nested_get(&nest); + if (!IS_ERR(env)) { + cl_lock_delete(env, conflict); + cl_env_nested_put(&nest, env); + } else + rc = PTR_ERR(env); + return rc; +} /** * Cancels \a conflict lock and waits until it reached CLS_FREEING state. This * is called as a part of enqueuing to cancel conflicting locks early. @@ -972,7 +986,9 @@ static int osc_lock_cancel_wait(const struct lu_env *env, struct cl_lock *lock, rc = 0; if (conflict->cll_state != CLS_FREEING) { cl_lock_cancel(env, conflict); - cl_lock_delete(env, conflict); + rc = osc_lock_delete0(conflict); + if (rc) + return rc; if (conflict->cll_flags & (CLF_CANCELPEND|CLF_DOOMED)) { rc = -EWOULDBLOCK; if (cl_lock_nr_mutexed(env) > 2) @@ -1394,19 +1410,31 @@ static void osc_lock_cancel(const struct lu_env *env, struct cl_lock *lock = slice->cls_lock; struct osc_lock *olck = cl2osc_lock(slice); struct ldlm_lock *dlmlock = olck->ols_lock; - int result; + int result = 0; int discard; LASSERT(cl_lock_is_mutexed(lock)); LINVRNT(osc_lock_invariant(olck)); if (dlmlock != NULL) { + int do_cancel; + discard = dlmlock->l_flags & LDLM_FL_DISCARD_DATA; result = osc_lock_flush(olck, discard); if (olck->ols_hold) osc_lock_unuse(env, slice); - LASSERT(dlmlock->l_readers == 0 && dlmlock->l_writers == 0); - result = ldlm_cli_cancel(&olck->ols_handle); + + lock_res_and_lock(dlmlock); + /* Now that we're the only user of dlm read/write reference, + * mostly the ->l_readers + ->l_writers should be zero. + * However, there is a corner case. + * See bug 18829 for details.*/ + do_cancel = (dlmlock->l_readers == 0 && + dlmlock->l_writers == 0); + dlmlock->l_flags |= LDLM_FL_CBPENDING; + unlock_res_and_lock(dlmlock); + if (do_cancel) + result = ldlm_cli_cancel(&olck->ols_handle); if (result < 0) CL_LOCK_DEBUG(D_ERROR, env, lock, "lock %p cancel failure with error(%d)\n", diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c index 6d2b1ce..bb6e558 100644 --- a/lustre/osc/osc_request.c +++ b/lustre/osc/osc_request.c @@ -1031,9 +1031,8 @@ static int osc_add_shrink_grant(struct client_obd *client) static int osc_del_shrink_grant(struct client_obd *client) { - CDEBUG(D_CACHE, "del grant client %s \n", - client->cl_import->imp_obd->obd_name); - return ptlrpc_del_timeout_client(&client->cl_grant_shrink_list); + return ptlrpc_del_timeout_client(&client->cl_grant_shrink_list, + TIMEOUT_GRANT); } static void osc_init_grant(struct client_obd *cli, struct obd_connect_data *ocd) @@ -3066,6 +3065,9 @@ static int osc_enqueue_interpret(const struct lu_env *env, /* Complete osc stuff. */ rc = osc_enqueue_fini(req, aa->oa_lvb, aa->oa_upcall, aa->oa_cookie, aa->oa_flags, rc); + + OBD_FAIL_TIMEOUT(OBD_FAIL_OSC_CP_CANCEL_RACE, 10); + /* Release the lock for async request. */ if (lustre_handle_is_used(&handle) && rc == ELDLM_OK) /* @@ -4004,6 +4006,25 @@ static int osc_disconnect(struct obd_export *exp) osc_del_shrink_grant(&obd->u.cli); rc = client_disconnect_export(exp); + /** + * Initially we put del_shrink_grant before disconnect_export, but it + * causes the following problem if setup (connect) and cleanup + * (disconnect) are tangled together. + * connect p1 disconnect p2 + * ptlrpc_connect_import + * ............... class_manual_cleanup + * osc_disconnect + * del_shrink_grant + * ptlrpc_connect_interrupt + * init_grant_shrink + * add this client to shrink list + * cleanup_osc + * Bang! pinger trigger the shrink. + * So the osc should be disconnected from the shrink list, after we + * are sure the import has been destroyed. BUG18662 + */ + if (obd->u.cli.cl_import == NULL) + osc_del_shrink_grant(&obd->u.cli); return rc; } diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c index e4870eb..42d5401 100644 --- a/lustre/osd/osd_handler.c +++ b/lustre/osd/osd_handler.c @@ -134,6 +134,28 @@ static int osd_index_ea_lookup(const struct lu_env *env, struct dt_object *dt, struct dt_rec *rec, const struct dt_key *key, struct lustre_capa *capa); +static int osd_index_iam_insert(const struct lu_env *env, + struct dt_object *dt, + const struct dt_rec *rec, + const struct dt_key *key, + struct thandle *handle, + struct lustre_capa *capa, + int ingore_quota); +static int osd_index_ea_insert (const struct lu_env *env, + struct dt_object *dt, + const struct dt_rec *rec, + const struct dt_key *key, + struct thandle *handle, + struct lustre_capa *capa, + int ingore_quota); +static int osd_index_iam_delete(const struct lu_env *env, + struct dt_object *dt, const struct dt_key *key, + struct thandle *handle, + struct lustre_capa *capa); +static int osd_index_ea_delete (const struct lu_env *env, + struct dt_object *dt, const struct dt_key *key, + struct thandle *handle, + struct lustre_capa *capa); static int osd_iam_index_probe (const struct lu_env *env, struct osd_object *o, @@ -347,6 +369,7 @@ static struct lu_object *osd_object_alloc(const struct lu_env *env, l->lo_ops = &osd_lu_obj_ops; init_rwsem(&mo->oo_sem); + init_rwsem(&mo->oo_ext_idx_sem); spin_lock_init(&mo->oo_guard); return l; } else @@ -897,7 +920,7 @@ static void osd_init_quota_ctxt(const struct lu_env *env, struct dt_device *d, struct dt_quota_ctxt *ctxt, void *data) { struct obd_device *obd = (void *)ctxt; - struct vfsmount *mnt = osd_dt_dev(d)->od_mnt; + struct vfsmount *mnt = (struct vfsmount *)data; ENTRY; obd->u.obt.obt_sb = mnt->mnt_root->d_inode->i_sb; @@ -1258,7 +1281,7 @@ static int osd_attr_set(const struct lu_env *env, LASSERT(handle != NULL); LASSERT(dt_object_exists(dt)); LASSERT(osd_invariant(obj)); - + if (osd_object_auth(env, dt, capa, CAPA_OPC_META_WRITE)) return -EACCES; @@ -1370,12 +1393,21 @@ static int osd_create_pre(struct osd_thread_info *info, struct osd_object *obj, static int osd_create_post(struct osd_thread_info *info, struct osd_object *obj, struct lu_attr *attr, struct thandle *th) { - LASSERT(obj->oo_inode != NULL); - osd_object_init0(obj); return 0; } +extern struct inode *ldiskfs_create_inode(handle_t *handle, + struct inode * dir, int mode); +extern int ldiskfs_add_entry(handle_t *handle, struct dentry *dentry, + struct inode *inode); +extern int ldiskfs_delete_entry(handle_t *handle, + struct inode * dir, + struct ldiskfs_dir_entry_2 * de_del, + struct buffer_head * bh); +extern struct buffer_head * ldiskfs_find_entry(struct dentry *dentry, + struct ldiskfs_dir_entry_2 + ** res_dir); extern int ldiskfs_add_dot_dotdot(handle_t *handle, struct inode *dir, struct inode *inode); @@ -1468,6 +1500,11 @@ static int osd_mkfile(struct osd_thread_info *info, struct osd_object *obj, } +extern int iam_lvar_create(struct inode *obj, int keysize, int ptrsize, + int recsize, handle_t *handle); + +extern int iam_lfix_create(struct inode *obj, int keysize, int ptrsize, + int recsize, handle_t *handle); enum { @@ -2108,7 +2145,7 @@ static int osd_xattr_del(const struct lu_env *env, LASSERT(inode->i_op != NULL && inode->i_op->removexattr != NULL); LASSERT(osd_write_locked(env, obj)); LASSERT(handle != NULL); - + if (osd_object_auth(env, dt, capa, CAPA_OPC_META_WRITE)) return -EACCES; @@ -2232,6 +2269,35 @@ static int osd_object_sync(const struct lu_env *env, struct dt_object *dt) RETURN(rc); } +/* + * Get the 64-bit version for an inode. + */ +static dt_obj_version_t osd_object_version_get(const struct lu_env *env, + struct dt_object *dt) +{ + struct inode *inode = osd_dt_obj(dt)->oo_inode; + + CDEBUG(D_INFO, "Get version "LPX64" for inode %lu\n", + LDISKFS_I(inode)->i_fs_version, inode->i_ino); + return LDISKFS_I(inode)->i_fs_version; +} + +/* + * Set the 64-bit version and return the old version. + */ +static void osd_object_version_set(const struct lu_env *env, struct dt_object *dt, + dt_obj_version_t new_version) +{ + struct inode *inode = osd_dt_obj(dt)->oo_inode; + + CDEBUG(D_INFO, "Set version "LPX64" (old "LPX64") for inode %lu\n", + new_version, LDISKFS_I(inode)->i_fs_version, inode->i_ino); + LDISKFS_I(inode)->i_fs_version = new_version; + /** Version is set after all inode operations are finished, + * so we should mark it dirty here */ + inode->i_sb->s_op->dirty_inode(inode); +} + static int osd_data_get(const struct lu_env *env, struct dt_object *dt, void **data) { @@ -2266,6 +2332,8 @@ static const struct dt_object_operations osd_obj_ops = { .do_xattr_list = osd_xattr_list, .do_capa_get = osd_capa_get, .do_object_sync = osd_object_sync, + .do_version_get = osd_object_version_get, + .do_version_set = osd_object_version_set, .do_data_get = osd_data_get, }; @@ -2297,6 +2365,8 @@ static const struct dt_object_operations osd_obj_ea_ops = { .do_xattr_list = osd_xattr_list, .do_capa_get = osd_capa_get, .do_object_sync = osd_object_sync, + .do_version_get = osd_object_version_get, + .do_version_set = osd_object_version_set, .do_data_get = osd_data_get, }; @@ -2399,7 +2469,6 @@ static int osd_index_try(const struct lu_env *env, struct dt_object *dt, OBD_ALLOC_PTR(dir); if (dir != NULL) { - sema_init(&dir->od_sem, 1); spin_lock(&obj->oo_guard); if (obj->oo_dir == NULL) @@ -2414,7 +2483,7 @@ static int osd_index_try(const struct lu_env *env, struct dt_object *dt, * Now, that we have container data, serialize its * initialization. */ - down(&obj->oo_dir->od_sem); + down_write(&obj->oo_ext_idx_sem); /* * recheck under lock. */ @@ -2422,7 +2491,7 @@ static int osd_index_try(const struct lu_env *env, struct dt_object *dt, result = osd_iam_container_init(env, obj, dir); else result = 0; - up(&obj->oo_dir->od_sem); + up_write(&obj->oo_ext_idx_sem); } else result = -ENOMEM; } else @@ -2564,6 +2633,8 @@ static int osd_index_ea_delete(const struct lu_env *env, struct dt_object *dt, dentry = osd_child_dentry_get(env, obj, (char *)key, strlen((char *)key)); + + down_write(&obj->oo_ext_idx_sem); bh = ldiskfs_find_entry(dentry, &de); if (bh) { struct osd_thread_info *oti = osd_oti_get(env); @@ -2584,6 +2655,7 @@ static int osd_index_ea_delete(const struct lu_env *env, struct dt_object *dt, } else rc = -ENOENT; + up_write(&obj->oo_ext_idx_sem); LASSERT(osd_invariant(obj)); RETURN(rc); } @@ -2843,6 +2915,8 @@ static int osd_ea_lookup_rec(const struct lu_env *env, struct osd_object *obj, dentry = osd_child_dentry_get(env, obj, (char *)key, strlen((char *)key)); + + down_read(&obj->oo_ext_idx_sem); bh = ldiskfs_find_entry(dentry, &de); if (bh) { ino = le32_to_cpu(de->inode); @@ -2857,10 +2931,11 @@ static int osd_ea_lookup_rec(const struct lu_env *env, struct osd_object *obj, rc = osd_ea_fid_get(env, dentry, rec); iput(inode); } else - rc = -ENOENT; + rc = PTR_ERR(inode); } else rc = -ENOENT; + up_read(&obj->oo_ext_idx_sem); RETURN (rc); } @@ -2995,8 +3070,9 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt, else current->cap_effective &= ~CFS_CAP_SYS_RESOURCE_MASK; #endif + down_write(&obj->oo_ext_idx_sem); rc = osd_ea_add_rec(env, obj, child, name, th); - + up_write(&obj->oo_ext_idx_sem); #ifdef HAVE_QUOTA_SUPPORT current->cap_effective = save; #endif @@ -3217,16 +3293,18 @@ static struct dt_it *osd_it_ea_init(const struct lu_env *env, obj_dentry->d_sb = osd_sb(osd_obj2dev(obj)); obj_dentry->d_name.hash = 0; - it->oie_namelen = 0; + it->oie_rd_dirent = 0; + it->oie_it_dirent = 0; it->oie_curr_pos = 0; it->oie_next_pos = 0; + it->oie_dirent = NULL; + it->oie_buf = info->oti_it_ea_buf; it->oie_obj = obj; it->oie_file.f_dentry = obj_dentry; it->oie_file.f_mapping = obj->oo_inode->i_mapping; it->oie_file.f_op = obj->oo_inode->i_fop; it->oie_file.private_data = NULL; lu_object_get(lo); - RETURN((struct dt_it*) it); } @@ -3264,9 +3342,11 @@ static int osd_it_ea_get(const struct lu_env *env, ENTRY; LASSERT(((const char *)key)[0] == '\0'); - it->oie_namelen = 0; it->oie_curr_pos = 0; it->oie_next_pos = 0; + it->oie_rd_dirent = 0; + it->oie_it_dirent = 0; + it->oie_dirent = NULL; RETURN(+1); } @@ -3293,22 +3373,27 @@ static int osd_ldiskfs_filldir(char *buf, const char *name, int namelen, loff_t offset, ino_t ino, unsigned int d_type) { - struct osd_it_ea *it = (struct osd_it_ea *)buf; - struct dirent64 *dirent = &it->oie_dirent64; - + struct osd_it_ea *it = (struct osd_it_ea *)buf; + struct osd_it_ea_dirent *ent = it->oie_dirent; ENTRY; - if (it->oie_namelen) - RETURN(-ENOENT); - if (namelen == 0 || namelen > LDISKFS_NAME_LEN) + /* this should never happen */ + if (unlikely(namelen == 0 || namelen > LDISKFS_NAME_LEN)) { + CERROR("ldiskfs return invalid namelen %d\n", namelen); RETURN(-EIO); + } - strncpy(dirent->d_name, name, LDISKFS_NAME_LEN); - dirent->d_name[namelen] = 0; - dirent->d_ino = ino; - it->oie_namelen = namelen; - it->oie_curr_pos = offset; + if ((void *) ent - it->oie_buf + sizeof(*ent) + namelen > + OSD_IT_EA_BUFSIZE) + RETURN(1); + ent->oied_ino = ino; + ent->oied_off = offset; + ent->oied_namelen = namelen; + memcpy(ent->oied_name, name, namelen); + + it->oie_rd_dirent++; + it->oie_dirent = (void *) ent + size_round(sizeof(*ent) + namelen); RETURN(0); } @@ -3321,7 +3406,7 @@ static int osd_ldiskfs_filldir(char *buf, const char *name, int namelen, * \retval 0, on success * \retval -ve, on error */ -int osd_ldiskfs_it_fill(const struct dt_it *di) +static int osd_ldiskfs_it_fill(const struct dt_it *di) { struct osd_it_ea *it = (struct osd_it_ea *)di; struct osd_object *obj = it->oie_obj; @@ -3329,16 +3414,23 @@ int osd_ldiskfs_it_fill(const struct dt_it *di) int result = 0; ENTRY; - it->oie_namelen = 0; + it->oie_dirent = it->oie_buf; + it->oie_rd_dirent = 0; it->oie_file.f_pos = it->oie_curr_pos; + down_read(&obj->oo_ext_idx_sem); result = inode->i_fop->readdir(&it->oie_file, it, (filldir_t) osd_ldiskfs_filldir); + up_read(&obj->oo_ext_idx_sem); it->oie_next_pos = it->oie_file.f_pos; - if (it->oie_namelen == 0) + if (it->oie_rd_dirent == 0) { result = -EIO; + } else { + it->oie_dirent = it->oie_buf; + it->oie_it_dirent = 1; + } RETURN(result); } @@ -3360,12 +3452,21 @@ static int osd_it_ea_next(const struct lu_env *env, struct dt_it *di) int rc; ENTRY; - it->oie_curr_pos = it->oie_next_pos; - if (it->oie_curr_pos == LDISKFS_HTREE_EOF) - rc = +1; - else - rc = osd_ldiskfs_it_fill(di); + if (it->oie_it_dirent < it->oie_rd_dirent) { + it->oie_dirent = (void *) it->oie_dirent + + size_round(sizeof(struct osd_it_ea_dirent) + + it->oie_dirent->oied_namelen); + it->oie_it_dirent++; + RETURN(0); + } else { + it->oie_curr_pos = it->oie_next_pos; + + if (it->oie_curr_pos == LDISKFS_HTREE_EOF) + rc = +1; + else + rc = osd_ldiskfs_it_fill(di); + } RETURN(rc); } @@ -3382,7 +3483,7 @@ static struct dt_key *osd_it_ea_key(const struct lu_env *env, { struct osd_it_ea *it = (struct osd_it_ea *)di; ENTRY; - RETURN((struct dt_key *)it->oie_dirent64.d_name); + RETURN((struct dt_key *)it->oie_dirent->oied_name); } /** @@ -3396,7 +3497,7 @@ static int osd_it_ea_key_size(const struct lu_env *env, const struct dt_it *di) { struct osd_it_ea *it = (struct osd_it_ea *)di; ENTRY; - RETURN(it->oie_namelen); + RETURN(it->oie_dirent->oied_namelen); } /** @@ -3423,14 +3524,13 @@ static struct dt_rec *osd_it_ea_rec(const struct lu_env *env, ENTRY; dev = osd_dev(ldev); - id->oii_ino = it->oie_dirent64.d_ino; + id->oii_ino = it->oie_dirent->oied_ino; id->oii_gen = OSD_OII_NOGEN; inode = osd_iget(info, dev, id); if (!IS_ERR(inode)) { dentry->d_inode = inode; LASSERT(dentry->d_inode->i_sb == osd_sb(dev)); } else { - CERROR("Error getting inode for ino =%d", id->oii_ino); RETURN((struct dt_rec *) PTR_ERR(inode)); } @@ -3455,7 +3555,7 @@ static __u64 osd_it_ea_store(const struct lu_env *env, const struct dt_it *di) { struct osd_it_ea *it = (struct osd_it_ea *)di; ENTRY; - RETURN(it->oie_curr_pos); + RETURN(it->oie_dirent->oied_off); } /** @@ -3553,15 +3653,29 @@ static void *osd_key_init(const struct lu_context *ctx, struct osd_thread_info *info; OBD_ALLOC_PTR(info); - if (info != NULL) - info->oti_env = container_of(ctx, struct lu_env, le_ctx); - else + if (info != NULL) { + OBD_ALLOC(info->oti_it_ea_buf, OSD_IT_EA_BUFSIZE); + if (info->oti_it_ea_buf != NULL) { + info->oti_env = container_of(ctx, struct lu_env, + le_ctx); + } else { + OBD_FREE_PTR(info); + info = ERR_PTR(-ENOMEM); + } + } else { info = ERR_PTR(-ENOMEM); + } return info; } -/* context key destructor: osd_key_fini */ -LU_KEY_FINI(osd, struct osd_thread_info); +static void osd_key_fini(const struct lu_context *ctx, + struct lu_context_key *key, void* data) +{ + struct osd_thread_info *info = data; + + OBD_FREE(info->oti_it_ea_buf, OSD_IT_EA_BUFSIZE); + OBD_FREE_PTR(info); +} static void osd_key_exit(const struct lu_context *ctx, struct lu_context_key *key, void *data) @@ -3578,11 +3692,10 @@ static int osd_device_init(const struct lu_env *env, struct lu_device *d, { int rc; struct lu_context *ctx; - struct osd_device *osd = osd_dev(d); /* context for commit hooks */ - ctx = &osd->od_env_for_commit.le_ctx; - rc = lu_context_init(ctx, LCT_MD_THREAD|LCT_DT_THREAD|LCT_REMEMBER|LCT_NOREF); + ctx = &osd_dev(d)->od_env_for_commit.le_ctx; + rc = lu_context_init(ctx, LCT_MD_THREAD|LCT_REMEMBER|LCT_NOREF); if (rc == 0) { /* XXX: somehow pass device name here */ if (name) @@ -3835,6 +3948,12 @@ struct inode *osd_iget(struct osd_thread_info *info, struct osd_device *dev, CERROR("stale inode\n"); iput(inode); inode = ERR_PTR(-ESTALE); + } else if (inode->i_nlink == 0) { + /* due to parallel readdir and unlink, + * we can have dead inode here. */ + make_bad_inode(inode); + iput(inode); + inode = ERR_PTR(-ESTALE); } return inode; diff --git a/lustre/osd/osd_internal.h b/lustre/osd/osd_internal.h index 55ff80e..6db4fdf 100644 --- a/lustre/osd/osd_internal.h +++ b/lustre/osd/osd_internal.h @@ -141,7 +141,6 @@ extern const int osd_dto_credits_noquota[DTO_NR]; struct osd_directory { struct iam_container od_container; struct iam_descr od_descr; - struct semaphore od_sem; }; struct osd_object { @@ -154,6 +153,10 @@ struct osd_object { * creation, or assigned by osd_object_create() under write lock). */ struct inode *oo_inode; + /** + * to protect index ops. + */ + struct rw_semaphore oo_ext_idx_sem; struct rw_semaphore oo_sem; struct osd_directory *oo_dir; /** protects inode attributes. */ @@ -224,6 +227,15 @@ struct osd_device { struct fsfilt_operations *od_fsops; }; +struct osd_it_ea_dirent { + __u64 oied_ino; + __u64 oied_off; + unsigned short oied_namelen; + char oied_name[0]; +} __attribute__((packed)); + +#define OSD_IT_EA_BUFSIZE CFS_PAGE_SIZE + /** * This is iterator's in-memory data structure in interoperability * mode (i.e. iterator over ldiskfs style directory) @@ -232,15 +244,18 @@ struct osd_it_ea { struct osd_object *oie_obj; /** used in ldiskfs iterator, to stored file pointer */ struct file oie_file; - /** used in ldiskfs iterator, to store directory entry */ - struct dirent64 oie_dirent64; /** current file position */ - __u64 oie_curr_pos; + __u64 oie_curr_pos; /** next file position */ - __u64 oie_next_pos; - /** namelen of the file */ - __u8 oie_namelen; - + __u64 oie_next_pos; + /** how many entries have been read-cached from storage */ + int oie_rd_dirent; + /** current entry is being iterated by caller */ + int oie_it_dirent; + /** current processing entry */ + struct osd_it_ea_dirent *oie_dirent; + /** buffer to hold entries, size == OSD_IT_EA_BUFSIZE */ + void *oie_buf; }; /** @@ -309,6 +324,8 @@ struct osd_thread_info { struct osd_it_ea oti_it_ea; }; + /** pre-allocated buffer used by oti_it_ea, size OSD_IT_EA_BUFSIZE */ + void *oti_it_ea_buf; /** IAM iterator for index operation. */ struct iam_iterator oti_idx_it; diff --git a/lustre/ost/ost_handler.c b/lustre/ost/ost_handler.c index deaf601..57001ef 100644 --- a/lustre/ost/ost_handler.c +++ b/lustre/ost/ost_handler.c @@ -996,6 +996,10 @@ static int ost_brw_write(struct ptlrpc_request *req, struct obd_trans_info *oti) if (rc != 0) GOTO(out_lock, rc); + rc = sptlrpc_svc_prep_bulk(req, desc); + if (rc != 0) + GOTO(out_lock, rc); + /* Check if client was evicted while we were doing i/o before touching network */ if (desc->bd_export->exp_failed) diff --git a/lustre/ptlrpc/Makefile.in b/lustre/ptlrpc/Makefile.in index 3660c7f..a0ccb07 100644 --- a/lustre/ptlrpc/Makefile.in +++ b/lustre/ptlrpc/Makefile.in @@ -13,7 +13,7 @@ ptlrpc_objs += events.o ptlrpc_module.o service.o pinger.o recov_thread.o ptlrpc_objs += llog_net.o llog_client.o llog_server.o import.o ptlrpcd.o ptlrpc_objs += pers.o lproc_ptlrpc.o wiretest.o layout.o ptlrpc_objs += sec.o sec_bulk.o sec_gc.o sec_config.o sec_lproc.o -ptlrpc_objs += sec_null.o sec_plain.o +ptlrpc_objs += sec_null.o sec_plain.o target.o ptlrpc-objs := $(ldlm_objs) $(ptlrpc_objs) diff --git a/lustre/ptlrpc/client.c b/lustre/ptlrpc/client.c index cf6aed5..3c99c64 100644 --- a/lustre/ptlrpc/client.c +++ b/lustre/ptlrpc/client.c @@ -940,6 +940,27 @@ static int ptlrpc_check_status(struct ptlrpc_request *req) } /** + * save pre-versions for replay + */ +static void ptlrpc_save_versions(struct ptlrpc_request *req) +{ + struct lustre_msg *repmsg = req->rq_repmsg; + struct lustre_msg *reqmsg = req->rq_reqmsg; + __u64 *versions = lustre_msg_get_versions(repmsg); + ENTRY; + + if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) + return; + + LASSERT(versions); + lustre_msg_set_versions(reqmsg, versions); + CDEBUG(D_INFO, "Client save versions ["LPX64"/"LPX64"]\n", + versions[0], versions[1]); + + EXIT; +} + +/** * Callback function called when client receives RPC reply for \a req. */ static int after_reply(struct ptlrpc_request *req) @@ -978,9 +999,11 @@ static int after_reply(struct ptlrpc_request *req) do_gettimeofday(&work_start); timediff = cfs_timeval_sub(&work_start, &req->rq_arrival_time, NULL); - if (obd->obd_svc_stats != NULL) + if (obd->obd_svc_stats != NULL) { lprocfs_counter_add(obd->obd_svc_stats, PTLRPC_REQWAIT_CNTR, timediff); + ptlrpc_lprocfs_rpc_sent(req, timediff); + } if (lustre_msg_get_type(req->rq_repmsg) != PTL_RPC_MSG_REPLY && lustre_msg_get_type(req->rq_repmsg) != PTL_RPC_MSG_ERR) { @@ -1022,10 +1045,12 @@ static int after_reply(struct ptlrpc_request *req) /* * Store transno in reqmsg for replay. */ - req->rq_transno = lustre_msg_get_transno(req->rq_repmsg); - lustre_msg_set_transno(req->rq_reqmsg, req->rq_transno); + if (!(lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY)) { + req->rq_transno = lustre_msg_get_transno(req->rq_repmsg); + lustre_msg_set_transno(req->rq_reqmsg, req->rq_transno); + } - if (req->rq_import->imp_replayable) { + if (imp->imp_replayable) { spin_lock(&imp->imp_lock); /* * No point in adding already-committed requests to the replay @@ -1034,9 +1059,11 @@ static int after_reply(struct ptlrpc_request *req) if (req->rq_transno != 0 && (req->rq_transno > lustre_msg_get_last_committed(req->rq_repmsg) || - req->rq_replay)) + req->rq_replay)) { + /** version recovery */ + ptlrpc_save_versions(req); ptlrpc_retain_replayable_request(req, imp); - else if (req->rq_commit_cb != NULL) { + } else if (req->rq_commit_cb != NULL) { spin_unlock(&imp->imp_lock); req->rq_commit_cb(req); spin_lock(&imp->imp_lock); @@ -1168,20 +1195,20 @@ int ptlrpc_check_set(const struct lu_env *env, struct ptlrpc_request_set *set) LASSERT(req->rq_next_phase != req->rq_phase); LASSERT(req->rq_next_phase != RQ_PHASE_UNDEFINED); - /* + /* * Skip processing until reply is unlinked. We * can't return to pool before that and we can't * call interpret before that. We need to make * sure that all rdma transfers finished and will - * not corrupt any data. + * not corrupt any data. */ if (ptlrpc_client_recv_or_unlink(req) || ptlrpc_client_bulk_active(req)) continue; - - /* + + /* * Turn fail_loc off to prevent it from looping - * forever. + * forever. */ if (OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_LONG_REPL_UNLINK)) { OBD_FAIL_CHECK_ORSET(OBD_FAIL_PTLRPC_LONG_REPL_UNLINK, @@ -1192,9 +1219,9 @@ int ptlrpc_check_set(const struct lu_env *env, struct ptlrpc_request_set *set) OBD_FAIL_ONCE); } - /* - * Move to next phase if reply was successfully - * unlinked. + /* + * Move to next phase if reply was successfully + * unlinked. */ ptlrpc_rqphase_move(req, req->rq_next_phase); } @@ -1205,14 +1232,14 @@ int ptlrpc_check_set(const struct lu_env *env, struct ptlrpc_request_set *set) if (req->rq_phase == RQ_PHASE_INTERPRET) GOTO(interpret, req->rq_status); - /* - * Note that this also will start async reply unlink. + /* + * Note that this also will start async reply unlink. */ if (req->rq_net_err && !req->rq_timedout) { ptlrpc_expire_one_request(req, 1); - /* - * Check if we still need to wait for unlink. + /* + * Check if we still need to wait for unlink. */ if (ptlrpc_client_recv_or_unlink(req) || ptlrpc_client_bulk_active(req)) @@ -1259,14 +1286,14 @@ int ptlrpc_check_set(const struct lu_env *env, struct ptlrpc_request_set *set) if (status != 0) { req->rq_status = status; - ptlrpc_rqphase_move(req, + ptlrpc_rqphase_move(req, RQ_PHASE_INTERPRET); spin_unlock(&imp->imp_lock); GOTO(interpret, req->rq_status); } if (req->rq_no_resend && !req->rq_wait_ctx) { req->rq_status = -ENOTCONN; - ptlrpc_rqphase_move(req, + ptlrpc_rqphase_move(req, RQ_PHASE_INTERPRET); spin_unlock(&imp->imp_lock); GOTO(interpret, req->rq_status); @@ -1281,7 +1308,7 @@ int ptlrpc_check_set(const struct lu_env *env, struct ptlrpc_request_set *set) req->rq_waiting = 0; if (req->rq_timedout||req->rq_resend) { - /* This is re-sending anyways, + /* This is re-sending anyways, * let's mark req as resend. */ req->rq_resend = 1; if (req->rq_bulk) { @@ -1417,7 +1444,7 @@ int ptlrpc_check_set(const struct lu_env *env, struct ptlrpc_request_set *set) spin_lock(&imp->imp_lock); /* Request already may be not on sending or delaying list. This * may happen in the case of marking it errorneous for the case - * ptlrpc_import_delay_req(req, status) find it impossible to + * ptlrpc_import_delay_req(req, status) find it impossible to * allow sending this rpc and returns *status != 0. */ if (!list_empty(&req->rq_list)) { list_del_init(&req->rq_list); @@ -1474,6 +1501,8 @@ int ptlrpc_expire_one_request(struct ptlrpc_request *req, int async_unlink) RETURN(1); } + atomic_inc(&imp->imp_timeouts); + /* The DLM server doesn't want recovery run on its imports. */ if (imp->imp_dlm_fake) RETURN(1); @@ -1514,8 +1543,8 @@ int ptlrpc_expired_set(void *data) LASSERT(set != NULL); - /* - * A timeout expired. See which reqs it applies to... + /* + * A timeout expired. See which reqs it applies to... */ list_for_each (tmp, &set->set_requests) { struct ptlrpc_request *req = @@ -1530,7 +1559,7 @@ int ptlrpc_expired_set(void *data) !req->rq_waiting && !req->rq_resend) || (req->rq_phase == RQ_PHASE_BULK))) continue; - + if (req->rq_timedout || /* already dealt with */ req->rq_deadline > now) /* not expired */ continue; @@ -1540,7 +1569,7 @@ int ptlrpc_expired_set(void *data) ptlrpc_expire_one_request(req, 1); } - /* + /* * When waiting for a whole set, we always to break out of the * sleep so we can recalculate the timeout, or enable interrupts * if everyone's timed out. @@ -1567,7 +1596,7 @@ void ptlrpc_interrupted_set(void *data) struct ptlrpc_request *req = list_entry(tmp, struct ptlrpc_request, rq_set_chain); - if (req->rq_phase != RQ_PHASE_RPC && + if (req->rq_phase != RQ_PHASE_RPC && req->rq_phase != RQ_PHASE_UNREGISTERING) continue; @@ -1575,8 +1604,8 @@ void ptlrpc_interrupted_set(void *data) } } -/** - * Get the smallest timeout in the set; this does NOT set a timeout. +/** + * Get the smallest timeout in the set; this does NOT set a timeout. */ int ptlrpc_set_next_timeout(struct ptlrpc_request_set *set) { @@ -1592,22 +1621,22 @@ int ptlrpc_set_next_timeout(struct ptlrpc_request_set *set) list_for_each(tmp, &set->set_requests) { req = list_entry(tmp, struct ptlrpc_request, rq_set_chain); - /* - * Request in-flight? + /* + * Request in-flight? */ if (!(((req->rq_phase == RQ_PHASE_RPC) && !req->rq_waiting) || (req->rq_phase == RQ_PHASE_BULK) || (req->rq_phase == RQ_PHASE_NEW))) continue; - /* - * Already timed out. + /* + * Already timed out. */ if (req->rq_timedout) continue; - /* - * Waiting for ctx. + /* + * Waiting for ctx. */ if (req->rq_wait_ctx) continue; @@ -1811,47 +1840,47 @@ int ptlrpc_unregister_reply(struct ptlrpc_request *request, int async) cfs_waitq_t *wq; struct l_wait_info lwi; - /* - * Might sleep. + /* + * Might sleep. */ LASSERT(!in_interrupt()); - /* - * Let's setup deadline for reply unlink. + /* + * Let's setup deadline for reply unlink. */ - if (OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_LONG_REPL_UNLINK) && + if (OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_LONG_REPL_UNLINK) && async && request->rq_reply_deadline == 0) request->rq_reply_deadline = cfs_time_current_sec()+LONG_UNLINK; - /* - * Nothing left to do. + /* + * Nothing left to do. */ if (!ptlrpc_client_recv_or_unlink(request)) RETURN(1); LNetMDUnlink(request->rq_reply_md_h); - /* - * Let's check it once again. + /* + * Let's check it once again. */ if (!ptlrpc_client_recv_or_unlink(request)) RETURN(1); - /* - * Move to "Unregistering" phase as reply was not unlinked yet. + /* + * Move to "Unregistering" phase as reply was not unlinked yet. */ ptlrpc_rqphase_move(request, RQ_PHASE_UNREGISTERING); - /* - * Do not wait for unlink to finish. + /* + * Do not wait for unlink to finish. */ if (async) RETURN(0); - /* + /* * We have to l_wait_event() whatever the result, to give liblustre * a chance to run reply_in_callback(), and to make sure we've - * unlinked before returning a req to the pool. + * unlinked before returning a req to the pool. */ if (request->rq_set != NULL) wq = &request->rq_set->set_waitq; @@ -1869,7 +1898,7 @@ int ptlrpc_unregister_reply(struct ptlrpc_request *request, int async) ptlrpc_rqphase_move(request, request->rq_next_phase); RETURN(1); } - + LASSERT(rc == -ETIMEDOUT); DEBUG_REQ(D_WARNING, request, "Unexpectedly long timeout " "rvcng=%d unlnk=%d", request->rq_receiving_reply, @@ -1994,14 +2023,14 @@ static int expired_request(void *data) struct ptlrpc_request *req = data; ENTRY; - /* + /* * Some failure can suspend regular timeouts. */ if (ptlrpc_check_suspend()) RETURN(1); - /* - * Deadline may have changed with an early reply. + /* + * Deadline may have changed with an early reply. */ if (req->rq_deadline > cfs_time_current_sec()) RETURN(1); @@ -2326,9 +2355,31 @@ static int ptlrpc_replay_interpret(const struct lu_env *env, lustre_msg_get_status(req->rq_repmsg) == -ENODEV)) GOTO(out, rc = lustre_msg_get_status(req->rq_repmsg)); - /* The transno had better not change over replay. */ - LASSERT(lustre_msg_get_transno(req->rq_reqmsg) == - lustre_msg_get_transno(req->rq_repmsg)); + /** VBR: check version failure */ + if (lustre_msg_get_status(req->rq_repmsg) == -EOVERFLOW) { + /** replay was failed due to version mismatch */ + DEBUG_REQ(D_WARNING, req, "Version mismatch during replay\n"); + spin_lock(&imp->imp_lock); + imp->imp_vbr_failed = 1; + imp->imp_no_lock_replay = 1; + spin_unlock(&imp->imp_lock); + } else { + /** The transno had better not change over replay. */ + LASSERTF(lustre_msg_get_transno(req->rq_reqmsg) == + lustre_msg_get_transno(req->rq_repmsg) || + lustre_msg_get_transno(req->rq_repmsg) == 0, + LPX64"/"LPX64"\n", + lustre_msg_get_transno(req->rq_reqmsg), + lustre_msg_get_transno(req->rq_repmsg)); + } + + spin_lock(&imp->imp_lock); + /** if replays by version then gap was occur on server, no trust to locks */ + if (lustre_msg_get_flags(req->rq_repmsg) & MSG_VERSION_REPLAY) + imp->imp_no_lock_replay = 1; + imp->imp_last_replay_transno = lustre_msg_get_transno(req->rq_reqmsg); + spin_unlock(&imp->imp_lock); + LASSERT(imp->imp_last_replay_transno); DEBUG_REQ(D_HA, req, "got rep"); diff --git a/lustre/ptlrpc/gss/gss_keyring.c b/lustre/ptlrpc/gss/gss_keyring.c index 8906109..6913e68 100644 --- a/lustre/ptlrpc/gss/gss_keyring.c +++ b/lustre/ptlrpc/gss/gss_keyring.c @@ -77,10 +77,6 @@ static struct key_type gss_key_type; static int sec_install_rctx_kr(struct ptlrpc_sec *sec, struct ptlrpc_svc_ctx *svc_ctx); -#ifndef task_aux -#define task_aux(tsk) (tsk) -#endif - /* * the timeout is only for the case that upcall child process die abnormally. * in any other cases it should finally update kernel key. @@ -103,10 +99,10 @@ static int sec_install_rctx_kr(struct ptlrpc_sec *sec, tsk->comm, tsk->pid, tsk->uid, tsk->fsuid, \ tsk->parent->comm, tsk->parent->pid, \ tsk->parent->uid, tsk->parent->fsuid, \ - task_aux(tsk)->request_key_auth ? \ - task_aux(tsk)->request_key_auth->serial : 0, \ - task_aux(tsk)->thread_keyring ? \ - task_aux(tsk)->thread_keyring->serial : 0, \ + tsk->request_key_auth ? \ + tsk->request_key_auth->serial : 0, \ + tsk->thread_keyring ? \ + tsk->thread_keyring->serial : 0, \ tsk->signal->process_keyring ? \ tsk->signal->process_keyring->serial : 0, \ tsk->signal->session_keyring ? \ @@ -115,7 +111,7 @@ static int sec_install_rctx_kr(struct ptlrpc_sec *sec, tsk->user->uid_keyring->serial : 0, \ tsk->user->session_keyring ? \ tsk->user->session_keyring->serial : 0, \ - task_aux(tsk)->jit_keyring \ + tsk->jit_keyring \ ); \ } @@ -648,10 +644,10 @@ static void request_key_unlink(struct key *key) struct task_struct *tsk = current; struct key *ring; - switch (task_aux(tsk)->jit_keyring) { + switch (tsk->jit_keyring) { case KEY_REQKEY_DEFL_DEFAULT: case KEY_REQKEY_DEFL_THREAD_KEYRING: - ring = key_get(task_aux(tsk)->thread_keyring); + ring = key_get(tsk->thread_keyring); if (ring) break; case KEY_REQKEY_DEFL_PROCESS_KEYRING: diff --git a/lustre/ptlrpc/import.c b/lustre/ptlrpc/import.c index eef7b7e..5ddb3c6 100644 --- a/lustre/ptlrpc/import.c +++ b/lustre/ptlrpc/import.c @@ -59,6 +59,17 @@ struct ptlrpc_connect_async_args { int pcaa_initial_connect; }; +static void __import_set_state(struct obd_import *imp, + enum lustre_imp_state state) +{ + imp->imp_state = state; + imp->imp_state_hist[imp->imp_state_hist_idx].ish_state = state; + imp->imp_state_hist[imp->imp_state_hist_idx].ish_time = + cfs_time_current_sec(); + imp->imp_state_hist_idx = (imp->imp_state_hist_idx + 1) % + IMP_STATE_HIST_LEN; +} + /* A CLOSED import should remain so. */ #define IMPORT_SET_STATE_NOLOCK(imp, state) \ do { \ @@ -67,7 +78,7 @@ do { \ imp, obd2cli_tgt(imp->imp_obd), \ ptlrpc_import_state_name(imp->imp_state), \ ptlrpc_import_state_name(state)); \ - imp->imp_state = state; \ + __import_set_state(imp, state); \ } \ } while(0) @@ -1149,12 +1160,23 @@ static int completed_replay_interpret(const struct lu_env *env, { ENTRY; atomic_dec(&req->rq_import->imp_replay_inflight); - if (req->rq_status == 0) { + if (req->rq_status == 0 && + !req->rq_import->imp_vbr_failed) { ptlrpc_import_recovery_state_machine(req->rq_import); } else { - CDEBUG(D_HA, "%s: LAST_REPLAY message error: %d, " - "reconnecting\n", - req->rq_import->imp_obd->obd_name, req->rq_status); + if (req->rq_import->imp_vbr_failed) { + CDEBUG(D_WARNING, + "%s: version recovery fails, reconnecting\n", + req->rq_import->imp_obd->obd_name); + spin_lock(&req->rq_import->imp_lock); + req->rq_import->imp_vbr_failed = 0; + spin_unlock(&req->rq_import->imp_lock); + } else { + CDEBUG(D_HA, "%s: LAST_REPLAY message error: %d, " + "reconnecting\n", + req->rq_import->imp_obd->obd_name, + req->rq_status); + } ptlrpc_connect_import(req->rq_import, NULL); } @@ -1408,7 +1430,6 @@ out: else IMPORT_SET_STATE_NOLOCK(imp, LUSTRE_IMP_CLOSED); memset(&imp->imp_remote_handle, 0, sizeof(imp->imp_remote_handle)); - imp->imp_conn_cnt = 0; /* Try all connections in the future - bz 12758 */ imp->imp_last_recon = 0; spin_unlock(&imp->imp_lock); @@ -1416,6 +1437,18 @@ out: RETURN(rc); } +void ptlrpc_cleanup_imp(struct obd_import *imp) +{ + ENTRY; + + spin_lock(&imp->imp_lock); + IMPORT_SET_STATE_NOLOCK(imp, LUSTRE_IMP_CLOSED); + imp->imp_generation++; + spin_unlock(&imp->imp_lock); + ptlrpc_abort_inflight(imp); + + EXIT; +} /* Adaptive Timeout utils */ extern unsigned int at_min, at_max, at_history; diff --git a/lustre/ptlrpc/llog_client.c b/lustre/ptlrpc/llog_client.c index e884f15..bded4c3 100644 --- a/lustre/ptlrpc/llog_client.c +++ b/lustre/ptlrpc/llog_client.c @@ -57,7 +57,7 @@ #include #include -#define LLOG_CLIENT_ENTRY(ctxt, imp) do { \ +#define LLOG_CLIENT_ENTRY(ctxt, imp) do { \ mutex_down(&ctxt->loc_sem); \ if (ctxt->loc_imp) { \ imp = class_import_get(ctxt->loc_imp); \ @@ -73,13 +73,13 @@ mutex_up(&ctxt->loc_sem); \ } while(0) -#define LLOG_CLIENT_EXIT(ctxt, imp) do { \ - mutex_down(&ctxt->loc_sem); \ - if (ctxt->loc_imp != imp) \ - CWARN("loc_imp has changed from %p to %p", \ - ctxt->loc_imp, imp); \ - class_import_put(imp); \ - mutex_up(&ctxt->loc_sem); \ +#define LLOG_CLIENT_EXIT(ctxt, imp) do { \ + mutex_down(&ctxt->loc_sem); \ + if (ctxt->loc_imp != imp) \ + CWARN("loc_imp has changed from %p to %p\n", \ + ctxt->loc_imp, imp); \ + class_import_put(imp); \ + mutex_up(&ctxt->loc_sem); \ } while(0) /* This is a callback from the llog_* functions. @@ -113,6 +113,7 @@ static int llog_client_create(struct llog_ctxt *ctxt, struct llog_handle **res, LLOG_ORIGIN_HANDLE_CREATE); if (rc) { ptlrpc_request_free(req); + req = NULL; GOTO(err_free, rc); } ptlrpc_request_set_replen(req); diff --git a/lustre/ptlrpc/lproc_ptlrpc.c b/lustre/ptlrpc/lproc_ptlrpc.c index 021df48..d217c62 100644 --- a/lustre/ptlrpc/lproc_ptlrpc.c +++ b/lustre/ptlrpc/lproc_ptlrpc.c @@ -594,7 +594,7 @@ void ptlrpc_lprocfs_register_obd(struct obd_device *obddev) } EXPORT_SYMBOL(ptlrpc_lprocfs_register_obd); -void ptlrpc_lprocfs_rpc_sent(struct ptlrpc_request *req) +void ptlrpc_lprocfs_rpc_sent(struct ptlrpc_request *req, long amount) { struct lprocfs_stats *svc_stats; __u32 op = lustre_msg_get_opc(req->rq_reqmsg); @@ -605,7 +605,7 @@ void ptlrpc_lprocfs_rpc_sent(struct ptlrpc_request *req) return; LASSERT(opc < LUSTRE_MAX_OPCODES); if (!(op == LDLM_ENQUEUE || op == MDS_REINT)) - lprocfs_counter_add(svc_stats, opc + EXTRA_MAX_OPCODES, 0); + lprocfs_counter_add(svc_stats, opc + EXTRA_MAX_OPCODES, amount); } void ptlrpc_lprocfs_brw(struct ptlrpc_request *req, int bytes) diff --git a/lustre/ptlrpc/niobuf.c b/lustre/ptlrpc/niobuf.c index 357e559..d52527c 100644 --- a/lustre/ptlrpc/niobuf.c +++ b/lustre/ptlrpc/niobuf.c @@ -286,7 +286,7 @@ int ptlrpc_unregister_bulk(struct ptlrpc_request *req, int async) LASSERT(!in_interrupt()); /* might sleep */ /* Let's setup deadline for reply unlink. */ - if (OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_LONG_BULK_UNLINK) && + if (OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_LONG_BULK_UNLINK) && async && req->rq_bulk_deadline == 0) req->rq_bulk_deadline = cfs_time_current_sec() + LONG_UNLINK; @@ -345,7 +345,8 @@ static void ptlrpc_at_set_reply(struct ptlrpc_request *req, int flags) (req->rq_type != PTL_RPC_MSG_ERR) && (req->rq_reqmsg != NULL) && !(lustre_msg_get_flags(req->rq_reqmsg) & - (MSG_RESENT | MSG_REPLAY | MSG_LAST_REPLAY))) { + (MSG_RESENT | MSG_REPLAY | + MSG_REQ_REPLAY_DONE | MSG_LOCK_REPLAY_DONE))) { /* early replies, errors and recovery requests don't count * toward our service time estimate */ int oldse = at_add(&svc->srv_at_estimate, service_time); @@ -642,10 +643,8 @@ int ptl_send_rpc(struct ptlrpc_request *request, int noreply) connection, request->rq_request_portal, request->rq_xid, 0); - if (rc == 0) { - ptlrpc_lprocfs_rpc_sent(request); + if (rc == 0) RETURN(rc); - } ptlrpc_req_finished(request); if (noreply) diff --git a/lustre/ptlrpc/pack_generic.c b/lustre/ptlrpc/pack_generic.c index 93168eb..51e109b 100644 --- a/lustre/ptlrpc/pack_generic.c +++ b/lustre/ptlrpc/pack_generic.c @@ -774,6 +774,12 @@ void *lustre_swab_repbuf(struct ptlrpc_request *req, int index, int min_size, return lustre_swab_buf(req->rq_repmsg, index, min_size, swabber); } +static inline struct ptlrpc_body *lustre_msg_ptlrpc_body(struct lustre_msg *msg) +{ + return lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, + sizeof(struct ptlrpc_body)); +} + __u32 lustre_msghdr_get_flags(struct lustre_msg *msg) { switch (msg->lm_magic) { @@ -809,9 +815,7 @@ __u32 lustre_msg_get_flags(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -829,9 +833,7 @@ void lustre_msg_add_flags(struct lustre_msg *msg, int flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_flags |= flags; return; @@ -845,9 +847,7 @@ void lustre_msg_set_flags(struct lustre_msg *msg, int flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_flags = flags; return; @@ -862,9 +862,7 @@ void lustre_msg_clear_flags(struct lustre_msg *msg, int flags) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_flags &= ~(MSG_GEN_FLAG_MASK & flags); return; @@ -879,9 +877,7 @@ __u32 lustre_msg_get_op_flags(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -897,9 +893,7 @@ void lustre_msg_add_op_flags(struct lustre_msg *msg, int flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_op_flags |= flags; return; @@ -913,9 +907,7 @@ void lustre_msg_set_op_flags(struct lustre_msg *msg, int flags) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_op_flags |= flags; return; @@ -930,9 +922,7 @@ struct lustre_handle *lustre_msg_get_handle(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return NULL; @@ -950,9 +940,7 @@ __u32 lustre_msg_get_type(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return PTL_RPC_MSG_ERR; @@ -970,9 +958,7 @@ __u32 lustre_msg_get_version(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -990,9 +976,7 @@ void lustre_msg_add_version(struct lustre_msg *msg, int version) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_version |= version; return; @@ -1007,9 +991,7 @@ __u32 lustre_msg_get_opc(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -1027,9 +1009,7 @@ __u64 lustre_msg_get_last_xid(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -1047,9 +1027,7 @@ __u64 lustre_msg_get_last_committed(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -1062,14 +1040,31 @@ __u64 lustre_msg_get_last_committed(struct lustre_msg *msg) } } +__u64 *lustre_msg_get_versions(struct lustre_msg *msg) +{ + switch (msg->lm_magic) { + case LUSTRE_MSG_MAGIC_V1: + return NULL; + case LUSTRE_MSG_MAGIC_V2: { + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); + if (!pb) { + CERROR("invalid msg %p: no ptlrpc body!\n", msg); + return NULL; + } + return pb->pb_pre_versions; + } + default: + CERROR("incorrect message magic: %08x\n", msg->lm_magic); + return NULL; + } +} + __u64 lustre_msg_get_transno(struct lustre_msg *msg) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -1087,9 +1082,7 @@ int lustre_msg_get_status(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return -EINVAL; @@ -1108,9 +1101,7 @@ __u64 lustre_msg_get_slv(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return -EINVAL; @@ -1129,9 +1120,7 @@ void lustre_msg_set_slv(struct lustre_msg *msg, __u64 slv) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return; @@ -1150,9 +1139,7 @@ __u32 lustre_msg_get_limit(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return -EINVAL; @@ -1171,9 +1158,7 @@ void lustre_msg_set_limit(struct lustre_msg *msg, __u64 limit) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return; @@ -1192,9 +1177,7 @@ __u32 lustre_msg_get_conn_cnt(struct lustre_msg *msg) switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -1238,9 +1221,7 @@ __u32 lustre_msg_get_timeout(struct lustre_msg *msg) return 0; case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -1262,9 +1243,7 @@ __u32 lustre_msg_get_service_time(struct lustre_msg *msg) return 0; case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); if (!pb) { CERROR("invalid msg %p: no ptlrpc body!\n", msg); return 0; @@ -1301,8 +1280,7 @@ __u32 lustre_msg_calc_cksum(struct lustre_msg *msg) return 0; case LUSTRE_MSG_MAGIC_V2: case LUSTRE_MSG_MAGIC_V2_SWABBED: { - struct ptlrpc_body *pb; - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); return crc32_le(~(__u32)0, (unsigned char *)pb, sizeof(*pb)); } @@ -1316,9 +1294,7 @@ void lustre_msg_set_handle(struct lustre_msg *msg, struct lustre_handle *handle) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_handle = *handle; return; @@ -1332,9 +1308,7 @@ void lustre_msg_set_type(struct lustre_msg *msg, __u32 type) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_type = type; return; @@ -1348,9 +1322,7 @@ void lustre_msg_set_opc(struct lustre_msg *msg, __u32 opc) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_opc = opc; return; @@ -1364,9 +1336,7 @@ void lustre_msg_set_last_xid(struct lustre_msg *msg, __u64 last_xid) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_last_xid = last_xid; return; @@ -1380,9 +1350,7 @@ void lustre_msg_set_last_committed(struct lustre_msg *msg, __u64 last_committed) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_last_committed = last_committed; return; @@ -1392,13 +1360,30 @@ void lustre_msg_set_last_committed(struct lustre_msg *msg, __u64 last_committed) } } -void lustre_msg_set_transno(struct lustre_msg *msg, __u64 transno) +void lustre_msg_set_versions(struct lustre_msg *msg, __u64 *versions) { switch (msg->lm_magic) { + case LUSTRE_MSG_MAGIC_V1: + return; case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); + LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); + pb->pb_pre_versions[0] = versions[0]; + pb->pb_pre_versions[1] = versions[1]; + pb->pb_pre_versions[2] = versions[2]; + pb->pb_pre_versions[3] = versions[3]; + return; + } + default: + LASSERTF(0, "incorrect message magic: %08x\n", msg->lm_magic); + } +} - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); +void lustre_msg_set_transno(struct lustre_msg *msg, __u64 transno) +{ + switch (msg->lm_magic) { + case LUSTRE_MSG_MAGIC_V2: { + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_transno = transno; return; @@ -1412,9 +1397,7 @@ void lustre_msg_set_status(struct lustre_msg *msg, __u32 status) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_status = status; return; @@ -1428,9 +1411,7 @@ void lustre_msg_set_conn_cnt(struct lustre_msg *msg, __u32 conn_cnt) { switch (msg->lm_magic) { case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_conn_cnt = conn_cnt; return; @@ -1446,9 +1427,7 @@ void lustre_msg_set_timeout(struct lustre_msg *msg, __u32 timeout) case LUSTRE_MSG_MAGIC_V1: return; case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_timeout = timeout; return; @@ -1464,9 +1443,7 @@ void lustre_msg_set_service_time(struct lustre_msg *msg, __u32 service_time) case LUSTRE_MSG_MAGIC_V1: return; case LUSTRE_MSG_MAGIC_V2: { - struct ptlrpc_body *pb; - - pb = lustre_msg_buf_v2(msg, MSG_PTLRPC_BODY_OFF, sizeof(*pb)); + struct ptlrpc_body *pb = lustre_msg_ptlrpc_body(msg); LASSERTF(pb, "invalid msg %p: no ptlrpc body!\n", msg); pb->pb_service_time = service_time; return; diff --git a/lustre/ptlrpc/pinger.c b/lustre/ptlrpc/pinger.c index daec0f5..af1924a 100644 --- a/lustre/ptlrpc/pinger.c +++ b/lustre/ptlrpc/pinger.c @@ -124,6 +124,12 @@ void ptlrpc_ping_import_soon(struct obd_import *imp) imp->imp_next_ping = cfs_time_current(); } +static inline int imp_is_deactive(struct obd_import *imp) +{ + return (imp->imp_deactive || + OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_IMP_DEACTIVE)); +} + static inline int ptlrpc_next_reconnect(struct obd_import *imp) { if (imp->imp_server_timeout) @@ -237,13 +243,13 @@ static void ptlrpc_pinger_process_import(struct obd_import *imp, this_ping) && force == 0) return; - if (level == LUSTRE_IMP_DISCON && !imp->imp_deactive) { + if (level == LUSTRE_IMP_DISCON && !imp_is_deactive(imp)) { /* wait at least a timeout before trying recovery again */ imp->imp_next_ping = ptlrpc_next_reconnect(imp); ptlrpc_initiate_recovery(imp); } else if (level != LUSTRE_IMP_FULL || imp->imp_obd->obd_no_recov || - imp->imp_deactive) { + imp_is_deactive(imp)) { CDEBUG(D_HA, "not pinging %s (in recovery " " or recovery disabled: %s)\n", obd2cli_tgt(imp->imp_obd), @@ -471,32 +477,28 @@ static struct timeout_item* ptlrpc_pinger_register_timeout(int time, enum timeout_event event, timeout_cb_t cb, void *data) { - struct timeout_item *item; - struct timeout_item *ti = NULL; + struct timeout_item *item, *tmp; LASSERT_SEM_LOCKED(&pinger_sem); - list_for_each_entry_reverse(item, &timeout_list, ti_chain) { - if (item->ti_event == event) { - ti = item; - break; - } - if (item->ti_timeout < ti->ti_timeout) { - ti = ptlrpc_new_timeout(time, event, cb, data); - if (!ti) { - ti = ERR_PTR(-ENOMEM); - break; + + list_for_each_entry(item, &timeout_list, ti_chain) + if (item->ti_event == event) + goto out; + + item = ptlrpc_new_timeout(time, event, cb, data); + if (item) { + list_for_each_entry_reverse(tmp, &timeout_list, ti_chain) { + if (tmp->ti_timeout < time) { + list_add(&item->ti_chain, &tmp->ti_chain); + goto out; } - list_add(&ti->ti_chain, &item->ti_chain); } + list_add(&item->ti_chain, &timeout_list); } - if (!ti) { - ti = ptlrpc_new_timeout(time, event, cb, data); - if (ti) - list_add(&ti->ti_chain, &timeout_list); - } - - return ti; +out: + return item; } + /* Add a client_obd to the timeout event list, when timeout(@time) * happens, the callback(@cb) will be called. */ @@ -517,10 +519,30 @@ int ptlrpc_add_timeout_client(int time, enum timeout_event event, return 0; } -int ptlrpc_del_timeout_client(struct list_head *obd_list) +int ptlrpc_del_timeout_client(struct list_head *obd_list, + enum timeout_event event) { + struct timeout_item *ti = NULL, *item; + + if (list_empty(obd_list)) + return 0; mutex_down(&pinger_sem); list_del_init(obd_list); + /** + * If there are no obd attached to the timeout event + * list, remove this timeout event from the pinger + */ + list_for_each_entry(item, &timeout_list, ti_chain) { + if (item->ti_event == event) { + ti = item; + break; + } + } + LASSERTF(ti != NULL, "ti is NULL ! \n"); + if (list_empty(&ti->ti_obd_list)) { + list_del(&ti->ti_chain); + OBD_FREE_PTR(ti); + } mutex_up(&pinger_sem); return 0; } @@ -891,7 +913,8 @@ int ptlrpc_add_timeout_client(int time, enum timeout_event event, return 0; } -int ptlrpc_del_timeout_client(struct list_head *obd_list) +int ptlrpc_del_timeout_client(struct list_head *obd_list, + enum timeout_event event) { return 0; } @@ -939,11 +962,13 @@ void ptlrpc_pinger_wake_up() CDEBUG(D_RPCTRACE, "checking import %s->%s\n", imp->imp_obd->obd_uuid.uuid, obd2cli_tgt(imp->imp_obd)); #ifdef ENABLE_LIBLUSTRE_RECOVERY - if (imp->imp_state == LUSTRE_IMP_DISCON && !imp->imp_deactive) + if (imp->imp_state == LUSTRE_IMP_DISCON && + !imp_is_deactive(imp)) #else /*XXX only recover for the initial connection */ if (!lustre_handle_is_used(&imp->imp_remote_handle) && - imp->imp_state == LUSTRE_IMP_DISCON && !imp->imp_deactive) + imp->imp_state == LUSTRE_IMP_DISCON && + !imp_is_deactive(imp)) #endif ptlrpc_initiate_recovery(imp); else if (imp->imp_state != LUSTRE_IMP_FULL) @@ -951,7 +976,7 @@ void ptlrpc_pinger_wake_up() "state %d, deactive %d\n", imp->imp_obd->obd_uuid.uuid, obd2cli_tgt(imp->imp_obd), imp->imp_state, - imp->imp_deactive); + imp_is_deactive(imp)); } EXIT; #endif diff --git a/lustre/ptlrpc/ptlrpc_internal.h b/lustre/ptlrpc/ptlrpc_internal.h index ea6704a..40ccd94 100644 --- a/lustre/ptlrpc/ptlrpc_internal.h +++ b/lustre/ptlrpc/ptlrpc_internal.h @@ -69,7 +69,7 @@ int lustre_unpack_rep_ptlrpc_body(struct ptlrpc_request *req, int offset); void ptlrpc_lprocfs_register_service(struct proc_dir_entry *proc_entry, struct ptlrpc_service *svc); void ptlrpc_lprocfs_unregister_service(struct ptlrpc_service *svc); -void ptlrpc_lprocfs_rpc_sent(struct ptlrpc_request *req); +void ptlrpc_lprocfs_rpc_sent(struct ptlrpc_request *req, long amount); void ptlrpc_lprocfs_do_request_stat (struct ptlrpc_request *req, long q_usec, long work_usec); #else @@ -145,7 +145,7 @@ int llog_recov_init(void); void llog_recov_fini(void); static inline int ll_rpc_recoverable_error(int rc) -{ +{ return (rc == -ENOTCONN || rc == -ENODEV); } #endif /* PTLRPC_INTERNAL_H */ diff --git a/lustre/ptlrpc/ptlrpc_module.c b/lustre/ptlrpc/ptlrpc_module.c index 681873d..fe75eb9 100644 --- a/lustre/ptlrpc/ptlrpc_module.c +++ b/lustre/ptlrpc/ptlrpc_module.c @@ -190,6 +190,7 @@ EXPORT_SYMBOL(ptlrpc_prep_bulk_exp); EXPORT_SYMBOL(ptlrpc_free_bulk); EXPORT_SYMBOL(ptlrpc_prep_bulk_page); EXPORT_SYMBOL(ptlrpc_abort_inflight); +EXPORT_SYMBOL(ptlrpc_cleanup_imp); EXPORT_SYMBOL(ptlrpc_retain_replayable_request); EXPORT_SYMBOL(ptlrpc_next_xid); EXPORT_SYMBOL(ptlrpc_req_set_repsize); @@ -288,6 +289,7 @@ EXPORT_SYMBOL(lustre_msg_add_version); EXPORT_SYMBOL(lustre_msg_get_opc); EXPORT_SYMBOL(lustre_msg_get_last_xid); EXPORT_SYMBOL(lustre_msg_get_last_committed); +EXPORT_SYMBOL(lustre_msg_get_versions); EXPORT_SYMBOL(lustre_msg_get_transno); EXPORT_SYMBOL(lustre_msg_get_status); EXPORT_SYMBOL(lustre_msg_get_slv); @@ -302,6 +304,7 @@ EXPORT_SYMBOL(lustre_msg_set_type); EXPORT_SYMBOL(lustre_msg_set_opc); EXPORT_SYMBOL(lustre_msg_set_last_xid); EXPORT_SYMBOL(lustre_msg_set_last_committed); +EXPORT_SYMBOL(lustre_msg_set_versions); EXPORT_SYMBOL(lustre_msg_set_transno); EXPORT_SYMBOL(lustre_msg_set_status); EXPORT_SYMBOL(lustre_msg_set_conn_cnt); diff --git a/lustre/ptlrpc/recov_thread.c b/lustre/ptlrpc/recov_thread.c index ef02ea7..3dad818 100644 --- a/lustre/ptlrpc/recov_thread.c +++ b/lustre/ptlrpc/recov_thread.c @@ -336,7 +336,7 @@ static struct llog_canceld_ctxt *llcd_detach(struct llog_ctxt *ctxt) static struct llog_canceld_ctxt *llcd_get(struct llog_ctxt *ctxt) { struct llog_canceld_ctxt *llcd; - + LASSERT(ctxt); llcd = llcd_alloc(ctxt->loc_lcm); if (!llcd) { CERROR("Can't alloc an llcd for ctxt %p\n", ctxt); @@ -597,7 +597,7 @@ int llog_obd_repl_cancel(struct llog_ctxt *ctxt, } lcm = ctxt->loc_lcm; CDEBUG(D_INFO, "cancel on lsm %p\n", lcm); - + /* * Let's check if we have all structures alive. We also check for * possible shutdown. Do nothing if we're stopping. diff --git a/lustre/ptlrpc/recover.c b/lustre/ptlrpc/recover.c index 4adf785..7f27502 100644 --- a/lustre/ptlrpc/recover.c +++ b/lustre/ptlrpc/recover.c @@ -116,17 +116,12 @@ int ptlrpc_replay_next(struct obd_import *imp, int *inflight) req and send it again. If, however, the last sent transno has been committed then we continue replay from the next request. */ - if (imp->imp_resend_replay && - req->rq_transno == last_transno) { - lustre_msg_add_flags(req->rq_reqmsg, MSG_RESENT); - break; - } - if (req->rq_transno > last_transno) { - imp->imp_last_replay_transno = req->rq_transno; + if (imp->imp_resend_replay) + lustre_msg_add_flags(req->rq_reqmsg, + MSG_RESENT); break; } - req = NULL; } diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c index 99f79a4..3b5fa02 100644 --- a/lustre/ptlrpc/service.c +++ b/lustre/ptlrpc/service.c @@ -354,11 +354,9 @@ ptlrpc_schedule_difficult_reply (struct ptlrpc_reply_state *rs) EXIT; } -void -ptlrpc_commit_replies (struct obd_device *obd) +void ptlrpc_commit_replies(struct obd_export *exp) { - struct list_head *tmp; - struct list_head *nxt; + struct ptlrpc_reply_state *rs, *nxt; DECLARE_RS_BATCH(batch); ENTRY; @@ -367,19 +365,18 @@ ptlrpc_commit_replies (struct obd_device *obd) * to attend to complete them. */ /* CAVEAT EMPTOR: spinlock ordering!!! */ - spin_lock(&obd->obd_uncommitted_replies_lock); - 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); - + spin_lock(&exp->exp_uncommitted_replies_lock); + list_for_each_entry_safe(rs, nxt, &exp->exp_uncommitted_replies, + rs_obd_list) { LASSERT (rs->rs_difficult); - - if (rs->rs_transno <= obd->obd_last_committed) { + /* VBR: per-export last_committed */ + LASSERT(rs->rs_export); + if (rs->rs_transno <= exp->exp_last_committed) { list_del_init(&rs->rs_obd_list); rs_batch_add(&batch, rs); } } - spin_unlock(&obd->obd_uncommitted_replies_lock); + spin_unlock(&exp->exp_uncommitted_replies_lock); rs_batch_fini(&batch); EXIT; } @@ -532,14 +529,14 @@ ptlrpc_init_svc(int nbufs, int bufsize, int max_req_size, int max_reply_size, array->paa_count = 0; array->paa_deadline = -1; - /* allocate memory for srv_at_array (ptlrpc_at_array) */ + /* allocate memory for srv_at_array (ptlrpc_at_array) */ OBD_ALLOC(array->paa_reqs_array, sizeof(struct list_head) * size); if (array->paa_reqs_array == NULL) GOTO(failed, NULL); for (index = 0; index < size; index++) CFS_INIT_LIST_HEAD(&array->paa_reqs_array[index]); - + OBD_ALLOC(array->paa_reqs_count, sizeof(__u32) * size); if (array->paa_reqs_count == NULL) GOTO(failed, NULL); @@ -706,8 +703,8 @@ static void ptlrpc_server_finish_request(struct ptlrpc_request *req) if (req->rq_at_linked) { struct ptlrpc_at_array *array = &svc->srv_at_array; __u32 index = req->rq_at_index; - - req->rq_at_linked = 0; + + req->rq_at_linked = 0; array->paa_reqs_count[index]--; array->paa_count--; } @@ -851,7 +848,7 @@ static int ptlrpc_at_add_timed(struct ptlrpc_request *req) struct ptlrpc_service *svc = req->rq_rqbd->rqbd_service; struct ptlrpc_request *rq = NULL; struct ptlrpc_at_array *array = &svc->srv_at_array; - __u32 index, wtimes; + __u32 index; int found = 0; if (AT_OFF) @@ -872,13 +869,8 @@ static int ptlrpc_at_add_timed(struct ptlrpc_request *req) LASSERT(list_empty(&req->rq_timed_list)); - wtimes = req->rq_deadline / array->paa_size; index = req->rq_deadline % array->paa_size; - if (array->paa_reqs_count[index] > 0) - rq = list_entry(array->paa_reqs_array[index].next, - struct ptlrpc_request, rq_timed_list); - - if (rq != NULL && (rq->rq_deadline / array->paa_size) < wtimes) { + if (array->paa_reqs_count[index] > 0) { /* latest rpcs will have the latest deadlines in the list, * so search backward. */ list_for_each_entry_reverse(rq, &array->paa_reqs_array[index], @@ -896,6 +888,10 @@ static int ptlrpc_at_add_timed(struct ptlrpc_request *req) /* Add the request at the head of the list */ list_add(&req->rq_timed_list, &array->paa_reqs_array[index]); } + + /* Add the request at the head of the list */ + if (list_empty(&req->rq_timed_list)) + list_add(&req->rq_timed_list, &array->paa_reqs_array[index]); req->rq_at_linked = 1; req->rq_at_index = index; @@ -1096,7 +1092,7 @@ static int ptlrpc_at_check_timed(struct ptlrpc_service *svc) rq->rq_at_linked = 0; continue; } - + /* update the earliest deadline */ if (deadline == -1 || rq->rq_deadline < deadline) deadline = rq->rq_deadline; @@ -1674,12 +1670,12 @@ ptlrpc_handle_rs (struct ptlrpc_reply_state *rs) list_del_init (&rs->rs_exp_list); spin_unlock (&exp->exp_lock); - /* Avoid obd_uncommitted_replies_lock contention if we 100% sure that + /* Avoid exp_uncommitted_replies_lock contention if we 100% sure that * rs has been removed from the list already */ if (!list_empty_careful(&rs->rs_obd_list)) { - spin_lock(&obd->obd_uncommitted_replies_lock); + spin_lock(&exp->exp_uncommitted_replies_lock); list_del_init(&rs->rs_obd_list); - spin_unlock(&obd->obd_uncommitted_replies_lock); + spin_unlock(&exp->exp_uncommitted_replies_lock); } spin_lock(&rs->rs_lock); @@ -2482,17 +2478,17 @@ int ptlrpc_unregister_service(struct ptlrpc_service *service) cfs_timer_disarm(&service->srv_at_timer); if (array->paa_reqs_array != NULL) { - OBD_FREE(array->paa_reqs_array, + OBD_FREE(array->paa_reqs_array, sizeof(struct list_head) * array->paa_size); array->paa_reqs_array = NULL; } - + if (array->paa_reqs_count != NULL) { - OBD_FREE(array->paa_reqs_count, + OBD_FREE(array->paa_reqs_count, sizeof(__u32) * array->paa_size); array->paa_reqs_count= NULL; } - + OBD_FREE_PTR(service); RETURN(0); } diff --git a/lustre/ptlrpc/target.c b/lustre/ptlrpc/target.c new file mode 100644 index 0000000..4fdd923 --- /dev/null +++ b/lustre/ptlrpc/target.c @@ -0,0 +1,372 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * Lustre Common Target + * These are common function for MDT and OST recovery-related functionality + * + * Author: Mikhail Pershin + */ + +#include +#include +/** + * Update client data in last_rcvd file. An obd API + */ +static int obt_client_data_update(struct obd_export *exp) +{ + struct lu_export_data *led = &exp->exp_target_data; + struct obd_device_target *obt = &exp->exp_obd->u.obt; + loff_t off = led->led_lr_off; + int rc = 0; + + rc = fsfilt_write_record(exp->exp_obd, obt->obt_rcvd_filp, + led->led_lcd, sizeof(*led->led_lcd), &off, 0); + + CDEBUG(D_INFO, "update client idx %u last_epoch %#x (%#x)\n", + led->led_lr_idx, le32_to_cpu(led->led_lcd->lcd_last_epoch), + le32_to_cpu(obt->obt_lsd->lsd_start_epoch)); + + return rc; +} + +/** + * Update server data in last_rcvd file. An obd API + */ +int obt_server_data_update(struct obd_device *obd, int force_sync) +{ + struct obd_device_target *obt = &obd->u.obt; + loff_t off = 0; + int rc; + ENTRY; + + CDEBUG(D_SUPER, + "%s: mount_count is "LPU64", last_transno is "LPU64"\n", + obt->obt_lsd->lsd_uuid, + le64_to_cpu(obt->obt_lsd->lsd_mount_count), + le64_to_cpu(obt->obt_lsd->lsd_last_transno)); + + rc = fsfilt_write_record(obd, obt->obt_rcvd_filp, obt->obt_lsd, + sizeof(*obt->obt_lsd), &off, force_sync); + if (rc) + CERROR("error writing lr_server_data: rc = %d\n", rc); + + RETURN(rc); +} + +/** + * Update client epoch with server's one + */ +void obt_client_epoch_update(struct obd_export *exp) +{ + struct lsd_client_data *lcd = exp->exp_target_data.led_lcd; + struct obd_device_target *obt = &exp->exp_obd->u.obt; + + /** VBR: set client last_epoch to current epoch */ + if (le32_to_cpu(lcd->lcd_last_epoch) >= + le32_to_cpu(obt->obt_lsd->lsd_start_epoch)) + return; + lcd->lcd_last_epoch = obt->obt_lsd->lsd_start_epoch; + obt_client_data_update(exp); +} + +/** + * Increment server epoch. An obd API + */ +static void obt_boot_epoch_update(struct obd_device *obd) +{ + __u32 start_epoch; + struct obd_device_target *obt = &obd->u.obt; + struct ptlrpc_request *req; + struct list_head client_list; + + spin_lock(&obt->obt_translock); + start_epoch = lr_epoch(le64_to_cpu(obt->obt_last_transno)) + 1; + obt->obt_last_transno = cpu_to_le64((__u64)start_epoch << + LR_EPOCH_BITS); + obt->obt_lsd->lsd_start_epoch = cpu_to_le32(start_epoch); + spin_unlock(&obt->obt_translock); + + CFS_INIT_LIST_HEAD(&client_list); + spin_lock_bh(&obd->obd_processing_task_lock); + list_splice_init(&obd->obd_final_req_queue, &client_list); + spin_unlock_bh(&obd->obd_processing_task_lock); + + /** + * go through list of exports participated in recovery and + * set new epoch for them + */ + list_for_each_entry(req, &client_list, rq_list) { + LASSERT(!req->rq_export->exp_delayed); + obt_client_epoch_update(req->rq_export); + } + /** return list back at once */ + spin_lock_bh(&obd->obd_processing_task_lock); + list_splice_init(&client_list, &obd->obd_final_req_queue); + spin_unlock_bh(&obd->obd_processing_task_lock); + obt_server_data_update(obd, 1); +} + +/** + * write data in last_rcvd file. + */ +static int lut_last_rcvd_write(const struct lu_env *env, struct lu_target *lut, + const struct lu_buf *buf, loff_t *off, int sync) +{ + LBUG(); + RETURN(0); +#if 0 + struct thandle *th; + struct txn_param p; + int rc, credits; + ENTRY; + + credits = lut->lut_bottom->dd_ops->dt_credit_get(env, lut->lut_bottom, + DTO_WRITE_BLOCK); + txn_param_init(&p, credits); + + th = dt_trans_start(env, lut->lut_bottom, &p); + if (IS_ERR(th)) + RETURN(PTR_ERR(th)); + + rc = dt_record_write(env, lut->lut_last_rcvd, buf, off, th); + dt_trans_stop(env, lut->lut_bottom, th); + + CDEBUG(D_INFO, "write last_rcvd header rc = %d:\n" + "uuid = %s\nlast_transno = "LPU64"\n", + rc, lut->lut_lsd.lsd_uuid, lut->lut_lsd.lsd_last_transno); + + RETURN(rc); +#endif +} + +/** + * Update client data in last_rcvd + */ +int lut_client_data_update(const struct lu_env *env, struct lu_target *lut, + struct obd_export *exp) +{ + struct lu_export_data *led = &exp->exp_target_data; + struct lsd_client_data tmp_lcd; + loff_t tmp_off = led->led_lr_off; + struct lu_buf tmp_buf = { + .lb_buf = &tmp_lcd, + .lb_len = sizeof(tmp_lcd) + }; + int rc = 0; + + lcd_cpu_to_le(led->led_lcd, &tmp_lcd); + LASSERT(lut->lut_last_rcvd); + rc = lut_last_rcvd_write(env, lut, &tmp_buf, &tmp_off, 0); + + return rc; +} + +/** + * Update server data in last_rcvd + */ +static int lut_server_data_update(const struct lu_env *env, + struct lu_target *lut, int sync) +{ + struct lr_server_data tmp_lsd; + loff_t tmp_off = 0; + struct lu_buf tmp_buf = { + .lb_buf = &tmp_lsd, + .lb_len = sizeof(tmp_lsd) + }; + int rc = 0; + ENTRY; + + CDEBUG(D_SUPER, + "%s: mount_count is "LPU64", last_transno is "LPU64"\n", + lut->lut_lsd.lsd_uuid, lut->lut_mount_count, + lut->lut_last_transno); + + spin_lock(&lut->lut_translock); + lut->lut_lsd.lsd_last_transno = lut->lut_last_transno; + spin_unlock(&lut->lut_translock); + + lsd_cpu_to_le(&lut->lut_lsd, &tmp_lsd); + if (lut->lut_last_rcvd != NULL) + rc = lut_last_rcvd_write(env, lut, &tmp_buf, &tmp_off, sync); + RETURN(rc); +} + +void lut_client_epoch_update(const struct lu_env *env, struct lu_target *lut, + struct obd_export *exp) +{ + struct lsd_client_data *lcd = exp->exp_target_data.led_lcd; + + LASSERT(lut->lut_bottom); + /** VBR: set client last_epoch to current epoch */ + if (lcd->lcd_last_epoch >= lut->lut_lsd.lsd_start_epoch) + return; + lcd->lcd_last_epoch = lut->lut_lsd.lsd_start_epoch; + lut_client_data_update(env, lut, exp); +} + +/** + * Update boot epoch when recovery ends + */ +void lut_boot_epoch_update(struct lu_target *lut) +{ + struct lu_env env; + struct ptlrpc_request *req; + __u32 start_epoch; + struct list_head client_list; + int rc; + + if (lut->lut_obd->obd_stopping) + return; + /** Increase server epoch after recovery */ + if (lut->lut_bottom == NULL) + return obt_boot_epoch_update(lut->lut_obd); + + rc = lu_env_init(&env, LCT_DT_THREAD); + if (rc) { + CERROR("Can't initialize environment rc=%i\n", rc); + return; + } + + spin_lock(&lut->lut_translock); + start_epoch = lr_epoch(lut->lut_last_transno) + 1; + lut->lut_last_transno = (__u64)start_epoch << LR_EPOCH_BITS; + lut->lut_lsd.lsd_start_epoch = start_epoch; + spin_unlock(&lut->lut_translock); + + CFS_INIT_LIST_HEAD(&client_list); + /** + * The recovery is not yet finished and final queue can still be updated + * with resend requests. Move final list to separate one for processing + */ + spin_lock_bh(&lut->lut_obd->obd_processing_task_lock); + list_splice_init(&lut->lut_obd->obd_final_req_queue, &client_list); + spin_unlock_bh(&lut->lut_obd->obd_processing_task_lock); + + /** + * go through list of exports participated in recovery and + * set new epoch for them + */ + list_for_each_entry(req, &client_list, rq_list) { + LASSERT(!req->rq_export->exp_delayed); + if (!req->rq_export->exp_vbr_failed) + lut_client_epoch_update(&env, lut, req->rq_export); + } + /** return list back at once */ + spin_lock_bh(&lut->lut_obd->obd_processing_task_lock); + list_splice_init(&client_list, &lut->lut_obd->obd_final_req_queue); + spin_unlock_bh(&lut->lut_obd->obd_processing_task_lock); + /** update server epoch */ + lut_server_data_update(&env, lut, 1); + lu_env_fini(&env); +} +EXPORT_SYMBOL(lut_boot_epoch_update); + +/** + * commit callback, need to update last_commited value + */ +void lut_cb_last_committed(struct lu_target *lut, __u64 transno, + void *data, int err) +{ + struct obd_export *exp = data; + + spin_lock(&lut->lut_translock); + if (transno > lut->lut_obd->obd_last_committed) + lut->lut_obd->obd_last_committed = transno; + + LASSERT(exp); + if (!lut->lut_obd->obd_stopping && + transno > exp->exp_last_committed) { + exp->exp_last_committed = transno; + spin_unlock(&lut->lut_translock); + ptlrpc_commit_replies(exp); + } else { + spin_unlock(&lut->lut_translock); + } + if (transno) + CDEBUG(D_HA, "%s: transno "LPD64" is committed\n", + lut->lut_obd->obd_name, transno); +} +EXPORT_SYMBOL(lut_cb_last_committed); + +void lut_cb_client(struct lu_target *lut, __u64 transno, + void *data, int err) +{ + LASSERT(lut->lut_obd); + target_client_add_cb(lut->lut_obd, transno, data, err); +} +EXPORT_SYMBOL(lut_cb_client); + +int lut_init(const struct lu_env *env, struct lu_target *lut, + struct obd_device *obd, struct dt_device *dt) +{ + struct lu_fid fid; + struct dt_object *o; + int rc = 0; + ENTRY; + + lut->lut_obd = obd; + + spin_lock_init(&lut->lut_translock); + spin_lock_init(&lut->lut_client_bitmap_lock); + spin_lock_init(&lut->lut_trans_table_lock); + + /** obdfilter has no lu_device stack yet */ + if (dt == NULL) + RETURN(rc); + + lut->lut_bottom = dt; + lut->lut_last_rcvd = NULL; + + o = dt_store_open(env, lut->lut_bottom, "", LAST_RCVD, &fid); + if (!IS_ERR(o)) { + lut->lut_last_rcvd = o; + } else { + rc = PTR_ERR(o); + CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc); + } + + RETURN(rc); +} +EXPORT_SYMBOL(lut_init); + +void lut_fini(const struct lu_env *env, struct lu_target *lut) +{ + ENTRY; + if (lut->lut_last_rcvd) + lu_object_put(env, &lut->lut_last_rcvd->do_lu); + lut->lut_last_rcvd = NULL; + EXIT; +} +EXPORT_SYMBOL(lut_fini); diff --git a/lustre/ptlrpc/wiretest.c b/lustre/ptlrpc/wiretest.c index c04abbe..ef3c783 100644 --- a/lustre/ptlrpc/wiretest.c +++ b/lustre/ptlrpc/wiretest.c @@ -399,6 +399,11 @@ void lustre_assert_wire_constants(void) (long long)(int)offsetof(struct ptlrpc_body, pb_limit)); LASSERTF((int)sizeof(((struct ptlrpc_body *)0)->pb_limit) == 4, " found %lld\n", (long long)(int)sizeof(((struct ptlrpc_body *)0)->pb_limit)); + CLASSERT(PTLRPC_NUM_VERSIONS == 4); + LASSERTF((int)offsetof(struct ptlrpc_body, pb_pre_versions[4]) == 120, " found %lld\n", + (long long)(int)offsetof(struct ptlrpc_body, pb_pre_versions[4])); + LASSERTF((int)sizeof(((struct ptlrpc_body *)0)->pb_pre_versions[4]) == 8, " found %lld\n", + (long long)(int)sizeof(((struct ptlrpc_body *)0)->pb_pre_versions[4])); /* Checks for struct obd_connect_data */ LASSERTF((int)sizeof(struct obd_connect_data) == 72, " found %lld\n", @@ -481,6 +486,7 @@ void lustre_assert_wire_constants(void) CLASSERT(OBD_CONNECT_AT == 0x01000000ULL); CLASSERT(OBD_CONNECT_CANCELSET == 0x400000ULL); CLASSERT(OBD_CONNECT_LRU_RESIZE == 0x02000000ULL); + CLASSERT(OBD_CONNECT_VBR == 0x80000000ULL); CLASSERT(OBD_CONNECT_SKIP_ORPHAN == 0x400000000ULL); /* Checks for struct obdo */ diff --git a/lustre/quota/quota_context.c b/lustre/quota/quota_context.c index 6bcbcc5..cccc3fd 100644 --- a/lustre/quota/quota_context.c +++ b/lustre/quota/quota_context.c @@ -499,7 +499,6 @@ static void compute_lqs_after_removing_qunit(struct lustre_qunit *qunit) /* this is for schedule_dqacq */ lqs_putref(lqs); } - } static void remove_qunit_nolock(struct lustre_qunit *qunit) diff --git a/lustre/quota/quota_ctl.c b/lustre/quota/quota_ctl.c index 5e8cd88..be5bab6 100644 --- a/lustre/quota/quota_ctl.c +++ b/lustre/quota/quota_ctl.c @@ -151,6 +151,7 @@ int filter_quota_ctl(struct obd_device *unused, struct obd_export *exp, } if (oqctl->qc_cmd == Q_FINVALIDATE && (obt->obt_qctxt.lqc_flags & UGQUOTA2LQC(oqctl->qc_type))) { + atomic_inc(&obt->obt_quotachecking); rc = -EBUSY; break; } diff --git a/lustre/quota/quota_interface.c b/lustre/quota/quota_interface.c index 59c6e70..ef40fd8 100644 --- a/lustre/quota/quota_interface.c +++ b/lustre/quota/quota_interface.c @@ -137,6 +137,7 @@ static int filter_quota_clearinfo(struct obd_export *exp, struct obd_device *obd spin_lock(&qctxt->lqc_lock); qctxt->lqc_import = NULL; spin_unlock(&qctxt->lqc_lock); + ptlrpc_cleanup_imp(exp->exp_imp_reverse); dqacq_interrupt(qctxt); CDEBUG(D_QUOTA, "%s: lqc_import of obd(%p) is invalid now.\n", obd->obd_name, obd); diff --git a/lustre/tests/Makefile.am b/lustre/tests/Makefile.am index 884d9fe..ef39d18 100644 --- a/lustre/tests/Makefile.am +++ b/lustre/tests/Makefile.am @@ -5,13 +5,13 @@ AM_CFLAGS = $(LLCFLAGS) # LDADD := -lreadline -ltermcap # -lefence noinst_DATA = disk1_8.tar.bz2 -noinst_SCRIPTS = leak_finder.pl llmount.sh llmountcleanup.sh +noinst_SCRIPTS = leak_finder.pl llmount.sh llmountcleanup.sh functions.sh noinst_SCRIPTS += test-framework.sh runvmstat runiozone runtests noinst_SCRIPTS += sanity.sh rundbench acceptance-small.sh compile.sh noinst_SCRIPTS += conf-sanity.sh insanity.sh lfscktest.sh oos.sh oos2.sh noinst_SCRIPTS += llog-test.sh recovery-small.sh replay-dual.sh sanity-quota.sh noinst_SCRIPTS += replay-ost-single.sh replay-single.sh run-llog.sh sanityN.sh -noinst_SCRIPTS += runracer +noinst_SCRIPTS += large-scale.sh runracer replay-vbr.sh noinst_SCRIPTS += performance-sanity.sh mdsrate-create-small.sh noinst_SCRIPTS += mdsrate-create-large.sh mdsrate-lookup-1dir.sh noinst_SCRIPTS += mdsrate-stat-small.sh mdsrate-stat-large.sh diff --git a/lustre/tests/acceptance-small.sh b/lustre/tests/acceptance-small.sh index ceca69f..d6851bd 100755 --- a/lustre/tests/acceptance-small.sh +++ b/lustre/tests/acceptance-small.sh @@ -23,7 +23,7 @@ fi [ "$DEBUG_OFF" ] || DEBUG_OFF="eval lctl set_param debug=\"$DEBUG_LVL\"" [ "$DEBUG_ON" ] || DEBUG_ON="eval lctl set_param debug=0x33f0484" -export TESTSUITE_LIST="RUNTESTS SANITY DBENCH BONNIE IOZONE FSX SANITYN LFSCK LIBLUSTRE RACER REPLAY_SINGLE CONF_SANITY RECOVERY_SMALL REPLAY_OST_SINGLE REPLAY_DUAL INSANITY SANITY_QUOTA SANITY_SEC SANITY_GSS PERFORMANCE_SANITY RECOVERY_MDS_SCALE RECOVERY_DOUBLE_SCALE RECOVERY_RANDOM_SCALE" +export TESTSUITE_LIST="RUNTESTS SANITY DBENCH BONNIE IOZONE FSX SANITYN LFSCK LIBLUSTRE RACER REPLAY_SINGLE CONF_SANITY RECOVERY_SMALL REPLAY_OST_SINGLE REPLAY_DUAL REPLAY_VBR INSANITY SANITY_QUOTA SANITY_SEC SANITY_GSS PERFORMANCE_SANITY LARGE_SCALE RECOVERY_MDS_SCALE RECOVERY_DOUBLE_SCALE RECOVERY_RANDOM_SCALE" if [ "$ACC_SM_ONLY" ]; then for O in $TESTSUITE_LIST; do @@ -62,6 +62,7 @@ setup_if_needed() { local MOUNTED=$(mounted_lustre_filesystems) if $(echo $MOUNTED | grep -w -q $MOUNT); then check_config $MOUNT + init_facets_vars init_param_vars return fi @@ -393,6 +394,13 @@ if [ "$REPLAY_DUAL" != "no" ]; then REPLAY_DUAL="done" fi +[ "$REPLAY_VBR" != "no" ] && skip_remmds replay-vbr && REPLAY_VBR=no && MSKIPPED=1 +if [ "$REPLAY_VBR" != "no" ]; then + title replay-vbr + bash replay-vbr.sh + REPLAY_VBR="done" +fi + [ "$INSANITY" != "no" ] && skip_remmds insanity && INSANITY=no && MSKIPPED=1 [ "$INSANITY" != "no" ] && skip_remost insanity && INSANITY=no && OSKIPPED=1 if [ "$INSANITY" != "no" ]; then @@ -433,6 +441,13 @@ if [ "$PERFORMANCE_SANITY" != "no" ]; then PERFORMANCE_SANITY="done" fi +[ "$LARGE_SCALE" != "no" ] && skip_remmds large-scale && LARGE_SCALE=no && MSKIPPED=1 +if [ "$LARGE_SCALE" != "no" ]; then + title large-scale + bash large-scale.sh + LARGE_SCALE="done" +fi + [ "$RECOVERY_MDS_SCALE" != "no" ] && skip_remmds recovery-mds-scale && RECOVERY_MDS_SCALE=no && MSKIPPED=1 [ "$RECOVERY_MDS_SCALE" != "no" ] && skip_remost recovery-mds-scale && RECOVERY_MDS_SCALE=no && OSKIPPED=1 if [ "$RECOVERY_MDS_SCALE" != "no" ]; then diff --git a/lustre/tests/cfg/local.sh b/lustre/tests/cfg/local.sh index 49f4e42..04462c3 100644 --- a/lustre/tests/cfg/local.sh +++ b/lustre/tests/cfg/local.sh @@ -44,6 +44,10 @@ PTLDEBUG=${PTLDEBUG:-0x33f0404} DEBUG_SIZE=${DEBUG_SIZE:-10} SUBSYSTEM=${SUBSYSTEM:- 0xffb7e3ff} +ENABLE_QUOTA=${ENABLE_QUOTA:-""} +QUOTA_TYPE="ug3" +QUOTA_USERS=${QUOTA_USERS:-"quota_usr quota_2usr sanityusr sanityusr1"} + MKFSOPT="" [ "x$MDSJOURNALSIZE" != "x" ] && MKFSOPT=$MKFSOPT" -J size=$MDSJOURNALSIZE" diff --git a/lustre/tests/conf-sanity.sh b/lustre/tests/conf-sanity.sh index db1deae..0649fcc 100644 --- a/lustre/tests/conf-sanity.sh +++ b/lustre/tests/conf-sanity.sh @@ -50,19 +50,20 @@ reformat() { } writeconf() { - local facet=$SINGLEMDS - local dev=${facet}_dev - shift - stop ${facet} -f - rm -f ${facet}active - # who knows if/where $TUNEFS is installed? Better reformat if it fails... - do_facet ${facet} "$TUNEFS --writeconf ${!dev}" || echo "tunefs failed, reformatting instead" && reformat + local facet=$SINGLEMDS + local dev=${facet}_dev + shift + stop ${facet} -f + rm -f ${facet}active + # who knows if/where $TUNEFS is installed? Better reformat if it fails... + do_facet ${facet} "$TUNEFS --writeconf ${!dev}" || echo "tunefs failed, reformatting instead" && reformat + + gen_config } gen_config() { - reformat - # The MGS must be started before the OSTs for a new fs, so start - # and stop to generate the startup logs. + # The MGS must be started before the OSTs for a new fs, so start + # and stop to generate the startup logs. start_mds start_ost sleep 5 @@ -70,6 +71,11 @@ gen_config() { stop_mds } +reformat_and_config() { + reformat + gen_config +} + start_mds() { local facet=$SINGLEMDS # we can not use MDSDEV1 here because SINGLEMDS could be set not to mds1 only @@ -193,7 +199,7 @@ init_gss #create single point mountpoint -gen_config +reformat_and_config test_0() { setup @@ -452,7 +458,7 @@ test_17() { start_ost start_mds && return 42 - gen_config + reformat_and_config } run_test 17 "Verify failed mds_postsetup won't fail assertion (2936) (should return errs)" @@ -495,7 +501,7 @@ test_18() { MDS_MKFS_OPTS="--mgs --mdt --fsname=$FSNAME --device-size=$myMDSSIZE --param sys.timeout=$TIMEOUT $MDSOPT" - gen_config + reformat_and_config echo "mount lustre system..." setup check_mount || return 41 @@ -511,7 +517,7 @@ test_18() { cleanup || return $? MDS_MKFS_OPTS=$OLD_MDS_MKFS_OPTS - gen_config + reformat_and_config } run_test 18 "check mkfs creates large journals" @@ -895,10 +901,6 @@ test_29() { cleanup_nocli #writeconf to remove all ost2 traces for subsequent tests writeconf - start_mds - start_ost - sleep 5 - cleanup } run_test 29 "permanently remove an OST" @@ -1659,8 +1661,14 @@ test_47() { #17674 } run_test 47 "server restart does not make client loss lru_resize settings" -# reformat after this test must need - if test will failed -# we will have unkillable file at FS +cleanup_48() { + trap 0 + + # reformat after this test is needed - if test will failed + # we will have unkillable file at FS + reformat_and_config +} + test_48() { # bug 17636 reformat setup_noconfig @@ -1671,18 +1679,17 @@ test_48() { # bug 17636 echo "ok" > $MOUNT/widestripe $LFS getstripe $MOUNT/widestripe || return 11 + + trap cleanup_48 EXIT ERR + # fill acl buffer for avoid expand lsm to them - awk -F : '{ print "u:"$1":rwx" }' /etc/passwd | while read acl; do - setfacl -m $acl $MOUNT/widestripe - done - awk -F : '{ print "g:"$1":rwx" }' /etc/groups | while read acl; do + getent passwd | awk -F : '{ print "u:"$1":rwx" }' | while read acl; do setfacl -m $acl $MOUNT/widestripe done - stat $MOUNT/widestripe || return 12 - - cleanup || error "can't cleanup" + + cleanup_48 return 0 } run_test 48 "too many acls on file" @@ -1691,11 +1698,10 @@ run_test 48 "too many acls on file" test_49() { # bug 17710 local OLD_MDS_MKFS_OPTS=$MDS_MKFS_OPTS local OLD_OST_MKFS_OPTS=$OST_MKFS_OPTS - local OLD_TIMEOUT=$TIMEOUT + local LOCAL_TIMEOUT=20 - TIMEOUT=20 - MDS_MKFS_OPTS="--mgs --mdt --fsname=$FSNAME --device-size=$MDSSIZE --param sys.timeout=$TIMEOUT --param sys.ldlm_timeout=$TIMEOUT $MKFSOPT $MDSOPT" + OST_MKFS_OPTS="--ost --fsname=$FSNAME --device-size=$OSTSIZE --mgsnode=$MGSNID --param sys.timeout=$LOCAL_TIMEOUT --param sys.ldlm_timeout=$LOCAL_TIMEOUT $MKFSOPT $OSTOPT" reformat start_mds @@ -1709,10 +1715,10 @@ test_49() { # bug 17710 LDLM_CLIENT="`do_facet client lctl get_param -n ldlm_timeout`" if [ $LDLM_MDS -ne $LDLM_OST1 ] || [ $LDLM_MDS -ne $LDLM_CLIENT ]; then - error "Different LDLM_TIMEOUT: $LDLM_MDS $LDLM_OST $LDLM_CLIENT" + error "Different LDLM_TIMEOUT:$LDLM_MDS $LDLM_OST1 $LDLM_CLIENT" fi - if [ $LDLM_MDS -ne $((TIMEOUT / 3)) ]; then + if [ $LDLM_MDS -ne $((LOCAL_TIMEOUT / 3)) ]; then error "LDLM_TIMEOUT($LDLM_MDS) is not correct" fi @@ -1720,7 +1726,7 @@ test_49() { # bug 17710 stop_ost || return 2 stop_mds || return 3 - OST_MKFS_OPTS="--ost --fsname=$FSNAME --device-size=$OSTSIZE --mgsnode=$MGSNID --param sys.timeout=$TIMEOUT --param sys.ldlm_timeout=$((TIMEOUT - 1)) $MKFSOPT $OSTOPT" + OST_MKFS_OPTS="--ost --fsname=$FSNAME --device-size=$OSTSIZE --mgsnode=$MGSNID --param sys.timeout=$LOCAL_TIMEOUT --param sys.ldlm_timeout=$((LOCAL_TIMEOUT - 1)) $MKFSOPT $OSTOPT" reformat start_mds || return 4 @@ -1733,10 +1739,10 @@ test_49() { # bug 17710 LDLM_CLIENT="`do_facet client lctl get_param -n ldlm_timeout`" if [ $LDLM_MDS -ne $LDLM_OST1 ] || [ $LDLM_MDS -ne $LDLM_CLIENT ]; then - error "Different LDLM_TIMEOUT: $LDLM_MDS $LDLM_OST $LDLM_CLIENT" + error "Different LDLM_TIMEOUT:$LDLM_MDS $LDLM_OST1 $LDLM_CLIENT" fi - if [ $LDLM_MDS -ne $((TIMEOUT - 1)) ]; then + if [ $LDLM_MDS -ne $((LOCAL_TIMEOUT - 1)) ]; then error "LDLM_TIMEOUT($LDLM_MDS) is not correct" fi diff --git a/lustre/tests/functions.sh b/lustre/tests/functions.sh new file mode 100644 index 0000000..c5b806e --- /dev/null +++ b/lustre/tests/functions.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Simple function used by run_*.sh scripts + +assert_env() { + local failed="" + for name in $@; do + if [ -z "${!name}" ]; then + echo "$0: $name must be set" + failed=1 + fi + done + [ $failed ] && exit 1 || true +} + +echoerr () { echo "$@" 1>&2 ; } + +signaled() { + echoerr "$(date +'%F %H:%M:%S'): client load was signaled to terminate" + + local PGID=$(ps -eo "%c %p %r" | awk "/ $PPID / {print \$3}") + kill -TERM -$PGID + sleep 5 + kill -KILL -$PGID +} + diff --git a/lustre/tests/large-scale.sh b/lustre/tests/large-scale.sh new file mode 100644 index 0000000..c3ecd82 --- /dev/null +++ b/lustre/tests/large-scale.sh @@ -0,0 +1,117 @@ +#!/bin/bash + +set -e + +# bug number: +ALWAYS_EXCEPT="$LARGE_SCALE_EXCEPT" + +SAVE_PWD=$PWD +PTLDEBUG=${PTLDEBUG:--1} +LUSTRE=${LUSTRE:-`dirname $0`/..} +SETUP=${SETUP:-""} +CLEANUP=${CLEANUP:-""} +. $LUSTRE/tests/test-framework.sh + +init_test_env $@ + +. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh} + +remote_mds_nodsh && log "SKIP: remote MDS with nodsh" && exit 0 + +[ -n "$CLIENTS" ] || { skip "$0: Need two or more clients" && exit 0; } +[ $CLIENTCOUNT -ge 2 ] || \ + { skip "$0: Need two or more clients, have $CLIENTCOUNT" && exit 0; } + +# +[ "$SLOW" = "no" ] && EXCEPT_SLOW="" + +MOUNT_2="" +build_test_filter + +check_and_setup_lustre +rm -rf $DIR/[df][0-9]* + +[ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE + +test_3a() { + assert_env CLIENTS MDSRATE MPIRUN + + local -a nodes=(${CLIENTS//,/ }) + + # INCREMENT is a number of clients + # a half of clients by default + increment=${INCREMENT:-$(( CLIENTCOUNT / 2 ))} + + machinefile=${MACHINEFILE:-$TMP/$(basename $0 .sh).machines} + local LOG=$TMP/${TESTSUITE}_$tfile + + local var=${SINGLEMDS}_svc + local procfile="*.${!var}.recovery_status" + local iters=${ITERS:-3} + local nfiles=${NFILES:-50000} + local nthreads=${THREADS_PER_CLIENT:-3} + + local IFree=$(inodes_available) + [ $IFree -gt $nfiles ] || nfiles=$IFree + + local dir=$DIR/$tdir + mkdir -p $dir + chmod 0777 $dir + + local pid + local list + local -a res + + local num=$increment + + while [ $num -le $CLIENTCOUNT ]; do + list=$(comma_list ${nodes[@]:0:$num}) + + generate_machine_file $list $machinefile || + { error "can not generate machinefile"; exit 1; } + + for i in $(seq $iters); do + mdsrate_cleanup $num $machinefile $nfiles $dir 'f%%d' --ignore + + COMMAND="${MDSRATE} --create --nfiles $nfiles --dir $dir --filefmt 'f%%d'" + mpi_run -np $((num * nthreads)) -machinefile $machinefile ${COMMAND} | tee ${LOG} & + + pid=$! + echo "pid=$pid" + + # 2 threads 100000 creates 117 secs + sleep 20 + + log "$i : Starting failover on $SINGLEMDS" + facet_failover $SINGLEMDS + if ! wait_recovery_complete $SINGLEMDS $((TIMEOUT * 10)); then + echo "$SINGLEMDS recovery is not completed!" + kill -9 $pid + exit 7 + fi + + duration=$(do_facet $SINGLEMDS lctl get_param -n $procfile | grep recovery_duration) + + res=( "${res[@]}" "$num" ) + res=( "${res[@]}" "$duration" ) + echo "RECOVERY TIME: NFILES=$nfiles number of clients: $num $duration" + wait $pid + + done + num=$((num + increment)) + done + + mdsrate_cleanup $num $machinefile $nfiles $dir 'f%%d' --ignore + + i=0 + while [ $i -lt ${#res[@]} ]; do + echo "RECOVERY TIME: NFILES=$nfiles number of clients: ${res[i]} ${res[i+1]}" + i=$((i+2)) + done +} + +run_test 3a "recovery time, $CLIENTCOUNT clients" + +equals_msg `basename $0`: test complete, cleaning up +check_and_cleanup_lustre +[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG || true diff --git a/lustre/tests/lockorder.sh b/lustre/tests/lockorder.sh index 4d4e7e1..122df46 100644 --- a/lustre/tests/lockorder.sh +++ b/lustre/tests/lockorder.sh @@ -7,9 +7,9 @@ STATMANY=${STATMANY:-statmany} UNLINKMANY=${UNLINKMANY:-unlinkmany} LCTL=${LCTL:-lctl} -MOUNT1=${MOUNT1:-/mnt/lustre1} +MOUNT=${MOUNT:-/mnt/lustre} MOUNT2=${MOUNT2:-/mnt/lustre2} -DIR=${DIR:-$MOUNT1} +DIR=${DIR:-$MOUNT} DIR2=${DIR2:-$MOUNT2} COUNT=${COUNT:-100} diff --git a/lustre/tests/mdsrate-create-large.sh b/lustre/tests/mdsrate-create-large.sh index b45dae1..94bb805 100644 --- a/lustre/tests/mdsrate-create-large.sh +++ b/lustre/tests/mdsrate-create-large.sh @@ -48,6 +48,9 @@ rm -f ${LOG} PI* if [ -n "$NOSINGLE" ]; then echo "NO Test for creates for a single client." else + # We can use np = $NUM_CLIENTS to speed up the cleanup + mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR_SINGLE 'f%%d' --ignore + log "===== $0 ### 1 NODE CREATE ###" echo "Running creates on 1 node(s)." @@ -83,6 +86,7 @@ fi if [ -n "$NOMULTI" ]; then echo "NO test for create on multiple nodes." else + mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR_MULTI 'f%%d' --ignore log "===== $0 ### $NUM_CLIENTS NODES CREATE ###" echo "Running creates on ${NUM_CLIENTS} node(s)." @@ -112,6 +116,8 @@ else fi equals_msg `basename $0`: test complete, cleaning up +mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR_SINGLE 'f%%d' --ignore +mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR_MULTI 'f%%d' --ignore rm -f $MACHINEFILE check_and_cleanup_lustre #rm -f $LOG diff --git a/lustre/tests/mdsrate-create-small.sh b/lustre/tests/mdsrate-create-small.sh index 5455796..cb4a1c0 100644 --- a/lustre/tests/mdsrate-create-small.sh +++ b/lustre/tests/mdsrate-create-small.sh @@ -56,7 +56,8 @@ else if [ -n "$NOCREATE" ]; then echo "NO Test for creates for a single client." else - do_node ${CLIENT} "rm -rf $TESTDIR_SINGLE" + # We can use np = $NUM_CLIENTS to speed up the cleanup + mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR_SINGLE 'f%%d' --ignore log "===== $0 ### 1 NODE CREATE ###" echo "Running creates on 1 node(s)." @@ -101,7 +102,7 @@ else if [ -n "$NOCREATE" ]; then echo "NO test for create on multiple nodes." else - do_node $CLIENT rm -rf $TESTDIR_MULTI + mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR_MULTI 'f%%d' --ignore log "===== $0 ### $NUM_CLIENTS NODES CREATE ###" echo "Running creates on ${NUM_CLIENTS} node(s) with $THREADS_PER_CLIENT threads per client." @@ -136,6 +137,8 @@ else fi equals_msg `basename $0`: test complete, cleaning up +mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR_SINGLE 'f%%d' --ignore +mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR_MULTI 'f%%d' --ignore rm -f $MACHINEFILE check_and_cleanup_lustre #rm -f $LOG diff --git a/lustre/tests/mdsrate-lookup-1dir.sh b/lustre/tests/mdsrate-lookup-1dir.sh index 3387a56..e6ed62f 100644 --- a/lustre/tests/mdsrate-lookup-1dir.sh +++ b/lustre/tests/mdsrate-lookup-1dir.sh @@ -16,7 +16,8 @@ init_test_env $@ assert_env CLIENTS MDSRATE SINGLECLIENT MPIRUN MACHINEFILE=${MACHINEFILE:-$TMP/$(basename $0 .sh).machines} -TESTDIR=$MOUNT +# Do not use name [df][0-9]* to avoid cleanup by rm, bug 18045 +TESTDIR=$MOUNT/mdsrate # Requirements NUM_FILES=${NUM_FILES:-1000000} @@ -34,6 +35,13 @@ rm -f $LOG log "===== $0 ====== " check_and_setup_lustre +mkdir -p $TESTDIR +chmod 0777 $TESTDIR + +IFree=$(inodes_available) +if [ $IFree -lt $NUM_FILES ]; then + NUM_FILES=$IFree +fi IFree=$(inodes_available) if [ $IFree -lt $NUM_FILES ]; then @@ -48,6 +56,8 @@ get_stripe $TESTDIR if [ -n "$NOCREATE" ]; then echo "NOCREATE=$NOCREATE => no file creation." else + mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR 'f%%d' --ignore + log "===== $0 Test preparation: creating ${NUM_FILES} files." echo "Test preparation: creating ${NUM_FILES} files." diff --git a/lustre/tests/mdsrate-stat-large.sh b/lustre/tests/mdsrate-stat-large.sh index a26ffc8..1870a67 100644 --- a/lustre/tests/mdsrate-stat-large.sh +++ b/lustre/tests/mdsrate-stat-large.sh @@ -18,7 +18,8 @@ init_test_env $@ assert_env CLIENTS MDSRATE SINGLECLIENT MPIRUN MACHINEFILE=${MACHINEFILE:-$TMP/$(basename $0 .sh).machines} -TESTDIR=$MOUNT +# Do not use name [df][0-9]* to avoid cleanup by rm, bug 18045 +TESTDIR=$MOUNT/mdsrate # Requirements NUM_FILES=${NUM_FILES:-1000000} @@ -39,6 +40,13 @@ rm -f $LOG log "===== $0 ====== " check_and_setup_lustre +mkdir -p $TESTDIR +chmod 0777 $TESTDIR + +IFree=$(inodes_available) +if [ $IFree -lt $NUM_FILES ]; then + NUM_FILES=$IFree +fi IFree=$(inodes_available) if [ $IFree -lt $NUM_FILES ]; then @@ -53,6 +61,8 @@ get_stripe $TESTDIR if [ -n "$NOCREATE" ]; then echo "NOCREATE=$NOCREATE => no file creation." else + mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR 'f%%d' --ignore + log "===== $0 Test preparation: creating ${NUM_FILES} files." echo "Test preparation: creating ${NUM_FILES} files." diff --git a/lustre/tests/mdsrate-stat-small.sh b/lustre/tests/mdsrate-stat-small.sh index f667ee6..9bc6666 100644 --- a/lustre/tests/mdsrate-stat-small.sh +++ b/lustre/tests/mdsrate-stat-small.sh @@ -18,7 +18,8 @@ init_test_env $@ assert_env CLIENTS MDSRATE SINGLECLIENT MPIRUN MACHINEFILE=${MACHINEFILE:-$TMP/$(basename $0 .sh).machines} -TESTDIR=$MOUNT +# Do not use name [df][0-9]* to avoid cleanup by rm, bug 18045 +TESTDIR=$MOUNT/mdsrate # Requirements NUM_FILES=${NUM_FILES:-1000000} @@ -39,6 +40,13 @@ rm -f $LOG log "===== $0 ====== " check_and_setup_lustre +mkdir -p $TESTDIR +chmod 0777 $TESTDIR + +IFree=$(inodes_available) +if [ $IFree -lt $NUM_FILES ]; then + NUM_FILES=$IFree +fi IFree=$(inodes_available) if [ $IFree -lt $NUM_FILES ]; then @@ -53,6 +61,8 @@ get_stripe $TESTDIR if [ -n "$NOCREATE" ]; then echo "NOCREATE=$NOCREATE => no file creation." else + mdsrate_cleanup $NUM_CLIENTS $MACHINEFILE $NUM_FILES $TESTDIR 'f%%d' --ignore + log "===== $0 Test preparation: creating ${NUM_FILES} files." echo "Test preparation: creating ${NUM_FILES} files." diff --git a/lustre/tests/mdsrate.c b/lustre/tests/mdsrate.c index 930541f..097d4a8 100644 --- a/lustre/tests/mdsrate.c +++ b/lustre/tests/mdsrate.c @@ -60,6 +60,7 @@ enum { RANDOM = 'A', READDIR = 'B', RECREATE = 'C', + IGNORE = 'E', VERBOSE = 'V', DEBUG = 'v', HELP = 'h', @@ -86,6 +87,7 @@ struct option longOpts[] = { {"random_order", 0, NULL, RANDOM }, {"readdir_order", 0, NULL, READDIR }, {"recreate", 0, NULL, RECREATE }, + {"ignore", 0, NULL, IGNORE }, {"verbose", 0, NULL, VERBOSE }, {"debug", 0, NULL, DEBUG }, {"help", 0, NULL, HELP }, @@ -124,6 +126,7 @@ struct sigaction act; int order = RANDOM; int seed; int recreate; +int ignore; int verbose; int debug; struct stat statbuf; @@ -150,7 +153,7 @@ struct stat statbuf; char *usage_msg = "usage: %s\n" " { --create [ --noexcl ] | --lookup | --mknod |\n" - " --open | --stat | --unlink [ --recreate ] }\n" + " --open | --stat | --unlink [ --recreate ] [ --ignore ] }\n" " [ --help ] [ --verbose ] [ --debug ]\n" " { [ --begin ] --nfiles }\n" " [ --iters ] [ --time ]\n" @@ -403,6 +406,9 @@ process_args(int argc, char *argv[]) } order = c; break; + case IGNORE: + ++ignore; + break; case DEBUG: ++debug; case VERBOSE: @@ -567,7 +573,7 @@ main(int argc, char *argv[]) /* if we're not measuring creation rates then precreate * the files we're operating on. */ - if ((mode != CREATE) && (mode != MKNOD)) { + if ((mode != CREATE) && (mode != MKNOD) && !ignore) { /* create the files in reverse order. When we encounter * a file that already exists, assume the remainder of * the files exist to save time. The timed performance @@ -723,6 +729,8 @@ main(int argc, char *argv[]) if (rc) { if (((rc = errno) == EINTR) && alarm_caught) break; + if (((rc = errno) == ENOENT) && ignore) + continue; fatal(myrank, "unlink(%s) error: %s\n", filename, strerror(rc)); } diff --git a/lustre/tests/recovery-mds-scale.sh b/lustre/tests/recovery-mds-scale.sh index 598620b..5a7a2a6 100644 --- a/lustre/tests/recovery-mds-scale.sh +++ b/lustre/tests/recovery-mds-scale.sh @@ -30,7 +30,7 @@ set -x [ $CLIENTCOUNT -ge 3 ] || \ { skip "$0 Need two or more clients, have $CLIENTCOUNT" && exit 0; } -END_RUN_FILE=${END_RUN_FILE:-$SHARED_DIRECTORY}/end_run_file} +END_RUN_FILE=${END_RUN_FILE:-$SHARED_DIRECTORY/end_run_file} LOAD_PID_FILE=${LOAD_PID_FILE:-$TMP/client-load.pid} remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0 diff --git a/lustre/tests/recovery-small.sh b/lustre/tests/recovery-small.sh index ff146fc..dc9088d 100755 --- a/lustre/tests/recovery-small.sh +++ b/lustre/tests/recovery-small.sh @@ -1068,31 +1068,6 @@ test_61() } run_test 61 "Verify to not reuse orphan objects - bug 17025" -test_61() -{ - local cflags='osc.*-OST0000-osc-MDT*.connect_flags' - do_facet $SINGLEMDS "lctl get_param -n $cflags" |grep -q skip_orphan - [ $? -ne 0 ] && skip "don't have skip orphan feature" && return - - mkdir -p $DIR/$tdir || error "mkdir dir $DIR/$tdir failed" - # Set the default stripe of $DIR/$tdir to put the files to ost1 - $LFS setstripe -c 1 --index 0 $DIR/$tdir - - replay_barrier $SINGLEMDS - createmany -o $DIR/$tdir/$tfile-%d 10 - local oid=`do_facet ost1 "lctl get_param -n obdfilter.*OST0000.last_id"` - - fail_abort $SINGLEMDS - - touch $DIR/$tdir/$tfile - local id=`$LFS getstripe $DIR/$tdir/$tfile |awk '$2 ~ /^[1-9]+/ {print $2}'` - [ $id -le $oid ] && error "the orphan objid was reused, failed" - - # Cleanup - rm -rf $DIR/$tdir -} -run_test 61 "Verify to not reuse orphan objects - bug 17025" - equals_msg `basename $0`: test complete, cleaning up check_and_cleanup_lustre [ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true diff --git a/lustre/tests/replay-single.sh b/lustre/tests/replay-single.sh index fc79347..4521ad9 100755 --- a/lustre/tests/replay-single.sh +++ b/lustre/tests/replay-single.sh @@ -1459,19 +1459,19 @@ run_test 60 "test llog post recovery init vs llog unlink" #test race llog recovery thread vs llog cleanup test_61a() { # was test_61 remote_ost_nodsh && skip "remote OST with nodsh" && return 0 - + mkdir -p $DIR/$tdir createmany -o $DIR/$tdir/$tfile-%d 800 - replay_barrier ost1 -# OBD_FAIL_OST_LLOG_RECOVERY_TIMEOUT 0x221 - unlinkmany $DIR/$tdir/$tfile-%d 800 + replay_barrier ost1 +# OBD_FAIL_OST_LLOG_RECOVERY_TIMEOUT 0x221 + unlinkmany $DIR/$tdir/$tfile-%d 800 set_nodes_failloc "$(osts_nodes)" 0x80000221 facet_failover ost1 - sleep 10 + sleep 10 fail ost1 sleep 30 set_nodes_failloc "$(osts_nodes)" 0x0 - + $CHECKSTAT -t file $DIR/$tdir/$tfile-* && return 1 rmdir $DIR/$tdir } @@ -1481,7 +1481,7 @@ run_test 61a "test race llog recovery vs llog cleanup" test_61b() { # OBD_FAIL_MDS_LLOG_SYNC_TIMEOUT 0x13a do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000013a" - facet_failover $SINGLEMDS + facet_failover $SINGLEMDS sleep 10 fail $SINGLEMDS do_facet client dd if=/dev/zero of=$DIR/$tfile bs=4k count=1 || return 1 @@ -1492,10 +1492,10 @@ run_test 61b "test race mds llog sync vs llog cleanup" test_61c() { remote_ost_nodsh && skip "remote OST with nodsh" && return 0 -# OBD_FAIL_OST_CANCEL_COOKIE_TIMEOUT 0x222 - touch $DIR/$tfile +# OBD_FAIL_OST_CANCEL_COOKIE_TIMEOUT 0x222 + touch $DIR/$tfile set_nodes_failloc "$(osts_nodes)" 0x80000222 - rm $DIR/$tfile + rm $DIR/$tfile sleep 10 fail ost1 set_nodes_failloc "$(osts_nodes)" 0x0 @@ -1850,6 +1850,67 @@ test_70b () { run_test 70b "mds recovery; $CLIENTCOUNT clients" # end multi-client tests +test_73a() { + multiop_bg_pause $DIR/$tfile O_tSc || return 3 + pid=$! + rm -f $DIR/$tfile + + replay_barrier $SINGLEMDS +#define OBD_FAIL_LDLM_ENQUEUE 0x302 + do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000302" + fail $SINGLEMDS + kill -USR1 $pid + wait $pid || return 1 + [ -e $DIR/$tfile ] && return 2 + return 0 +} +run_test 73a "open(O_CREAT), unlink, replay, reconnect before open replay , close" + +test_73b() { + multiop_bg_pause $DIR/$tfile O_tSc || return 3 + pid=$! + rm -f $DIR/$tfile + + replay_barrier $SINGLEMDS +#define OBD_FAIL_LDLM_REPLY 0x30c + do_facet $SINGLEMDS "lctl set_param fail_loc=0x8000030c" + fail $SINGLEMDS + kill -USR1 $pid + wait $pid || return 1 + [ -e $DIR/$tfile ] && return 2 + return 0 +} +run_test 73b "open(O_CREAT), unlink, replay, reconnect at open_replay reply, close" + +test_73c() { + multiop_bg_pause $DIR/$tfile O_tSc || return 3 + pid=$! + rm -f $DIR/$tfile + + replay_barrier $SINGLEMDS +#define OBD_FAIL_TGT_LAST_REPLAY 0x710 + do_facet $SINGLEMDS "lctl set_param fail_loc=0x80000710" + fail $SINGLEMDS + kill -USR1 $pid + wait $pid || return 1 + [ -e $DIR/$tfile ] && return 2 + return 0 +} +run_test 73c "open(O_CREAT), unlink, replay, reconnect at last_replay, close" + +# bug 18554 +test_74() { + stop ost1 + zconf_umount $(hostname) $MOUNT + fail $SINGLEMDS + zconf_mount $(hostname) $MOUNT + mount_facet ost1 + touch $DIR/$tfile || return 1 + rm $DIR/$tfile || return 2 + return 0 +} +run_test 74 "Ensure applications don't fail waiting for OST reocvery" + test_80a() { [ $MDSCOUNT -lt 2 ] && skip "needs >= 2 MDTs" && return 0 diff --git a/lustre/tests/replay-vbr.sh b/lustre/tests/replay-vbr.sh new file mode 100644 index 0000000..e418b9e --- /dev/null +++ b/lustre/tests/replay-vbr.sh @@ -0,0 +1,678 @@ +#!/bin/bash + +set -e + +# bug number: 16356 +ALWAYS_EXCEPT="2 $REPLAY_VBR_EXCEPT" + +SAVE_PWD=$PWD +PTLDEBUG=${PTLDEBUG:--1} +LUSTRE=${LUSTRE:-`dirname $0`/..} +SETUP=${SETUP:-""} +CLEANUP=${CLEANUP:-""} +. $LUSTRE/tests/test-framework.sh + +init_test_env $@ + +. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh} + +[ -n "$CLIENTS" ] || { skip "Need two or more clients" && exit 0; } +[ $CLIENTCOUNT -ge 2 ] || \ + { skip "Need two or more clients, have $CLIENTCOUNT" && exit 0; } +remote_mds_nodsh && skip "remote MDS with nodsh" && exit 0 + +[ "$SLOW" = "no" ] && EXCEPT_SLOW="" + + +[ ! "$NAME" = "ncli" ] && ALWAYS_EXCEPT="$ALWAYS_EXCEPT" +[ "$NAME" = "ncli" ] && MOUNT_2="" +MOUNT_2="" +build_test_filter + +check_and_setup_lustre +rm -rf $DIR/[df][0-9]* + +[ "$DAEMONFILE" ] && $LCTL debug_daemon start $DAEMONFILE $DAEMONSIZE + +[ "$CLIENTS" ] && zconf_umount_clients $CLIENTS $DIR + +test_1() { + echo "mount client $CLIENT1,$CLIENT2..." + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + do_node $CLIENT2 mkdir -p $DIR/$tdir + replay_barrier $SINGLEMDS + do_node $CLIENT1 createmany -o $DIR/$tfile- 25 + do_node $CLIENT2 createmany -o $DIR/$tdir/$tfile-2- 1 + do_node $CLIENT1 createmany -o $DIR/$tfile-3- 25 + zconf_umount $CLIENT2 $DIR + + facet_failover $SINGLEMDS + # recovery shouldn't fail due to missing client 2 + do_node $CLIENT1 df $DIR || return 1 + + # All 50 files should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 2 + do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 3 + + zconf_mount $CLIENT2 $DIR || error "mount $CLIENT2 $DIR fail" + [ -e $DIR/$tdir/$tfile-2-0 ] && error "$tfile-2-0 exists" + + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 1 "lost client doesn't affect another during replay" + +test_2() { + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + do_node $CLIENT2 mkdir -p $DIR/$tdir + replay_barrier $SINGLEMDS + do_node $CLIENT2 mcreate $DIR/$tdir/$tfile + do_node $CLIENT1 createmany -o $DIR/$tfile- 25 + #client1 read data from client2 which will be lost + do_node $CLIENT1 $CHECKSTAT $DIR/$tdir/$tfile + do_node $CLIENT1 createmany -o $DIR/$tfile-3- 25 + zconf_umount $CLIENT2 $DIR + + facet_failover $SINGLEMDS + # recovery shouldn't fail due to missing client 2 + do_node $CLIENT1 df $DIR || return 1 + + # All 50 files should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 2 + do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 3 + do_node $CLIENT1 $CHECKSTAT $DIR/$tdir/$tfile && return 4 + + zconf_mount $CLIENT2 $DIR || error "mount $CLIENT2 $DIR fail" + + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 2 "lost data due to missed REMOTE client during replay" + +test_3a() { + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + #make sure the time will change + local var=${SINGLEMDS}_svc + do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.atime_diff=0" || return + do_node $CLIENT1 touch $DIR/$tfile + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile + sleep 1 + replay_barrier $SINGLEMDS + #change time + do_node $CLIENT2 touch $DIR/$tfile + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile + #another change + do_node $CLIENT1 touch $DIR/$tfile + #remove file + do_node $CLIENT1 rm $DIR/$tfile + zconf_umount $CLIENT2 $DIR + + facet_failover $SINGLEMDS + # recovery shouldn't fail due to missing client 2 + do_node $CLIENT1 df $DIR || return 1 + do_node $CLIENT1 $CHECKSTAT $DIR/$tfile && return 2 + + zconf_mount $CLIENT2 $DIR || error "mount $CLIENT2 $DIR fail" + + zconf_umount_clients $CLIENTS $DIR + + return 0 +} +run_test 3a "setattr of time/size doesn't change version" + +test_3b() { + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + #make sure the time will change + local var=${SINGLEMDS}_svc + do_facet $SINGLEMDS "$LCTL set_param mdd.${!var}.atime_diff=0" || return + + do_node $CLIENT1 touch $DIR/$tfile + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile + sleep 1 + replay_barrier $SINGLEMDS + #change mode + do_node $CLIENT2 chmod +x $DIR/$tfile + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile + #abother chmod + do_node $CLIENT1 chmod -x $DIR/$tfile + zconf_umount $CLIENT2 $DIR + + facet_failover $SINGLEMDS + # recovery should fail due to missing client 2 + do_node $CLIENT1 df $DIR && return 1 + + do_node $CLIENT1 $CHECKSTAT -p 755 $DIR/$tfile && return 2 + zconf_mount $CLIENT2 $DIR || error "mount $CLIENT2 $DIR fail" + + zconf_umount_clients $CLIENTS $DIR + + return 0 +} +run_test 3b "setattr of permissions changes version" + +vbr_deactivate_client() { + local client=$1 + echo "Deactivating client $client"; + do_node $client "sysctl -w lustre.fail_loc=0x50d" +} + +vbr_activate_client() { + local client=$1 + echo "Activating client $client"; + do_node $client "sysctl -w lustre.fail_loc=0x0" +} + +remote_server () +{ + local client=$1 + [ -z "$(do_node $client lctl dl | grep mdt)" ] && \ + [ -z "$(do_node $client lctl dl | grep ost)" ] +} + +test_4a() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + do_node $CLIENT2 mkdir -p $DIR/$tdir + replay_barrier $SINGLEMDS + do_node $CLIENT1 createmany -o $DIR/$tfile- 25 + do_node $CLIENT2 createmany -o $DIR/$tdir/$tfile-2- 25 + do_node $CLIENT1 createmany -o $DIR/$tfile-3- 25 + vbr_deactivate_client $CLIENT2 + + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 1 + + # All 50 files should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 2 + do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 3 + + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 4 + # All 25 files from client2 should have been replayed + do_node $CLIENT2 unlinkmany $DIR/$tdir/$tfile-2- 25 || return 5 + + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 4a "fail MDS, delayed recovery" + +test_4b(){ + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + replay_barrier $SINGLEMDS + do_node $CLIENT1 createmany -o $DIR/$tfile- 25 + do_node $CLIENT2 createmany -o $DIR/$tdir/$tfile-2- 25 + vbr_deactivate_client $CLIENT2 + + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 1 + + # create another set of files + do_node $CLIENT1 createmany -o $DIR/$tfile-3- 25 + + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 2 + + # All files from should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 3 + do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 4 + do_node $CLIENT2 unlinkmany $DIR/$tdir/$tfile-2- 25 || return 5 + + zconf_umount_clients $CLIENTS $DIR +} +run_test 4b "fail MDS, normal operation, delayed open recovery" + +test_4c() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + replay_barrier $SINGLEMDS + do_node $CLIENT1 createmany -m $DIR/$tfile- 25 + do_node $CLIENT2 createmany -m $DIR/$tdir/$tfile-2- 25 + vbr_deactivate_client $CLIENT2 + + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 1 + + # create another set of files + do_node $CLIENT1 createmany -m $DIR/$tfile-3- 25 + + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 2 + + # All files from should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 3 + do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 4 + do_node $CLIENT2 unlinkmany $DIR/$tdir/$tfile-2- 25 || return 5 + + zconf_umount_clients $CLIENTS $DIR +} +run_test 4c "fail MDS, normal operation, delayed recovery" + +test_5a() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + replay_barrier $SINGLEMDS + do_node $CLIENT1 createmany -o $DIR/$tfile- 25 + do_node $CLIENT2 createmany -o $DIR/$tfile-2- 1 + do_node $CLIENT1 createmany -o $DIR/$tfile-3- 1 + vbr_deactivate_client $CLIENT2 + + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR && return 1 + + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 2 + + # First 25 files should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 3 + # Third file is failed due to missed client2 + do_node $CLIENT1 $CHECKSTAT $DIR/$tfile-3-0 && error "$tfile-3-0 exists" + # file from client2 should exists + do_node $CLIENT2 unlinkmany $DIR/$tfile-2- 1 || return 4 + + zconf_umount_clients $CLIENTS $DIR +} +run_test 5a "fail MDS, delayed recovery should fail" + +test_5b() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + replay_barrier $SINGLEMDS + do_node $CLIENT1 createmany -o $DIR/$tfile- 25 + do_node $CLIENT2 createmany -o $DIR/$tfile-2- 1 + vbr_deactivate_client $CLIENT2 + + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 1 + do_node $CLIENT1 $CHECKSTAT $DIR/$tfile-2-0 && error "$tfile-2-0 exists" + + # create another set of files + do_node $CLIENT1 createmany -o $DIR/$tfile-3- 25 + + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR && return 4 + # file from client2 should fail + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile-2-0 && error "$tfile-2-0 exists" + + # All 50 files from client 1 should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 2 + do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 3 + + zconf_umount_clients $CLIENTS $DIR +} +run_test 5b "fail MDS, normal operation, delayed recovery should fail" + +test_6a() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + do_node $CLIENT2 mkdir -p $DIR/$tdir + replay_barrier $SINGLEMDS + do_node $CLIENT1 createmany -o $DIR/$tfile- 25 + do_node $CLIENT2 createmany -o $DIR/$tdir/$tfile-2- 25 + do_node $CLIENT1 createmany -o $DIR/$tfile-3- 25 + vbr_deactivate_client $CLIENT2 + + facet_failover $SINGLEMDS + # replay only 5 requests + do_node $CLIENT2 "sysctl -w lustre.fail_val=5" +#define OBD_FAIL_PTLRPC_REPLAY 0x50e + do_node $CLIENT2 "sysctl -w lustre.fail_loc=0x2000050e" + do_node $CLIENT2 df $DIR + # vbr_activate_client $CLIENT2 + # need way to know that client stops replays + sleep 5 + + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 1 + + # All files should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 2 + do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 3 + do_node $CLIENT2 unlinkmany $DIR/$tdir/$tfile-2- 25 || return 5 + + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 6a "fail MDS, delayed recovery, fail MDS" + +test_7a() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + do_node $CLIENT2 mkdir -p $DIR/$tdir + replay_barrier $SINGLEMDS + do_node $CLIENT1 createmany -o $DIR/$tfile- 25 + do_node $CLIENT2 createmany -o $DIR/$tdir/$tfile-2- 25 + do_node $CLIENT1 createmany -o $DIR/$tfile-3- 25 + vbr_deactivate_client $CLIENT2 + + facet_failover $SINGLEMDS + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 4 + + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 1 + + # All files should have been replayed + do_node $CLIENT1 unlinkmany $DIR/$tfile- 25 || return 2 + do_node $CLIENT1 unlinkmany $DIR/$tfile-3- 25 || return 3 + do_node $CLIENT2 unlinkmany $DIR/$tdir/$tfile-2- 25 || return 5 + + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 7a "fail MDS, delayed recovery, fail MDS" + +rmultiop_start() { + local client=$1 + local file=$2 + + # We need to run do_node in bg, because pdsh does not exit + # if child process of run script exists. + # I.e. pdsh does not exit when runmultiop_bg_pause exited, + # because of multiop_bg_pause -> $MULTIOP_PROG & + # By the same reason we need sleep a bit after do_nodes starts + # to let runmultiop_bg_pause start muliop and + # update /tmp/multiop_bg.pid ; + # The rm /tmp/multiop_bg.pid guarantees here that + # we have the updated by runmultiop_bg_pause + # /tmp/multiop_bg.pid file + + local pid_file=$TMP/multiop_bg.pid.$$ + do_node $client "rm -f $pid_file && MULTIOP_PID_FILE=$pid_file LUSTRE= runmultiop_bg_pause $file O_tSc" & + local pid=$! + sleep 3 + local multiop_pid + multiop_pid=$(do_node $client cat $pid_file) + [ -n "$multiop_pid" ] || error "$client : Can not get multiop_pid from $pid_file " + eval export ${client}_multiop_pid=$multiop_pid + eval export ${client}_do_node_pid=$pid + local var=${client}_multiop_pid + echo client $client multiop_bg started multiop_pid=${!var} + return $? +} + +rmultiop_stop() { + local client=$1 + local multiop_pid=${client}_multiop_pid + local do_node_pid=${client}_do_node_pid + + echo "Stopping multiop_pid=${!multiop_pid} (kill ${!multiop_pid} on $client)" + do_node $client kill -USR1 ${!multiop_pid} + + wait ${!do_node_pid} || true +} + +test_8a() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + rmultiop_start $CLIENT2 $DIR/$tfile || return 1 + do_node $CLIENT2 rm -f $DIR/$tfile + replay_barrier $SINGLEMDS + rmultiop_stop $CLIENT2 || return 2 + + vbr_deactivate_client $CLIENT2 + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 3 + #client1 is back and will try to open orphan + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 4 + + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile && error "$tfile exists" + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 8a "orphans are kept until delayed recovery" + +test_8b() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + rmultiop_start $CLIENT2 $DIR/$tfile || return 1 + replay_barrier $SINGLEMDS + do_node $CLIENT1 rm -f $DIR/$tfile + + vbr_deactivate_client $CLIENT2 + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 2 + #client1 is back and will try to open orphan + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 3 + + rmultiop_stop $CLIENT2 || return 1 + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile && error "$tfile exists" + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 8b "open1 | unlink2 X delayed_replay1, close1" + +test_8c() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + rmultiop_start $CLIENT2 $DIR/$tfile || return 1 + replay_barrier $SINGLEMDS + do_node $CLIENT1 rm -f $DIR/$tfile + rmultiop_stop $CLIENT2 || return 2 + + vbr_deactivate_client $CLIENT2 + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 3 + #client1 is back and will try to open orphan + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 4 + + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile && error "$tfile exists" + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 8c "open1 | unlink2, close1 X delayed_replay1" + +test_8d() { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + remote_server $CLIENT2 || \ + { skip "Client $CLIENT2 is on the server node" && return 0; } + + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + rmultiop_start $CLIENT1 $DIR/$tfile || return 1 + rmultiop_start $CLIENT2 $DIR/$tfile || return 2 + replay_barrier $SINGLEMDS + do_node $CLIENT1 rm -f $DIR/$tfile + rmultiop_stop $CLIENT2 || return 3 + rmultiop_stop $CLIENT1 || return 4 + + vbr_deactivate_client $CLIENT2 + facet_failover $SINGLEMDS + do_node $CLIENT1 df $DIR || return 6 + + #client1 is back and will try to open orphan + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 8 + + do_node $CLIENT2 $CHECKSTAT $DIR/$tfile && error "$tfile exists" + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 8d "open1, open2 | unlink2, close1, close2 X delayed_replay1" + +test_8e() { + zconf_mount $CLIENT1 $DIR + zconf_mount $CLIENT2 $DIR + + do_node $CLIENT1 mcreate $DIR/$tfile + do_node $CLIENT1 mkdir $DIR/$tfile-2 + replay_barrier $SINGLEMDS + # missed replay from client1 will lead to recovery by versions + do_node $CLIENT1 touch $DIR/$tfile-2/$tfile + do_node $CLIENT2 rm $DIR/$tfile || return 1 + do_node $CLIENT2 touch $DIR/$tfile || return 2 + + zconf_umount $CLIENT1 $DIR + facet_failover $SINGLEMDS + do_node $CLIENT2 df $DIR || return 6 + + do_node $CLIENT2 rm $DIR/$tfile || error "$tfile doesn't exists" + zconf_umount_clients $CLIENTS $DIR + return 0 +} +run_test 8e "create | unlink, create shouldn't fail" + +test_8f() { + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + do_node $CLIENT1 touch $DIR/$tfile + do_node $CLIENT1 mkdir $DIR/$tfile-2 + replay_barrier $SINGLEMDS + # missed replay from client1 will lead to recovery by versions + do_node $CLIENT1 touch $DIR/$tfile-2/$tfile + do_node $CLIENT2 rm -f $DIR/$tfile || return 1 + do_node $CLIENT2 mcreate $DIR/$tfile || return 2 + + zconf_umount $CLIENT1 $DIR + facet_failover $SINGLEMDS + do_node $CLIENT2 df $DIR || return 6 + + do_node $CLIENT2 rm $DIR/$tfile || error "$tfile doesn't exists" + zconf_umount $CLIENT2 $DIR + return 0 +} +run_test 8f "create | unlink, create shouldn't fail" + +test_8g() { + zconf_mount_clients $CLIENT1 $DIR + zconf_mount_clients $CLIENT2 $DIR + + do_node $CLIENT1 touch $DIR/$tfile + do_node $CLIENT1 mkdir $DIR/$tfile-2 + replay_barrier $SINGLEMDS + # missed replay from client1 will lead to recovery by versions + do_node $CLIENT1 touch $DIR/$tfile-2/$tfile + do_node $CLIENT2 rm -f $DIR/$tfile || return 1 + do_node $CLIENT2 mkdir $DIR/$tfile || return 2 + + zconf_umount $CLIENT1 $DIR + facet_failover $SINGLEMDS + do_node $CLIENT2 df $DIR || return 6 + + do_node $CLIENT2 rmdir $DIR/$tfile || error "$tfile doesn't exists" + zconf_umount $CLIENT2 $DIR + return 0 +} +run_test 8g "create | unlink, create shouldn't fail" + +test_10 () { + delayed_recovery_enabled || { skip "No delayed recovery support"; return 0; } + + [ -z "$DBENCH_LIB" ] && skip "DBENCH_LIB is not set" && return 0 + + zconf_mount_clients $CLIENTS $DIR + + local duration="-t 60" + local cmd="rundbench 1 $duration " + local PID="" + for CLIENT in ${CLIENTS//,/ }; do + $PDSH $CLIENT "set -x; PATH=:$PATH:$LUSTRE/utils:$LUSTRE/tests/:${DBENCH_LIB} DBENCH_LIB=${DBENCH_LIB} $cmd" & + PID=$! + echo $PID >pid.$CLIENT + echo "Started load PID=`cat pid.$CLIENT`" + done + + replay_barrier $SINGLEMDS + sleep 3 # give clients a time to do operations + + vbr_deactivate_client $CLIENT2 + + log "$TESTNAME fail $SINGLEMDS 1" + fail $SINGLEMDS + +# wait for client to reconnect to MDS + sleep $TIMEOUT + + vbr_activate_client $CLIENT2 + do_node $CLIENT2 df $DIR || return 4 + + for CLIENT in ${CLIENTS//,/ }; do + PID=`cat pid.$CLIENT` + wait $PID + rc=$? + echo "load on ${CLIENT} returned $rc" + done + + zconf_umount_clients $CLIENTS $DIR +} +run_test 10 "mds version recovery; $CLIENTCOUNT clients" + +equals_msg `basename $0`: test complete, cleaning up +#SLEEP=$((`date +%s` - $NOW)) +#[ $SLEEP -lt $TIMEOUT ] && sleep $SLEEP +check_and_cleanup_lustre +[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && grep -q FAIL $TESTSUITELOG && exit 1 || true diff --git a/lustre/tests/run_dbench.sh b/lustre/tests/run_dbench.sh index 45cfceb..f1520e8 100755 --- a/lustre/tests/run_dbench.sh +++ b/lustre/tests/run_dbench.sh @@ -12,25 +12,13 @@ mkdir -p ${LOG%/*} rm -f $LOG $DEBUGLOG exec 2>$DEBUGLOG -if [ -z "$MOUNT" -o -z "$END_RUN_FILE" -o -z "$LOAD_PID_FILE" ]; then - echo "The following must be set: MOUNT END_RUN_FILE LOAD_PID_FILE" - exit 1 -fi +. $(dirname $0)/functions.sh -echoerr () { echo "$@" 1>&2 ; } - -signaled() { - trap 0 - echoerr "$(date +'%F %H:%M:%S'): client load was signaled to terminate" - kill $load_pid - kill -TERM -$PPID - sleep 5 - kill -KILL -$PPID -} +assert_env MOUNT END_RUN_FILE LOAD_PID_FILE trap signaled TERM -# recovery-mds-scale uses this to signal the client loads to die +# recovery-*-scale scripts use this to signal the client loads to die echo $$ >$LOAD_PID_FILE TESTDIR=$MOUNT/d0.dbench-$(hostname) diff --git a/lustre/tests/run_dd.sh b/lustre/tests/run_dd.sh index f4f1a54..d50150e 100755 --- a/lustre/tests/run_dd.sh +++ b/lustre/tests/run_dd.sh @@ -12,23 +12,13 @@ mkdir -p ${LOG%/*} rm -f $LOG $DEBUGLOG exec 2>$DEBUGLOG -if [ -z "$MOUNT" -o -z "$END_RUN_FILE" -o -z "$LOAD_PID_FILE" ]; then - echo "The following must be set: MOUNT END_RUN_FILE LOAD_PID_FILE" - exit 1 -fi +. $(dirname $0)/functions.sh -echoerr () { echo "$@" 1>&2 ; } - -signaled() { - echoerr "$(date +'%F %H:%M:%S'): client load was signaled to terminate" - kill -TERM -$PPID - sleep 5 - kill -KILL -$PPID -} +assert_env MOUNT END_RUN_FILE LOAD_PID_FILE trap signaled TERM -# recovery-mds-scale uses this to signal the client loads to die +# recovery-*-scale scripts use this to signal the client loads to die echo $$ >$LOAD_PID_FILE TESTDIR=$MOUNT/d0.dd-$(hostname) diff --git a/lustre/tests/run_iozone.sh b/lustre/tests/run_iozone.sh index 2d075d7..297142d 100755 --- a/lustre/tests/run_iozone.sh +++ b/lustre/tests/run_iozone.sh @@ -12,35 +12,17 @@ mkdir -p ${LOG%/*} rm -f $LOG $DEBUGLOG exec 2>$DEBUGLOG -if [ -z "$MOUNT" -o -z "$END_RUN_FILE" -o -z "$LOAD_PID_FILE" ]; then - echo "The following must be set: MOUNT END_RUN_FILE LOAD_PID_FILE" - exit 1 -fi +. $(dirname $0)/functions.sh -echoerr () { echo "$@" 1>&2 ; } - -signaled() { - echoerr "$(date +'%F %H:%M:%S'): client load was signaled to terminate" - kill -TERM -$PPID - sleep 5 - kill -KILL -$PPID -} +assert_env MOUNT END_RUN_FILE LOAD_PID_FILE trap signaled TERM -# recovery-mds-scale uses this to signal the client loads to die +# recovery-*-scale scripts use this to signal the client loads to die echo $$ >$LOAD_PID_FILE TESTDIR=$MOUNT/d0.iozone-$(hostname) -# needed to debug oom problem -#echo 1 > /proc/sys/vm/vm_gfp_debug -#killpids="" -#vmstat 1 1000000 >$TMP/iozone.vmstat.out & -#killpids="$killpids $!" -#$LUSTRE_TESTS/runvmstat > $TMP/iozone.runvmstat.out & -#killpids="$killpids $!" - CONTINUE=true while [ ! -e "$END_RUN_FILE" ] && $CONTINUE; do echoerr "$(date +'%F %H:%M:%S'): iozone run starting" @@ -72,6 +54,3 @@ while [ ! -e "$END_RUN_FILE" ] && $CONTINUE; do done echoerr "$(date +'%F %H:%M:%S'): iozone run exiting" -#kill $killpids -#sleep 5 -#kill -9 $killpids diff --git a/lustre/tests/run_tar.sh b/lustre/tests/run_tar.sh index 5f40e68..9005ac4 100755 --- a/lustre/tests/run_tar.sh +++ b/lustre/tests/run_tar.sh @@ -12,23 +12,13 @@ mkdir -p ${LOG%/*} rm -f $LOG $DEBUGLOG exec 2>$DEBUGLOG -if [ -z "$MOUNT" -o -z "$END_RUN_FILE" -o -z "$LOAD_PID_FILE" ]; then - echo "The following must be set: MOUNT END_RUN_FILE LOAD_PID_FILE" - exit 1 -fi +. $(dirname $0)/functions.sh -echoerr () { echo "$@" 1>&2 ; } - -signaled() { - echoerr "$(date +'%F %H:%M:%S'): client load was signaled to terminate" - kill -TERM -$PPID - sleep 5 - kill -KILL -$PPID -} +assert_env MOUNT END_RUN_FILE LOAD_PID_FILE trap signaled TERM -# recovery-mds-scale uses this to signal the client loads to die +# recovery-*-scale scripts use this to signal the client loads to die echo $$ >$LOAD_PID_FILE TESTDIR=$MOUNT/d0.tar-$(hostname) diff --git a/lustre/tests/runtests b/lustre/tests/runtests index 8080e31..50caa10 100755 --- a/lustre/tests/runtests +++ b/lustre/tests/runtests @@ -14,16 +14,6 @@ export NAME=${NAME:-local} init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh} -SETUP=${SETUP:-setupall} -FORMAT=${FORMAT:-formatall} -CLEANUP=${CLEANUP:-stopall} - -fail() { - echo "ERROR: $1" 1>&2 - [ $2 ] && RC=$2 || RC=1 - exit $RC -} - ERROR= RUNTESTS_SRC=${RUNTESTS_SRC:-"/etc /bin"} [ "$COUNT" ] || COUNT=1000 @@ -33,24 +23,7 @@ RUNTESTS_SRC=${RUNTESTS_SRC:-"/etc /bin"} [ "$MKDIRMANY" ] || MKDIRMANY="createmany -d" -while [ "$1" ]; do - case $1 in - *.xml) export NAME=`echo $1 | sed "s/.xml//"` ;; - *) OPTS="$OPTS $1" ;; - esac - shift -done - -MOUNTED=$(mounted_lustre_filesystems | head -1) -if [ -z "$MOUNTED" ]; then - formatall - setupall - MOUNTED="`mounted_lustre_filesystems`" - [ -z "$MOUNTED" ] && error "NAME=$NAME not mounted" - I_MOUNTED=yes -fi - -MOUNT=$MOUNTED +check_and_setup_lustre OSCTMP=`echo $MOUNT | tr "/" "."` USED=`df | awk "/$OSCTMP/ { print \\$3 }" | tail -n 1` @@ -59,7 +32,7 @@ USED=`expr $USED + 16` # Some space for the status file # let's start slowly here... START=`date +%s` log "touching $MOUNT at `date`" -touch $MOUNT || fail "can't touch $MOUNT" 2 +touch $MOUNT || error "can't touch $MOUNT" 2 HOSTS=$MOUNT/hosts.$$ TRUNCSIZE=123 @@ -68,18 +41,18 @@ if [ $COUNT -gt 10 -o $COUNT -eq 0 ]; then log "create an empty file $HOSTS" mcreate $HOSTS log "copying /etc/hosts to $HOSTS" - cp /etc/hosts $HOSTS || fail "can't cp /etc/hosts to $HOSTS" 3 + cp /etc/hosts $HOSTS || error "can't cp /etc/hosts to $HOSTS" 3 log "comparing /etc/hosts and $HOSTS" - diff -u /etc/hosts $HOSTS || fail "$HOSTS different" 4 + diff -u /etc/hosts $HOSTS || error "$HOSTS different" 4 log "renaming $HOSTS to $HOSTS.ren" - mv $HOSTS $HOSTS.ren || fail "can't rename $HOSTS to $HOSTS.ren" 5 + mv $HOSTS $HOSTS.ren || error "can't rename $HOSTS to $HOSTS.ren" 5 log "copying /etc/hosts to $HOSTS again" - cp /etc/hosts $HOSTS || fail "can't cp /etc/hosts to $HOSTS again" 6 + cp /etc/hosts $HOSTS || error "can't cp /etc/hosts to $HOSTS again" 6 log "truncating $HOSTS" - > $HOSTS || fail "can't truncate $HOSTS" 8 + > $HOSTS || error "can't truncate $HOSTS" 8 log "removing $HOSTS" - rm $HOSTS || fail "can't remove $HOSTS" 9 - cp /etc/hosts $HOSTS.2 || fail "can't cp /etc/hosts to $HOSTS.2" 7 + rm $HOSTS || error "can't remove $HOSTS" 9 + cp /etc/hosts $HOSTS.2 || error "can't cp /etc/hosts to $HOSTS.2" 7 log "truncating $HOSTS.2 to $TRUNCSIZE bytes" truncate $HOSTS.2 $TRUNCSIZE fi @@ -87,15 +60,15 @@ fi DST=$MOUNT/runtest.$$ # let's start slowly here... log "creating $DST" -mkdir $DST || fail "can't mkdir $DST" 10 +mkdir $DST || error "can't mkdir $DST" 10 # ok, that hopefully worked, so let's do a little more, with files that # haven't changed in the last day (hopefully they don't change during test) FILES=`find $RUNTESTS_SRC -type f -mtime +1 | head -n $COUNT` -[ -z "$FILES" ] && fail "No unchanged files - is $RUNTESTS_SRC a new dir?" +[ -z "$FILES" ] && error "No unchanged files - is $RUNTESTS_SRC a new dir?" log "copying files from $RUNTESTS_SRC to $DST$RUNTESTS_SRC at `date`" -tar cf - $FILES | tar xvf - -C $DST > /dev/null || fail "copying $RUNTESTS_SRC" 11 +tar cf - $FILES | tar xvf - -C $DST > /dev/null || error "copying $RUNTESTS_SRC" 11 log "comparing newly copied files at `date`" for f in $FILES; do @@ -103,11 +76,11 @@ for f in $FILES; do diff -q $f $DST/$f || ERROR=11 done -[ "$ERROR" ] && fail "old and new files are different" $ERROR +[ "$ERROR" ] && error "old and new files are different" $ERROR log "finished at `date` ($(($(date +%s) - START)))" -$CLEANUP || exit 19 -$SETUP || exit 20 +stopall || exit 19 +setupall || exit 20 log "comparing previously copied files" for f in $FILES; do @@ -115,32 +88,32 @@ for f in $FILES; do diff -q $f $DST/$f || ERROR=22 done -[ "$ERROR" ] && fail "old and new files are different on second diff" $ERROR +[ "$ERROR" ] && error "old and new files are different on second diff" $ERROR -$CLEANUP || exit 19 -$SETUP || exit 20 +stopall || exit 21 +setupall || exit 22 log "removing $DST" -rm -r $V $DST || fail "can't remove $DST" 37 +rm -r $V $DST || error "can't remove $DST" 37 if [ $COUNT -gt 10 -o $COUNT -eq 0 ]; then log "renaming $HOSTS.ren to $HOSTS" - mv $HOSTS.ren $HOSTS || fail "can't rename $HOSTS.ren to $HOSTS" 32 + mv $HOSTS.ren $HOSTS || error "can't rename $HOSTS.ren to $HOSTS" 32 log "truncating $HOSTS" - > $HOSTS || fail "can't truncate $HOSTS" 34 + > $HOSTS || error "can't truncate $HOSTS" 34 log "removing $HOSTS" - rm $HOSTS || fail "can't remove $HOSTS again" 36 + rm $HOSTS || error "can't remove $HOSTS again" 36 log "verifying $HOSTS.2 is $TRUNCSIZE bytes" checkstat -s $TRUNCSIZE $HOSTS.2 || \ - fail "$HOSTS.2 isn't $TRUNCSIZE bytes" 37 - rm $HOSTS.2 || fail "can't remove $HOSTS.2" 38 + error "$HOSTS.2 isn't $TRUNCSIZE bytes" 37 + rm $HOSTS.2 || error "can't remove $HOSTS.2" 38 fi # mkdirmany test (bug 589) log "running $MKDIRMANY $MOUNT/base$$ 100" -$MKDIRMANY $MOUNT/base$$ 100 || fail "mkdirmany failed" +$MKDIRMANY $MOUNT/base$$ 100 || error "mkdirmany failed" log "removing mkdirmany directories" -rmdir $MOUNT/base$$* || fail "mkdirmany cleanup failed" +rmdir $MOUNT/base$$* || error "mkdirmany cleanup failed" log "done" @@ -149,6 +122,4 @@ if [ `expr $NOWUSED - $USED` -gt 1024 ]; then echo "Space not all freed: now ${NOWUSED}kB, was ${USED}kB." 1>&2 fi -if [ "$I_MOUNTED" = "yes" ]; then - $CLEANUP -fi +check_and_cleanup_lustre diff --git a/lustre/tests/sanity-quota.sh b/lustre/tests/sanity-quota.sh index 9073678..248e123 100644 --- a/lustre/tests/sanity-quota.sh +++ b/lustre/tests/sanity-quota.sh @@ -41,6 +41,8 @@ IUNIT_SZ=${IUNIT_SZ:-10} # min inode quota unit MAX_DQ_TIME=604800 MAX_IQ_TIME=604800 +unset ENABLE_QUOTA + TRACE=${TRACE:-""} LUSTRE=${LUSTRE:-`dirname $0`/..} . $LUSTRE/tests/test-framework.sh @@ -171,9 +173,86 @@ run_test_with_stat() { # resetquota -g groupname resetquota() { - [ "$#" != 2 ] && error "resetquota: wrong number of arguments: $#" - [ "$1" != "-u" -a "$1" != "-g" ] && error "resetquota: wrong specifier $1 passed" - $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT || error "resetquota failed" + [ "$#" != 2 ] && error "resetquota: wrong number of arguments: $#" + [ "$1" != "-u" -a "$1" != "-g" ] && error "resetquota: wrong specifier $1 passed" + + count=0 + if at_is_valid && at_is_enabled; then + timeout=$(at_max_get mds) + else + timeout=$(lctl get_param -n timeout) + fi + + while [ $((count++)) -lt $timeout ]; do + $LFS setquota "$1" "$2" -b 0 -B 0 -i 0 -I 0 $MOUNT + RC=$? + if [ $RC -ne 0 ]; then + if [ $RC -eq 240 ]; then # 240 means -EBUSY + log "resetquota is blocked for quota master recovery, retry after 1 sec" + sleep 1 + continue + else + error "resetquota failed: $RC" + fi + fi + break + done + + [ $count -lt $timeout ] || error "resetquota timeout: $timeout" +} + +quota_scan() { + LOCAL_UG=$1 + LOCAL_ID=$2 + + if [ "$LOCAL_UG" == "a" -o "$LOCAL_UG" == "u" ]; then + log "Files for user ($LOCAL_ID):" + ($LFS find -user $LOCAL_ID $DIR | xargs stat 2>/dev/null) + fi + + if [ "$LOCAL_UG" == "a" -o "$LOCAL_UG" == "g" ]; then + log "Files for group ($LOCAL_ID):" + ($LFS find -group $LOCAL_ID $DIR | xargs stat 2>/dev/null) + fi +} + +quota_error() { + quota_scan $1 $2 + shift 2 + error "$*" +} + +quota_log() { + quota_scan $1 $2 + shift 2 + log "$*" +} + +quota_show_check() { + LOCAL_BF=$1 + LOCAL_UG=$2 + LOCAL_ID=$3 + PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`" + + $LFS quota -v -$LOCAL_UG $LOCAL_ID $DIR + + if [ "$LOCAL_BF" == "a" -o "$LOCAL_BF" == "b" ]; then + USAGE="`$LFS quota -$LOCAL_UG $LOCAL_ID $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $2 }'`" + if [ -z $USAGE ]; then + quota_error $LOCAL_UG $LOCAL_ID "System is error when query quota for block ($LOCAL_UG:$LOCAL_ID)." + else + [ $USAGE -ne 0 ] && quota_log $LOCAL_UG $LOCAL_ID "System is not clean for block ($LOCAL_UG:$LOCAL_ID:$USAGE)." + fi + fi + + if [ "$LOCAL_BF" == "a" -o "$LOCAL_BF" == "f" ]; then + USAGE="`$LFS quota -$LOCAL_UG $LOCAL_ID $DIR | awk '/^.*'$PATTERN'.*[[:digit:]+][[:space:]+]/ { print $5 }'`" + if [ -z $USAGE ]; then + quota_error $LOCAL_UG $LOCAL_ID "System is error when query quota for file ($LOCAL_UG:$LOCAL_ID)." + else + [ $USAGE -ne 0 ] && quota_log $LOCAL_UG $LOCAL_ID "System is not clean for file ($LOCAL_UG:$LOCAL_ID:$USAGE)." + fi + fi } quota_scan() { @@ -1194,17 +1273,6 @@ test_14a() { # was test_14 b=12223 -- setting quota on root } run_test_with_stat 14a "test setting quota on root ===" -# save quota version (both administrative and operational quotas) -quota_save_version() { - do_facet mgs "lctl conf_param ${FSNAME}-MDT*.mdd.quota_type=$1" - local varsvc - local osts=$(get_facets OST) - for ost in ${osts//,/ }; do - varsvc=${ost}_svc - do_facet mgs "lctl conf_param ${!varsvc}.ost.quota_type=$1" - done -} - test_15(){ LIMIT=$((24 * 1024 * 1024 * 1024 * 1024)) # 24 TB PATTERN="`echo $DIR | sed 's/\//\\\\\//g'`" @@ -1406,15 +1474,18 @@ test_18() { sleep 1 done log "(dd_pid=$DDPID, time=$count, timeout=$timeout)" + sync + cancel_lru_locks mdc + cancel_lru_locks osc testfile_size=$(stat -c %s $TESTFILE) [ $testfile_size -ne $((BLK_SZ * 1024 * 100)) ] && \ quota_error u $TSTUSR "expect $((BLK_SZ * 1024 * 100)), got ${testfile_size}. Verifying file failed!" - rm -f $TESTFILE - sync; sleep 3; sync; + $SHOW_QUOTA_USER + rm -f $TESTFILE + sync resetquota -u $TSTUSR - set_blk_unitsz $((128 * 1024)) set_blk_tunesz $((128 * 1024 / 2)) } @@ -1464,12 +1535,10 @@ test_18a() { log "(dd_pid=$DDPID, time=$count, timeout=$timeout)" lustre_fail mds 0 - rm -f $TESTFILE - sync; sleep 3; sync; + sync resetquota -u $TSTUSR - set_blk_unitsz $((128 * 1024)) set_blk_tunesz $((128 * 1024 / 2)) } @@ -1534,15 +1603,20 @@ test_18bc_sub() { sleep 1 done log "(dd_pid=$DDPID, time=$count, timeout=$timeout)" - sync; sleep 1; sync + sync + cancel_lru_locks mdc + cancel_lru_locks osc testfile_size=$(stat -c %s $TESTFILE) [ $testfile_size -ne $((BLK_SZ * 1024 * 100)) ] && \ quota_error u $TSTUSR "expect $((BLK_SZ * 1024 * 100)), got ${testfile_size}. Verifying file failed!" $SHOW_QUOTA_USER - resetquota -u $TSTUSR - rm -rf $TESTFILE - sync; sleep 1; sync + rm -f $TESTFILE + sync + + resetquota -u $TSTUSR + set_blk_unitsz $((128 * 1024)) + set_blk_tunesz $((128 * 1024 / 2)) } # test when mds does failover, the ost still could work well @@ -1721,18 +1795,13 @@ test_21() { run_test_with_stat 21 "run for fixing bug16053 ===========" test_22() { - local SAVEREFORMAT - - SAVEREFORMAT=$REFORMAT $LFS quotaoff -ug $DIR || error "could not turn quotas off" quota_save_version "ug" - REFORMAT="reformat" stopall mount setupall - REFORMAT=$SAVEREFORMAT echo "checking parameters" @@ -1780,15 +1849,15 @@ test_23_sub() { log " Step1: trigger quota with 0_DIRECT" log " Write half of file" $RUNAS $DIRECTIO write $TESTFILE 0 $(($LIMIT/1024/2)) $bs_unit || \ - (quota_error u $TSTUSR "(1) write failure, but expect success: $LIMIT" && test_23_dumppage 1) + quota_error u $TSTUSR "(1) write failure, but expect success: $LIMIT" log " Write out of block quota ..." $RUNAS $DIRECTIO write $TESTFILE $(($LIMIT/1024/2)) $(($LIMIT/1024/2)) $bs_unit && \ - quota_error u $TSTUSR "(2) write success, but expect EDQUOT: $LIMIT" && test_23_dumppage 2 + quota_error u $TSTUSR "(2) write success, but expect EDQUOT: $LIMIT" log " Step1: done" log " Step2: rewrite should succeed" - $RUNAS $DIRECTIO write $TESTFILE $(($LIMIT/1024/2)) 1 $bs_unit || \ - (quota_error u $TSTUSR "(3) write failure, but expect success: $LIMIT" && test_23_dumppage 3) + $RUNAS $DIRECTIO write $TESTFILE 0 1 $bs_unit || \ + quota_error u $TSTUSR "(3) write failure, but expect success: $LIMIT" log " Step2: done" rm -f $TESTFILE diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index f715a71..6f6d50e 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -473,6 +473,15 @@ test_17g() { } run_test 17g "symlinks: really long symlink name ===============================" +test_17h() { #bug 17378 + mkdir -p $DIR/$tdir + $SETSTRIPE $DIR/$tdir -c -1 +#define OBD_FAIL_MDS_LOV_PREP_CREATE 0x141 + do_facet mds lctl set_param fail_loc=0x80000141 + touch $DIR/$tdir/$tfile || true +} +run_test 17h "create objects: lov_free_memmd() doesn't lbug" + test_18() { touch $DIR/f ls $DIR || error @@ -633,7 +642,7 @@ test_24i() { mrename $DIR/R9/f $DIR/R9/a $CHECKSTAT -t file $DIR/R9/f || error $CHECKSTAT -t dir $DIR/R9/a || error - $CHECKSTAT -a file $DIR/R9/a/f || error + $CHECKSTAT -a $DIR/R9/a/f || error } run_test 24i "rename file to dir error: touch f ; mkdir a ; rename f a" @@ -854,7 +863,7 @@ test_27e() { $SETSTRIPE $DIR/d27/f12 -c 2 && error "lstripe succeeded twice" $CHECKSTAT -t file $DIR/d27/f12 || error "checkstat failed" } -run_test 27e "lstripe existing file (should return error) ======" +run_test 27e "setstripe existing file (should return error) ======" test_27f() { mkdir -p $DIR/d27 @@ -862,7 +871,7 @@ test_27f() { dd if=/dev/zero of=$DIR/d27/f12 bs=4k count=4 || error "dd failed" $GETSTRIPE $DIR/d27/fbad || error "lfs getstripe failed" } -run_test 27f "lstripe with bad stripe size (should return error)" +run_test 27f "setstripe with bad stripe size (should return error)" test_27g() { mkdir -p $DIR/d27 @@ -881,7 +890,7 @@ test_27j() { mkdir -p $DIR/d27 $SETSTRIPE $DIR/d27/f27j -i $OSTCOUNT && error "lstripe failed"||true } -run_test 27j "lstripe with bad stripe offset (should return error)" +run_test 27j "setstripe with bad stripe offset (should return error)" test_27k() { # bug 2844 mkdir -p $DIR/d27 @@ -1074,7 +1083,7 @@ test_27s() { # bug 10725 mkdir -p $DIR/$tdir local stripe_size=$((4096 * 1024 * 1024)) # 2^32 local stripe_count=0 - [ $OSTCOUNT -eq 1 ] || stripe_count=2 + [ $OSTCOUNT -eq 1 ] || stripe_count=2 $SETSTRIPE $DIR/$tdir -s $stripe_size -c $stripe_count && \ error "stripe width >= 2^32 succeeded" || true @@ -1158,7 +1167,7 @@ test_27w() { # bug 10997 } run_test 27w "check lfs setstripe -c -s -i options =============" -# createtest also checks that device nodes are created and +# createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 mkdir $DIR/d28 @@ -2094,7 +2103,7 @@ test_46() { } run_test 46 "dirtying a previously written page ================" -# test_47 is removed "Device nodes check" is moved to test_28 +# test_47 is removed "Device nodes check" is moved to test_28 test_48a() { # bug 2399 check_kernel_version 34 || return 0 @@ -3484,7 +3493,6 @@ test_77b() { # bug 10889 error "dd error: $?" lctl set_param fail_loc=0 set_checksums 0 - rm -f $DIR/f77b } run_test 77b "checksum error on client write ====================" @@ -3502,6 +3510,7 @@ test_77c() { # bug 10889 done set_checksums 0 set_checksum_type $ORIG_CSUM_TYPE + rm -f $DIR/f77b } run_test 77c "checksum error on client read ===================" @@ -4012,7 +4021,7 @@ test_102b() { echo "get/set/list trusted.lov xattr ..." [ "$OSTCOUNT" -lt "2" ] && skip "skipping 2-stripe test" && return local testfile=$DIR/$tfile - $SETSTRIPE $testfile -s 65536 -i 1 -c 2 + $SETSTRIPE -s 65536 -i 1 -c 2 $testfile || error "setstripe failed" getfattr -d -m "^trusted" $testfile 2> /dev/null | \ grep "trusted.lov" || error "can't get trusted.lov from $testfile" @@ -4039,7 +4048,7 @@ test_102c() { mkdir -p $DIR/$tdir chown $RUNAS_ID $DIR/$tdir local testfile=$DIR/$tdir/$tfile - $RUNAS $SETSTRIPE $testfile -s 65536 -i 1 -c 2 + $RUNAS $SETSTRIPE -s 65536 -i 1 -c 2 $testfile||error "setstripe failed" $RUNAS getfattr -d -m "^lustre" $testfile 2> /dev/null | \ grep "lustre.lov" || error "can't get lustre.lov from $testfile" @@ -4441,7 +4450,7 @@ test_116() { declare -i FILL FILL=$(($MINV / 4)) echo "Filling 25% remaining space in OST${MINI} with ${FILL}Kb" - $SETSTRIPE $DIR/$tdir/OST${MINI} -i $MINI -c 1 + $SETSTRIPE -i $MINI -c 1 $DIR/$tdir/OST${MINI}||error "setstripe failed" i=0 while [ $FILL -gt 0 ]; do i=$(($i + 1)) @@ -4900,7 +4909,7 @@ test_119b() # bug 11737 { [ "$OSTCOUNT" -lt "2" ] && skip "skipping 2-stripe test" && return - $SETSTRIPE $DIR/$tfile -c 2 + $SETSTRIPE -c 2 $DIR/$tfile || error "setstripe failed" dd if=/dev/zero of=$DIR/$tfile bs=1M count=1 seek=1 || error "dd failed" sync multiop $DIR/$tfile oO_RDONLY:O_DIRECT:r$((2048 * 1024)) || \ @@ -5181,7 +5190,7 @@ test_123a() { # was test 123, statahead(bug 11401) [ $delta -eq 0 ] && continue - if [ $((delta_sa * 100)) -gt $((delta * 105)) ]; then + if [ $((delta_sa * 100)) -gt $((delta * 105)) -a $delta_sa -gt $((delta + 2)) ]; then if [ $SLOWOK -eq 0 ]; then error "ls $i files is slower with statahead!" @@ -5190,25 +5199,25 @@ test_123a() { # was test 123, statahead(bug 11401) lctl get_param llite.*.statahead_max cancel_lru_locks mdc cancel_lru_locks osc - $LCTL dk > /dev/null + $LCTL clear stime=`date +%s` time ls -l $DIR/$tdir | wc -l etime=`date +%s` - $LCTL dk > $TMP/sanity_test_123a_${i}_disable_${etime}.log + $LCTL dk $TMP/lustre_${TESTSUITE}_${TESTNAME}_${i}_disable.$(etime) delta=$((etime - stime)) - log "ls $i files without statahead: $delta sec, dump to $TMP/sanity_test_123a_${i}_disable_${etime}.log" + log "ls $i files without statahead: $delta sec, dump to $TMP/lustre_${TESTSUITE}_${TESTNAME}_${i}_disable.$(etime)" lctl set_param llite.*.statahead_max=$max lctl get_param -n llite.*.statahead_max | grep '[0-9]' cancel_lru_locks mdc cancel_lru_locks osc - $LCTL dk > /dev/null + $LCTL clear stime=`date +%s` time ls -l $DIR/$tdir | wc -l etime=`date +%s` - $LCTL dk > $TMP/sanity_test_123a_${i}_enable_${etime}.log + $LCTL dk $TMP/lustre_${TESTSUITE}_${TESTNAME}_${i}_enable.$(etime) delta_sa=$((etime - stime)) - log "ls $i files with statahead: $delta_sa sec, dump to $TMP/sanity_test_123a_${i}_enable_${etime}.log" + log "ls $i files with statahead: $delta_sa sec, dump to $TMP/lustre_${TESTSUITE}_${TESTNAME}_${i}_enable.$(etime)" lctl get_param -n llite.*.statahead_stats else log "ls $i files is slower with statahead!" @@ -5218,7 +5227,7 @@ test_123a() { # was test 123, statahead(bug 11401) [ $delta -gt 20 ] && break [ $delta -gt 8 ] && MULT=$((50 / delta)) - [ "$SLOW" = "no" -a $delta -gt 3 ] && break + [ "$SLOW" = "no" -a $delta -gt 5 ] && break done log "ls done" @@ -5304,7 +5313,7 @@ test_124a() { log "LVF=$LVF" local OLD_LVF=`lctl get_param -n $NSDIR.pool.lock_volume_factor` lctl set_param -n $NSDIR.pool.lock_volume_factor $LVF - + # Let's make sure that we really have some margin. Client checks # cached locks every 10 sec. SLEEP=$((SLEEP+20)) @@ -5437,7 +5446,7 @@ test_126() { # bug 12829/13455 run_test 126 "check that the fsgid provided by the client is taken into account" test_127() { # bug 15521 - $LSTRIPE -i 0 -c 1 $DIR/$tfile + $SETSTRIPE -i 0 -c 1 $DIR/$tfile || error "setstripe failed" $LCTL set_param osc.*.stats=0 FSIZE=$((2048 * 1024)) dd if=/dev/zero of=$DIR/$tfile bs=$FSIZE count=1 @@ -6020,9 +6029,9 @@ test_160() { $LFS changelog $MDT0 | tail -5 echo "verifying changelog mask" - $LCTL set_param mdd.$MDT0.changelog_mask="-mkdir" + do_facet $SINGLEMDS lctl set_param mdd.$MDT0.changelog_mask="-mkdir" mkdir -p $DIR/$tdir/pics/2009/sofia - $LCTL set_param mdd.$MDT0.changelog_mask="+mkdir" + do_facet $SINGLEMDS lctl set_param mdd.$MDT0.changelog_mask="+mkdir" mkdir $DIR/$tdir/pics/2009/zachary DIRS=$($LFS changelog $MDT0 | tail -5 | grep -c MKDIR) [ $DIRS -eq 1 ] || err17935 "changelog mask count $DIRS != 1" @@ -6039,11 +6048,11 @@ test_160() { tail -1 | awk '{print $6}') fidf=$($LFS path2fid $DIR/$tdir/pics/zach) [ "$fidc" == "p=$fidf" ] || \ - err17935 "pfid in changelog $fidc != dir fid $fidf" + err17935 "pfid in changelog $fidc != dir fid $fidf" USER_REC1=$(do_facet $SINGLEMDS lctl get_param -n \ mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}') - $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5)) + $LFS changelog_clear $MDT0 $USER $(($USER_REC1 + 5)) USER_REC2=$(do_facet $SINGLEMDS lctl get_param -n \ mdd.$MDT0.changelog_users | grep $USER | awk '{print $2}') echo "verifying user clear: $(( $USER_REC1 + 5 )) == $USER_REC2" @@ -6118,7 +6127,7 @@ test_161() { echo -n "${links}/1000 links in link EA" [ ${links} -gt 60 ] || err17935 "expected at least 60 links in link EA" unlinkmany $DIR/$tdir/foo2/$longname 1000 || \ - error "failed to unlink many hardlinks" + error "failed to unlink many hardlinks" } run_test 161 "link ea sanity" @@ -6160,16 +6169,34 @@ test_162() { check_path "/$tdir/d2/p/q/r/hlink" ${mds1_svc} $FID --link 0 # check that there are 2 links ${LFS} fid2path ${mds1_svc} $FID | wc -l | grep -q 2 || \ - err17935 "expected 2 links" + err17935 "expected 2 links" rm $DIR/$tdir/d2/p/q/r/hlink check_path "/$tdir/d2/a/b/c/new_file" ${mds1_svc} $FID --link 0 - # Doesnt work with CMD yet: 17935 + # Doesnt work with CMD yet: 17935 return 0 } run_test 162 "path lookup sanity" +test_154() { + # do directio so as not to populate the page cache + log "creating a 10 Mb file" + multiop $DIR/$tfile oO_CREAT:O_DIRECT:O_RDWR:w$((10*1048576))c || error "multiop failed while creating a file" + log "starting reads" + dd if=$DIR/$tfile of=/dev/null bs=4096 & + log "truncating the file" + multiop $DIR/$tfile oO_TRUNC:c || error "multiop failed while truncating the file" + log "killing dd" + kill %+ || true # reads might have finished + echo "wait until dd is finished" + wait + log "removing the temporary file" + rm -rf $DIR/$tfile || error "tmp file removal failed" +} +run_test 154 "parallel read and truncate should not deadlock ===" + test_170() { + $LCTL clear # bug 18514 $LCTL debug_daemon start $TMP/${tfile}_log_good touch $DIR/$tfile $LCTL debug_daemon stop @@ -6180,40 +6207,40 @@ test_170() { rm -rf $DIR/$tfile $LCTL debug_daemon stop - $LCTL df $TMP/${tfile}_log_bad 2&> $TMP/${tfile}_log_bad.out || + $LCTL df $TMP/${tfile}_log_bad > $TMP/${tfile}_log_bad.out 2>&1 || error "lctl df log_bad failed" local bad_line=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}') local good_line1=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}') - $LCTL df $TMP/${tfile}_log_good 2&>$TMP/${tfile}_log_good.out + $LCTL df $TMP/${tfile}_log_good > $TMP/${tfile}_log_good.out 2>&1 local good_line2=$(tail -n 1 $TMP/${tfile}_log_good.out | awk '{print $5}') - [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] || + [ "$bad_line" ] && [ "$good_line1" ] && [ "$good_line2" ] || error "bad_line good_line1 good_line2 are empty" - + + cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt + cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt - cat $TMP/${tfile}_log_bad >> $TMP/${tfile}_logs_corrupt - cat $TMP/${tfile}_log_good >> $TMP/${tfile}_logs_corrupt - $LCTL df $TMP/${tfile}_logs_corrupt 2&> $TMP/${tfile}_log_bad.out + $LCTL df $TMP/${tfile}_logs_corrupt > $TMP/${tfile}_log_bad.out 2>&1 local bad_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $9}') local good_line_new=$(tail -n 1 $TMP/${tfile}_log_bad.out | awk '{print $5}') - [ "$bad_line_new" ] && [ "$good_line_new" ] || + [ "$bad_line_new" ] && [ "$good_line_new" ] || error "bad_line_new good_line_new are empty" - + local expected_good=$((good_line1 + good_line2*2)) - rm -rf $TMP/${tfile}* + rm -f $TMP/${tfile}* if [ $bad_line -ne $bad_line_new ]; then error "expected $bad_line bad lines, but got $bad_line_new" - return 1 + return 1 fi if [ $expected_good -ne $good_line_new ]; then error "expected $expected_good good lines, but got $good_line_new" - return 2 + return 2 fi true } @@ -6354,6 +6381,17 @@ test_212() { } run_test 212 "Sendfile test ============================================" +test_213() { + dd if=/dev/zero of=$DIR/$tfile bs=4k count=4 + cancel_lru_locks osc + lctl set_param fail_loc=0x8000040f + # generate a read lock + cat $DIR/$tfile > /dev/null + # write to the file, it will try to cancel the above read lock. + cat /etc/hosts >> $DIR/$tfile +} +run_test 213 "OSC lock completion and cancel race don't crash - bug 18829" + # # tests that do cleanup/setup should be run at the end # diff --git a/lustre/tests/sanityN.sh b/lustre/tests/sanityN.sh index 1dda830..ec17a49 100644 --- a/lustre/tests/sanityN.sh +++ b/lustre/tests/sanityN.sh @@ -3,8 +3,8 @@ set -e ONLY=${ONLY:-"$*"} -# bug number for skipped test: 3192 15528/3811 16929 9977 15528/11549 -ALWAYS_EXCEPT=" 14b 19 22 28 29 $SANITYN_EXCEPT" +# bug number for skipped test: 3192 15528/3811 16929 9977 15528/11549 18080 +ALWAYS_EXCEPT=" 14b 19 22 28 29 35 $SANITYN_EXCEPT" # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT! # bug number for skipped test: 12652 12652 @@ -427,7 +427,7 @@ test_22() { # Bug 9926 cat $DIR2/d21/no_joined || error "cat error" rm -rf $DIR2/d21/no_joined || error "unlink normal file error" } -run_test 22 " After joining in one dir, open/close unlink file in anther dir" +run_test 22 " After joining in one dir, open/close unlink file in anther dir" test_23() { # Bug 5972 echo "others should see updated atime while another read" > $DIR1/f23 @@ -507,8 +507,8 @@ test_26b() { chmod a+x $DIR2/$tfile mt1=`stat -c %Y $DIR1/$tfile` mt2=`stat -c %Y $DIR2/$tfile` - - if [ x"$mt1" != x"$mt2" ]; then + + if [ x"$mt1" != x"$mt2" ]; then error "not equal mtime, client1: "$mt1", client2: "$mt2"." fi } @@ -551,7 +551,7 @@ test_28() { # bug 9977 tECHOID=`$LCTL dl | grep $ECHO_UUID | awk '{print $1}'` $LCTL --device $tECHOID destroy "${tOBJID}:0" - + $LCTL <<-EOF cfg_device ECHO_osc1 cleanup @@ -678,7 +678,7 @@ test_32b() { # bug 11270 save_lustre_params $node "ldlm.namespaces.filter-*.contention_seconds" >> $p done clear_osc_stats - # agressive lockless i/o settings + # agressive lockless i/o settings for node in $(osts_nodes); do do_node $node 'lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes 2000000; lctl set_param -n ldlm.namespaces.filter-*.contended_locks 0; lctl set_param -n ldlm.namespaces.filter-*.contention_seconds 60' done @@ -687,7 +687,7 @@ test_32b() { # bug 11270 dd if=/dev/zero of=$DIR1/$tfile bs=4k count=1 conv=notrunc > /dev/null 2>&1 dd if=/dev/zero of=$DIR2/$tfile bs=4k count=1 conv=notrunc > /dev/null 2>&1 done - [ $(calc_osc_stats lockless_write_bytes) -ne 0 ] || error "lockless i/o was not triggered" + [ $(calc_osc_stats lockless_write_bytes) -ne 0 ] || error "lockless i/o was not triggered" # disable lockless i/o (it is disabled by default) for node in $(osts_nodes); do do_node $node 'lctl set_param -n ldlm.namespaces.filter-*.max_nolock_bytes 0; lctl set_param -n ldlm.namespaces.filter-*.contended_locks 32; lctl set_param -n ldlm.namespaces.filter-*.contention_seconds 0' @@ -701,7 +701,7 @@ test_32b() { # bug 11270 dd if=/dev/zero of=$DIR2/$tfile bs=4k count=1 conv=notrunc > /dev/null 2>&1 done [ $(calc_osc_stats lockless_write_bytes) -eq 0 ] || - error "lockless i/o works when disabled" + error "lockless i/o works when disabled" rm -f $DIR1/$tfile restore_lustre_params <$p rm -f $p @@ -710,7 +710,7 @@ run_test 32b "lockless i/o" print_jbd_stat () { local dev=$(basename $(do_facet $SINGLEMDS lctl get_param -n osd.*MDT*.mntdev)) - do_facet $SINGLEMDS cat /proc/fs/jbd/$dev/info | head -1 + do_facet $SINGLEMDS cat /proc/fs/jbd/$dev/info | head -1 } do_and_time () { @@ -753,12 +753,12 @@ test_33a() { do_nodes $CLIENT1,$CLIENT2 "mkdir -p $DIR1/$tdir-\\\$(hostname)-$i" - jbdold=$(print_jbd_stat) + jbdold=$(print_jbd_stat) echo "=== START createmany $jbdold" do_and_time "do_nodes $CLIENT1,$CLIENT2 createmany -o $DIR1/$tdir-\\\$(hostname)-$i/f- -r $DIR2/$tdir-\\\$(hostname)-$i/f- $nfiles" jbdnew=$(print_jbd_stat) jbd=$((`echo $jbdnew | cut -d" " -f1` - `echo $jbdold | cut -d" " -f1`)) - echo "=== END createmany $jbdnew : $jbd transactions nfiles $nfiles time $ELAPSED COS=$COS" + echo "=== END createmany $jbdnew : $jbd transactions nfiles $nfiles time $ELAPSED COS=$COS" avgjbd=$(( avgjbd + jbd )) avgtime=$(( avgtime + ELAPSED )) done @@ -767,7 +767,7 @@ test_33a() { done echo "COS=0 transactions (avg): $cos0_jbd time (avg): $cos0_time" - echo "COS=1 transactions (avg): $cos1_jbd time (avg): $cos1_time" + echo "COS=1 transactions (avg): $cos1_jbd time (avg): $cos1_time" [ "$cos0_jbd" != 0 ] && echo "COS=1 vs COS=0 jbd: $((((cos1_jbd/cos0_jbd - 1)) * 100 )) %" [ "$cos0_time" != 0 ] && echo "COS=1 vs COS=0 time: $((((cos1_time/cos0_time - 1)) * 100 )) %" @@ -807,7 +807,7 @@ test_34() { #16129 # wait for a lock timeout sleep 4 lock_out=$(do_nodes $(osts_nodes) "lctl get_param -n ldlm.namespaces.filter-*.lock_timeouts" | calc_sum) - if [ $OPER == "timeout" ] ; then + if [ $OPER == "timeout" ] ; then if [ $lock_in == $lock_out ]; then error "no lock timeout happened" else @@ -851,11 +851,11 @@ test_35() { # bug 17645 createmany -o $MOUNT2/$tfile/a 4000 & pid1=$! sleep 1 - + # Let's make conflict and bl_ast ls -la $MOUNT1/$tfile > /dev/null & pid2=$! - + log "Wait for $pid1 $pid2 for $timeout sec..." sleep $timeout kill -9 $pid1 $pid2 > /dev/null 2>&1 @@ -882,27 +882,36 @@ run_test 35 "-EINTR cp_ast vs. bl_ast race does not evict client" test_36() { #bug 16417 local SIZE - mkdir -p $MOUNT1/$tdir - lfs setstripe -c -1 $MOUNT1/$tdir + local SIZE_B + local i + + mkdir -p $DIR1/$tdir + $LFS setstripe -c -1 $DIR1/$tdir i=0 - SIZE=100 + SIZE=50 + let SIZE_B=SIZE*1024*1024 while [ $i -le 10 ]; do - lctl mark "start test" - before=$($LFS df | awk '{if ($1 ~/^filesystem/) {print $5; exit} }') - dd if=/dev/zero of=$MOUNT1/$tdir/file000 bs=1M count=$SIZE - dd if=$MOUNT2/$tdir/file000 of=/dev/null bs=1M count=$SIZE & - read_pid=$! - sleep 0.1 - rm -f $MOUNT1/$tdir/file000 - wait $read_pid - after=$($LFS df | awk '{if ($1 ~/^filesystem/) {print $5; exit} }') - if [ $before -gt $after ]; then - error "space leaked" - exit; - fi - let i=i+1 - done + lctl mark "start test" + local before=$($LFS df | awk '{if ($1 ~/^filesystem/) {print $5; exit} }') + dd if=/dev/zero of=$DIR1/$tdir/file000 bs=1M count=$SIZE + sync + local after_dd=$($LFS df | awk '{if ($1 ~/^filesystem/) {print $5; exit} }') + multiop_bg_pause $DIR2/$tdir/file000 O_r${SIZE_B}c || return 3 + read_pid=$! + rm -f $DIR1/$tdir/file000 + kill -USR1 $read_pid + wait $read_pid + sleep 1 + local after=$($LFS df | awk '{if ($1 ~/^filesystem/) {print $5; exit} }') + echo "*** cycle($i) *** before($before):after_dd($after_dd):after($after)" + # this free space! not used + if [ $after_dd -ge $after ]; then + error "space leaked" + return 1; + fi + let i=i+1 + done } run_test 36 "handle ESTALE/open-unlink corectly" diff --git a/lustre/tests/test-framework.sh b/lustre/tests/test-framework.sh index 4c57d60..d212432 100644 --- a/lustre/tests/test-framework.sh +++ b/lustre/tests/test-framework.sh @@ -18,17 +18,8 @@ export IDENTITY_UPCALL=default #export PDSH="pdsh -S -Rssh -w" -# eg, assert_env LUSTRE MDSNODES OSTNODES CLIENTS -assert_env() { - local failed="" - for name in $@; do - if [ -z "${!name}" ]; then - echo "$0: $name must be set" - failed=1 - fi - done - [ $failed ] && exit 1 || true -} +# function used by scripts run on remote nodes +. $(dirname $0)/functions.sh assert_DIR () { local failed="" @@ -520,6 +511,83 @@ stop() { wait_exit_ST ${facet} } +# save quota version (both administrative and operational quotas) +quota_save_version() { + local fsname=${2:-$FSNAME} + do_facet mgs "lctl conf_param ${fsname}-MDT*.mdd.quota_type=$1" + local varsvc + local osts=$(get_facets OST) + for ost in ${osts//,/ }; do + varsvc=${ost}_svc + do_facet mgs "lctl conf_param ${!varsvc}.ost.quota_type=$1" + done +} + +# client could mount several lustre +quota_type () { + local fsname=${1:-$FSNAME} + local rc=0 + do_facet mgs lctl get_param mdd.${fsname}-MDT*.quota_type || rc=$? + do_nodes $(comma_list $(osts_nodes)) \ + lctl get_param obdfilter.${fsname}-OST*.quota_type || rc=$? + return $rc +} + +restore_quota_type () { + local mntpt=${1:-$MOUNT} + local quota_type=$(quota_type $FSNAME | grep MDT | cut -d "=" -f2) + if [ ! "$old_QUOTA_TYPE" ] || [ "$quota_type" = "$old_QUOTA_TYPE" ]; then + return + fi + $LFS quotaoff $mntpt + quota_save_version $old_QUOTA_TYPE + $LFS quotacheck -ug $mntpt +} + +setup_quota(){ + local mntpt=$1 + + # We need: + # 1. run quotacheck only if quota is off + # 2. save the original quota_type params, restore them after testing + + # Suppose that quota type the same on mds and ost + local quota_type=$(quota_type | grep MDT | cut -d "=" -f2) + [ ${PIPESTATUS[0]} -eq 0 ] || error "quota_type failed!" + if [ "$quota_type" != "$QUOTA_TYPE" ]; then + export old_QUOTA_TYPE=$quota_type + quota_save_version $QUOTA_TYPE + $LFS quotacheck -ug $mntpt + fi + + local quota_usrs=$QUOTA_USERS + + # get_filesystem_size + local disksz=$(lfs df $mntpt | grep "filesystem summary:" | awk '{print $3}') + local blk_soft=$((disksz + 1024)) + local blk_hard=$((blk_soft + blk_soft / 20)) # Go 5% over + + local Inodes=$(lfs df -i $mntpt | grep "filesystem summary:" | awk '{print $3}') + local i_soft=$Inodes + local i_hard=$((i_soft + i_soft / 20)) + + echo "Total disk size: $disksz block-softlimit: $blk_soft block-hardlimit: + $blk_hard inode-softlimit: $i_soft inode-hardlimit: $i_hard" + + local cmd + for usr in $quota_usrs; do + echo "Setting up quota on $client:$mntpt for $usr..." + for type in u g; do + cmd="$LFS setquota -$type $usr -b $blk_soft -B $blk_hard -i $i_soft -I $i_hard $mntpt" + echo "+ $cmd" + eval $cmd || error "$cmd FAILED!" + done + # display the quota status + echo "Quota settings for $usr : " + $LFS quota -v -u $usr $mntpt || true + done +} + zconf_mount() { local OPTIONS local client=$1 @@ -572,6 +640,62 @@ zconf_umount() { fi } +# nodes is comma list +sanity_mount_check_nodes () { + local nodes=$1 + shift + local mnts="$@" + local mnt + + # FIXME: assume that all cluster nodes run the same os + [ "$(uname)" = Linux ] || return 0 + + local rc=0 + for mnt in $mnts ; do + do_nodes $nodes "set -x; running=\\\$(grep -c $mnt' ' /proc/mounts); +mpts=\\\$(mount | grep -w -c $mnt); +if [ \\\$running -ne \\\$mpts ]; then + echo \\\$(hostname) env are INSANE!; + exit 1; +fi" + [ $? -eq 0 ] || rc=1 + done + return $rc +} + +sanity_mount_check_servers () { + echo Checking servers environments + + # FIXME: modify get_facets to display all facets wo params + local facets="$(get_facets OST),$(get_facets MDS)" + local node + local mnt + local facet + for facet in ${facets//,/ }; do + node=$(facet_host ${facet}) + mnt=${MOUNT%/*}/${facet} + sanity_mount_check_nodes $node $mnt || + { error "server $node environments are insane!"; return 1; } + done +} + +sanity_mount_check_clients () { + local clients=${1:-$CLIENTS} + local mntpt=${2:-$MOUNT} + local mntpt2=${3:-$MOUNT2} + + [ -z $clients ] && clients=$(hostname) + echo Checking clients $clients environments + + sanity_mount_check_nodes $clients $mntpt $mntpt2 || + error "clients environments are insane!" +} + +sanity_mount_check () { + sanity_mount_check_servers || return 1 + sanity_mount_check_clients || return 2 +} + # mount clients if not mouted zconf_mount_clients() { local OPTIONS @@ -590,10 +714,19 @@ zconf_mount_clients() { fi echo "Starting client $clients: $OPTIONS $device $mnt" - do_nodes $clients "mount | grep $mnt || { mkdir -p $mnt && mount -t lustre $OPTIONS $device $mnt || false; }" + + do_nodes $clients "set -x; +running=\\\$(mount | grep -c $mnt' '); +rc=0; +if [ \\\$running -eq 0 ] ; then + mkdir -p $mnt; + mount -t lustre $OPTIONS $device $mnt; + rc=$?; +fi; +exit $rc" echo "Started clients $clients: " - do_nodes $clients "mount | grep $mnt" + do_nodes $clients "mount | grep -w $mnt" do_nodes $clients "lctl set_param debug=$PTLDEBUG; lctl set_param subsystem_debug=${SUBSYSTEM# }; @@ -610,20 +743,20 @@ zconf_umount_clients() { [ "$3" ] && force=-f echo "Stopping clients: $clients $mnt (opts:$force)" - do_nodes $clients "set -x; running=\\\$(grep -c $mnt' ' /proc/mounts) + do_nodes $clients "set -x; running=\\\$(grep -c $mnt' ' /proc/mounts); if [ \\\$running -ne 0 ] ; then -echo Stopping client \\\$(hostname) client $mnt opts:$force -lsof -t $mnt || need_kill=no +echo Stopping client \\\$(hostname) client $mnt opts:$force; +lsof -t $mnt || need_kill=no; if [ "x$force" != "x" -a "x\\\$need_kill" != "xno" ]; then pids=\\\$(lsof -t $mnt | sort -u); if [ -n \\\"\\\$pids\\\" ]; then - kill -9 \\\$pids + kill -9 \\\$pids; fi -fi -busy=\\\$(umount $force $mnt 2>&1 | grep -c "busy") +fi; +busy=\\\$(umount $force $mnt 2>&1 | grep -c "busy"); if [ \\\$busy -ne 0 ] ; then - echo "$mnt is still busy, wait one second" && sleep 1 - umount $force $mnt + echo "$mnt is still busy, wait one second" && sleep 1; + umount $force $mnt; fi fi" } @@ -708,7 +841,7 @@ start_client_load() { } start_client_loads () { - local clients=(${1//,/ }) + local -a clients=(${1//,/ }) local numloads=${#CLIENT_LOADS[@]} local testnum @@ -938,6 +1071,7 @@ wait_remote_prog () { local pids=$(ps uax | grep "$PDSH.*$prog.*$MOUNT" | grep -v grep | awk '{print $2}') [ -z "$pids" ] && return 0 echo "$PDSH processes still exists after $WAIT seconds. Still running: $pids" + # FIXME: not portable for pid in $pids; do cat /proc/${pid}/status || true cat /proc/${pid}/wchan || true @@ -1275,14 +1409,11 @@ stopall() { fail mds1 fi - # assume client mount is local - grep " $MOUNT " /proc/mounts && zconf_umount $HOSTNAME $MOUNT $* - grep " $MOUNT2 " /proc/mounts && zconf_umount $HOSTNAME $MOUNT2 $* + local clients=$CLIENTS + [ -z $clients ] && clients=$(hostname) - if [ -n "$CLIENTS" ]; then - zconf_umount_clients $CLIENTS $MOUNT "$*" || true - [ -n "$MOUNT2" ] && zconf_umount_clients $CLIENTS $MOUNT2 "$*" || true - fi + zconf_umount_clients $clients $MOUNT "$*" || true + [ -n "$MOUNT2" ] && zconf_umount_clients $clients $MOUNT2 "$*" || true [ "$CLIENTONLY" ] && return # The add fn does rm ${facet}active file, this would be enough @@ -1424,6 +1555,9 @@ writeconf_all () { } setupall() { + sanity_mount_check || + error "environments are insane!" + load_modules init_gss if [ -z "$CLIENTONLY" ]; then @@ -1518,10 +1652,14 @@ init_facet_vars () { init_facets_vars () { local DEVNAME - for num in `seq $MDSCOUNT`; do - DEVNAME=`mdsdevname $num` - init_facet_vars mds$num $DEVNAME $MDS_MOUNT_OPTS - done + if ! remote_mds_nodsh; then + for num in `seq $MDSCOUNT`; do + DEVNAME=`mdsdevname $num` + init_facet_vars mds$num $DEVNAME $MDS_MOUNT_OPTS + done + fi + + remote_ost_nodsh && return for num in `seq $OSTCOUNT`; do DEVNAME=`ostdevname $num` @@ -1530,12 +1668,20 @@ init_facets_vars () { } init_param_vars () { - export MDSVER=$(do_facet $SINGLEMDS "lctl get_param version" | cut -d. -f1,2) - export OSTVER=$(do_facet ost1 "lctl get_param version" | cut -d. -f1,2) - export CLIVER=$(lctl get_param version | cut -d. -f 1,2) + if ! remote_ost_nodsh && ! remote_mds_nodsh; then + export MDSVER=$(do_facet $SINGLEMDS "lctl get_param version" | cut -d. -f1,2) + export OSTVER=$(do_facet ost1 "lctl get_param version" | cut -d. -f1,2) + export CLIVER=$(lctl get_param version | cut -d. -f 1,2) + fi + + remote_mds_nodsh || + TIMEOUT=$(do_facet $SINGLEMDS "lctl get_param -n timeout") - TIMEOUT=$(do_facet $SINGLEMDS "lctl get_param -n timeout") log "Using TIMEOUT=$TIMEOUT" + + if [ "$ENABLE_QUOTA" ]; then + setup_quota $MOUNT || return 2 + fi } check_config () { @@ -1554,6 +1700,18 @@ check_config () { error "Bad config file: lustre is mounted with mgs $mgshost, but mgs_HOST=$mgs_HOST, NETTYPE=$NETTYPE Please use correct config or set mds_HOST correctly!" fi + + sanity_mount_check || + error "environments are insane!" +} + +check_timeout () { + local mdstimeout=$(do_facet $SINGLEMDS "lctl get_param -n timeout") + local cltimeout=$(lctl get_param -n timeout) + if [ $mdstimeout -ne $TIMEOUT ] || [ $mdstimeout -ne $cltimeout ]; then + error "timeouts are wrong! mds: $mdstimeout, client: $cltimeout, TIMEOUT=$TIMEOUT" + return 1 + fi } check_timeout () { @@ -1597,6 +1755,7 @@ cleanup_and_setup_lustre() { check_and_cleanup_lustre() { if [ "`mount | grep $MOUNT`" ]; then [ -n "$DIR" ] && rm -rf $DIR/[Rdfs][0-9]* + [ "$ENABLE_QUOTA" ] && restore_quota_type || true fi if [ "$I_MOUNTED" = "yes" ]; then cleanupall -f || error "cleanup failed" @@ -2013,7 +2172,7 @@ log() { lsmod | grep lnet > /dev/null || load_modules local MSG="$*" - # Get rif of ' + # Get rid of ' MSG=${MSG//\'/\\\'} MSG=${MSG//\(/\\\(} MSG=${MSG//\)/\\\)} @@ -2066,7 +2225,7 @@ run_one() { umask 0022 local BEFORE=`date +%s` - log "== test $testnum: $message ============ `date +%H:%M:%S` ($BEFORE)" + log "== test $testnum: $message == `date +%H:%M:%S` ($BEFORE)" #check_mds export TESTNAME=test_$testnum TEST_FAILED=false @@ -2269,7 +2428,7 @@ get_random_entry () { rnodes=${rnodes//,/ } - local nodes=($rnodes) + local -a nodes=($rnodes) local num=${#nodes[@]} local i=$((RANDOM * num * 2 / 65536)) @@ -2413,6 +2572,7 @@ calc_sum () { } calc_osc_kbytes () { + df $MOUNT > /dev/null $LCTL get_param -n osc.*[oO][sS][cC][-_][0-9a-f]*.$1 | calc_sum } @@ -2489,6 +2649,8 @@ get_mds_dir () { mpi_run () { local mpirun="$MPIRUN $MPIRUN_OPTIONS" local command="$mpirun $@" + local mpilog=$TMP/mpi.log + local rc if [ "$MPI_USER" != root -a $mpirun ]; then echo "+ chmod 0777 $MOUNT" @@ -2498,7 +2660,23 @@ mpi_run () { ls -ald $MOUNT echo "+ $command" - eval $command + eval $command 2>&1 > $mpilog || true + + rc=${PIPESTATUS[0]} + if [ $rc -eq 0 ] && grep -q "p4_error: : [^0]" $mpilog ; then + rc=1 + fi + cat $mpilog + return $rc +} + +mdsrate_cleanup () { + mpi_run -np $1 -machinefile $2 ${MDSRATE} --unlink --nfiles $3 --dir $4 --filefmt $5 $6 +} + +delayed_recovery_enabled () { + local var=${SINGLEMDS}_svc + do_facet $SINGLEMDS lctl get_param -n mdd.${!var}.stale_export_age > /dev/null 2>&1 } mdsrate_cleanup () { diff --git a/lustre/tests/write_append_truncate.1 b/lustre/tests/write_append_truncate.1 new file mode 100644 index 0000000..4006f98 --- /dev/null +++ b/lustre/tests/write_append_truncate.1 @@ -0,0 +1,109 @@ +.\" Copyright 2008 Sun Microsystems, Inc. All rights reserved +.\" Use is subject to license terms. +.\" +.\" Author: Andreas Dilger +.TH write_append_truncate 1 "Oct 29, 2008" Lustre "utilities" +.SH NAME +write_append_truncate \- MPI test of concurrent file operation coherency +.SH SYNOPSIS +.B write_append_truncate +.RB [ -a +.IR append_max ] +.RB [ -C ] +.RB [ -n +.IR nloops ] +.RB [ -s +.IR seed ] +.RB [ -t +.IR trunc_max ] +.RB [ -T ] +.RB [ -w +.IR write_max ] +.RB [ -W ] +.I filename +.I ... +.SH DESCRIPTION +The +.B write_append_truncate +program does data coherency testing for parallel filesystem using +.BR mpi (7) +to launch and co-ordinate processes. It runs multiple parallel +processes on one or more nodes, as specified to +.BR mpirun (1), +.BR pdsh (1), +or other MPI job launcher, each operating on the same shared file. +.sp +The master process creates +.I filename +if it does not exist +.I +For each of the +.I num_loops +test iterations one process truncates the file to zero size and writes +a random number of check bytes, +.BR W +between 1 and +.I write_max +to +.IR filename . +.sp +Other processes wait on an MPI barrier until +this is complete. One of the processes is chosen, to do an append +.RB ( write (2) +with +.BR O_APPEND ) of +a random size, +.BR A , +between 1 and +.I append_max +bytes to the end of the file. A second process does a concurrent +.BR truncate (2) +operation on the file to a random size, +.BR W + T , +between 1 and +.I trunc_max +bytes beyond the end of the initial +.B W +bytes data. This truncate will either extend the file size if it is +done before the append, or it will truncate the file if it is done +after the append. +.sp +A second MPI barrier ensures both of the processes have completed +their respective operations, and then the master process reads the entire +file and verifies the contents. +.sp +The beginning of the file is verified to contain the +.B W +check bytes up to the offset it was initially filled to. +.br +If the file size is equal to the truncated size, +.BR W + T , +then the truncate operation was done +.I after +the append and the data beyond the initial write offset +.BR W +to the end of file +.BR W + T +should contain the +.B A +bytes of append check data, and possibly a zero-filled hole at the +end of the file if +.B T +is larger than +.BR A . +.sp +Otherwise, the truncate operation was done +.I before +the append and the data beyond the initial write offset +.B W +to the truncate offset +.BR W + T +should be a zero-filled hole. Beyond the hole to the end of file +there should be +.B A +bytes of append check data. The total file size should be +.BR W " + " T " + " A . +.LP +.SH SEE ALSO +.BR mpirun (1) +.BR pdsh (1) diff --git a/lustre/tests/write_append_truncate.c b/lustre/tests/write_append_truncate.c index 24f9043..bae9ba4 100644 --- a/lustre/tests/write_append_truncate.c +++ b/lustre/tests/write_append_truncate.c @@ -37,13 +37,13 @@ * * Each loop does 3 things: * - truncate file to zero (not via ftruncate though, to test O_APPEND) - * - append a "chunk" of data (should be at file offset 0 after truncate) + * - write a "chunk" of data (should be at file offset 0 after truncate) * - on each of two threads either append or truncate-up the file * * If the truncate happened first, we should have a hole in the file. * If the append happened first, we should have truncated the file down. * - * We pick the CHUNK_SIZE_MAX and APPEND_SIZE_MAX so that we cross a stripe. + * WRITE_SIZE_MAX and APPEND_SIZE_MAX are large enough to cross a stripe. * * compile: mpicc -g -Wall -o write_append_truncate write_append_truncate.c * run: mpirun -np 2 -machlist write_append_truncate @@ -58,62 +58,98 @@ #include #include #include +#include #include #include +#include #include "mpi.h" -#define DEFAULT_ITER 50000 +#define DEFAULT_ITER 10000 -#define CHUNK_SIZE_MAX 123456 -#define CHUNK_CHAR 'C' +#define WRITE_SIZE_MAX 1234567 +#define APPEND_SIZE_MAX 1234567 +#define TRUNC_SIZE_MAX 1234567 -#define APPEND_SIZE_MAX 123456 -#define APPEND_CHAR 'A' - -#define TRUNC_SIZE_MAX (CHUNK_SIZE_MAX+APPEND_SIZE_MAX) +#define STATUS_FMT "WR %c %7d/%#08x, AP %c %7d/%#08x, TR@ %7d/%#08x" #define HOSTNAME_SIZE 50 +char hostname[HOSTNAME_SIZE]; +#define FNAMES_MAX 256 void usage(char *prog) { - printf("usage: %s [nloops]\n", prog); - printf("%s must be run with at least 2 processes\n", prog); + printf("usage: %s [-a append_max] [-C] [-n nloops] [-s seed]\n" + "\t\t[-t trunc_max] [-T] [-v] [-w write_max] ...\n", prog); + printf("\t-a append_max: maximum size of append, default %u bytes\n", + APPEND_SIZE_MAX); + printf("\t-C: 'classic' checks (on file 0)\n"); + printf("\t-n nloops: count of loops to run, default %u\n",DEFAULT_ITER); + printf("\t-s seed: random seed to use, default {current time}\n"); + printf("\t-t trunc_max: maximum size of truncate, default %u bytes\n", + TRUNC_SIZE_MAX); + printf("\t-T: 'classic' truncates (on file 0)\n"); + printf("\t-w write_max: maximum size of write, default %u bytes\n", + WRITE_SIZE_MAX); + printf("\t-W: 'classic' writes (on rank 0, file 0)\n"); + printf("\t-v: run in verbose mode (repeat for more verbosity)\n"); + printf("\tfilename for each mountpoint of same filesystem on a node\n"); + printf("\b%s must be run with at least 2 processes\n", prog); MPI_Finalize(); exit(1); } /* Print process rank, loop count, message, and exit (i.e. a fatal error) */ -void rprintf(int rank, int loop, const char *fmt, ...) +void rprintf(int rank, int loop, int error, const char *fmt, ...) +__attribute__ ((format (printf, 4, 5))); + +void rprintf(int rank, int loop, int error, const char *fmt, ...) { va_list ap; - printf("rank %d, loop %d: ", rank, loop); + printf("r=%2u", rank); + if (loop >= 0) + printf(" l=%04u", loop); + if (error != 0) + printf(" %s", hostname); + printf(": "); va_start(ap, fmt); vprintf(fmt, ap); - MPI_Abort(MPI_COMM_WORLD, -1); + if (error != 0) + MPI_Abort(MPI_COMM_WORLD, error); } int main(int argc, char *argv[]) { - int n, nloops = 0, fd; - int rank, size, ret; - int chunk_size, append_size, trunc_offset; - char append_buf[APPEND_SIZE_MAX]; - char chunk_buf[CHUNK_SIZE_MAX]; - char read_buf[TRUNC_SIZE_MAX+APPEND_SIZE_MAX]; - char trunc_buf[TRUNC_SIZE_MAX]; + int n, nloops = DEFAULT_ITER; + int nfnames = 0, ifnames, fd; + int rank = -1, nproc, ret; + unsigned write_max = WRITE_SIZE_MAX; + unsigned append_max = APPEND_SIZE_MAX; + unsigned write_size = 0, append_size = 0, trunc_size = 0; + unsigned trunc_max = 0, trunc_offset = 0; + char *append_buf; + char *write_buf; + char *read_buf = NULL; + char *trunc_buf = NULL; + int seed = time(0); int done; int error; - char hostname[HOSTNAME_SIZE]; - char *fname, *prog; + int verbose = 0; + int classic_check = 0, classic_trunc = 0, classic_write = 0; + char write_char = 'A', append_char = 'a'; + char *fnames[FNAMES_MAX], *end; + char *prog = "write_append_truncate"; + int c; error = MPI_Init(&argc, &argv); if (error != MPI_SUCCESS) - rprintf(-1, -1, "MPI_Init failed: %d\n", error); + printf("%s: MPI_Init failed: %d\n", prog, error); + else if (verbose > 2) + printf("%s: MPI_Init succeeded\n", prog); prog = strrchr(argv[0], '/'); if (prog == NULL) @@ -121,199 +157,399 @@ int main(int argc, char *argv[]) else prog++; - if (argc < 2 || argc > 3) + while ((c = getopt(argc, argv, "a:cCn:s:t:Tvw:W")) != -1) { + switch(c) { + case 'a': + append_max = strtoul(optarg, &end, 0); + if (append_max == 0 || *end) { + fprintf(stderr, "%s: bad append option '%s'\n", + prog, optarg); + usage(prog); + } + break; + case 'C': + classic_check++; + break; + case 'n': + nloops = strtoul(optarg, &end, 0); + if (nloops == 0 || *end) { + fprintf(stderr, "%s: bad nloops option '%s'\n", + prog, optarg); + usage(prog); + } + break; + case 's': + seed = strtoul(optarg, &end, 0); + if (*end) { + fprintf(stderr, "%s: bad seed option '%s'\n", + prog, optarg); + usage(prog); + } + break; + case 't': + trunc_max = strtoul(optarg, &end, 0); + if (*end) { + fprintf(stderr,"%s: bad truncate option '%s'\n", + prog, optarg); + usage(prog); + } + break; + case 'T': + classic_trunc++; + break; + case 'v': + verbose++; + break; + case 'w': + write_max = strtoul(optarg, &end, 0); + if (write_max == 0 || *end) { + fprintf(stderr, "%s: bad write option '%s'\n", + prog, optarg); + usage(prog); + } + break; + case 'W': + classic_write++; + break; + default: + fprintf(stderr, "%s: unknown option '%c'\n", prog, c); + usage(prog); + } + } + + srand(seed); + + if (argc == optind) { + fprintf(stderr, "%s: missing filename argument\n", prog); + usage(prog); + } + + if (argc > optind + FNAMES_MAX) { + fprintf(stderr, "%s: too many extra options\n", prog); usage(prog); + } + + while (optind < argc) + fnames[nfnames++] = argv[optind++]; error = MPI_Comm_rank(MPI_COMM_WORLD, &rank); - if (error != MPI_SUCCESS) - rprintf(-1, -1, "MPI_Comm_rank failed: %d\n", error); + if (verbose > 2 || error != MPI_SUCCESS) + rprintf(rank, -1, error != MPI_SUCCESS, "MPI_Comm_rank: %d\n", + error); - error = MPI_Comm_size(MPI_COMM_WORLD, &size); - if (error != MPI_SUCCESS) - rprintf(rank, -1, "MPI_Comm_size failed: %d\n", error); + error = MPI_Comm_size(MPI_COMM_WORLD, &nproc); + if (verbose > 2 || error != MPI_SUCCESS) + rprintf(rank, -1, error != MPI_SUCCESS, "MPI_Comm_size: %d\n", + error); - if (size < 2) - rprintf(rank, -1, "%s: must run with at least 2 processes\n", + if (nproc < 2) + rprintf(rank, -1, 1, "%s: must run with at least 2 processes\n", prog); - memset(append_buf, APPEND_CHAR, APPEND_SIZE_MAX); - memset(chunk_buf, CHUNK_CHAR, CHUNK_SIZE_MAX); - memset(trunc_buf, 0, TRUNC_SIZE_MAX); + append_buf = malloc(append_max); + if (append_buf == NULL) + rprintf(rank, -1, 1,"%s: error allocating append_buf %u\n", + prog, append_max); - if (gethostname(hostname, HOSTNAME_SIZE) < 0) - rprintf(rank, -1, "gethostname failed: %s\n", strerror(errno)); - - fname = argv[1]; + write_buf = malloc(write_max); + if (write_buf == NULL) + rprintf(rank, -1, 1, "%s: error allocating write_buf %u\n", + prog, write_max); - if (argc == 3) - nloops = strtoul(argv[2], NULL, 0); - if (nloops == 0) - nloops = DEFAULT_ITER; + if (gethostname(hostname, HOSTNAME_SIZE) < 0) + rprintf(rank, -1, 1, "%s: gethostname failed: %s\n", + prog, strerror(errno)); if (rank == 0) { - fd = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666); - if (fd < 0) - rprintf(0, -1, "create %s failed: %s\n", fname, - strerror(errno)); - printf("using %s\n", fname); + int max_size = write_max + (trunc_max ?: append_max)+append_max; + + fd = open(fnames[0], O_WRONLY|O_CREAT|O_TRUNC, 0666); + rprintf(rank,-1, fd<0, "create %s, max size: %u, seed %u: %s\n", + fnames[0], max_size, seed, strerror(errno)); + close(fd); + + trunc_buf = calloc(1, trunc_max ?: append_max); + if (trunc_buf == NULL) + rprintf(rank,-1,1,"%s: error allocating trunc_buf %u\n", + prog, trunc_max ?: append_max); + + /* initial write + truncate up + append */ + read_buf = malloc(max_size); + if (read_buf == NULL) + rprintf(rank,-1,1,"%s: error allocating read_buf %u\n", + prog, max_size); } + error = MPI_Barrier(MPI_COMM_WORLD); - if (error != MPI_SUCCESS) - rprintf(rank, -1, "prep MPI_Barrier failed: %d\n", error); + if (verbose > 2 || error != MPI_SUCCESS) + rprintf(rank, -1, error != MPI_SUCCESS, + "prep MPI_Barrier: %d\n", error); - fd = open(fname, O_RDWR | O_APPEND); - if (fd < 0) - rprintf(rank, -1, "open %s failed: %s\n",fname,strerror(errno)); + ifnames = rank % nfnames; + fd = open(fnames[ifnames], O_RDWR | O_APPEND); + if (verbose || fd < 0) + rprintf(rank, -1, errno, "open '%s' (%u): %s\n", + fnames[ifnames], ifnames, strerror(errno)); for (n = 0; n < nloops; n++) { + /* Initialized only to quiet stupid GCC warnings */ + unsigned write_rank = 0, append_rank = n, trunc_rank = n + 1; + unsigned mpi_shared_vars[6]; + /* reset the environment */ - chunk_size = (rand()%(CHUNK_SIZE_MAX-1))+1; - append_size = (rand()%(APPEND_SIZE_MAX-1))+1; - trunc_offset = chunk_size + rand()%append_size; + write_char = 'A' + (n % 26); + append_char = 'a' + (n % 26); + if (rank == 0) { - if (n % 1000 == 0) - printf("loop %5d: chunk %6d/%#07x, " - "append %6d/%#07x, trunc @ %6d/%#07x\n", - n, chunk_size, chunk_size, append_size, - append_size, trunc_offset, trunc_offset); - - ret = truncate(fname, (off_t)0); - if (ret < 0) - rprintf(0, n, "truncate @ 0: %s\n", + write_size = (rand() % (write_max - 1)) + 1; + append_size = (rand() % (append_max - 1)) + 1; + trunc_size = (rand() % ((trunc_max?: append_size)-1))+1; + trunc_offset = write_size + trunc_size; + + if (verbose || n % 1000 == 0) + rprintf(rank, n, 0, STATUS_FMT"\n", + write_char, write_size, write_size, + append_char, append_size, append_size, + trunc_offset, trunc_offset); + + write_rank = (classic_write ? 0 : rand()) % nproc; + do { + append_rank = (classic_write ? n : rand()) % + nproc; + /* We can't allow the append rank be the same + * as the classic_trunc trunc_rank, or we will + * spin here forever. */ + } while (append_rank == (n + 1) % nproc); + do { + trunc_rank = (classic_trunc? (n + 1) : rand()) % + nproc; + } while (trunc_rank == append_rank); + + mpi_shared_vars[0] = write_size; + mpi_shared_vars[1] = append_size; + mpi_shared_vars[2] = trunc_size; + mpi_shared_vars[3] = write_rank; + mpi_shared_vars[4] = append_rank; + mpi_shared_vars[5] = trunc_rank; + } + + error = MPI_Bcast(&mpi_shared_vars, 6, + MPI_INT, 0, MPI_COMM_WORLD); + if (verbose > 2 || error != MPI_SUCCESS) + rprintf(rank, n, error != MPI_SUCCESS, + "MPI_Bcast mpi_shared_vars" + "[%u, %u, %u, %u, %u, %u]: %d\n", + mpi_shared_vars[0], mpi_shared_vars[1], + mpi_shared_vars[2], mpi_shared_vars[3], + mpi_shared_vars[4], mpi_shared_vars[5], error); + + if (rank != 0) { + write_size = mpi_shared_vars[0]; + append_size = mpi_shared_vars[1]; + trunc_size = mpi_shared_vars[2]; + write_rank = mpi_shared_vars[3]; + append_rank = mpi_shared_vars[4]; + trunc_rank = mpi_shared_vars[5]; + + trunc_offset = write_size + trunc_size; + } + + if (rank == write_rank || rank == 0) + memset(write_buf, write_char, write_max); + + if (rank == write_rank) { + ifnames = (classic_write ? 0 : rand()) % nfnames; + ret = truncate(fnames[ifnames], 0); + if (verbose > 1 || ret != 0) + rprintf(rank, n, ret, + "initial truncate %s (%u) @ 0: %s\n", + fnames[ifnames], ifnames, strerror(errno)); + done = 0; do { - ret = write(fd, chunk_buf+done,chunk_size-done); - if (ret <= 0) { - rprintf(0, n, "chunk @ %d: %s\n", - done, strerror(errno)); - break; + ret = write(fd, write_buf+done,write_size-done); + if (verbose > 1 || ret <= 0) { + rprintf(rank, n, ret <= 0, + "write %d/%d @ %d: %s\n", + ret + done, write_size, done, + strerror(errno)); + if (ret <= 0) + break; } done += ret; - } while (done != chunk_size); + } while (done != write_size); } + if (rank == append_rank || rank == 0) + memset(append_buf, append_char, append_size); + error = MPI_Barrier(MPI_COMM_WORLD); - if (error != MPI_SUCCESS) - rprintf(rank, n, "start MPI_Barrier: %d\n",error); + if (verbose > 2 || error != MPI_SUCCESS) + rprintf(rank, n, error != MPI_SUCCESS, + "start MPI_Barrier: %d\n", error); /* Do the race */ - if (rank == n % size) { - // + if (rank == append_rank) { done = 0; do { ret = write(fd, append_buf + done, append_size - done); if (ret < 0) { - rprintf(rank, n, - "loop %d: append @ %u: %s\n", - done, strerror(errno)); + rprintf(rank, n, ret < 0, + "append %u/%u: %s\n", + ret + done, append_size, + strerror(errno)); break; + } else if (verbose > 1 || ret != append_size) { + rprintf(rank, n, ret != append_size, + "append %u/%u\n", + ret + done, append_size); } done += ret; } while (done != append_size); - } else if (rank == (n + 1) % size) { - ret = truncate(fname, (off_t)trunc_offset); - if (ret != 0) - rprintf(rank, n, "truncate @ %u: %s\n", - trunc_offset, strerror(errno) ); + } else if (rank == trunc_rank) { + /* XXX: truncating the same file descriptor as the + * append on a single node causes this test + * to fail currently (2009-02-01). */ + ifnames = (classic_trunc ? rank : rand()) % nfnames; + ret = truncate(fnames[ifnames], trunc_offset); + if (verbose > 1 || ret != 0) + rprintf(rank, n, ret, + "truncate %s (%u) @ %u: %s\n", + fnames[ifnames], ifnames, + trunc_offset, strerror(errno)); } error = MPI_Barrier(MPI_COMM_WORLD); - if (error != MPI_SUCCESS) - rprintf(rank, n, "end MPI_Barrier: %d\n", error); + if (verbose > 2 || error != MPI_SUCCESS) + rprintf(rank, n, error != MPI_SUCCESS, + "end MPI_Barrier: %d\n", error); error = 0; /* Check the result */ if (rank == 0) { - struct stat st; - if (stat(fname, &st) < 0) - rprintf(0, n, "loop %d: stat %s: %s\n", - fname, strerror(errno)); - - if (lseek(fd, (off_t)0, SEEK_SET) != 0) - rprintf(0, n, "lseek fname 0: %s\n", fname, + char *tmp_buf; + struct stat st = { 0 }; + + ifnames = classic_check ? 0 : (rand() % nfnames); + ret = stat(fnames[ifnames], &st); + if (verbose > 1 || ret != 0) + rprintf(rank, n, ret, + "stat %s (%u) size %llu: %s\n", + fnames[ifnames], ifnames, + (long long)st.st_size, strerror(errno)); + + ret = lseek(fd, 0, SEEK_SET); + if (ret != 0) + rprintf(rank, n, ret, "lseek 0: %s\n", strerror(errno)); done = 0; do { ret = read(fd, read_buf+done, st.st_size-done); - if (ret < 0) { - rprintf(0, n, "read @ %u: %s\n", - done, strerror(errno)); + if (verbose > 1 || ret <= 0) { + rprintf(rank, n, ret <= 0, + "read %d/%llu @ %u: %s\n", + ret, (long long)st.st_size-done, + done, ret != 0 ? + strerror(errno) : "short read"); } done += ret; } while (done != st.st_size); - if (memcmp(read_buf, chunk_buf, chunk_size)) { - printf("loop %d: base chunk bad" - " [0-%d]/[0-%#x] != %c\n", n, - chunk_size - 1, chunk_size - 1, - CHUNK_CHAR); + if (memcmp(read_buf, write_buf, write_size)) { + rprintf(rank, n, 0, "WRITE bad " + "[0-%d]/[0-%#x] != %c\n", + write_size - 1, write_size - 1, + write_char); error = 1; } + tmp_buf = read_buf + write_size; + if (st.st_size == trunc_offset) { /* Check case 1: first append then truncate */ - error = memcmp(read_buf+chunk_size, append_buf, - trunc_offset - chunk_size); - if (error) { - printf("loop %d: trunc-after-append bad" - " [%d-%d]/[%#x-%#x] != %c\n", - n, chunk_size, trunc_offset - 1, - chunk_size, trunc_offset - 1, - APPEND_CHAR); + int tmp_size, tmp_offset; + + tmp_size = trunc_size < append_size ? + trunc_size : append_size; + tmp_offset = write_size + tmp_size; + + if (memcmp(tmp_buf, append_buf, tmp_size)) { + rprintf(rank, n, 0,"trunc-after-APPEND " + "bad [%d-%d]/[%#x-%#x] != %c\n", + write_size, tmp_offset - 1, + write_size, tmp_offset - 1, + append_char); + error = 1; + } else if (trunc_size > append_size && + memcmp(tmp_buf+append_size,trunc_buf, + trunc_size - append_size)) { + rprintf(rank, n, 0,"TRUNC-after-append " + "bad [%d-%d]/[%#x-%#x] != 0\n", + tmp_offset, trunc_offset - 1, + tmp_offset, trunc_offset - 1); + error = 1; } } else { + int expected_size = trunc_offset + append_size; /* Check case 2: first truncate then append */ - if (memcmp(read_buf+chunk_size, trunc_buf, - trunc_offset-chunk_size)) { - printf("loop %d: append-after-TRUNC bad" - " [%d-%d]/[%#x-%#x] != 0\n", - n, chunk_size, trunc_offset - 1, - chunk_size, trunc_offset - 1); + if (st.st_size != expected_size) { + rprintf(rank, n, 0,"APPEND-after-trunc " + "bad file size %llu != %u\n", + (long long)st.st_size, + expected_size); error = 1; - } else if (memcmp(read_buf+trunc_offset, + } + + if (memcmp(tmp_buf, trunc_buf, trunc_size)) { + rprintf(rank, n, 0,"append-after-TRUNC " + "bad [%d-%d]/[%#x-%#x] != 0\n", + write_size, trunc_offset - 1, + write_size, trunc_offset - 1); + error = 1; + } else if (memcmp(read_buf + trunc_offset, append_buf, append_size)) { - printf("loop %d: APPEND-after-trunc bad" - " [%d-%d]/[%#x-%#x] != %c\n", - n, trunc_offset, append_size - 1, - trunc_offset, append_size - 1, - APPEND_CHAR); + rprintf(rank, n, 0,"APPEND-after-trunc " + "bad [%d-%d]/[%#x-%#x] != %c\n", + trunc_offset, expected_size - 1, + trunc_offset, expected_size - 1, + append_char); error = 1; } } - } - ret = MPI_Bcast(&error, 1, MPI_INT, 0, MPI_COMM_WORLD); - if (ret != MPI_SUCCESS) - rprintf(rank, n, "MPI_Bcast: %d\n"); - if (error == 1) { - if (rank == 0) { + if (error == 1) { char command[4096]; - printf("loop %5d: chunk %6d/%#07x, " - "append %6d/%#07x, trunc @ %6d/%#07x\n", - n, chunk_size, chunk_size, append_size, - append_size, trunc_offset, trunc_offset); + rprintf(rank, n, 0, STATUS_FMT"\n", + write_char, write_size, write_size, + append_char, append_size, append_size, + trunc_offset, trunc_offset); - sprintf(command, "od -Ax -a %s", fname); + sprintf(command, "od -Ax -a %s", fnames[0]); system(command); + MPI_Abort(MPI_COMM_WORLD, 1); } - rprintf(rank, n, "on machine %s with pid %d\n", - hostname, (int)getpid()); } } - printf("rank %d, loop %d: finished\n", rank, n); + if (rank == 0 || verbose) + printf("r=%2u n=%4u: "STATUS_FMT"\nPASS\n", rank, n - 1, + write_char, write_size, write_size, + append_char, append_size, append_size, + trunc_offset, trunc_offset); + close(fd); if (rank == 0) { - error = unlink(fname); - if (error < 0) - rprintf(0, n, "unlink %s failed: %s\n", - fname, strerror(errno)); + ifnames = rand() % nfnames; + ret = unlink(fnames[ifnames]); + if (ret != 0) + printf("%s: unlink %s failed: %s\n", + prog, fnames[ifnames], strerror(errno)); } MPI_Finalize(); diff --git a/lustre/utils/Makefile.am b/lustre/utils/Makefile.am index 51b9803..6b4f57c 100644 --- a/lustre/utils/Makefile.am +++ b/lustre/utils/Makefile.am @@ -21,7 +21,7 @@ EXTRA_PROGRAMS = wirecheck rootsbin_PROGRAMS = mount.lustre sbin_PROGRAMS = mkfs.lustre tunefs.lustre lctl wiretest \ l_getidentity llverfs llverdev \ - llog_reader lr_reader + llog_reader lr_reader lshowmount if LIBPTHREAD sbin_PROGRAMS += loadgen endif @@ -44,6 +44,8 @@ loadgen_SOURCES = loadgen.c lustre_cfg.c obd.c loadgen_LDADD := $(LIBREADLINE) liblustreapi.a $(LIBPTLCTL) $(PTHREAD_LIBS) loadgen_DEPENDENCIES := $(LIBPTLCTL) +lshowmount_SOURCES = lshowmount.c nidlist.c nidlist.h + if EXT2FS_DEVEL EXT2FSLIB = -lext2fs E2PLIB = -le2p diff --git a/lustre/utils/lshowmount.c b/lustre/utils/lshowmount.c new file mode 100644 index 0000000..920bebb --- /dev/null +++ b/lustre/utils/lshowmount.c @@ -0,0 +1,225 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/utils/lshowmount.h + * + * Author: Herb Wartens + * Author: Jim Garlick + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "nidlist.h" + +#define PROC_DIRS { \ + "/proc/fs/lustre/mgs", \ + "/proc/fs/lustre/mdt", \ + "/proc/fs/lustre/obdfilter", \ + NULL, \ +} +#define PROC_EXPORTS_TMPL "%s/%s/exports" +#define PROC_UUID_TMPL "%s/%s/uuid" + +static void print_nids(NIDList nidlist, int lookup, int enumerate, int indent); +static int lshowmount(int lookup, int enumerate, int verbose); +static void read_exports(char *exports, NIDList nidlist); + +char *prog; + +#define OPTIONS "ehlv" +static struct option long_options[] = { + {"enumerate", no_argument, 0, 'e'}, + {"help", no_argument, 0, 'h'}, + {"lookup", no_argument, 0, 'l'}, + {"verbose", no_argument, 0, 'v'}, + {0, 0, 0, 0}, +}; + +static void usage(void) +{ + fprintf(stderr, "usage: %s [-e] [-h] [-l] [-v]\n", prog); + exit(1); +} + +int main(int argc, char **argv) +{ + int opt, optidx = 0; + int lopt = 0; + int vopt = 0; + int eopt = 0; + + prog = basename(argv[0]); + + while ((opt = getopt_long(argc, argv, OPTIONS, long_options, &optidx)) != -1) { + switch (opt) { + case 'e': /* --enumerate */ + eopt = 1; + break; + case 'l': /* --lookup */ + lopt = 1; + break; + case 'v': /* --verbose */ + vopt = 1; + break; + case 'h': /* --help */ + default: + usage(); + } + } + + if (lshowmount(lopt, eopt, vopt) == 0) { + fprintf(stderr, "%s: lustre server modules not loaded\n", prog); + exit(1); + } + exit(0); +} + +static void print_nids(NIDList nidlist, int lookup, int enumerate, int indent) +{ + char *s, *sep = "\n", *pfx = ""; + + if (lookup) + nl_lookup_ip(nidlist); + nl_sort(nidlist); + nl_uniq(nidlist); + if (nl_count(nidlist) > 0) { + if (indent) { + sep = "\n "; + pfx = " "; + } + if (enumerate) + s = nl_string(nidlist, sep); + else + s = nl_xstring(nidlist, sep); + printf("%s%s\n", pfx, s); + free(s); + } +} + +static int lshowmount(int lookup, int enumerate, int verbose) +{ + char *dirs[] = PROC_DIRS; + char exp[PATH_MAX + 1]; + NIDList nidlist = NULL; + DIR *topdirp; + struct dirent *dp; + int i; + int opens = 0; + + if (!verbose) + nidlist = nl_create(); + for (i = 0; dirs[i] != NULL; i++) { + if ((topdirp = opendir(dirs[i])) == NULL) + continue; + while ((dp = readdir(topdirp))) { + if (dp->d_type != DT_DIR) + continue; + if (!strcmp(dp->d_name, ".")) + continue; + if (!strcmp(dp->d_name, "..")) + continue; + sprintf(exp, PROC_EXPORTS_TMPL, dirs[i], dp->d_name); + if (verbose) { + nidlist = nl_create(); + read_exports(exp, nidlist); + printf("%s:\n", dp->d_name); + print_nids(nidlist, lookup, enumerate, 1); + nl_destroy(nidlist); + } else + read_exports(exp, nidlist); + } + closedir(topdirp); + opens++; + } + if (!verbose) { + print_nids(nidlist, lookup, enumerate, 0); + nl_destroy(nidlist); + } + return opens; +} + +static int empty_proc_file(char *path) +{ + int empty = 0; + char buf[36]; + int fd; + + if ((fd = open(path, O_RDONLY)) < 0 || read(fd, buf, sizeof(buf)) <= 0) + empty = 1; + if (fd >= 0) + close(fd); + return empty; +} + +static void read_exports(char *exports, NIDList nidlist) +{ + DIR *dirp; + struct dirent *dp; + char path[PATH_MAX + 1]; + + if ((dirp = opendir(exports))) { + while ((dp = readdir(dirp))) { + if (dp->d_type != DT_DIR) + continue; + if (!strcmp(dp->d_name, ".")) + continue; + if (!strcmp(dp->d_name, "..")) + continue; + if (strchr(dp->d_name, '@') == NULL) + continue; + sprintf(path, PROC_UUID_TMPL, exports, dp->d_name); + if (empty_proc_file(path)) + continue; + + nl_add(nidlist, dp->d_name); + } + closedir(dirp); + } +} diff --git a/lustre/utils/mkfs_lustre.c b/lustre/utils/mkfs_lustre.c index a77e131..e9fd85a 100644 --- a/lustre/utils/mkfs_lustre.c +++ b/lustre/utils/mkfs_lustre.c @@ -612,7 +612,7 @@ int make_lustre_backfs(struct mkfs_opts *mop) if (journal_sz > 1024L) journal_sz = 1024L; /* man mkfs.ext3 */ - max_sz = (256000 * L_BLOCK_SIZE) >> 20; /* 1GB */ + max_sz = (102400 * L_BLOCK_SIZE) >> 20; /* 400MB */ if (journal_sz > max_sz) journal_sz = max_sz; if (journal_sz) { diff --git a/lustre/utils/nidlist.c b/lustre/utils/nidlist.c new file mode 100644 index 0000000..fb0cbec --- /dev/null +++ b/lustre/utils/nidlist.c @@ -0,0 +1,334 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/utils/nidlist.c + * + * Author: Jim Garlick + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "nidlist.h" + +struct nl_struct { + char **nids; + int len; + int count; +}; +#define NL_CHUNK 64 + +extern char *prog; + +static void nl_oom(void) +{ + fprintf(stderr, "%s: out of memory\n", prog); + exit(1); +} + +NIDList nl_create(void) +{ + struct nl_struct *nl; + + if (!(nl = malloc(sizeof(struct nl_struct)))) + nl_oom(); + nl->len = NL_CHUNK; + if (!(nl->nids = malloc(nl->len * sizeof(char *)))) + nl_oom(); + nl->count = 0; + + return nl; +} + +void nl_destroy(NIDList nl) +{ + int i; + + for (i = 0; i < nl->count; i++) + free(nl->nids[i]); + free(nl->nids); + free(nl); +} + +static void nl_grow(NIDList nl, int n) +{ + nl->len += n; + if (!(nl->nids = realloc(nl->nids, nl->len * sizeof(char *)))) + nl_oom(); +} + +void nl_add(NIDList nl, char *nid) +{ + char *cp; + + if (!(cp = strdup(nid))) + nl_oom(); + if (nl->count == nl->len) + nl_grow(nl, NL_CHUNK); + nl->nids[nl->count++] = cp; +} + +int nl_count(NIDList nl) +{ + return nl->count; +} + +static char *nl_nid_addr(char *nid) +{ + char *addr, *p; + + if (!(addr = strdup(nid))) + nl_oom(); + if ((p = strchr(addr, '@'))) + *p = '\0'; + + return addr; +} + +static int nl_nid_parse_addr(char *addr) +{ + int o; + + for (o = strlen(addr); o > 0; o--) + if (!isdigit(addr[o - 1])) + break; + + return o; +} + +static int nl_cmp_addr(char *nid1, char *nid2, int *cflagp) +{ + char *p1 = nl_nid_addr(nid1); + char *p2 = nl_nid_addr(nid2); + int res, o1, o2, cflag = 0; + + o1 = nl_nid_parse_addr(p1); + o2 = nl_nid_parse_addr(p2); + + if (o1 == o2 && (res = strncmp(p1, p2, o1)) == 0) { + res = strtoul(&p1[o1], NULL, 10) - strtoul(&p2[o2], NULL, 10); + if (cflagp && strlen(&p1[o1]) > 0 && strlen(&p2[o2]) > 0) + cflag = 1; + } else + res = strcmp(p1, p2); + free(p1); + free(p2); + if (cflagp) + *cflagp = cflag; + return res; +} + +static int nl_cmp_lnet(char *nid1, char *nid2) +{ + char *s1 = strchr(nid1, '@'); + char *s2 = strchr(nid2, '@'); + + return strcmp(s1 ? s1 + 1 : "", s2 ? s2 + 1 : ""); +} + +static int nl_cmp(const void *p1, const void *p2) +{ + int res; + + if ((res = nl_cmp_lnet(*(char **)p1, *(char **)p2)) == 0) + res = nl_cmp_addr(*(char **)p1, *(char **)p2, NULL); + return res; +} + +void nl_sort(NIDList nl) +{ + qsort(nl->nids, nl->count, sizeof(char *), nl_cmp); +} + +void nl_uniq(NIDList nl) +{ + int i, j; + + for (i = 1; i < nl->count; i++) { + if (!strcmp(nl->nids[i], nl->nids[i - 1])) { + free(nl->nids[i]); + for (j = i; j < nl->count - 1; j++) + nl->nids[j] = nl->nids[j + 1]; + nl->count--; + i--; + } + } +} + +static char *nl_nid_lookup_ipaddr(char *nid) +{ + struct addrinfo *ai, *aip; + char name[NI_MAXHOST] = ""; + char *p, *addr, *lnet = NULL, *res = NULL; + int len, x; + + addr = nl_nid_addr(nid); + if (sscanf(addr, "%d.%d.%d.%d", &x, &x, &x, &x) == 4) { + if ((p = strchr(nid, '@'))) + lnet = p + 1; + if (getaddrinfo(addr, NULL, NULL, &ai) == 0) { + for (aip = ai; aip != NULL; aip = aip->ai_next) { + if (getnameinfo(aip->ai_addr, aip->ai_addrlen, + name, sizeof(name), NULL, 0, + NI_NAMEREQD | NI_NOFQDN) == 0) { + if ((p = strchr(name, '.'))) + *p = '\0'; + len = strlen(name) + strlen(lnet) + 2; + if (!(res = malloc(len))) + nl_oom(); + snprintf(res, len, "%s@%s", name, lnet); + break; + } + } + freeaddrinfo(ai); + } + } + free(addr); + + return res; +} + +void nl_lookup_ip(NIDList nl) +{ + int i; + char *new; + + for (i = 0; i < nl->count; i++) { + if ((new = nl_nid_lookup_ipaddr(nl->nids[i]))) { + free(nl->nids[i]); + nl->nids[i] = new; + } + } +} + +char *nl_string(NIDList nl, char *sep) +{ + int seplen = strlen(sep); + int i, len = 1; + char *s; + + for (i = 0; i < nl->count; i++) + len += strlen(nl->nids[i]) + seplen; + if (!(s = malloc(len))) + nl_oom(); + s[0] = '\0'; + for (i = 0; i < nl->count; i++) { + if (i > 0) + strcat(s, sep); + strcat(s, nl->nids[i]); + } + return s; +} + +static void nl_strxcat(char *s, char **nids, int len) +{ + int i, o, lastn = 0; + char *base, *p, *lnet = NULL, *savedn = NULL; + + if ((p = strchr(nids[0], '@'))) + lnet = p + 1; + base = nl_nid_addr(nids[0]); + o = nl_nid_parse_addr(base); + base[o] = '\0'; + for (i = 0; i < len; i++) { + char *addr = nl_nid_addr(nids[i]); + int n = strtoul(&addr[o], NULL, 10); + + if (i == 0) + sprintf(s + strlen(s), "%s[%s", base, &addr[o]); + else if (i < len) { + if (n == lastn + 1) { + if (savedn) + free(savedn); + if (!(savedn = strdup(&addr[o]))) + nl_oom(); + } else { + if (savedn) { + sprintf(s + strlen(s), "-%s", savedn); + free(savedn); + savedn = NULL; + } + sprintf(s + strlen(s), ",%s", &addr[o]); + } + } + if (i == len - 1) { + if (savedn) { + sprintf(s + strlen(s), "-%s", savedn); + free(savedn); + } + strcat(s, "]"); + if (lnet) + sprintf(s + strlen(s), "@%s", lnet); + } + free(addr); + lastn = n; + } + free(base); +} + +char *nl_xstring(NIDList nl, char *sep) +{ + int seplen = strlen(sep); + int cflag, i, j, len = 1; + char *s; + + for (i = 0; i < nl->count; i++) + len += strlen(nl->nids[i]) + seplen; + if (!(s = malloc(len))) + nl_oom(); + s[0] = '\0'; + for (i = 0; i < nl->count; i++) { + if (i > 0) + strcat(s, sep); + for (j = i + 1; j < nl->count; j++) { + if (nl_cmp_lnet(nl->nids[i], nl->nids[j]) != 0) + break; + (void)nl_cmp_addr(nl->nids[i], nl->nids[j], &cflag); + if (!cflag) + break; + } + if (j - i > 1) + nl_strxcat(s, &nl->nids[i], j - i); + else + strcat(s, nl->nids[i]); + i += j - i - 1; + } + return s; +} diff --git a/lustre/utils/nidlist.h b/lustre/utils/nidlist.h new file mode 100644 index 0000000..1978736 --- /dev/null +++ b/lustre/utils/nidlist.h @@ -0,0 +1,56 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope 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 version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + * GPL HEADER END + */ +/* + * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/utils/nidlist.h + * + * Author: Jim Garlick + */ + +#ifndef NIDLIST_H +#define NIDLIST_H + +typedef struct nl_struct *NIDList; + +NIDList nl_create(void); +void nl_destroy(NIDList nl); +void nl_add(NIDList nl, char *nid); +int nl_count(NIDList nl); +void nl_lookup_ip(NIDList nl); +void nl_sort(NIDList nl); +void nl_uniq(NIDList nl); +char *nl_string(NIDList nl, char *sep); +char *nl_xstring(NIDList nl, char *sep); + +#endif diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index a3f2382..3c8dfaa 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -171,6 +171,8 @@ check_ptlrpc_body(void) CHECK_MEMBER(ptlrpc_body, pb_service_time); CHECK_MEMBER(ptlrpc_body, pb_slv); CHECK_MEMBER(ptlrpc_body, pb_limit); + CHECK_CVALUE(PTLRPC_NUM_VERSIONS); + CHECK_MEMBER(ptlrpc_body, pb_pre_versions[PTLRPC_NUM_VERSIONS]); } static void check_obd_connect_data(void) @@ -217,6 +219,7 @@ static void check_obd_connect_data(void) CHECK_CDEFINE(OBD_CONNECT_AT); CHECK_CDEFINE(OBD_CONNECT_CANCELSET); CHECK_CDEFINE(OBD_CONNECT_LRU_RESIZE); + CHECK_CDEFINE(OBD_CONNECT_VBR); CHECK_CDEFINE(OBD_CONNECT_SKIP_ORPHAN); } diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index 5224858..3862e39 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -396,6 +396,11 @@ void lustre_assert_wire_constants(void) (long long)(int)offsetof(struct ptlrpc_body, pb_limit)); LASSERTF((int)sizeof(((struct ptlrpc_body *)0)->pb_limit) == 4, " found %lld\n", (long long)(int)sizeof(((struct ptlrpc_body *)0)->pb_limit)); + CLASSERT(PTLRPC_NUM_VERSIONS == 4); + LASSERTF((int)offsetof(struct ptlrpc_body, pb_pre_versions[4]) == 120, " found %lld\n", + (long long)(int)offsetof(struct ptlrpc_body, pb_pre_versions[4])); + LASSERTF((int)sizeof(((struct ptlrpc_body *)0)->pb_pre_versions[4]) == 8, " found %lld\n", + (long long)(int)sizeof(((struct ptlrpc_body *)0)->pb_pre_versions[4])); /* Checks for struct obd_connect_data */ LASSERTF((int)sizeof(struct obd_connect_data) == 72, " found %lld\n", @@ -478,6 +483,7 @@ void lustre_assert_wire_constants(void) CLASSERT(OBD_CONNECT_AT == 0x01000000ULL); CLASSERT(OBD_CONNECT_CANCELSET == 0x400000ULL); CLASSERT(OBD_CONNECT_LRU_RESIZE == 0x02000000ULL); + CLASSERT(OBD_CONNECT_VBR == 0x80000000ULL); CLASSERT(OBD_CONNECT_SKIP_ORPHAN == 0x400000000ULL); /* Checks for struct obdo */ -- 1.8.3.1