From 267ee8d382427a207940355e257466c953e6a6e6 Mon Sep 17 00:00:00 2001 From: Yang Sheng Date: Wed, 14 Mar 2018 16:10:10 +0800 Subject: [PATCH] LU-10565 osd: move ext4_tranfer_project to osd 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 Change-Id: I6e5acdf68ab9f7bc964d79f29132cee45e2fd3ac Reviewed-by: Wang Shilong Signed-off-by: Minh Diep Reviewed-on: https://review.whamcloud.com/33992 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Yang Sheng Reviewed-by: Oleg Drokin --- .../kernel_patches/patches/rhel7/ext4-misc.patch | 3 +- .../patches/rhel7/ext4-projid-xfs-ioctls.patch | 62 +--------------------- lustre/osd-ldiskfs/osd_handler.c | 56 ++++++++++++++++++- 3 files changed, 57 insertions(+), 64 deletions(-) diff --git a/ldiskfs/kernel_patches/patches/rhel7/ext4-misc.patch b/ldiskfs/kernel_patches/patches/rhel7/ext4-misc.patch index 1af746a..f19455d 100644 --- a/ldiskfs/kernel_patches/patches/rhel7/ext4-misc.patch +++ b/ldiskfs/kernel_patches/patches/rhel7/ext4-misc.patch @@ -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 diff --git a/ldiskfs/kernel_patches/patches/rhel7/ext4-projid-xfs-ioctls.patch b/ldiskfs/kernel_patches/patches/rhel7/ext4-projid-xfs-ioctls.patch index 5e7939a..0af277b 100644 --- a/ldiskfs/kernel_patches/patches/rhel7/ext4-projid-xfs-ioctls.patch +++ b/ldiskfs/kernel_patches/patches/rhel7/ext4-projid-xfs-ioctls.patch @@ -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) +{ diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 97f2e8c..9780d24 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -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 " -- 1.8.3.1