1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (C) 2019-2021 Paragon Software GmbH, All rights reserved.
16 * fill_name_de - Format NTFS_DE in @buf.
18 int fill_name_de(struct ntfs_sb_info
*sbi
, void *buf
, const struct qstr
*name
,
19 const struct cpu_str
*uni
)
22 struct NTFS_DE
*e
= buf
;
24 struct ATTR_FILE_NAME
*fname
= (struct ATTR_FILE_NAME
*)(e
+ 1);
26 #ifndef CONFIG_NTFS3_64BIT_CLUSTER
27 e
->ref
.high
= fname
->home
.high
= 0;
32 __le16
*uname
= fname
->name
;
33 const u16
*name_cpu
= uni
->name
;
36 *uname
++ = cpu_to_le16(*name_cpu
++);
38 memcpy(fname
->name
, uni
->name
, uni
->len
* sizeof(u16
));
40 fname
->name_len
= uni
->len
;
43 /* Convert input string to unicode. */
44 err
= ntfs_nls_to_utf16(sbi
, name
->name
, name
->len
,
45 (struct cpu_str
*)&fname
->name_len
,
46 NTFS_NAME_LEN
, UTF16_LITTLE_ENDIAN
);
51 fname
->type
= FILE_NAME_POSIX
;
52 data_size
= fname_full_size(fname
);
54 e
->size
= cpu_to_le16(ALIGN(data_size
, 8) + sizeof(struct NTFS_DE
));
55 e
->key_size
= cpu_to_le16(data_size
);
63 * ntfs_lookup - inode_operations::lookup
65 static struct dentry
*ntfs_lookup(struct inode
*dir
, struct dentry
*dentry
,
68 struct ntfs_inode
*ni
= ntfs_i(dir
);
69 struct cpu_str
*uni
= __getname();
74 inode
= ERR_PTR(-ENOMEM
);
76 err
= ntfs_nls_to_utf16(ni
->mi
.sbi
, dentry
->d_name
.name
,
77 dentry
->d_name
.len
, uni
, NTFS_NAME_LEN
,
83 inode
= dir_search_u(dir
, uni
, NULL
);
89 return d_splice_alias(inode
, dentry
);
93 * ntfs_create - inode_operations::create
95 static int ntfs_create(struct user_namespace
*mnt_userns
, struct inode
*dir
,
96 struct dentry
*dentry
, umode_t mode
, bool excl
)
100 inode
= ntfs_create_inode(mnt_userns
, dir
, dentry
, NULL
, S_IFREG
| mode
,
103 return IS_ERR(inode
) ? PTR_ERR(inode
) : 0;
109 * inode_operations::mknod
111 static int ntfs_mknod(struct user_namespace
*mnt_userns
, struct inode
*dir
,
112 struct dentry
*dentry
, umode_t mode
, dev_t rdev
)
116 inode
= ntfs_create_inode(mnt_userns
, dir
, dentry
, NULL
, mode
, rdev
,
119 return IS_ERR(inode
) ? PTR_ERR(inode
) : 0;
123 * ntfs_link - inode_operations::link
125 static int ntfs_link(struct dentry
*ode
, struct inode
*dir
, struct dentry
*de
)
128 struct inode
*inode
= d_inode(ode
);
129 struct ntfs_inode
*ni
= ntfs_i(inode
);
131 if (S_ISDIR(inode
->i_mode
))
134 if (inode
->i_nlink
>= NTFS_LINK_MAX
)
137 ni_lock_dir(ntfs_i(dir
));
144 err
= ntfs_link_inode(inode
, de
);
147 dir
->i_ctime
= dir
->i_mtime
= inode
->i_ctime
=
149 mark_inode_dirty(inode
);
150 mark_inode_dirty(dir
);
151 d_instantiate(de
, inode
);
159 ni_unlock(ntfs_i(dir
));
165 * ntfs_unlink - inode_operations::unlink
167 static int ntfs_unlink(struct inode
*dir
, struct dentry
*dentry
)
169 struct ntfs_inode
*ni
= ntfs_i(dir
);
174 err
= ntfs_unlink_inode(dir
, dentry
);
182 * ntfs_symlink - inode_operations::symlink
184 static int ntfs_symlink(struct user_namespace
*mnt_userns
, struct inode
*dir
,
185 struct dentry
*dentry
, const char *symname
)
187 u32 size
= strlen(symname
);
190 inode
= ntfs_create_inode(mnt_userns
, dir
, dentry
, NULL
, S_IFLNK
| 0777,
191 0, symname
, size
, NULL
);
193 return IS_ERR(inode
) ? PTR_ERR(inode
) : 0;
197 * ntfs_mkdir- inode_operations::mkdir
199 static int ntfs_mkdir(struct user_namespace
*mnt_userns
, struct inode
*dir
,
200 struct dentry
*dentry
, umode_t mode
)
204 inode
= ntfs_create_inode(mnt_userns
, dir
, dentry
, NULL
, S_IFDIR
| mode
,
207 return IS_ERR(inode
) ? PTR_ERR(inode
) : 0;
211 * ntfs_rmdir - inode_operations::rmdir
213 static int ntfs_rmdir(struct inode
*dir
, struct dentry
*dentry
)
215 struct ntfs_inode
*ni
= ntfs_i(dir
);
220 err
= ntfs_unlink_inode(dir
, dentry
);
228 * ntfs_rename - inode_operations::rename
230 static int ntfs_rename(struct user_namespace
*mnt_userns
, struct inode
*dir
,
231 struct dentry
*dentry
, struct inode
*new_dir
,
232 struct dentry
*new_dentry
, u32 flags
)
235 struct super_block
*sb
= dir
->i_sb
;
236 struct ntfs_sb_info
*sbi
= sb
->s_fs_info
;
237 struct ntfs_inode
*dir_ni
= ntfs_i(dir
);
238 struct ntfs_inode
*new_dir_ni
= ntfs_i(new_dir
);
239 struct inode
*inode
= d_inode(dentry
);
240 struct ntfs_inode
*ni
= ntfs_i(inode
);
241 struct inode
*new_inode
= d_inode(new_dentry
);
242 struct NTFS_DE
*de
, *new_de
;
243 bool is_same
, is_bad
;
245 * de - memory of PATH_MAX bytes:
246 * [0-1024) - original name (dentry->d_name)
247 * [1024-2048) - paired to original name, usually DOS variant of dentry->d_name
248 * [2048-3072) - new name (new_dentry->d_name)
250 static_assert(SIZEOF_ATTRIBUTE_FILENAME_MAX
+ SIZEOF_RESIDENT
< 1024);
251 static_assert(SIZEOF_ATTRIBUTE_FILENAME_MAX
+ sizeof(struct NTFS_DE
) <
253 static_assert(PATH_MAX
>= 4 * 1024);
255 if (flags
& ~RENAME_NOREPLACE
)
258 is_same
= dentry
->d_name
.len
== new_dentry
->d_name
.len
&&
259 !memcmp(dentry
->d_name
.name
, new_dentry
->d_name
.name
,
262 if (is_same
&& dir
== new_dir
) {
267 if (ntfs_is_meta_file(sbi
, inode
->i_ino
)) {
268 /* Should we print an error? */
273 /* Target name exists. Unlink it. */
275 ni_lock_dir(new_dir_ni
);
276 err
= ntfs_unlink_inode(new_dir
, new_dentry
);
277 ni_unlock(new_dir_ni
);
283 /* Allocate PATH_MAX bytes. */
288 /* Translate dentry->d_name into unicode form. */
289 err
= fill_name_de(sbi
, de
, &dentry
->d_name
, NULL
);
297 /* Translate new_dentry->d_name into unicode form. */
298 new_de
= Add2Ptr(de
, 2048);
299 err
= fill_name_de(sbi
, new_de
, &new_dentry
->d_name
, NULL
);
308 err
= ni_rename(dir_ni
, new_dir_ni
, ni
, de
, new_de
, &is_bad
);
310 /* Restore after failed rename failed too. */
311 _ntfs_bad_inode(inode
);
313 inode
->i_ctime
= dir
->i_ctime
= dir
->i_mtime
=
315 mark_inode_dirty(inode
);
316 mark_inode_dirty(dir
);
317 if (dir
!= new_dir
) {
318 new_dir
->i_mtime
= new_dir
->i_ctime
= dir
->i_ctime
;
319 mark_inode_dirty(new_dir
);
323 ntfs_sync_inode(dir
);
325 if (IS_DIRSYNC(new_dir
))
326 ntfs_sync_inode(inode
);
336 struct dentry
*ntfs3_get_parent(struct dentry
*child
)
338 struct inode
*inode
= d_inode(child
);
339 struct ntfs_inode
*ni
= ntfs_i(inode
);
341 struct ATTR_LIST_ENTRY
*le
= NULL
;
342 struct ATTRIB
*attr
= NULL
;
343 struct ATTR_FILE_NAME
*fname
;
345 while ((attr
= ni_find_attr(ni
, attr
, &le
, ATTR_NAME
, NULL
, 0, NULL
,
347 fname
= resident_data_ex(attr
, SIZEOF_ATTRIBUTE_FILENAME
);
351 return d_obtain_alias(
352 ntfs_iget5(inode
->i_sb
, &fname
->home
, NULL
));
355 return ERR_PTR(-ENOENT
);
359 const struct inode_operations ntfs_dir_inode_operations
= {
360 .lookup
= ntfs_lookup
,
361 .create
= ntfs_create
,
363 .unlink
= ntfs_unlink
,
364 .symlink
= ntfs_symlink
,
368 .rename
= ntfs_rename
,
369 .permission
= ntfs_permission
,
370 .get_inode_acl
= ntfs_get_acl
,
371 .set_acl
= ntfs_set_acl
,
372 .setattr
= ntfs3_setattr
,
373 .getattr
= ntfs_getattr
,
374 .listxattr
= ntfs_listxattr
,
375 .fiemap
= ntfs_fiemap
,
378 const struct inode_operations ntfs_special_inode_operations
= {
379 .setattr
= ntfs3_setattr
,
380 .getattr
= ntfs_getattr
,
381 .listxattr
= ntfs_listxattr
,
382 .get_inode_acl
= ntfs_get_acl
,
383 .set_acl
= ntfs_set_acl
,