From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vyacheslav Dubeyko Subject: [PATCH 10/14] hfsplus: implement functionality of journal log wrapping Date: Thu, 26 Dec 2013 13:47:47 +0400 Message-ID: <1388051267.4168.73.camel@slavad-ubuntu> Reply-To: slava@dubeyko.com Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Cc: Al Viro , ChristophHellwig , Hin-Tak Leung , Andrew Morton To: Linux FS devel list Return-path: Received: from oproxy19-pub.mail.unifiedlayer.com ([70.40.200.33]:38050 "HELO oproxy19-pub.mail.unifiedlayer.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1751733Ab3LZJyl (ORCPT ); Thu, 26 Dec 2013 04:54:41 -0500 Sender: linux-fsdevel-owner@vger.kernel.org List-ID: From: Vyacheslav Dubeyko Subject: [PATCH 10/14] hfsplus: implement functionality of journal log wrapping The journal log is a circular buffer. Thereby, journal log's content can be splitted by journal end on two parts in some situations. When reading or writing the journal buffer, the I/O operation must stop at the end of the journal buffer and resume (wrap around) immediately following the journal header. This patch implements functionality of wrapping of journal log for such situation. Namely, it means setting of "start" field of journal header by journal header size value. Signed-off-by: Vyacheslav Dubeyko CC: Al Viro CC: Christoph Hellwig CC: Hin-Tak Leung --- fs/hfsplus/journal.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/fs/hfsplus/journal.c b/fs/hfsplus/journal.c index c1fefc2..fc88d2b 100644 --- a/fs/hfsplus/journal.c +++ b/fs/hfsplus/journal.c @@ -290,6 +290,36 @@ static inline bool need_to_wrap_journal(struct hfsplus_journal_header *jh, return (cur_off + req_size) > JOURNAL_SIZE(jh); } +static inline void __hfsplus_wrap_journal(struct super_block *sb) +{ + struct hfsplus_journal *jnl = HFSPLUS_SB(sb)->jnl; + + jnl->jh->start = jnl->jh->jhdr_size; +} + +/* Return rest bytes of binfo or blhdr from the journal begin */ +static inline u32 hfsplus_wrap_journal(struct super_block *sb, + u64 cur_off, u32 req_size) +{ + struct hfsplus_journal *jnl = HFSPLUS_SB(sb)->jnl; + struct hfsplus_journal_header *jh = jnl->jh; + u32 used_bytes; + u32 rest_bytes; + + hfs_dbg(JOURNAL, "cur_off %llu, req_size %u, JOURNAL_SIZE(jh) %llu\n", + cur_off, req_size, JOURNAL_SIZE(jh)); + + BUG_ON(cur_off > JOURNAL_SIZE(jh)); + BUG_ON((cur_off + req_size) < JOURNAL_SIZE(jh)); + + used_bytes = JOURNAL_SIZE(jh) - cur_off; + rest_bytes = req_size - used_bytes; + + __hfsplus_wrap_journal(sb); + + return rest_bytes; +} + static void hfsplus_deinit_block_list_desc(struct hfsplus_blist_desc *desc); static int hfsplus_init_block_list_desc(struct super_block *sb, -- 1.7.9.5