]> git.pld-linux.org Git - packages/kernel.git/commitdiff
- rel 1; aufs5 updated
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Tue, 15 Dec 2020 14:38:15 +0000 (15:38 +0100)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Tue, 15 Dec 2020 14:38:15 +0000 (15:38 +0100)
kernel-aufs5.patch
kernel.spec

index 817d2bc1e3a76a287e5dc8dd750f96b028da94d2..33c119f25b75f1c75535b49264d0bf4d9afe9571 100644 (file)
@@ -143,39 +143,6 @@ index a28e4db075ede..12e725e34c6ca 100644
  /*
   * vfsmount lock must be held for write
   */
-diff --git a/fs/read_write.c b/fs/read_write.c
-index bbfa9b12b15eb..5d684d7d29207 100644
---- a/fs/read_write.c
-+++ b/fs/read_write.c
-@@ -499,6 +499,28 @@ static ssize_t __vfs_write(struct file *file, const char __user *p,
-       return ret;
- }
-+vfs_readf_t vfs_readf(struct file *file)
-+{
-+      const struct file_operations *fop = file->f_op;
-+
-+      if (fop->read)
-+              return fop->read;
-+      if (fop->read_iter)
-+              return new_sync_read;
-+      return ERR_PTR(-ENOSYS); /* doesn't have ->read(|_iter)() op */
-+}
-+
-+vfs_writef_t vfs_writef(struct file *file)
-+{
-+      const struct file_operations *fop = file->f_op;
-+
-+      if (fop->write)
-+              return fop->write;
-+      if (fop->write_iter)
-+              return new_sync_write;
-+      return ERR_PTR(-ENOSYS); /* doesn't have ->write(|_iter)() op */
-+}
-+
- /* caller is responsible for file_start_write/file_end_write */
- ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos)
- {
 diff --git a/fs/splice.c b/fs/splice.c
 index 4e53efbd621db..9f230ee854e20 100644
 --- a/fs/splice.c
@@ -221,7 +188,7 @@ diff --git a/include/linux/fs.h b/include/linux/fs.h
 index 45cc10cdf6ddd..916efd7e612b3 100644
 --- a/include/linux/fs.h
 +++ b/include/linux/fs.h
-@@ -1355,6 +1355,7 @@ extern void fasync_free(struct fasync_struct *);
+@@ -1370,6 +1370,7 @@
  /* can be called from interrupts */
  extern void kill_fasync(struct fasync_struct **, int, int);
  
@@ -229,7 +196,7 @@ index 45cc10cdf6ddd..916efd7e612b3 100644
  extern void __f_setown(struct file *filp, struct pid *, enum pid_type, int force);
  extern int f_setown(struct file *filp, unsigned long arg, int force);
  extern void f_delown(struct file *filp);
-@@ -1847,6 +1848,7 @@ struct file_operations {
+@@ -1858,6 +1859,7 @@
        ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
        unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
@@ -237,20 +204,7 @@ index 45cc10cdf6ddd..916efd7e612b3 100644
        int (*flock) (struct file *, int, struct file_lock *);
        ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
-@@ -1917,6 +1919,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
-                             struct iovec *fast_pointer,
-                             struct iovec **ret_pointer);
-+typedef ssize_t (*vfs_readf_t)(struct file *, char __user *, size_t, loff_t *);
-+typedef ssize_t (*vfs_writef_t)(struct file *, const char __user *, size_t,
-+                              loff_t *);
-+vfs_readf_t vfs_readf(struct file *file);
-+vfs_writef_t vfs_writef(struct file *file);
-+
- extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
- extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
- extern ssize_t vfs_readv(struct file *, const struct iovec __user *,
-@@ -2349,6 +2357,7 @@ extern int current_umask(void);
+@@ -2362,6 +2370,7 @@
  extern void ihold(struct inode * inode);
  extern void iput(struct inode *);
  extern int generic_update_time(struct inode *, struct timespec64 *, int);
@@ -258,7 +212,7 @@ index 45cc10cdf6ddd..916efd7e612b3 100644
  
  /* /sys/fs */
  extern struct kobject *fs_kobj;
-@@ -2633,6 +2642,7 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb)
+@@ -2549,6 +2558,7 @@
  }
  
  void emergency_thaw_all(void);
@@ -291,7 +245,7 @@ diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h
 index 35942084cd40d..24f5fd1a789de 100644
 --- a/include/linux/mnt_namespace.h
 +++ b/include/linux/mnt_namespace.h
-@@ -6,12 +6,15 @@
+@@ -7,12 +7,15 @@
  struct fs_struct;
  struct user_namespace;
  struct ns_common;
