Merge tag 'acpi-5.15-rc1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / fs / ksmbd / vfs.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
4  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
5  */
6
7 #include <linux/kernel.h>
8 #include <linux/fs.h>
9 #include <linux/uaccess.h>
10 #include <linux/backing-dev.h>
11 #include <linux/writeback.h>
12 #include <linux/xattr.h>
13 #include <linux/falloc.h>
14 #include <linux/genhd.h>
15 #include <linux/fsnotify.h>
16 #include <linux/dcache.h>
17 #include <linux/slab.h>
18 #include <linux/vmalloc.h>
19 #include <linux/sched/xacct.h>
20 #include <linux/crc32c.h>
21
22 #include "glob.h"
23 #include "oplock.h"
24 #include "connection.h"
25 #include "vfs.h"
26 #include "vfs_cache.h"
27 #include "smbacl.h"
28 #include "ndr.h"
29 #include "auth.h"
30 #include "misc.h"
31
32 #include "smb_common.h"
33 #include "mgmt/share_config.h"
34 #include "mgmt/tree_connect.h"
35 #include "mgmt/user_session.h"
36 #include "mgmt/user_config.h"
37
38 static char *extract_last_component(char *path)
39 {
40         char *p = strrchr(path, '/');
41
42         if (p && p[1] != '\0') {
43                 *p = '\0';
44                 p++;
45         } else {
46                 p = NULL;
47                 pr_err("Invalid path %s\n", path);
48         }
49         return p;
50 }
51
52 static void ksmbd_vfs_inherit_owner(struct ksmbd_work *work,
53                                     struct inode *parent_inode,
54                                     struct inode *inode)
55 {
56         if (!test_share_config_flag(work->tcon->share_conf,
57                                     KSMBD_SHARE_FLAG_INHERIT_OWNER))
58                 return;
59
60         i_uid_write(inode, i_uid_read(parent_inode));
61 }
62
63 /**
64  * ksmbd_vfs_lock_parent() - lock parent dentry if it is stable
65  *
66  * the parent dentry got by dget_parent or @parent could be
67  * unstable, we try to lock a parent inode and lookup the
68  * child dentry again.
69  *
70  * the reference count of @parent isn't incremented.
71  */
72 int ksmbd_vfs_lock_parent(struct user_namespace *user_ns, struct dentry *parent,
73                           struct dentry *child)
74 {
75         struct dentry *dentry;
76         int ret = 0;
77
78         inode_lock_nested(d_inode(parent), I_MUTEX_PARENT);
79         dentry = lookup_one(user_ns, child->d_name.name, parent,
80                             child->d_name.len);
81         if (IS_ERR(dentry)) {
82                 ret = PTR_ERR(dentry);
83                 goto out_err;
84         }
85
86         if (dentry != child) {
87                 ret = -ESTALE;
88                 dput(dentry);
89                 goto out_err;
90         }
91
92         dput(dentry);
93         return 0;
94 out_err:
95         inode_unlock(d_inode(parent));
96         return ret;
97 }
98
99 int ksmbd_vfs_may_delete(struct user_namespace *user_ns,
100                          struct dentry *dentry)
101 {
102         struct dentry *parent;
103         int ret;
104
105         parent = dget_parent(dentry);
106         ret = ksmbd_vfs_lock_parent(user_ns, parent, dentry);
107         if (ret) {
108                 dput(parent);
109                 return ret;
110         }
111
112         ret = inode_permission(user_ns, d_inode(parent),
113                                MAY_EXEC | MAY_WRITE);
114
115         inode_unlock(d_inode(parent));
116         dput(parent);
117         return ret;
118 }
119
120 int ksmbd_vfs_query_maximal_access(struct user_namespace *user_ns,
121                                    struct dentry *dentry, __le32 *daccess)
122 {
123         struct dentry *parent;
124         int ret = 0;
125
126         *daccess = cpu_to_le32(FILE_READ_ATTRIBUTES | READ_CONTROL);
127
128         if (!inode_permission(user_ns, d_inode(dentry), MAY_OPEN | MAY_WRITE))
129                 *daccess |= cpu_to_le32(WRITE_DAC | WRITE_OWNER | SYNCHRONIZE |
130                                 FILE_WRITE_DATA | FILE_APPEND_DATA |
131                                 FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES |
132                                 FILE_DELETE_CHILD);
133
134         if (!inode_permission(user_ns, d_inode(dentry), MAY_OPEN | MAY_READ))
135                 *daccess |= FILE_READ_DATA_LE | FILE_READ_EA_LE;
136
137         if (!inode_permission(user_ns, d_inode(dentry), MAY_OPEN | MAY_EXEC))
138                 *daccess |= FILE_EXECUTE_LE;
139
140         parent = dget_parent(dentry);
141         ret = ksmbd_vfs_lock_parent(user_ns, parent, dentry);
142         if (ret) {
143                 dput(parent);
144                 return ret;
145         }
146
147         if (!inode_permission(user_ns, d_inode(parent), MAY_EXEC | MAY_WRITE))
148                 *daccess |= FILE_DELETE_LE;
149
150         inode_unlock(d_inode(parent));
151         dput(parent);
152         return ret;
153 }
154
155 /**
156  * ksmbd_vfs_create() - vfs helper for smb create file
157  * @work:       work
158  * @name:       file name
159  * @mode:       file create mode
160  *
161  * Return:      0 on success, otherwise error
162  */
163 int ksmbd_vfs_create(struct ksmbd_work *work, const char *name, umode_t mode)
164 {
165         struct path path;
166         struct dentry *dentry;
167         int err;
168
169         dentry = kern_path_create(AT_FDCWD, name, &path, 0);
170         if (IS_ERR(dentry)) {
171                 err = PTR_ERR(dentry);
172                 if (err != -ENOENT)
173                         pr_err("path create failed for %s, err %d\n",
174                                name, err);
175                 return err;
176         }
177
178         mode |= S_IFREG;
179         err = vfs_create(mnt_user_ns(path.mnt), d_inode(path.dentry),
180                          dentry, mode, true);
181         if (!err) {
182                 ksmbd_vfs_inherit_owner(work, d_inode(path.dentry),
183                                         d_inode(dentry));
184         } else {
185                 pr_err("File(%s): creation failed (err:%d)\n", name, err);
186         }
187         done_path_create(&path, dentry);
188         return err;
189 }
190
191 /**
192  * ksmbd_vfs_mkdir() - vfs helper for smb create directory
193  * @work:       work
194  * @name:       directory name
195  * @mode:       directory create mode
196  *
197  * Return:      0 on success, otherwise error
198  */
199 int ksmbd_vfs_mkdir(struct ksmbd_work *work, const char *name, umode_t mode)
200 {
201         struct user_namespace *user_ns;
202         struct path path;
203         struct dentry *dentry;
204         int err;
205
206         dentry = kern_path_create(AT_FDCWD, name, &path, LOOKUP_DIRECTORY);
207         if (IS_ERR(dentry)) {
208                 err = PTR_ERR(dentry);
209                 if (err != -EEXIST)
210                         ksmbd_debug(VFS, "path create failed for %s, err %d\n",
211                                     name, err);
212                 return err;
213         }
214
215         user_ns = mnt_user_ns(path.mnt);
216         mode |= S_IFDIR;
217         err = vfs_mkdir(user_ns, d_inode(path.dentry), dentry, mode);
218         if (err) {
219                 goto out;
220         } else if (d_unhashed(dentry)) {
221                 struct dentry *d;
222
223                 d = lookup_one(user_ns, dentry->d_name.name, dentry->d_parent,
224                                dentry->d_name.len);
225                 if (IS_ERR(d)) {
226                         err = PTR_ERR(d);
227                         goto out;
228                 }
229                 if (unlikely(d_is_negative(d))) {
230                         dput(d);
231                         err = -ENOENT;
232                         goto out;
233                 }
234
235                 ksmbd_vfs_inherit_owner(work, d_inode(path.dentry), d_inode(d));
236                 dput(d);
237         }
238 out:
239         done_path_create(&path, dentry);
240         if (err)
241                 pr_err("mkdir(%s): creation failed (err:%d)\n", name, err);
242         return err;
243 }
244
245 static ssize_t ksmbd_vfs_getcasexattr(struct user_namespace *user_ns,
246                                       struct dentry *dentry, char *attr_name,
247                                       int attr_name_len, char **attr_value)
248 {
249         char *name, *xattr_list = NULL;
250         ssize_t value_len = -ENOENT, xattr_list_len;
251
252         xattr_list_len = ksmbd_vfs_listxattr(dentry, &xattr_list);
253         if (xattr_list_len <= 0)
254                 goto out;
255
256         for (name = xattr_list; name - xattr_list < xattr_list_len;
257                         name += strlen(name) + 1) {
258                 ksmbd_debug(VFS, "%s, len %zd\n", name, strlen(name));
259                 if (strncasecmp(attr_name, name, attr_name_len))
260                         continue;
261
262                 value_len = ksmbd_vfs_getxattr(user_ns,
263                                                dentry,
264                                                name,
265                                                attr_value);
266                 if (value_len < 0)
267                         pr_err("failed to get xattr in file\n");
268                 break;
269         }
270
271 out:
272         kvfree(xattr_list);
273         return value_len;
274 }
275
276 static int ksmbd_vfs_stream_read(struct ksmbd_file *fp, char *buf, loff_t *pos,
277                                  size_t count)
278 {
279         ssize_t v_len;
280         char *stream_buf = NULL;
281
282         ksmbd_debug(VFS, "read stream data pos : %llu, count : %zd\n",
283                     *pos, count);
284
285         v_len = ksmbd_vfs_getcasexattr(file_mnt_user_ns(fp->filp),
286                                        fp->filp->f_path.dentry,
287                                        fp->stream.name,
288                                        fp->stream.size,
289                                        &stream_buf);
290         if ((int)v_len <= 0)
291                 return (int)v_len;
292
293         if (v_len <= *pos) {
294                 count = -EINVAL;
295                 goto free_buf;
296         }
297
298         if (v_len - *pos < count)
299                 count = v_len - *pos;
300
301         memcpy(buf, &stream_buf[*pos], count);
302
303 free_buf:
304         kvfree(stream_buf);
305         return count;
306 }
307
308 /**
309  * check_lock_range() - vfs helper for smb byte range file locking
310  * @filp:       the file to apply the lock to
311  * @start:      lock start byte offset
312  * @end:        lock end byte offset
313  * @type:       byte range type read/write
314  *
315  * Return:      0 on success, otherwise error
316  */
317 static int check_lock_range(struct file *filp, loff_t start, loff_t end,
318                             unsigned char type)
319 {
320         struct file_lock *flock;
321         struct file_lock_context *ctx = file_inode(filp)->i_flctx;
322         int error = 0;
323
324         if (!ctx || list_empty_careful(&ctx->flc_posix))
325                 return 0;
326
327         spin_lock(&ctx->flc_lock);
328         list_for_each_entry(flock, &ctx->flc_posix, fl_list) {
329                 /* check conflict locks */
330                 if (flock->fl_end >= start && end >= flock->fl_start) {
331                         if (flock->fl_type == F_RDLCK) {
332                                 if (type == WRITE) {
333                                         pr_err("not allow write by shared lock\n");
334                                         error = 1;
335                                         goto out;
336                                 }
337                         } else if (flock->fl_type == F_WRLCK) {
338                                 /* check owner in lock */
339                                 if (flock->fl_file != filp) {
340                                         error = 1;
341                                         pr_err("not allow rw access by exclusive lock from other opens\n");
342                                         goto out;
343                                 }
344                         }
345                 }
346         }
347 out:
348         spin_unlock(&ctx->flc_lock);
349         return error;
350 }
351
352 /**
353  * ksmbd_vfs_read() - vfs helper for smb file read
354  * @work:       smb work
355  * @fid:        file id of open file
356  * @count:      read byte count
357  * @pos:        file pos
358  *
359  * Return:      number of read bytes on success, otherwise error
360  */
361 int ksmbd_vfs_read(struct ksmbd_work *work, struct ksmbd_file *fp, size_t count,
362                    loff_t *pos)
363 {
364         struct file *filp = fp->filp;
365         ssize_t nbytes = 0;
366         char *rbuf = work->aux_payload_buf;
367         struct inode *inode = file_inode(filp);
368
369         if (S_ISDIR(inode->i_mode))
370                 return -EISDIR;
371
372         if (unlikely(count == 0))
373                 return 0;
374
375         if (work->conn->connection_type) {
376                 if (!(fp->daccess & (FILE_READ_DATA_LE | FILE_EXECUTE_LE))) {
377                         pr_err("no right to read(%pd)\n",
378                                fp->filp->f_path.dentry);
379                         return -EACCES;
380                 }
381         }
382
383         if (ksmbd_stream_fd(fp))
384                 return ksmbd_vfs_stream_read(fp, rbuf, pos, count);
385
386         if (!work->tcon->posix_extensions) {
387                 int ret;
388
389                 ret = check_lock_range(filp, *pos, *pos + count - 1, READ);
390                 if (ret) {
391                         pr_err("unable to read due to lock\n");
392                         return -EAGAIN;
393                 }
394         }
395
396         nbytes = kernel_read(filp, rbuf, count, pos);
397         if (nbytes < 0) {
398                 pr_err("smb read failed for (%s), err = %zd\n",
399                        fp->filename, nbytes);
400                 return nbytes;
401         }
402
403         filp->f_pos = *pos;
404         return nbytes;
405 }
406
407 static int ksmbd_vfs_stream_write(struct ksmbd_file *fp, char *buf, loff_t *pos,
408                                   size_t count)
409 {
410         char *stream_buf = NULL, *wbuf;
411         struct user_namespace *user_ns = file_mnt_user_ns(fp->filp);
412         size_t size, v_len;
413         int err = 0;
414
415         ksmbd_debug(VFS, "write stream data pos : %llu, count : %zd\n",
416                     *pos, count);
417
418         size = *pos + count;
419         if (size > XATTR_SIZE_MAX) {
420                 size = XATTR_SIZE_MAX;
421                 count = (*pos + count) - XATTR_SIZE_MAX;
422         }
423
424         v_len = ksmbd_vfs_getcasexattr(user_ns,
425                                        fp->filp->f_path.dentry,
426                                        fp->stream.name,
427                                        fp->stream.size,
428                                        &stream_buf);
429         if ((int)v_len < 0) {
430                 pr_err("not found stream in xattr : %zd\n", v_len);
431                 err = (int)v_len;
432                 goto out;
433         }
434
435         if (v_len < size) {
436                 wbuf = kvmalloc(size, GFP_KERNEL | __GFP_ZERO);
437                 if (!wbuf) {
438                         err = -ENOMEM;
439                         goto out;
440                 }
441
442                 if (v_len > 0)
443                         memcpy(wbuf, stream_buf, v_len);
444                 kvfree(stream_buf);
445                 stream_buf = wbuf;
446         }
447
448         memcpy(&stream_buf[*pos], buf, count);
449
450         err = ksmbd_vfs_setxattr(user_ns,
451                                  fp->filp->f_path.dentry,
452                                  fp->stream.name,
453                                  (void *)stream_buf,
454                                  size,
455                                  0);
456         if (err < 0)
457                 goto out;
458
459         fp->filp->f_pos = *pos;
460         err = 0;
461 out:
462         kvfree(stream_buf);
463         return err;
464 }
465
466 /**
467  * ksmbd_vfs_write() - vfs helper for smb file write
468  * @work:       work
469  * @fid:        file id of open file
470  * @buf:        buf containing data for writing
471  * @count:      read byte count
472  * @pos:        file pos
473  * @sync:       fsync after write
474  * @written:    number of bytes written
475  *
476  * Return:      0 on success, otherwise error
477  */
478 int ksmbd_vfs_write(struct ksmbd_work *work, struct ksmbd_file *fp,
479                     char *buf, size_t count, loff_t *pos, bool sync,
480                     ssize_t *written)
481 {
482         struct ksmbd_session *sess = work->sess;
483         struct file *filp;
484         loff_t  offset = *pos;
485         int err = 0;
486
487         if (sess->conn->connection_type) {
488                 if (!(fp->daccess & FILE_WRITE_DATA_LE)) {
489                         pr_err("no right to write(%pd)\n",
490                                fp->filp->f_path.dentry);
491                         err = -EACCES;
492                         goto out;
493                 }
494         }
495
496         filp = fp->filp;
497
498         if (ksmbd_stream_fd(fp)) {
499                 err = ksmbd_vfs_stream_write(fp, buf, pos, count);
500                 if (!err)
501                         *written = count;
502                 goto out;
503         }
504
505         if (!work->tcon->posix_extensions) {
506                 err = check_lock_range(filp, *pos, *pos + count - 1, WRITE);
507                 if (err) {
508                         pr_err("unable to write due to lock\n");
509                         err = -EAGAIN;
510                         goto out;
511                 }
512         }
513
514         /* Do we need to break any of a levelII oplock? */
515         smb_break_all_levII_oplock(work, fp, 1);
516
517         err = kernel_write(filp, buf, count, pos);
518         if (err < 0) {
519                 ksmbd_debug(VFS, "smb write failed, err = %d\n", err);
520                 goto out;
521         }
522
523         filp->f_pos = *pos;
524         *written = err;
525         err = 0;
526         if (sync) {
527                 err = vfs_fsync_range(filp, offset, offset + *written, 0);
528                 if (err < 0)
529                         pr_err("fsync failed for filename = %pd, err = %d\n",
530                                fp->filp->f_path.dentry, err);
531         }
532
533 out:
534         return err;
535 }
536
537 /**
538  * ksmbd_vfs_getattr() - vfs helper for smb getattr
539  * @work:       work
540  * @fid:        file id of open file
541  * @attrs:      inode attributes
542  *
543  * Return:      0 on success, otherwise error
544  */
545 int ksmbd_vfs_getattr(struct path *path, struct kstat *stat)
546 {
547         int err;
548
549         err = vfs_getattr(path, stat, STATX_BTIME, AT_STATX_SYNC_AS_STAT);
550         if (err)
551                 pr_err("getattr failed, err %d\n", err);
552         return err;
553 }
554
555 /**
556  * ksmbd_vfs_fsync() - vfs helper for smb fsync
557  * @work:       work
558  * @fid:        file id of open file
559  *
560  * Return:      0 on success, otherwise error
561  */
562 int ksmbd_vfs_fsync(struct ksmbd_work *work, u64 fid, u64 p_id)
563 {
564         struct ksmbd_file *fp;
565         int err;
566
567         fp = ksmbd_lookup_fd_slow(work, fid, p_id);
568         if (!fp) {
569                 pr_err("failed to get filp for fid %llu\n", fid);
570                 return -ENOENT;
571         }
572         err = vfs_fsync(fp->filp, 0);
573         if (err < 0)
574                 pr_err("smb fsync failed, err = %d\n", err);
575         ksmbd_fd_put(work, fp);
576         return err;
577 }
578
579 /**
580  * ksmbd_vfs_remove_file() - vfs helper for smb rmdir or unlink
581  * @name:       absolute directory or file name
582  *
583  * Return:      0 on success, otherwise error
584  */
585 int ksmbd_vfs_remove_file(struct ksmbd_work *work, char *name)
586 {
587         struct user_namespace *user_ns;
588         struct path path;
589         struct dentry *parent;
590         int err;
591         int flags = 0;
592
593         if (ksmbd_override_fsids(work))
594                 return -ENOMEM;
595
596         if (test_share_config_flag(work->tcon->share_conf,
597                                    KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS))
598                 flags = LOOKUP_FOLLOW;
599
600         err = kern_path(name, flags, &path);
601         if (err) {
602                 ksmbd_debug(VFS, "can't get %s, err %d\n", name, err);
603                 ksmbd_revert_fsids(work);
604                 return err;
605         }
606
607         user_ns = mnt_user_ns(path.mnt);
608         parent = dget_parent(path.dentry);
609         err = ksmbd_vfs_lock_parent(user_ns, parent, path.dentry);
610         if (err) {
611                 dput(parent);
612                 path_put(&path);
613                 ksmbd_revert_fsids(work);
614                 return err;
615         }
616
617         if (!d_inode(path.dentry)->i_nlink) {
618                 err = -ENOENT;
619                 goto out_err;
620         }
621
622         if (S_ISDIR(d_inode(path.dentry)->i_mode)) {
623                 err = vfs_rmdir(user_ns, d_inode(parent), path.dentry);
624                 if (err && err != -ENOTEMPTY)
625                         ksmbd_debug(VFS, "%s: rmdir failed, err %d\n", name,
626                                     err);
627         } else {
628                 err = vfs_unlink(user_ns, d_inode(parent), path.dentry, NULL);
629                 if (err)
630                         ksmbd_debug(VFS, "%s: unlink failed, err %d\n", name,
631                                     err);
632         }
633
634 out_err:
635         inode_unlock(d_inode(parent));
636         dput(parent);
637         path_put(&path);
638         ksmbd_revert_fsids(work);
639         return err;
640 }
641
642 /**
643  * ksmbd_vfs_link() - vfs helper for creating smb hardlink
644  * @oldname:    source file name
645  * @newname:    hardlink name
646  *
647  * Return:      0 on success, otherwise error
648  */
649 int ksmbd_vfs_link(struct ksmbd_work *work, const char *oldname,
650                    const char *newname)
651 {
652         struct path oldpath, newpath;
653         struct dentry *dentry;
654         int err;
655         int flags = 0;
656
657         if (ksmbd_override_fsids(work))
658                 return -ENOMEM;
659
660         if (test_share_config_flag(work->tcon->share_conf,
661                                    KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS))
662                 flags = LOOKUP_FOLLOW;
663
664         err = kern_path(oldname, flags, &oldpath);
665         if (err) {
666                 pr_err("cannot get linux path for %s, err = %d\n",
667                        oldname, err);
668                 goto out1;
669         }
670
671         dentry = kern_path_create(AT_FDCWD, newname, &newpath,
672                                   flags | LOOKUP_REVAL);
673         if (IS_ERR(dentry)) {
674                 err = PTR_ERR(dentry);
675                 pr_err("path create err for %s, err %d\n", newname, err);
676                 goto out2;
677         }
678
679         err = -EXDEV;
680         if (oldpath.mnt != newpath.mnt) {
681                 pr_err("vfs_link failed err %d\n", err);
682                 goto out3;
683         }
684
685         err = vfs_link(oldpath.dentry, mnt_user_ns(newpath.mnt),
686                        d_inode(newpath.dentry),
687                        dentry, NULL);
688         if (err)
689                 ksmbd_debug(VFS, "vfs_link failed err %d\n", err);
690
691 out3:
692         done_path_create(&newpath, dentry);
693 out2:
694         path_put(&oldpath);
695 out1:
696         ksmbd_revert_fsids(work);
697         return err;
698 }
699
700 static int ksmbd_validate_entry_in_use(struct dentry *src_dent)
701 {
702         struct dentry *dst_dent;
703
704         spin_lock(&src_dent->d_lock);
705         list_for_each_entry(dst_dent, &src_dent->d_subdirs, d_child) {
706                 struct ksmbd_file *child_fp;
707
708                 if (d_really_is_negative(dst_dent))
709                         continue;
710
711                 child_fp = ksmbd_lookup_fd_inode(d_inode(dst_dent));
712                 if (child_fp) {
713                         spin_unlock(&src_dent->d_lock);
714                         ksmbd_debug(VFS, "Forbid rename, sub file/dir is in use\n");
715                         return -EACCES;
716                 }
717         }
718         spin_unlock(&src_dent->d_lock);
719
720         return 0;
721 }
722
723 static int __ksmbd_vfs_rename(struct ksmbd_work *work,
724                               struct user_namespace *src_user_ns,
725                               struct dentry *src_dent_parent,
726                               struct dentry *src_dent,
727                               struct user_namespace *dst_user_ns,
728                               struct dentry *dst_dent_parent,
729                               struct dentry *trap_dent,
730                               char *dst_name)
731 {
732         struct dentry *dst_dent;
733         int err;
734
735         if (!work->tcon->posix_extensions) {
736                 err = ksmbd_validate_entry_in_use(src_dent);
737                 if (err)
738                         return err;
739         }
740
741         if (d_really_is_negative(src_dent_parent))
742                 return -ENOENT;
743         if (d_really_is_negative(dst_dent_parent))
744                 return -ENOENT;
745         if (d_really_is_negative(src_dent))
746                 return -ENOENT;
747         if (src_dent == trap_dent)
748                 return -EINVAL;
749
750         if (ksmbd_override_fsids(work))
751                 return -ENOMEM;
752
753         dst_dent = lookup_one(dst_user_ns, dst_name, dst_dent_parent,
754                               strlen(dst_name));
755         err = PTR_ERR(dst_dent);
756         if (IS_ERR(dst_dent)) {
757                 pr_err("lookup failed %s [%d]\n", dst_name, err);
758                 goto out;
759         }
760
761         err = -ENOTEMPTY;
762         if (dst_dent != trap_dent && !d_really_is_positive(dst_dent)) {
763                 struct renamedata rd = {
764                         .old_mnt_userns = src_user_ns,
765                         .old_dir        = d_inode(src_dent_parent),
766                         .old_dentry     = src_dent,
767                         .new_mnt_userns = dst_user_ns,
768                         .new_dir        = d_inode(dst_dent_parent),
769                         .new_dentry     = dst_dent,
770                 };
771                 err = vfs_rename(&rd);
772         }
773         if (err)
774                 pr_err("vfs_rename failed err %d\n", err);
775         if (dst_dent)
776                 dput(dst_dent);
777 out:
778         ksmbd_revert_fsids(work);
779         return err;
780 }
781
782 int ksmbd_vfs_fp_rename(struct ksmbd_work *work, struct ksmbd_file *fp,
783                         char *newname)
784 {
785         struct user_namespace *user_ns;
786         struct path dst_path;
787         struct dentry *src_dent_parent, *dst_dent_parent;
788         struct dentry *src_dent, *trap_dent, *src_child;
789         char *dst_name;
790         int err;
791         int flags;
792
793         dst_name = extract_last_component(newname);
794         if (!dst_name)
795                 return -EINVAL;
796
797         src_dent_parent = dget_parent(fp->filp->f_path.dentry);
798         src_dent = fp->filp->f_path.dentry;
799
800         flags = LOOKUP_DIRECTORY;
801         if (test_share_config_flag(work->tcon->share_conf,
802                                    KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS))
803                 flags |= LOOKUP_FOLLOW;
804
805         err = kern_path(newname, flags, &dst_path);
806         if (err) {
807                 ksmbd_debug(VFS, "Cannot get path for %s [%d]\n", newname, err);
808                 goto out;
809         }
810         dst_dent_parent = dst_path.dentry;
811
812         trap_dent = lock_rename(src_dent_parent, dst_dent_parent);
813         dget(src_dent);
814         dget(dst_dent_parent);
815         user_ns = file_mnt_user_ns(fp->filp);
816         src_child = lookup_one(user_ns, src_dent->d_name.name, src_dent_parent,
817                                src_dent->d_name.len);
818         if (IS_ERR(src_child)) {
819                 err = PTR_ERR(src_child);
820                 goto out_lock;
821         }
822
823         if (src_child != src_dent) {
824                 err = -ESTALE;
825                 dput(src_child);
826                 goto out_lock;
827         }
828         dput(src_child);
829
830         err = __ksmbd_vfs_rename(work,
831                                  user_ns,
832                                  src_dent_parent,
833                                  src_dent,
834                                  mnt_user_ns(dst_path.mnt),
835                                  dst_dent_parent,
836                                  trap_dent,
837                                  dst_name);
838 out_lock:
839         dput(src_dent);
840         dput(dst_dent_parent);
841         unlock_rename(src_dent_parent, dst_dent_parent);
842         path_put(&dst_path);
843 out:
844         dput(src_dent_parent);
845         return err;
846 }
847
848 /**
849  * ksmbd_vfs_truncate() - vfs helper for smb file truncate
850  * @work:       work
851  * @name:       old filename
852  * @fid:        file id of old file
853  * @size:       truncate to given size
854  *
855  * Return:      0 on success, otherwise error
856  */
857 int ksmbd_vfs_truncate(struct ksmbd_work *work, const char *name,
858                        struct ksmbd_file *fp, loff_t size)
859 {
860         struct path path;
861         int err = 0;
862
863         if (name) {
864                 err = kern_path(name, 0, &path);
865                 if (err) {
866                         pr_err("cannot get linux path for %s, err %d\n",
867                                name, err);
868                         return err;
869                 }
870                 err = vfs_truncate(&path, size);
871                 if (err)
872                         pr_err("truncate failed for %s err %d\n",
873                                name, err);
874                 path_put(&path);
875         } else {
876                 struct file *filp;
877
878                 filp = fp->filp;
879
880                 /* Do we need to break any of a levelII oplock? */
881                 smb_break_all_levII_oplock(work, fp, 1);
882
883                 if (!work->tcon->posix_extensions) {
884                         struct inode *inode = file_inode(filp);
885
886                         if (size < inode->i_size) {
887                                 err = check_lock_range(filp, size,
888                                                        inode->i_size - 1, WRITE);
889                         } else {
890                                 err = check_lock_range(filp, inode->i_size,
891                                                        size - 1, WRITE);
892                         }
893
894                         if (err) {
895                                 pr_err("failed due to lock\n");
896                                 return -EAGAIN;
897                         }
898                 }
899
900                 err = vfs_truncate(&filp->f_path, size);
901                 if (err)
902                         pr_err("truncate failed for filename : %s err %d\n",
903                                fp->filename, err);
904         }
905
906         return err;
907 }
908
909 /**
910  * ksmbd_vfs_listxattr() - vfs helper for smb list extended attributes
911  * @dentry:     dentry of file for listing xattrs
912  * @list:       destination buffer
913  * @size:       destination buffer length
914  *
915  * Return:      xattr list length on success, otherwise error
916  */
917 ssize_t ksmbd_vfs_listxattr(struct dentry *dentry, char **list)
918 {
919         ssize_t size;
920         char *vlist = NULL;
921
922         size = vfs_listxattr(dentry, NULL, 0);
923         if (size <= 0)
924                 return size;
925
926         vlist = kvmalloc(size, GFP_KERNEL | __GFP_ZERO);
927         if (!vlist)
928                 return -ENOMEM;
929
930         *list = vlist;
931         size = vfs_listxattr(dentry, vlist, size);
932         if (size < 0) {
933                 ksmbd_debug(VFS, "listxattr failed\n");
934                 kvfree(vlist);
935                 *list = NULL;
936         }
937
938         return size;
939 }
940
941 static ssize_t ksmbd_vfs_xattr_len(struct user_namespace *user_ns,
942                                    struct dentry *dentry, char *xattr_name)
943 {
944         return vfs_getxattr(user_ns, dentry, xattr_name, NULL, 0);
945 }
946
947 /**
948  * ksmbd_vfs_getxattr() - vfs helper for smb get extended attributes value
949  * @user_ns:    user namespace
950  * @dentry:     dentry of file for getting xattrs
951  * @xattr_name: name of xattr name to query
952  * @xattr_buf:  destination buffer xattr value
953  *
954  * Return:      read xattr value length on success, otherwise error
955  */
956 ssize_t ksmbd_vfs_getxattr(struct user_namespace *user_ns,
957                            struct dentry *dentry,
958                            char *xattr_name, char **xattr_buf)
959 {
960         ssize_t xattr_len;
961         char *buf;
962
963         *xattr_buf = NULL;
964         xattr_len = ksmbd_vfs_xattr_len(user_ns, dentry, xattr_name);
965         if (xattr_len < 0)
966                 return xattr_len;
967
968         buf = kmalloc(xattr_len + 1, GFP_KERNEL);
969         if (!buf)
970                 return -ENOMEM;
971
972         xattr_len = vfs_getxattr(user_ns, dentry, xattr_name,
973                                  (void *)buf, xattr_len);
974         if (xattr_len > 0)
975                 *xattr_buf = buf;
976         else
977                 kfree(buf);
978         return xattr_len;
979 }
980
981 /**
982  * ksmbd_vfs_setxattr() - vfs helper for smb set extended attributes value
983  * @user_ns:    user namespace
984  * @dentry:     dentry to set XATTR at
985  * @name:       xattr name for setxattr
986  * @value:      xattr value to set
987  * @size:       size of xattr value
988  * @flags:      destination buffer length
989  *
990  * Return:      0 on success, otherwise error
991  */
992 int ksmbd_vfs_setxattr(struct user_namespace *user_ns,
993                        struct dentry *dentry, const char *attr_name,
994                        const void *attr_value, size_t attr_size, int flags)
995 {
996         int err;
997
998         err = vfs_setxattr(user_ns,
999                            dentry,
1000                            attr_name,
1001                            attr_value,
1002                            attr_size,
1003                            flags);
1004         if (err)
1005                 ksmbd_debug(VFS, "setxattr failed, err %d\n", err);
1006         return err;
1007 }
1008
1009 /**
1010  * ksmbd_vfs_set_fadvise() - convert smb IO caching options to linux options
1011  * @filp:       file pointer for IO
1012  * @options:    smb IO options
1013  */
1014 void ksmbd_vfs_set_fadvise(struct file *filp, __le32 option)
1015 {
1016         struct address_space *mapping;
1017
1018         mapping = filp->f_mapping;
1019
1020         if (!option || !mapping)
1021                 return;
1022
1023         if (option & FILE_WRITE_THROUGH_LE) {
1024                 filp->f_flags |= O_SYNC;
1025         } else if (option & FILE_SEQUENTIAL_ONLY_LE) {
1026                 filp->f_ra.ra_pages = inode_to_bdi(mapping->host)->ra_pages * 2;
1027                 spin_lock(&filp->f_lock);
1028                 filp->f_mode &= ~FMODE_RANDOM;
1029                 spin_unlock(&filp->f_lock);
1030         } else if (option & FILE_RANDOM_ACCESS_LE) {
1031                 spin_lock(&filp->f_lock);
1032                 filp->f_mode |= FMODE_RANDOM;
1033                 spin_unlock(&filp->f_lock);
1034         }
1035 }
1036
1037 int ksmbd_vfs_zero_data(struct ksmbd_work *work, struct ksmbd_file *fp,
1038                         loff_t off, loff_t len)
1039 {
1040         smb_break_all_levII_oplock(work, fp, 1);
1041         if (fp->f_ci->m_fattr & ATTR_SPARSE_FILE_LE)
1042                 return vfs_fallocate(fp->filp,
1043                                      FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
1044                                      off, len);
1045
1046         return vfs_fallocate(fp->filp, FALLOC_FL_ZERO_RANGE, off, len);
1047 }
1048
1049 int ksmbd_vfs_fqar_lseek(struct ksmbd_file *fp, loff_t start, loff_t length,
1050                          struct file_allocated_range_buffer *ranges,
1051                          int in_count, int *out_count)
1052 {
1053         struct file *f = fp->filp;
1054         struct inode *inode = file_inode(fp->filp);
1055         loff_t maxbytes = (u64)inode->i_sb->s_maxbytes, end;
1056         loff_t extent_start, extent_end;
1057         int ret = 0;
1058
1059         if (start > maxbytes)
1060                 return -EFBIG;
1061
1062         if (!in_count)
1063                 return 0;
1064
1065         /*
1066          * Shrink request scope to what the fs can actually handle.
1067          */
1068         if (length > maxbytes || (maxbytes - length) < start)
1069                 length = maxbytes - start;
1070
1071         if (start + length > inode->i_size)
1072                 length = inode->i_size - start;
1073
1074         *out_count = 0;
1075         end = start + length;
1076         while (start < end && *out_count < in_count) {
1077                 extent_start = f->f_op->llseek(f, start, SEEK_DATA);
1078                 if (extent_start < 0) {
1079                         if (extent_start != -ENXIO)
1080                                 ret = (int)extent_start;
1081                         break;
1082                 }
1083
1084                 if (extent_start >= end)
1085                         break;
1086
1087                 extent_end = f->f_op->llseek(f, extent_start, SEEK_HOLE);
1088                 if (extent_end < 0) {
1089                         if (extent_end != -ENXIO)
1090                                 ret = (int)extent_end;
1091                         break;
1092                 } else if (extent_start >= extent_end) {
1093                         break;
1094                 }
1095
1096                 ranges[*out_count].file_offset = cpu_to_le64(extent_start);
1097                 ranges[(*out_count)++].length =
1098                         cpu_to_le64(min(extent_end, end) - extent_start);
1099
1100                 start = extent_end;
1101         }
1102
1103         return ret;
1104 }
1105
1106 int ksmbd_vfs_remove_xattr(struct user_namespace *user_ns,
1107                            struct dentry *dentry, char *attr_name)
1108 {
1109         return vfs_removexattr(user_ns, dentry, attr_name);
1110 }
1111
1112 int ksmbd_vfs_unlink(struct user_namespace *user_ns,
1113                      struct dentry *dir, struct dentry *dentry)
1114 {
1115         int err = 0;
1116
1117         err = ksmbd_vfs_lock_parent(user_ns, dir, dentry);
1118         if (err)
1119                 return err;
1120         dget(dentry);
1121
1122         if (S_ISDIR(d_inode(dentry)->i_mode))
1123                 err = vfs_rmdir(user_ns, d_inode(dir), dentry);
1124         else
1125                 err = vfs_unlink(user_ns, d_inode(dir), dentry, NULL);
1126
1127         dput(dentry);
1128         inode_unlock(d_inode(dir));
1129         if (err)
1130                 ksmbd_debug(VFS, "failed to delete, err %d\n", err);
1131
1132         return err;
1133 }
1134
1135 static int __dir_empty(struct dir_context *ctx, const char *name, int namlen,
1136                        loff_t offset, u64 ino, unsigned int d_type)
1137 {
1138         struct ksmbd_readdir_data *buf;
1139
1140         buf = container_of(ctx, struct ksmbd_readdir_data, ctx);
1141         buf->dirent_count++;
1142
1143         if (buf->dirent_count > 2)
1144                 return -ENOTEMPTY;
1145         return 0;
1146 }
1147
1148 /**
1149  * ksmbd_vfs_empty_dir() - check for empty directory
1150  * @fp: ksmbd file pointer
1151  *
1152  * Return:      true if directory empty, otherwise false
1153  */
1154 int ksmbd_vfs_empty_dir(struct ksmbd_file *fp)
1155 {
1156         int err;
1157         struct ksmbd_readdir_data readdir_data;
1158
1159         memset(&readdir_data, 0, sizeof(struct ksmbd_readdir_data));
1160
1161         set_ctx_actor(&readdir_data.ctx, __dir_empty);
1162         readdir_data.dirent_count = 0;
1163
1164         err = iterate_dir(fp->filp, &readdir_data.ctx);
1165         if (readdir_data.dirent_count > 2)
1166                 err = -ENOTEMPTY;
1167         else
1168                 err = 0;
1169         return err;
1170 }
1171
1172 static int __caseless_lookup(struct dir_context *ctx, const char *name,
1173                              int namlen, loff_t offset, u64 ino,
1174                              unsigned int d_type)
1175 {
1176         struct ksmbd_readdir_data *buf;
1177
1178         buf = container_of(ctx, struct ksmbd_readdir_data, ctx);
1179
1180         if (buf->used != namlen)
1181                 return 0;
1182         if (!strncasecmp((char *)buf->private, name, namlen)) {
1183                 memcpy((char *)buf->private, name, namlen);
1184                 buf->dirent_count = 1;
1185                 return -EEXIST;
1186         }
1187         return 0;
1188 }
1189
1190 /**
1191  * ksmbd_vfs_lookup_in_dir() - lookup a file in a directory
1192  * @dir:        path info
1193  * @name:       filename to lookup
1194  * @namelen:    filename length
1195  *
1196  * Return:      0 on success, otherwise error
1197  */
1198 static int ksmbd_vfs_lookup_in_dir(struct path *dir, char *name, size_t namelen)
1199 {
1200         int ret;
1201         struct file *dfilp;
1202         int flags = O_RDONLY | O_LARGEFILE;
1203         struct ksmbd_readdir_data readdir_data = {
1204                 .ctx.actor      = __caseless_lookup,
1205                 .private        = name,
1206                 .used           = namelen,
1207                 .dirent_count   = 0,
1208         };
1209
1210         dfilp = dentry_open(dir, flags, current_cred());
1211         if (IS_ERR(dfilp))
1212                 return PTR_ERR(dfilp);
1213
1214         ret = iterate_dir(dfilp, &readdir_data.ctx);
1215         if (readdir_data.dirent_count > 0)
1216                 ret = 0;
1217         fput(dfilp);
1218         return ret;
1219 }
1220
1221 /**
1222  * ksmbd_vfs_kern_path() - lookup a file and get path info
1223  * @name:       name of file for lookup
1224  * @flags:      lookup flags
1225  * @path:       if lookup succeed, return path info
1226  * @caseless:   caseless filename lookup
1227  *
1228  * Return:      0 on success, otherwise error
1229  */
1230 int ksmbd_vfs_kern_path(char *name, unsigned int flags, struct path *path,
1231                         bool caseless)
1232 {
1233         int err;
1234
1235         if (name[0] != '/')
1236                 return -EINVAL;
1237
1238         err = kern_path(name, flags, path);
1239         if (!err)
1240                 return 0;
1241
1242         if (caseless) {
1243                 char *filepath;
1244                 struct path parent;
1245                 size_t path_len, remain_len;
1246
1247                 filepath = kstrdup(name, GFP_KERNEL);
1248                 if (!filepath)
1249                         return -ENOMEM;
1250
1251                 path_len = strlen(filepath);
1252                 remain_len = path_len - 1;
1253
1254                 err = kern_path("/", flags, &parent);
1255                 if (err)
1256                         goto out;
1257
1258                 while (d_can_lookup(parent.dentry)) {
1259                         char *filename = filepath + path_len - remain_len;
1260                         char *next = strchrnul(filename, '/');
1261                         size_t filename_len = next - filename;
1262                         bool is_last = !next[0];
1263
1264                         if (filename_len == 0)
1265                                 break;
1266
1267                         err = ksmbd_vfs_lookup_in_dir(&parent, filename,
1268                                                       filename_len);
1269                         if (err) {
1270                                 path_put(&parent);
1271                                 goto out;
1272                         }
1273
1274                         path_put(&parent);
1275                         next[0] = '\0';
1276
1277                         err = kern_path(filepath, flags, &parent);
1278                         if (err)
1279                                 goto out;
1280
1281                         if (is_last) {
1282                                 path->mnt = parent.mnt;
1283                                 path->dentry = parent.dentry;
1284                                 goto out;
1285                         }
1286
1287                         next[0] = '/';
1288                         remain_len -= filename_len + 1;
1289                 }
1290
1291                 path_put(&parent);
1292                 err = -EINVAL;
1293 out:
1294                 kfree(filepath);
1295         }
1296         return err;
1297 }
1298
1299 int ksmbd_vfs_remove_acl_xattrs(struct user_namespace *user_ns,
1300                                 struct dentry *dentry)
1301 {
1302         char *name, *xattr_list = NULL;
1303         ssize_t xattr_list_len;
1304         int err = 0;
1305
1306         xattr_list_len = ksmbd_vfs_listxattr(dentry, &xattr_list);
1307         if (xattr_list_len < 0) {
1308                 goto out;
1309         } else if (!xattr_list_len) {
1310                 ksmbd_debug(SMB, "empty xattr in the file\n");
1311                 goto out;
1312         }
1313
1314         for (name = xattr_list; name - xattr_list < xattr_list_len;
1315              name += strlen(name) + 1) {
1316                 ksmbd_debug(SMB, "%s, len %zd\n", name, strlen(name));
1317
1318                 if (!strncmp(name, XATTR_NAME_POSIX_ACL_ACCESS,
1319                              sizeof(XATTR_NAME_POSIX_ACL_ACCESS) - 1) ||
1320                     !strncmp(name, XATTR_NAME_POSIX_ACL_DEFAULT,
1321                              sizeof(XATTR_NAME_POSIX_ACL_DEFAULT) - 1)) {
1322                         err = ksmbd_vfs_remove_xattr(user_ns, dentry, name);
1323                         if (err)
1324                                 ksmbd_debug(SMB,
1325                                             "remove acl xattr failed : %s\n", name);
1326                 }
1327         }
1328 out:
1329         kvfree(xattr_list);
1330         return err;
1331 }
1332
1333 int ksmbd_vfs_remove_sd_xattrs(struct user_namespace *user_ns,
1334                                struct dentry *dentry)
1335 {
1336         char *name, *xattr_list = NULL;
1337         ssize_t xattr_list_len;
1338         int err = 0;
1339
1340         xattr_list_len = ksmbd_vfs_listxattr(dentry, &xattr_list);
1341         if (xattr_list_len < 0) {
1342                 goto out;
1343         } else if (!xattr_list_len) {
1344                 ksmbd_debug(SMB, "empty xattr in the file\n");
1345                 goto out;
1346         }
1347
1348         for (name = xattr_list; name - xattr_list < xattr_list_len;
1349                         name += strlen(name) + 1) {
1350                 ksmbd_debug(SMB, "%s, len %zd\n", name, strlen(name));
1351
1352                 if (!strncmp(name, XATTR_NAME_SD, XATTR_NAME_SD_LEN)) {
1353                         err = ksmbd_vfs_remove_xattr(user_ns, dentry, name);
1354                         if (err)
1355                                 ksmbd_debug(SMB, "remove xattr failed : %s\n", name);
1356                 }
1357         }
1358 out:
1359         kvfree(xattr_list);
1360         return err;
1361 }
1362
1363 static struct xattr_smb_acl *ksmbd_vfs_make_xattr_posix_acl(struct user_namespace *user_ns,
1364                                                             struct inode *inode,
1365                                                             int acl_type)
1366 {
1367         struct xattr_smb_acl *smb_acl = NULL;
1368         struct posix_acl *posix_acls;
1369         struct posix_acl_entry *pa_entry;
1370         struct xattr_acl_entry *xa_entry;
1371         int i;
1372
1373         if (!IS_ENABLED(CONFIG_FS_POSIX_ACL))
1374                 return NULL;
1375
1376         posix_acls = get_acl(inode, acl_type);
1377         if (!posix_acls)
1378                 return NULL;
1379
1380         smb_acl = kzalloc(sizeof(struct xattr_smb_acl) +
1381                           sizeof(struct xattr_acl_entry) * posix_acls->a_count,
1382                           GFP_KERNEL);
1383         if (!smb_acl)
1384                 goto out;
1385
1386         smb_acl->count = posix_acls->a_count;
1387         pa_entry = posix_acls->a_entries;
1388         xa_entry = smb_acl->entries;
1389         for (i = 0; i < posix_acls->a_count; i++, pa_entry++, xa_entry++) {
1390                 switch (pa_entry->e_tag) {
1391                 case ACL_USER:
1392                         xa_entry->type = SMB_ACL_USER;
1393                         xa_entry->uid = posix_acl_uid_translate(user_ns, pa_entry);
1394                         break;
1395                 case ACL_USER_OBJ:
1396                         xa_entry->type = SMB_ACL_USER_OBJ;
1397                         break;
1398                 case ACL_GROUP:
1399                         xa_entry->type = SMB_ACL_GROUP;
1400                         xa_entry->gid = posix_acl_gid_translate(user_ns, pa_entry);
1401                         break;
1402                 case ACL_GROUP_OBJ:
1403                         xa_entry->type = SMB_ACL_GROUP_OBJ;
1404                         break;
1405                 case ACL_OTHER:
1406                         xa_entry->type = SMB_ACL_OTHER;
1407                         break;
1408                 case ACL_MASK:
1409                         xa_entry->type = SMB_ACL_MASK;
1410                         break;
1411                 default:
1412                         pr_err("unknown type : 0x%x\n", pa_entry->e_tag);
1413                         goto out;
1414                 }
1415
1416                 if (pa_entry->e_perm & ACL_READ)
1417                         xa_entry->perm |= SMB_ACL_READ;
1418                 if (pa_entry->e_perm & ACL_WRITE)
1419                         xa_entry->perm |= SMB_ACL_WRITE;
1420                 if (pa_entry->e_perm & ACL_EXECUTE)
1421                         xa_entry->perm |= SMB_ACL_EXECUTE;
1422         }
1423 out:
1424         posix_acl_release(posix_acls);
1425         return smb_acl;
1426 }
1427
1428 int ksmbd_vfs_set_sd_xattr(struct ksmbd_conn *conn,
1429                            struct user_namespace *user_ns,
1430                            struct dentry *dentry,
1431                            struct smb_ntsd *pntsd, int len)
1432 {
1433         int rc;
1434         struct ndr sd_ndr = {0}, acl_ndr = {0};
1435         struct xattr_ntacl acl = {0};
1436         struct xattr_smb_acl *smb_acl, *def_smb_acl = NULL;
1437         struct inode *inode = d_inode(dentry);
1438
1439         acl.version = 4;
1440         acl.hash_type = XATTR_SD_HASH_TYPE_SHA256;
1441         acl.current_time = ksmbd_UnixTimeToNT(current_time(inode));
1442
1443         memcpy(acl.desc, "posix_acl", 9);
1444         acl.desc_len = 10;
1445
1446         pntsd->osidoffset =
1447                 cpu_to_le32(le32_to_cpu(pntsd->osidoffset) + NDR_NTSD_OFFSETOF);
1448         pntsd->gsidoffset =
1449                 cpu_to_le32(le32_to_cpu(pntsd->gsidoffset) + NDR_NTSD_OFFSETOF);
1450         pntsd->dacloffset =
1451                 cpu_to_le32(le32_to_cpu(pntsd->dacloffset) + NDR_NTSD_OFFSETOF);
1452
1453         acl.sd_buf = (char *)pntsd;
1454         acl.sd_size = len;
1455
1456         rc = ksmbd_gen_sd_hash(conn, acl.sd_buf, acl.sd_size, acl.hash);
1457         if (rc) {
1458                 pr_err("failed to generate hash for ndr acl\n");
1459                 return rc;
1460         }
1461
1462         smb_acl = ksmbd_vfs_make_xattr_posix_acl(user_ns, inode,
1463                                                  ACL_TYPE_ACCESS);
1464         if (S_ISDIR(inode->i_mode))
1465                 def_smb_acl = ksmbd_vfs_make_xattr_posix_acl(user_ns, inode,
1466                                                              ACL_TYPE_DEFAULT);
1467
1468         rc = ndr_encode_posix_acl(&acl_ndr, user_ns, inode,
1469                                   smb_acl, def_smb_acl);
1470         if (rc) {
1471                 pr_err("failed to encode ndr to posix acl\n");
1472                 goto out;
1473         }
1474
1475         rc = ksmbd_gen_sd_hash(conn, acl_ndr.data, acl_ndr.offset,
1476                                acl.posix_acl_hash);
1477         if (rc) {
1478                 pr_err("failed to generate hash for ndr acl\n");
1479                 goto out;
1480         }
1481
1482         rc = ndr_encode_v4_ntacl(&sd_ndr, &acl);
1483         if (rc) {
1484                 pr_err("failed to encode ndr to posix acl\n");
1485                 goto out;
1486         }
1487
1488         rc = ksmbd_vfs_setxattr(user_ns, dentry,
1489                                 XATTR_NAME_SD, sd_ndr.data,
1490                                 sd_ndr.offset, 0);
1491         if (rc < 0)
1492                 pr_err("Failed to store XATTR ntacl :%d\n", rc);
1493
1494         kfree(sd_ndr.data);
1495 out:
1496         kfree(acl_ndr.data);
1497         kfree(smb_acl);
1498         kfree(def_smb_acl);
1499         return rc;
1500 }
1501
1502 int ksmbd_vfs_get_sd_xattr(struct ksmbd_conn *conn,
1503                            struct user_namespace *user_ns,
1504                            struct dentry *dentry,
1505                            struct smb_ntsd **pntsd)
1506 {
1507         int rc;
1508         struct ndr n;
1509         struct inode *inode = d_inode(dentry);
1510         struct ndr acl_ndr = {0};
1511         struct xattr_ntacl acl;
1512         struct xattr_smb_acl *smb_acl = NULL, *def_smb_acl = NULL;
1513         __u8 cmp_hash[XATTR_SD_HASH_SIZE] = {0};
1514
1515         rc = ksmbd_vfs_getxattr(user_ns, dentry, XATTR_NAME_SD, &n.data);
1516         if (rc <= 0)
1517                 return rc;
1518
1519         n.length = rc;
1520         rc = ndr_decode_v4_ntacl(&n, &acl);
1521         if (rc)
1522                 goto free_n_data;
1523
1524         smb_acl = ksmbd_vfs_make_xattr_posix_acl(user_ns, inode,
1525                                                  ACL_TYPE_ACCESS);
1526         if (S_ISDIR(inode->i_mode))
1527                 def_smb_acl = ksmbd_vfs_make_xattr_posix_acl(user_ns, inode,
1528                                                              ACL_TYPE_DEFAULT);
1529
1530         rc = ndr_encode_posix_acl(&acl_ndr, user_ns, inode, smb_acl,
1531                                   def_smb_acl);
1532         if (rc) {
1533                 pr_err("failed to encode ndr to posix acl\n");
1534                 goto out_free;
1535         }
1536
1537         rc = ksmbd_gen_sd_hash(conn, acl_ndr.data, acl_ndr.offset, cmp_hash);
1538         if (rc) {
1539                 pr_err("failed to generate hash for ndr acl\n");
1540                 goto out_free;
1541         }
1542
1543         if (memcmp(cmp_hash, acl.posix_acl_hash, XATTR_SD_HASH_SIZE)) {
1544                 pr_err("hash value diff\n");
1545                 rc = -EINVAL;
1546                 goto out_free;
1547         }
1548
1549         *pntsd = acl.sd_buf;
1550         (*pntsd)->osidoffset = cpu_to_le32(le32_to_cpu((*pntsd)->osidoffset) -
1551                                            NDR_NTSD_OFFSETOF);
1552         (*pntsd)->gsidoffset = cpu_to_le32(le32_to_cpu((*pntsd)->gsidoffset) -
1553                                            NDR_NTSD_OFFSETOF);
1554         (*pntsd)->dacloffset = cpu_to_le32(le32_to_cpu((*pntsd)->dacloffset) -
1555                                            NDR_NTSD_OFFSETOF);
1556
1557         rc = acl.sd_size;
1558 out_free:
1559         kfree(acl_ndr.data);
1560         kfree(smb_acl);
1561         kfree(def_smb_acl);
1562         if (rc < 0) {
1563                 kfree(acl.sd_buf);
1564                 *pntsd = NULL;
1565         }
1566
1567 free_n_data:
1568         kfree(n.data);
1569         return rc;
1570 }
1571
1572 int ksmbd_vfs_set_dos_attrib_xattr(struct user_namespace *user_ns,
1573                                    struct dentry *dentry,
1574                                    struct xattr_dos_attrib *da)
1575 {
1576         struct ndr n;
1577         int err;
1578
1579         err = ndr_encode_dos_attr(&n, da);
1580         if (err)
1581                 return err;
1582
1583         err = ksmbd_vfs_setxattr(user_ns, dentry, XATTR_NAME_DOS_ATTRIBUTE,
1584                                  (void *)n.data, n.offset, 0);
1585         if (err)
1586                 ksmbd_debug(SMB, "failed to store dos attribute in xattr\n");
1587         kfree(n.data);
1588
1589         return err;
1590 }
1591
1592 int ksmbd_vfs_get_dos_attrib_xattr(struct user_namespace *user_ns,
1593                                    struct dentry *dentry,
1594                                    struct xattr_dos_attrib *da)
1595 {
1596         struct ndr n;
1597         int err;
1598
1599         err = ksmbd_vfs_getxattr(user_ns, dentry, XATTR_NAME_DOS_ATTRIBUTE,
1600                                  (char **)&n.data);
1601         if (err > 0) {
1602                 n.length = err;
1603                 if (ndr_decode_dos_attr(&n, da))
1604                         err = -EINVAL;
1605                 kfree(n.data);
1606         } else {
1607                 ksmbd_debug(SMB, "failed to load dos attribute in xattr\n");
1608         }
1609
1610         return err;
1611 }
1612
1613 /**
1614  * ksmbd_vfs_init_kstat() - convert unix stat information to smb stat format
1615  * @p:          destination buffer
1616  * @ksmbd_kstat:      ksmbd kstat wrapper
1617  */
1618 void *ksmbd_vfs_init_kstat(char **p, struct ksmbd_kstat *ksmbd_kstat)
1619 {
1620         struct file_directory_info *info = (struct file_directory_info *)(*p);
1621         struct kstat *kstat = ksmbd_kstat->kstat;
1622         u64 time;
1623
1624         info->FileIndex = 0;
1625         info->CreationTime = cpu_to_le64(ksmbd_kstat->create_time);
1626         time = ksmbd_UnixTimeToNT(kstat->atime);
1627         info->LastAccessTime = cpu_to_le64(time);
1628         time = ksmbd_UnixTimeToNT(kstat->mtime);
1629         info->LastWriteTime = cpu_to_le64(time);
1630         time = ksmbd_UnixTimeToNT(kstat->ctime);
1631         info->ChangeTime = cpu_to_le64(time);
1632
1633         if (ksmbd_kstat->file_attributes & ATTR_DIRECTORY_LE) {
1634                 info->EndOfFile = 0;
1635                 info->AllocationSize = 0;
1636         } else {
1637                 info->EndOfFile = cpu_to_le64(kstat->size);
1638                 info->AllocationSize = cpu_to_le64(kstat->blocks << 9);
1639         }
1640         info->ExtFileAttributes = ksmbd_kstat->file_attributes;
1641
1642         return info;
1643 }
1644
1645 int ksmbd_vfs_fill_dentry_attrs(struct ksmbd_work *work,
1646                                 struct user_namespace *user_ns,
1647                                 struct dentry *dentry,
1648                                 struct ksmbd_kstat *ksmbd_kstat)
1649 {
1650         u64 time;
1651         int rc;
1652
1653         generic_fillattr(user_ns, d_inode(dentry), ksmbd_kstat->kstat);
1654
1655         time = ksmbd_UnixTimeToNT(ksmbd_kstat->kstat->ctime);
1656         ksmbd_kstat->create_time = time;
1657
1658         /*
1659          * set default value for the case that store dos attributes is not yes
1660          * or that acl is disable in server's filesystem and the config is yes.
1661          */
1662         if (S_ISDIR(ksmbd_kstat->kstat->mode))
1663                 ksmbd_kstat->file_attributes = ATTR_DIRECTORY_LE;
1664         else
1665                 ksmbd_kstat->file_attributes = ATTR_ARCHIVE_LE;
1666
1667         if (test_share_config_flag(work->tcon->share_conf,
1668                                    KSMBD_SHARE_FLAG_STORE_DOS_ATTRS)) {
1669                 struct xattr_dos_attrib da;
1670
1671                 rc = ksmbd_vfs_get_dos_attrib_xattr(user_ns, dentry, &da);
1672                 if (rc > 0) {
1673                         ksmbd_kstat->file_attributes = cpu_to_le32(da.attr);
1674                         ksmbd_kstat->create_time = da.create_time;
1675                 } else {
1676                         ksmbd_debug(VFS, "fail to load dos attribute.\n");
1677                 }
1678         }
1679
1680         return 0;
1681 }
1682
1683 ssize_t ksmbd_vfs_casexattr_len(struct user_namespace *user_ns,
1684                                 struct dentry *dentry, char *attr_name,
1685                                 int attr_name_len)
1686 {
1687         char *name, *xattr_list = NULL;
1688         ssize_t value_len = -ENOENT, xattr_list_len;
1689
1690         xattr_list_len = ksmbd_vfs_listxattr(dentry, &xattr_list);
1691         if (xattr_list_len <= 0)
1692                 goto out;
1693
1694         for (name = xattr_list; name - xattr_list < xattr_list_len;
1695                         name += strlen(name) + 1) {
1696                 ksmbd_debug(VFS, "%s, len %zd\n", name, strlen(name));
1697                 if (strncasecmp(attr_name, name, attr_name_len))
1698                         continue;
1699
1700                 value_len = ksmbd_vfs_xattr_len(user_ns, dentry, name);
1701                 break;
1702         }
1703
1704 out:
1705         kvfree(xattr_list);
1706         return value_len;
1707 }
1708
1709 int ksmbd_vfs_xattr_stream_name(char *stream_name, char **xattr_stream_name,
1710                                 size_t *xattr_stream_name_size, int s_type)
1711 {
1712         char *type, *buf;
1713
1714         if (s_type == DIR_STREAM)
1715                 type = ":$INDEX_ALLOCATION";
1716         else
1717                 type = ":$DATA";
1718
1719         buf = kasprintf(GFP_KERNEL, "%s%s%s",
1720                         XATTR_NAME_STREAM, stream_name, type);
1721         if (!buf)
1722                 return -ENOMEM;
1723
1724         *xattr_stream_name = buf;
1725         *xattr_stream_name_size = strlen(buf) + 1;
1726
1727         return 0;
1728 }
1729
1730 int ksmbd_vfs_copy_file_ranges(struct ksmbd_work *work,
1731                                struct ksmbd_file *src_fp,
1732                                struct ksmbd_file *dst_fp,
1733                                struct srv_copychunk *chunks,
1734                                unsigned int chunk_count,
1735                                unsigned int *chunk_count_written,
1736                                unsigned int *chunk_size_written,
1737                                loff_t *total_size_written)
1738 {
1739         unsigned int i;
1740         loff_t src_off, dst_off, src_file_size;
1741         size_t len;
1742         int ret;
1743
1744         *chunk_count_written = 0;
1745         *chunk_size_written = 0;
1746         *total_size_written = 0;
1747
1748         if (!(src_fp->daccess & (FILE_READ_DATA_LE | FILE_EXECUTE_LE))) {
1749                 pr_err("no right to read(%pd)\n", src_fp->filp->f_path.dentry);
1750                 return -EACCES;
1751         }
1752         if (!(dst_fp->daccess & (FILE_WRITE_DATA_LE | FILE_APPEND_DATA_LE))) {
1753                 pr_err("no right to write(%pd)\n", dst_fp->filp->f_path.dentry);
1754                 return -EACCES;
1755         }
1756
1757         if (ksmbd_stream_fd(src_fp) || ksmbd_stream_fd(dst_fp))
1758                 return -EBADF;
1759
1760         smb_break_all_levII_oplock(work, dst_fp, 1);
1761
1762         if (!work->tcon->posix_extensions) {
1763                 for (i = 0; i < chunk_count; i++) {
1764                         src_off = le64_to_cpu(chunks[i].SourceOffset);
1765                         dst_off = le64_to_cpu(chunks[i].TargetOffset);
1766                         len = le32_to_cpu(chunks[i].Length);
1767
1768                         if (check_lock_range(src_fp->filp, src_off,
1769                                              src_off + len - 1, READ))
1770                                 return -EAGAIN;
1771                         if (check_lock_range(dst_fp->filp, dst_off,
1772                                              dst_off + len - 1, WRITE))
1773                                 return -EAGAIN;
1774                 }
1775         }
1776
1777         src_file_size = i_size_read(file_inode(src_fp->filp));
1778
1779         for (i = 0; i < chunk_count; i++) {
1780                 src_off = le64_to_cpu(chunks[i].SourceOffset);
1781                 dst_off = le64_to_cpu(chunks[i].TargetOffset);
1782                 len = le32_to_cpu(chunks[i].Length);
1783
1784                 if (src_off + len > src_file_size)
1785                         return -E2BIG;
1786
1787                 ret = vfs_copy_file_range(src_fp->filp, src_off,
1788                                           dst_fp->filp, dst_off, len, 0);
1789                 if (ret < 0)
1790                         return ret;
1791
1792                 *chunk_count_written += 1;
1793                 *total_size_written += ret;
1794         }
1795         return 0;
1796 }
1797
1798 void ksmbd_vfs_posix_lock_wait(struct file_lock *flock)
1799 {
1800         wait_event(flock->fl_wait, !flock->fl_blocker);
1801 }
1802
1803 int ksmbd_vfs_posix_lock_wait_timeout(struct file_lock *flock, long timeout)
1804 {
1805         return wait_event_interruptible_timeout(flock->fl_wait,
1806                                                 !flock->fl_blocker,
1807                                                 timeout);
1808 }
1809
1810 void ksmbd_vfs_posix_lock_unblock(struct file_lock *flock)
1811 {
1812         locks_delete_block(flock);
1813 }
1814
1815 int ksmbd_vfs_set_init_posix_acl(struct user_namespace *user_ns,
1816                                  struct inode *inode)
1817 {
1818         struct posix_acl_state acl_state;
1819         struct posix_acl *acls;
1820         int rc;
1821
1822         if (!IS_ENABLED(CONFIG_FS_POSIX_ACL))
1823                 return -EOPNOTSUPP;
1824
1825         ksmbd_debug(SMB, "Set posix acls\n");
1826         rc = init_acl_state(&acl_state, 1);
1827         if (rc)
1828                 return rc;
1829
1830         /* Set default owner group */
1831         acl_state.owner.allow = (inode->i_mode & 0700) >> 6;
1832         acl_state.group.allow = (inode->i_mode & 0070) >> 3;
1833         acl_state.other.allow = inode->i_mode & 0007;
1834         acl_state.users->aces[acl_state.users->n].uid = inode->i_uid;
1835         acl_state.users->aces[acl_state.users->n++].perms.allow =
1836                 acl_state.owner.allow;
1837         acl_state.groups->aces[acl_state.groups->n].gid = inode->i_gid;
1838         acl_state.groups->aces[acl_state.groups->n++].perms.allow =
1839                 acl_state.group.allow;
1840         acl_state.mask.allow = 0x07;
1841
1842         acls = posix_acl_alloc(6, GFP_KERNEL);
1843         if (!acls) {
1844                 free_acl_state(&acl_state);
1845                 return -ENOMEM;
1846         }
1847         posix_state_to_acl(&acl_state, acls->a_entries);
1848         rc = set_posix_acl(user_ns, inode, ACL_TYPE_ACCESS, acls);
1849         if (rc < 0)
1850                 ksmbd_debug(SMB, "Set posix acl(ACL_TYPE_ACCESS) failed, rc : %d\n",
1851                             rc);
1852         else if (S_ISDIR(inode->i_mode)) {
1853                 posix_state_to_acl(&acl_state, acls->a_entries);
1854                 rc = set_posix_acl(user_ns, inode, ACL_TYPE_DEFAULT,
1855                                    acls);
1856                 if (rc < 0)
1857                         ksmbd_debug(SMB, "Set posix acl(ACL_TYPE_DEFAULT) failed, rc : %d\n",
1858                                     rc);
1859         }
1860         free_acl_state(&acl_state);
1861         posix_acl_release(acls);
1862         return rc;
1863 }
1864
1865 int ksmbd_vfs_inherit_posix_acl(struct user_namespace *user_ns,
1866                                 struct inode *inode, struct inode *parent_inode)
1867 {
1868         struct posix_acl *acls;
1869         struct posix_acl_entry *pace;
1870         int rc, i;
1871
1872         if (!IS_ENABLED(CONFIG_FS_POSIX_ACL))
1873                 return -EOPNOTSUPP;
1874
1875         acls = get_acl(parent_inode, ACL_TYPE_DEFAULT);
1876         if (!acls)
1877                 return -ENOENT;
1878         pace = acls->a_entries;
1879
1880         for (i = 0; i < acls->a_count; i++, pace++) {
1881                 if (pace->e_tag == ACL_MASK) {
1882                         pace->e_perm = 0x07;
1883                         break;
1884                 }
1885         }
1886
1887         rc = set_posix_acl(user_ns, inode, ACL_TYPE_ACCESS, acls);
1888         if (rc < 0)
1889                 ksmbd_debug(SMB, "Set posix acl(ACL_TYPE_ACCESS) failed, rc : %d\n",
1890                             rc);
1891         if (S_ISDIR(inode->i_mode)) {
1892                 rc = set_posix_acl(user_ns, inode, ACL_TYPE_DEFAULT,
1893                                    acls);
1894                 if (rc < 0)
1895                         ksmbd_debug(SMB, "Set posix acl(ACL_TYPE_DEFAULT) failed, rc : %d\n",
1896                                     rc);
1897         }
1898         posix_acl_release(acls);
1899         return rc;
1900 }