2009-02-09 10:47:34 +03:00
/*
* Copyright ( c ) 2008 , Christoph Hellwig
* All Rights Reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it would be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include "xfs.h"
2013-08-12 14:49:26 +04:00
# include "xfs_format.h"
2013-10-23 03:50:10 +04:00
# include "xfs_log_format.h"
2013-08-12 14:49:32 +04:00
# include "xfs_trans_resv.h"
# include "xfs_sb.h"
2009-02-09 10:47:34 +03:00
# include "xfs_ag.h"
# include "xfs_mount.h"
2013-10-23 03:51:50 +04:00
# include "xfs_inode.h"
2009-02-09 10:47:34 +03:00
# include "xfs_quota.h"
# include "xfs_trans.h"
2011-08-12 22:57:55 +04:00
# include "xfs_qm.h"
2009-02-09 10:47:34 +03:00
# include <linux/quota.h>
STATIC int
xfs_quota_type ( int type )
{
switch ( type ) {
case USRQUOTA :
return XFS_DQ_USER ;
case GRPQUOTA :
return XFS_DQ_GROUP ;
default :
return XFS_DQ_PROJ ;
}
}
STATIC int
xfs_fs_get_xstate (
struct super_block * sb ,
struct fs_quota_stat * fqs )
{
struct xfs_mount * mp = XFS_M ( sb ) ;
if ( ! XFS_IS_QUOTA_RUNNING ( mp ) )
return - ENOSYS ;
return - xfs_qm_scall_getqstat ( mp , fqs ) ;
}
2013-08-07 02:27:08 +04:00
STATIC int
xfs_fs_get_xstatev (
struct super_block * sb ,
struct fs_quota_statv * fqs )
{
struct xfs_mount * mp = XFS_M ( sb ) ;
if ( ! XFS_IS_QUOTA_RUNNING ( mp ) )
return - ENOSYS ;
return - xfs_qm_scall_getqstatv ( mp , fqs ) ;
}
2009-02-09 10:47:34 +03:00
STATIC int
xfs_fs_set_xstate (
struct super_block * sb ,
unsigned int uflags ,
int op )
{
struct xfs_mount * mp = XFS_M ( sb ) ;
unsigned int flags = 0 ;
if ( sb - > s_flags & MS_RDONLY )
return - EROFS ;
2009-10-30 11:27:44 +03:00
if ( op ! = Q_XQUOTARM & & ! XFS_IS_QUOTA_RUNNING ( mp ) )
2009-02-09 10:47:34 +03:00
return - ENOSYS ;
2010-06-04 12:56:01 +04:00
if ( uflags & FS_QUOTA_UDQ_ACCT )
2009-02-09 10:47:34 +03:00
flags | = XFS_UQUOTA_ACCT ;
2010-06-04 12:56:01 +04:00
if ( uflags & FS_QUOTA_PDQ_ACCT )
2009-02-09 10:47:34 +03:00
flags | = XFS_PQUOTA_ACCT ;
2010-06-04 12:56:01 +04:00
if ( uflags & FS_QUOTA_GDQ_ACCT )
2009-02-09 10:47:34 +03:00
flags | = XFS_GQUOTA_ACCT ;
2010-06-04 12:56:01 +04:00
if ( uflags & FS_QUOTA_UDQ_ENFD )
2009-02-09 10:47:34 +03:00
flags | = XFS_UQUOTA_ENFD ;
2013-06-28 02:25:10 +04:00
if ( uflags & FS_QUOTA_GDQ_ENFD )
flags | = XFS_GQUOTA_ENFD ;
if ( uflags & FS_QUOTA_PDQ_ENFD )
flags | = XFS_PQUOTA_ENFD ;
2009-02-09 10:47:34 +03:00
switch ( op ) {
case Q_XQUOTAON :
return - xfs_qm_scall_quotaon ( mp , flags ) ;
case Q_XQUOTAOFF :
if ( ! XFS_IS_QUOTA_ON ( mp ) )
return - EINVAL ;
return - xfs_qm_scall_quotaoff ( mp , flags ) ;
case Q_XQUOTARM :
if ( XFS_IS_QUOTA_ON ( mp ) )
return - EINVAL ;
return - xfs_qm_scall_trunc_qfiles ( mp , flags ) ;
}
return - EINVAL ;
}
STATIC int
2010-05-07 01:04:58 +04:00
xfs_fs_get_dqblk (
2009-02-09 10:47:34 +03:00
struct super_block * sb ,
2012-09-16 13:07:49 +04:00
struct kqid qid ,
2009-02-09 10:47:34 +03:00
struct fs_disk_quota * fdq )
{
struct xfs_mount * mp = XFS_M ( sb ) ;
if ( ! XFS_IS_QUOTA_RUNNING ( mp ) )
return - ENOSYS ;
if ( ! XFS_IS_QUOTA_ON ( mp ) )
return - ESRCH ;
2012-09-16 13:07:49 +04:00
return - xfs_qm_scall_getquota ( mp , from_kqid ( & init_user_ns , qid ) ,
xfs_quota_type ( qid . type ) , fdq ) ;
2009-02-09 10:47:34 +03:00
}
STATIC int
2010-05-07 01:05:17 +04:00
xfs_fs_set_dqblk (
2009-02-09 10:47:34 +03:00
struct super_block * sb ,
2012-09-16 13:07:49 +04:00
struct kqid qid ,
2009-02-09 10:47:34 +03:00
struct fs_disk_quota * fdq )
{
struct xfs_mount * mp = XFS_M ( sb ) ;
if ( sb - > s_flags & MS_RDONLY )
return - EROFS ;
if ( ! XFS_IS_QUOTA_RUNNING ( mp ) )
return - ENOSYS ;
if ( ! XFS_IS_QUOTA_ON ( mp ) )
return - ESRCH ;
2012-09-16 13:07:49 +04:00
return - xfs_qm_scall_setqlim ( mp , from_kqid ( & init_user_ns , qid ) ,
xfs_quota_type ( qid . type ) , fdq ) ;
2009-02-09 10:47:34 +03:00
}
2009-09-22 04:01:09 +04:00
const struct quotactl_ops xfs_quotactl_operations = {
2013-08-07 02:27:08 +04:00
. get_xstatev = xfs_fs_get_xstatev ,
2009-02-09 10:47:34 +03:00
. get_xstate = xfs_fs_get_xstate ,
. set_xstate = xfs_fs_set_xstate ,
2010-05-07 01:04:58 +04:00
. get_dqblk = xfs_fs_get_dqblk ,
2010-05-07 01:05:17 +04:00
. set_dqblk = xfs_fs_set_dqblk ,
2009-02-09 10:47:34 +03:00
} ;