@@ -884,22 +838,6 @@ index 5d684d7d29207..6f61c0b6aa664 100644
  
  static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
  {
-@@ -509,6 +510,7 @@ vfs_readf_t vfs_readf(struct file *file)
-               return new_sync_read;
-       return ERR_PTR(-ENOSYS); /* doesn't have ->read(|_iter)() op */
- }
-+EXPORT_SYMBOL_GPL(vfs_readf);
- vfs_writef_t vfs_writef(struct file *file)
- {
-@@ -520,6 +522,7 @@ vfs_writef_t vfs_writef(struct file *file)
-               return new_sync_write;
-       return ERR_PTR(-ENOSYS); /* doesn't have ->write(|_iter)() op */
- }
-+EXPORT_SYMBOL_GPL(vfs_writef);
- ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos)
- {
 @@ -589,6 +592,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
  
        return ret;
@@ -4438,8 +4376,8 @@ diff -urN /usr/share/empty/fs/aufs/branch.c linux/fs/aufs/branch.c
 +}
 diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 --- /usr/share/empty/fs/aufs/branch.h  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/branch.h     2020-01-27 10:57:18.165538015 +0100
-@@ -0,0 +1,366 @@
++++ linux/fs/aufs/branch.h     2020-12-15 14:10:58.911356294 +0100
+@@ -0,0 +1,364 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
 + * Copyright (C) 2005-2020 Junjiro R. Okajima
@@ -4683,10 +4621,8 @@ diff -urN /usr/share/empty/fs/aufs/branch.h linux/fs/aufs/branch.h
 +               ino_t *ino);
 +int au_xino_write(struct super_block *sb, aufs_bindex_t bindex, ino_t h_ino,
 +                ino_t ino);
-+ssize_t xino_fread(vfs_readf_t func, struct file *file, void *buf, size_t size,
-+                 loff_t *pos);
-+ssize_t xino_fwrite(vfs_writef_t func, struct file *file, void *buf,
-+                  size_t size, loff_t *pos);
++ssize_t xino_fread(struct file *file, void *buf, size_t size, loff_t *pos);
++ssize_t xino_fwrite(struct file *file, void *buf, size_t size, loff_t *pos);
 +
 +int au_xib_trunc(struct super_block *sb);
 +int au_xino_trunc(struct super_block *sb, aufs_bindex_t bindex, int idx_begin);
@@ -4852,8 +4788,8 @@ diff -urN /usr/share/empty/fs/aufs/conf.mk linux/fs/aufs/conf.mk
 +-include ${srctree}/${src}/conf_priv.mk
 diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 --- /usr/share/empty/fs/aufs/cpup.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/cpup.c       2020-01-27 10:57:18.165538015 +0100
-@@ -0,0 +1,1458 @@
++++ linux/fs/aufs/cpup.c       2020-12-15 14:10:58.911356294 +0100
+@@ -0,0 +1,1445 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2020 Junjiro R. Okajima
@@ -5425,32 +5361,19 @@ diff -urN /usr/share/empty/fs/aufs/cpup.c linux/fs/aufs/cpup.c
 +static int au_do_cpup_symlink(struct path *h_path, struct dentry *h_src,
 +                            struct inode *h_dir)
 +{
-+      int err, symlen;
-+      mm_segment_t old_fs;
-+      union {
-+              char *k;
-+              char __user *u;
-+      } sym;
++      int err;
++      DEFINE_DELAYED_CALL(done);
++      const char *sym;
 +
-+      err = -ENOMEM;
-+      sym.k = (void *)__get_free_page(GFP_NOFS);
-+      if (unlikely(!sym.k))
++      sym = vfs_get_link(h_src, &done);
++      err = PTR_ERR(sym);
++      if (IS_ERR(sym))
 +              goto out;
 +
-+      /* unnecessary to support mmap_sem since symlink is not mmap-able */
-+      old_fs = get_fs();
-+      set_fs(KERNEL_DS);
-+      symlen = vfs_readlink(h_src, sym.u, PATH_MAX);
-+      err = symlen;
-+      set_fs(old_fs);
-+
-+      if (symlen > 0) {
-+              sym.k[symlen] = 0;
-+              err = vfsub_symlink(h_dir, h_path, sym.k);
-+      }
-+      free_page((unsigned long)sym.k);
++      err = vfsub_symlink(h_dir, h_path, sym);
 +
 +out:
++      do_delayed_call(&done);
 +      return err;
 +}
 +
@@ -12407,8 +12330,8 @@ diff -urN /usr/share/empty/fs/aufs/dirren.h linux/fs/aufs/dirren.h
 +#endif /* __AUFS_DIRREN_H__ */
 diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
 --- /usr/share/empty/fs/aufs/dynop.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/dynop.c      2020-01-27 10:57:18.168871450 +0100
-@@ -0,0 +1,367 @@
++++ linux/fs/aufs/dynop.c      2020-12-15 14:10:58.914689728 +0100
+@@ -0,0 +1,368 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2010-2020 Junjiro R. Okajima
@@ -12591,6 +12514,7 @@ diff -urN /usr/share/empty/fs/aufs/dynop.c linux/fs/aufs/dynop.c
 +      DySetAop(writepages);
 +      DySetAop(set_page_dirty);
 +      DySetAop(readpages);
