Re: [PATCH 05/18] btrfs-progs: ctree.h: fix btrfs_inode_[amc]time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




-------- Original Message --------
Subject: Re: [PATCH 05/18] btrfs-progs: ctree.h: fix btrfs_inode_[amc]time
From: Qu Wenruo <quwenruo@xxxxxxxxxxxxxx>
To: mwilck@xxxxxxxx, linux-btrfs@xxxxxxxxxxxxxxx
Date: 2014年12月11日 15:59

-------- Original Message --------
Subject: [PATCH 05/18] btrfs-progs: ctree.h: fix btrfs_inode_[amc]time
From: <mwilck@xxxxxxxx>
To: <linux-btrfs@xxxxxxxxxxxxxxx>
Date: 2014年12月11日 04:51
From: Martin Wilck <mwilck@xxxxxxxx>

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.
Oh, sorry, for your case, it is btrfs_timespec_[n]spec() marcro, not the stack ones.
And that one uses the timespec returned by btrfs_inode_[amc]time() marcor.

Thanks,
Qu

Thanks,
Qu
Signed-off-by: Martin Wilck <mwilck@xxxxxxxx>
---
  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 *


--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux