1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
9 #include <linux/posix_acl.h>
10 #include <linux/posix_acl_xattr.h>
11 #include <linux/xattr.h>
18 #define SYSTEM_DOS_ATTRIB "system.dos_attrib"
19 #define SYSTEM_NTFS_ATTRIB "system.ntfs_attrib"
20 #define SYSTEM_NTFS_ATTRIB_BE "system.ntfs_attrib_be"
21 #define SYSTEM_NTFS_SECURITY "system.ntfs_security"
24 static inline size_t unpacked_ea_size(const struct EA_FULL
*ea
)
26 return ea
->size
? le32_to_cpu(ea
->size
) :
27 ALIGN(struct_size(ea
, name
,
29 le16_to_cpu(ea
->elength
)),
33 static inline size_t packed_ea_size(const struct EA_FULL
*ea
)
35 return struct_size(ea
, name
,
36 1 + ea
->name_len
+ le16_to_cpu(ea
->elength
)) -
37 offsetof(struct EA_FULL
, flags
);
43 * Assume there is at least one xattr in the list.
45 static inline bool find_ea(const struct EA_FULL
*ea_all
, u32 bytes
,
46 const char *name
, u8 name_len
, u32
*off
, u32
*ea_sz
)
54 for (; *off
< bytes
; *off
+= ea_size
) {
55 const struct EA_FULL
*ea
= Add2Ptr(ea_all
, *off
);
56 ea_size
= unpacked_ea_size(ea
);
57 if (ea
->name_len
== name_len
&&
58 !memcmp(ea
->name
, name
, name_len
)) {
69 * ntfs_read_ea - Read all extended attributes.
70 * @ea: New allocated memory.
71 * @info: Pointer into resident data.
73 static int ntfs_read_ea(struct ntfs_inode
*ni
, struct EA_FULL
**ea
,
74 size_t add_bytes
, const struct EA_INFO
**info
)
77 struct ntfs_sb_info
*sbi
= ni
->mi
.sbi
;
78 struct ATTR_LIST_ENTRY
*le
= NULL
;
79 struct ATTRIB
*attr_info
, *attr_ea
;
81 u32 size
, off
, ea_size
;
83 static_assert(le32_to_cpu(ATTR_EA_INFO
) < le32_to_cpu(ATTR_EA
));
89 ni_find_attr(ni
, NULL
, &le
, ATTR_EA_INFO
, NULL
, 0, NULL
, NULL
);
91 ni_find_attr(ni
, attr_info
, &le
, ATTR_EA
, NULL
, 0, NULL
, NULL
);
93 if (!attr_ea
|| !attr_info
)
96 *info
= resident_data_ex(attr_info
, sizeof(struct EA_INFO
));
100 /* Check Ea limit. */
101 size
= le32_to_cpu((*info
)->size
);
102 if (size
> sbi
->ea_max_size
) {
107 if (attr_size(attr_ea
) > sbi
->ea_max_size
) {
113 /* EA info persists, but xattr is empty. Looks like EA problem. */
117 /* Allocate memory for packed Ea. */
118 ea_p
= kmalloc(size_add(size
, add_bytes
), GFP_NOFS
);
122 if (attr_ea
->non_res
) {
123 struct runs_tree run
;
127 err
= attr_load_runs_range(ni
, ATTR_EA
, NULL
, 0, &run
, 0, size
);
129 err
= ntfs_read_run_nb(sbi
, &run
, 0, ea_p
, size
, NULL
);
135 void *p
= resident_data_ex(attr_ea
, size
);
139 memcpy(ea_p
, p
, size
);
142 memset(Add2Ptr(ea_p
, size
), 0, add_bytes
);
145 /* Check all attributes for consistency. */
146 for (off
= 0; off
< size
; off
+= ea_size
) {
147 const struct EA_FULL
*ef
= Add2Ptr(ea_p
, off
);
148 u32 bytes
= size
- off
;
150 /* Check if we can use field ea->size. */
151 if (bytes
< sizeof(ef
->size
))
155 ea_size
= le32_to_cpu(ef
->size
);
161 /* Check if we can use fields ef->name_len and ef->elength. */
162 if (bytes
< offsetof(struct EA_FULL
, name
))
165 ea_size
= ALIGN(struct_size(ef
, name
,
167 le16_to_cpu(ef
->elength
)),
179 ntfs_set_state(sbi
, NTFS_DIRTY_DIRTY
);
186 * Copy a list of xattrs names into the buffer
187 * provided, or compute the buffer size required.
190 * * Number of bytes used / required on
191 * * -ERRNO - on failure
193 static ssize_t
ntfs_list_ea(struct ntfs_inode
*ni
, char *buffer
,
194 size_t bytes_per_buffer
)
196 const struct EA_INFO
*info
;
197 struct EA_FULL
*ea_all
= NULL
;
202 err
= ntfs_read_ea(ni
, &ea_all
, 0, &info
);
206 if (!info
|| !ea_all
)
209 size
= le32_to_cpu(info
->size
);
211 /* Enumerate all xattrs. */
214 while (off
+ sizeof(struct EA_FULL
) < size
) {
215 const struct EA_FULL
*ea
= Add2Ptr(ea_all
, off
);
216 int ea_size
= unpacked_ea_size(ea
);
217 u8 name_len
= ea
->name_len
;
222 if (name_len
> ea_size
) {
223 ntfs_set_state(ni
->mi
.sbi
, NTFS_DIRTY_ERROR
);
224 err
= -EINVAL
; /* corrupted fs. */
229 /* Check if we can use field ea->name */
230 if (off
+ ea_size
> size
)
233 if (ret
+ name_len
+ 1 > bytes_per_buffer
) {
238 memcpy(buffer
+ ret
, ea
->name
, name_len
);
239 buffer
[ret
+ name_len
] = 0;
248 return err
? err
: ret
;
251 static int ntfs_get_ea(struct inode
*inode
, const char *name
, size_t name_len
,
252 void *buffer
, size_t size
, size_t *required
)
254 struct ntfs_inode
*ni
= ntfs_i(inode
);
255 const struct EA_INFO
*info
;
256 struct EA_FULL
*ea_all
= NULL
;
257 const struct EA_FULL
*ea
;
261 if (!(ni
->ni_flags
& NI_FLAG_EA
))
269 if (name_len
> 255) {
274 err
= ntfs_read_ea(ni
, &ea_all
, 0, &info
);
281 /* Enumerate all xattrs. */
282 if (!find_ea(ea_all
, le32_to_cpu(info
->size
), name
, name_len
, &off
,
287 ea
= Add2Ptr(ea_all
, off
);
289 len
= le16_to_cpu(ea
->elength
);
302 memcpy(buffer
, ea
->name
+ ea
->name_len
+ 1, len
);
310 return err
? err
: len
;
313 static noinline
int ntfs_set_ea(struct inode
*inode
, const char *name
,
314 size_t name_len
, const void *value
,
315 size_t val_size
, int flags
, bool locked
,
318 struct ntfs_inode
*ni
= ntfs_i(inode
);
319 struct ntfs_sb_info
*sbi
= ni
->mi
.sbi
;
321 struct EA_INFO ea_info
;
322 const struct EA_INFO
*info
;
323 struct EA_FULL
*new_ea
;
324 struct EA_FULL
*ea_all
= NULL
;
325 size_t add
, new_pack
;
326 u32 off
, size
, ea_sz
;
329 struct ATTR_LIST_ENTRY
*le
;
330 struct mft_inode
*mi
;
331 struct runs_tree ea_run
;
340 if (name_len
> 255) {
345 add
= ALIGN(struct_size(ea_all
, name
, 1 + name_len
+ val_size
), 4);
347 err
= ntfs_read_ea(ni
, &ea_all
, add
, &info
);
352 memset(&ea_info
, 0, sizeof(ea_info
));
356 memcpy(&ea_info
, info
, sizeof(ea_info
));
357 size
= le32_to_cpu(ea_info
.size
);
358 size_pack
= ea_info
.size_pack
;
361 if (info
&& find_ea(ea_all
, size
, name
, name_len
, &off
, &ea_sz
)) {
364 if (flags
& XATTR_CREATE
) {
369 ea
= Add2Ptr(ea_all
, off
);
372 * Check simple case when we try to insert xattr with the same value
373 * e.g. ntfs_save_wsl_perm
375 if (val_size
&& le16_to_cpu(ea
->elength
) == val_size
&&
376 !memcmp(ea
->name
+ ea
->name_len
+ 1, value
, val_size
)) {
377 /* xattr already contains the required value. */
381 /* Remove current xattr. */
382 if (ea
->flags
& FILE_NEED_EA
)
383 le16_add_cpu(&ea_info
.count
, -1);
385 le16_add_cpu(&ea_info
.size_pack
, 0 - packed_ea_size(ea
));
387 memmove(ea
, Add2Ptr(ea
, ea_sz
), size
- off
- ea_sz
);
390 memset(Add2Ptr(ea_all
, size
), 0, ea_sz
);
392 ea_info
.size
= cpu_to_le32(size
);
394 if ((flags
& XATTR_REPLACE
) && !val_size
) {
399 if (flags
& XATTR_REPLACE
) {
405 ea_all
= kzalloc(add
, GFP_NOFS
);
413 /* Append new xattr. */
414 new_ea
= Add2Ptr(ea_all
, size
);
415 new_ea
->size
= cpu_to_le32(add
);
417 new_ea
->name_len
= name_len
;
418 new_ea
->elength
= cpu_to_le16(val_size
);
419 memcpy(new_ea
->name
, name
, name_len
);
420 new_ea
->name
[name_len
] = 0;
421 memcpy(new_ea
->name
+ name_len
+ 1, value
, val_size
);
422 new_pack
= le16_to_cpu(ea_info
.size_pack
) + packed_ea_size(new_ea
);
423 ea_info
.size_pack
= cpu_to_le16(new_pack
);
424 /* New size of ATTR_EA. */
426 ea_info
.size
= cpu_to_le32(size
);
429 * 1. Check ea_info.size_pack for overflow.
430 * 2. New attribute size must fit value from $AttrDef
432 if (new_pack
> 0xffff || size
> sbi
->ea_max_size
) {
435 "The size of extended attributes must not exceed 64KiB");
436 err
= -EFBIG
; // -EINVAL?
449 err
= ni_insert_resident(ni
, sizeof(struct EA_INFO
),
450 ATTR_EA_INFO
, NULL
, 0, NULL
, NULL
,
455 err
= ni_insert_resident(ni
, 0, ATTR_EA
, NULL
, 0, NULL
, NULL
,
462 err
= attr_set_size(ni
, ATTR_EA
, NULL
, 0, &ea_run
, new_sz
, &new_sz
,
468 attr
= ni_find_attr(ni
, NULL
, &le
, ATTR_EA_INFO
, NULL
, 0, NULL
, &mi
);
475 /* Delete xattr, ATTR_EA_INFO */
476 ni_remove_attr_le(ni
, attr
, mi
, le
);
478 p
= resident_data_ex(attr
, sizeof(struct EA_INFO
));
483 memcpy(p
, &ea_info
, sizeof(struct EA_INFO
));
488 attr
= ni_find_attr(ni
, NULL
, &le
, ATTR_EA
, NULL
, 0, NULL
, &mi
);
495 /* Delete xattr, ATTR_EA */
496 ni_remove_attr_le(ni
, attr
, mi
, le
);
497 } else if (attr
->non_res
) {
498 err
= attr_load_runs_range(ni
, ATTR_EA
, NULL
, 0, &ea_run
, 0,
503 err
= ntfs_sb_write_run(sbi
, &ea_run
, 0, ea_all
, size
, 0);
507 p
= resident_data_ex(attr
, size
);
512 memcpy(p
, ea_all
, size
);
516 /* Check if we delete the last xattr. */
518 ni
->ni_flags
|= NI_FLAG_EA
;
520 ni
->ni_flags
&= ~NI_FLAG_EA
;
522 if (ea_info
.size_pack
!= size_pack
)
523 ni
->ni_flags
|= NI_FLAG_UPDATE_PARENT
;
525 *ea_size
= ea_info
.size_pack
;
526 mark_inode_dirty(&ni
->vfs_inode
);
538 #ifdef CONFIG_NTFS3_FS_POSIX_ACL
541 * ntfs_get_acl - inode_operations::get_acl
543 struct posix_acl
*ntfs_get_acl(struct mnt_idmap
*idmap
, struct dentry
*dentry
,
546 struct inode
*inode
= d_inode(dentry
);
547 struct ntfs_inode
*ni
= ntfs_i(inode
);
550 struct posix_acl
*acl
;
555 /* Allocate PATH_MAX bytes. */
558 return ERR_PTR(-ENOMEM
);
560 /* Possible values of 'type' was already checked above. */
561 if (type
== ACL_TYPE_ACCESS
) {
562 name
= XATTR_NAME_POSIX_ACL_ACCESS
;
563 name_len
= sizeof(XATTR_NAME_POSIX_ACL_ACCESS
) - 1;
565 name
= XATTR_NAME_POSIX_ACL_DEFAULT
;
566 name_len
= sizeof(XATTR_NAME_POSIX_ACL_DEFAULT
) - 1;
571 err
= ntfs_get_ea(inode
, name
, name_len
, buf
, PATH_MAX
, &req
);
575 /* Translate extended attribute to acl. */
577 acl
= posix_acl_from_xattr(&init_user_ns
, buf
, err
);
578 } else if (err
== -ENODATA
) {
585 set_cached_acl(inode
, type
, acl
);
592 static noinline
int ntfs_set_acl_ex(struct mnt_idmap
*idmap
,
593 struct inode
*inode
, struct posix_acl
*acl
,
594 int type
, bool init_acl
)
597 size_t size
, name_len
;
603 if (S_ISLNK(inode
->i_mode
))
606 mode
= inode
->i_mode
;
608 case ACL_TYPE_ACCESS
:
609 /* Do not change i_mode if we are in init_acl */
610 if (acl
&& !init_acl
) {
611 err
= posix_acl_update_mode(idmap
, inode
, &mode
, &acl
);
615 name
= XATTR_NAME_POSIX_ACL_ACCESS
;
616 name_len
= sizeof(XATTR_NAME_POSIX_ACL_ACCESS
) - 1;
619 case ACL_TYPE_DEFAULT
:
620 if (!S_ISDIR(inode
->i_mode
))
621 return acl
? -EACCES
: 0;
622 name
= XATTR_NAME_POSIX_ACL_DEFAULT
;
623 name_len
= sizeof(XATTR_NAME_POSIX_ACL_DEFAULT
) - 1;
631 /* Remove xattr if it can be presented via mode. */
634 flags
= XATTR_REPLACE
;
636 size
= posix_acl_xattr_size(acl
->a_count
);
637 value
= kmalloc(size
, GFP_NOFS
);
640 err
= posix_acl_to_xattr(&init_user_ns
, acl
, value
, size
);
646 err
= ntfs_set_ea(inode
, name
, name_len
, value
, size
, flags
, 0, NULL
);
647 if (err
== -ENODATA
&& !size
)
648 err
= 0; /* Removing non existed xattr. */
650 set_cached_acl(inode
, type
, acl
);
651 inode
->i_mode
= mode
;
652 inode_set_ctime_current(inode
);
653 mark_inode_dirty(inode
);
663 * ntfs_set_acl - inode_operations::set_acl
665 int ntfs_set_acl(struct mnt_idmap
*idmap
, struct dentry
*dentry
,
666 struct posix_acl
*acl
, int type
)
668 return ntfs_set_acl_ex(idmap
, d_inode(dentry
), acl
, type
, false);
672 * ntfs_init_acl - Initialize the ACLs of a new inode.
674 * Called from ntfs_create_inode().
676 int ntfs_init_acl(struct mnt_idmap
*idmap
, struct inode
*inode
,
679 struct posix_acl
*default_acl
, *acl
;
682 err
= posix_acl_create(dir
, &inode
->i_mode
, &default_acl
, &acl
);
687 err
= ntfs_set_acl_ex(idmap
, inode
, default_acl
,
688 ACL_TYPE_DEFAULT
, true);
689 posix_acl_release(default_acl
);
691 inode
->i_default_acl
= NULL
;
696 err
= ntfs_set_acl_ex(idmap
, inode
, acl
,
697 ACL_TYPE_ACCESS
, true);
698 posix_acl_release(acl
);
708 * ntfs_acl_chmod - Helper for ntfs_setattr().
710 int ntfs_acl_chmod(struct mnt_idmap
*idmap
, struct dentry
*dentry
)
712 struct inode
*inode
= d_inode(dentry
);
713 struct super_block
*sb
= inode
->i_sb
;
715 if (!(sb
->s_flags
& SB_POSIXACL
))
718 if (S_ISLNK(inode
->i_mode
))
721 return posix_acl_chmod(idmap
, dentry
, inode
->i_mode
);
725 * ntfs_listxattr - inode_operations::listxattr
727 ssize_t
ntfs_listxattr(struct dentry
*dentry
, char *buffer
, size_t size
)
729 struct inode
*inode
= d_inode(dentry
);
730 struct ntfs_inode
*ni
= ntfs_i(inode
);
733 if (!(ni
->ni_flags
& NI_FLAG_EA
)) {
734 /* no xattr in file */
740 ret
= ntfs_list_ea(ni
, buffer
, size
);
747 static int ntfs_getxattr(const struct xattr_handler
*handler
, struct dentry
*de
,
748 struct inode
*inode
, const char *name
, void *buffer
,
752 struct ntfs_inode
*ni
= ntfs_i(inode
);
754 if (unlikely(ntfs3_forced_shutdown(inode
->i_sb
)))
757 /* Dispatch request. */
758 if (!strcmp(name
, SYSTEM_DOS_ATTRIB
)) {
759 /* system.dos_attrib */
762 } else if (size
< sizeof(u8
)) {
766 *(u8
*)buffer
= le32_to_cpu(ni
->std_fa
);
771 if (!strcmp(name
, SYSTEM_NTFS_ATTRIB
) ||
772 !strcmp(name
, SYSTEM_NTFS_ATTRIB_BE
)) {
773 /* system.ntfs_attrib */
776 } else if (size
< sizeof(u32
)) {
780 *(u32
*)buffer
= le32_to_cpu(ni
->std_fa
);
781 if (!strcmp(name
, SYSTEM_NTFS_ATTRIB_BE
))
782 *(__be32
*)buffer
= cpu_to_be32(*(u32
*)buffer
);
787 if (!strcmp(name
, SYSTEM_NTFS_SECURITY
)) {
788 /* system.ntfs_security*/
789 struct SECURITY_DESCRIPTOR_RELATIVE
*sd
= NULL
;
792 if (!is_ntfs3(ni
->mi
.sbi
)) {
793 /* We should get nt4 security. */
796 } else if (le32_to_cpu(ni
->std_security_id
) <
802 err
= ntfs_get_security_by_id(ni
->mi
.sbi
, ni
->std_security_id
,
807 if (!is_sd_valid(sd
, sd_size
)) {
810 "looks like you get incorrect security descriptor id=%u",
811 ni
->std_security_id
);
816 } else if (size
< sd_size
) {
820 memcpy(buffer
, sd
, sd_size
);
826 /* Deal with NTFS extended attribute. */
827 err
= ntfs_get_ea(inode
, name
, strlen(name
), buffer
, size
, NULL
);
834 * ntfs_setxattr - inode_operations::setxattr
836 static noinline
int ntfs_setxattr(const struct xattr_handler
*handler
,
837 struct mnt_idmap
*idmap
, struct dentry
*de
,
838 struct inode
*inode
, const char *name
,
839 const void *value
, size_t size
, int flags
)
842 struct ntfs_inode
*ni
= ntfs_i(inode
);
843 enum FILE_ATTRIBUTE new_fa
;
845 /* Dispatch request. */
846 if (!strcmp(name
, SYSTEM_DOS_ATTRIB
)) {
847 if (sizeof(u8
) != size
)
849 new_fa
= cpu_to_le32(*(u8
*)value
);
853 if (!strcmp(name
, SYSTEM_NTFS_ATTRIB
) ||
854 !strcmp(name
, SYSTEM_NTFS_ATTRIB_BE
)) {
855 if (size
!= sizeof(u32
))
857 if (!strcmp(name
, SYSTEM_NTFS_ATTRIB_BE
))
858 new_fa
= cpu_to_le32(be32_to_cpu(*(__be32
*)value
));
860 new_fa
= cpu_to_le32(*(u32
*)value
);
862 if (S_ISREG(inode
->i_mode
)) {
863 /* Process compressed/sparsed in special way. */
865 err
= ni_new_attr_flags(ni
, new_fa
);
872 * Thanks Mark Harmstone:
873 * Keep directory bit consistency.
875 if (S_ISDIR(inode
->i_mode
))
876 new_fa
|= FILE_ATTRIBUTE_DIRECTORY
;
878 new_fa
&= ~FILE_ATTRIBUTE_DIRECTORY
;
880 if (ni
->std_fa
!= new_fa
) {
882 if (new_fa
& FILE_ATTRIBUTE_READONLY
)
883 inode
->i_mode
&= ~0222;
885 inode
->i_mode
|= 0222;
886 /* Std attribute always in primary record. */
888 mark_inode_dirty(inode
);
895 if (!strcmp(name
, SYSTEM_NTFS_SECURITY
)) {
896 /* system.ntfs_security*/
899 struct ATTR_STD_INFO5
*std
;
901 if (!is_ntfs3(ni
->mi
.sbi
)) {
903 * We should replace ATTR_SECURE.
904 * Skip this way cause it is nt4 feature.
910 if (!is_sd_valid(value
, size
)) {
914 "you try to set invalid security descriptor");
918 err
= ntfs_insert_security(ni
->mi
.sbi
, value
, size
,
919 &security_id
, &inserted
);
927 } else if (std
->security_id
!= security_id
) {
928 std
->security_id
= ni
->std_security_id
= security_id
;
929 /* Std attribute always in primary record. */
931 mark_inode_dirty(&ni
->vfs_inode
);
937 /* Deal with NTFS extended attribute. */
938 err
= ntfs_set_ea(inode
, name
, strlen(name
), value
, size
, flags
, 0,
942 inode_set_ctime_current(inode
);
943 mark_inode_dirty(inode
);
951 * save uid/gid/mode in xattr
953 int ntfs_save_wsl_perm(struct inode
*inode
, __le16
*ea_size
)
957 struct ntfs_inode
*ni
= ntfs_i(inode
);
960 value
= cpu_to_le32(i_uid_read(inode
));
961 err
= ntfs_set_ea(inode
, "$LXUID", sizeof("$LXUID") - 1, &value
,
962 sizeof(value
), 0, true, ea_size
);
966 value
= cpu_to_le32(i_gid_read(inode
));
967 err
= ntfs_set_ea(inode
, "$LXGID", sizeof("$LXGID") - 1, &value
,
968 sizeof(value
), 0, true, ea_size
);
972 value
= cpu_to_le32(inode
->i_mode
);
973 err
= ntfs_set_ea(inode
, "$LXMOD", sizeof("$LXMOD") - 1, &value
,
974 sizeof(value
), 0, true, ea_size
);
978 if (S_ISCHR(inode
->i_mode
) || S_ISBLK(inode
->i_mode
)) {
979 value
= cpu_to_le32(inode
->i_rdev
);
980 err
= ntfs_set_ea(inode
, "$LXDEV", sizeof("$LXDEV") - 1, &value
,
981 sizeof(value
), 0, true, ea_size
);
988 /* In case of error should we delete all WSL xattr? */
995 * get uid/gid/mode from xattr
996 * it is called from ntfs_iget5->ntfs_read_mft
998 void ntfs_get_wsl_perm(struct inode
*inode
)
1003 if (ntfs_get_ea(inode
, "$LXUID", sizeof("$LXUID") - 1, &value
[0],
1004 sizeof(value
[0]), &sz
) == sizeof(value
[0]) &&
1005 ntfs_get_ea(inode
, "$LXGID", sizeof("$LXGID") - 1, &value
[1],
1006 sizeof(value
[1]), &sz
) == sizeof(value
[1]) &&
1007 ntfs_get_ea(inode
, "$LXMOD", sizeof("$LXMOD") - 1, &value
[2],
1008 sizeof(value
[2]), &sz
) == sizeof(value
[2])) {
1009 i_uid_write(inode
, (uid_t
)le32_to_cpu(value
[0]));
1010 i_gid_write(inode
, (gid_t
)le32_to_cpu(value
[1]));
1011 inode
->i_mode
= le32_to_cpu(value
[2]);
1013 if (ntfs_get_ea(inode
, "$LXDEV", sizeof("$$LXDEV") - 1,
1014 &value
[0], sizeof(value
),
1015 &sz
) == sizeof(value
[0])) {
1016 inode
->i_rdev
= le32_to_cpu(value
[0]);
1021 static bool ntfs_xattr_user_list(struct dentry
*dentry
)
1027 static const struct xattr_handler ntfs_other_xattr_handler
= {
1029 .get
= ntfs_getxattr
,
1030 .set
= ntfs_setxattr
,
1031 .list
= ntfs_xattr_user_list
,
1034 const struct xattr_handler
* const ntfs_xattr_handlers
[] = {
1035 &ntfs_other_xattr_handler
,