diff --git a/lustre/ChangeLog b/lustre/ChangeLog index 68459cc62153f7927b41e5bfa77384ab91c5f6d2..fd5745a99d03f038e4e8c1cbd65994cc4bd5d65e 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -10,6 +10,13 @@ tbd Sun Microsystems, Inc. * Recommended e2fsprogs version: 1.40.2-cfs5 * Note that reiserfs quotas are disabled on SLES 10 in this kernel. +Severity : normal +Bugzilla : 13375 +Descriptoin: make lov_create() will not stuck in obd_statfs_rqset() +Details : If an OST is down the MDS will hang indefinitely in + obd_statfs_rqset() waiting for the statfs data. While for + MDS QOS usage of statfs, it should not stuck in waiting. + Severity : enhancement Bugzilla : 14288 Description: Update to RHEL4 U6 kernel-2.6.9-67.EL. diff --git a/lustre/include/obd_class.h b/lustre/include/obd_class.h index b863841f479f9f758e075f87877d31b53cb7fc6e..46b1196a09a892f900833cfde23780162b328697 100644 --- a/lustre/include/obd_class.h +++ b/lustre/include/obd_class.h @@ -1006,7 +1006,8 @@ static inline int obd_statfs_async(struct obd_device *obd, } static inline int obd_statfs_rqset(struct obd_device *obd, - struct obd_statfs *osfs, __u64 max_age) + struct obd_statfs *osfs, __u64 max_age, + int quick_pry) { struct ptlrpc_request_set *set = NULL; struct obd_info oinfo = { { { 0 } } }; @@ -1019,8 +1020,19 @@ static inline int obd_statfs_rqset(struct obd_device *obd, oinfo.oi_osfs = osfs; rc = obd_statfs_async(obd, &oinfo, max_age, set); - if (rc == 0) + if (rc == 0) { + struct ptlrpc_request *req; + + if (quick_pry) + list_for_each_entry(req, &set->set_requests, + rq_set_chain) { + spin_lock(&req->rq_lock); + req->rq_no_resend = 1; + req->rq_no_delay = 1; + spin_unlock(&req->rq_lock); + } rc = ptlrpc_set_wait(set); + } ptlrpc_set_destroy(set); RETURN(rc); } diff --git a/lustre/liblustre/super.c b/lustre/liblustre/super.c index cefd4a09499e2f706563ab8c4b930cabb123d111..e24258cb93b6ea433c694549adef8535ce5e0b85 100644 --- a/lustre/liblustre/super.c +++ b/lustre/liblustre/super.c @@ -1205,7 +1205,7 @@ static int llu_statfs_internal(struct llu_sb_info *sbi, osfs->os_bavail, osfs->os_blocks, osfs->os_ffree,osfs->os_files); rc = obd_statfs_rqset(class_exp2obd(sbi->ll_dt_exp), - &obd_statfs, max_age); + &obd_statfs, max_age, 0); if (rc) { CERROR("obd_statfs fails: rc = %d\n", rc); RETURN(rc); diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 06e3b7985922ae109ffeab5e65e8d082d91d17fb..ed8ae792ffd3f5bdafe39387c5624319e2e1d1b1 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1442,7 +1442,7 @@ int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs, osfs->os_bavail, osfs->os_blocks, osfs->os_ffree,osfs->os_files); rc = obd_statfs_rqset(class_exp2obd(sbi->ll_dt_exp), - &obd_osfs, max_age); + &obd_osfs, max_age, 0); if (rc) { CERROR("obd_statfs fails: rc = %d\n", rc); RETURN(rc); diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index a3a45637d96feedeb0b6214e168eb4d16573fb98..50ebb49f7bbcce07042bf8df83a92329d5a1e635 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -1017,7 +1017,7 @@ static int lov_create(struct obd_export *exp, struct obdo *src_oa, } maxage = cfs_time_shift_64(-lov->desc.ld_qos_maxage); - obd_statfs_rqset(exp->exp_obd, &osfs, maxage); + obd_statfs_rqset(exp->exp_obd, &osfs, maxage, 1); rc = lov_prep_create_set(exp, &oinfo, ea, src_oa, oti, &set); if (rc)