Author: kib
Date: Mon Oct 15 18:15:18 2012
New Revision: 241597
URL: http://svn.freebsd.org/changeset/base/241597

Log:
  Acquire the rangelock for truncate(2) as well.
  
  Reported and reviewed by:     avg
  Tested by:    pho
  MFC after:    1 week

Modified:
  head/sys/kern/vfs_syscalls.c

Modified: head/sys/kern/vfs_syscalls.c
==============================================================================
--- head/sys/kern/vfs_syscalls.c        Mon Oct 15 17:19:47 2012        
(r241596)
+++ head/sys/kern/vfs_syscalls.c        Mon Oct 15 18:15:18 2012        
(r241597)
@@ -3433,10 +3433,10 @@ kern_truncate(struct thread *td, char *p
 {
        struct mount *mp;
        struct vnode *vp;
+       void *rl_cookie;
        struct vattr vattr;
-       int error;
        struct nameidata nd;
-       int vfslocked;
+       int error, vfslocked;
 
        if (length < 0)
                return(EINVAL);
@@ -3445,7 +3445,9 @@ kern_truncate(struct thread *td, char *p
                return (error);
        vfslocked = NDHASGIANT(&nd);
        vp = nd.ni_vp;
+       rl_cookie = vn_rangelock_wlock(vp, 0, OFF_MAX);
        if ((error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) {
+               vn_rangelock_unlock(vp, rl_cookie);
                vrele(vp);
                VFS_UNLOCK_GIANT(vfslocked);
                return (error);
@@ -3464,8 +3466,10 @@ kern_truncate(struct thread *td, char *p
                vattr.va_size = length;
                error = VOP_SETATTR(vp, &vattr, td->td_ucred);
        }
-       vput(vp);
+       VOP_UNLOCK(vp, 0);
        vn_finished_write(mp);
+       vn_rangelock_unlock(vp, rl_cookie);
+       vrele(vp);
        VFS_UNLOCK_GIANT(vfslocked);
        return (error);
 }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to