Move ext4_tranfer_project from ldiskfs to osd.
Since upstream has accepted other projid patches
except this part.
Signed-off-by: Yang Sheng <yang.sheng@intel.com>
Change-Id: I6e5acdf68ab9f7bc964d79f29132cee45e2fd3ac
Reviewed-on: https://review.whamcloud.com/31647
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Wang Shilong <wshilong@ddn.com>
Reviewed-by: Bob Glossman <bob.glossman@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
===================================================================
--- 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;
}
+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
#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
#include "ext4_jbd2.h"
#include "ext4.h"
-@@ -198,6 +199,294 @@ journal_err_out:
+@@ -198,6 +199,242 @@ journal_err_out:
return err;
}
+
+}
+
-+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)
+{
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;
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
#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 "