Re: RFC: support srcaddr= option to bind to local IPs.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/07/2010 10:56 AM, Trond Myklebust wrote:
On Fri, 2010-09-03 at 11:55 -0700, Ben Greear wrote:
This patch lets one bind the local side of NFS sockets to a particular
IP address.  This can be useful for users on multi-homed systems.

This patch must be on top of the previous patch to fix the IPv6 address
comparison or it will not work.

Comments and suggestions welcome...I'll incorporate those and post an
official signed-off patch after that.

Thanks,
Ben


The code in nfs_callback_authenticate is going to break NFSv4 callbacks.
Callbacks are sent to the -oclientaddr address, not srcaddr (btw, I
really dislike that new boolean argument to nfs_find_client(). If you
don't want to compare the source address, then have the caller pass a
NULL pointer).


Would this fix the callback issue you speak of?  The idea is to
use source and dest to match if it exists, but if we find one
where server address matches and srcaddr isn't specified,
then we will use that.

@@ -384,10 +390,30 @@ struct nfs_client *nfs_find_client(const struct sockaddr *addr, u32 nfsversion)
                if (!nfs_sockaddr_match_ipaddr(addr, clap))
                        continue;

+               if (srcaddr) {
+                       const struct sockaddr *sa;
+                       sa = (const struct sockaddr *)&clp->srcaddr;
+                       if (!nfs_sockaddr_match_ipaddr(srcaddr, sa)) {
+                               /* If clp doesn't bind to srcaddr, then
+                                * it is a potential match if we don't find
+                                * a better one.
+                                */
+                               if (sa->sa_family == AF_UNSPEC && !ok_fit)
+                                       ok_fit = clp;
+                               continue;
+                       }
+               }
+found_one:
                atomic_inc(&clp->cl_count);
                spin_unlock(&nfs_client_lock);
                return clp;
        }
+
+       if (ok_fit) {
+               clp = ok_fit;
+               goto found_one;
+       }
+
        spin_unlock(&nfs_client_lock);
        return NULL;
 }


Thanks,
Ben

--
Ben Greear <greearb@xxxxxxxxxxxxxxx>
Candela Technologies Inc  http://www.candelatech.com

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux