])
#
+# FC18 3.7.2-201 unexport sock_map_fd() change to
+# use sock_alloc_file().
+# upstream commit 56b31d1c9f1e6a3ad92e7bfe252721e05d92b285
+#
+AC_DEFUN([LIBCFS_SOCK_ALLOC_FILE],
+[AC_MSG_CHECKING([sock_alloc_file is exported])
+LB_CHECK_SYMBOL_EXPORT([sock_alloc_file], [net/socket.c],[
+ LB_LINUX_TRY_COMPILE([
+ #include <linux/net.h>
+ ],[
+ sock_alloc_file(NULL, 0, NULL);
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SOCK_ALLOC_FILE_3ARGS, 1,
+ [sock_alloc_file takes 3 arguments])
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SOCK_ALLOC_FILE, 1,
+ [sock_alloc_file is exported])
+ ])
+],[
+])
+])
+
+#
# LIBCFS_PROG_LINUX
#
# LNet linux kernel checks
LC_SK_SLEEP
# 2.6.40 fc15
LC_SHRINK_CONTROL
+# 3.7
+LIBCFS_SOCK_ALLOC_FILE
])
#
int
libcfs_sock_ioctl(int cmd, unsigned long arg)
{
- mm_segment_t oldmm = get_fs();
- struct socket *sock;
- int fd;
- int rc;
- struct file *sock_filp;
+ mm_segment_t oldmm = get_fs();
+ struct socket *sock;
+ int fd = -1;
+ int rc;
+ struct file *sock_filp;
rc = sock_create (PF_INET, SOCK_STREAM, 0, &sock);
if (rc != 0) {
return rc;
}
-#ifdef HAVE_SOCK_MAP_FD_2ARG
- fd = sock_map_fd(sock,0);
+#if !defined(HAVE_SOCK_ALLOC_FILE) && !defined(HAVE_SOCK_ALLOC_FILE_3ARGS)
+# ifdef HAVE_SOCK_MAP_FD_2ARG
+ fd = sock_map_fd(sock,0);
+# else
+ fd = sock_map_fd(sock);
+# endif
+ if (fd < 0) {
+ rc = fd;
+ sock_release(sock);
+ goto out;
+ }
+ sock_filp = fget(fd);
#else
- fd = sock_map_fd(sock);
+# ifdef HAVE_SOCK_ALLOC_FILE_3ARGS
+ sock_filp = sock_alloc_file(sock, 0, NULL);
+# else
+ sock_filp = sock_alloc_file(sock, 0);
+# endif
#endif
- if (fd < 0) {
- rc = fd;
- sock_release(sock);
- goto out;
- }
-
- sock_filp = fget(fd);
if (!sock_filp) {
rc = -ENOMEM;
- goto out_fd;
+ sock_release(sock);
+ goto out;
}
set_fs(KERNEL_DS);
fput(sock_filp);
- out_fd:
- sys_close(fd);
out:
+ if (fd >= 0)
+ sys_close(fd);
+
return rc;
}