From patchwork Wed Oct 6 15:05:17 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Nicol X-Patchwork-Id: 236011 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o96F6URL009502 for ; Wed, 6 Oct 2010 15:06:30 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932656Ab0JFPFu (ORCPT ); Wed, 6 Oct 2010 11:05:50 -0400 Received: from mail-yw0-f46.google.com ([209.85.213.46]:64198 "EHLO mail-yw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759165Ab0JFPFj (ORCPT ); Wed, 6 Oct 2010 11:05:39 -0400 Received: by ywh1 with SMTP id 1so479248ywh.19 for ; Wed, 06 Oct 2010 08:05:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:mime-version:received:from:date :message-id:subject:to:content-type; bh=H1Du6dxSvIbpMv9sKzPo20Ii97+15T/zTE7ua/cFHfk=; b=c0kNqqFZs7xE2EFmmaasGq/C0UpPVKe7vJPGVCRxEOzTeoL1+Xf9vg4qZfxlCWeMxd 0FuYTruOuzaZJ1gFbOaDMu52c1P5gWSqdFYq5b0DnA+8dbsu4hdZQ2gA5+imgW9ZhLN+ HdGehgqpmQxdkqzsKrP5A8fJzgKNHZpZHUhdE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=Sei9l1GS7KJr/oiTCEFWW/WHLFfyLYkHVwo1QfuME+bCP/xituQwtk8+p+vMXwxVaI O73dzj1pvJHZGQqjvhEwkkwOFvJY6kj6nUJAiO7wlayznpGC8PnHZs0q6TXri+rZZ1m4 jHVp/SoE7z5MVdOR2Uf6MOUfX73SP2Iov7OT8= Received: by 10.231.191.136 with SMTP id dm8mr14064087ibb.75.1286377538763; Wed, 06 Oct 2010 08:05:38 -0700 (PDT) MIME-Version: 1.0 Received: by 10.231.152.1 with HTTP; Wed, 6 Oct 2010 08:05:17 -0700 (PDT) From: David Nicol Date: Wed, 6 Oct 2010 10:05:17 -0500 Message-ID: Subject: patch intoducing IOctl #21 allowing for waiting for completion of deleted subvol recovery To: BTRFS MAILING LIST Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Wed, 06 Oct 2010 15:06:30 +0000 (UTC) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index e9bf864..a350b75 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -895,6 +895,7 @@ struct btrfs_fs_info { struct list_head trans_list; struct list_head hashers; struct list_head dead_roots; + wait_queue_head_t cleaner_notification_registration; struct list_head caching_block_groups; spinlock_t delayed_iput_lock; diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 34f7c37..6a35257 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1451,6 +1451,7 @@ static int cleaner_kthread(void *arg) mutex_trylock(&root->fs_info->cleaner_mutex)) { btrfs_run_delayed_iputs(root); btrfs_clean_old_snapshots(root); + wake_up_all(&root->fs_info->cleaner_notification_registration); mutex_unlock(&root->fs_info->cleaner_mutex); } @@ -1581,6 +1582,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_ATOMIC); INIT_LIST_HEAD(&fs_info->trans_list); INIT_LIST_HEAD(&fs_info->dead_roots); + init_waitqueue_head(&fs_info->cleaner_notification_registration); INIT_LIST_HEAD(&fs_info->delayed_iputs); INIT_LIST_HEAD(&fs_info->hashers); INIT_LIST_HEAD(&fs_info->delalloc_inodes); diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 9254b3d..9f5a525 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -1212,6 +1212,46 @@ static noinline int btrfs_ioctl_ino_lookup(struct file *file, return ret; } +static int btrfs_ioctl_cleaner_wait(struct btrfs_root *root, void __user *arg) +{ + struct btrfs_ioctl_cleaner_wait_args *bicwa; + long remainingjiffies; + int err; + + bicwa = memdup_user(arg, sizeof(*bicwa)); + if (IS_ERR(bicwa)) + return PTR_ERR(bicwa); + + err = -EINVAL; + + if (bicwa->ms > 0) + { + remainingjiffies = wait_event_interruptible_timeout( + root->fs_info->cleaner_notification_registration, + list_empty(&root->fs_info->dead_roots), + msecs_to_jiffies(bicwa->ms) + ); + if (remainingjiffies > 0) + err = 0; + else if (remainingjiffies < 0 ) + err = -EAGAIN; + else + err = -ETIME; + } + else + { + err = wait_event_interruptible( + root->fs_info->cleaner_notification_registration, + list_empty(&root->fs_info->dead_roots) + ); + }; + + kfree(bicwa); + return err; + +} + + static noinline int btrfs_ioctl_snap_destroy(struct file *file, void __user *arg) { @@ -2003,6 +2043,8 @@ long btrfs_ioctl(struct file *file, unsigned int return btrfs_ioctl_snap_create(file, argp, 1); case BTRFS_IOC_SNAP_DESTROY: return btrfs_ioctl_snap_destroy(file, argp); + case BTRFS_IOC_CLEANER_WAIT: + return btrfs_ioctl_cleaner_wait(root, argp); case BTRFS_IOC_DEFAULT_SUBVOL: return btrfs_ioctl_default_subvol(file, argp); case BTRFS_IOC_DEFRAG: diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h index 424694a..cd15a50 100644 --- a/fs/btrfs/ioctl.h +++ b/fs/btrfs/ioctl.h @@ -138,6 +138,10 @@ struct btrfs_ioctl_space_args { struct btrfs_ioctl_space_info spaces[0]; }; +struct btrfs_ioctl_cleaner_wait_args{ + unsigned long ms; +}; + #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ struct btrfs_ioctl_vol_args) #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ @@ -178,4 +182,6 @@ struct btrfs_ioctl_space_args { #define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, u64) #define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, \ struct btrfs_ioctl_space_args) +#define BTRFS_IOC_CLEANER_WAIT _IOW(BTRFS_IOCTL_MAGIC, 21, \ + struct btrfs_ioctl_cleaner_wait_args) #endif