diff options
Diffstat (limited to 'fs/xfs/xfs_quotaops.c')
| -rw-r--r-- | fs/xfs/xfs_quotaops.c | 34 | 
1 files changed, 27 insertions, 7 deletions
diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index 1326d81596c..2ad1b9822e9 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -17,15 +17,14 @@   */  #include "xfs.h"  #include "xfs_format.h" +#include "xfs_log_format.h"  #include "xfs_trans_resv.h" -#include "xfs_log.h"  #include "xfs_sb.h"  #include "xfs_ag.h"  #include "xfs_mount.h" +#include "xfs_inode.h"  #include "xfs_quota.h"  #include "xfs_trans.h" -#include "xfs_bmap_btree.h" -#include "xfs_inode.h"  #include "xfs_qm.h"  #include <linux/quota.h> @@ -101,16 +100,36 @@ xfs_fs_set_xstate(  		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 +xfs_fs_rm_xquota( +	struct super_block	*sb, +	unsigned int		uflags) +{ +	struct xfs_mount	*mp = XFS_M(sb); +	unsigned int		flags = 0; +	 +	if (sb->s_flags & MS_RDONLY) +		return -EROFS; + +	if (XFS_IS_QUOTA_ON(mp)) +		return -EINVAL; + +	if (uflags & FS_USER_QUOTA) +		flags |= XFS_DQ_USER; +	if (uflags & FS_GROUP_QUOTA) +		flags |= XFS_DQ_GROUP; +	if (uflags & FS_USER_QUOTA) +		flags |= XFS_DQ_PROJ; + +	return -xfs_qm_scall_trunc_qfiles(mp, flags); +}	 + +STATIC int  xfs_fs_get_dqblk(  	struct super_block	*sb,  	struct kqid		qid, @@ -150,6 +169,7 @@ const struct quotactl_ops xfs_quotactl_operations = {  	.get_xstatev		= xfs_fs_get_xstatev,  	.get_xstate		= xfs_fs_get_xstate,  	.set_xstate		= xfs_fs_set_xstate, +	.rm_xquota		= xfs_fs_rm_xquota,  	.get_dqblk		= xfs_fs_get_dqblk,  	.set_dqblk		= xfs_fs_set_dqblk,  };  | 
