--- /dev/null
+From 032d2a0d068b0368296a56469761394ef03207c3 Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Mon, 6 Sep 2010 16:17:22 +0100
+Subject: drm/i915: Prevent double dpms on
+
+From: Chris Wilson <chris@chris-wilson.co.uk>
+
+commit 032d2a0d068b0368296a56469761394ef03207c3 upstream.
+
+Arguably this is a bug in drm-core in that we should not be called twice
+in succession with DPMS_ON, however this is still occuring and we see
+FDI link training failures on the second call leading to the occassional
+blank display. For the time being ignore the repeated call.
+
+Original patch by Dave Airlie <airlied@redhat.com>
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/gpu/drm/i915/intel_display.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -1954,6 +1954,9 @@ static void intel_crtc_dpms(struct drm_c
+ int pipe = intel_crtc->pipe;
+ bool enabled;
+
++ if (intel_crtc->dpms_mode == mode)
++ return;
++
+ dev_priv->display.dpms(crtc, mode);
+
+ intel_crtc->dpms_mode = mode;
+@@ -4000,7 +4003,7 @@ static void intel_crtc_init(struct drm_d
+ }
+
+ intel_crtc->cursor_addr = 0;
+- intel_crtc->dpms_mode = DRM_MODE_DPMS_OFF;
++ intel_crtc->dpms_mode = -1;
+ drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs);
+
+ intel_crtc->busy = false;
--- /dev/null
+From 9927a403ca8c97798129953fa9cbb5dc259c7cb9 Mon Sep 17 00:00:00 2001
+From: Dan Carpenter <error27@gmail.com>
+Date: Sat, 19 Jun 2010 15:12:51 +0200
+Subject: i915: return -EFAULT if copy_to_user fails
+
+From: Dan Carpenter <error27@gmail.com>
+
+commit 9927a403ca8c97798129953fa9cbb5dc259c7cb9 upstream.
+
+copy_to_user returns the number of bytes remaining to be copied, but we
+want to return a negative error code here. These are returned to
+userspace.
+
+Signed-off-by: Dan Carpenter <error27@gmail.com>
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/gpu/drm/i915/i915_dma.c | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+--- a/drivers/gpu/drm/i915/i915_dma.c
++++ b/drivers/gpu/drm/i915/i915_dma.c
+@@ -683,8 +683,10 @@ static int i915_batchbuffer(struct drm_d
+ ret = copy_from_user(cliprects, batch->cliprects,
+ batch->num_cliprects *
+ sizeof(struct drm_clip_rect));
+- if (ret != 0)
++ if (ret != 0) {
++ ret = -EFAULT;
+ goto fail_free;
++ }
+ }
+
+ mutex_lock(&dev->struct_mutex);
+@@ -725,8 +727,10 @@ static int i915_cmdbuffer(struct drm_dev
+ return -ENOMEM;
+
+ ret = copy_from_user(batch_data, cmdbuf->buf, cmdbuf->sz);
+- if (ret != 0)
++ if (ret != 0) {
++ ret = -EFAULT;
+ goto fail_batch_free;
++ }
+
+ if (cmdbuf->num_cliprects) {
+ cliprects = kcalloc(cmdbuf->num_cliprects,
+@@ -737,8 +741,10 @@ static int i915_cmdbuffer(struct drm_dev
+ ret = copy_from_user(cliprects, cmdbuf->cliprects,
+ cmdbuf->num_cliprects *
+ sizeof(struct drm_clip_rect));
+- if (ret != 0)
++ if (ret != 0) {
++ ret = -EFAULT;
+ goto fail_clip_free;
++ }
+ }
+
+ mutex_lock(&dev->struct_mutex);
+++ /dev/null
-From 006abe887c5e637d059c44310de6c92f36aded3b Mon Sep 17 00:00:00 2001
-From: Trond Myklebust <Trond.Myklebust@netapp.com>
-Date: Sun, 12 Sep 2010 19:55:25 -0400
-Subject: SUNRPC: Fix a race in rpc_info_open
-
-From: Trond Myklebust <Trond.Myklebust@netapp.com>
-
-commit 006abe887c5e637d059c44310de6c92f36aded3b upstream.
-
-There is a race between rpc_info_open and rpc_release_client()
-in that nothing stops a process from opening the file after
-the clnt->cl_kref goes to zero.
-
-Fix this by using atomic_inc_unless_zero()...
-
-Reported-by: J. Bruce Fields <bfields@redhat.com>
-Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
---- a/include/linux/sunrpc/clnt.h
-+++ b/include/linux/sunrpc/clnt.h
-@@ -30,7 +30,7 @@ struct rpc_inode;
- * The high-level client handle
- */
- struct rpc_clnt {
-- struct kref cl_kref; /* Number of references */
-+ atomic_t cl_count; /* Number of references */
- struct list_head cl_clients; /* Global list of clients */
- struct list_head cl_tasks; /* List of tasks */
- spinlock_t cl_lock; /* spinlock */
-diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
-index 657aac6..3a8f53e 100644
---- a/net/sunrpc/clnt.c
-+++ b/net/sunrpc/clnt.c
-@@ -226,7 +226,7 @@ static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, stru
- goto out_no_principal;
- }
-
-- kref_init(&clnt->cl_kref);
-+ atomic_set(&clnt->cl_count, 1);
-
- err = rpc_setup_pipedir(clnt, program->pipe_dir_name);
- if (err < 0)
-@@ -390,14 +390,14 @@ rpc_clone_client(struct rpc_clnt *clnt)
- if (new->cl_principal == NULL)
- goto out_no_principal;
- }
-- kref_init(&new->cl_kref);
-+ atomic_set(&new->cl_count, 1);
- err = rpc_setup_pipedir(new, clnt->cl_program->pipe_dir_name);
- if (err != 0)
- goto out_no_path;
- if (new->cl_auth)
- atomic_inc(&new->cl_auth->au_count);
- xprt_get(clnt->cl_xprt);
-- kref_get(&clnt->cl_kref);
-+ atomic_inc(&clnt->cl_count);
- rpc_register_client(new);
- rpciod_up();
- return new;
-@@ -465,10 +465,8 @@ EXPORT_SYMBOL_GPL(rpc_shutdown_client);
- * Free an RPC client
- */
- static void
--rpc_free_client(struct kref *kref)
-+rpc_free_client(struct rpc_clnt *clnt)
- {
-- struct rpc_clnt *clnt = container_of(kref, struct rpc_clnt, cl_kref);
--
- dprintk("RPC: destroying %s client for %s\n",
- clnt->cl_protname, clnt->cl_server);
- if (!IS_ERR(clnt->cl_path.dentry)) {
-@@ -495,12 +493,10 @@ out_free:
- * Free an RPC client
- */
- static void
--rpc_free_auth(struct kref *kref)
-+rpc_free_auth(struct rpc_clnt *clnt)
- {
-- struct rpc_clnt *clnt = container_of(kref, struct rpc_clnt, cl_kref);
--
- if (clnt->cl_auth == NULL) {
-- rpc_free_client(kref);
-+ rpc_free_client(clnt);
- return;
- }
-
-@@ -509,10 +505,11 @@ rpc_free_auth(struct kref *kref)
- * release remaining GSS contexts. This mechanism ensures
- * that it can do so safely.
- */
-- kref_init(kref);
-+ atomic_inc(&clnt->cl_count);
- rpcauth_release(clnt->cl_auth);
- clnt->cl_auth = NULL;
-- kref_put(kref, rpc_free_client);
-+ if (atomic_dec_and_test(&clnt->cl_count))
-+ rpc_free_client(clnt);
- }
-
- /*
-@@ -525,7 +522,8 @@ rpc_release_client(struct rpc_clnt *clnt)
-
- if (list_empty(&clnt->cl_tasks))
- wake_up(&destroy_wait);
-- kref_put(&clnt->cl_kref, rpc_free_auth);
-+ if (atomic_dec_and_test(&clnt->cl_count))
-+ rpc_free_auth(clnt);
- }
-
- /**
-@@ -588,7 +586,7 @@ void rpc_task_set_client(struct rpc_task *task, struct rpc_clnt *clnt)
- if (clnt != NULL) {
- rpc_task_release_client(task);
- task->tk_client = clnt;
-- kref_get(&clnt->cl_kref);
-+ atomic_inc(&clnt->cl_count);
- if (clnt->cl_softrtry)
- task->tk_flags |= RPC_TASK_SOFT;
- /* Add to the client's list of all tasks */
-diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
-index 41a762f..8c8eef2 100644
---- a/net/sunrpc/rpc_pipe.c
-+++ b/net/sunrpc/rpc_pipe.c
-@@ -371,21 +371,23 @@ rpc_show_info(struct seq_file *m, void *v)
- static int
- rpc_info_open(struct inode *inode, struct file *file)
- {
-- struct rpc_clnt *clnt;
-+ struct rpc_clnt *clnt = NULL;
- int ret = single_open(file, rpc_show_info, NULL);
-
- if (!ret) {
- struct seq_file *m = file->private_data;
-- mutex_lock(&inode->i_mutex);
-- clnt = RPC_I(inode)->private;
-- if (clnt) {
-- kref_get(&clnt->cl_kref);
-+
-+ spin_lock(&file->f_path.dentry->d_lock);
-+ if (!d_unhashed(file->f_path.dentry))
-+ clnt = RPC_I(inode)->private;
-+ if (clnt != NULL && atomic_inc_not_zero(&clnt->cl_count)) {
-+ spin_unlock(&file->f_path.dentry->d_lock);
- m->private = clnt;
- } else {
-+ spin_unlock(&file->f_path.dentry->d_lock);
- single_release(inode, file);
- ret = -EINVAL;
- }
-- mutex_unlock(&inode->i_mutex);
- }
- return ret;
- }