++      DySetAop(readahead);
 +      DySetAop(write_begin);
 +      DySetAop(write_end);
 +      DySetAop(bmap);
@@ -12859,8 +12783,8 @@ diff -urN /usr/share/empty/fs/aufs/dynop.h linux/fs/aufs/dynop.h
 +#endif /* __AUFS_DYNOP_H__ */
 diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 --- /usr/share/empty/fs/aufs/export.c  1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/export.c     2020-01-27 10:57:18.168871450 +0100
-@@ -0,0 +1,838 @@
++++ linux/fs/aufs/export.c     2020-12-15 14:10:58.914689728 +0100
+@@ -0,0 +1,837 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2020 Junjiro R. Okajima
@@ -12984,8 +12908,7 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +      pos = inode->i_ino;
 +      pos *= sizeof(igen);
 +      igen = inode->i_generation + 1;
-+      sz = xino_fwrite(sbinfo->si_xwrite, sbinfo->si_xigen, &igen,
-+                       sizeof(igen), &pos);
++      sz = xino_fwrite(sbinfo->si_xigen, &igen, sizeof(igen), &pos);
 +      if (sz == sizeof(igen))
 +              return; /* success */
 +
@@ -13027,10 +12950,10 @@ diff -urN /usr/share/empty/fs/aufs/export.c linux/fs/aufs/export.c
 +      if (vfsub_f_size_read(file)
 +          < pos + sizeof(inode->i_generation)) {
 +              inode->i_generation = atomic_inc_return(&sbinfo->si_xigen_next);
-+              sz = xino_fwrite(sbinfo->si_xwrite, file, &inode->i_generation,
++              sz = xino_fwrite(file, &inode->i_generation,
 +                               sizeof(inode->i_generation), &pos);
 +      } else
-+              sz = xino_fread(sbinfo->si_xread, file, &inode->i_generation,
++              sz = xino_fread(file, &inode->i_generation,
 +                              sizeof(inode->i_generation), &pos);
 +      if (sz == sizeof(inode->i_generation))
 +              goto out; /* success */
@@ -14132,8 +14055,8 @@ diff -urN /usr/share/empty/fs/aufs/fhsm.c linux/fs/aufs/fhsm.c
 +}
 diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 --- /usr/share/empty/fs/aufs/file.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/file.c       2020-01-27 10:57:18.172204883 +0100
-@@ -0,0 +1,863 @@
++++ linux/fs/aufs/file.c       2020-12-15 14:10:58.918023162 +0100
+@@ -0,0 +1,867 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2020 Junjiro R. Okajima
@@ -14926,6 +14849,10 @@ diff -urN /usr/share/empty/fs/aufs/file.c linux/fs/aufs/file.c
 +
 +/* they will never be called. */
 +#ifdef CONFIG_AUFS_DEBUG
++/*
++void aufs_readahead(struct readahead_control *)
++{ AuUnsupport(); }
++*/
 +static int aufs_write_begin(struct file *file, struct address_space *mapping,
 +                          loff_t pos, unsigned len, unsigned flags,
 +                          struct page **pagep, void **fsdata)
@@ -15498,8 +15425,8 @@ diff -urN /usr/share/empty/fs/aufs/finfo.c linux/fs/aufs/finfo.c
 +}
 diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 --- /usr/share/empty/fs/aufs/f_op.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/f_op.c       2020-01-27 10:57:18.172204883 +0100
-@@ -0,0 +1,819 @@
++++ linux/fs/aufs/f_op.c       2020-12-15 14:10:58.914689728 +0100
+@@ -0,0 +1,762 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2020 Junjiro R. Okajima
@@ -15744,34 +15671,6 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      fput(h_file);
 +}
 +
