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 <dsterba@suse.com>
This commit is contained in:
David Sterba 2024-06-05 02:28:30 +02:00
parent 1b6e068a0c
commit 070969f17d

View File

@ -350,10 +350,12 @@ static inline void btrfs_set_first_dir_index_to_log(struct btrfs_inode *inode,
WRITE_ONCE(inode->first_dir_index_to_log, index);
}
static inline struct btrfs_inode *BTRFS_I(const struct inode *inode)
{
return container_of(inode, struct btrfs_inode, vfs_inode);
}
/* Type checked and const-preserving VFS inode -> btrfs inode. */
#define BTRFS_I(_inode) \
_Generic(_inode, \
struct inode *: container_of(_inode, struct btrfs_inode, vfs_inode), \
const struct inode *: (const struct btrfs_inode *)container_of( \
_inode, const struct btrfs_inode, vfs_inode))
static inline unsigned long btrfs_inode_hash(u64 objectid,
const struct btrfs_root *root)