diff --git a/drivers/staging/lustre/lnet/libcfs/libcfs_string.c b/drivers/staging/lustre/lnet/libcfs/libcfs_string.c
index 5fb85247525d..ae17b4d44cac 100644
--- a/drivers/staging/lustre/lnet/libcfs/libcfs_string.c
+++ b/drivers/staging/lustre/lnet/libcfs/libcfs_string.c
@@ -468,11 +468,11 @@ EXPORT_SYMBOL(cfs_expr_list_values);
 void
 cfs_expr_list_free(struct cfs_expr_list *expr_list)
 {
-	while (!list_empty(&expr_list->el_exprs)) {
-		struct cfs_range_expr *expr;
+	struct cfs_range_expr *expr;
 
-		expr = list_entry(expr_list->el_exprs.next,
-				  struct cfs_range_expr, re_link);
+	while ((expr = list_first_entry_or_null(&expr_list->el_exprs,
+						struct cfs_range_expr,
+						re_link)) != NULL) {
 		list_del(&expr->re_link);
 		kfree(expr);
 	}
@@ -553,8 +553,8 @@ cfs_expr_list_free_list(struct list_head *list)
 {
 	struct cfs_expr_list *el;
 
-	while (!list_empty(list)) {
-		el = list_entry(list->next, struct cfs_expr_list, el_link);
+	while ((el = list_first_entry_or_null(list, struct cfs_expr_list,
+					      el_link)) != NULL) {
 		list_del(&el->el_link);
 		cfs_expr_list_free(el);
 	}
diff --git a/drivers/staging/lustre/lnet/selftest/conrpc.c b/drivers/staging/lustre/lnet/selftest/conrpc.c
index d9bcfa8c92ae..af0d2aa3b6e8 100644
--- a/drivers/staging/lustre/lnet/selftest/conrpc.c
+++ b/drivers/staging/lustre/lnet/selftest/conrpc.c
@@ -1362,9 +1362,8 @@ lstcon_rpc_cleanup_wait(void)
 
 	spin_unlock(&console_session.ses_rpc_lock);
 
-	while (!list_empty(&zlist)) {
-		crpc = list_entry(zlist.next, struct lstcon_rpc, crp_link);
-
+	while ((crpc = list_first_entry_or_null(&zlist, struct lstcon_rpc,
+					       crp_link)) != NULL) {
 		list_del(&crpc->crp_link);
 		kfree(crpc);
 	}
diff --git a/drivers/staging/lustre/lnet/selftest/console.c b/drivers/staging/lustre/lnet/selftest/console.c
index 045d79f44321..abc342c6a842 100644
--- a/drivers/staging/lustre/lnet/selftest/console.c
+++ b/drivers/staging/lustre/lnet/selftest/console.c
@@ -330,11 +330,10 @@ lstcon_group_move(struct lstcon_group *old, struct lstcon_group *new)
 {
 	struct lstcon_ndlink *ndl;
 
-	while (!list_empty(&old->grp_ndl_list)) {
-		ndl = list_entry(old->grp_ndl_list.next,
-				 struct lstcon_ndlink, ndl_link);
+	while ((ndl = list_first_entry_or_null(&old->grp_ndl_list,
+					       struct lstcon_ndlink,
+					       ndl_link)) != NULL)
 		lstcon_group_ndlink_move(old, new, ndl);
-	}
 }
 
 static int
@@ -1095,9 +1094,9 @@ lstcon_batch_destroy(struct lstcon_batch *bat)
 
 	list_del(&bat->bat_link);
 
-	while (!list_empty(&bat->bat_test_list)) {
-		test = list_entry(bat->bat_test_list.next,
-				  struct lstcon_test, tes_link);
+	while ((test = list_first_entry_or_null(&bat->bat_test_list,
+						struct lstcon_test,
+						tes_link)) != NULL) {
 		LASSERT(list_empty(&test->tes_trans_list));
 
 		list_del(&test->tes_link);
@@ -1110,17 +1109,17 @@ lstcon_batch_destroy(struct lstcon_batch *bat)
 
 	LASSERT(list_empty(&bat->bat_trans_list));
 
-	while (!list_empty(&bat->bat_cli_list)) {
-		ndl = list_entry(bat->bat_cli_list.next,
-				 struct lstcon_ndlink, ndl_link);
+	while ((ndl = list_first_entry_or_null(&bat->bat_cli_list,
+					       struct lstcon_ndlink,
+					       ndl_link)) != NULL) {
 		list_del_init(&ndl->ndl_link);
 
 		lstcon_ndlink_release(ndl);
 	}
 
-	while (!list_empty(&bat->bat_srv_list)) {
-		ndl = list_entry(bat->bat_srv_list.next,
-				 struct lstcon_ndlink, ndl_link);
+	while ((ndl = list_first_entry_or_null(&bat->bat_srv_list,
+					       struct lstcon_ndlink,
+					       ndl_link)) != NULL) {
 		list_del_init(&ndl->ndl_link);
 
 		lstcon_ndlink_release(ndl);
@@ -1844,17 +1843,15 @@ lstcon_session_end(void)
 	console_session.ses_feats_updated = 0;
 
 	/* destroy all batches */
-	while (!list_empty(&console_session.ses_bat_list)) {
-		bat = list_entry(console_session.ses_bat_list.next,
-				 struct lstcon_batch, bat_link);
-
+	while ((bat = list_first_entry_or_null(&console_session.ses_bat_list,
+					       struct lstcon_batch,
+					       bat_link)) != NULL)
 		lstcon_batch_destroy(bat);
-	}
 
 	/* destroy all groups */
-	while (!list_empty(&console_session.ses_grp_list)) {
-		grp = list_entry(console_session.ses_grp_list.next,
-				 struct lstcon_group, grp_link);
+	while ((grp = list_first_entry_or_null(&console_session.ses_grp_list,
+					       struct lstcon_group,
+					       grp_link)) != NULL) {
 		LASSERT(grp->grp_ref == 1);
 
 		lstcon_group_decref(grp);
diff --git a/drivers/staging/lustre/lnet/selftest/framework.c b/drivers/staging/lustre/lnet/selftest/framework.c
index a82efc394659..958f627580e7 100644
--- a/drivers/staging/lustre/lnet/selftest/framework.c
+++ b/drivers/staging/lustre/lnet/selftest/framework.c
@@ -628,16 +628,16 @@ sfw_destroy_test_instance(struct sfw_test_instance *tsi)
 	LASSERT(list_empty(&tsi->tsi_active_rpcs));
 	LASSERT(!sfw_test_active(tsi));
 
-	while (!list_empty(&tsi->tsi_units)) {
-		tsu = list_entry(tsi->tsi_units.next,
-				 struct sfw_test_unit, tsu_list);
+	while ((tsu = list_first_entry_or_null(&tsi->tsi_units,
+					       struct sfw_test_unit,
+					       tsu_list)) != NULL) {
 		list_del(&tsu->tsu_list);
 		kfree(tsu);
 	}
 
-	while (!list_empty(&tsi->tsi_free_rpcs)) {
-		rpc = list_entry(tsi->tsi_free_rpcs.next,
-				 struct srpc_client_rpc, crpc_list);
+	while ((rpc = list_first_entry_or_null(&tsi->tsi_free_rpcs,
+					       struct srpc_client_rpc,
+					       crpc_list)) != NULL) {
 		list_del(&rpc->crpc_list);
 		kfree(rpc);
 	}
@@ -655,9 +655,9 @@ sfw_destroy_batch(struct sfw_batch *tsb)
 	LASSERT(!sfw_batch_active(tsb));
 	LASSERT(list_empty(&tsb->bat_list));
 
-	while (!list_empty(&tsb->bat_tests)) {
-		tsi = list_entry(tsb->bat_tests.next,
-				 struct sfw_test_instance, tsi_list);
+	while ((tsi = list_first_entry_or_null(&tsb->bat_tests,
+					       struct sfw_test_instance,
+					       tsi_list)) != NULL) {
 		list_del_init(&tsi->tsi_list);
 		sfw_destroy_test_instance(tsi);
 	}
@@ -673,9 +673,9 @@ sfw_destroy_session(struct sfw_session *sn)
 	LASSERT(list_empty(&sn->sn_list));
 	LASSERT(sn != sfw_data.fw_session);
 
-	while (!list_empty(&sn->sn_batches)) {
-		batch = list_entry(sn->sn_batches.next,
-				   struct sfw_batch, bat_list);
+	while ((batch = list_first_entry_or_null(&sn->sn_batches,
+						 struct sfw_batch,
+						 bat_list)) != NULL) {
 		list_del_init(&batch->bat_list);
 		sfw_destroy_batch(batch);
 	}
@@ -1389,8 +1389,8 @@ sfw_create_rpc(struct lnet_process_id peer, int service,
 	LASSERT(service <= SRPC_FRAMEWORK_SERVICE_MAX_ID);
 
 	if (!nbulkiov && !list_empty(&sfw_data.fw_zombie_rpcs)) {
-		rpc = list_entry(sfw_data.fw_zombie_rpcs.next,
-				 struct srpc_client_rpc, crpc_list);
+		rpc = list_first_entry(&sfw_data.fw_zombie_rpcs,
+				       struct srpc_client_rpc, crpc_list);
 		list_del(&rpc->crpc_list);
 
 		srpc_init_client_rpc(rpc, peer, service, 0, 0,
@@ -1722,6 +1722,7 @@ sfw_shutdown(void)
 {
 	struct srpc_service *sv;
 	struct sfw_test_case	*tsc;
+	struct srpc_client_rpc *rpc;
 	int i;
 
 	spin_lock(&sfw_data.fw_lock);
@@ -1757,11 +1758,9 @@ sfw_shutdown(void)
 		srpc_remove_service(sv);
 	}
 
-	while (!list_empty(&sfw_data.fw_zombie_rpcs)) {
-		struct srpc_client_rpc *rpc;
-
-		rpc = list_entry(sfw_data.fw_zombie_rpcs.next,
-				 struct srpc_client_rpc, crpc_list);
+	while ((rpc = list_first_entry_or_null(&sfw_data.fw_zombie_rpcs,
+					       struct srpc_client_rpc,
+					       crpc_list)) != NULL) {
 		list_del(&rpc->crpc_list);
 
 		kfree(rpc);
@@ -1775,10 +1774,9 @@ sfw_shutdown(void)
 		srpc_wait_service_shutdown(sv);
 	}
 
-	while (!list_empty(&sfw_data.fw_tests)) {
-		tsc = list_entry(sfw_data.fw_tests.next,
-				 struct sfw_test_case, tsc_list);
-
+	while ((tsc = list_first_entry_or_null(&sfw_data.fw_tests,
+					       struct sfw_test_case,
+					       tsc_list)) != NULL) {
 		srpc_wait_service_shutdown(tsc->tsc_srv_service);
 
 		list_del(&tsc->tsc_list);
diff --git a/drivers/staging/lustre/lnet/selftest/rpc.c b/drivers/staging/lustre/lnet/selftest/rpc.c
index 2a3010774dbe..abb6f8fb011e 100644
--- a/drivers/staging/lustre/lnet/selftest/rpc.c
+++ b/drivers/staging/lustre/lnet/selftest/rpc.c
@@ -210,9 +210,9 @@ srpc_service_fini(struct srpc_service *svc)
 			else
 				break;
 
-			while (!list_empty(q)) {
-				buf = list_entry(q->next, struct srpc_buffer,
-						 buf_list);
+			while ((buf = list_first_entry_or_null(
+					q, struct srpc_buffer,
+					buf_list)) != NULL) {
 				list_del(&buf->buf_list);
 				kfree(buf);
 			}
@@ -220,10 +220,9 @@ srpc_service_fini(struct srpc_service *svc)
 
 		LASSERT(list_empty(&scd->scd_rpc_active));
 
-		while (!list_empty(&scd->scd_rpc_free)) {
-			rpc = list_entry(scd->scd_rpc_free.next,
-					 struct srpc_server_rpc,
-					 srpc_list);
+		while ((rpc = list_first_entry_or_null(&scd->scd_rpc_free,
+						       struct srpc_server_rpc,
+						       srpc_list)) != NULL) {
 			list_del(&rpc->srpc_list);
 			kfree(rpc);
 		}
@@ -674,8 +673,8 @@ srpc_finish_service(struct srpc_service *sv)
 			continue;
 		}
 
-		rpc = list_entry(scd->scd_rpc_active.next,
-				 struct srpc_server_rpc, srpc_list);
+		rpc = list_first_entry(&scd->scd_rpc_active,
+				       struct srpc_server_rpc, srpc_list);
 		CNETERR("Active RPC %p on shutdown: sv %s, peer %s, wi %s, ev fired %d type %d status %d lnet %d\n",
 			rpc, sv->sv_name, libcfs_id2str(rpc->srpc_peer),
 			swi_state2str(rpc->srpc_wi.swi_state),
@@ -943,8 +942,8 @@ srpc_server_rpc_done(struct srpc_server_rpc *rpc, int status)
 	LASSERT(rpc->srpc_ev.ev_fired);
 
 	if (!sv->sv_shuttingdown && !list_empty(&scd->scd_buf_blocked)) {
-		buffer = list_entry(scd->scd_buf_blocked.next,
-				    struct srpc_buffer, buf_list);
+		buffer = list_first_entry(&scd->scd_buf_blocked,
+					  struct srpc_buffer, buf_list);
 		list_del(&buffer->buf_list);
 
 		srpc_init_server_rpc(rpc, scd, buffer);
@@ -1535,9 +1534,9 @@ srpc_lnet_ev_handler(struct lnet_event *ev)
 		}
 
 		if (!list_empty(&scd->scd_rpc_free)) {
-			srpc = list_entry(scd->scd_rpc_free.next,
-					  struct srpc_server_rpc,
-					  srpc_list);
+			srpc = list_first_entry(&scd->scd_rpc_free,
+						struct srpc_server_rpc,
+						srpc_list);
 			list_del(&srpc->srpc_list);
 
 			srpc_init_server_rpc(srpc, scd, buffer);
diff --git a/drivers/staging/lustre/lnet/selftest/timer.c b/drivers/staging/lustre/lnet/selftest/timer.c
index c83473ebb368..bb61e3aa11e9 100644
--- a/drivers/staging/lustre/lnet/selftest/timer.c
+++ b/drivers/staging/lustre/lnet/selftest/timer.c
@@ -125,8 +125,8 @@ stt_expire_list(struct list_head *slot, time64_t now)
 	int expired = 0;
 	struct stt_timer *timer;
 
-	while (!list_empty(slot)) {
-		timer = list_entry(slot->next, struct stt_timer, stt_list);
+	while ((timer = list_first_entry_or_null(slot, struct stt_timer,
+						 stt_list)) != NULL) {
 
 		if (timer->stt_expires > now)
 			break;