-+static ssize_t aufs_read(struct file *file, char __user *buf, size_t count,
-+                       loff_t *ppos)
-+{
-+      ssize_t err;
-+      struct inode *inode;
-+      struct file *h_file;
-+      struct super_block *sb;
-+
-+      inode = file_inode(file);
-+      sb = inode->i_sb;
-+      si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW);
-+
-+      h_file = au_read_pre(file, /*keep_fi*/0, /*lsc*/0);
-+      err = PTR_ERR(h_file);
-+      if (IS_ERR(h_file))
-+              goto out;
-+
-+      /* filedata may be obsoleted by concurrent copyup, but no problem */
-+      err = vfsub_read_u(h_file, buf, count, ppos);
-+      /* todo: necessary? */
-+      /* file->f_ra = h_file->f_ra; */
-+      au_read_post(inode, h_file);
-+
-+out:
-+      si_read_unlock(sb);
-+      return err;
-+}
-+
 +/*
 + * todo: very ugly
 + * it locks both of i_mutex and si_rwsem for read in safe.
@@ -15794,33 +15693,6 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +      }
 +}
 +
-+static ssize_t aufs_write(struct file *file, const char __user *ubuf,
-+                        size_t count, loff_t *ppos)
-+{
-+      ssize_t err;
-+      struct au_write_pre wpre;
-+      struct inode *inode;
-+      struct file *h_file;
-+      char __user *buf = (char __user *)ubuf;
-+
-+      inode = file_inode(file);
-+      au_mtx_and_read_lock(inode);
-+
-+      wpre.lsc = 0;
-+      h_file = au_write_pre(file, /*do_ready*/1, &wpre);
-+      err = PTR_ERR(h_file);
-+      if (IS_ERR(h_file))
-+              goto out;
-+
-+      err = vfsub_write_u(h_file, buf, count, ppos);
-+      au_write_post(inode, h_file, &wpre, err);
-+
-+out:
-+      si_read_unlock(inode->i_sb);
-+      inode_unlock(inode);
-+      return err;
-+}
-+
 +static ssize_t au_do_iter(struct file *h_file, int rw, struct kiocb *kio,
 +                        struct iov_iter *iov_iter)
 +{
@@ -16290,8 +16162,6 @@ diff -urN /usr/share/empty/fs/aufs/f_op.c linux/fs/aufs/f_op.c
 +
 +      .llseek         = default_llseek,
 +
-+      .read           = aufs_read,
-+      .write          = aufs_write,
 +      .read_iter      = aufs_read_iter,
 +      .write_iter     = aufs_write_iter,
 +
@@ -16795,7 +16665,7 @@ diff -urN /usr/share/empty/fs/aufs/hbl.h linux/fs/aufs/hbl.h
 +#endif /* __AUFS_HBL_H__ */
 diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 --- /usr/share/empty/fs/aufs/hfsnotify.c       1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/hfsnotify.c  2020-01-27 10:57:18.172204883 +0100
++++ linux/fs/aufs/hfsnotify.c  2020-12-15 14:10:58.918023162 +0100
 @@ -0,0 +1,288 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
@@ -16960,7 +16830,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 +
 +static int au_hfsn_handle_event(struct fsnotify_group *group,
 +                              u32 mask, const void *data, int data_type,
-+                              struct inode *inode,
++                              struct inode *dir,
 +                              const struct qstr *file_name, u32 cookie,
 +                              struct fsnotify_iter_info *iter_info)
 +{
@@ -16977,7 +16847,7 @@ diff -urN /usr/share/empty/fs/aufs/hfsnotify.c linux/fs/aufs/hfsnotify.c
 +      if (mask & (FS_IN_IGNORED | FS_UNMOUNT))
 +              goto out;
 +
-+      h_dir = inode;
++      h_dir = dir;
 +      h_inode = NULL;
 +#ifdef AuDbgHnotify
 +      au_debug_on();
@@ -30487,8 +30357,8 @@ diff -urN /usr/share/empty/fs/aufs/super.c linux/fs/aufs/super.c
 +};
 diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 --- /usr/share/empty/fs/aufs/super.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/super.h      2020-01-27 10:57:18.178871751 +0100
-@@ -0,0 +1,589 @@
++++ linux/fs/aufs/super.h      2020-12-15 14:10:58.918023162 +0100
+@@ -0,0 +1,587 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +/*
 + * Copyright (C) 2005-2020 Junjiro R. Okajima
@@ -30622,8 +30492,6 @@ diff -urN /usr/share/empty/fs/aufs/super.h linux/fs/aufs/super.h
 +      unsigned int            si_mntflags;
 +
 +      /* external inode number (bitmap and translation table) */
-+      vfs_readf_t             si_xread;
-+      vfs_writef_t            si_xwrite;
 +      loff_t                  si_ximaxent;    /* max entries in a xino */
 +
 +      struct file             *si_xib;
@@ -32714,8 +32582,8 @@ diff -urN /usr/share/empty/fs/aufs/vdir.c linux/fs/aufs/vdir.c
 +}
 diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 --- /usr/share/empty/fs/aufs/vfsub.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/vfsub.c      2020-08-03 09:14:46.095748745 +0200
-@@ -0,0 +1,895 @@
++++ linux/fs/aufs/vfsub.c      2020-12-15 14:10:58.921356596 +0100
+@@ -0,0 +1,885 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2020 Junjiro R. Okajima
@@ -33231,22 +33099,17 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +      return err;
 +}
 +
-+/* todo: kernel_read()? */
 +ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count,
 +                   loff_t *ppos)
 +{
 +      ssize_t err;
-+      mm_segment_t oldfs;
-+      union {
-+              void *k;
-+              char __user *u;
-+      } buf;
 +
-+      buf.k = kbuf;
-+      oldfs = get_fs();
-+      set_fs(KERNEL_DS);
-+      err = vfsub_read_u(file, buf.u, count, ppos);
-+      set_fs(oldfs);
++      lockdep_off();
++      err = kernel_read(file, kbuf, count, ppos);
++      lockdep_on();
++      AuTraceErr(err);
++      if (err >= 0)
++              vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/
 +      return err;
 +}
 +
