From: Stefan Behrens <sbehrens@giantdisaster.de>
To: Anand Jain <Anand.Jain@oracle.com>
Cc: linux-btrfs <linux-btrfs@vger.kernel.org>
Subject: Re: [bug] label cli hangs until balance is completed
Date: Wed, 17 Jul 2013 11:09:46 +0200 [thread overview]
Message-ID: <51E65F5A.6050501@giantdisaster.de> (raw)
In-Reply-To: <51E655D1.5020309@oracle.com>
On Wed, 17 Jul 2013 16:29:05 +0800, Anand Jain wrote:
> 'btrfs fi label /btrfs' will hang until balance is completed.
> (and probably even set label would hang). This is because we
> are trying to hold volume_mutex lock which balance will hold
> during its tenure.
>
> -------
> static int btrfs_ioctl_get_fslabel(struct file *file, void __user *arg)
> ::
> mutex_lock(&root->fs_info->volume_mutex);
> ret = copy_to_user(arg, label, len);
> mutex_unlock(&root->fs_info->volume_mutex);
> --------
>
> I doubt if get label would need such a heavy weight lock?
> Do we have any other lock which could fit better here ?
> Any comments ?
Just use the uuid_mutex instead of the volume_mutex.
In addition to the btrfs_ioctl_get_fslabel() and
btrfs_ioctl_set_fslabel() functions, only btrfs_scan_one_device()
accesses the label. And btrfs_scan_one_device() holds the uuid_mutex,
not the volume_mutex. You can do the same.
And since cwillu's commit 1332a002b, the uuid_mutex is not hold for a
long time anymore.
And while you change it, please move the mutex_lock() so that it
includes also the strnlen() access to the label, like this:
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index 2177bea..30a8126 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -4043,15 +4043,16 @@ static int btrfs_ioctl_get_fslabel(struct file
*file, vo
{
struct btrfs_root *root = BTRFS_I(fdentry(file)->d_inode)->root;
const char *label = root->fs_info->super_copy->label;
- size_t len = strnlen(label, BTRFS_LABEL_SIZE);
+ size_t len;
int ret;
+ mutex_lock(&root->fs_info->volume_mutex);
+ len = strnlen(label, BTRFS_LABEL_SIZE);
if (len == BTRFS_LABEL_SIZE) {
pr_warn("btrfs: label is too long, return the first %zu
bytes\n"
--len);
}
- mutex_lock(&root->fs_info->volume_mutex);
ret = copy_to_user(arg, label, len);
mutex_unlock(&root->fs_info->volume_mutex);
next prev parent reply other threads:[~2013-07-17 9:09 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-17 8:29 [bug] label cli hangs until balance is completed Anand Jain
2013-07-17 9:09 ` Stefan Behrens [this message]
2013-07-17 17:49 ` Zach Brown
2013-07-18 11:18 ` [PATCH] btrfs: fix get set label blocking against balance Anand Jain
2013-07-18 12:47 ` Stefan Behrens
2013-07-19 9:31 ` Anand Jain
2013-07-19 9:39 ` [PATCH v2] " Anand Jain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51E65F5A.6050501@giantdisaster.de \
--to=sbehrens@giantdisaster.de \
--cc=Anand.Jain@oracle.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.