Linux: Handle llseek failure
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Mon, 25 Jan 2010 00:02:11 +0000 (00:02 +0000)
committerDerrick Brashear <shadow|account-1000005@unknown>
Mon, 25 Jan 2010 05:39:54 +0000 (21:39 -0800)
If llseek fails, then we return immediately, potentially leaving the
wrong address space configured for this process, and without resetting
the processes saved limits.

Fix this by creating a common exit point for osi_rdwr, and using it.

Change-Id: Ifff8cb0155f92a4130d21828d5ee2d2a55c09195
Reviewed-on: http://gerrit.openafs.org/1155
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/LINUX/osi_file.c

index c159823..31ef063 100644 (file)
@@ -387,7 +387,8 @@ osi_rdwr(struct osi_file *osifile, uio_t * uiop, int rw)
     /* seek to the desired position. Return -1 on error. */
     if (filp->f_op->llseek) {
        if (filp->f_op->llseek(filp, (loff_t) uiop->uio_offset, 0) != uiop->uio_offset)
-           return -1;
+           code = -1;
+           goto out;
     } else
        filp->f_pos = uiop->uio_offset;
 
@@ -425,6 +426,7 @@ osi_rdwr(struct osi_file *osifile, uio_t * uiop, int rw)
        code = 0;
     }
 
+out:
     if (uiop->uio_seg == AFS_UIOSYS)
        TO_KERNEL_SPACE();