From patchwork Tue Mar 26 11:55:25 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Shilong X-Patchwork-Id: 2336131 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 078E0DF264 for ; Tue, 26 Mar 2013 11:55:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759033Ab3CZLzj (ORCPT ); Tue, 26 Mar 2013 07:55:39 -0400 Received: from mail-da0-f53.google.com ([209.85.210.53]:59926 "EHLO mail-da0-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757834Ab3CZLzi (ORCPT ); Tue, 26 Mar 2013 07:55:38 -0400 Received: by mail-da0-f53.google.com with SMTP id n34so2517593dal.26 for ; Tue, 26 Mar 2013 04:55:37 -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=zZFBqUIvTr2jWJ/X4fTYyPg9s5UprxOf1G8KGZI5JZg=; b=edRzGZj90KMu7te5tO4bVDl0xKR26ZjHKcQJe9vPeRKPgZcMOZij99NevB1EosATzy /fUieO9DF9/j9STcAAy5LAs8syTCEMltKovKNSiJDUIT4tZarmH3Y0FaFTcNGuo9X5hc e+Z0tu3ajIOwA0R/t1pZnpDLfCfPERZs5++H85tsmJ0vbzGAJj/uRZfLq+6X1WgT1chp 2Y2atN5rZkvs5lGR3iVtz8m+ZzElSX24snr5FE9gReZgtLw0PmG1OU/JYYRhJyMLUwII fD3myjaNssJXXC3fBv0cFxfXmslX4C7uEt6HCSsASmiE96IfF9zAIr7wWj6XOTsZanne T3dw== X-Received: by 10.69.3.97 with SMTP id bv1mr23087368pbd.73.1364298937378; Tue, 26 Mar 2013 04:55:37 -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.35 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 26 Mar 2013 04:55:36 -0700 (PDT) From: Wang Shilong To: linux-btrfs@vger.kernel.org Cc: sensille@gmx.net, miaox@cn.fujitsu.com, wangshilong1991@gmail.com Subject: [PATCH 2/7] Btrfs: add a necessary check before updating qgroup limit Date: Tue, 26 Mar 2013 19:55:25 +0800 Message-Id: <1364298930-4507-2-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 Add a necessary check before updating qgroup limit, if the relative qgroup dosen't exsit, do not join transaction. Signed-off-by: Wang Shilong Reviewed-by: Miao Xie --- fs/btrfs/ioctl.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 files changed, 36 insertions(+), 7 deletions(-) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 0b8ab81..3c4fde0 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -3837,6 +3837,33 @@ drop_write: return ret; } +static int may_qgroup_limit(struct btrfs_root *root, u64 qgroupid) +{ + 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 = qgroupid; + + ret = btrfs_search_slot(NULL, root->fs_info->quota_root, + &key, path, 0, 0); + if (ret > 0) + ret = -ENOENT; + btrfs_free_path(path); + return ret; +} + static long btrfs_ioctl_qgroup_limit(struct file *file, void __user *arg) { struct btrfs_root *root = BTRFS_I(file_inode(file))->root; @@ -3859,19 +3886,21 @@ static long btrfs_ioctl_qgroup_limit(struct file *file, void __user *arg) goto drop_write; } mutex_lock(&root->fs_info->quota_lock); - trans = btrfs_join_transaction(root); - if (IS_ERR(trans)) { - ret = PTR_ERR(trans); - goto out; - } - qgroupid = sa->qgroupid; if (!qgroupid) { /* take the current subvol as qgroup */ qgroupid = root->root_key.objectid; } + ret = may_qgroup_limit(root, qgroupid); + if (ret) + goto out; + + trans = btrfs_join_transaction(root); + if (IS_ERR(trans)) { + ret = PTR_ERR(trans); + goto out; + } - /* FIXME: check if the IDs really exist */ ret = btrfs_limit_qgroup(trans, root->fs_info, qgroupid, &sa->lim); err = btrfs_end_transaction(trans, root);