vserver 1.9.3
[linux-2.6.git] / include / linux / vs_network.h
index 915ad17..4bbf923 100644 (file)
@@ -27,7 +27,7 @@ static inline struct nx_info *__get_nx_info(struct nx_info *nxi,
 }
 
 
-#define        free_nx_info(i) \
+#define free_nx_info(i) \
        call_rcu(&i->nx_rcu, rcu_free_nx_info);
 
 #define put_nx_info(i) __put_nx_info(i,__FILE__,__LINE__)
@@ -43,41 +43,45 @@ static inline void __put_nx_info(struct nx_info *nxi, const char *_file, int _li
                free_nx_info(nxi);
 }
 
-
 #define set_nx_info(p,i) __set_nx_info(p,i,__FILE__,__LINE__)
 
 static inline void __set_nx_info(struct nx_info **nxp, struct nx_info *nxi,
        const char *_file, int _line)
 {
-       BUG_ON(*nxp);
+       struct nx_info *nxo;
+
        if (!nxi)
                return;
+
        vxlprintk(VXD_CBIT(nid, 3), "set_nx_info(%p[#%d.%d.%d])",
                nxi, nxi?nxi->nx_id:0,
                nxi?atomic_read(&nxi->nx_usecnt):0,
                nxi?atomic_read(&nxi->nx_refcnt):0,
                _file, _line);
+
        atomic_inc(&nxi->nx_refcnt);
-       *nxp = __get_nx_info(nxi, _file, _line);
+       nxo = xchg(nxp, __get_nx_info(nxi, _file, _line));
+       BUG_ON(nxo);
 }
 
-#define        clr_nx_info(p)  __clr_nx_info(p,__FILE__,__LINE__)
+#define clr_nx_info(p) __clr_nx_info(p,__FILE__,__LINE__)
 
 static inline void __clr_nx_info(struct nx_info **nxp,
        const char *_file, int _line)
 {
-       struct nx_info *nxo = *nxp;
+       struct nx_info *nxo;
 
+       nxo = xchg(nxp, NULL);
        if (!nxo)
                return;
+
        vxlprintk(VXD_CBIT(nid, 3), "clr_nx_info(%p[#%d.%d.%d])",
                nxo, nxo?nxo->nx_id:0,
                nxo?atomic_read(&nxo->nx_usecnt):0,
                nxo?atomic_read(&nxo->nx_refcnt):0,
                _file, _line);
-       *nxp = NULL;
-       wmb();
-       if (nxo && atomic_dec_and_test(&nxo->nx_refcnt))
+
+       if (atomic_dec_and_test(&nxo->nx_refcnt))
                unhash_nx_info(nxo);
        __put_nx_info(nxo, _file, _line);
 }
@@ -89,7 +93,7 @@ static __inline__ struct nx_info *__task_get_nx_info(struct task_struct *p,
        const char *_file, int _line)
 {
        struct nx_info *nxi;
-       
+
        task_lock(p);
        nxi = __get_nx_info(p->nx_info, _file, _line);
        vxlprintk(VXD_CBIT(nid, 5), "task_get_nx_info(%p)",
@@ -123,7 +127,7 @@ static __inline__ void __nx_verify_info(
 
 #define __nx_flags(v,m,f)      (((v) & (m)) ^ (f))
 
-#define        __nx_task_flags(t,m,f) \
+#define __nx_task_flags(t,m,f) \
        (((t) && ((t)->nx_info)) ? \
                __nx_flags((t)->nx_info->nx_flags,(m),(f)) : 0)
 
@@ -139,6 +143,21 @@ static __inline__ void __nx_verify_info(
 #define nx_ncaps(c)    (nx_current_ncaps() & (c))
 
 
+static inline int addr_in_nx_info(struct nx_info *nxi, uint32_t addr)
+{
+       int n,i;
+
+       if (!nxi)
+               return 1;
+
+       n = nxi->nbipv4;
+       for (i=0; i<n; i++) {
+               if (nxi->ipv4[i] == addr)
+                       return 1;
+       }
+       return 0;
+}
+
 
 #else
 #warning duplicate inclusion