xfs: Add pquota fields where gquota is used
PATCH 2/4 xfs: Add pquota fields where gquota is used
Add project quota changes to all the places where group quota field is used. No externally visible changed and no superblock changes, yet.
--- fs/xfs/xfs_dquot.c | 2 +- fs/xfs/xfs_dquot.h | 13 ++- fs/xfs/xfs_iget.c | 2 +- fs/xfs/xfs_inode.h | 1 + fs/xfs/xfs_ioctl.c | 10 +- fs/xfs/xfs_iops.c | 4 +- fs/xfs/xfs_qm.c | 271 ++++++++++++++++++++++++++++++---------------- fs/xfs/xfs_qm.h | 7 ++ fs/xfs/xfs_qm_bhv.c | 2 +- fs/xfs/xfs_qm_syscalls.c | 19 +++- fs/xfs/xfs_quota.h | 32 +++--- fs/xfs/xfs_sb.h | 1 + fs/xfs/xfs_super.c | 6 +- fs/xfs/xfs_trans_dquot.c | 39 +++++-- fs/xfs/xfs_vnodeops.c | 28 ++++-- 15 files changed, 294 insertions(+), 143 deletions(-)
fs/xfs/xfs_dquot.c +1 -1
@@ -540,7 +540,7 @@ xfs_qm_dqread(/* * get a pointer to the on-disk dquot and the buffer containing it -* dqp already knows its own type (GROUP/USER). +* dqp already knows its own type (GROUP/USER/PROJECT). */ error =xfs_qm_dqtobp (&tp, dqp, &ddqp, &bp, flags);if (error) {
fs/xfs/xfs_dquot.h +9 -4
@@ -45,7 +45,8 @@ typedef struct xfs_dquot {int q_bufoffset;/* off of dq in buffer (# dquots) */ xfs_fileoff_t q_fileoffset;/* offset in quotas file */ -struct xfs_dquot *q_gdquot;/* group dquot, hint only */ +struct xfs_dquot *q_gdquot;/* group dquot, hint only */ +struct xfs_dquot *q_pdquot;/* project dquot, hint only */ xfs_disk_dquot_t q_core;/* actual usage & quotas */ xfs_dq_logitem_t q_logitem;/* dquot log item */ xfs_qcnt_t q_res_bcount;/* total regular nblks used+reserved */
@@ -108,8 +109,9 @@ static inline int xfs_this_quota_on(struct xfs_mount *mp, int type)case XFS_DQ_USER :return XFS_IS_UQUOTA_ON (mp);case XFS_DQ_GROUP : +return XFS_IS_GQUOTA_ON (mp);case XFS_DQ_PROJ : -return XFS_IS_OQUOTA_ON (mp); +return XFS_IS_PQUOTA_ON (mp);default :return 0 ; }
@@ -121,8 +123,9 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type)case XFS_DQ_USER :return ip->i_udquot;case XFS_DQ_GROUP : -case XFS_DQ_PROJ :return ip->i_gdquot; +case XFS_DQ_PROJ : +return ip->i_pdquot;default :return NULL ; }
@@ -136,7 +139,9 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type)#define XFS_DQ_TO_QINF (dqp) ((dqp)->q_mount->m_quotainfo)#define XFS_DQ_TO_QIP (dqp) (XFS_QM_ISUDQ(dqp) ? \ XFS_DQ_TO_QINF(dqp)->qi_uquotaip : \ - XFS_DQ_TO_QINF(dqp)->qi_gquotaip) + (XFS_QM_ISGDQ(dqp) ? \ + XFS_DQ_TO_QINF(dqp)->qi_gquotaip : \ + XFS_DQ_TO_QINF(dqp)->qi_pquotaip))extern int xfs_qm_dqread (struct xfs_mount *,xfs_dqid_t ,uint ,uint ,struct xfs_dquot **);
fs/xfs/xfs_iget.c +1 -1
@@ -346,7 +346,7 @@ xfs_iget_cache_miss( iflags =XFS_INEW ;if (flags &XFS_IGET_DONTCACHE ) iflags |=XFS_IDONTCACHE ; - ip->i_udquot = ip->i_gdquot =NULL ; + ip->i_udquot = ip->i_gdquot = ip->i_pdquot =NULL ;xfs_iflags_set (ip, iflags);/* insert the new inode */
fs/xfs/xfs_inode.h +1 -0
@@ -224,6 +224,7 @@ typedef struct xfs_inode {struct xfs_mount *i_mount;/* fs mount struct ptr */ struct xfs_dquot *i_udquot;/* user dquot */ struct xfs_dquot *i_gdquot;/* group dquot */ +struct xfs_dquot *i_pdquot;/* project dquot */ /* Inode location stuff */ xfs_ino_t i_ino;/* inode number (agno/agino)*/
fs/xfs/xfs_ioctl.c +6 -4
@@ -908,6 +908,7 @@ xfs_ioctl_setattr(unsigned int lock_flags =0 ;struct xfs_dquot *udqp =NULL ;struct xfs_dquot *gdqp =NULL ; +struct xfs_dquot *pdqp =NULL ;struct xfs_dquot *olddquot =NULL ;int code;
@@ -936,7 +937,7 @@ xfs_ioctl_setattr(if (XFS_IS_QUOTA_ON (mp) && (mask &FSX_PROJID )) { code =xfs_qm_vop_dqalloc (ip, ip->i_d.di_uid, ip->i_d.di_gid, fa->fsx_projid, -XFS_QMOPT_PQUOTA , &udqp, &gdqp); +XFS_QMOPT_PQUOTA , &udqp,NULL , &pdqp);if (code)return code; }
@@ -973,8 +974,8 @@ xfs_ioctl_setattr( XFS_IS_PQUOTA_ON(mp) && xfs_get_projid(ip) != fa->fsx_projid) {ASSERT (tp); - code =xfs_qm_vop_chown_reserve (tp, ip, udqp, gdqp, -capable (CAP_FOWNER ) ? + code =xfs_qm_vop_chown_reserve (tp, ip, udqp,NULL , + pdqp,capable (CAP_FOWNER ) ?XFS_QMOPT_FORCE_RES :0 );if (code)/* out of quota */ goto error_return;
@@ -1092,7 +1093,7 @@ xfs_ioctl_setattr(if (xfs_get_projid (ip) != fa->fsx_projid) {if (XFS_IS_QUOTA_RUNNING (mp) &&XFS_IS_PQUOTA_ON (mp)) { olddquot =xfs_qm_vop_chown (tp, ip, - &ip->i_gdquot, gdqp); + &ip->i_pdquot, pdqp); }xfs_set_projid (ip, fa->fsx_projid);
@@ -1140,6 +1141,7 @@ xfs_ioctl_setattr(xfs_qm_dqrele (olddquot);xfs_qm_dqrele (udqp);xfs_qm_dqrele (gdqp); +xfs_qm_dqrele (pdqp);return code;
fs/xfs/xfs_iops.c +2 -2
@@ -516,7 +516,7 @@ xfs_setattr_nonsize(ASSERT (udqp ==NULL );ASSERT (gdqp ==NULL ); error =xfs_qm_vop_dqalloc (ip, uid, gid,xfs_get_projid (ip), - qflags, &udqp, &gdqp); + qflags, &udqp, &gdqp,NULL );if (error)return error; }
@@ -552,7 +552,7 @@ xfs_setattr_nonsize( (XFS_IS_GQUOTA_ON(mp) && igid != gid))) {ASSERT (tp); error =xfs_qm_vop_chown_reserve (tp, ip, udqp, gdqp, -capable (CAP_FOWNER ) ? +NULL ,capable (CAP_FOWNER ) ?XFS_QMOPT_FORCE_RES :0 );if (error)/* out of quota */ goto out_trans_cancel;
fs/xfs/xfs_qm.c +180 -91
524 lines not on this page · raw message
fs/xfs/xfs_qm.h +7 -0
@@ -44,9 +44,11 @@ extern struct kmem_zone *xfs_qm_dqtrxzone; typedef struct xfs_quotainfo { struct radix_tree_root qi_uquota_tree; struct radix_tree_root qi_gquota_tree; + struct radix_tree_root qi_pquota_tree; struct mutex qi_tree_lock; xfs_inode_t *qi_uquotaip; /* user quota inode */ xfs_inode_t *qi_gquotaip; /* group quota inode */ + xfs_inode_t *qi_pquotaip; /* proup quota inode */ struct list_head qi_lru_list; struct mutex qi_lru_lock; int qi_lru_count;
@@ -72,12 +74,16 @@ typedef struct xfs_quotainfo {#define XFS_DQUOT_TREE (qi, type) \ ((type & XFS_DQ_USER) ? \ &((qi)->qi_uquota_tree) : \ + (type & XFS_DQ_PROJ) ? \ + &((qi)->qi_pquota_tree) : \ &((qi)->qi_gquota_tree))extern void xfs_trans_mod_dquot (xfs_trans_t *,xfs_dquot_t *,uint ,long ); +#if 0 extern int xfs_trans_reserve_quota_bydquots (xfs_trans_t *,xfs_mount_t *,xfs_dquot_t *,xfs_dquot_t *,long ,long ,uint ); +#endif extern void xfs_trans_dqjoin (xfs_trans_t *,xfs_dquot_t *);extern void xfs_trans_log_dquot (xfs_trans_t *,xfs_dquot_t *);
@@ -90,6 +96,7 @@ extern void xfs_trans_log_dquot(xfs_trans_t *, xfs_dquot_t *);typedef struct xfs_dquot_acct {xfs_dqtrx_t dqa_usrdquots[XFS_QM_TRANS_MAXDQS ];xfs_dqtrx_t dqa_grpdquots[XFS_QM_TRANS_MAXDQS ]; +xfs_dqtrx_t dqa_prjdquots[XFS_QM_TRANS_MAXDQS ]; }xfs_dquot_acct_t ;/*
fs/xfs/xfs_qm_bhv.c +1 -1
@@ -115,7 +115,7 @@ xfs_qm_newmount( (pquotaondisk && !XFS_IS_PQUOTA_ON(mp)) || (!pquotaondisk && XFS_IS_PQUOTA_ON(mp)) || (gquotaondisk && !XFS_IS_GQUOTA_ON(mp)) || - (!gquotaondisk && XFS_IS_OQUOTA_ON(mp))) && + (!gquotaondisk && XFS_IS_GQUOTA_ON(mp))) && xfs_dev_is_read_only(mp, "changing quota state")) { xfs_warn(mp, "please mount with%s%s%s%s.", (!quotaondisk ? "out quota" : ""),
fs/xfs/xfs_qm_syscalls.c +15 -4
@@ -118,7 +118,8 @@ xfs_qm_scall_quotaoff( dqtype |=XFS_QMOPT_GQUOTA ; flags |= (XFS_GQUOTA_CHKD |XFS_GQUOTA_ENFD ); inactivate_flags |=XFS_GQUOTA_ACTIVE ; - }else if (flags &XFS_PQUOTA_ACCT ) { + } +if (flags &XFS_PQUOTA_ACCT ) { dqtype |=XFS_QMOPT_PQUOTA ; flags |= (XFS_PQUOTA_CHKD |XFS_PQUOTA_ENFD ); inactivate_flags |=XFS_PQUOTA_ACTIVE ;
@@ -213,10 +214,14 @@ xfs_qm_scall_quotaoff(IRELE (q->qi_uquotaip); q->qi_uquotaip =NULL ; } -if ((dqtype & (XFS_QMOPT_GQUOTA |XFS_QMOPT_PQUOTA )) && q->qi_gquotaip) { +if ((dqtype &XFS_QMOPT_GQUOTA ) && q->qi_gquotaip) {IRELE (q->qi_gquotaip); q->qi_gquotaip =NULL ; } +if ((dqtype &XFS_QMOPT_PQUOTA ) && q->qi_pquotaip) { +IRELE (q->qi_pquotaip); + q->qi_pquotaip =NULL ; + } out_unlock:mutex_unlock (&q->qi_quotaofflock);
@@ -855,9 +860,11 @@ xfs_dqrele_inode( {/* skip quota inodes */ if (ip == ip->i_mount->m_quotainfo->qi_uquotaip || - ip == ip->i_mount->m_quotainfo->qi_gquotaip) { + ip == ip->i_mount->m_quotainfo->qi_gquotaip || + ip == ip->i_mount->m_quotainfo->qi_pquotaip) {ASSERT (ip->i_udquot ==NULL );ASSERT (ip->i_gdquot ==NULL ); +ASSERT (ip->i_pdquot ==NULL );return 0 ; }
@@ -866,10 +873,14 @@ xfs_dqrele_inode(xfs_qm_dqrele (ip->i_udquot); ip->i_udquot =NULL ; } -if (flags & (XFS_PQUOTA_ACCT |XFS_GQUOTA_ACCT ) && ip->i_gdquot) { +if ((flags &XFS_GQUOTA_ACCT ) && ip->i_gdquot) {xfs_qm_dqrele (ip->i_gdquot); ip->i_gdquot =NULL ; } +if ((flags &XFS_PQUOTA_ACCT ) && ip->i_pdquot) { +xfs_qm_dqrele (ip->i_pdquot); + ip->i_pdquot =NULL ; + }xfs_iunlock (ip,XFS_ILOCK_EXCL );return 0 ; }
fs/xfs/xfs_quota.h +18 -14
@@ -205,8 +205,6 @@ typedef struct xfs_qoff_logformat {#define XFS_IS_QUOTA_ON (mp) ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \ XFS_GQUOTA_ACTIVE | \ XFS_PQUOTA_ACTIVE)) -#define XFS_IS_OQUOTA_ON (mp) ((mp)->m_qflags & (XFS_GQUOTA_ACTIVE | \ - XFS_PQUOTA_ACTIVE))#define XFS_IS_UQUOTA_ON (mp) ((mp)->m_qflags & XFS_UQUOTA_ACTIVE)#define XFS_IS_GQUOTA_ON (mp) ((mp)->m_qflags & XFS_GQUOTA_ACTIVE)#define XFS_IS_PQUOTA_ON (mp) ((mp)->m_qflags & XFS_PQUOTA_ACTIVE)
@@ -273,8 +271,10 @@ typedef struct xfs_qoff_logformat {*/ #define XFS_NOT_DQATTACHED (mp, ip) ((XFS_IS_UQUOTA_ON(mp) &&\ (ip)->i_udquot == NULL) || \ - (XFS_IS_OQUOTA_ON(mp) && \ - (ip)->i_gdquot == NULL)) + (XFS_IS_GQUOTA_ON(mp) && \ + (ip)->i_gdquot == NULL) || \ + (XFS_IS_PQUOTA_ON(mp) && \ + (ip)->i_pdquot == NULL))#define XFS_QM_NEED_QUOTACHECK (mp) \ ((XFS_IS_UQUOTA_ON(mp) && \
@@ -329,17 +329,18 @@ extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *, struct xfs_inode *, long, long, uint);extern int xfs_trans_reserve_quota_bydquots (struct xfs_trans *,struct xfs_mount *,struct xfs_dquot *, -struct xfs_dquot *,long ,long ,uint ); +struct xfs_dquot *,struct xfs_dquot *,long ,long ,uint );extern int xfs_qm_vop_dqalloc (struct xfs_inode *,uid_t ,gid_t ,prid_t ,uint , -struct xfs_dquot **,struct xfs_dquot **); +struct xfs_dquot **,struct xfs_dquot **,struct xfs_dquot **);extern void xfs_qm_vop_create_dqattach (struct xfs_trans *,struct xfs_inode *, -struct xfs_dquot *,struct xfs_dquot *); +struct xfs_dquot *,struct xfs_dquot *,struct xfs_dquot *);extern int xfs_qm_vop_rename_dqattach (struct xfs_inode **);extern struct xfs_dquot *xfs_qm_vop_chown (struct xfs_trans *,struct xfs_inode *,struct xfs_dquot **,struct xfs_dquot *);extern int xfs_qm_vop_chown_reserve (struct xfs_trans *,struct xfs_inode *, -struct xfs_dquot *,struct xfs_dquot *,uint ); +struct xfs_dquot *,struct xfs_dquot *,struct xfs_dquot *, +uint );extern int xfs_qm_dqattach (struct xfs_inode *,uint );extern int xfs_qm_dqattach_locked (struct xfs_inode *,uint );extern void xfs_qm_dqdetach (struct xfs_inode *);
@@ -353,10 +354,12 @@ extern void xfs_qm_unmount_quotas(struct xfs_mount *);#else static inline int xfs_qm_vop_dqalloc (struct xfs_inode *ip,uid_t uid,gid_t gid,prid_t prid, -uint flags,struct xfs_dquot **udqp,struct xfs_dquot **gdqp) +uint flags,struct xfs_dquot **udqp,struct xfs_dquot **gdqp, +struct xfs_dquot **pdqp) { *udqp =NULL ; *gdqp =NULL ; + *pdqp =NULL ;return 0 ; }#define xfs_trans_dup_dqinfo (tp, tp2)
@@ -371,14 +374,15 @@ static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, }static inline int xfs_trans_reserve_quota_bydquots (struct xfs_trans *tp,struct xfs_mount *mp,struct xfs_dquot *udqp, -struct xfs_dquot *gdqp,long nblks,long nions,uint flags) +struct xfs_dquot *gdqp,struct xfs_dquot *pdqp, +long nblks,long nions,uint flags) {return 0 ; } -#define xfs_qm_vop_create_dqattach (tp, ip, u, g) +#define xfs_qm_vop_create_dqattach (tp, ip, u, g, p)#define xfs_qm_vop_rename_dqattach (it) (0)#define xfs_qm_vop_chown (tp, ip, old, new) (NULL) -#define xfs_qm_vop_chown_reserve (tp, ip, u, g, fl) (0) +#define xfs_qm_vop_chown_reserve (tp, ip, u, g, p, fl) (0)#define xfs_qm_dqattach (ip, fl) (0)#define xfs_qm_dqattach_locked (ip, fl) (0)#define xfs_qm_dqdetach (ip)
@@ -392,8 +396,8 @@ static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp,#define xfs_trans_unreserve_quota_nblks (tp, ip, nblks, ninos, flags) \ xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags) -#define xfs_trans_reserve_quota (tp, mp, ud, gd, nb, ni, f) \ - xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \ +#define xfs_trans_reserve_quota (tp, mp, ud, gd, pd, nb, ni, f) \ + xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, pd, nb, ni, \ f | XFS_QMOPT_RES_REGBLKS) extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *,
fs/xfs/xfs_sb.h +1 -0
@@ -140,6 +140,7 @@ typedef struct xfs_sb {*/ xfs_ino_t sb_uquotino;/* user quota inode */ xfs_ino_t sb_gquotino;/* group quota inode */ +#define sb_pquotino sb_gquotino__uint16_t sb_qflags;/* quota flags */ __uint8_t sb_flags;/* misc. flags */ __uint8_t sb_shared_vn;/* shared version number */
fs/xfs/xfs_super.c +3 -3
@@ -538,14 +538,14 @@ xfs_showargs(else if (mp->m_qflags &XFS_UQUOTA_ACCT )seq_puts (m,"," MNTOPT_UQUOTANOENF ); -/* Either project or group quotas can be active, not both */ -if (mp->m_qflags &XFS_PQUOTA_ACCT ) {if (mp->m_qflags &XFS_PQUOTA_ENFD )seq_puts (m,"," MNTOPT_PRJQUOTA );else seq_puts (m,"," MNTOPT_PQUOTANOENF ); - }else if (mp->m_qflags &XFS_GQUOTA_ACCT ) { + } + +if (mp->m_qflags &XFS_GQUOTA_ACCT ) {if (mp->m_qflags &XFS_GQUOTA_ENFD )seq_puts (m,"," MNTOPT_GRPQUOTA );else
fs/xfs/xfs_trans_dquot.c +30 -9
@@ -113,7 +113,7 @@ xfs_trans_dup_dqinfo(if (otp->t_flags &XFS_TRANS_DQ_DIRTY ) ntp->t_flags |=XFS_TRANS_DQ_DIRTY ; -for (j =0 ; j <2 ; j++) { +for (j =0 ; j <3 ; j++) {for (i =0 ; i <XFS_QM_TRANS_MAXDQS ; i++) {if (oqa[i].qt_dquot ==NULL )break ;
@@ -138,8 +138,13 @@ xfs_trans_dup_dqinfo( oq->qt_ino_res = oq->qt_ino_res_used; } - oqa = otp->t_dqinfo->dqa_grpdquots; - nqa = ntp->t_dqinfo->dqa_grpdquots; +if (oqa == otp->t_dqinfo->dqa_usrdquots) { + oqa = otp->t_dqinfo->dqa_grpdquots; + nqa = ntp->t_dqinfo->dqa_grpdquots; + }else { + oqa = otp->t_dqinfo->dqa_prjdquots; + nqa = ntp->t_dqinfo->dqa_prjdquots; + } } }
@@ -166,8 +171,10 @@ xfs_trans_mod_dquot_byino(if (XFS_IS_UQUOTA_ON (mp) && ip->i_udquot) (void )xfs_trans_mod_dquot (tp, ip->i_udquot, field, delta); -if (XFS_IS_OQUOTA_ON (mp) && ip->i_gdquot) +if (XFS_IS_GQUOTA_ON (mp) && ip->i_gdquot) (void )xfs_trans_mod_dquot (tp, ip->i_gdquot, field, delta); +if (XFS_IS_PQUOTA_ON (mp) && ip->i_pdquot) + (void )xfs_trans_mod_dquot (tp, ip->i_pdquot, field, delta); } STATIC xfs_dqtrx_t *
@@ -178,8 +185,14 @@ xfs_trans_get_dqtrx(int i;xfs_dqtrx_t *qa; - qa =XFS_QM_ISUDQ (dqp) ? - tp->t_dqinfo->dqa_usrdquots : tp->t_dqinfo->dqa_grpdquots; +if (XFS_QM_ISUDQ (dqp)) + qa = tp->t_dqinfo->dqa_usrdquots; +else if (XFS_QM_ISGDQ (dqp)) + qa = tp->t_dqinfo->dqa_grpdquots; +else if (XFS_QM_ISPDQ (dqp)) + qa = tp->t_dqinfo->dqa_prjdquots; +else +return NULL ;for (i =0 ; i <XFS_QM_TRANS_MAXDQS ; i++) { if (qa[i].qt_dquot == NULL ||
@@ -340,9 +353,14 @@ xfs_trans_apply_dquot_deltas(ASSERT (tp->t_dqinfo); qa = tp->t_dqinfo->dqa_usrdquots; -for (j =0 ; j <2 ; j++) { + +/* 0 - usr, 1 - grp, 2 - prj */ +for (j =0 ; j <3 ; j++) {if (qa[0 ].qt_dquot ==NULL ) { - qa = tp->t_dqinfo->dqa_grpdquots; +if (qa == tp->t_dqinfo->dqa_usrdquots) + qa = tp->t_dqinfo->dqa_grpdquots; +else + qa = tp->t_dqinfo->dqa_prjdquots;continue ; }
@@ -750,6 +768,7 @@ xfs_trans_reserve_quota_bydquots( xfs_mount_t *mp, xfs_dquot_t *udqp, xfs_dquot_t *gdqp, + xfs_dquot_t *pdqp, long nblks, long ninos, uint flags)
@@ -816,6 +835,7 @@ xfs_trans_reserve_quota_nblks(ASSERT (ip->i_ino != mp->m_sb.sb_uquotino);ASSERT (ip->i_ino != mp->m_sb.sb_gquotino); +ASSERT (ip->i_ino != mp->m_sb.sb_pquotino);ASSERT (xfs_isilocked (ip,XFS_ILOCK_EXCL )); ASSERT((flags & ~(XFS_QMOPT_FORCE_RES | XFS_QMOPT_ENOSPC)) ==
@@ -828,7 +848,8 @@ xfs_trans_reserve_quota_nblks(*/ return xfs_trans_reserve_quota_bydquots (tp, mp, ip->i_udquot, ip->i_gdquot, - nblks, ninos, flags); + ip->i_pdquot, nblks, ninos, + flags); }/*
fs/xfs/xfs_vnodeops.c +19 -9
@@ -849,6 +849,7 @@ xfs_create(prid_t prid;struct xfs_dquot *udqp =NULL ;struct xfs_dquot *gdqp =NULL ; +struct xfs_dquot *pdqp =NULL ;uint resblks;uint log_res;uint log_count;
@@ -867,7 +868,8 @@ xfs_create(* Make sure that we have allocated dquot(s) on disk. */ error =xfs_qm_vop_dqalloc (dp,current_fsuid (),current_fsgid (), prid, -XFS_QMOPT_QUOTALL |XFS_QMOPT_INHERIT , &udqp, &gdqp); +XFS_QMOPT_QUOTALL |XFS_QMOPT_INHERIT , &udqp, + &gdqp, &pdqp);if (error)return error;
@@ -919,7 +921,8 @@ xfs_create(/* * Reserve disk quota and the inode. */ - error =xfs_trans_reserve_quota (tp, mp, udqp, gdqp, resblks,1 ,0 ); + error =xfs_trans_reserve_quota (tp, mp, udqp, gdqp, pdqp, + resblks,1 ,0 );if (error) goto out_trans_cancel;
@@ -983,7 +986,7 @@ xfs_create(* These ids of the inode couldn't have changed since the new * inode has been locked ever since it was created. */ -xfs_qm_vop_create_dqattach (tp, ip, udqp, gdqp); +xfs_qm_vop_create_dqattach (tp, ip, udqp, gdqp, pdqp); error =xfs_bmap_finish (&tp, &free_list, &committed);if (error)
@@ -995,6 +998,7 @@ xfs_create(xfs_qm_dqrele (udqp);xfs_qm_dqrele (gdqp); +xfs_qm_dqrele (pdqp); *ipp = ip;return 0 ;
@@ -1498,7 +1502,9 @@ xfs_symlink(int n;xfs_buf_t *bp;prid_t prid; -struct xfs_dquot *udqp, *gdqp; +struct xfs_dquot *udqp; +struct xfs_dquot *gdqp; +struct xfs_dquot *pdqp;uint resblks; *ipp =NULL ;
@@ -1518,7 +1524,7 @@ xfs_symlink(if (pathlen >=MAXPATHLEN )/* total string too long */ return XFS_ERROR (ENAMETOOLONG ); - udqp = gdqp =NULL ; + udqp = gdqp = pdqp =NULL ;if (dp->i_d.di_flags &XFS_DIFLAG_PROJINHERIT ) prid =xfs_get_projid (dp);else
@@ -1528,7 +1534,8 @@ xfs_symlink(* Make sure that we have allocated dquot(s) on disk. */ error =xfs_qm_vop_dqalloc (dp,current_fsuid (),current_fsgid (), prid, -XFS_QMOPT_QUOTALL |XFS_QMOPT_INHERIT , &udqp, &gdqp); +XFS_QMOPT_QUOTALL |XFS_QMOPT_INHERIT , + &udqp, &gdqp, &pdqp);if (error) goto std_return;
@@ -1569,7 +1576,8 @@ xfs_symlink(/* * Reserve disk quota : blocks and inode. */ - error =xfs_trans_reserve_quota (tp, mp, udqp, gdqp, resblks,1 ,0 ); + error =xfs_trans_reserve_quota (tp, mp, udqp, gdqp, pdqp, + resblks,1 ,0 );if (error) goto error_return;
@@ -1607,7 +1615,7 @@ xfs_symlink(/* * Also attach the dquot(s) to it, if applicable. */ -xfs_qm_vop_create_dqattach (tp, ip, udqp, gdqp); +xfs_qm_vop_create_dqattach (tp, ip, udqp, gdqp, pdqp);if (resblks) resblks -=XFS_IALLOC_SPACE_RES (mp);
@@ -1691,6 +1699,7 @@ xfs_symlink( error =xfs_trans_commit (tp,XFS_TRANS_RELEASE_LOG_RES );xfs_qm_dqrele (udqp);xfs_qm_dqrele (gdqp); +xfs_qm_dqrele (pdqp); *ipp = ip;return 0 ;
@@ -1704,6 +1713,7 @@ xfs_symlink(xfs_trans_cancel (tp, cancel_flags);xfs_qm_dqrele (udqp);xfs_qm_dqrele (gdqp); +xfs_qm_dqrele (pdqp);if (unlock_dp_on_error)xfs_iunlock (dp,XFS_ILOCK_EXCL );
@@ -2170,7 +2180,7 @@ xfs_free_file_space( }xfs_ilock (ip,XFS_ILOCK_EXCL ); error =xfs_trans_reserve_quota (tp, mp, - ip->i_udquot, ip->i_gdquot, + ip->i_udquot, ip->i_gdquot, ip->i_pdquot, resblks,0 ,XFS_QMOPT_RES_REGBLKS );if (error) goto error1;
Signature · 6 lines
1.7.4.1 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 9 lines
fs/xfs/xfs_qm.c +2
-0if (error) {if (uip)IRELE (uip);@@ -1421,9 +1474,24 @@ xfs_qm_init_quotainos(return XFS_ERROR (error); } } +/* Why not define a XFS_SB_PQUOTINO? */ +if (XFS_IS_PQUOTA_ON (mp) && pip ==NULL ) {
fs/xfs/xfs_qm.c xfs_qm_init_quotainos( · line 1488
Quoted 10 lines
fs/xfs/xfs_qm.c +10
-0+ error =xfs_qm_qino_alloc (mp, &pip, + sbflags |XFS_SB_GQUOTINO , + flags |XFS_QMOPT_PQUOTA ); +if (error) { +if (uip) +IRELE (uip); +if (gip) +IRELE (gip); + +return XFS_ERROR (error);
It would probably be good to have return labels here so that each IRELE statements only needs to be written once, e.g.
out_rele_uip:
if (uip) IRELE(uip); out_rele_gip: if (gip) IRELE(gip); out: return XFS_ERROR(error);
fs/xfs/xfs_qm.c xfs_qm_vop_dqalloc( · line 1737
Quoted 4 lines
fs/xfs/xfs_qm.c +4
-0+if ((error =xfs_qm_dqget (mp,NULL , (xfs_dqid_t )uid, +XFS_DQ_USER , +XFS_QMOPT_DQALLOC | +XFS_QMOPT_DOWARN , &uq))) {
Please move assignments out of conditionals for all code touched, e.g.:
error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)uid,
XFS_DQ_USER,
XFS_QMOPT_DQALLOC |
XFS_QMOPT_DOWARN, &uq);
if (error) {Otherwise this looks good to me.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
Quoted 23 lines · Christoph Hellwig
Quoted 9 lines
fs/xfs/xfs_qm.c +2
-0if (error) {if (uip)IRELE (uip);@@ -1421,9 +1474,24 @@ xfs_qm_init_quotainos(return XFS_ERROR (error); } } +/* Why not define a XFS_SB_PQUOTINO? */ +if (XFS_IS_PQUOTA_ON (mp) && pip ==NULL ) {fs/xfs/xfs_qm.c xfs_qm_init_quotainos( · line 1488
Quoted 10 lines
fs/xfs/xfs_qm.c +10
-0+ error =xfs_qm_qino_alloc (mp, &pip, + sbflags |XFS_SB_GQUOTINO , + flags |XFS_QMOPT_PQUOTA ); +if (error) { +if (uip) +IRELE (uip); +if (gip) +IRELE (gip); + +return XFS_ERROR (error);It would probably be good to have return labels here so that each IRELE statements only needs to be written once, e.g.
Quoted 8 lines
out_rele_uip:if (uip) IRELE(uip); out_rele_gip: if (gip) IRELE(gip); out: return XFS_ERROR(error);
This change will be reflected in the next post, thanks for the comments.
-Jeff
Quoted 8 lines
fs/xfs/xfs_qm.c xfs_qm_vop_dqalloc( · line 1737
Quoted 5 lines
fs/xfs/xfs_qm.c +4
-0+if ((error =xfs_qm_dqget (mp,NULL , (xfs_dqid_t )uid, +XFS_DQ_USER , +XFS_QMOPT_DQALLOC | +XFS_QMOPT_DOWARN , &uq))) {Please move assignments out of conditionals for all code touched, e.g.:
Quoted 7 lines
error = xfs_qm_dqget(mp, NULL, (xfs_dqid_t)uid, XFS_DQ_USER, XFS_QMOPT_DQALLOC | XFS_QMOPT_DOWARN, &uq); if (error) {Otherwise this looks good to me.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs