From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id A0A3BC77B73 for ; Thu, 20 Apr 2023 14:40:01 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 848AC900003; Thu, 20 Apr 2023 10:40:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7F99C900002; Thu, 20 Apr 2023 10:40:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6C0D2900003; Thu, 20 Apr 2023 10:40:00 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 59ED1900002 for ; Thu, 20 Apr 2023 10:40:00 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 94FB51202DD for ; Thu, 20 Apr 2023 14:39:59 +0000 (UTC) X-FDA: 80702028918.03.81E37B7 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by imf11.hostedemail.com (Postfix) with ESMTP id 7698C40008 for ; Thu, 20 Apr 2023 14:39:56 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=Id22B1U2; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=Ik7WFZbb; spf=pass (imf11.hostedemail.com: domain of jack@suse.cz designates 195.135.220.29 as permitted sender) smtp.mailfrom=jack@suse.cz; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1682001596; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=qHAAL2DzpsQCozNz8x3S9EtbHdkbdVoss/RQUW176WA=; b=6iqIXJJr6C1mUigDGqJHcWB+vgBnpK94dxHxIDsuaiqIb22mH84RJqJjJgSg9qmCjmteB0 tOqIsaQeSeuLOAmPRlkpV+CEzBfnPWBjaRvKmhGfDAOgn8N7jzeE0XzvozkNzFEbGFPfCD VGfSY1O9XBz/J9BeEXF9Sgv8tPgm0ag= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=suse.cz header.s=susede2_rsa header.b=Id22B1U2; dkim=pass header.d=suse.cz header.s=susede2_ed25519 header.b=Ik7WFZbb; spf=pass (imf11.hostedemail.com: domain of jack@suse.cz designates 195.135.220.29 as permitted sender) smtp.mailfrom=jack@suse.cz; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1682001596; a=rsa-sha256; cv=none; b=ifcTv7RjIHos3yGOEWZU/fVIXQIEjDNEbSOgFLTriT/0hYjzWC4QdH8TyLfmPFfH+zsac+ IwIruweyJw5Ivboj8Nu1KGNxHHRU7Q46yGBT7Qkg5xYozjPfr33E3cqq9OnoysM2cbqaFt xMdnVr75Hxc9qdrb9vwdak/VaQh6qPA= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id EEE8F1FDB3; Thu, 20 Apr 2023 14:39:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1682001594; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=qHAAL2DzpsQCozNz8x3S9EtbHdkbdVoss/RQUW176WA=; b=Id22B1U228MFmO4fzCWEF1cYa2Bv0JHQnIe3QA1Q47191EwoV9iLrLfqo7B8ImCDp4IPKt x100xL1A9bVNzJwiGCTEG+bY7MLaNnXwaZpMmGD3baVeNswqKWXfXeMKqzCtY7xT60CbsA j1jrrLhqtPRYddeHTYvI5Q/c+1a/lzE= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1682001594; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=qHAAL2DzpsQCozNz8x3S9EtbHdkbdVoss/RQUW176WA=; b=Ik7WFZbbaJ3mOyfrxuRcyg7kfw5zuOyOqGA22weyslekHhihz+XfG7/mfey9AbSS80g2OL btXTL2Yeq0wwxfDg== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id E07101333C; Thu, 20 Apr 2023 14:39:54 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id jgLANrpOQWRMQgAAMHmgww (envelope-from ); Thu, 20 Apr 2023 14:39:54 +0000 Received: by quack3.suse.cz (Postfix, from userid 1000) id 743DCA0729; Thu, 20 Apr 2023 16:39:54 +0200 (CEST) Date: Thu, 20 Apr 2023 16:39:54 +0200 From: Jan Kara To: cem@kernel.org Cc: hughd@google.com, jack@suse.cz, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, djwong@kernel.org Subject: Re: [PATCH 6/6] Add default quota limit mount options Message-ID: <20230420143954.asmpkta4tknyzcda@quack3> References: <20230420080359.2551150-1-cem@kernel.org> <20230420080359.2551150-7-cem@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230420080359.2551150-7-cem@kernel.org> X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 7698C40008 X-Rspam-User: X-Stat-Signature: cptwz7tcykucpkug4xeqeg1obh3qfj8m X-HE-Tag: 1682001596-549326 X-HE-Meta: U2FsdGVkX18A5SNv+XPJHMNPoQaKQs/DFyQe8J4FMj3xo4ZdgQ2eHnd3lEgI0c1+W0aih3rLgrRWpa9qfSjmcNciT5dJSkR2U1MS20dBOC2rn08juMA7r70pokyk4QzAjdt9zA6Gk5mdMcYRWOmyWt2mkx4+oZEGxxk+0H1FlqLurHV6Fk63Huki1TzZJXzD7GN0320epxPhhHPmzIQs9dRiXqnAeDAzYrmGZRy3PTBdsrU7cbkiD8FQopO1qlP5xZA0meCd/fScNo3vZyTJLuGtZ7izFl5U9MMc9bb4ODgczmJE+mSg6L1zzIdQd77fjAcA07XN0xggGjPW5NQaW5n7mLz8au5R95RuDZNDbouGIB4okT/OvJmeIg00tHCHn5wnFS/ptX6zIdrWxqlGy4XVpGqvC4DhSDMItSjSlY9FFiRy+lME7BGe2H1bS9BDiJzsg1MtsPehkKXdc30ctw60i69VzkPHZTkvOJq7NsiELIIho7M5NgidjYMgCFSlDlVMeB938B24LaH32AMYdc4ZJiCkleSFeTQ1uDL34cosx+ljWRFHjyrmL5K/8rEBY3mvuG00dUUaIk1R+cM51V6LzR7XMKgB4vIuS7H9T0vvYyXfNwNaZf4Etz0NkcM41DKXvAKDKRXTx3pPoTpdoWSGJbQ18s1B/SGle9dgCnWrD+5R2Itrsu3bDifulTghNo+5qxjsHQhklKOOTaAFiMDy5mN9LMQcOXjIvLBephWY7fy/WYeW7EVyDn3lgiEimsB7BJ4iY9FQA/PPcMmlnah4WN1MDHAaLHTUD/IBiwStEDFhPF/c6nIW40+TS8P9ZctPfqKPkOmoqB9EKi4WM7kMUAuyvTGkX/Wsv4L2Sg/JXzke93LoOTlMQdTvrWUYgXZuKMvq0GG7Ba/vId7Pq/W49qbzeByLwHOSXQUIVYh5CV2vJE5jZJhqFoZGjlWxm24KVTnoyNkWYmJBrg1 CSgO+KPa YpR/7DEgozde/SLTNkcGa+AY/v0ANxDRZGH3B1mKCoo+wzypsXOWujuS/BEOhSGxW+I8+lIVbvXjuvWDai7T9dLPnmI2PS+1grlvra7aQ4GqFuaFLDRqECnmW8iddejLss/csTF+AhrD+yqOK1ken/1WacYepFlR34yWlz37gXi63BcDHwtWEmPSE1A8rLpfCUKcjKehqlitd4thJ8diekjqHKDAKJTZjbRnwgRmJLDZrYsO/p95miViz+ChSAvBSx0EE2A4Bil6qsOM9hJ3f6nbs6FY8a9BPRuBZ4m13pQtFb4uv4fcoxaY2EN10FTLrUjcsDd+qyGvSn1vucI5d1qMmwAj79jnuKqd6 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Thu 20-04-23 10:03:59, cem@kernel.org wrote: > From: Lukas Czerner > > Allow system administrator to set default global quota limits at tmpfs > mount time. > > Signed-off-by: Lukas Czerner > Signed-off-by: Carlos Maiolino > --- > Documentation/filesystems/tmpfs.rst | 34 ++++++++++---- > include/linux/shmem_fs.h | 8 ++++ > mm/shmem.c | 69 +++++++++++++++++++++++++++++ > mm/shmem_quota.c | 9 ++++ > 4 files changed, 111 insertions(+), 9 deletions(-) > > diff --git a/Documentation/filesystems/tmpfs.rst b/Documentation/filesystems/tmpfs.rst > index 1d4ef4f7cca7e..241c11f86cd73 100644 > --- a/Documentation/filesystems/tmpfs.rst > +++ b/Documentation/filesystems/tmpfs.rst > @@ -88,15 +88,31 @@ that instance in a system with many CPUs making intensive use of it. > > tmpfs also supports quota with the following mount options > > -======== ============================================================= > -quota User and group quota accounting and enforcement is enabled on > - the mount. Tmpfs is using hidden system quota files that are > - initialized on mount. > -usrquota User quota accounting and enforcement is enabled on the > - mount. > -grpquota Group quota accounting and enforcement is enabled on the > - mount. > -======== ============================================================= > +======================== ================================================= > +quota User and group quota accounting and enforcement > + is enabled on the mount. Tmpfs is using hidden > + system quota files that are initialized on mount. > +usrquota User quota accounting and enforcement is enabled > + on the mount. > +grpquota Group quota accounting and enforcement is enabled > + on the mount. > +usrquota_block_hardlimit Set global user quota block hard limit. > +usrquota_inode_hardlimit Set global user quota inode hard limit. > +grpquota_block_hardlimit Set global group quota block hard limit. > +grpquota_inode_hardlimit Set global group quota inode hard limit. > +======================== ================================================= > + > +None of the quota related mount options can be set or changed on remount. > + > +Quota limit parameters accept a suffix k, m or g for kilo, mega and giga > +and can't be changed on remount. Default global quota limits are taking > +effect for any and all user/group/project except root the first time the > +quota entry for user/group/project id is being accessed - typically the > +first time an inode with a particular id ownership is being created after > +the mount. In other words, instead of the limits being initialized to zero, > +they are initialized with the particular value provided with these mount > +options. The limits can be changed for any user/group id at any time as it ^^ they > +normally can. ^^^ can be > @@ -3714,6 +3723,50 @@ static int shmem_parse_one(struct fs_context *fc, struct fs_parameter *param) > ctx->seen |= SHMEM_SEEN_QUOTA; > ctx->quota_types |= QTYPE_MASK_GRP; > break; > + case Opt_usrquota_block_hardlimit: > + size = memparse(param->string, &rest); > + if (*rest || !size) > + goto bad_value; > + if (size > SHMEM_QUOTA_MAX_SPC_LIMIT) > + return invalfc(fc, > + "User quota block hardlimit too large."); > + ctx->qlimits.usrquota_bhardlimit = size; > + ctx->seen |= SHMEM_SEEN_QUOTA; > + ctx->quota_types |= QTYPE_MASK_USR; So if I get it right, the intention here is that if usrquota_block_hardlimit=value option is used, it automatically enables user quota accounting and enforcement. I guess it is logical but it is not documented and I'd prefer to require explicit usrquota mount option to enable accounting & enforcement - it is then e.g. easier to parse mount options (in userspace) for finding out whether enforcement is enabled or not. Also I can imagine we would allow changing the default limits on remount but it isn't easy to enable quota accounting on remount etc. > diff --git a/mm/shmem_quota.c b/mm/shmem_quota.c > index c0b531e2ef688..3cc53f2c35e2c 100644 > --- a/mm/shmem_quota.c > +++ b/mm/shmem_quota.c > @@ -166,6 +166,7 @@ static int shmem_acquire_dquot(struct dquot *dquot) > { > struct mem_dqinfo *info = sb_dqinfo(dquot->dq_sb, dquot->dq_id.type); > struct rb_node **n = &((struct rb_root *)info->dqi_priv)->rb_node; > + struct shmem_sb_info *sbinfo = dquot->dq_sb->s_fs_info; > struct rb_node *parent = NULL, *new_node = NULL; > struct quota_id *new_entry, *entry; > qid_t id = from_kqid(&init_user_ns, dquot->dq_id); > @@ -195,6 +196,14 @@ static int shmem_acquire_dquot(struct dquot *dquot) > } > > new_entry->id = id; > + if (dquot->dq_id.type == USRQUOTA) { > + new_entry->bhardlimit = sbinfo->qlimits.usrquota_bhardlimit; > + new_entry->ihardlimit = sbinfo->qlimits.usrquota_ihardlimit; > + } else if (dquot->dq_id.type == GRPQUOTA) { > + new_entry->bhardlimit = sbinfo->qlimits.grpquota_bhardlimit; > + new_entry->ihardlimit = sbinfo->qlimits.grpquota_ihardlimit; > + } > + > new_node = &new_entry->node; > rb_link_node(new_node, parent, n); > rb_insert_color(new_node, (struct rb_root *)info->dqi_priv); Maybe in shmem_dquot_release() when usage is 0 and limits are at default limits, we can free the structure? Honza -- Jan Kara SUSE Labs, CR