svc->num_dests++;
 
                /* call the update_service function of its scheduler */
-               svc->scheduler->update_service(svc);
+               if (svc->scheduler->update_service)
+                       svc->scheduler->update_service(svc);
 
                write_unlock_bh(&__ip_vs_svc_lock);
                return 0;
        svc->num_dests++;
 
        /* call the update_service function of its scheduler */
-       svc->scheduler->update_service(svc);
+       if (svc->scheduler->update_service)
+               svc->scheduler->update_service(svc);
 
        write_unlock_bh(&__ip_vs_svc_lock);
 
        IP_VS_WAIT_WHILE(atomic_read(&svc->usecnt) > 1);
 
        /* call the update_service, because server weight may be changed */
-       svc->scheduler->update_service(svc);
+       if (svc->scheduler->update_service)
+               svc->scheduler->update_service(svc);
 
        write_unlock_bh(&__ip_vs_svc_lock);
 
         */
        list_del(&dest->n_list);
        svc->num_dests--;
-       if (svcupd) {
-               /*
-                *  Call the update_service function of its scheduler
-                */
-               svc->scheduler->update_service(svc);
-       }
+
+       /*
+        *  Call the update_service function of its scheduler
+        */
+       if (svcupd && svc->scheduler->update_service)
+                       svc->scheduler->update_service(svc);
 }
 
 
 
 }
 
 
-static int ip_vs_lblc_update_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
 static inline struct ip_vs_dest *
 __ip_vs_wlc_schedule(struct ip_vs_service *svc, struct iphdr *iph)
 {
        .n_list =               LIST_HEAD_INIT(ip_vs_lblc_scheduler.n_list),
        .init_service =         ip_vs_lblc_init_svc,
        .done_service =         ip_vs_lblc_done_svc,
-       .update_service =       ip_vs_lblc_update_svc,
        .schedule =             ip_vs_lblc_schedule,
 };
 
 
 }
 
 
-static int ip_vs_lblcr_update_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
 static inline struct ip_vs_dest *
 __ip_vs_wlc_schedule(struct ip_vs_service *svc, struct iphdr *iph)
 {
        .n_list =               LIST_HEAD_INIT(ip_vs_lblcr_scheduler.n_list),
        .init_service =         ip_vs_lblcr_init_svc,
        .done_service =         ip_vs_lblcr_done_svc,
-       .update_service =       ip_vs_lblcr_update_svc,
        .schedule =             ip_vs_lblcr_schedule,
 };
 
 
 #include <net/ip_vs.h>
 
 
-static int ip_vs_lc_init_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
-static int ip_vs_lc_done_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
-static int ip_vs_lc_update_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
 static inline unsigned int
 ip_vs_lc_dest_overhead(struct ip_vs_dest *dest)
 {
        .refcnt =               ATOMIC_INIT(0),
        .module =               THIS_MODULE,
        .n_list =               LIST_HEAD_INIT(ip_vs_lc_scheduler.n_list),
-       .init_service =         ip_vs_lc_init_svc,
-       .done_service =         ip_vs_lc_done_svc,
-       .update_service =       ip_vs_lc_update_svc,
        .schedule =             ip_vs_lc_schedule,
 };
 
 
 #include <net/ip_vs.h>
 
 
-static int
-ip_vs_nq_init_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
-static int
-ip_vs_nq_done_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
-static int
-ip_vs_nq_update_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
 static inline unsigned int
 ip_vs_nq_dest_overhead(struct ip_vs_dest *dest)
 {
        .refcnt =               ATOMIC_INIT(0),
        .module =               THIS_MODULE,
        .n_list =               LIST_HEAD_INIT(ip_vs_nq_scheduler.n_list),
-       .init_service =         ip_vs_nq_init_svc,
-       .done_service =         ip_vs_nq_done_svc,
-       .update_service =       ip_vs_nq_update_svc,
        .schedule =             ip_vs_nq_schedule,
 };
 
 
 }
 
 
-static int ip_vs_rr_done_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
 static int ip_vs_rr_update_svc(struct ip_vs_service *svc)
 {
        svc->sched_data = &svc->destinations;
        .module =               THIS_MODULE,
        .n_list =               LIST_HEAD_INIT(ip_vs_rr_scheduler.n_list),
        .init_service =         ip_vs_rr_init_svc,
-       .done_service =         ip_vs_rr_done_svc,
        .update_service =       ip_vs_rr_update_svc,
        .schedule =             ip_vs_rr_schedule,
 };
 
 #include <net/ip_vs.h>
 
 
-static int
-ip_vs_sed_init_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
-static int
-ip_vs_sed_done_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
-static int
-ip_vs_sed_update_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
 static inline unsigned int
 ip_vs_sed_dest_overhead(struct ip_vs_dest *dest)
 {
        .refcnt =               ATOMIC_INIT(0),
        .module =               THIS_MODULE,
        .n_list =               LIST_HEAD_INIT(ip_vs_sed_scheduler.n_list),
-       .init_service =         ip_vs_sed_init_svc,
-       .done_service =         ip_vs_sed_done_svc,
-       .update_service =       ip_vs_sed_update_svc,
        .schedule =             ip_vs_sed_schedule,
 };
 
 
 #include <net/ip_vs.h>
 
 
-static int
-ip_vs_wlc_init_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
-static int
-ip_vs_wlc_done_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
-static int
-ip_vs_wlc_update_svc(struct ip_vs_service *svc)
-{
-       return 0;
-}
-
-
 static inline unsigned int
 ip_vs_wlc_dest_overhead(struct ip_vs_dest *dest)
 {
        .refcnt =               ATOMIC_INIT(0),
        .module =               THIS_MODULE,
        .n_list =               LIST_HEAD_INIT(ip_vs_wlc_scheduler.n_list),
-       .init_service =         ip_vs_wlc_init_svc,
-       .done_service =         ip_vs_wlc_done_svc,
-       .update_service =       ip_vs_wlc_update_svc,
        .schedule =             ip_vs_wlc_schedule,
 };