From patchwork Tue Mar 26 11:55:26 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 2336141 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 7918E3FC54 for ; Tue, 26 Mar 2013 11:55:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759332Ab3CZLzm (ORCPT ); Tue, 26 Mar 2013 07:55:42 -0400 Received: from mail-pd0-f179.google.com ([209.85.192.179]:36524 "EHLO mail-pd0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757614Ab3CZLzk (ORCPT ); Tue, 26 Mar 2013 07:55:40 -0400 Received: by mail-pd0-f179.google.com with SMTP id x11so90206pdj.24 for ; Tue, 26 Mar 2013 04:55:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=fkfCQJp2m8sswNwbR0Rhk/V43iFNJcIZXGVd6MCtjc0=; b=QisQfU+s295n4vUQG9shrVf67WY/JSCx+IgeYQbTE4JuQRM1scdiLxst7FrEocWZTd Mdh53gCMo2SiKfM7HbXpuir54OzAUZxKQVHcuEcQ5ak/5mJCB/2u+Vnx3N9v8EfjzFkJ xseG0oAKEE0tggoIw5HAkM2U0BJokPVoLnrbccHY5XzG1bMnF/UZxMwPkB5Ieuavd/dG 4eNnSqV8+Q2jz55wzzxa9AmKVGonQbw0dcQL6YHHfb9v4uZ5+OKkEOGjHd0HyBsS5ZvR o3HbW78VRKfNUMklhCeWMf9I/Txdire2Err9m/Pvf3VcTs9tYm6sz6th1xc4ipab/73b iYeA== X-Received: by 10.66.147.161 with SMTP id tl1mr23096111pab.61.1364298939749; Tue, 26 Mar 2013 04:55:39 -0700 (PDT) Received: from localhost.localdomain.localdomain ([223.65.184.172]) by mx.google.com with ESMTPS id fh1sm18974580pac.1.2013.03.26.04.55.37 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 26 Mar 2013 04:55:39 -0700 (PDT) From: Wang Shilong To: linux-btrfs@vger.kernel.org Cc: sensille@gmx.net, miaox@cn.fujitsu.com, wangshilong1991@gmail.com Subject: [PATCH 3/7] Btrfs: add a necessary check before creating/destroying a qgroup Date: Tue, 26 Mar 2013 19:55:26 +0800 Message-Id: <1364298930-4507-3-git-send-email-wangshilong1991@gmail.com> X-Mailer: git-send-email 1.7.11.7 In-Reply-To: <1364298930-4507-1-git-send-email-wangshilong1991@gmail.com> References: <1364298930-4507-1-git-send-email-wangshilong1991@gmail.com> Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org From: Wang Shilong This patch try to add a check before creating/destroying a qgroup. Signed-off-by: Wang Shilong Reviewed-by: Miao Xie --- fs/btrfs/ioctl.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 files changed, 40 insertions(+), 1 deletions(-) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 3c4fde0..8a01326 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -3784,6 +3784,42 @@ drop_write: return ret; } +static int may_qgroup_create(struct btrfs_root *root, + struct btrfs_ioctl_qgroup_create_args *sa) +{ + int ret = 0; + struct btrfs_key key; + struct btrfs_path *path; + + if (!root->fs_info->quota_root) + return -EINVAL; + + path = btrfs_alloc_path(); + if (!path) { + ret = -ENOMEM; + return ret; + } + + key.objectid = 0; + key.type = BTRFS_QGROUP_INFO_KEY; + key.offset = sa->qgroupid; + + ret = btrfs_search_slot(NULL, root->fs_info->quota_root, + &key, path, 0, 0); + if (sa->create) { + if (!ret) + ret = -EEXIST; + if (ret > 0) + ret = 0; + goto out; + } + if (ret > 0) + ret = -ENOENT; +out: + btrfs_free_path(path); + return ret; +} + static long btrfs_ioctl_qgroup_create(struct file *file, void __user *arg) { struct btrfs_root *root = BTRFS_I(file_inode(file))->root; @@ -3810,13 +3846,16 @@ static long btrfs_ioctl_qgroup_create(struct file *file, void __user *arg) goto out; } mutex_lock(&root->fs_info->quota_lock); + ret = may_qgroup_create(root, sa); + if (ret) + goto out_unlock; + trans = btrfs_join_transaction(root); if (IS_ERR(trans)) { ret = PTR_ERR(trans); goto out_unlock; } - /* FIXME: check if the IDs really exist */ if (sa->create) { ret = btrfs_create_qgroup(trans, root->fs_info, sa->qgroupid, NULL);