From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964796AbbD0L44 (ORCPT ); Mon, 27 Apr 2015 07:56:56 -0400 Received: from mailout2.w1.samsung.com ([210.118.77.12]:46190 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932710AbbD0L4o (ORCPT ); Mon, 27 Apr 2015 07:56:44 -0400 X-AuditID: cbfec7f4-f79c56d0000012ee-c6-553e23fb969f From: Beata Michalska To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org Cc: jack@suse.cz, tytso@mit.edu, adilger.kernel@dilger.ca, hughd@google.com, lczerner@redhat.com, hch@infradead.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org, kyungmin.park@samsung.com, kmpark@infradead.org Subject: [RFC v2 4/4] shmem: Add support for generic FS events Date: Mon, 27 Apr 2015 13:51:44 +0200 Message-id: <1430135504-24334-5-git-send-email-b.michalska@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1430135504-24334-1-git-send-email-b.michalska@samsung.com> References: <1430135504-24334-1-git-send-email-b.michalska@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrALMWRmVeSWpSXmKPExsVy+t/xK7q/le1CDY5fVbH4+qWDxeL0hEVM Fk8/9bFYzJ7ezGRx6/IqFouzTW/YLZY92Mxisfl7B5vFzHl32Cz27D3JYnF51xw2i3tr/rNa tPb8ZHfg9WjZXO6xYFOpx+YVWh6bPk1i92g6c5TZ4/2+q2wefVtWMXqcWXCE3ePzJrkAzigu m5TUnMyy1CJ9uwSujK9/p7EVbJKsWPT5BmMD4wGRLkZODgkBE4ndC3YyQthiEhfurWfrYuTi EBJYyiixtfkCO0hCSKCRSeJKFw+IzSagL/FqxkomEFtEIEbi4K4eFpAGZoEbjBIzDp4DmyQs YCexa8NfNhCbRUBV4uKl10CDODh4BdwlDrwzBzElBBQk5kyyAangFPCQWDPjLTNIWAioYtFL lQmMvAsYGVYxiqaWJhcUJ6XnGuoVJ+YWl+al6yXn525ihITrlx2Mi49ZHWIU4GBU4uE1WGYb KsSaWFZcmXuIUYKDWUmE94CSXagQb0piZVVqUX58UWlOavEhRmkOFiVx3rm73ocICaQnlqRm p6YWpBbBZJk4OKUaGJV1NiZkHl0Zn+a16/Q7nafWUgFyj6fNMj5wekU3M9+kGb2br3luFFzi 8Ej4nI+CWH1pt0QxS0l1yfzL0TUTFl3dVPLEemdl9hW1cMG/RakfnvL7lYsu2D2l2rtXmONl XduDK/PPa+YVCb77vEjhZFdAgqHljrsro6KydvuYnArQNHQWPXrmsBJLcUaioRZzUXEiADMP GkBTAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for the generic FS events interface covering threshold notifiactions and the ENOSPC warning. Signed-off-by: Beata Michalska --- mm/shmem.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/mm/shmem.c b/mm/shmem.c index cf2d0ca..a044d12 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -201,6 +201,7 @@ static int shmem_reserve_inode(struct super_block *sb) spin_lock(&sbinfo->stat_lock); if (!sbinfo->free_inodes) { spin_unlock(&sbinfo->stat_lock); + fs_event_notify(sb, FS_WARN_ENOSPC); return -ENOSPC; } sbinfo->free_inodes--; @@ -239,8 +240,10 @@ static void shmem_recalc_inode(struct inode *inode) freed = info->alloced - info->swapped - inode->i_mapping->nrpages; if (freed > 0) { struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb); - if (sbinfo->max_blocks) + if (sbinfo->max_blocks) { percpu_counter_add(&sbinfo->used_blocks, -freed); + fs_event_free_space(inode->i_sb, freed); + } info->alloced -= freed; inode->i_blocks -= freed * BLOCKS_PER_PAGE; shmem_unacct_blocks(info->flags, freed); @@ -1164,6 +1167,7 @@ repeat: goto unacct; } percpu_counter_inc(&sbinfo->used_blocks); + fs_event_alloc_space(inode->i_sb, 1); } page = shmem_alloc_page(gfp, info, index); @@ -1245,8 +1249,10 @@ trunc: spin_unlock(&info->lock); decused: sbinfo = SHMEM_SB(inode->i_sb); - if (sbinfo->max_blocks) + if (sbinfo->max_blocks) { percpu_counter_add(&sbinfo->used_blocks, -1); + fs_event_free_space(inode->i_sb, 1); + } unacct: shmem_unacct_blocks(info->flags, 1); failed: @@ -1258,12 +1264,16 @@ unlock: unlock_page(page); page_cache_release(page); } - if (error == -ENOSPC && !once++) { + if (error == -ENOSPC) { + if (!once++) { info = SHMEM_I(inode); spin_lock(&info->lock); shmem_recalc_inode(inode); spin_unlock(&info->lock); goto repeat; + } else { + fs_event_notify(inode->i_sb, FS_WARN_ENOSPC); + } } if (error == -EEXIST) /* from above or from radix_tree_insert */ goto repeat; @@ -2729,12 +2739,26 @@ static int shmem_encode_fh(struct inode *inode, __u32 *fh, int *len, return 1; } +static void shmem_trace_query(struct super_block *sb, u64 *ncount) +{ + struct shmem_sb_info *sbinfo = SHMEM_SB(sb); + + if (sbinfo->max_blocks) + *ncount = sbinfo->max_blocks - + percpu_counter_sum(&sbinfo->used_blocks); + +} + static const struct export_operations shmem_export_ops = { .get_parent = shmem_get_parent, .encode_fh = shmem_encode_fh, .fh_to_dentry = shmem_fh_to_dentry, }; +static const struct fs_trace_operations shmem_trace_ops = { + .query = shmem_trace_query, +}; + static int shmem_parse_options(char *options, struct shmem_sb_info *sbinfo, bool remount) { @@ -3020,6 +3044,9 @@ int shmem_fill_super(struct super_block *sb, void *data, int silent) sb->s_flags |= MS_NOUSER; } sb->s_export_op = &shmem_export_ops; + sb->s_etrace.ops = &shmem_trace_ops; + sb->s_etrace.events_cap_mask = FS_EVENTS_ALL; + sb->s_flags |= MS_NOSEC; #else sb->s_flags |= MS_NOUSER; -- 1.7.9.5