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>
This commit is contained in:
ChenXiaoSong 2026-06-15 20:29:07 +09:00 committed by Steve French
parent 9d357903ec
commit e48b687221
3 changed files with 23 additions and 1 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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__ */