| --- a/compat/drivers-base-dma-buf.c |
| +++ b/compat/drivers-base-dma-buf.c |
| @@ -27,6 +27,10 @@ |
| #include <linux/dma-buf.h> |
| #include <linux/anon_inodes.h> |
| #include <linux/export.h> |
| +#include <linux/file.h> |
| +#include <linux/fdtable.h> |
| +#include <linux/bitops.h> |
| +#include <linux/sched.h> |
| #include <linux/debugfs.h> |
| #include <linux/seq_file.h> |
| |
| @@ -179,6 +183,27 @@ struct dma_buf *dma_buf_export_named(voi |
| } |
| EXPORT_SYMBOL_GPL(dma_buf_export_named); |
| |
| +static void dma_buf_fd_set_flag(int fd, int flags) |
| +{ |
| + struct fdtable *fdt; |
| + struct files_struct *files = current->files; |
| + |
| + spin_lock(&files->file_lock); |
| + fdt = files_fdtable(files); |
| + if (flags & O_CLOEXEC) |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) |
| + __set_bit(fd, fdt->close_on_exec); |
| +#else |
| + FD_SET(fd, fdt->close_on_exec); |
| +#endif |
| + else |
| +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) |
| + __clear_bit(fd, fdt->close_on_exec); |
| +#else |
| + FD_CLR(fd, fdt->close_on_exec); |
| +#endif |
| + spin_unlock(&files->file_lock); |
| +} |
| |
| /** |
| * dma_buf_fd - returns a file descriptor for the given dma_buf |
| @@ -194,9 +219,10 @@ int dma_buf_fd(struct dma_buf *dmabuf, i |
| if (!dmabuf || !dmabuf->file) |
| return -EINVAL; |
| |
| - fd = get_unused_fd_flags(flags); |
| + fd = get_unused_fd(); |
| if (fd < 0) |
| return fd; |
| + dma_buf_fd_set_flag(fd, flags); |
| |
| fd_install(fd, dmabuf->file); |
| |
| @@ -723,17 +749,15 @@ static inline void dma_buf_uninit_debugf |
| } |
| #endif |
| |
| -static int __init dma_buf_init(void) |
| +int __init dma_buf_init(void) |
| { |
| mutex_init(&db_list.lock); |
| INIT_LIST_HEAD(&db_list.head); |
| dma_buf_init_debugfs(); |
| return 0; |
| } |
| -subsys_initcall(dma_buf_init); |
| |
| -static void __exit dma_buf_deinit(void) |
| +void __exit dma_buf_deinit(void) |
| { |
| dma_buf_uninit_debugfs(); |
| } |
| -__exitcall(dma_buf_deinit); |