Merge branch 'for-5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/dennis/percpu
[sfrench/cifs-2.6.git] / fs / xfs / xfs_ioctl.c
index ec3c6c401ee74224ba8599dc06682f49b17f6bdd..d7dfc13f30f5a7a9828d7467f18f7737f8e40f79 100644 (file)
@@ -33,6 +33,8 @@
 #include "xfs_fsmap.h"
 #include "scrub/xfs_scrub.h"
 #include "xfs_sb.h"
+#include "xfs_ag.h"
+#include "xfs_health.h"
 
 #include <linux/capability.h>
 #include <linux/cred.h>
@@ -786,24 +788,43 @@ xfs_ioc_fsgeometry(
 {
        struct xfs_fsop_geom    fsgeo;
        size_t                  len;
-       int                     error;
 
-       error = xfs_fs_geometry(&mp->m_sb, &fsgeo, struct_version);
-       if (error)
-               return error;
+       xfs_fs_geometry(&mp->m_sb, &fsgeo, struct_version);
 
        if (struct_version <= 3)
                len = sizeof(struct xfs_fsop_geom_v1);
        else if (struct_version == 4)
                len = sizeof(struct xfs_fsop_geom_v4);
-       else
+       else {
+               xfs_fsop_geom_health(mp, &fsgeo);
                len = sizeof(fsgeo);
+       }
 
        if (copy_to_user(arg, &fsgeo, len))
                return -EFAULT;
        return 0;
 }
 
+STATIC int
+xfs_ioc_ag_geometry(
+       struct xfs_mount        *mp,
+       void                    __user *arg)
+{
+       struct xfs_ag_geometry  ageo;
+       int                     error;
+
+       if (copy_from_user(&ageo, arg, sizeof(ageo)))
+               return -EFAULT;
+
+       error = xfs_ag_get_geometry(mp, ageo.ag_number, &ageo);
+       if (error)
+               return error;
+
+       if (copy_to_user(arg, &ageo, sizeof(ageo)))
+               return -EFAULT;
+       return 0;
+}
+
 /*
  * Linux extended inode flags interface.
  */
@@ -1129,7 +1150,7 @@ xfs_ioctl_setattr_get_trans(
 
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp);
        if (error)
-               return ERR_PTR(error);
+               goto out_unlock;
 
        xfs_ilock(ip, XFS_ILOCK_EXCL);
        xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL | join_flags);
@@ -1930,6 +1951,9 @@ xfs_file_ioctl(
        case XFS_IOC_FSGEOMETRY:
                return xfs_ioc_fsgeometry(mp, arg, 5);
 
+       case XFS_IOC_AG_GEOMETRY:
+               return xfs_ioc_ag_geometry(mp, arg);
+
        case XFS_IOC_GETVERSION:
                return put_user(inode->i_generation, (int __user *)arg);
 
@@ -2019,9 +2043,7 @@ xfs_file_ioctl(
        case XFS_IOC_FSCOUNTS: {
                xfs_fsop_counts_t out;
 
-               error = xfs_fs_counts(mp, &out);
-               if (error)
-                       return error;
+               xfs_fs_counts(mp, &out);
 
                if (copy_to_user(arg, &out, sizeof(out)))
                        return -EFAULT;