From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from cn.fujitsu.com ([59.151.112.132]:28692 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1751152AbaEGIB1 convert rfc822-to-8bit (ORCPT ); Wed, 7 May 2014 04:01:27 -0400 Message-ID: <5369E892.5060300@cn.fujitsu.com> Date: Wed, 7 May 2014 16:02:26 +0800 From: Qu Wenruo MIME-Version: 1.0 To: Anand Jain CC: Subject: Re: [RFC PATCH 1/2] btrfs: Add missing device check in dev_info/rm_dev ioctl References: <1399357993-9254-1-git-send-email-quwenruo@cn.fujitsu.com> <1399357993-9254-2-git-send-email-quwenruo@cn.fujitsu.com> <5369E818.7000606@oracle.com> In-Reply-To: <5369E818.7000606@oracle.com> Content-Type: text/plain; charset="UTF-8"; format=flowed Sender: linux-btrfs-owner@vger.kernel.org List-ID: -------- Original Message -------- Subject: Re: [RFC PATCH 1/2] btrfs: Add missing device check in dev_info/rm_dev ioctl From: Anand Jain To: Qu Wenruo Date: 2014年05月07日 16:00 > > > Thanks for working on this. > I am running some tests will let you know. > > Anand > Thanks for your tests. I have only check the scsi_device/X:X:X:X/device/delete interface to remove the device, so if you have some other device remove tests, that would be much nicer. Thanks, Qu > > On 05/06/2014 02:33 PM, Qu Wenruo wrote: >> Old btrfs can't find a missing btrfs device since there is no >> mechanism for block layer to inform fs layer. >> >> But we can use a workaround that only check status(by using >> request_queue->queue_flags) of every device in a btrfs >> filesystem when calling dev_info/rm_dev ioctl, since other ioctls >> do not really cares about missing device. >> >> Cc: Anand Jain >> Signed-off-by: Qu Wenruo >> --- >> fs/btrfs/ioctl.c | 1 + >> fs/btrfs/volumes.c | 25 ++++++++++++++++++++++++- >> fs/btrfs/volumes.h | 2 ++ >> 3 files changed, 27 insertions(+), 1 deletion(-) >> >> diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c >> index 0401397..7680a40 100644 >> --- a/fs/btrfs/ioctl.c >> +++ b/fs/btrfs/ioctl.c >> @@ -2606,6 +2606,7 @@ static long btrfs_ioctl_dev_info(struct >> btrfs_root *root, void __user *arg) >> goto out; >> } >> >> + btrfs_check_dev_missing(root, dev, 1); >> di_args->devid = dev->devid; >> di_args->bytes_used = dev->bytes_used; >> di_args->total_bytes = dev->total_bytes; >> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c >> index d241130a..c7d7908 100644 >> --- a/fs/btrfs/volumes.c >> +++ b/fs/btrfs/volumes.c >> @@ -1548,9 +1548,10 @@ int btrfs_rm_device(struct btrfs_root *root, >> char *device_path) >> * is held. >> */ >> list_for_each_entry(tmp, devices, dev_list) { >> + btrfs_check_dev_missing(root, tmp, 0); >> if (tmp->in_fs_metadata && >> !tmp->is_tgtdev_for_dev_replace && >> - !tmp->bdev) { >> + (!tmp->bdev || tmp->missing)) { >> device = tmp; >> break; >> } >> @@ -6300,3 +6301,25 @@ int btrfs_scratch_superblock(struct >> btrfs_device *device) >> >> return 0; >> } >> + >> +/* If need_lock is set, uuid_mutex will be used */ >> +int btrfs_check_dev_missing(struct btrfs_root *root, struct >> btrfs_device *dev, >> + int need_lock) >> +{ >> + struct request_queue *q; >> + >> + if (unlikely(!dev || !dev->bdev || !dev->bdev->bd_queue)) >> + return -ENOENT; >> + q = dev->bdev->bd_queue; >> + >> + if (need_lock) >> + mutex_lock(&uuid_mutex); >> + if (test_bit(QUEUE_FLAG_DEAD, &q->queue_flags) || >> + test_bit(QUEUE_FLAG_DYING, &q->queue_flags)) { >> + dev->missing = 1; >> + root->fs_info->fs_devices->missing_devices++; >> + } >> + if (need_lock) >> + mutex_unlock(&uuid_mutex); >> + return 0; >> +} >> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h >> index 80754f9..47a44af 100644 >> --- a/fs/btrfs/volumes.h >> +++ b/fs/btrfs/volumes.h >> @@ -356,6 +356,8 @@ unsigned long btrfs_full_stripe_len(struct >> btrfs_root *root, >> int btrfs_finish_chunk_alloc(struct btrfs_trans_handle *trans, >> struct btrfs_root *extent_root, >> u64 chunk_offset, u64 chunk_size); >> +int btrfs_check_dev_missing(struct btrfs_root *root, struct >> btrfs_device *dev, >> + int need_lock); >> static inline void btrfs_dev_stat_inc(struct btrfs_device *dev, >> int index) >> { >>