aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
authorChenXiaoSong <chenxiaosong@kylinos.cn>2026-06-15 20:29:07 +0900
committerSteve French <stfrench@microsoft.com>2026-06-16 18:57:21 -0500
commite48b687221f4e5215c9b8d2ae2c319d88a65809c (patch)
tree096d7cfa9cd142eeba6144350449477ea160353d /fs
parent9d357903ec9b0da60cccc4d311f99763ba0924a2 (diff)
downloadath-e48b687221f4e5215c9b8d2ae2c319d88a65809c.tar.gz
smb/server: get compression file attribute on open
Example: 1. server: chattr +c /export/file 2. client: lsattr /mnt/file --------c------------- /mnt/file Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/smb/server/smb2pdu.c5
-rw-r--r--fs/smb/server/vfs.c18
-rw-r--r--fs/smb/server/vfs.h1
3 files changed, 23 insertions, 1 deletions
diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
index e3c53f22f5ec4..4b8e1a4f9e6bf 100644
--- a/fs/smb/server/smb2pdu.c
+++ b/fs/smb/server/smb2pdu.c
@@ -3604,7 +3604,10 @@ int smb2_open(struct ksmbd_work *work)
if (!created)
smb2_update_xattrs(tcon, &path, fp);
- else
+
+ ksmbd_vfs_update_compressed_fattr(path.dentry, &fp->f_ci->m_fattr);
+
+ if (created)
smb2_new_xattrs(tcon, &path, fp);
memcpy(fp->client_guid, conn->ClientGUID, SMB2_CLIENT_GUID_SIZE);
diff --git a/fs/smb/server/vfs.c b/fs/smb/server/vfs.c
index 18c0a7c6b41bd..b2403db135584 100644
--- a/fs/smb/server/vfs.c
+++ b/fs/smb/server/vfs.c
@@ -20,6 +20,7 @@
#include <linux/sched/xacct.h>
#include <linux/crc32c.h>
#include <linux/splice.h>
+#include <linux/fileattr.h>
#include "glob.h"
#include "oplock.h"
@@ -1881,3 +1882,20 @@ int ksmbd_vfs_inherit_posix_acl(struct mnt_idmap *idmap,
posix_acl_release(acls);
return rc;
}
+
+void ksmbd_vfs_update_compressed_fattr(struct dentry *dentry, __le32 *fattr)
+{
+ int rc;
+ struct file_kattr fa = { .flags_valid = true };
+
+ rc = vfs_fileattr_get(dentry, &fa);
+ if (rc == -ENOIOCTLCMD)
+ *fattr &= ~FILE_ATTRIBUTE_COMPRESSED_LE;
+ if (rc)
+ return;
+
+ if (fa.flags & FS_COMPR_FL)
+ *fattr |= FILE_ATTRIBUTE_COMPRESSED_LE;
+ else
+ *fattr &= ~FILE_ATTRIBUTE_COMPRESSED_LE;
+}
diff --git a/fs/smb/server/vfs.h b/fs/smb/server/vfs.h
index 16ca29ee16e51..ac6dda173b752 100644
--- a/fs/smb/server/vfs.h
+++ b/fs/smb/server/vfs.h
@@ -168,4 +168,5 @@ int ksmbd_vfs_set_init_posix_acl(struct mnt_idmap *idmap,
int ksmbd_vfs_inherit_posix_acl(struct mnt_idmap *idmap,
const struct path *path,
struct inode *parent_inode);
+void ksmbd_vfs_update_compressed_fattr(struct dentry *dentry, __le32 *fattr);
#endif /* __KSMBD_VFS_H__ */