summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/ufs/ufs/ufs_vnops.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c
index 5028975..850cb04 100644
--- a/sys/ufs/ufs/ufs_vnops.c
+++ b/sys/ufs/ufs/ufs_vnops.c
@@ -309,7 +309,7 @@ ufs_access(ap)
struct vnode *vp = ap->a_vp;
struct inode *ip = VTOI(vp);
mode_t mode = ap->a_mode;
- int error;
+ int error, relocked;
#ifdef UFS_ACL
struct acl *acl;
#endif
@@ -326,6 +326,28 @@ ufs_access(ap)
case VREG:
if (vp->v_mount->mnt_flag & MNT_RDONLY)
return (EROFS);
+#ifdef QUOTA
+ if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) {
+ relocked = 1;
+ vhold(vp);
+ vn_lock(vp, LK_UPGRADE | LK_RETRY);
+ VI_LOCK(vp);
+ vdropl(vp);
+ if (vp->v_iflag & VI_DOOMED) {
+ VI_UNLOCK(vp);
+ error = ENOENT;
+ goto relock;
+ }
+ VI_UNLOCK(vp);
+ } else
+ relocked = 0;
+ error = getinoquota(ip);
+relock:
+ if (relocked)
+ vn_lock(vp, LK_DOWNGRADE | LK_RETRY);
+ if (error != 0)
+ return (error);
+#endif
break;
default:
break;
OpenPOWER on IntegriCloud