Skip to content

Commit 070969f

Browse files
committed
btrfs: rework BTRFS_I as macro to preserve parameter const
Currently BTRFS_I is a static inline function that takes a const inode and returns btrfs inode, dropping the 'const' qualifier. This can break assumptions of compiler though it seems there's no real case. To make the parameter and return type consistent regardint const we can use the container_of_const() that preserves it. However this would not check the parameter type. To fix that use the same _Generic construct but implement only the two expected types. Signed-off-by: David Sterba <[email protected]>
1 parent 1b6e068 commit 070969f

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

fs/btrfs/btrfs_inode.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,10 +350,12 @@ static inline void btrfs_set_first_dir_index_to_log(struct btrfs_inode *inode,
350350
WRITE_ONCE(inode->first_dir_index_to_log, index);
351351
}
352352

353-
static inline struct btrfs_inode *BTRFS_I(const struct inode *inode)
354-
{
355-
return container_of(inode, struct btrfs_inode, vfs_inode);
356-
}
353+
/* Type checked and const-preserving VFS inode -> btrfs inode. */
354+
#define BTRFS_I(_inode) \
355+
_Generic(_inode, \
356+
struct inode *: container_of(_inode, struct btrfs_inode, vfs_inode), \
357+
const struct inode *: (const struct btrfs_inode *)container_of( \
358+
_inode, const struct btrfs_inode, vfs_inode))
357359

358360
static inline unsigned long btrfs_inode_hash(u64 objectid,
359361
const struct btrfs_root *root)

0 commit comments

Comments
 (0)