Lustre fixes
cover Lustre fixes
HEre are some more recent Lustre fixes and a cleanup.
Alexander Boyko (1):
staging/lustre/mdc: fix panic at mdc_free_open()
Andrew Perepechko (1):
staging/lustre: avoid clearing i_nlink for inodes in use
Dmitry Eremin (1):
staging/lustre/llite: Fix suspicious dereference of pointer
'vma->vm_file'
James Simmons (1):
staging/lustre/o2iblnd: handle mixed page size configurations.
John L. Hammond (2):
staging/lustre: const correct set_lock_data() staging/lustre: release MGC device if connect fails
Lokesh Nagappa Jaliminche (1):
staging/lustre/llite: changes to avoid cache corruption
Yang Sheng (1):
staging/lustre/llite: check return value for obd_set_info_async
.../staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c | 14 +++--- .../staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h | 13 ++--- .../staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c | 55 ++++++++++----------- drivers/staging/lustre/lustre/include/obd.h | 7 +-- drivers/staging/lustre/lustre/include/obd_class.h | 28 +---------- .../staging/lustre/lustre/include/obd_support.h | 2 + drivers/staging/lustre/lustre/llite/dcache.c | 55 --------------------- drivers/staging/lustre/lustre/llite/file.c | 4 +- .../staging/lustre/lustre/llite/llite_internal.h | 5 +- drivers/staging/lustre/lustre/llite/llite_lib.c | 10 ++++ drivers/staging/lustre/lustre/llite/llite_mmap.c | 2 - drivers/staging/lustre/lustre/llite/namei.c | 3 +- drivers/staging/lustre/lustre/lmv/lmv_intent.c | 2 +- drivers/staging/lustre/lustre/lmv/lmv_obd.c | 47 ++---------------- drivers/staging/lustre/lustre/lov/lov_obd.c | 41 ---------------- drivers/staging/lustre/lustre/mdc/mdc_internal.h | 6 +-- drivers/staging/lustre/lustre/mdc/mdc_locks.c | 30 ++---------- drivers/staging/lustre/lustre/mdc/mdc_request.c | 56 +++++++++++++--------- drivers/staging/lustre/lustre/obdclass/obd_mount.c | 2 +- drivers/staging/lustre/lustre/osc/osc_request.c | 22 --------- 20 files changed, 108 insertions(+), 296 deletions(-)
Signature · 1 line
2.7.4
PATCH 1/8 staging/lustre: const correct set_lock_data()
From: "John L. Hammond" <[email protected]>
Change the __u64 *cookie parameter of md_ops->set_lock_data() to const struct lustre_handle *lockh.
Reviewed-on: http://review.whamcloud.com/17072
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7403
--- drivers/staging/lustre/lustre/include/obd.h | 3 ++- drivers/staging/lustre/lustre/include/obd_class.h | 3 ++- drivers/staging/lustre/lustre/llite/file.c | 2 +- drivers/staging/lustre/lustre/llite/llite_internal.h | 5 ++--- drivers/staging/lustre/lustre/lmv/lmv_intent.c | 2 +- drivers/staging/lustre/lustre/lmv/lmv_obd.c | 5 +++-- drivers/staging/lustre/lustre/mdc/mdc_internal.h | 3 ++- drivers/staging/lustre/lustre/mdc/mdc_locks.c | 8 ++++---- drivers/staging/lustre/lustre/mdc/mdc_request.c | 5 ++--- 9 files changed, 19 insertions(+), 17 deletions(-)
drivers/staging/lustre/lustre/include/obd.h +2 -1
@@ -1023,7 +1023,8 @@ struct md_ops { struct lookup_intent *);int (*clear_open_replay_data)(struct obd_export *,struct obd_client_handle *); -int (*set_lock_data)(struct obd_export *,__u64 *,void *,__u64 *); +int (*set_lock_data)(struct obd_export *,const struct lustre_handle *, +void *,__u64 *); enum ldlm_mode (*lock_match)(struct obd_export *, __u64, const struct lu_fid *, enum ldlm_type,
drivers/staging/lustre/lustre/include/obd_class.h +2 -1
@@ -1610,7 +1610,8 @@ static inline int md_clear_open_replay_data(struct obd_export *exp, }static inline int md_set_lock_data (struct obd_export *exp, -__u64 *lockh,void *data,__u64 *bits) +const struct lustre_handle *lockh, +void *data,__u64 *bits) {EXP_CHECK_MD_OP (exp, set_lock_data);EXP_MD_COUNTER_INCREMENT (exp, set_lock_data);
drivers/staging/lustre/lustre/llite/file.c +1 -1
@@ -3629,7 +3629,7 @@ static int ll_layout_lock_set(struct lustre_handle *lockh, enum ldlm_mode mode, PFID(&lli->lli_fid), inode, reconf);/* in case this is a caching lock and reinstate with new inode */ -md_set_lock_data (sbi->ll_md_exp, &lockh->cookie, inode,NULL ); +md_set_lock_data (sbi->ll_md_exp, lockh, inode,NULL );lock_res_and_lock (lock); lvb_ready =ldlm_is_lvb_ready (lock);
drivers/staging/lustre/lustre/llite/llite_internal.h +2 -3
@@ -1243,7 +1243,7 @@ static inline void ll_set_lock_data(struct obd_export *exp, struct inode *inode,CDEBUG (D_DLMTRACE ,"setting l_data to inode " DFID "%p for remote lock %#llx\n" ,PFID (ll_inode2fid (inode)), inode, handle.cookie); -md_set_lock_data (exp, &handle.cookie, inode,NULL ); +md_set_lock_data (exp, &handle, inode,NULL ); } handle.cookie = it->it_lock_handle;
@@ -1251,8 +1251,7 @@ static inline void ll_set_lock_data(struct obd_export *exp, struct inode *inode,CDEBUG (D_DLMTRACE ,"setting l_data to inode " DFID "%p for lock %#llx\n" ,PFID (ll_inode2fid (inode)), inode, handle.cookie); -md_set_lock_data (exp, &handle.cookie, inode, - &it->it_lock_bits); +md_set_lock_data (exp, &handle, inode, &it->it_lock_bits); it->it_lock_set =1 ; }
drivers/staging/lustre/lustre/lmv/lmv_intent.c +1 -1
@@ -250,7 +250,7 @@ int lmv_revalidate_slaves(struct obd_export *exp, struct mdt_body *mbody,ptlrpc_req_finished (req); } -md_set_lock_data (tgt->ltd_exp, &lockh->cookie, inode,NULL ); +md_set_lock_data (tgt->ltd_exp, lockh, inode,NULL );if (i !=0 ) nlink += inode->i_nlink -2 ;
drivers/staging/lustre/lustre/lmv/lmv_obd.c +3 -2
@@ -3060,8 +3060,9 @@ static int lmv_cancel_unused(struct obd_export *exp, const struct lu_fid *fid,return rc; } -static int lmv_set_lock_data (struct obd_export *exp,__u64 *lockh,void *data, -__u64 *bits) +static int lmv_set_lock_data (struct obd_export *exp, +const struct lustre_handle *lockh, +void *data,__u64 *bits) {struct lmv_obd *lmv = &exp->exp_obd->u.lmv;struct lmv_tgt_desc *tgt = lmv->tgts[0 ];
drivers/staging/lustre/lustre/mdc/mdc_internal.h +2 -1
@@ -61,7 +61,8 @@ void mdc_close_pack(struct ptlrpc_request *req, struct md_op_data *op_data);/* mdc/mdc_locks.c */ int mdc_set_lock_data (struct obd_export *exp, -__u64 *lockh,void *data,__u64 *bits); +const struct lustre_handle *lockh, +void *data,__u64 *bits);int mdc_null_inode (struct obd_export *exp,const struct lu_fid *fid);
drivers/staging/lustre/lustre/mdc/mdc_locks.c +4 -4
@@ -93,8 +93,8 @@ int it_open_error(int phase, struct lookup_intent *it)EXPORT_SYMBOL (it_open_error);/* this must be called on a lockh that is known to have a referenced lock */ -int mdc_set_lock_data (struct obd_export *exp,__u64 *lockh,void *data, -__u64 *bits) +int mdc_set_lock_data (struct obd_export *exp,const struct lustre_handle *lockh, +void *data,__u64 *bits) {struct ldlm_lock *lock;struct inode *new_inode = data;
@@ -102,10 +102,10 @@ int mdc_set_lock_data(struct obd_export *exp, __u64 *lockh, void *data,if (bits) *bits =0 ; -if (!*lockh) +if (!lustre_handle_is_used (lockh))return 0 ; - lock =ldlm_handle2lock ((struct lustre_handle *)lockh); + lock =ldlm_handle2lock (lockh);LASSERT (lock);lock_res_and_lock (lock);
drivers/staging/lustre/lustre/mdc/mdc_request.c +2 -3
@@ -1342,7 +1342,8 @@ static int mdc_read_page(struct obd_export *exp, struct md_op_data *op_data, } rc =0 ; -mdc_set_lock_data (exp, &it.it_lock_handle, dir,NULL ); + lockh.cookie = it.it_lock_handle; +mdc_set_lock_data (exp, &lockh, dir,NULL ); rp_param.rp_off = hash_offset; rp_param.rp_hash64 = op_data->op_cli_flags &CLI_HASH64 ;
@@ -1431,9 +1432,7 @@ hash_collision: } *ppage = page; out_unlock: - lockh.cookie = it.it_lock_handle;ldlm_lock_decref (&lockh, it.it_lock_mode); - it.it_lock_handle =0 ;return rc; fail:kunmap (page);
Signature · 1 line
2.7.4
PATCH 2/8 staging/lustre/mdc: fix panic at mdc_free_open()
In reply to Oleg DrokinFrom: Alexander Boyko <[email protected]>
Assertion was happened for open request when rq_replay is set to 1.
ASSERTION(mod->mod_open_req->rq_replay == 0)
But this situation is not fatal for client, and could happened when mdc_close() failed.
The fix allow to free such requests. If mdc_close fail, MDS doesn`t receive close request from client. And in a worst case client would be evicted.
The test recreates issue when mdc_close failed and client asserts:
ASSERTION( mod->mod_open_req->rq_replay == 0 ) failed
Seagate-bug-id: MRP-3156
Reviewed-on: http://review.whamcloud.com/17495
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-5282
--- .../staging/lustre/lustre/include/obd_support.h | 1 + drivers/staging/lustre/lustre/mdc/mdc_request.c | 50 ++++++++++++++-------- 2 files changed, 32 insertions(+), 19 deletions(-)
drivers/staging/lustre/lustre/include/obd_support.h +1 -0
@@ -402,6 +402,7 @@ extern char obd_jobid_var[];#define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803#define OBD_FAIL_MDC_RPCS_SEM 0x804#define OBD_FAIL_MDC_LIGHTWEIGHT 0x805 +#define OBD_FAIL_MDC_CLOSE 0x806#define OBD_FAIL_MGS 0x900#define OBD_FAIL_MGS_ALL_REQUEST_NET 0x901
drivers/staging/lustre/lustre/mdc/mdc_request.c +31 -19
74 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [PATCH 2/8] staging/lustre/mdc: fix panic at mdc_free_open()
Actually, please do not apply this one, there was a testing error
that made me not noticing there's a bug in this one that insta-crashes everything on access.
I tested the rest nd the rest are good without this one too.
Sorry about this.
Quoted 123 lines · Oleg Drokin
From: Alexander Boyko <[email protected]>
Assertion was happened for open request when
rq_replayis set to 1.
ASSERTION(mod->mod_open_req->rq_replay == 0)
But this situation is not fatal for client, and could happened whenmdc_close()failed.
The fix allow to free such requests. Ifmdc_closefail, MDS doesn`t receive close request from client. And in a worst case client would be evicted.The test recreates issue when
mdc_closefailed and client asserts:
ASSERTION( mod->mod_open_req->rq_replay == 0 )failedSigned-off-by Alexander Boyko <[email protected]>Seagate-bug-id: MRP-3156
Reviewed-on: http://review.whamcloud.com/17495
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-5282Reviewed-by Alex Zhuravlev <[email protected]>Reviewed-by Andreas Dilger <[email protected]>Signed-off-by Oleg Drokin <[email protected]>---
.../staging/lustre/lustre/include/obd_support.h| 1 +drivers/staging/lustre/lustre/mdc/mdc_request.c| 50 ++++++++++++++--------2 files changed, 32 insertions(+), 19 deletions(-)drivers/staging/lustre/lustre/include/obd_support.h +1
-0@@ -402,6 +402,7 @@ extern char obd_jobid_var[];#define OBD_FAIL_MDC_GETATTR_ENQUEUE 0x803#define OBD_FAIL_MDC_RPCS_SEM 0x804#define OBD_FAIL_MDC_LIGHTWEIGHT 0x805 +#define OBD_FAIL_MDC_CLOSE 0x806#define OBD_FAIL_MGS 0x900#define OBD_FAIL_MGS_ALL_REQUEST_NET 0x901drivers/staging/lustre/lustre/mdc/mdc_request.c +31
-19@@ -677,9 +677,15 @@ static void mdc_free_open(struct md_open_data *mod) imp_connect_disp_stripe(mod->mod_open_req->rq_import)) committed =1 ; -LASSERT (mod->mod_open_req->rq_replay ==0 ); - -DEBUG_REQ (D_RPCTRACE , mod->mod_open_req,"free open request\n" ); +/* +* No reason to asssert here if the open request has +* rq_replay == 1. It means that mdc_close failed, and +* close request wasn`t sent. It is not fatal to client. +* The worst thing is eviction if the client gets open lock +*/ +DEBUG_REQ (D_RPCTRACE , mod->mod_open_req, +"free open request rq_replay = %d\n" , + mod->mod_open_req->rq_replay);ptlrpc_request_committed (mod->mod_open_req, committed);if (mod->mod_close_req)@@ -749,22 +755,10 @@ static int mdc_close(struct obd_export *exp, struct md_op_data *op_data, } *request =NULL ; - req =ptlrpc_request_alloc (class_exp2cliimp (exp), req_fmt); -if (!req) -return -ENOMEM ; - - rc =ptlrpc_request_pack (req,LUSTRE_MDS_VERSION ,MDS_CLOSE ); -if (rc) { -ptlrpc_request_free (req); -return rc; - } - -/* To avoid a livelock (bug 7034), we need to send CLOSE RPCs to a -* portal whose threads are not taking any DLM locks and are therefore -* always progressing -*/ - req->rq_request_portal =MDS_READPAGE_PORTAL ; -ptlrpc_at_set_req_timeout (req); +if (OBD_FAIL_CHECK (OBD_FAIL_MDC_CLOSE )) + req =NULL ; +else + req =ptlrpc_request_alloc (class_exp2cliimp (exp), req_fmt);/* Ensure that this close's handle is fixed up during replay. */ if (likely (mod)) {@@ -785,6 +779,23 @@ static int mdc_close(struct obd_export *exp, struct md_op_data *op_data,CDEBUG (D_HA ,"couldn't find open req; expecting close error\n" ); } +if (!req) { +/* +* TODO: repeat close after errors +*/ +CWARN ("%s: close of FID " DFID " failed, file reference will be dropped when this client unmounts or is evicted\n" , + obd->obd_name,PFID (&op_data->op_fid1)); + rc = -ENOMEM ; + goto out; + } + +/* +* To avoid a livelock (bug 7034), we need to send CLOSE RPCs to a +* portal whose threads are not taking any DLM locks and are therefore +* always progressing +*/ + req->rq_request_portal =MDS_READPAGE_PORTAL ; +ptlrpc_at_set_req_timeout (req);mdc_close_pack (req, op_data);@@ -830,6 +841,7 @@ static int mdc_close(struct obd_export *exp, struct md_op_data *op_data, } } +out:if (mod) {if (rc !=0 ) mod->mod_close_req =NULL ;Signature · 1 line
2.7.4
PATCH 3/8 staging/lustre: avoid clearing i_nlink for inodes in use
In reply to Oleg DrokinFrom: Andrew Perepechko <[email protected]>
The patch removes find_cbdata callbacks and clear_nlink from dentry_iput path, since this piece of code makes a few races possible.
The test case reproduces one of the possible races described in LU-7925:
1) two hard links are created for the same file
2) the test calls stat(2) for link #1
3) in the middle of 2) the test opens and closes link #2
4) in the middle of 2) the test drops the ldlm locks and forces dentry reclaim via vm.drop_caches=2
5) in the middle of 2) ll_d_iput() clears i_nlink for the inode
6) the initial stat(2) continues and copies the wrong i_nlink value into st_nlink
Seagate-bug-id: MRP-3271
Reviewed-on: http://review.whamcloud.com/19164
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7925
--- drivers/staging/lustre/lustre/include/obd.h | 4 -- drivers/staging/lustre/lustre/include/obd_class.h | 25 ---------- .../staging/lustre/lustre/include/obd_support.h | 1 + drivers/staging/lustre/lustre/llite/dcache.c | 55 ---------------------- drivers/staging/lustre/lustre/llite/file.c | 2 + drivers/staging/lustre/lustre/lmv/lmv_obd.c | 42 ----------------- drivers/staging/lustre/lustre/lov/lov_obd.c | 41 ---------------- drivers/staging/lustre/lustre/mdc/mdc_internal.h | 3 -- drivers/staging/lustre/lustre/mdc/mdc_locks.c | 22 --------- drivers/staging/lustre/lustre/mdc/mdc_request.c | 1 - drivers/staging/lustre/lustre/osc/osc_request.c | 22 --------- 11 files changed, 3 insertions(+), 215 deletions(-)
drivers/staging/lustre/lustre/include/obd.h +0 -4
@@ -896,8 +896,6 @@ struct obd_ops { struct niobuf_remote *remote, int pages, struct niobuf_local *local, struct obd_trans_info *oti, int rc); -int (*find_cbdata)(struct obd_export *,struct lov_stripe_md *, -ldlm_iterator_t it,void *data);int (*init_export)(struct obd_export *exp);int (*destroy_export)(struct obd_export *exp);
@@ -958,8 +956,6 @@ struct cl_attr;struct md_ops {int (*getstatus)(struct obd_export *,struct lu_fid *);int (*null_inode)(struct obd_export *,const struct lu_fid *); -int (*find_cbdata)(struct obd_export *,const struct lu_fid *, -ldlm_iterator_t ,void *);int (*close)(struct obd_export *,struct md_op_data *,struct md_open_data *,struct ptlrpc_request **); int (*create)(struct obd_export *, struct md_op_data *,
drivers/staging/lustre/lustre/include/obd_class.h +0 -25
@@ -1177,19 +1177,6 @@ static inline int obd_iocontrol(unsigned int cmd, struct obd_export *exp,return rc; } -static inline int obd_find_cbdata (struct obd_export *exp, -struct lov_stripe_md *lsm, -ldlm_iterator_t it,void *data) -{ -int rc; - -EXP_CHECK_DT_OP (exp, find_cbdata); -EXP_COUNTER_INCREMENT (exp, find_cbdata); - - rc =OBP (exp->exp_obd, find_cbdata)(exp, lsm, it, data); -return rc; -} -static inline void obd_import_event (struct obd_device *obd,struct obd_import *imp,enum obd_import_event event)
@@ -1358,18 +1345,6 @@ static inline int md_null_inode(struct obd_export *exp,return rc; } -static inline int md_find_cbdata (struct obd_export *exp, -const struct lu_fid *fid, -ldlm_iterator_t it,void *data) -{ -int rc; - -EXP_CHECK_MD_OP (exp, find_cbdata); -EXP_MD_COUNTER_INCREMENT (exp, find_cbdata); - rc =MDP (exp->exp_obd, find_cbdata)(exp, fid, it, data); -return rc; -} -static inline int md_close (struct obd_export *exp,struct md_op_data *op_data,struct md_open_data *mod,struct ptlrpc_request **request)
drivers/staging/lustre/lustre/include/obd_support.h +1 -0
@@ -458,6 +458,7 @@ extern char obd_jobid_var[];#define OBD_FAIL_LOV_INIT 0x1403#define OBD_FAIL_GLIMPSE_DELAY 0x1404#define OBD_FAIL_LLITE_XATTR_ENOMEM 0x1405 +#define OBD_FAIL_GETATTR_DELAY 0x1409#define OBD_FAIL_FID_INDIR 0x1501#define OBD_FAIL_FID_INLMA 0x1502
drivers/staging/lustre/lustre/llite/dcache.c +0 -55
76 lines not on this page · raw message
drivers/staging/lustre/lustre/llite/file.c +2 -0
@@ -3191,6 +3191,8 @@ int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat)if (res)return res; +OBD_FAIL_TIMEOUT (OBD_FAIL_GETATTR_DELAY ,30 ); + stat->dev = inode->i_sb->s_dev;if (ll_need_32bit_api (sbi)) stat->ino =cl_fid_build_ino (&lli->lli_fid,1 );
drivers/staging/lustre/lustre/lmv/lmv_obd.c +0 -42
54 lines not on this page · raw message
drivers/staging/lustre/lustre/lov/lov_obd.c +0 -41
53 lines not on this page · raw message
drivers/staging/lustre/lustre/mdc/mdc_internal.h +0 -3
@@ -66,9 +66,6 @@ int mdc_set_lock_data(struct obd_export *exp,int mdc_null_inode (struct obd_export *exp,const struct lu_fid *fid); -int mdc_find_cbdata (struct obd_export *exp,const struct lu_fid *fid, -ldlm_iterator_t it,void *data); - int mdc_intent_lock(struct obd_export *exp, struct md_op_data *op_data, struct lookup_intent *it,
drivers/staging/lustre/lustre/mdc/mdc_locks.c +0 -22
@@ -185,28 +185,6 @@ int mdc_null_inode(struct obd_export *exp,return 0 ; } -/* find any ldlm lock of the inode in mdc -* return 0 not find -* 1 find one -* < 0 error -*/ -int mdc_find_cbdata (struct obd_export *exp, -const struct lu_fid *fid, -ldlm_iterator_t it,void *data) -{ -struct ldlm_res_id res_id; -int rc =0 ; - -fid_build_reg_res_name ((struct lu_fid *)fid, &res_id); - rc =ldlm_resource_iterate (class_exp2obd (exp)->obd_namespace, &res_id, - it, data); -if (rc ==LDLM_ITER_STOP ) -return 1 ; -else if (rc ==LDLM_ITER_CONTINUE ) -return 0 ; -return rc; -} -static inline void mdc_clear_replay_flag (struct ptlrpc_request *req,int rc) {/* Don't hold error requests for replay. */
drivers/staging/lustre/lustre/mdc/mdc_request.c +0 -1
@@ -2868,7 +2868,6 @@ static struct obd_ops mdc_obd_ops = {static struct md_ops mdc_md_ops = { .getstatus = mdc_getstatus, .null_inode = mdc_null_inode, - .find_cbdata = mdc_find_cbdata, .close = mdc_close, .create = mdc_create, .done_writing = mdc_done_writing,
drivers/staging/lustre/lustre/osc/osc_request.c +0 -22
@@ -2119,27 +2119,6 @@ static int osc_set_data_with_check(struct lustre_handle *lockh,return set; } -/* find any ldlm lock of the inode in osc -* return 0 not find -* 1 find one -* < 0 error -*/ -static int osc_find_cbdata (struct obd_export *exp,struct lov_stripe_md *lsm, -ldlm_iterator_t replace,void *data) -{ -struct ldlm_res_id res_id; -struct obd_device *obd =class_exp2obd (exp); -int rc =0 ; - -ostid_build_res_name (&lsm->lsm_oi, &res_id); - rc =ldlm_resource_iterate (obd->obd_namespace, &res_id, replace, data); -if (rc ==LDLM_ITER_STOP ) -return 1 ; -if (rc ==LDLM_ITER_CONTINUE ) -return 0 ; -return rc; -} - static int osc_enqueue_fini(struct ptlrpc_request *req, osc_enqueue_upcall_f upcall, void *cookie, struct lustre_handle *lockh, enum ldlm_mode mode,
@@ -3358,7 +3337,6 @@ static struct obd_ops osc_obd_ops = { .getattr_async = osc_getattr_async, .setattr = osc_setattr, .setattr_async = osc_setattr_async, - .find_cbdata = osc_find_cbdata, .iocontrol = osc_iocontrol, .get_info = osc_get_info, .set_info_async = osc_set_info_async,
Signature · 1 line
2.7.4
PATCH 4/8 staging/lustre/llite: check return value for obd_set_info_async
In reply to Oleg DrokinFrom: Yang Sheng <[email protected]>
The return value is ignored in client_common_fill_super. Restore to check it and error out.
Reviewed-on: http://review.whamcloud.com/21125
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-8360
--- drivers/staging/lustre/lustre/llite/llite_lib.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/staging/lustre/lustre/llite/llite_lib.c +10 -0
@@ -498,11 +498,21 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt, err =obd_set_info_async (NULL , sbi->ll_dt_exp,sizeof (KEY_CHECKSUM ),KEY_CHECKSUM ,sizeof (checksum), &checksum,NULL ); +if (err) { +CERROR ("%s: Set checksum failed: rc = %d\n" , + sbi->ll_dt_exp->exp_obd->obd_name, err); + goto out_root; + }cl_sb_init (sb); err =obd_set_info_async (NULL , sbi->ll_dt_exp,sizeof (KEY_CACHE_SET ),KEY_CACHE_SET ,sizeof (*sbi->ll_cache), sbi->ll_cache,NULL ); +if (err) { +CERROR ("%s: Set cache_set failed: rc = %d\n" , + sbi->ll_dt_exp->exp_obd->obd_name, err); + goto out_root; + } sb->s_root =d_make_root (root);if (!sb->s_root) {
Signature · 1 line
2.7.4
PATCH 5/8 staging/lustre/llite: Fix suspicious dereference of pointer 'vma->vm_file'
In reply to Oleg DrokinFrom: Dmitry Eremin <[email protected]>
Remove useless LASSERT(vma->vm_file) because of if it's NULL it will crash early in file_inode(vma->vm_file).
Reviewed-on: http://review.whamcloud.com/21171
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-8372
--- drivers/staging/lustre/lustre/llite/llite_mmap.c | 2 -- 1 file changed, 2 deletions(-)
drivers/staging/lustre/lustre/llite/llite_mmap.c +0 -2
@@ -429,7 +429,6 @@ static void ll_vm_open(struct vm_area_struct *vma)struct inode *inode =file_inode (vma->vm_file);struct vvp_object *vob =cl_inode2vvp (inode); -LASSERT (vma->vm_file);LASSERT (atomic_read (&vob->vob_mmap_cnt) >=0 );atomic_inc (&vob->vob_mmap_cnt); }
@@ -442,7 +441,6 @@ static void ll_vm_close(struct vm_area_struct *vma)struct inode *inode =file_inode (vma->vm_file);struct vvp_object *vob =cl_inode2vvp (inode); -LASSERT (vma->vm_file);atomic_dec (&vob->vob_mmap_cnt);LASSERT (atomic_read (&vob->vob_mmap_cnt) >=0 ); }
Signature · 1 line
2.7.4
PATCH 6/8 staging/lustre/llite: changes to avoid cache corruption
In reply to Oleg DrokinFrom: Lokesh Nagappa Jaliminche <[email protected]>
ll_find_alias is responsible for getting alias for inode which can be reused. Directories are assumed to have unique alias, where in case of non-directories there can be multiple aliases. In case of lustre there can be two type of aliases i.e. discon_alias and invalid_alias. Usage of discon_alias in case of non-directories may corrupt dcache and leads to kernel crash. Changes made to avoid use of discon_alias in case of non-directories.
Seagate-bug-id: MRP-2739, MRP-3601
Reviewed-on: http://review.whamcloud.com/17732
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7613
--- drivers/staging/lustre/lustre/llite/namei.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/staging/lustre/lustre/llite/namei.c +2 -1
@@ -363,7 +363,8 @@ static struct dentry *ll_find_alias(struct inode *inode, struct dentry *dentry)LASSERT (alias != dentry);spin_lock (&alias->d_lock); -if (alias->d_flags &DCACHE_DISCONNECTED ) +if ((alias->d_flags &DCACHE_DISCONNECTED ) && +S_ISDIR (inode->i_mode))/* LASSERT(last_discon == NULL); LU-405, bz 20055 */ discon_alias = alias; else if (alias->d_parent == dentry->d_parent &&
Signature · 1 line
2.7.4
PATCH 7/8 staging/lustre: release MGC device if connect fails
In reply to Oleg DrokinFrom: "John L. Hammond" <[email protected]>
In lustre_fill_super() if lustre_start_mgc() fails then call lustre_common_put_super() to release a reference on the MGC device attached to the LSI.
Reviewed-on: http://review.whamcloud.com/20851
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-8297
--- drivers/staging/lustre/lustre/obdclass/obd_mount.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/lustre/lustre/obdclass/obd_mount.c +1 -1
@@ -1144,7 +1144,7 @@ static int lustre_fill_super(struct super_block *sb, void *data, int silent) }else { rc =lustre_start_mgc (sb);if (rc) { -lustre_put_lsi (sb); +lustre_common_put_super (sb); goto out; }/* Connect and start */
Signature · 1 line
2.7.4
PATCH 8/8 staging/lustre/o2iblnd: handle mixed page size configurations.
In reply to Oleg DrokinFrom: James Simmons <[email protected]>
Currently it is not possible to send LNet traffic between two nodes using infiniband hardware that have different page sizes for the case when RDMA fragments are used. When two nodes establish a connection they tell the other node the maximum number of RDMA fragments they support. The issue is that the units are pages, and 256 64K pages corresponds to 16MB of data, whereas a 4K page system is limited to messages with 1MB of data. The solution is to report over the wire the maximum number of fragments in 4K unites regardless of the native page size. The recipient then uses its native page size to translate into the maximum number of pages sized fragments it can send to the other node.
Reviewed-on: http://review.whamcloud.com/21304
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-7650
--- .../staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c | 14 +++--- .../staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h | 13 ++--- .../staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c | 55 ++++++++++------------ 3 files changed, 41 insertions(+), 41 deletions(-)
drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c +8 -6
@@ -128,6 +128,7 @@ static int kiblnd_msgtype2size(int type)static int kiblnd_unpack_rd (struct kib_msg *msg,int flip) {struct kib_rdma_desc *rd; +int msg_size;int nob;int n;int i;
@@ -146,12 +147,6 @@ static int kiblnd_unpack_rd(struct kib_msg *msg, int flip) n = rd->rd_nfrags; -if (n <=0 || n >IBLND_MAX_RDMA_FRAGS ) { -CERROR ("Bad nfrags: %d, should be 0 < n <= %d\n" , - n,IBLND_MAX_RDMA_FRAGS ); -return 1 ; - } - nob = offsetof(struct kib_msg , ibm_u) +kiblnd_rd_msg_size (rd, msg->ibm_type, n);
@@ -161,6 +156,13 @@ static int kiblnd_unpack_rd(struct kib_msg *msg, int flip)return 1 ; } + msg_size =kiblnd_rd_size (rd); +if (msg_size <=0 || msg_size >LNET_MAX_PAYLOAD ) { +CERROR ("Bad msg_size: %d, should be 0 < n <= %d\n" , + msg_size,LNET_MAX_PAYLOAD ); +return 1 ; + } +if (!flip)return 0 ;
drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.h +7 -6
@@ -113,8 +113,9 @@ extern struct kib_tunables kiblnd_tunables;#define IBLND_OOB_CAPABLE (v) ((v) != IBLND_MSG_VERSION_1)#define IBLND_OOB_MSGS (v) (IBLND_OOB_CAPABLE(v) ? 2 : 0) -#define IBLND_MSG_SIZE (4 << 10)/* max size of queued messages (inc hdr) */ -#define IBLND_MAX_RDMA_FRAGS LNET_MAX_IOV/* max # of fragments supported */ +#define IBLND_FRAG_SHIFT (PAGE_SHIFT - 12)/* frag size on wire is in 4K units */ +#define IBLND_MSG_SIZE (4 << 10)/* max size of queued messages (inc hdr) */ +#define IBLND_MAX_RDMA_FRAGS (LNET_MAX_PAYLOAD >> 12)/* max # of fragments supported in 4K size */ /************************/ /* derived constants... */
@@ -133,8 +134,8 @@ extern struct kib_tunables kiblnd_tunables;/* WRs and CQEs (per connection) */ #define IBLND_RECV_WRS (c) IBLND_RX_MSGS(c)#define IBLND_SEND_WRS (c) \ - ((c->ibc_max_frags + 1) * kiblnd_concurrent_sends(c->ibc_version, \ - c->ibc_peer->ibp_ni)) + (((c->ibc_max_frags + 1) << IBLND_FRAG_SHIFT) * \ + kiblnd_concurrent_sends(c->ibc_version, c->ibc_peer->ibp_ni))#define IBLND_CQ_ENTRIES (c) (IBLND_RECV_WRS(c) + IBLND_SEND_WRS(c))struct kib_hca_dev ;
@@ -609,14 +610,14 @@ kiblnd_cfg_rdma_frags(struct lnet_ni *ni) tunables = &ni->ni_lnd_tunables->lt_tun_u.lt_o2ib; mod = tunables->lnd_map_on_demand; -return mod ? mod :IBLND_MAX_RDMA_FRAGS ; +return mod ? mod :IBLND_MAX_RDMA_FRAGS >>IBLND_FRAG_SHIFT ; }static inline int kiblnd_rdma_frags (int version,struct lnet_ni *ni) {return version ==IBLND_MSG_VERSION_1 ? -IBLND_MAX_RDMA_FRAGS : + (IBLND_MAX_RDMA_FRAGS >>IBLND_FRAG_SHIFT ) :kiblnd_cfg_rdma_frags (ni); }
drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd_cb.c +26 -29
136 lines not on this page · raw message
Signature · 1 line
2.7.4