From patchwork Sat Jun 17 19:59:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 9794369 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C94056038F for ; Sat, 17 Jun 2017 20:00:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BD3AC283FF for ; Sat, 17 Jun 2017 20:00:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B22CB28404; Sat, 17 Jun 2017 20:00:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 42D9628402 for ; Sat, 17 Jun 2017 20:00:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752723AbdFQUAJ (ORCPT ); Sat, 17 Jun 2017 16:00:09 -0400 Received: from mail-it0-f46.google.com ([209.85.214.46]:35755 "EHLO mail-it0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752529AbdFQUAF (ORCPT ); Sat, 17 Jun 2017 16:00:05 -0400 Received: by mail-it0-f46.google.com with SMTP id m62so49698838itc.0 for ; Sat, 17 Jun 2017 13:00:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6gOBbCMpwmeWs3MVjjmH2O89tnnJxTOmO1dIAAzRCVI=; b=ERJikSzzeEJN3yI8kcNm7BiMlwVEtS0eZ2QOFBKKYe35IJwxk1nDkPttjkeTw+tKFB 3NCcX9Av/SwttyGojsAcuX3Qr8KeOltgRNbBjG/ojfcNuI7Td/bnqcKfr7UeReYVdVij 2xdx19wHiFhap1/FFd/gcvdZSHddF9mU33i4G/kP1Ao5gGSkQ5a2deD6ZXmqbSEVZ8fD N1XgAWLjmMoMN4ZDejqSAaKnWTqrla6rTETS9FxtX8KcI0s+peUoKOewiHVCYrwXVmS0 86+4HgoGQLUIa8XGdYHz1XgN93D9uh0VAS8dxg3/Z31E4Wl7Vi421nrf5CPv82ZLo3G4 SbpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6gOBbCMpwmeWs3MVjjmH2O89tnnJxTOmO1dIAAzRCVI=; b=m5wjlxpnwKvoJSn8GGTDLI1ubPk9YIbq+rQTNEYaw/2KIOtGEd/U4Aee1ueoma71TZ vEPtfmpU7vvfZtMTOmMyHpa0QUMXZMQlsiGhQlRn80SABtPh3MvRb4Z/Z/y+xrF8kuQy y8SUh9JHJWAL4BZv51hkrMf/qT/AELvYWxLudv047X+2i5MhNFpBtwCyvxbUO9M2APR3 JsaFQzSQnsYeI3YWD1cFg4+LgtxLZjx3LgoF1XWrbtGMp09sqw6KM9hViu1T4FpYylQr 17xTHQobcC9jfqDrGfiaIKEB2eTQsPn1/bfeLPAVUb8DYVGea0LutEPHw7xYAxJ/ztHm ziLw== X-Gm-Message-State: AKS2vOyJJD1H1p/vzhIAMo7LIEr5lf8yBTpPi5ckMpsZ2uWW/4Jm1CCJ max1ZXkhLfcBN52D X-Received: by 10.36.55.149 with SMTP id r143mr15840666itr.53.1497729604361; Sat, 17 Jun 2017 13:00:04 -0700 (PDT) Received: from localhost.localdomain ([216.160.245.98]) by smtp.gmail.com with ESMTPSA id w199sm537049iod.15.2017.06.17.13.00.03 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 17 Jun 2017 13:00:03 -0700 (PDT) From: Jens Axboe To: linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org Cc: adilger@dilger.ca, hch@infradead.org, martin.petersen@oracle.com, Jens Axboe Subject: [PATCH 01/11] fs: add support for an inode to carry write hint related data Date: Sat, 17 Jun 2017 13:59:44 -0600 Message-Id: <1497729594-4707-2-git-send-email-axboe@kernel.dk> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1497729594-4707-1-git-send-email-axboe@kernel.dk> References: <1497729594-4707-1-git-send-email-axboe@kernel.dk> Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP No functional changes in this patch, just in preparation for allowing applications to pass in hints about data life times for writes. Set aside 3 bits for carrying hint information in the inode flags. Adds the public hints as well, which are: WRITE_LIFE_NONE No hints about write life time WRITE_LIFE_SHORT Data written has a short life time WRITE_LIFE_MEDIUM Data written has a medium life time WRITE_LIFE_LONG Data written has a long life time WRITE_LIFE_EXTREME Data written has an extremely long life tim Helpers are defined to store these values in flags, by passing in the shift that's appropriate for the given use case. Signed-off-by: Jens Axboe --- fs/inode.c | 11 +++++++++++ include/linux/fs.h | 29 +++++++++++++++++++++++++++++ include/uapi/linux/fs.h | 13 +++++++++++++ 3 files changed, 53 insertions(+) diff --git a/fs/inode.c b/fs/inode.c index db5914783a71..defb015a2c6d 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -2120,3 +2120,14 @@ struct timespec current_time(struct inode *inode) return timespec_trunc(now, inode->i_sb->s_time_gran); } EXPORT_SYMBOL(current_time); + +void inode_set_write_hint(struct inode *inode, enum rw_hint hint) +{ + unsigned int flags = write_hint_to_mask(hint, S_WRITE_LIFE_SHIFT); + + if (flags != mask_to_write_hint(inode->i_flags, S_WRITE_LIFE_SHIFT)) { + inode_lock(inode); + inode_set_flags(inode, flags, S_WRITE_LIFE_MASK); + inode_unlock(inode); + } +} diff --git a/include/linux/fs.h b/include/linux/fs.h index 803e5a9b2654..472c83156606 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1828,6 +1828,14 @@ struct super_operations { #endif /* + * Expected life time hint of a write for this inode. This uses the + * WRITE_LIFE_* encoding, we just need to define the shift. We need + * 3 bits for this. Next S_* value is 131072, bit 17. + */ +#define S_WRITE_LIFE_MASK 0x1c000 /* bits 14..16 */ +#define S_WRITE_LIFE_SHIFT 14 /* 16384, next bit */ + +/* * Note that nosuid etc flags are inode-specific: setting some file-system * flags just means all the inodes inherit those flags by default. It might be * possible to override it selectively if you really wanted to with some @@ -1873,6 +1881,26 @@ static inline bool HAS_UNMAPPED_ID(struct inode *inode) return !uid_valid(inode->i_uid) || !gid_valid(inode->i_gid); } +static inline unsigned int write_hint_to_mask(enum rw_hint hint, + unsigned int shift) +{ + return hint << shift; +} + +static inline enum rw_hint mask_to_write_hint(unsigned int mask, + unsigned int shift) +{ + return (mask >> shift) & 0x7; +} + +static inline unsigned int inode_write_hint(struct inode *inode) +{ + if (inode) + return mask_to_write_hint(inode->i_flags, S_WRITE_LIFE_SHIFT); + + return 0; +} + /* * Inode state bits. Protected by inode->i_lock * @@ -2757,6 +2785,7 @@ extern struct inode *new_inode(struct super_block *sb); extern void free_inode_nonrcu(struct inode *inode); extern int should_remove_suid(struct dentry *); extern int file_remove_privs(struct file *); +extern void inode_set_write_hint(struct inode *inode, enum rw_hint hint); extern void __insert_inode_hash(struct inode *, unsigned long hashval); static inline void insert_inode_hash(struct inode *inode) diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 24e61a54feaa..8fb3b5a6e1ec 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -356,6 +356,19 @@ struct fscrypt_key { #define SYNC_FILE_RANGE_WRITE 2 #define SYNC_FILE_RANGE_WAIT_AFTER 4 +/* + * Write life time hint values. + */ +enum rw_hint { + WRITE_LIFE_NONE = 0, + WRITE_LIFE_SHORT, + WRITE_LIFE_MEDIUM, + WRITE_LIFE_LONG, + WRITE_LIFE_EXTREME, +}; + +#define RW_HINT_MASK 0x7 /* 3 bits */ + /* flags for preadv2/pwritev2: */ #define RWF_HIPRI 0x00000001 /* high priority request, poll if possible */ #define RWF_DSYNC 0x00000002 /* per-IO O_DSYNC */