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