From patchwork Mon Dec 10 12:50:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kanchan Joshi X-Patchwork-Id: 10721261 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 33D0E1751 for ; Mon, 10 Dec 2018 12:53:08 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 263B32A2DC for ; Mon, 10 Dec 2018 12:53:08 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1A6CD2A337; Mon, 10 Dec 2018 12:53:08 +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=-8.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,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 4782C2A32C for ; Mon, 10 Dec 2018 12:53:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727323AbeLJMxB (ORCPT ); Mon, 10 Dec 2018 07:53:01 -0500 Received: from mailout3.samsung.com ([203.254.224.33]:48472 "EHLO mailout3.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727207AbeLJMxB (ORCPT ); Mon, 10 Dec 2018 07:53:01 -0500 Received: from epcas1p4.samsung.com (unknown [182.195.41.48]) by mailout3.samsung.com (KnoxPortal) with ESMTP id 20181210125257epoutp035973a3c7827d34291e022028f0d470ba~u_cwe4DpU0044300443epoutp03W; Mon, 10 Dec 2018 12:52:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout3.samsung.com 20181210125257epoutp035973a3c7827d34291e022028f0d470ba~u_cwe4DpU0044300443epoutp03W DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1544446377; bh=6owZdA1HYY7Sq1NqGAZbq9zQGKfdwV28v9sSi6Md/c4=; h=From:To:Cc:Subject:Date:In-reply-to:References:From; b=j7aVNb5tJtkpA55KzRe6w2ujbmKdp6/gq3ZUsDeJStZ6k5At7tAW9nSrx2ij+kdg4 QuFAUCReYZhg4fgP6iCbhK062I7N6RfTCxQrSVgKtyOYE+TkXX48Ozn5sUcn2kJ30y vp/0kkC04FF/FCf1s1oWZuZbLcTQLT45a4mRjIgw= Received: from epsmges1p2.samsung.com (unknown [182.195.42.54]) by epcas1p3.samsung.com (KnoxPortal) with ESMTP id 20181210125256epcas1p3ae41b40fafbebea66af19f1fdfde0398~u_cwI6qZK1921319213epcas1p35; Mon, 10 Dec 2018 12:52:56 +0000 (GMT) Received: from epcas1p1.samsung.com ( [182.195.41.45]) by epsmges1p2.samsung.com (Symantec Messaging Gateway) with SMTP id 6D.4C.04057.8A16E0C5; Mon, 10 Dec 2018 21:52:56 +0900 (KST) Received: from epsmgms2p1new.samsung.com (unknown [182.195.42.142]) by epcas1p1.samsung.com (KnoxPortal) with ESMTP id 20181210125256epcas1p1e4142cfefb9b21dfb8dad927fbd49143~u_cvsN8i52672026720epcas1p1H; Mon, 10 Dec 2018 12:52:56 +0000 (GMT) X-AuditID: b6c32a36-d31ff70000000fd9-76-5c0e61a87365 Received: from epmmp1.local.host ( [203.254.227.16]) by epsmgms2p1new.samsung.com (Symantec Messaging Gateway) with SMTP id 26.23.03601.8A16E0C5; Mon, 10 Dec 2018 21:52:56 +0900 (KST) Received: from test-PowerEdge-R720.sa.corp.samsungelectronics.net ([107.108.221.212]) by mmp1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0PJI00DVHUFKZF90@mmp1.samsung.com>; Mon, 10 Dec 2018 21:52:56 +0900 (KST) From: Kanchan Joshi To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.com, viro@zeniv.linux.org.uk, darrick.wong@oracle.com, axboe@kernel.dk, jrdr.linux@gmail.com, ebiggers@google.com, jooyoung.hwang@samsung.com, chur.lee@samsung.com, prakash.v@samsung.com, Kanchan Joshi Subject: [PATCH 2/2] fs/ext4,jbd2: Add support for passing write-hint with journal. Date: Mon, 10 Dec 2018 18:20:04 +0530 Message-id: <1544446204-5291-3-git-send-email-joshi.k@samsung.com> X-Mailer: git-send-email 2.7.4 In-reply-to: <1544446204-5291-1-git-send-email-joshi.k@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrIIsWRmVeSWpSXmKPExsWy7bCmru6KRL4Yg5UXzCy+fulgsVh9t5/N 4uPzh2wWd99vZ7W4uLqF1eL58sWMFo1fFjJaHP3/ls3i2tUGZouZ8+6wWezZe5LF4sqURcwW rT0/2S3O/z3O6sDn0bK53GPnrLvsHgs2lXpcPlvq0XTmKLPHx6e3WDz6tqxi9Fi/5SqLx+dN ch6bnrxlCuCK4rJJSc3JLEst0rdL4MrY+PUla8Er54oDn6axNjD2WHQxcnJICJhIrJ7Zzt7F yMUhJLCDUeL2zO1MEM53Rokbb2cxwlSdX/ISqmo3o8SDxk2MEM50Jol9d7tYuxg5ONgENCUu TC4FaRARsJV4suEbK0gNs8A8JonzH48ygSSEBUIl7jw5yg5iswioShw4eBZsA6+Ak8Sl5sPs ENvkJG6e62QGsTkFnCUaWjvYQAZJCDxmk3j7fjsbRJGLxLz/v5ghbGGJV8e3sIMcISEgLXHp qC1EuFji152jzBC9HYwS1xtmskAk7CUu7vkLdhCzAJ/Eu689rBC9vBIdbUIQJR4SS+48Z4V4 chqjxKtlExknMEouYGRYxSiWWlCcm55abFhgpFecmFtcmpeul5yfu4kRHPFaZjsYF53zOcQo wMGoxMMb0MQbI8SaWFZcmXuIUYKDWUmEVzcNKMSbklhZlVqUH19UmpNafIhRmoNFSZz3idTc aCGB9MSS1OzU1ILUIpgsEwenVANjzsflIY/sM44YWf65WJ12vNUq6eCu9bfUXHfcZjKbcuiM 4J3WzTkL5kfOj2K202CtCqspcJxl2hs0b9ORQ3dnGsufYrti6cT0aNPjnXd5fx5K4Xthcajn DScnn+mRk1vv2+4VOeUXtjp6ydGfrEGzmYp3bbzUect6zxmxOazHbdpOCYRcvPypWomlOCPR UIu5qDgRAP9gWar0AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrKLMWRmVeSWpSXmKPExsVy+t9jAd0ViXwxBhNXiFl8/dLBYrH6bj+b xcfnD9ks7r7fzmpxcXULq8Xz5YsZLRq/LGS0OPr/LZvFtasNzBYz591hs9iz9ySLxZUpi5gt Wnt+sluc/3uc1YHPo2VzucfOWXfZPRZsKvW4fLbUo+nMUWaPj09vsXj0bVnF6LF+y1UWj8+b 5Dw2PXnLFMAVxWWTkpqTWZZapG+XwJWx8etL1oJXzhUHPk1jbWDssehi5OSQEDCROL/kJXsX IxeHkMBORok7B09COTOZJM4d2A/kcHCwCWhKXJhcCtIgImAr8WTDN1aQGmaBeUwSx+4uYgdJ CAuEStx5chTMZhFQlThw8CwjiM0r4CRxqfkwO8Q2OYmb5zqZQWxOAWeJhtYONhBbCKhm2tYW 9gmMPAsYGVYxSqYWFOem5xYbFRjmpZbrFSfmFpfmpesl5+duYgQG7rbDWn07GO8viT/EKMDB qMTDG9DEGyPEmlhWXJl7iFGCg1lJhFc3DSjEm5JYWZValB9fVJqTWnyIUZqDRUmc93besUgh gfTEktTs1NSC1CKYLBMHp1QDo4XH82v8QTJmx1f6n19zK1Fi9qIK/22Xa/kcr7HPkZnS/6TM 2in1wUaWtwpL1W9u+9G07WXe7Dnbv3yYPuWSw4ok5zvF9aqL5qqHnMnVb2r0F5um/yJE7dPc qUfbWPlvffi7XOqWqMe0hPyV0U9jxeXurcv9v5hh7sOV7Y5ioa96drRm7W9f+U+JpTgj0VCL uag4EQCnc+oMWAIAAA== X-CMS-MailID: 20181210125256epcas1p1e4142cfefb9b21dfb8dad927fbd49143 X-Msg-Generator: CA CMS-TYPE: 101P X-CMS-RootMailID: 20181210125256epcas1p1e4142cfefb9b21dfb8dad927fbd49143 References: <1544446204-5291-1-git-send-email-joshi.k@samsung.com> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch introduces "j_writehint" in JBD2 journal, which is set based by Ext4 depending on "journal_writehint" mount option (inspired from "journal_ioprio"). Signed-off-by: Kanchan Joshi --- fs/ext4/super.c | 33 +++++++++++++++++++++++++++------ fs/jbd2/commit.c | 11 +++++++---- fs/jbd2/journal.c | 2 +- fs/jbd2/revoke.c | 2 +- include/linux/jbd2.h | 7 +++++++ 5 files changed, 43 insertions(+), 12 deletions(-) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 53ff6c2..0283760 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1413,7 +1413,7 @@ enum { Opt_nowarn_on_error, Opt_mblk_io_submit, Opt_lazytime, Opt_nolazytime, Opt_debug_want_extra_isize, Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, - Opt_inode_readahead_blks, Opt_journal_ioprio, + Opt_inode_readahead_blks, Opt_journal_ioprio, Opt_journal_writehint, Opt_dioread_nolock, Opt_dioread_lock, Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, Opt_max_dir_size_kb, Opt_nojournal_checksum, Opt_nombcache, @@ -1489,6 +1489,7 @@ static const match_table_t tokens = { {Opt_noblock_validity, "noblock_validity"}, {Opt_inode_readahead_blks, "inode_readahead_blks=%u"}, {Opt_journal_ioprio, "journal_ioprio=%u"}, + {Opt_journal_writehint, "journal_writehint=%u"}, {Opt_auto_da_alloc, "auto_da_alloc=%u"}, {Opt_auto_da_alloc, "auto_da_alloc"}, {Opt_noauto_da_alloc, "noauto_da_alloc"}, @@ -1677,6 +1678,7 @@ static const struct mount_opts { {Opt_journal_dev, 0, MOPT_NO_EXT2 | MOPT_GTE0}, {Opt_journal_path, 0, MOPT_NO_EXT2 | MOPT_STRING}, {Opt_journal_ioprio, 0, MOPT_NO_EXT2 | MOPT_GTE0}, + {Opt_journal_writehint, 0, MOPT_NO_EXT2 | MOPT_GTE0}, {Opt_data_journal, EXT4_MOUNT_JOURNAL_DATA, MOPT_NO_EXT2 | MOPT_DATAJ}, {Opt_data_ordered, EXT4_MOUNT_ORDERED_DATA, MOPT_NO_EXT2 | MOPT_DATAJ}, {Opt_data_writeback, EXT4_MOUNT_WRITEBACK_DATA, @@ -1718,7 +1720,8 @@ static const struct mount_opts { static int handle_mount_opt(struct super_block *sb, char *opt, int token, substring_t *args, unsigned long *journal_devnum, - unsigned int *journal_ioprio, int is_remount) + unsigned int *journal_ioprio, + enum rw_hint *journal_writehint, int is_remount) { struct ext4_sb_info *sbi = EXT4_SB(sb); const struct mount_opts *m; @@ -1897,6 +1900,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, } *journal_ioprio = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, arg); + } else if (token == Opt_journal_writehint) { + if (arg < WRITE_LIFE_NOT_SET || arg > WRITE_LIFE_EXTREME) { + ext4_msg(sb, KERN_ERR, "Invalid journal write hint" + " (must be 0-5)"); + return -1; + } + *journal_writehint = arg; } else if (token == Opt_test_dummy_encryption) { #ifdef CONFIG_EXT4_FS_ENCRYPTION sbi->s_mount_flags |= EXT4_MF_TEST_DUMMY_ENCRYPTION; @@ -1970,6 +1980,7 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, static int parse_options(char *options, struct super_block *sb, unsigned long *journal_devnum, unsigned int *journal_ioprio, + enum rw_hint *journal_writehint, int is_remount) { struct ext4_sb_info *sbi = EXT4_SB(sb); @@ -1990,7 +2001,8 @@ static int parse_options(char *options, struct super_block *sb, args[0].to = args[0].from = NULL; token = match_token(p, tokens, args); if (handle_mount_opt(sb, p, token, args, journal_devnum, - journal_ioprio, is_remount) < 0) + journal_ioprio, journal_writehint, + is_remount) < 0) return 0; } #ifdef CONFIG_QUOTA @@ -3534,6 +3546,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) int err = 0; unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; ext4_group_t first_not_zeroed; + enum rw_hint journal_writehint = WRITE_LIFE_NOT_SET; if ((data && !orig_data) || !sbi) goto out_free_base; @@ -3694,7 +3707,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) if (!s_mount_opts) goto failed_mount; if (!parse_options(s_mount_opts, sb, &journal_devnum, - &journal_ioprio, 0)) { + &journal_ioprio, &journal_writehint, 0)) { ext4_msg(sb, KERN_WARNING, "failed to parse options in superblock: %s", s_mount_opts); @@ -3703,7 +3716,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) } sbi->s_def_mount_opt = sbi->s_mount_opt; if (!parse_options((char *) data, sb, &journal_devnum, - &journal_ioprio, 0)) + &journal_ioprio, &journal_writehint, 0)) goto failed_mount; if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { @@ -4265,6 +4278,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) set_task_ioprio(sbi->s_journal->j_task, journal_ioprio); + sbi->s_journal->j_writehint = journal_writehint; + sbi->s_journal->j_commit_callback = ext4_journal_commit_callback; no_journal: @@ -5120,6 +5135,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) int enable_quota = 0; ext4_group_t g; unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; + enum rw_hint journal_writehint = WRITE_LIFE_NOT_SET; int err = 0; #ifdef CONFIG_QUOTA int i, j; @@ -5158,7 +5174,11 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) if (sbi->s_journal && sbi->s_journal->j_task->io_context) journal_ioprio = sbi->s_journal->j_task->io_context->ioprio; - if (!parse_options(data, sb, NULL, &journal_ioprio, 1)) { + if (sbi->s_journal) + journal_writehint = sbi->s_journal->j_writehint; + + if (!parse_options(data, sb, NULL, &journal_ioprio, + &journal_writehint, 1)) { err = -EINVAL; goto restore_opts; } @@ -5221,6 +5241,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) if (sbi->s_journal) { ext4_init_journal_params(sb, sbi->s_journal); set_task_ioprio(sbi->s_journal->j_task, journal_ioprio); + sbi->s_journal->j_writehint = journal_writehint; } if (*flags & SB_LAZYTIME) diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 150cc03..8710afe 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -153,10 +153,12 @@ static int journal_submit_commit_record(journal_t *journal, if (journal->j_flags & JBD2_BARRIER && !jbd2_has_feature_async_commit(journal)) - ret = submit_bh(REQ_OP_WRITE, - REQ_SYNC | REQ_PREFLUSH | REQ_FUA, bh); + ret = submit_bh_write_hint(REQ_OP_WRITE, + REQ_SYNC | REQ_PREFLUSH | REQ_FUA, bh, + journal->j_writehint); else - ret = submit_bh(REQ_OP_WRITE, REQ_SYNC, bh); + ret = submit_bh_write_hint(REQ_OP_WRITE, REQ_SYNC, bh, + journal->j_writehint); *cbh = bh; return ret; @@ -708,7 +710,8 @@ void jbd2_journal_commit_transaction(journal_t *journal) clear_buffer_dirty(bh); set_buffer_uptodate(bh); bh->b_end_io = journal_end_buffer_io_sync; - submit_bh(REQ_OP_WRITE, REQ_SYNC, bh); + submit_bh_write_hint(REQ_OP_WRITE, REQ_SYNC, bh, + journal->j_writehint); } cond_resched(); stats.run.rs_blocks_logged += bufs; diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 8ef6b6d..f72ee4b 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1384,7 +1384,7 @@ static int jbd2_write_superblock(journal_t *journal, int write_flags) jbd2_superblock_csum_set(journal, sb); get_bh(bh); bh->b_end_io = end_buffer_write_sync; - ret = submit_bh(REQ_OP_WRITE, write_flags, bh); + ret = submit_bh_write_hint(REQ_OP_WRITE, write_flags, bh, journal->j_writehint); wait_on_buffer(bh); if (buffer_write_io_error(bh)) { clear_buffer_write_io_error(bh); diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c index a1143e5..d4fd178 100644 --- a/fs/jbd2/revoke.c +++ b/fs/jbd2/revoke.c @@ -642,7 +642,7 @@ static void flush_descriptor(journal_t *journal, set_buffer_jwrite(descriptor); BUFFER_TRACE(descriptor, "write"); set_buffer_dirty(descriptor); - write_dirty_buffer(descriptor, REQ_SYNC); + write_dirty_buffer_write_hint(descriptor, REQ_SYNC, journal->j_writehint); } #endif diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index b708e51..0735ab0 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -1138,6 +1138,13 @@ struct journal_s */ __u32 j_csum_seed; + /** + * @j_writehint: + * + * write hint for journal (set by fs). + */ + enum rw_hint j_writehint; + #ifdef CONFIG_DEBUG_LOCK_ALLOC /** * @j_trans_commit_map: