Whamcloud - gitweb
LU-10565 osd: move ext4_tranfer_project to osd 92/33992/7
authorYang Sheng <yang.sheng@intel.com>
Wed, 14 Mar 2018 08:10:10 +0000 (16:10 +0800)
committerOleg Drokin <green@whamcloud.com>
Sat, 23 Feb 2019 05:09:53 +0000 (05:09 +0000)
Move ext4_tranfer_project from ldiskfs to osd.
Since upstream has accepted other projid patches
except this part.

Lustre-change: https://review.whamcloud.com/31647
Lustre-commit: d57fcaf893bcaa5a08c298bb421f41bd628add0a

Signed-off-by: Yang Sheng <yang.sheng@intel.com>
Change-Id: I6e5acdf68ab9f7bc964d79f29132cee45e2fd3ac
Reviewed-by: Wang Shilong <wshilong@ddn.com>
Signed-off-by: Minh Diep <mdiep@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/33992
Tested-by: Jenkins
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Yang Sheng <ys@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
ldiskfs/kernel_patches/patches/rhel7/ext4-misc.patch
ldiskfs/kernel_patches/patches/rhel7/ext4-projid-xfs-ioctls.patch
lustre/osd-ldiskfs/osd_handler.c

index 1af746a..f19455d 100644 (file)
@@ -98,7 +98,7 @@ Index: linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/inode.c
 ===================================================================
 --- linux-3.10.0-123.13.2.el7.x86_64.orig/fs/ext4/inode.c
 +++ linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/inode.c
-@@ -5281,3 +5281,17 @@ out:
+@@ -5281,3 +5281,18 @@ out:
        sb_end_pagefault(inode->i_sb);
        return ret;
  }
@@ -116,6 +116,7 @@ Index: linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/inode.c
 +EXPORT_SYMBOL(__ext4_handle_dirty_metadata);
 +EXPORT_SYMBOL(__ext4_std_error);
 +EXPORT_SYMBOL(ext4fs_dirhash);
++EXPORT_SYMBOL(ext4_get_inode_loc);
 Index: linux-3.10.0-123.13.2.el7.x86_64/fs/ext4/mballoc.c
 ===================================================================
 --- linux-3.10.0-123.13.2.el7.x86_64.orig/fs/ext4/mballoc.c
index 5e7939a..0af277b 100644 (file)
@@ -61,14 +61,6 @@ index ce3b85f..29db502 100644
  #if defined(__KERNEL__) && defined(CONFIG_COMPAT)
  /*
   * ioctl commands in 32 bit emulation
-@@ -2347,6 +2392,7 @@ extern int ext4_ind_remove_space(handle_t *handle, struct inode *inode,
- /* ioctl.c */
- extern long ext4_ioctl(struct file *, unsigned int, unsigned long);
- extern long ext4_compat_ioctl(struct file *, unsigned int, unsigned long);
-+extern int ext4_transfer_project(struct inode *inode, __u32 projid);
- /* migrate.c */
- extern int ext4_ext_migrate(struct inode *);
 diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
 index 70c66d3..276d33d 100644
 --- a/fs/ext4/ioctl.c
@@ -81,7 +73,7 @@ index 70c66d3..276d33d 100644
  #include "ext4_jbd2.h"
  #include "ext4.h"
  
-@@ -198,6 +199,294 @@ journal_err_out:
+@@ -198,6 +199,242 @@ journal_err_out:
        return err;
  }
  
@@ -270,58 +262,6 @@ index 70c66d3..276d33d 100644
 +
 +}
 +
