From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from cn.fujitsu.com ([59.151.112.132]:4607 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S934214AbaLKJA3 convert rfc822-to-8bit (ORCPT ); Thu, 11 Dec 2014 04:00:29 -0500 Message-ID: <54894EF2.4070808@cn.fujitsu.com> Date: Thu, 11 Dec 2014 15:59:46 +0800 From: Qu Wenruo MIME-Version: 1.0 To: , CC: David Sterba Subject: Re: [PATCH 05/18] btrfs-progs: ctree.h: fix btrfs_inode_[amc]time References: <1418244708-7087-1-git-send-email-mwilck@arcor.de> <1418244708-7087-6-git-send-email-mwilck@arcor.de> In-Reply-To: <1418244708-7087-6-git-send-email-mwilck@arcor.de> Content-Type: text/plain; charset="utf-8"; format=flowed Sender: linux-btrfs-owner@vger.kernel.org List-ID: -------- Original Message -------- Subject: [PATCH 05/18] btrfs-progs: ctree.h: fix btrfs_inode_[amc]time From: To: Date: 2014年12月11日 04:51 > From: Martin Wilck > > make btrfs_inode_[amc]time work like the other btrfs_inode_xxx > functions. The current definition appears broken to me; it never > returns valid pointer unless an extent buffer address is added. The original method returns the ptr in the way just like btrfs_item_ptr(), which you should call read_extent_buffer() to read them into a struct of btrfs_timespec. That's the same in kernel codes. If just want to read the timespec, you could try btrfs_stack_timespec_[n]spec() marco. Thanks, Qu > Signed-off-by: Martin Wilck > --- > ctree.h | 15 +++++++++------ > 1 files changed, 9 insertions(+), 6 deletions(-) > > diff --git a/ctree.h b/ctree.h > index 89036de..1d5a5fc 100644 > --- a/ctree.h > +++ b/ctree.h > @@ -1414,27 +1414,30 @@ BTRFS_SETGET_STACK_FUNCS(stack_inode_flags, > struct btrfs_inode_item, flags, 64); > > static inline struct btrfs_timespec * > -btrfs_inode_atime(struct btrfs_inode_item *inode_item) > +btrfs_inode_atime(struct extent_buffer *eb, > + struct btrfs_inode_item *inode_item) > { > unsigned long ptr = (unsigned long)inode_item; > ptr += offsetof(struct btrfs_inode_item, atime); > - return (struct btrfs_timespec *)ptr; > + return (struct btrfs_timespec *)(ptr + eb->data); > } > > static inline struct btrfs_timespec * > -btrfs_inode_mtime(struct btrfs_inode_item *inode_item) > +btrfs_inode_mtime(struct extent_buffer *eb, > + struct btrfs_inode_item *inode_item) > { > unsigned long ptr = (unsigned long)inode_item; > ptr += offsetof(struct btrfs_inode_item, mtime); > - return (struct btrfs_timespec *)ptr; > + return (struct btrfs_timespec *)(ptr + eb->data); > } > > static inline struct btrfs_timespec * > -btrfs_inode_ctime(struct btrfs_inode_item *inode_item) > +btrfs_inode_ctime(struct extent_buffer *eb, > + struct btrfs_inode_item *inode_item) > { > unsigned long ptr = (unsigned long)inode_item; > ptr += offsetof(struct btrfs_inode_item, ctime); > - return (struct btrfs_timespec *)ptr; > + return (struct btrfs_timespec *)(ptr + eb->data); > } > > static inline struct btrfs_timespec *