From: Fan Chengniang <fancn.f...@cn.fujitsu.com>

add a function to obtain quota status. Now it can only get
whether quota is enabled. We can extend the function to get
more quota status

Signed-off-by: Fan Chengniang <fancn.f...@cn.fujitsu.com>
---
 fs/btrfs/ioctl.c           |  6 ++++++
 fs/btrfs/qgroup.c          | 14 ++++++++++++++
 fs/btrfs/qgroup.h          |  3 +++
 include/uapi/linux/btrfs.h |  3 +++
 4 files changed, 26 insertions(+)

diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 658d83d..f6e730b 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -4572,6 +4572,12 @@ static long btrfs_ioctl_quota_ctl(struct file *file, 
void __user *arg)
        case BTRFS_QUOTA_CTL_DISABLE:
                ret = btrfs_quota_disable(trans, root->fs_info);
                break;
+       case BTRFS_QUOTA_CTL_STATUS:
+               ret = btrfs_quota_status(trans, root->fs_info, sa);
+               if (!ret)
+                       if (copy_to_user(arg, sa, sizeof(*sa)))
+                               ret = -EFAULT;
+               break;
        default:
                ret = -EINVAL;
                break;
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index 24c5bb1..b57fe45 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -993,6 +993,20 @@ out:
        return ret;
 }
 
+int btrfs_quota_status(struct btrfs_trans_handle *trans,
+                       struct btrfs_fs_info *fs_info,
+                       struct btrfs_ioctl_quota_ctl_args *sa)
+{
+       int ret = 0;
+
+       if (fs_info->quota_enabled)
+               sa->status |= BTRFS_QUOTA_STATUS_QUOTA_ENABLED;
+       else
+               sa->status &= ~BTRFS_QUOTA_STATUS_QUOTA_ENABLED;
+
+       return ret;
+}
+
 static void qgroup_dirty(struct btrfs_fs_info *fs_info,
                         struct btrfs_qgroup *qgroup)
 {
diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h
index c5242aa..52d8b19 100644
--- a/fs/btrfs/qgroup.h
+++ b/fs/btrfs/qgroup.h
@@ -62,6 +62,9 @@ int btrfs_quota_enable(struct btrfs_trans_handle *trans,
                       struct btrfs_fs_info *fs_info);
 int btrfs_quota_disable(struct btrfs_trans_handle *trans,
                        struct btrfs_fs_info *fs_info);
+int btrfs_quota_status(struct btrfs_trans_handle *trans,
+                       struct btrfs_fs_info *fs_info,
+                       struct btrfs_ioctl_quota_ctl_args *sa);
 int btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info);
 void btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info);
 int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info);
diff --git a/include/uapi/linux/btrfs.h b/include/uapi/linux/btrfs.h
index 611e1c5..d4014e6 100644
--- a/include/uapi/linux/btrfs.h
+++ b/include/uapi/linux/btrfs.h
@@ -423,6 +423,9 @@ struct btrfs_ioctl_get_dev_stats {
 #define BTRFS_QUOTA_CTL_ENABLE 1
 #define BTRFS_QUOTA_CTL_DISABLE        2
 #define BTRFS_QUOTA_CTL_RESCAN__NOTUSED        3
+#define BTRFS_QUOTA_CTL_STATUS  4
+
+#define BTRFS_QUOTA_STATUS_QUOTA_ENABLED 1
 struct btrfs_ioctl_quota_ctl_args {
        __u64 cmd;
        __u64 status;
-- 
1.8.4.2

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to