]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/linux/lockd/lockd.h
Merge branches 'topic/fix/misc' and 'topic/fix/hda' into for-linus
[linux-2.6-omap-h63xx.git] / include / linux / lockd / lockd.h
index 973ab1d6e862a8b9e273fd6d62d76d8226a6c7cf..b56d5aa9b194c0d87296b303874d331b84246413 100644 (file)
@@ -207,7 +207,8 @@ int           nlm_async_reply(struct nlm_rqst *, u32, const struct rpc_call_ops *);
 struct nlm_wait * nlmclnt_prepare_block(struct nlm_host *host, struct file_lock *fl);
 void             nlmclnt_finish_block(struct nlm_wait *block);
 int              nlmclnt_block(struct nlm_wait *block, struct nlm_rqst *req, long timeout);
-__be32           nlmclnt_grant(const struct sockaddr_in *addr, const struct nlm_lock *);
+__be32           nlmclnt_grant(const struct sockaddr *addr,
+                               const struct nlm_lock *lock);
 void             nlmclnt_recovery(struct nlm_host *);
 int              nlmclnt_reclaim(struct nlm_host *, struct file_lock *);
 void             nlmclnt_next_cookie(struct nlm_cookie *);
@@ -215,12 +216,14 @@ void                nlmclnt_next_cookie(struct nlm_cookie *);
 /*
  * Host cache
  */
-struct nlm_host  *nlmclnt_lookup_host(const struct sockaddr_in *sin,
-                                       int proto, u32 version,
+struct nlm_host  *nlmclnt_lookup_host(const struct sockaddr *sap,
+                                       const size_t salen,
+                                       const unsigned short protocol,
+                                       const u32 version,
+                                       const char *hostname);
+struct nlm_host  *nlmsvc_lookup_host(const struct svc_rqst *rqstp,
                                        const char *hostname,
-                                       unsigned int hostname_len);
-struct nlm_host  *nlmsvc_lookup_host(struct svc_rqst *, const char *,
-                                       unsigned int);
+                                       const size_t hostname_len);
 struct rpc_clnt * nlm_bind_host(struct nlm_host *);
 void             nlm_rebind_host(struct nlm_host *);
 struct nlm_host * nlm_get_host(struct nlm_host *);
@@ -274,6 +277,47 @@ static inline struct inode *nlmsvc_file_inode(struct nlm_file *file)
        return file->f_file->f_path.dentry->d_inode;
 }
 
+static inline int __nlm_privileged_request4(const struct sockaddr *sap)
+{
+       const struct sockaddr_in *sin = (struct sockaddr_in *)sap;
+       return (sin->sin_addr.s_addr == htonl(INADDR_LOOPBACK)) &&
+                       (ntohs(sin->sin_port) < 1024);
+}
+
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+static inline int __nlm_privileged_request6(const struct sockaddr *sap)
+{
+       const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
+       return (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LOOPBACK) &&
+                       (ntohs(sin6->sin6_port) < 1024);
+}
+#else  /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
+static inline int __nlm_privileged_request6(const struct sockaddr *sap)
+{
+       return 0;
+}
+#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */
+
+/*
+ * Ensure incoming requests are from local privileged callers.
+ *
+ * Return TRUE if sender is local and is connecting via a privileged port;
+ * otherwise return FALSE.
+ */
+static inline int nlm_privileged_requester(const struct svc_rqst *rqstp)
+{
+       const struct sockaddr *sap = svc_addr(rqstp);
+
+       switch (sap->sa_family) {
+       case AF_INET:
+               return __nlm_privileged_request4(sap);
+       case AF_INET6:
+               return __nlm_privileged_request6(sap);
+       default:
+               return 0;
+       }
+}
+
 static inline int __nlm_cmp_addr4(const struct sockaddr *sap1,
                                  const struct sockaddr *sap2)
 {