Viewing: fs.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
* This file is part of Lustre, http://www.lustre.org/
*
* Basic library routines.
*/
#ifndef __LIBCFS_LINUX_CFS_FS_H__
#define __LIBCFS_LINUX_CFS_FS_H__
#include <linux/fs.h>
#ifndef S_DT_SHIFT
#define S_DT_SHIFT 12
#endif
#ifndef S_DT
#define S_DT(type) (((type) & S_IFMT) >> S_DT_SHIFT)
#endif
#ifndef DTTOIF
#define DTTOIF(dirtype) ((dirtype) << S_DT_SHIFT)
#endif
#ifndef SB_I_CGROUPWB
#define SB_I_CGROUPWB 0
#endif
/* Really belongs in mnt_idmapping.h but it doesn't exist for
* older kernels. mnt_idmapping.h is always included with fs.h.
*/
#ifndef HAVE_MNT_IDMAP_ARG
#define mnt_idmap user_namespace
#define nop_mnt_idmap init_user_ns
#endif
#if !defined(HAVE_VFS_CREATE_DELEGATE)
#if !defined(HAVE_USER_NAMESPACE_ARG) && !defined(HAVE_MNT_IDMAP_ARG)
#define vfs_create(ns, de, mode, di) \
vfs_create(d_inode((de)->d_parent), (de), (mode), !!(di))
#else
#define vfs_create(ns, de, mode, di) \
vfs_create((ns), d_inode((de)->d_parent), (de), (mode), !!(di))
#endif
#endif /* HAVE_VFS_CREATE_DELEGATE */
#ifdef HAVE_VFS_MKDIR_DELEGATE
#define VFS_MKDIR_DELEGATE(id, inode, dentry, mode) \
vfs_mkdir((id), (inode), (dentry), (mode), NULL)
#else
#define VFS_MKDIR_DELEGATE(id, inode, dentry, mode) \
vfs_mkdir((id), (inode), (dentry), (mode))
#endif /* HAVE_VFS_MKDIR_DELEGATE */
#ifdef HAVE_IOPS_MKDIR_RETURNS_DENTRY
#define ll_vfs_mkdir(id, inode, dentry, mode) \
VFS_MKDIR_DELEGATE((id), (inode), (dentry), (mode))
#else
#define ll_vfs_mkdir(i, inode, dentry, mode) ({ \
int rc = VFS_MKDIR_DELEGATE((i), (inode), (dentry), (mode)); \
if (rc) { \
dput((dentry)); \
dentry = ERR_PTR(rc); \
} \
(dentry); \
})
#endif /* HAVE_IOPS_MKDIR_RETURNS_DENTRY */
static inline int ll_vfs_getattr(struct path *path, struct kstat *st,
u32 request_mask, unsigned int flags)
{
#ifdef AT_GETATTR_NOSEC /* added in v6.7-rc1-1-g8a924db2d7b5 */
if (flags & AT_GETATTR_NOSEC)
return vfs_getattr_nosec(path, st, request_mask, flags);
#endif /* AT_GETATTR_NOSEC */
return vfs_getattr(path, st, request_mask, flags);
}
#ifndef HAVE_INODE_JUST_DROP
static inline int inode_just_drop(struct inode *inode)
{
return generic_delete_inode(inode);
}
static inline int inode_generic_drop(struct inode *inode)
{
return generic_drop_inode(inode);
}
#endif
#ifndef HAVE_ILOOKUP5_NOWAIT_ISNEW
#define ilookup5_nowait(sb, hash, fn, data, isnew) \
ilookup5_nowait((sb), (hash), (fn), (data))
#endif
#endif /* __LIBCFS_LINUX_CFS_FS_H__ */