Received: by 2002:a25:e7d8:0:0:0:0:0 with SMTP id e207csp2173391ybh; Mon, 9 Mar 2020 00:06:56 -0700 (PDT) X-Google-Smtp-Source: ADFU+vsssBDI6Aj1N+Dh0gCsaZAqstR85IDnYjmXv9u2j+9gBawS83jsZ7SD3pGyqMqCDWehyPPl X-Received: by 2002:aca:4cd0:: with SMTP id z199mr9798189oia.123.1583737616638; Mon, 09 Mar 2020 00:06:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1583737616; cv=none; d=google.com; s=arc-20160816; b=zstIX0fIgJQ+3SUMm/XRah3g6OyOp3hltrMIrYP9KfNSKG/72IHxnEhRCmldFF3Kuy FWwYKkjaIXlbDYr5XEbICaJcQZQK8CApUz40gulHuEpad4ZGFSMMxv6WUDeA8XzOlLQ1 QOF0MSb8xWze/SUcC3765i6+JhX2YjzFNa33WVqYr3nLri18zYfViNXXByvNrd3AQSRO cGC4NGOH1HxHq0FtwQ3HWZttGucWjdAkECOZCa2/q0Rgr1ki5xiWE/NcVnARd5qSrLze aV/ZUPIgtDrnJTcuVUg2wm9PpyxNjq23wMEw6XikAkp4zcSYPjpb2F4pzfA0OgU30SVZ yd3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=3Yg9h/BkCqAyVyurqEvoUEPZLCnxc1sQkpwyXtdPG6o=; b=mkHIOEO4P2PB7h4q2iTWqzRrwIjhiwARw0XNTHaQf9CxAWezwqGBUTouitXuYBUW9P lf7DTkMq+Rf7zYqzKqJ3Bs2aDu+L3xlG5rv4Kn2musref2qZZw/DoF3iiRSjELFzpRNb RU3iQLNYVbsIrUHL5Ph2tuAcrBYFCY2aa75/L4M4zMOvvlLjmYEDcTY8snSyAjsdqFn+ cDqrutsfnR+z/qTvqOZWjeOCrfO1Do1Hp4fhPGjW9tEWLm2qakc5kUin+xKGLvoxW33u mzVffKZvI5nbocE3CNO9EB+0l5hLFhZTHE/Eo14V0o/a4cY7VOFlwVsfTEIDhbeW3/BJ 2Y3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="oO/LETFO"; spf=pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w22si3466857oih.103.2020.03.09.00.06.45; Mon, 09 Mar 2020 00:06:56 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b="oO/LETFO"; spf=pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726487AbgCIHGH (ORCPT + 99 others); Mon, 9 Mar 2020 03:06:07 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:45731 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726492AbgCIHGG (ORCPT ); Mon, 9 Mar 2020 03:06:06 -0400 Received: by mail-pl1-f195.google.com with SMTP id b22so3596044pls.12 for ; Mon, 09 Mar 2020 00:06:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3Yg9h/BkCqAyVyurqEvoUEPZLCnxc1sQkpwyXtdPG6o=; b=oO/LETFOv/6htTAW0yDtzicdYHV6rDzc5oRF3P1DJj9m1bm6o5J53Yf7DhddPEGIom 2kTxEz147jpJOfrx6lMgaqg86kefq11RaexCHMuiw35WuPtxHTdo7gsews5c+mYKt+71 Vvru6BGs8f9qocGe1cT79QO9e0V4sUJVzSdHGljjeTpMcHM4drsIYIfo2bSauov40eoF Fk1szwoEACTPbWll9NslmOOI8ioELamhkDKgWpxZrYfY4x8Oj/HJyK7JYep4nbSol+SB uDipSjbqZgBSj7FrE40iHVGYjOvdDULCMVrwa0DlccAxVkW4xQvtHu55YLoghM2TU2wp VEgw== 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:mime-version:content-transfer-encoding; bh=3Yg9h/BkCqAyVyurqEvoUEPZLCnxc1sQkpwyXtdPG6o=; b=qqjZBWE6ALzDLCApiIecNjVojeJiTwaZin86ilfS65jex1LexEww7HBwUSkWr7iDfG VtsA0+HZ+eeLSEyiYHW9qDpo/SDoOZMgYou8NRsb69JBtRlaFVxwG6/E7Wjbcu/gaaG6 bb0HtQhhe8f7aU1PwDxkgSwAMJW34cQ90j6h8VwgQs+jp+YF+1UEzTV/7dr27ZcR0b4A Cawu+RcV5ZGZ/L6qB9qd2nvUJr94wp7477xA0L1h6m2kz1mV7b+5Td6ocvhqZ/knmkc7 Iy1Fr++MO7V7+185QlH4Hw7sY6flBRTVcc1614MZ3PNwSid5AajgPRwXK59+u02tbZmG PqXw== X-Gm-Message-State: ANhLgQ1t0p6dXWjFGU1G1cn6UszN7MSKaHR4gpeJQMdUspLZ/x58RgIz 4nBGjNXs70llGftd6HGwUodRSuPa X-Received: by 2002:a17:90a:bf81:: with SMTP id d1mr17603787pjs.21.1583737565235; Mon, 09 Mar 2020 00:06:05 -0700 (PDT) Received: from harshads0.svl.corp.google.com ([2620:15c:2cd:202:ec1e:207a:e951:9a5b]) by smtp.googlemail.com with ESMTPSA id 8sm3692593pfp.67.2020.03.09.00.06.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Mar 2020 00:06:04 -0700 (PDT) From: Harshad Shirwadkar To: linux-ext4@vger.kernel.org Cc: Harshad Shirwadkar Subject: [PATCH v5 13/20] jbd2: add new APIs for commit path of fast commits Date: Mon, 9 Mar 2020 00:05:19 -0700 Message-Id: <20200309070526.218202-13-harshadshirwadkar@gmail.com> X-Mailer: git-send-email 2.25.1.481.gfbce0eb801-goog In-Reply-To: <20200309070526.218202-1-harshadshirwadkar@gmail.com> References: <20200309070526.218202-1-harshadshirwadkar@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org Add following helpers for commit path: - jbd2_map_fc_buf() - allocates fast commit buffers for caller - jbd2_wait_on_fc_bufs() - waits on fast commit buffers allocated using jbd2_map_fc_buf() - jbd2_submit_inode_data() - submit data buffers for one inode - jbd2_wait_inode_data() - wait for inode data Signed-off-by: Harshad Shirwadkar --- fs/jbd2/commit.c | 40 +++++++++++++++++++++++ fs/jbd2/journal.c | 76 ++++++++++++++++++++++++++++++++++++++++++++ include/linux/jbd2.h | 6 ++++ 3 files changed, 122 insertions(+) diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c index 869fe193fbe3..a4c4c6717674 100644 --- a/fs/jbd2/commit.c +++ b/fs/jbd2/commit.c @@ -202,6 +202,46 @@ static int journal_submit_inode_data_buffers(struct address_space *mapping, return ret; } +/* Send all the data buffers related to an inode */ +int jbd2_submit_inode_data(journal_t *journal, struct jbd2_inode *jinode) +{ + struct address_space *mapping; + loff_t dirty_start; + loff_t dirty_end; + int ret; + + if (!jinode) + return 0; + + dirty_start = jinode->i_dirty_start; + dirty_end = jinode->i_dirty_end; + + if (!(jinode->i_flags & JI_WRITE_DATA)) + return 0; + + dirty_start = jinode->i_dirty_start; + dirty_end = jinode->i_dirty_end; + + mapping = jinode->i_vfs_inode->i_mapping; + + trace_jbd2_submit_inode_data(jinode->i_vfs_inode); + ret = journal_submit_inode_data_buffers(mapping, dirty_start, + dirty_end); + + return ret; +} +EXPORT_SYMBOL(jbd2_submit_inode_data); + +int jbd2_wait_inode_data(journal_t *journal, struct jbd2_inode *jinode) +{ + if (!jinode || !(jinode->i_flags & JI_WAIT_DATA)) + return 0; + return filemap_fdatawait_range_keep_errors( + jinode->i_vfs_inode->i_mapping, jinode->i_dirty_start, + jinode->i_dirty_end); +} +EXPORT_SYMBOL(jbd2_wait_inode_data); + /* * Submit all the data buffers of inode associated with the transaction to * disk. diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index d3897d155fb9..e4e0b55dd077 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -864,6 +864,82 @@ int jbd2_journal_next_log_block(journal_t *journal, unsigned long long *retp) return jbd2_journal_bmap(journal, blocknr, retp); } +/* Map one fast commit buffer for use by the file system */ +int jbd2_map_fc_buf(journal_t *journal, struct buffer_head **bh_out) +{ + unsigned long long pblock; + unsigned long blocknr; + int ret = 0; + struct buffer_head *bh; + int fc_off; + journal_header_t *jhdr; + + write_lock(&journal->j_state_lock); + + if (journal->j_fc_off + journal->j_first_fc < journal->j_last_fc) { + fc_off = journal->j_fc_off; + blocknr = journal->j_first_fc + fc_off; + journal->j_fc_off++; + } else { + ret = -EINVAL; + } + write_unlock(&journal->j_state_lock); + + if (ret) + return ret; + + ret = jbd2_journal_bmap(journal, blocknr, &pblock); + if (ret) + return ret; + + bh = __getblk(journal->j_dev, pblock, journal->j_blocksize); + if (!bh) + return -ENOMEM; + + lock_buffer(bh); + jhdr = (journal_header_t *)bh->b_data; + jhdr->h_magic = cpu_to_be32(JBD2_MAGIC_NUMBER); + jhdr->h_blocktype = cpu_to_be32(JBD2_FC_BLOCK); + jhdr->h_sequence = cpu_to_be32(journal->j_running_transaction->t_tid); + + set_buffer_uptodate(bh); + unlock_buffer(bh); + journal->j_fc_wbuf[fc_off] = bh; + + *bh_out = bh; + + return 0; +} +EXPORT_SYMBOL(jbd2_map_fc_buf); + +/* + * Wait on fast commit buffers that were allocated by jbd2_map_fc_buf + * for completion. + */ +int jbd2_wait_on_fc_bufs(journal_t *journal, int num_blks) +{ + struct buffer_head *bh; + int i, j_fc_off; + + read_lock(&journal->j_state_lock); + j_fc_off = journal->j_fc_off; + read_unlock(&journal->j_state_lock); + + /* + * Wait in reverse order to minimize chances of us being woken up before + * all IOs have completed + */ + for (i = j_fc_off - 1; i >= j_fc_off - num_blks; i--) { + bh = journal->j_fc_wbuf[i]; + wait_on_buffer(bh); + if (unlikely(!buffer_uptodate(bh))) + return -EIO; + } + + return 0; +} +EXPORT_SYMBOL(jbd2_wait_on_fc_bufs); + /* * Conversion of logical to physical block numbers for the journal * diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h index 0a4d9d484528..599113bef67f 100644 --- a/include/linux/jbd2.h +++ b/include/linux/jbd2.h @@ -123,6 +123,7 @@ typedef struct journal_s journal_t; /* Journal control structure */ #define JBD2_SUPERBLOCK_V1 3 #define JBD2_SUPERBLOCK_V2 4 #define JBD2_REVOKE_BLOCK 5 +#define JBD2_FC_BLOCK 6 /* * Standard header for all descriptor blocks: @@ -1562,6 +1563,11 @@ int jbd2_start_async_fc_nowait(journal_t *journal, tid_t tid); int jbd2_start_async_fc_wait(journal_t *journal, tid_t tid); void jbd2_stop_async_fc(journal_t *journal, tid_t tid); void jbd2_init_fast_commit(journal_t *journal, int num_fc_blks); +int jbd2_map_fc_buf(journal_t *journal, struct buffer_head **bh_out); +int jbd2_wait_on_fc_bufs(journal_t *journal, int num_blks); +int jbd2_submit_inode_data(journal_t *journal, struct jbd2_inode *jinode); +int jbd2_wait_inode_data(journal_t *journal, struct jbd2_inode *jinode); + /* * is_journal_abort * -- 2.25.1.481.gfbce0eb801-goog