Merge tag 'for_v5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 29 Apr 2021 17:51:29 +0000 (10:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 29 Apr 2021 17:51:29 +0000 (10:51 -0700)
Pull quota, ext2, reiserfs updates from Jan Kara:

 - support for path (instead of device) based quotactl syscall
   (quotactl_path(2))

 - ext2 conversion to kmap_local()

 - other minor cleanups & fixes

* tag 'for_v5.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs:
  fs/reiserfs/journal.c: delete useless variables
  fs/ext2: Replace kmap() with kmap_local_page()
  ext2: Match up ext2_put_page() with ext2_dotdot() and ext2_find_entry()
  fs/ext2/: fix misspellings using codespell tool
  quota: report warning limits for realtime space quotas
  quota: wire up quotactl_path
  quota: Add mountpath based quota support

1  2 
fs/ext2/ext2.h
fs/ext2/namei.c

diff --combined fs/ext2/ext2.h
@@@ -283,6 -283,8 +283,6 @@@ static inline __u32 ext2_mask_flags(umo
  /*
   * ioctl commands
   */
 -#define       EXT2_IOC_GETFLAGS               FS_IOC_GETFLAGS
 -#define       EXT2_IOC_SETFLAGS               FS_IOC_SETFLAGS
  #define       EXT2_IOC_GETVERSION             FS_IOC_GETVERSION
  #define       EXT2_IOC_SETVERSION             FS_IOC_SETVERSION
  #define       EXT2_IOC_GETRSVSZ               _IOR('f', 5, long)
  /*
   * ioctl commands in 32 bit emulation
   */
 -#define EXT2_IOC32_GETFLAGS           FS_IOC32_GETFLAGS
 -#define EXT2_IOC32_SETFLAGS           FS_IOC32_SETFLAGS
  #define EXT2_IOC32_GETVERSION         FS_IOC32_GETVERSION
  #define EXT2_IOC32_SETVERSION         FS_IOC32_SETVERSION
  
@@@ -738,14 -742,16 +738,16 @@@ extern int ext2_add_link (struct dentr
  extern int ext2_inode_by_name(struct inode *dir,
                              const struct qstr *child, ino_t *ino);
  extern int ext2_make_empty(struct inode *, struct inode *);
- extern struct ext2_dir_entry_2 * ext2_find_entry (struct inode *,const struct qstr *, struct page **);
+ extern struct ext2_dir_entry_2 *ext2_find_entry(struct inode *, const struct qstr *,
+                                               struct page **, void **res_page_addr);
  extern int ext2_delete_entry (struct ext2_dir_entry_2 *, struct page *);
  extern int ext2_empty_dir (struct inode *);
- extern struct ext2_dir_entry_2 * ext2_dotdot (struct inode *, struct page **);
- extern void ext2_set_link(struct inode *, struct ext2_dir_entry_2 *, struct page *, struct inode *, int);
- static inline void ext2_put_page(struct page *page)
+ extern struct ext2_dir_entry_2 *ext2_dotdot(struct inode *dir, struct page **p, void **pa);
+ extern void ext2_set_link(struct inode *, struct ext2_dir_entry_2 *, struct page *, void *,
+                         struct inode *, int);
+ static inline void ext2_put_page(struct page *page, void *page_addr)
  {
-       kunmap(page);
+       kunmap_local(page_addr);
        put_page(page);
  }
  
@@@ -768,9 -774,6 +770,9 @@@ extern int ext2_fiemap(struct inode *in
                       u64 start, u64 len);
  
  /* ioctl.c */
 +extern int ext2_fileattr_get(struct dentry *dentry, struct fileattr *fa);
 +extern int ext2_fileattr_set(struct user_namespace *mnt_userns,
 +                           struct dentry *dentry, struct fileattr *fa);
  extern long ext2_ioctl(struct file *, unsigned int, unsigned long);
  extern long ext2_compat_ioctl(struct file *, unsigned int, unsigned long);
  
diff --combined fs/ext2/namei.c
@@@ -281,19 -281,21 +281,21 @@@ static int ext2_unlink(struct inode * d
        struct inode * inode = d_inode(dentry);
        struct ext2_dir_entry_2 * de;
        struct page * page;
+       void *page_addr;
        int err;
  
        err = dquot_initialize(dir);
        if (err)
                goto out;
  
-       de = ext2_find_entry(dir, &dentry->d_name, &page);
+       de = ext2_find_entry(dir, &dentry->d_name, &page, &page_addr);
        if (IS_ERR(de)) {
                err = PTR_ERR(de);
                goto out;
        }
  
        err = ext2_delete_entry (de, page);
+       ext2_put_page(page, page_addr);
        if (err)
                goto out;
  
@@@ -328,8 -330,10 +330,10 @@@ static int ext2_rename (struct user_nam
        struct inode * old_inode = d_inode(old_dentry);
        struct inode * new_inode = d_inode(new_dentry);
        struct page * dir_page = NULL;
+       void *dir_page_addr;
        struct ext2_dir_entry_2 * dir_de = NULL;
        struct page * old_page;
+       void *old_page_addr;
        struct ext2_dir_entry_2 * old_de;
        int err;
  
        if (err)
                goto out;
  
-       old_de = ext2_find_entry(old_dir, &old_dentry->d_name, &old_page);
+       old_de = ext2_find_entry(old_dir, &old_dentry->d_name, &old_page,
+                                &old_page_addr);
        if (IS_ERR(old_de)) {
                err = PTR_ERR(old_de);
                goto out;
  
        if (S_ISDIR(old_inode->i_mode)) {
                err = -EIO;
-               dir_de = ext2_dotdot(old_inode, &dir_page);
+               dir_de = ext2_dotdot(old_inode, &dir_page, &dir_page_addr);
                if (!dir_de)
                        goto out_old;
        }
  
        if (new_inode) {
+               void *page_addr;
                struct page *new_page;
                struct ext2_dir_entry_2 *new_de;
  
                if (dir_de && !ext2_empty_dir (new_inode))
                        goto out_dir;
  
-               new_de = ext2_find_entry(new_dir, &new_dentry->d_name, &new_page);
+               new_de = ext2_find_entry(new_dir, &new_dentry->d_name,
+                                        &new_page, &page_addr);
                if (IS_ERR(new_de)) {
                        err = PTR_ERR(new_de);
                        goto out_dir;
                }
-               ext2_set_link(new_dir, new_de, new_page, old_inode, 1);
+               ext2_set_link(new_dir, new_de, new_page, page_addr, old_inode, 1);
+               ext2_put_page(new_page, page_addr);
                new_inode->i_ctime = current_time(new_inode);
                if (dir_de)
                        drop_nlink(new_inode);
        old_inode->i_ctime = current_time(old_inode);
        mark_inode_dirty(old_inode);
  
-       ext2_delete_entry (old_de, old_page);
+       ext2_delete_entry(old_de, old_page);
  
        if (dir_de) {
                if (old_dir != new_dir)
-                       ext2_set_link(old_inode, dir_de, dir_page, new_dir, 0);
-               else
-                       ext2_put_page(dir_page);
+                       ext2_set_link(old_inode, dir_de, dir_page,
+                                     dir_page_addr, new_dir, 0);
+               ext2_put_page(dir_page, dir_page_addr);
                inode_dec_link_count(old_dir);
        }
-       return 0;
  
+       ext2_put_page(old_page, old_page_addr);
+       return 0;
  
  out_dir:
        if (dir_de)
-               ext2_put_page(dir_page);
+               ext2_put_page(dir_page, dir_page_addr);
  out_old:
-       ext2_put_page(old_page);
+       ext2_put_page(old_page, old_page_addr);
  out:
        return err;
  }
@@@ -427,8 -437,6 +437,8 @@@ const struct inode_operations ext2_dir_
        .get_acl        = ext2_get_acl,
        .set_acl        = ext2_set_acl,
        .tmpfile        = ext2_tmpfile,
 +      .fileattr_get   = ext2_fileattr_get,
 +      .fileattr_set   = ext2_fileattr_set,
  };
  
  const struct inode_operations ext2_special_inode_operations = {