@@ -33266,17 +33129,12 @@ diff -urN /usr/share/empty/fs/aufs/vfsub.c linux/fs/aufs/vfsub.c
 +ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos)
 +{
 +      ssize_t err;
-+      mm_segment_t oldfs;
-+      union {
-+              void *k;
-+              const char __user *u;
-+      } buf;
 +
-+      buf.k = kbuf;
-+      oldfs = get_fs();
-+      set_fs(KERNEL_DS);
-+      err = vfsub_write_u(file, buf.u, count, ppos);
-+      set_fs(oldfs);
++      lockdep_off();
++      err = kernel_write(file, kbuf, count, ppos);
++      lockdep_on();
++      if (err >= 0)
++              vfsub_update_h_iattr(&file->f_path, /*did*/NULL); /*ignore*/
 +      return err;
 +}
 +
@@ -36790,8 +36648,8 @@ diff -urN /usr/share/empty/fs/aufs/xattr.c linux/fs/aufs/xattr.c
 +}
 diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 --- /usr/share/empty/fs/aufs/xino.c    1970-01-01 01:00:00.000000000 +0100
-+++ linux/fs/aufs/xino.c       2020-04-03 08:16:49.834195677 +0200
-@@ -0,0 +1,1966 @@
++++ linux/fs/aufs/xino.c       2020-12-15 14:10:58.924690030 +0100
+@@ -0,0 +1,1925 @@
 +// SPDX-License-Identifier: GPL-2.0
 +/*
 + * Copyright (C) 2005-2020 Junjiro R. Okajima
@@ -37454,8 +37312,8 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      ino_t h_ino, ino;
 +};
 +
-+static int au_xino_do_write(vfs_writef_t write, struct file *file,
-+                          struct au_xi_calc *calc, ino_t ino);
++static int au_xino_do_write(struct file *file, struct au_xi_calc *calc,
++                          ino_t ino);
 +
 +static void au_xino_call_do_new_async(void *args)
 +{
@@ -37484,7 +37342,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +
 +      file = au_xino_file(br->br_xino, a->calc.idx);
 +      AuDebugOn(!file);
-+      err = au_xino_do_write(sbi->si_xwrite, file, &a->calc, a->ino);
++      err = au_xino_do_write(file, &a->calc, a->ino);
 +      if (unlikely(err)) {
 +              AuIOErr("err %d\n", err);
 +              goto out;
@@ -37585,7 +37443,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +              return 0; /* no xino */
 +
 +      sbinfo = au_sbi(sb);
-+      sz = xino_fread(sbinfo->si_xread, file, ino, sizeof(*ino), &calc.pos);
++      sz = xino_fread(file, ino, sizeof(*ino), &calc.pos);
 +      if (sz == sizeof(*ino))
 +              return 0; /* success */
 +
@@ -37597,12 +37455,12 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      return err;
 +}
 +
-+static int au_xino_do_write(vfs_writef_t write, struct file *file,
-+                          struct au_xi_calc *calc, ino_t ino)
++static int au_xino_do_write(struct file *file, struct au_xi_calc *calc,
++                          ino_t ino)
 +{
 +      ssize_t sz;
 +
-+      sz = xino_fwrite(write, file, &ino, sizeof(ino), &calc->pos);
++      sz = xino_fwrite(file, &ino, sizeof(ino), &calc->pos);
 +      if (sz == sizeof(ino))
 +              return 0; /* success */
 +
@@ -37652,7 +37510,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +              goto out;
 +      }
 +
