ntfs: add fileattr query support

Add fileattr_get operations for files and directories, as well as the
existing symlink and special inode operation tables. Report compression,
encryption, immutable and append-only from cached inode state, and
FS_CASEFOLD_FL from the mount-wide case sensitivity policy.

This introduces querying only. It neither reads a private flag EA nor
allows userspace to change the reported flags.

Signed-off-by: Baolin Liu <liubaolin@kylinos.cn>
Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
This commit is contained in:
Baolin Liu 2026-09-23 14:02:43 +08:00 committed by Namjae Jeon
parent 1cbfb3c2d5
commit 5656fea4d6
4 changed files with 44 additions and 0 deletions

View File

@ -9,6 +9,7 @@ The Linux NTFS filesystem driver
- Overview
- Utilities support
- Linux file attributes
- Supported mount options
@ -34,6 +35,13 @@ The project is available at:
https://github.com/ntfsprogs-plus/ntfsprogs-plus
Linux file attributes
=====================
The driver supports querying compression, encryption, immutable, append-only
and mount-wide case folding through lsattr(1). Case folding is reported
according to the mount options.
Supported mount options
=======================

View File

@ -15,6 +15,7 @@
#include <linux/posix_acl_xattr.h>
#include <linux/compat.h>
#include <linux/falloc.h>
#include <linux/fileattr.h>
#include <linux/file.h>
#include <linux/filelock.h>
#include <linux/list.h>
@ -144,6 +145,35 @@ int ntfs_file_release(struct inode *vi, struct file *filp)
return 0;
}
/*
* ntfs_fileattr_get - inode_operations::fileattr_get
* @dentry: dentry to report the flags of
* @fa: filled in with the flags of @dentry
*/
int ntfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
{
struct inode *vi = d_inode(dentry);
struct ntfs_inode *ni = NTFS_I(vi);
u32 flags = 0;
if (NVolShutdown(ni->vol))
return -EIO;
if (NInoCompressed(ni) || NInoWofCompressed(ni))
flags |= FS_COMPR_FL;
if (NInoEncrypted(ni))
flags |= FS_ENCRYPT_FL;
if (vi->i_flags & S_IMMUTABLE)
flags |= FS_IMMUTABLE_FL;
if (vi->i_flags & S_APPEND)
flags |= FS_APPEND_FL;
if (!NVolCaseSensitive(ni->vol))
flags |= FS_CASEFOLD_FL;
fileattr_fill_flags(fa, flags);
return 0;
}
struct ntfs_fsync_attr {
struct list_head list;
struct inode *inode;
@ -1426,6 +1456,7 @@ const struct file_operations ntfs_file_ops = {
};
const struct inode_operations ntfs_file_inode_ops = {
.fileattr_get = ntfs_fileattr_get,
.setattr = ntfs_setattr,
.getattr = ntfs_getattr,
.listxattr = ntfs_listxattr,
@ -1435,12 +1466,14 @@ const struct inode_operations ntfs_file_inode_ops = {
};
const struct inode_operations ntfs_symlink_inode_operations = {
.fileattr_get = ntfs_fileattr_get,
.get_link = ntfs_get_link,
.setattr = ntfs_setattr,
.listxattr = ntfs_listxattr,
};
const struct inode_operations ntfs_special_inode_operations = {
.fileattr_get = ntfs_fileattr_get,
.setattr = ntfs_setattr,
.getattr = ntfs_getattr,
.listxattr = ntfs_listxattr,

View File

@ -1660,6 +1660,7 @@ static int ntfs_link(struct dentry *old_dentry, struct inode *dir,
* Inode operations for directories.
*/
const struct inode_operations ntfs_dir_inode_ops = {
.fileattr_get = ntfs_fileattr_get,
.lookup = ntfs_lookup, /* VFS: Lookup directory. */
.create = ntfs_create,
.unlink = ntfs_unlink,

View File

@ -185,6 +185,8 @@ extern const struct inode_operations ntfs_dir_inode_ops;
extern const struct file_operations ntfs_empty_file_ops;
extern const struct inode_operations ntfs_empty_inode_ops;
int ntfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa);
extern const struct export_operations ntfs_export_ops;
/*