-+int ext4_transfer_project(struct inode *inode, __u32 projid)
-+{
-+      struct super_block *sb = inode->i_sb;
-+      struct ext4_inode_info *ei = EXT4_I(inode);
-+      int err;
-+      kprojid_t kprojid;
-+      struct ext4_iloc iloc;
-+      struct ext4_inode *raw_inode;
-+      struct dquot *transfer_to[EXT4_MAXQUOTAS] = { };
-+
-+      if (!EXT4_HAS_RO_COMPAT_FEATURE(sb,
-+                      EXT4_FEATURE_RO_COMPAT_PROJECT)) {
-+              BUG_ON(__kprojid_val(EXT4_I(inode)->i_projid)
-+                     != EXT4_DEF_PROJID);
-+              if (projid != EXT4_DEF_PROJID)
-+                      return -EOPNOTSUPP;
-+              else
-+                      return 0;
-+      }
-+
-+      if (EXT4_INODE_SIZE(sb) <= EXT4_GOOD_OLD_INODE_SIZE)
-+              return -EOPNOTSUPP;
-+
-+      kprojid = make_kprojid(&init_user_ns, (projid_t)projid);
-+      if (projid_eq(kprojid, EXT4_I(inode)->i_projid))
-+              return 0;
-+
-+      err = ext4_get_inode_loc(inode, &iloc);
-+      if (err)
-+              return err;
-+
-+      raw_inode = ext4_raw_inode(&iloc);
-+      if (!EXT4_FITS_IN_INODE(raw_inode, ei, i_projid)) {
-+              err = -EOVERFLOW;
-+              brelse(iloc.bh);
-+              return err;
-+      }
-+      brelse(iloc.bh);
-+
-+      dquot_initialize(inode);
-+      transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
-+      if (transfer_to[PRJQUOTA]) {
-+              err = __dquot_transfer(inode, transfer_to);
-+              dqput(transfer_to[PRJQUOTA]);
-+              if (err)
-+                      return err;
-+      }
-+
-+      return err;
-+}
-+EXPORT_SYMBOL(ext4_transfer_project);
-+
 +#else
 +static int ext4_ioctl_setproject(struct file *filp, __u32 projid)
 +{
index 97f2e8c..9780d24 100644 (file)
@@ -2619,6 +2619,58 @@ static int osd_inode_setattr(const struct lu_env *env,
        return 0;
 }
 
+#ifdef HAVE_PROJECT_QUOTA
+static int osd_transfer_project(struct inode *inode, __u32 projid)
+{
+       struct super_block *sb = inode->i_sb;
+       struct ldiskfs_inode_info *ei = LDISKFS_I(inode);
+       int err;
+       kprojid_t kprojid;
+       struct ldiskfs_iloc iloc;
+       struct ldiskfs_inode *raw_inode;
+       struct dquot *transfer_to[LDISKFS_MAXQUOTAS] = { };
+
+       if (!ldiskfs_has_feature_project(sb)) {
+               LASSERT(__kprojid_val(LDISKFS_I(inode)->i_projid)
+                       != LDISKFS_DEF_PROJID);
+               if (projid != LDISKFS_DEF_PROJID)
+                       return -EOPNOTSUPP;
+               else
+                       return 0;
+       }
+
+       if (LDISKFS_INODE_SIZE(sb) <= LDISKFS_GOOD_OLD_INODE_SIZE)
+               return -EOPNOTSUPP;
+
+       kprojid = make_kprojid(&init_user_ns, (projid_t)projid);
+       if (projid_eq(kprojid, LDISKFS_I(inode)->i_projid))
+               return 0;
+
+       err = ldiskfs_get_inode_loc(inode, &iloc);
+       if (err)
+               return err;
+
+       raw_inode = ldiskfs_raw_inode(&iloc);
+       if (!LDISKFS_FITS_IN_INODE(raw_inode, ei, i_projid)) {
+               err = -EOVERFLOW;
+               brelse(iloc.bh);
+               return err;
+       }
+       brelse(iloc.bh);
+
+       dquot_initialize(inode);
+       transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
+       if (transfer_to[PRJQUOTA]) {
+               err = __dquot_transfer(inode, transfer_to);
+               dqput(transfer_to[PRJQUOTA]);
+               if (err)
+                       return err;
+       }
+
+       return err;
+}
+#endif
+
 static int osd_quota_transfer(struct inode *inode, const struct lu_attr *attr)
 {
        int rc;
@@ -2649,7 +2701,7 @@ static int osd_quota_transfer(struct inode *inode, const struct lu_attr *attr)
        if (attr->la_valid & LA_PROJID &&
            attr->la_projid != i_projid_read(inode)) {
 #ifdef HAVE_PROJECT_QUOTA
-               rc = ldiskfs_transfer_project(inode, attr->la_projid);
+               rc = osd_transfer_project(inode, attr->la_projid);
 #else
                rc = -ENOTSUPP;
 #endif
@@ -3446,7 +3498,7 @@ static struct inode *osd_create_local_agent_inode(const struct lu_env *env,
 #ifdef HAVE_PROJECT_QUOTA
        if (LDISKFS_I(pobj->oo_inode)->i_flags & LUSTRE_PROJINHERIT_FL &&
            i_projid_read(pobj->oo_inode) != 0) {
-               rc = ldiskfs_transfer_project(local, 0);
+               rc = osd_transfer_project(local, 0);
                if (rc) {
                        CERROR("%s: quota transfer failed: rc = %d. Is project "
                               "quota enforcement enabled on the ldiskfs "