-+      err = au_xino_do_write(au_sbi(sb)->si_xwrite, file, &calc, ino);
++      err = au_xino_do_write(file, &calc, ino);
 +      if (!err) {
 +              br = au_sbr(sb, bindex);
 +              if (au_opt_test(mnt_flags, TRUNC_XINO)
@@ -37666,40 +37524,27 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      return -EIO;
 +}
 +
-+static ssize_t xino_fread_wkq(vfs_readf_t func, struct file *file, void *buf,
-+                            size_t size, loff_t *pos);
++static ssize_t xino_fread_wkq(struct file *file, void *buf, size_t size,
++                            loff_t *pos);
 +
 +/* todo: unnecessary to support mmap_sem since kernel-space? */
-+ssize_t xino_fread(vfs_readf_t func, struct file *file, void *kbuf, size_t size,
-+                 loff_t *pos)
++ssize_t xino_fread(struct file *file, void *kbuf, size_t size, loff_t *pos)
 +{
 +      ssize_t err;
-+      mm_segment_t oldfs;
-+      union {
-+              void *k;
-+              char __user *u;
-+      } buf;
 +      int i;
 +      const int prevent_endless = 10;
 +
 +      i = 0;
-+      buf.k = kbuf;
-+      oldfs = get_fs();
-+      set_fs(KERNEL_DS);
 +      do {
-+              err = func(file, buf.u, size, pos);
++              err = vfsub_read_k(file, kbuf, size, pos);
 +              if (err == -EINTR
 +                  && !au_wkq_test()
 +                  && fatal_signal_pending(current)) {
-+                      set_fs(oldfs);
-+                      err = xino_fread_wkq(func, file, kbuf, size, pos);
++                      err = xino_fread_wkq(file, kbuf, size, pos);
 +                      BUG_ON(err == -EINTR);
-+                      oldfs = get_fs();
-+                      set_fs(KERNEL_DS);
 +              }
 +      } while (i++ < prevent_endless
 +               && (err == -EAGAIN || err == -EINTR));
-+      set_fs(oldfs);
 +
 +#if 0 /* reserved for future use */
 +      if (err > 0)
@@ -37711,7 +37556,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +
 +struct xino_fread_args {
 +      ssize_t *errp;
-+      vfs_readf_t func;
 +      struct file *file;
 +      void *buf;
 +      size_t size;
@@ -37721,17 +37565,16 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +static void call_xino_fread(void *args)
 +{
 +      struct xino_fread_args *a = args;
-+      *a->errp = xino_fread(a->func, a->file, a->buf, a->size, a->pos);
++      *a->errp = xino_fread(a->file, a->buf, a->size, a->pos);
 +}
 +
-+static ssize_t xino_fread_wkq(vfs_readf_t func, struct file *file, void *buf,
-+                            size_t size, loff_t *pos)
++static ssize_t xino_fread_wkq(struct file *file, void *buf, size_t size,
++                            loff_t *pos)
 +{
 +      ssize_t err;
 +      int wkq_err;
 +      struct xino_fread_args args = {
 +              .errp   = &err,
-+              .func   = func,
 +              .file   = file,
 +              .buf    = buf,
 +              .size   = size,
@@ -37745,39 +37588,27 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      return err;
 +}
 +
-+static ssize_t xino_fwrite_wkq(vfs_writef_t func, struct file *file, void *buf,
-+                             size_t size, loff_t *pos);
++static ssize_t xino_fwrite_wkq(struct file *file, void *buf, size_t size,
++                             loff_t *pos);
 +
-+static ssize_t do_xino_fwrite(vfs_writef_t func, struct file *file, void *kbuf,
-+                            size_t size, loff_t *pos)
++static ssize_t do_xino_fwrite(struct file *file, void *kbuf, size_t size,
++                            loff_t *pos)
 +{
 +      ssize_t err;
-+      mm_segment_t oldfs;
-+      union {
-+              void *k;
-+              const char __user *u;
-+      } buf;
 +      int i;
 +      const int prevent_endless = 10;
 +
 +      i = 0;
-+      buf.k = kbuf;
-+      oldfs = get_fs();
-+      set_fs(KERNEL_DS);
 +      do {
-+              err = func(file, buf.u, size, pos);
++              err = vfsub_write_k(file, kbuf, size, pos);
 +              if (err == -EINTR
 +                  && !au_wkq_test()
 +                  && fatal_signal_pending(current)) {
-+                      set_fs(oldfs);
-+                      err = xino_fwrite_wkq(func, file, kbuf, size, pos);
++                      err = xino_fwrite_wkq(file, kbuf, size, pos);
 +                      BUG_ON(err == -EINTR);
-+                      oldfs = get_fs();
-+                      set_fs(KERNEL_DS);
 +              }
 +      } while (i++ < prevent_endless
 +               && (err == -EAGAIN || err == -EINTR));
-+      set_fs(oldfs);
 +
 +#if 0 /* reserved for future use */
 +      if (err > 0)
@@ -37789,7 +37620,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +
 +struct do_xino_fwrite_args {
 +      ssize_t *errp;
-+      vfs_writef_t func;
 +      struct file *file;
 +      void *buf;
 +      size_t size;
@@ -37799,17 +37629,16 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +static void call_do_xino_fwrite(void *args)
 +{
 +      struct do_xino_fwrite_args *a = args;
-+      *a->errp = do_xino_fwrite(a->func, a->file, a->buf, a->size, a->pos);
++      *a->errp = do_xino_fwrite(a->file, a->buf, a->size, a->pos);
 +}
 +
-+static ssize_t xino_fwrite_wkq(vfs_writef_t func, struct file *file, void *buf,
-+                             size_t size, loff_t *pos)
++static ssize_t xino_fwrite_wkq(struct file *file, void *buf, size_t size,
++                             loff_t *pos)
 +{
 +      ssize_t err;
 +      int wkq_err;
 +      struct do_xino_fwrite_args args = {
 +              .errp   = &err,
-+              .func   = func,
 +              .file   = file,
 +              .buf    = buf,
 +              .size   = size,
@@ -37827,18 +37656,17 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      return err;
 +}
 +
-+ssize_t xino_fwrite(vfs_writef_t func, struct file *file, void *buf,
-+                  size_t size, loff_t *pos)
++ssize_t xino_fwrite(struct file *file, void *buf, size_t size, loff_t *pos)
 +{
 +      ssize_t err;
 +
 +      if (rlimit(RLIMIT_FSIZE) == RLIM_INFINITY) {
 +              lockdep_off();
-+              err = do_xino_fwrite(func, file, buf, size, pos);
++              err = do_xino_fwrite(file, buf, size, pos);
 +              lockdep_on();
 +      } else {
 +              lockdep_off();
-+              err = xino_fwrite_wkq(func, file, buf, size, pos);
++              err = xino_fwrite_wkq(file, buf, size, pos);
 +              lockdep_on();
 +      }
 +
@@ -37889,17 +37717,17 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      p = sbinfo->si_xib_buf;
 +      pos = sbinfo->si_xib_last_pindex;
 +      pos *= PAGE_SIZE;
-+      sz = xino_fwrite(sbinfo->si_xwrite, xib, p, PAGE_SIZE, &pos);
++      sz = xino_fwrite(xib, p, PAGE_SIZE, &pos);
 +      if (unlikely(sz != PAGE_SIZE))
 +              goto out;
 +
 +      pos = pindex;
 +      pos *= PAGE_SIZE;
 +      if (vfsub_f_size_read(xib) >= pos + PAGE_SIZE)
-+              sz = xino_fread(sbinfo->si_xread, xib, p, PAGE_SIZE, &pos);
++              sz = xino_fread(xib, p, PAGE_SIZE, &pos);
 +      else {
 +              memset(p, 0, PAGE_SIZE);
-+              sz = xino_fwrite(sbinfo->si_xwrite, xib, p, PAGE_SIZE, &pos);
++              sz = xino_fwrite(xib, p, PAGE_SIZE, &pos);
 +      }
 +      if (sz == PAGE_SIZE) {
 +              sbinfo->si_xib_last_pindex = pindex;
@@ -37950,7 +37778,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      unsigned long pindex;
 +      loff_t pos, pend;
 +      struct au_sbinfo *sbinfo;
-+      vfs_readf_t func;
 +      ino_t *ino;
 +      unsigned long *p;
 +
@@ -37958,11 +37785,10 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      sbinfo = au_sbi(sb);
 +      MtxMustLock(&sbinfo->si_xib_mtx);
 +      p = sbinfo->si_xib_buf;
-+      func = sbinfo->si_xread;
 +      pend = vfsub_f_size_read(file);
 +      pos = 0;
 +      while (pos < pend) {
-+              sz = xino_fread(func, file, page, PAGE_SIZE, &pos);
++              sz = xino_fread(file, page, PAGE_SIZE, &pos);
 +              err = sz;
 +              if (unlikely(sz <= 0))
 +                      goto out;
@@ -38051,7 +37877,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      p = sbinfo->si_xib_buf;
 +      memset(p, 0, PAGE_SIZE);
 +      pos = 0;
-+      sz = xino_fwrite(sbinfo->si_xwrite, sbinfo->si_xib, p, PAGE_SIZE, &pos);
++      sz = xino_fwrite(sbinfo->si_xib, p, PAGE_SIZE, &pos);
 +      if (unlikely(sz != PAGE_SIZE)) {
 +              err = sz;
 +              AuIOErr("err %d\n", err);
@@ -38190,7 +38016,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      SiMustWriteLock(sb);
 +
 +      sbinfo = au_sbi(sb);
-+      /* unnecessary to clear sbinfo->si_xread and ->si_xwrite */
 +      if (sbinfo->si_xib)
 +              fput(sbinfo->si_xib);
 +      sbinfo->si_xib = NULL;
@@ -38217,8 +38042,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      if (sbinfo->si_xib)
 +              fput(sbinfo->si_xib);
 +      sbinfo->si_xib = file;
-+      sbinfo->si_xread = vfs_readf(file);
-+      sbinfo->si_xwrite = vfs_writef(file);
 +      xi_sb = file_inode(file)->i_sb;
 +      sbinfo->si_ximaxent = xi_sb->s_maxbytes;
 +      if (unlikely(sbinfo->si_ximaxent < PAGE_SIZE)) {
@@ -38239,8 +38062,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      sbinfo->si_xib_next_bit = 0;
 +      if (vfsub_f_size_read(file) < PAGE_SIZE) {
 +              pos = 0;
-+              err = xino_fwrite(sbinfo->si_xwrite, file, sbinfo->si_xib_buf,
-+                                PAGE_SIZE, &pos);
++              err = xino_fwrite(file, sbinfo->si_xib_buf, PAGE_SIZE, &pos);
 +              if (unlikely(err != PAGE_SIZE))
 +                      goto out_free;
 +      }
@@ -38291,7 +38113,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +}
 +
 +struct au_xino_do_set_br {
-+      vfs_writef_t writef;
 +      struct au_branch *br;
 +      ino_t h_ino;
 +      aufs_bindex_t bshared;
@@ -38333,7 +38154,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +              goto out;
 +      AuDebugOn(!file);
 +
-+      err = au_xino_do_write(args->writef, file, &calc, AUFS_ROOT_INO);
++      err = au_xino_do_write(file, &calc, AUFS_ROOT_INO);
 +      if (unlikely(err))
 +              au_xino_put(br);
 +
@@ -38353,7 +38174,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +
 +      bbot = au_sbbot(sb);
 +      inode = d_inode(sb->s_root);
-+      args.writef = au_sbi(sb)->si_xwrite;
 +      for (bindex = 0; bindex <= bbot; bindex++) {
 +              args.h_ino = au_h_iptr(inode, bindex)->i_ino;
 +              args.br = au_sbr(sb, bindex);
@@ -38508,7 +38328,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +              .br     = br
 +      };
 +
-+      args.writef = au_sbi(sb)->si_xwrite;
 +      args.bshared = sbr_find_shared(sb, /*btop*/0, au_sbbot(sb),
 +                                     au_br_sb(br));
 +      err = au_xino_do_set_br(sb, base, &args);
@@ -38592,7 +38411,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      struct au_hinode *hi;
 +      struct inode *h_inode;
 +      struct au_branch *br;
-+      vfs_writef_t xwrite;
 +      struct au_xi_calc calc;
 +      struct file *file;
 +
@@ -38614,7 +38432,6 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +      if (bindex < 0)
 +              return;
 +
-+      xwrite = au_sbi(sb)->si_xwrite;
 +      try_trunc = !!au_opt_test(mnt_flags, TRUNC_XINO);
 +      hi = au_hinode(iinfo, bindex);
 +      bbot = iinfo->ii_bbot;
@@ -38635,7 +38452,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +              if (IS_ERR_OR_NULL(file))
 +                      continue;
 +
-+              err = au_xino_do_write(xwrite, file, &calc, /*ino*/0);
++              err = au_xino_do_write(file, &calc, /*ino*/0);
 +              if (!err && try_trunc
 +                  && au_test_fs_trunc_xino(au_br_sb(br)))
 +                      xino_try_trunc(sb, br);
@@ -38760,7 +38577,7 @@ diff -urN /usr/share/empty/fs/aufs/xino.c linux/fs/aufs/xino.c
 +}
 diff -urN /usr/share/empty/include/uapi/linux/aufs_type.h linux/include/uapi/linux/aufs_type.h
 --- /usr/share/empty/include/uapi/linux/aufs_type.h    1970-01-01 01:00:00.000000000 +0100
-+++ linux/include/uapi/linux/aufs_type.h       2020-08-03 09:14:46.095748745 +0200
++++ linux/include/uapi/linux/aufs_type.h       2020-10-14 08:51:27.819581640 +0200
 @@ -0,0 +1,452 @@
 +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 +/*
@@ -39291,16 +39108,16 @@ index 0479902a0cd50..758c8ee4d4e6b 100644
        return error;
  }
  
-@@ -973,7 +995,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode
                        struct block_device *bdev,
-                         const struct loop_config *config)
+@@ -973,7 +995,7 @@ static void loop_update_rotational(struct loop_device *lo)
static int loop_set_fd(struct loop_device *lo, fmode_t mode,
+                      struct block_device *bdev, unsigned int arg)
  {
 -      struct file     *file;
 +      struct file     *file, *f, *virt_file = NULL;
        struct inode    *inode;
        struct address_space *mapping;
        struct block_device *claimed_bdev = NULL;
-@@ -989,6 +1011,12 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
+@@ -989,6 +1011,12 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
        file = fget(arg);
        if (!file)
                goto out;
@@ -39313,7 +39130,7 @@ index 0479902a0cd50..758c8ee4d4e6b 100644
  
        /*
         * If we don't hold exclusive handle for the device, upgrade to it
-@@ -1037,6 +1065,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode
+@@ -1079,6 +1079,7 @@ static int loop_configure(struct loop_de
        lo->use_dio = lo->lo_flags & LO_FLAGS_DIRECT_IO;
        lo->lo_device = bdev;
        lo->lo_backing_file = file;
@@ -39321,7 +39138,7 @@ index 0479902a0cd50..758c8ee4d4e6b 100644
        lo->old_gfp_mask = mapping_gfp_mask(mapping);
        mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
  
-@@ -1090,6 +1119,8 @@ static int loop_configure(struct loop_device *lo, fmode_t mode
+@@ -1090,6 +1119,8 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
                bd_abort_claiming(bdev, claimed_bdev, loop_set_fd);
  out_putf:
        fput(file);
index 486cee1ea72baf8c1b7f32965cf034741e79b81d..d20e4ca1676c853f71e5527bdd503c84ce4f2623 100644 (file)
@@ -71,7 +71,7 @@
 %define                have_pcmcia     0
 %endif
 
-%define                rel             0.1
+%define                rel             1
 %define                basever         5.10
 %define                postver         .0
 
This page took 0.201395 seconds and 4 git commands to generate.