xref: /linux/fs/ntfs/ea.c (revision a73258681279bceb4e9210d86204bae14d3ea795)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Pocessing of EA's
4  *
5  * Part of this file is based on code from the NTFS-3G.
6  *
7  * Copyright (c) 2014-2021 Jean-Pierre Andre
8  * Copyright (c) 2025 LG Electronics Co., Ltd.
9  */
10 
11 #include <linux/fs.h>
12 #include <linux/posix_acl.h>
13 #include <linux/posix_acl_xattr.h>
14 #include <linux/xattr.h>
15 
16 #include "layout.h"
17 #include "attrib.h"
18 #include "index.h"
19 #include "dir.h"
20 #include "ea.h"
21 
22 static int ntfs_write_ea(struct ntfs_inode *ni, __le32 type, char *value, s64 ea_off,
23 		s64 ea_size, bool need_truncate)
24 {
25 	struct inode *ea_vi;
26 	int err = 0;
27 	s64 written;
28 
29 	ea_vi = ntfs_attr_iget(VFS_I(ni), type, AT_UNNAMED, 0);
30 	if (IS_ERR(ea_vi))
31 		return PTR_ERR(ea_vi);
32 
33 	written = ntfs_inode_attr_pwrite(ea_vi, ea_off, ea_size, value, false);
34 	if (written != ea_size)
35 		err = -EIO;
36 	else {
37 		struct ntfs_inode *ea_ni = NTFS_I(ea_vi);
38 
39 		if (need_truncate && ea_ni->data_size > ea_off + ea_size)
40 			ntfs_attr_truncate(ea_ni, ea_off + ea_size);
41 		mark_mft_record_dirty(ni);
42 	}
43 
44 	iput(ea_vi);
45 	return err;
46 }
47 
48 static int ntfs_ea_lookup(char *ea_buf, s64 ea_buf_size, const char *name,
49 		int name_len, s64 *ea_offset, s64 *ea_size)
50 {
51 	const struct ea_attr *p_ea;
52 	s64 offset;
53 	unsigned int next;
54 
55 	if (ea_buf_size < sizeof(struct ea_attr))
56 		goto out;
57 
58 	offset = 0;
59 	do {
60 		p_ea = (const struct ea_attr *)&ea_buf[offset];
61 		next = le32_to_cpu(p_ea->next_entry_offset);
62 
63 		if (offset + next > ea_buf_size ||
64 		    ((1 + p_ea->ea_name_length) > (ea_buf_size - offset)))
65 			break;
66 
67 		if (p_ea->ea_name_length == name_len &&
68 		    !memcmp(p_ea->ea_name, name, name_len)) {
69 			*ea_offset = offset;
70 			if (next)
71 				*ea_size = next;
72 			else {
73 				unsigned int ea_len = 1 + p_ea->ea_name_length +
74 						le16_to_cpu(p_ea->ea_value_length);
75 
76 				if ((ea_buf_size - offset) < ea_len)
77 					goto out;
78 
79 				*ea_size = ALIGN(struct_size(p_ea, ea_name,
80 							1 + p_ea->ea_name_length +
81 							le16_to_cpu(p_ea->ea_value_length)), 4);
82 			}
83 
84 			if (ea_buf_size < *ea_offset + *ea_size)
85 				goto out;
86 
87 			return 0;
88 		}
89 		offset += next;
90 	} while (next > 0 && offset < ea_buf_size &&
91 		 sizeof(struct ea_attr) < (ea_buf_size - offset));
92 
93 out:
94 	return -ENOENT;
95 }
96 
97 /*
98  * Return the existing EA
99  *
100  * The EA_INFORMATION is not examined and the consistency of the
101  * existing EA is not checked.
102  *
103  * If successful, the full attribute is returned unchanged
104  * and its size is returned.
105  * If the designated buffer is too small, the needed size is
106  * returned, and the buffer is left unchanged.
107  * If there is an error, a negative value is returned and errno
108  * is set according to the error.
109  */
110 static int ntfs_get_ea(struct inode *inode, const char *name, size_t name_len,
111 		void *buffer, size_t size)
112 {
113 	struct ntfs_inode *ni = NTFS_I(inode);
114 	const struct ea_attr *p_ea;
115 	char *ea_buf;
116 	s64 ea_off, ea_size, all_ea_size, ea_info_size;
117 	int err;
118 	u32 ea_info_qlen;
119 	u16 ea_value_len;
120 	struct ea_information *p_ea_info;
121 
122 	if (!NInoHasEA(ni))
123 		return -ENODATA;
124 
125 	p_ea_info = ntfs_attr_readall(ni, AT_EA_INFORMATION, NULL, 0,
126 			&ea_info_size);
127 	if (!p_ea_info || ea_info_size != sizeof(struct ea_information)) {
128 		kvfree(p_ea_info);
129 		return -ENODATA;
130 	}
131 
132 	ea_info_qlen = le32_to_cpu(p_ea_info->ea_query_length);
133 	kvfree(p_ea_info);
134 
135 	ea_buf = ntfs_attr_readall(ni, AT_EA, NULL, 0, &all_ea_size);
136 	if (!ea_buf)
137 		return -ENODATA;
138 
139 	err = ntfs_ea_lookup(ea_buf, ea_info_qlen, name, name_len, &ea_off,
140 			&ea_size);
141 	if (!err) {
142 		p_ea = (struct ea_attr *)&ea_buf[ea_off];
143 		ea_value_len = le16_to_cpu(p_ea->ea_value_length);
144 		if (!buffer) {
145 			kvfree(ea_buf);
146 			return ea_value_len;
147 		}
148 
149 		if (ea_value_len > size) {
150 			err = -ERANGE;
151 			goto free_ea_buf;
152 		}
153 
154 		memcpy(buffer, &p_ea->ea_name[p_ea->ea_name_length + 1],
155 				ea_value_len);
156 		kvfree(ea_buf);
157 		return ea_value_len;
158 	}
159 
160 	err = -ENODATA;
161 free_ea_buf:
162 	kvfree(ea_buf);
163 	return err;
164 }
165 
166 static inline int ea_packed_size(const struct ea_attr *p_ea)
167 {
168 	/*
169 	 * 4 bytes for header (flags and lengths) + name length + 1 +
170 	 * value length.
171 	 */
172 	return 5 + p_ea->ea_name_length + le16_to_cpu(p_ea->ea_value_length);
173 }
174 
175 /*
176  * Set a new EA, and set EA_INFORMATION accordingly
177  *
178  * This is roughly the same as ZwSetEaFile() on Windows, however
179  * the "offset to next" of the last EA should not be cleared.
180  *
181  * Consistency of the new EA is first checked.
182  *
183  * EA_INFORMATION is set first, and it is restored to its former
184  * state if setting EA fails.
185  */
186 static int ntfs_set_ea(struct inode *inode, const char *name, size_t name_len,
187 		const void *value, size_t val_size, int flags,
188 		__le16 *packed_ea_size)
189 {
190 	struct ntfs_inode *ni = NTFS_I(inode);
191 	struct ea_information *p_ea_info = NULL;
192 	int ea_packed, err = 0;
193 	struct ea_attr *p_ea;
194 	u32 ea_info_qsize = 0;
195 	char *ea_buf = NULL;
196 	size_t new_ea_size = ALIGN(struct_size(p_ea, ea_name, 1 + name_len + val_size), 4);
197 	s64 ea_off, ea_info_size, all_ea_size, ea_size;
198 
199 	if (name_len > 255)
200 		return -ENAMETOOLONG;
201 
202 	if (ntfs_attr_exist(ni, AT_EA_INFORMATION, AT_UNNAMED, 0)) {
203 		p_ea_info = ntfs_attr_readall(ni, AT_EA_INFORMATION, NULL, 0,
204 						&ea_info_size);
205 		if (!p_ea_info || ea_info_size != sizeof(struct ea_information))
206 			goto out;
207 
208 		ea_buf = ntfs_attr_readall(ni, AT_EA, NULL, 0, &all_ea_size);
209 		if (!ea_buf) {
210 			ea_info_qsize = 0;
211 			kvfree(p_ea_info);
212 			goto create_ea_info;
213 		}
214 
215 		ea_info_qsize = le32_to_cpu(p_ea_info->ea_query_length);
216 	} else {
217 create_ea_info:
218 		p_ea_info = kzalloc(sizeof(struct ea_information), GFP_NOFS);
219 		if (!p_ea_info)
220 			return -ENOMEM;
221 
222 		ea_info_qsize = 0;
223 		err = ntfs_attr_add(ni, AT_EA_INFORMATION, AT_UNNAMED, 0,
224 				(char *)p_ea_info, sizeof(struct ea_information));
225 		if (err)
226 			goto out;
227 
228 		if (ntfs_attr_exist(ni, AT_EA, AT_UNNAMED, 0)) {
229 			err = ntfs_attr_remove(ni, AT_EA, AT_UNNAMED, 0);
230 			if (err)
231 				goto out;
232 		}
233 
234 		goto alloc_new_ea;
235 	}
236 
237 	if (ea_info_qsize > all_ea_size) {
238 		err = -EIO;
239 		goto out;
240 	}
241 
242 	err = ntfs_ea_lookup(ea_buf, ea_info_qsize, name, name_len, &ea_off,
243 			&ea_size);
244 	if (ea_info_qsize && !err) {
245 		if (flags & XATTR_CREATE) {
246 			err = -EEXIST;
247 			goto out;
248 		}
249 
250 		p_ea = (struct ea_attr *)(ea_buf + ea_off);
251 
252 		if (val_size &&
253 		    le16_to_cpu(p_ea->ea_value_length) == val_size &&
254 		    !memcmp(p_ea->ea_name + p_ea->ea_name_length + 1, value,
255 			    val_size))
256 			goto out;
257 
258 		le16_add_cpu(&p_ea_info->ea_length, 0 - ea_packed_size(p_ea));
259 
260 		if (p_ea->flags & NEED_EA)
261 			le16_add_cpu(&p_ea_info->need_ea_count, -1);
262 
263 		memmove((char *)p_ea, (char *)p_ea + ea_size, ea_info_qsize - (ea_off + ea_size));
264 		ea_info_qsize -= ea_size;
265 		p_ea_info->ea_query_length = cpu_to_le32(ea_info_qsize);
266 
267 		err = ntfs_write_ea(ni, AT_EA_INFORMATION, (char *)p_ea_info, 0,
268 				sizeof(struct ea_information), false);
269 		if (err)
270 			goto out;
271 
272 		err = ntfs_write_ea(ni, AT_EA, ea_buf, 0, ea_info_qsize, true);
273 		if (err)
274 			goto out;
275 
276 		if ((flags & XATTR_REPLACE) && !val_size) {
277 			/* Remove xattr. */
278 			goto out;
279 		}
280 	} else {
281 		if (flags & XATTR_REPLACE) {
282 			err = -ENODATA;
283 			goto out;
284 		}
285 	}
286 	kvfree(ea_buf);
287 
288 alloc_new_ea:
289 	ea_buf = kzalloc(new_ea_size, GFP_NOFS);
290 	if (!ea_buf) {
291 		err = -ENOMEM;
292 		goto out;
293 	}
294 
295 	/*
296 	 * EA and REPARSE_POINT compatibility not checked any more,
297 	 * required by Windows 10, but having both may lead to
298 	 * problems with earlier versions.
299 	 */
300 	p_ea = (struct ea_attr *)ea_buf;
301 	memcpy(p_ea->ea_name, name, name_len);
302 	p_ea->ea_name_length = name_len;
303 	p_ea->ea_name[name_len] = 0;
304 	memcpy(p_ea->ea_name + name_len + 1, value, val_size);
305 	p_ea->ea_value_length = cpu_to_le16(val_size);
306 	p_ea->next_entry_offset = cpu_to_le32(new_ea_size);
307 
308 	ea_packed = le16_to_cpu(p_ea_info->ea_length) + ea_packed_size(p_ea);
309 	p_ea_info->ea_length = cpu_to_le16(ea_packed);
310 	p_ea_info->ea_query_length = cpu_to_le32(ea_info_qsize + new_ea_size);
311 
312 	if (ea_packed > 0xffff ||
313 	    ntfs_attr_size_bounds_check(ni->vol, AT_EA, new_ea_size)) {
314 		err = -EFBIG;
315 		goto out;
316 	}
317 
318 	/*
319 	 * no EA or EA_INFORMATION : add them
320 	 */
321 	if (!ntfs_attr_exist(ni, AT_EA, AT_UNNAMED, 0)) {
322 		err = ntfs_attr_add(ni, AT_EA, AT_UNNAMED, 0, (char *)p_ea,
323 				new_ea_size);
324 		if (err)
325 			goto out;
326 	} else {
327 		err = ntfs_write_ea(ni, AT_EA, (char *)p_ea, ea_info_qsize,
328 				new_ea_size, false);
329 		if (err)
330 			goto out;
331 	}
332 
333 	err = ntfs_write_ea(ni, AT_EA_INFORMATION, (char *)p_ea_info, 0,
334 			sizeof(struct ea_information), false);
335 	if (err)
336 		goto out;
337 
338 	if (packed_ea_size)
339 		*packed_ea_size = p_ea_info->ea_length;
340 	mark_mft_record_dirty(ni);
341 out:
342 	if (ea_info_qsize > 0)
343 		NInoSetHasEA(ni);
344 	else
345 		NInoClearHasEA(ni);
346 
347 	kvfree(ea_buf);
348 	kvfree(p_ea_info);
349 
350 	return err;
351 }
352 
353 /*
354  * Check for the presence of an EA "$LXDEV" (used by WSL)
355  * and return its value as a device address
356  */
357 int ntfs_ea_get_wsl_inode(struct inode *inode, dev_t *rdevp, unsigned int flags)
358 {
359 	int err;
360 	__le32 v;
361 
362 	if (!(flags & NTFS_VOL_UID)) {
363 		/* Load uid to lxuid EA */
364 		err = ntfs_get_ea(inode, "$LXUID", sizeof("$LXUID") - 1, &v,
365 				sizeof(v));
366 		if (err < 0)
367 			return err;
368 		i_uid_write(inode, le32_to_cpu(v));
369 	}
370 
371 	if (!(flags & NTFS_VOL_GID)) {
372 		/* Load gid to lxgid EA */
373 		err = ntfs_get_ea(inode, "$LXGID", sizeof("$LXGID") - 1, &v,
374 				sizeof(v));
375 		if (err < 0)
376 			return err;
377 		i_gid_write(inode, le32_to_cpu(v));
378 	}
379 
380 	/* Load mode to lxmod EA */
381 	err = ntfs_get_ea(inode, "$LXMOD", sizeof("$LXMOD") - 1, &v, sizeof(v));
382 	if (err > 0) {
383 		inode->i_mode = le32_to_cpu(v);
384 	} else {
385 		/* Everyone gets all permissions. */
386 		inode->i_mode |= 0777;
387 	}
388 
389 	/* Load mode to lxdev EA */
390 	err = ntfs_get_ea(inode, "$LXDEV", sizeof("$LXDEV") - 1, &v, sizeof(v));
391 	if (err > 0)
392 		*rdevp = le32_to_cpu(v);
393 	err = 0;
394 
395 	return err;
396 }
397 
398 int ntfs_ea_set_wsl_inode(struct inode *inode, dev_t rdev, __le16 *ea_size,
399 		unsigned int flags)
400 {
401 	__le32 v;
402 	int err;
403 
404 	if (flags & NTFS_EA_UID) {
405 		/* Store uid to lxuid EA */
406 		v = cpu_to_le32(i_uid_read(inode));
407 		err = ntfs_set_ea(inode, "$LXUID", sizeof("$LXUID") - 1, &v,
408 				sizeof(v), 0, ea_size);
409 		if (err)
410 			return err;
411 	}
412 
413 	if (flags & NTFS_EA_GID) {
414 		/* Store gid to lxgid EA */
415 		v = cpu_to_le32(i_gid_read(inode));
416 		err = ntfs_set_ea(inode, "$LXGID", sizeof("$LXGID") - 1, &v,
417 				sizeof(v), 0, ea_size);
418 		if (err)
419 			return err;
420 	}
421 
422 	if (flags & NTFS_EA_MODE) {
423 		/* Store mode to lxmod EA */
424 		v = cpu_to_le32(inode->i_mode);
425 		err = ntfs_set_ea(inode, "$LXMOD", sizeof("$LXMOD") - 1, &v,
426 				sizeof(v), 0, ea_size);
427 		if (err)
428 			return err;
429 	}
430 
431 	if (rdev) {
432 		v = cpu_to_le32(rdev);
433 		err = ntfs_set_ea(inode, "$LXDEV", sizeof("$LXDEV") - 1, &v, sizeof(v),
434 				0, ea_size);
435 	}
436 
437 	return err;
438 }
439 
440 ssize_t ntfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
441 {
442 	struct inode *inode = d_inode(dentry);
443 	struct ntfs_inode *ni = NTFS_I(inode);
444 	const struct ea_attr *p_ea;
445 	s64 offset, ea_buf_size, ea_info_size;
446 	int next, err = 0, ea_size;
447 	u32 ea_info_qsize;
448 	char *ea_buf = NULL;
449 	ssize_t ret = 0;
450 	struct ea_information *ea_info;
451 
452 	if (!NInoHasEA(ni))
453 		return 0;
454 
455 	mutex_lock(&NTFS_I(inode)->mrec_lock);
456 	ea_info = ntfs_attr_readall(ni, AT_EA_INFORMATION, NULL, 0,
457 			&ea_info_size);
458 	if (!ea_info || ea_info_size != sizeof(struct ea_information))
459 		goto out;
460 
461 	ea_info_qsize = le32_to_cpu(ea_info->ea_query_length);
462 
463 	ea_buf = ntfs_attr_readall(ni, AT_EA, NULL, 0, &ea_buf_size);
464 	if (!ea_buf)
465 		goto out;
466 
467 	if (ea_info_qsize > ea_buf_size)
468 		goto out;
469 
470 	if (ea_buf_size < sizeof(struct ea_attr))
471 		goto out;
472 
473 	offset = 0;
474 	do {
475 		p_ea = (const struct ea_attr *)&ea_buf[offset];
476 		next = le32_to_cpu(p_ea->next_entry_offset);
477 		if (next)
478 			ea_size = next;
479 		else
480 			ea_size = ALIGN(struct_size(p_ea, ea_name,
481 						1 + p_ea->ea_name_length +
482 						le16_to_cpu(p_ea->ea_value_length)),
483 					4);
484 		if (buffer) {
485 			if (offset + ea_size > ea_info_qsize)
486 				break;
487 
488 			if (ret + p_ea->ea_name_length + 1 > size) {
489 				err = -ERANGE;
490 				goto out;
491 			}
492 
493 			if (p_ea->ea_name_length + 1 > (ea_info_qsize - offset))
494 				break;
495 
496 			memcpy(buffer + ret, p_ea->ea_name, p_ea->ea_name_length);
497 			buffer[ret + p_ea->ea_name_length] = 0;
498 		}
499 
500 		ret += p_ea->ea_name_length + 1;
501 		offset += ea_size;
502 	} while (next > 0 && offset < ea_info_qsize &&
503 		 sizeof(struct ea_attr) < (ea_info_qsize - offset));
504 
505 out:
506 	mutex_unlock(&NTFS_I(inode)->mrec_lock);
507 	kvfree(ea_info);
508 	kvfree(ea_buf);
509 
510 	return err ? err : ret;
511 }
512 
513 // clang-format off
514 #define SYSTEM_DOS_ATTRIB     "system.dos_attrib"
515 #define SYSTEM_NTFS_ATTRIB    "system.ntfs_attrib"
516 #define SYSTEM_NTFS_ATTRIB_BE "system.ntfs_attrib_be"
517 // clang-format on
518 
519 static int ntfs_getxattr(const struct xattr_handler *handler,
520 		struct dentry *unused, struct inode *inode, const char *name,
521 		void *buffer, size_t size)
522 {
523 	struct ntfs_inode *ni = NTFS_I(inode);
524 	int err;
525 
526 	if (NVolShutdown(ni->vol))
527 		return -EIO;
528 
529 	if (!strcmp(name, SYSTEM_DOS_ATTRIB)) {
530 		if (!buffer) {
531 			err = sizeof(u8);
532 		} else if (size < sizeof(u8)) {
533 			err = -ENODATA;
534 		} else {
535 			err = sizeof(u8);
536 			*(u8 *)buffer = (u8)(le32_to_cpu(ni->flags) & 0x3F);
537 		}
538 		goto out;
539 	}
540 
541 	if (!strcmp(name, SYSTEM_NTFS_ATTRIB) ||
542 	    !strcmp(name, SYSTEM_NTFS_ATTRIB_BE)) {
543 		if (!buffer) {
544 			err = sizeof(u32);
545 		} else if (size < sizeof(u32)) {
546 			err = -ENODATA;
547 		} else {
548 			err = sizeof(u32);
549 			*(u32 *)buffer = le32_to_cpu(ni->flags);
550 			if (!strcmp(name, SYSTEM_NTFS_ATTRIB_BE))
551 				*(__be32 *)buffer = cpu_to_be32(*(u32 *)buffer);
552 		}
553 		goto out;
554 	}
555 
556 	mutex_lock(&ni->mrec_lock);
557 	err = ntfs_get_ea(inode, name, strlen(name), buffer, size);
558 	mutex_unlock(&ni->mrec_lock);
559 
560 out:
561 	return err;
562 }
563 
564 static int ntfs_new_attr_flags(struct ntfs_inode *ni, __le32 fattr)
565 {
566 	struct ntfs_attr_search_ctx *ctx;
567 	struct mft_record *m;
568 	struct attr_record *a;
569 	__le16 new_aflags;
570 	int mp_size, mp_ofs, name_ofs, arec_size, err;
571 
572 	m = map_mft_record(ni);
573 	if (IS_ERR(m))
574 		return PTR_ERR(m);
575 
576 	ctx = ntfs_attr_get_search_ctx(ni, m);
577 	if (!ctx) {
578 		err = -ENOMEM;
579 		goto err_out;
580 	}
581 
582 	err = ntfs_attr_lookup(ni->type, ni->name, ni->name_len,
583 			CASE_SENSITIVE, 0, NULL, 0, ctx);
584 	if (err) {
585 		err = -EINVAL;
586 		goto err_out;
587 	}
588 
589 	a = ctx->attr;
590 	new_aflags = ctx->attr->flags;
591 
592 	if (fattr & FILE_ATTR_SPARSE_FILE)
593 		new_aflags |= ATTR_IS_SPARSE;
594 	else
595 		new_aflags &= ~ATTR_IS_SPARSE;
596 
597 	if (fattr & FILE_ATTR_COMPRESSED)
598 		new_aflags |= ATTR_IS_COMPRESSED;
599 	else
600 		new_aflags &= ~ATTR_IS_COMPRESSED;
601 
602 	if (new_aflags == a->flags)
603 		return 0;
604 
605 	if ((new_aflags & (ATTR_IS_SPARSE | ATTR_IS_COMPRESSED)) ==
606 			  (ATTR_IS_SPARSE | ATTR_IS_COMPRESSED)) {
607 		pr_err("file can't be sparsed and compressed\n");
608 		err = -EOPNOTSUPP;
609 		goto err_out;
610 	}
611 
612 	if (!a->non_resident)
613 		goto out;
614 
615 	if (a->data.non_resident.data_size) {
616 		pr_err("Can't change sparsed/compressed for non-empty file\n");
617 		err = -EOPNOTSUPP;
618 		goto err_out;
619 	}
620 
621 	if (new_aflags & (ATTR_IS_SPARSE | ATTR_IS_COMPRESSED))
622 		name_ofs = (offsetof(struct attr_record,
623 				     data.non_resident.compressed_size) +
624 					sizeof(a->data.non_resident.compressed_size) + 7) & ~7;
625 	else
626 		name_ofs = (offsetof(struct attr_record,
627 				     data.non_resident.compressed_size) + 7) & ~7;
628 
629 	mp_size = ntfs_get_size_for_mapping_pairs(ni->vol, ni->runlist.rl, 0, -1, -1);
630 	if (unlikely(mp_size < 0)) {
631 		err = mp_size;
632 		ntfs_debug("Failed to get size for mapping pairs array, error code %i.\n", err);
633 		goto err_out;
634 	}
635 
636 	mp_ofs = (name_ofs + a->name_length * sizeof(__le16) + 7) & ~7;
637 	arec_size = (mp_ofs + mp_size + 7) & ~7;
638 
639 	err = ntfs_attr_record_resize(m, a, arec_size);
640 	if (unlikely(err))
641 		goto err_out;
642 
643 	if (new_aflags & (ATTR_IS_SPARSE | ATTR_IS_COMPRESSED)) {
644 		a->data.non_resident.compression_unit = 0;
645 		if (new_aflags & ATTR_IS_COMPRESSED || ni->vol->major_ver < 3)
646 			a->data.non_resident.compression_unit = 4;
647 		a->data.non_resident.compressed_size = 0;
648 		ni->itype.compressed.size = 0;
649 		if (a->data.non_resident.compression_unit) {
650 			ni->itype.compressed.block_size = 1U <<
651 				(a->data.non_resident.compression_unit +
652 				 ni->vol->cluster_size_bits);
653 			ni->itype.compressed.block_size_bits =
654 					ffs(ni->itype.compressed.block_size) -
655 					1;
656 			ni->itype.compressed.block_clusters = 1U <<
657 					a->data.non_resident.compression_unit;
658 		} else {
659 			ni->itype.compressed.block_size = 0;
660 			ni->itype.compressed.block_size_bits = 0;
661 			ni->itype.compressed.block_clusters = 0;
662 		}
663 
664 		if (new_aflags & ATTR_IS_SPARSE) {
665 			NInoSetSparse(ni);
666 			ni->flags |= FILE_ATTR_SPARSE_FILE;
667 		}
668 
669 		if (new_aflags & ATTR_IS_COMPRESSED) {
670 			NInoSetCompressed(ni);
671 			ni->flags |= FILE_ATTR_COMPRESSED;
672 		}
673 	} else {
674 		ni->flags &= ~(FILE_ATTR_SPARSE_FILE | FILE_ATTR_COMPRESSED);
675 		a->data.non_resident.compression_unit = 0;
676 		NInoClearSparse(ni);
677 		NInoClearCompressed(ni);
678 	}
679 
680 	a->name_offset = cpu_to_le16(name_ofs);
681 	a->data.non_resident.mapping_pairs_offset = cpu_to_le16(mp_ofs);
682 
683 out:
684 	a->flags = new_aflags;
685 	mark_mft_record_dirty(ctx->ntfs_ino);
686 err_out:
687 	if (ctx)
688 		ntfs_attr_put_search_ctx(ctx);
689 	unmap_mft_record(ni);
690 	return err;
691 }
692 
693 static int ntfs_setxattr(const struct xattr_handler *handler,
694 		struct mnt_idmap *idmap, struct dentry *unused,
695 		struct inode *inode, const char *name, const void *value,
696 		size_t size, int flags)
697 {
698 	struct ntfs_inode *ni = NTFS_I(inode);
699 	int err;
700 	__le32 fattr;
701 
702 	if (NVolShutdown(ni->vol))
703 		return -EIO;
704 
705 	if (!strcmp(name, SYSTEM_DOS_ATTRIB)) {
706 		if (sizeof(u8) != size) {
707 			err = -EINVAL;
708 			goto out;
709 		}
710 		fattr = cpu_to_le32(*(u8 *)value);
711 		goto set_fattr;
712 	}
713 
714 	if (!strcmp(name, SYSTEM_NTFS_ATTRIB) ||
715 	    !strcmp(name, SYSTEM_NTFS_ATTRIB_BE)) {
716 		if (size != sizeof(u32)) {
717 			err = -EINVAL;
718 			goto out;
719 		}
720 		if (!strcmp(name, SYSTEM_NTFS_ATTRIB_BE))
721 			fattr = cpu_to_le32(be32_to_cpu(*(__be32 *)value));
722 		else
723 			fattr = cpu_to_le32(*(u32 *)value);
724 
725 		if (S_ISREG(inode->i_mode)) {
726 			mutex_lock(&ni->mrec_lock);
727 			err = ntfs_new_attr_flags(ni, fattr);
728 			mutex_unlock(&ni->mrec_lock);
729 			if (err)
730 				goto out;
731 		}
732 
733 set_fattr:
734 		if (S_ISDIR(inode->i_mode))
735 			fattr |= FILE_ATTR_DIRECTORY;
736 		else
737 			fattr &= ~FILE_ATTR_DIRECTORY;
738 
739 		if (ni->flags != fattr) {
740 			ni->flags = fattr;
741 			if (fattr & FILE_ATTR_READONLY)
742 				inode->i_mode &= ~0222;
743 			else
744 				inode->i_mode |= 0222;
745 			NInoSetFileNameDirty(ni);
746 			mark_inode_dirty(inode);
747 		}
748 		err = 0;
749 		goto out;
750 	}
751 
752 	mutex_lock(&ni->mrec_lock);
753 	err = ntfs_set_ea(inode, name, strlen(name), value, size, flags, NULL);
754 	mutex_unlock(&ni->mrec_lock);
755 
756 out:
757 	inode_set_ctime_current(inode);
758 	mark_inode_dirty(inode);
759 	return err;
760 }
761 
762 static bool ntfs_xattr_user_list(struct dentry *dentry)
763 {
764 	return true;
765 }
766 
767 // clang-format off
768 static const struct xattr_handler ntfs_other_xattr_handler = {
769 	.prefix	= "",
770 	.get	= ntfs_getxattr,
771 	.set	= ntfs_setxattr,
772 	.list	= ntfs_xattr_user_list,
773 };
774 
775 const struct xattr_handler * const ntfs_xattr_handlers[] = {
776 	&ntfs_other_xattr_handler,
777 	NULL,
778 };
779 // clang-format on
780 
781 #ifdef CONFIG_NTFS_FS_POSIX_ACL
782 struct posix_acl *ntfs_get_acl(struct mnt_idmap *idmap, struct dentry *dentry,
783 			       int type)
784 {
785 	struct inode *inode = d_inode(dentry);
786 	struct ntfs_inode *ni = NTFS_I(inode);
787 	const char *name;
788 	size_t name_len;
789 	struct posix_acl *acl;
790 	int err;
791 	void *buf;
792 
793 	buf = kmalloc(PATH_MAX, GFP_KERNEL);
794 	if (!buf)
795 		return ERR_PTR(-ENOMEM);
796 
797 	/* Possible values of 'type' was already checked above. */
798 	if (type == ACL_TYPE_ACCESS) {
799 		name = XATTR_NAME_POSIX_ACL_ACCESS;
800 		name_len = sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1;
801 	} else {
802 		name = XATTR_NAME_POSIX_ACL_DEFAULT;
803 		name_len = sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) - 1;
804 	}
805 
806 	mutex_lock(&ni->mrec_lock);
807 	err = ntfs_get_ea(inode, name, name_len, buf, PATH_MAX);
808 	mutex_unlock(&ni->mrec_lock);
809 
810 	/* Translate extended attribute to acl. */
811 	if (err >= 0)
812 		acl = posix_acl_from_xattr(&init_user_ns, buf, err);
813 	else if (err == -ENODATA)
814 		acl = NULL;
815 	else
816 		acl = ERR_PTR(err);
817 
818 	if (!IS_ERR(acl))
819 		set_cached_acl(inode, type, acl);
820 
821 	kfree(buf);
822 
823 	return acl;
824 }
825 
826 static noinline int ntfs_set_acl_ex(struct mnt_idmap *idmap,
827 				    struct inode *inode, struct posix_acl *acl,
828 				    int type, bool init_acl)
829 {
830 	const char *name;
831 	size_t size, name_len;
832 	void *value;
833 	int err;
834 	int flags;
835 	umode_t mode;
836 
837 	if (S_ISLNK(inode->i_mode))
838 		return -EOPNOTSUPP;
839 
840 	mode = inode->i_mode;
841 	switch (type) {
842 	case ACL_TYPE_ACCESS:
843 		/* Do not change i_mode if we are in init_acl */
844 		if (acl && !init_acl) {
845 			err = posix_acl_update_mode(idmap, inode, &mode, &acl);
846 			if (err)
847 				return err;
848 		}
849 		name = XATTR_NAME_POSIX_ACL_ACCESS;
850 		name_len = sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1;
851 		break;
852 
853 	case ACL_TYPE_DEFAULT:
854 		if (!S_ISDIR(inode->i_mode))
855 			return acl ? -EACCES : 0;
856 		name = XATTR_NAME_POSIX_ACL_DEFAULT;
857 		name_len = sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) - 1;
858 		break;
859 
860 	default:
861 		return -EINVAL;
862 	}
863 
864 	if (!acl) {
865 		/* Remove xattr if it can be presented via mode. */
866 		size = 0;
867 		value = NULL;
868 		flags = XATTR_REPLACE;
869 	} else {
870 		value = posix_acl_to_xattr(&init_user_ns, acl, &size, GFP_NOFS);
871 		if (!value)
872 			return -ENOMEM;
873 		flags = 0;
874 	}
875 
876 	mutex_lock(&NTFS_I(inode)->mrec_lock);
877 	err = ntfs_set_ea(inode, name, name_len, value, size, flags, NULL);
878 	mutex_unlock(&NTFS_I(inode)->mrec_lock);
879 	if (err == -ENODATA && !size)
880 		err = 0; /* Removing non existed xattr. */
881 	if (!err) {
882 		__le16 ea_size = 0;
883 		umode_t old_mode = inode->i_mode;
884 
885 		inode->i_mode = mode;
886 		mutex_lock(&NTFS_I(inode)->mrec_lock);
887 		err = ntfs_ea_set_wsl_inode(inode, 0, &ea_size, NTFS_EA_MODE);
888 		if (err) {
889 			ntfs_set_ea(inode, name, name_len, NULL, 0,
890 				    XATTR_REPLACE, NULL);
891 			mutex_unlock(&NTFS_I(inode)->mrec_lock);
892 			inode->i_mode = old_mode;
893 			goto out;
894 		}
895 		mutex_unlock(&NTFS_I(inode)->mrec_lock);
896 
897 		set_cached_acl(inode, type, acl);
898 		inode_set_ctime_current(inode);
899 		mark_inode_dirty(inode);
900 	}
901 
902 out:
903 	kfree(value);
904 
905 	return err;
906 }
907 
908 int ntfs_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
909 		 struct posix_acl *acl, int type)
910 {
911 	return ntfs_set_acl_ex(idmap, d_inode(dentry), acl, type, false);
912 }
913 
914 int ntfs_init_acl(struct mnt_idmap *idmap, struct inode *inode,
915 		  struct inode *dir)
916 {
917 	struct posix_acl *default_acl, *acl;
918 	int err;
919 
920 	err = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl);
921 	if (err)
922 		return err;
923 
924 	if (default_acl) {
925 		err = ntfs_set_acl_ex(idmap, inode, default_acl,
926 				      ACL_TYPE_DEFAULT, true);
927 		posix_acl_release(default_acl);
928 	} else {
929 		inode->i_default_acl = NULL;
930 	}
931 
932 	if (acl) {
933 		if (!err)
934 			err = ntfs_set_acl_ex(idmap, inode, acl,
935 					      ACL_TYPE_ACCESS, true);
936 		posix_acl_release(acl);
937 	} else {
938 		inode->i_acl = NULL;
939 	}
940 
941 	return err;
942 }
943 #endif
944