--- ./fs/vzdquot.c.orig-quota 2007-06-05 18:04:04.000000000 +0400 +++ ./fs/vzdquot.c 2007-06-19 19:16:39.000000000 +0400 @@ -614,7 +614,7 @@ void vzquota_qlnk_destroy(struct vz_quot * @qlt list is reinitialized. */ static void vzquota_qlnk_swap(struct vz_quota_ilink *qlt, - struct vz_quota_ilink *qli) + struct vz_quota_ilink *qli, struct inode *inode) { struct vz_quota_master *qb; struct vz_quota_ugid *qu; @@ -624,7 +624,8 @@ static void vzquota_qlnk_swap(struct vz_ qlt->qmblk = qli->qmblk; qli->qmblk = qb; list_del_init(&qli->list); - if (qb != __VZ_QUOTA_EMPTY && qb != VZ_QUOTA_BAD) + if (qb != __VZ_QUOTA_EMPTY && qb != VZ_QUOTA_BAD && + !VZ_QUOTA_IS_NOQUOTA(qb, inode->i_sb)) list_add(&qli->list, &qb->dq_ilink_list); INIT_LIST_HEAD(&qlt->list); set_qlnk_origin(qli, VZ_QUOTAO_SWAP); @@ -803,7 +804,7 @@ static void vzquota_inode_drop(struct in vzquota_qlnk_init(&qlnk); inode_qmblk_lock(inode->i_sb); - vzquota_qlnk_swap(&qlnk, INODE_QLNK(inode)); + vzquota_qlnk_swap(&qlnk, INODE_QLNK(inode), inode); set_qlnk_origin(INODE_QLNK(inode), VZ_QUOTAO_DRCAL); inode->i_dquot[USRQUOTA] = NODQUOT; inode_qmblk_unlock(inode->i_sb); @@ -852,7 +853,7 @@ static int vzquota_inode_qmblk_set(struc if (vzquota_qlnk_reinit_locked(qlnk, inode)) return 1; } - vzquota_qlnk_swap(qlnk, INODE_QLNK(inode)); + vzquota_qlnk_swap(qlnk, INODE_QLNK(inode), inode); set_qlnk_origin(INODE_QLNK(inode), VZ_QUOTAO_QSET); return 0; } @@ -1380,7 +1381,7 @@ finish: /* all references obtained successfully */ ret = vzquota_transfer_usage(inode, mask, &qlnew); if (!ret) { - vzquota_qlnk_swap(&qlnew, INODE_QLNK(inode)); + vzquota_qlnk_swap(&qlnew, INODE_QLNK(inode), inode); set_qlnk_origin(INODE_QLNK(inode), VZ_QUOTAO_TRANS); } out_unlock: