From 7d99b6d8e78946e06f066c25145fe7cf93b7d5b4 Mon Sep 17 00:00:00 2001 From: Cody P Schafer Date: Mon, 30 Jan 2017 12:22:26 -0500 Subject: [PATCH] fix for 4.9.y --- prl_fs/SharedFolders/Guest/Linux/prl_fs/Makefile | 2 +- prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c | 15 ++++++++++++++- prl_fs/SharedFolders/Guest/Linux/prl_fs/interface.c | 6 ++++++ prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h | 3 ++- prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c | 8 ++++++-- prl_tg/Toolgate/Guest/Linux/prl_tg/Makefile | 2 +- prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c | 5 +++-- prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_compat.h | 10 ++++++++-- 8 files changed, 41 insertions(+), 10 deletions(-) diff --git a/prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c b/prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c index 5502d70..ccee80c 100644 --- a/prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c +++ b/prl_fs/SharedFolders/Guest/Linux/prl_fs/inode.c @@ -383,10 +383,22 @@ static int prlfs_rmdir(struct inode *dir, struct dentry *dentry) } static int prlfs_rename(struct inode *old_dir, struct dentry *old_de, - struct inode *new_dir, struct dentry *new_de) + struct inode *new_dir, struct dentry *new_de +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0) + , unsigned int flags +#endif + ) { void *np, *nbuf; int nbuflen; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0) + if (flags) { + pr_info_ratelimited("rename got invalid flags: 0x%x\n", flags); + return -EINVAL; + } +#endif + + { PRLFS_STD_INODE_HEAD(old_de) nbuflen = PATH_MAX; nbuf = kmalloc(nbuflen, GFP_KERNEL); @@ -406,6 +418,7 @@ static int prlfs_rename(struct inode *old_dir, struct dentry *old_de, out_free1: kfree(nbuf); PRLFS_STD_INODE_TAIL + } } /* diff --git a/prl_fs/SharedFolders/Guest/Linux/prl_fs/interface.c b/prl_fs/SharedFolders/Guest/Linux/prl_fs/interface.c index 1665ed3..89b809f 100644 --- a/prl_fs/SharedFolders/Guest/Linux/prl_fs/interface.c +++ b/prl_fs/SharedFolders/Guest/Linux/prl_fs/interface.c @@ -114,6 +114,9 @@ int host_request_get_sf_list(struct pci_dev *pdev, void *data, int size) ret = call_tg_sync(pdev, &sdesc); if ((ret == 0) && (Req.Req.Status != TG_STATUS_SUCCESS)) ret = -TG_ERR(Req.Req.Status); + if (ret < 0) { + pr_warn("failed to get sf list: %d\n", ret); + } return ret; } @@ -136,6 +139,9 @@ int host_request_sf_param(struct pci_dev *pdev, void *data, int size, ret = call_tg_sync(pdev, &sdesc); if ((ret == 0) && (Req.Req.Status != TG_STATUS_SUCCESS)) ret = -TG_ERR(Req.Req.Status); + if (ret < 0) { + pr_warn("sf_param failed: %d %d\n", ret, Req.Req.Status); + } return ret; } diff --git a/prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h b/prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h index 77660e0..c6d342a 100644 --- a/prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h +++ b/prl_fs/SharedFolders/Guest/Linux/prl_fs/prlfs.h @@ -149,13 +149,14 @@ int host_request_symlink(struct super_block *sb, const void *src_path, int src_l /* define to 1 to enable copious debugging info */ #undef DRV_DEBUG +#define DRV_DEBUG 1 /* define to 1 to disable lightweight runtime debugging checks */ #undef DRV_NDEBUG #ifdef DRV_DEBUG /* note: prints function name for you */ -# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args) +# define DPRINTK(fmt, args...) pr_debug("%s: " fmt, __FUNCTION__ , ## args) #else # define DPRINTK(fmt, args...) #endif diff --git a/prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c b/prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c index 5b7e5e8..2aae4ce 100644 --- a/prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c +++ b/prl_fs/SharedFolders/Guest/Linux/prl_fs/super.c @@ -441,12 +441,16 @@ static int seq_sf_show(struct seq_file *s, void *v) psp.id = GET_SF_INFO; strncpy((char *)&psp.locale, "utf-8", LOCALE_NAME_LEN - 1); ret = host_request_sf_param(tg_dev, p, PAGE_SIZE, &psp); - if (ret < 0) + if (ret < 0) { + pr_warn("could not get info for %u: %d\n", psp.index, ret); goto free; + } prsp = p; - if (prsp->ret == 0) + if (prsp->ret == 0) { + pr_warn("empty info for %u\n", psp.index); goto free; + } *((char *)prsp + PAGE_SIZE - 1) = 0; seq_printf(s, "%x: %s ", psp.index, prsp->buf); diff --git a/prl_tg/Toolgate/Guest/Linux/prl_tg/Makefile b/prl_tg/Toolgate/Guest/Linux/prl_tg/Makefile index 014ae08..9af5c16 100644 --- a/prl_tg/Toolgate/Guest/Linux/prl_tg/Makefile +++ b/prl_tg/Toolgate/Guest/Linux/prl_tg/Makefile @@ -21,7 +21,7 @@ DRIVER_DIR ?= $(PWD) export DRIVER_DIR -EXTRA_CFLAGS += -I$(DRIVER_DIR) +EXTRA_CFLAGS += -I$(DRIVER_DIR) -DDEBUG=1 EXTRA_CFLAGS += -I$(DRIVER_DIR)/../../../../ # Get version from version.h in kernel source directory diff --git a/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c b/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c index a03e742..a48862d 100644 --- a/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c +++ b/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg.c @@ -42,13 +42,14 @@ static char version[] = KERN_INFO DRIVER_LOAD_MSG "\n"; /* define to 1 to enable copious debugging info */ #undef DRV_DEBUG +#define DRV_DEBUG 1 /* define to 1 to disable lightweight runtime debugging checks */ #undef DRV_NDEBUG #ifdef DRV_DEBUG /* note: prints function name for you */ -# define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args) +# define DPRINTK(fmt, args...) pr_debug("%s: " fmt, __FUNCTION__ , ## args) #else # define DPRINTK(fmt, args...) #endif @@ -480,7 +481,7 @@ static TG_PAGED_BUFFER *map_user_request(TG_PAGED_BUFFER *buf, TG_BUFFER *sbuf, /* lock userspace pages */ got = get_user_pages( sbuf->u.Va, npages, - sbuf->Writable, 0, + sbuf->Writable ? FOLL_WRITE : 0, uple->p, NULL); up_read(¤t->mm->mmap_sem); diff --git a/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_compat.h b/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_compat.h index c158a70..37044b4 100644 --- a/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_compat.h +++ b/prl_tg/Toolgate/Guest/Linux/prl_tg/prltg_compat.h @@ -193,6 +193,12 @@ prltg_proc_create_data(char *name, umode_t mode, struct proc_dir_entry *parent, #define page_cache_get(x) get_page(x) #define page_cache_release(x) put_page(x) #else -#define get_user_pages(_1, _2, _3, _4, _5, _6) \ - get_user_pages(current, current->mm, _1, _2, _3, _4, _5, _6) +#endif + +# if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) +#define get_user_pages(_start, _nr_pages, _gup_flags, _pages, _vmas) \ + get_user_pages(current, current->mm, _start, _nr_pages, !!(_gup_flags & FOLL_WRITE), !!(_gup_flags & FOLL_FORCE), _pages, _vmas) +# elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0) +# define get_user_pages(_start, _nr_pages, _gup_flags, _pages, _vmas) \ + get_user_pages(_start, _nr_pages, !!(_gup_flags & FOLL_WRITE), !!(_gup_flags & FOLL_FORCE), _pages, _vmas) #endif -- 2.11.0