Merge remote-tracking branches 'asoc/topic/ab8500', 'asoc/topic/ac97' and 'asoc/topic...
[firefly-linux-kernel-4.4.55.git] / fs / xfs / xfs_mount.c
index 3507cd0ec4004e37f65ec490e9fb4ea9e6e314f0..fbf0384a466fa25fba334862b0c1762be68ab6d4 100644 (file)
@@ -42,6 +42,7 @@
 #include "xfs_trace.h"
 #include "xfs_icache.h"
 #include "xfs_dinode.h"
+#include "xfs_sysfs.h"
 
 
 #ifdef HAVE_PERCPU_SB
@@ -60,6 +61,8 @@ static DEFINE_MUTEX(xfs_uuid_table_mutex);
 static int xfs_uuid_table_size;
 static uuid_t *xfs_uuid_table;
 
+extern struct kset *xfs_kset;
+
 /*
  * See if the UUID is unique among mounted XFS filesystems.
  * Mount fails if UUID is nil or a FS with the same UUID is already mounted.
@@ -76,7 +79,7 @@ xfs_uuid_mount(
 
        if (uuid_is_nil(uuid)) {
                xfs_warn(mp, "Filesystem has nil UUID - can't mount");
-               return XFS_ERROR(EINVAL);
+               return -EINVAL;
        }
 
        mutex_lock(&xfs_uuid_table_mutex);
@@ -104,7 +107,7 @@ xfs_uuid_mount(
  out_duplicate:
        mutex_unlock(&xfs_uuid_table_mutex);
        xfs_warn(mp, "Filesystem has duplicate UUID %pU - can't mount", uuid);
-       return XFS_ERROR(EINVAL);
+       return -EINVAL;
 }
 
 STATIC void
@@ -173,13 +176,9 @@ xfs_sb_validate_fsb_count(
        ASSERT(PAGE_SHIFT >= sbp->sb_blocklog);
        ASSERT(sbp->sb_blocklog >= BBSHIFT);
 
-#if XFS_BIG_BLKNOS     /* Limited by ULONG_MAX of page cache index */
+       /* Limited by ULONG_MAX of page cache index */
        if (nblocks >> (PAGE_CACHE_SHIFT - sbp->sb_blocklog) > ULONG_MAX)
-               return EFBIG;
-#else                  /* Limited by UINT_MAX of sectors */
-       if (nblocks << (sbp->sb_blocklog - BBSHIFT) > UINT_MAX)
-               return EFBIG;
-#endif
+               return -EFBIG;
        return 0;
 }
 
@@ -250,9 +249,9 @@ xfs_initialize_perag(
                mp->m_flags &= ~XFS_MOUNT_32BITINODES;
 
        if (mp->m_flags & XFS_MOUNT_32BITINODES)
-               index = xfs_set_inode32(mp);
+               index = xfs_set_inode32(mp, agcount);
        else
-               index = xfs_set_inode64(mp);
+               index = xfs_set_inode64(mp, agcount);
 
        if (maxagi)
                *maxagi = index;
@@ -308,15 +307,15 @@ reread:
        if (!bp) {
                if (loud)
                        xfs_warn(mp, "SB buffer read failed");
-               return EIO;
+               return -EIO;
        }
        if (bp->b_error) {
                error = bp->b_error;
                if (loud)
                        xfs_warn(mp, "SB validate failed with error %d.", error);
                /* bad CRC means corrupted metadata */
-               if (error == EFSBADCRC)
-                       error = EFSCORRUPTED;
+               if (error == -EFSBADCRC)
+                       error = -EFSCORRUPTED;
                goto release_buf;
        }
 
@@ -324,7 +323,6 @@ reread:
         * Initialize the mount structure from the superblock.
         */
        xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp));
-       xfs_sb_quota_from_disk(sbp);
 
        /*
         * If we haven't validated the superblock, do so now before we try
@@ -333,7 +331,7 @@ reread:
        if (sbp->sb_magicnum != XFS_SB_MAGIC) {
                if (loud)
                        xfs_warn(mp, "Invalid superblock magic number");
-               error = EINVAL;
+               error = -EINVAL;
                goto release_buf;
        }
 
@@ -344,7 +342,7 @@ reread:
                if (loud)
                        xfs_warn(mp, "device supports %u byte sectors (not %u)",
                                sector_size, sbp->sb_sectsize);
-               error = ENOSYS;
+               error = -ENOSYS;
                goto release_buf;
        }
 
@@ -392,7 +390,7 @@ xfs_update_alignment(xfs_mount_t *mp)
                        xfs_warn(mp,
                "alignment check failed: sunit/swidth vs. blocksize(%d)",
                                sbp->sb_blocksize);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                } else {
                        /*
                         * Convert the stripe unit and width to FSBs.
@@ -402,14 +400,14 @@ xfs_update_alignment(xfs_mount_t *mp)
                                xfs_warn(mp,
                        "alignment check failed: sunit/swidth vs. agsize(%d)",
                                         sbp->sb_agblocks);
-                               return XFS_ERROR(EINVAL);
+                               return -EINVAL;
                        } else if (mp->m_dalign) {
                                mp->m_swidth = XFS_BB_TO_FSBT(mp, mp->m_swidth);
                        } else {
                                xfs_warn(mp,
                        "alignment check failed: sunit(%d) less than bsize(%d)",
                                         mp->m_dalign, sbp->sb_blocksize);
-                               return XFS_ERROR(EINVAL);
+                               return -EINVAL;
                        }
                }
 
@@ -429,7 +427,7 @@ xfs_update_alignment(xfs_mount_t *mp)
                } else {
                        xfs_warn(mp,
        "cannot change alignment: superblock does not support data alignment");
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
        } else if ((mp->m_flags & XFS_MOUNT_NOALIGN) != XFS_MOUNT_NOALIGN &&
                    xfs_sb_version_hasdalign(&mp->m_sb)) {
@@ -556,14 +554,14 @@ xfs_check_sizes(xfs_mount_t *mp)
        d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks);
        if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) {
                xfs_warn(mp, "filesystem size mismatch detected");
-               return XFS_ERROR(EFBIG);
+               return -EFBIG;
        }
        bp = xfs_buf_read_uncached(mp->m_ddev_targp,
                                        d - XFS_FSS_TO_BB(mp, 1),
                                        XFS_FSS_TO_BB(mp, 1), 0, NULL);
        if (!bp) {
                xfs_warn(mp, "last sector read failed");
-               return EIO;
+               return -EIO;
        }
        xfs_buf_relse(bp);
 
@@ -571,14 +569,14 @@ xfs_check_sizes(xfs_mount_t *mp)
                d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks);
                if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) {
                        xfs_warn(mp, "log size mismatch detected");
-                       return XFS_ERROR(EFBIG);
+                       return -EFBIG;
                }
                bp = xfs_buf_read_uncached(mp->m_logdev_targp,
                                        d - XFS_FSB_TO_BB(mp, 1),
                                        XFS_FSB_TO_BB(mp, 1), 0, NULL);
                if (!bp) {
                        xfs_warn(mp, "log device read failed");
-                       return EIO;
+                       return -EIO;
                }
                xfs_buf_relse(bp);
        }
@@ -731,10 +729,15 @@ xfs_mountfs(
 
        xfs_set_maxicount(mp);
 
-       error = xfs_uuid_mount(mp);
+       mp->m_kobj.kobject.kset = xfs_kset;
+       error = xfs_sysfs_init(&mp->m_kobj, &xfs_mp_ktype, NULL, mp->m_fsname);
        if (error)
                goto out;
 
+       error = xfs_uuid_mount(mp);
+       if (error)
+               goto out_remove_sysfs;
+
        /*
         * Set the minimum read and write sizes
         */
@@ -816,7 +819,7 @@ xfs_mountfs(
        if (!sbp->sb_logblocks) {
                xfs_warn(mp, "no log defined");
                XFS_ERROR_REPORT("xfs_mountfs", XFS_ERRLEVEL_LOW, mp);
-               error = XFS_ERROR(EFSCORRUPTED);
+               error = -EFSCORRUPTED;
                goto out_free_perag;
        }
 
@@ -855,7 +858,7 @@ xfs_mountfs(
             !mp->m_sb.sb_inprogress) {
                error = xfs_initialize_perag_data(mp, sbp->sb_agcount);
                if (error)
-                       goto out_fail_wait;
+                       goto out_log_dealloc;
        }
 
        /*
@@ -876,7 +879,7 @@ xfs_mountfs(
                xfs_iunlock(rip, XFS_ILOCK_EXCL);
                XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW,
                                 mp);
-               error = XFS_ERROR(EFSCORRUPTED);
+               error = -EFSCORRUPTED;
                goto out_rele_rip;
        }
        mp->m_rootip = rip;     /* save it */
@@ -927,7 +930,7 @@ xfs_mountfs(
                        xfs_notice(mp, "resetting quota flags");
                        error = xfs_mount_reset_sbqflags(mp);
                        if (error)
-                               return error;
+                               goto out_rtunmount;
                }
        }
 
@@ -989,6 +992,8 @@ xfs_mountfs(
        xfs_da_unmount(mp);
  out_remove_uuid:
        xfs_uuid_unmount(mp);
+ out_remove_sysfs:
+       xfs_sysfs_del(&mp->m_kobj);
  out:
        return error;
 }
@@ -1071,6 +1076,8 @@ xfs_unmountfs(
        xfs_errortag_clearall(mp, 0);
 #endif
        xfs_free_perag(mp);
+
+       xfs_sysfs_del(&mp->m_kobj);
 }
 
 int
@@ -1152,7 +1159,7 @@ xfs_mod_incore_sb_unlocked(
                lcounter += delta;
                if (lcounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_icount = lcounter;
                return 0;
@@ -1161,7 +1168,7 @@ xfs_mod_incore_sb_unlocked(
                lcounter += delta;
                if (lcounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_ifree = lcounter;
                return 0;
@@ -1191,7 +1198,7 @@ xfs_mod_incore_sb_unlocked(
                         * blocks if were allowed to.
                         */
                        if (!rsvd)
-                               return XFS_ERROR(ENOSPC);
+                               return -ENOSPC;
 
                        lcounter = (long long)mp->m_resblks_avail + delta;
                        if (lcounter >= 0) {
@@ -1202,7 +1209,7 @@ xfs_mod_incore_sb_unlocked(
                                "Filesystem \"%s\": reserve blocks depleted! "
                                "Consider increasing reserve pool size.",
                                mp->m_fsname);
-                       return XFS_ERROR(ENOSPC);
+                       return -ENOSPC;
                }
 
                mp->m_sb.sb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp);
@@ -1211,7 +1218,7 @@ xfs_mod_incore_sb_unlocked(
                lcounter = (long long)mp->m_sb.sb_frextents;
                lcounter += delta;
                if (lcounter < 0) {
-                       return XFS_ERROR(ENOSPC);
+                       return -ENOSPC;
                }
                mp->m_sb.sb_frextents = lcounter;
                return 0;
@@ -1220,7 +1227,7 @@ xfs_mod_incore_sb_unlocked(
                lcounter += delta;
                if (lcounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_dblocks = lcounter;
                return 0;
@@ -1229,7 +1236,7 @@ xfs_mod_incore_sb_unlocked(
                scounter += delta;
                if (scounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_agcount = scounter;
                return 0;
@@ -1238,7 +1245,7 @@ xfs_mod_incore_sb_unlocked(
                scounter += delta;
                if (scounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_imax_pct = scounter;
                return 0;
@@ -1247,7 +1254,7 @@ xfs_mod_incore_sb_unlocked(
                scounter += delta;
                if (scounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_rextsize = scounter;
                return 0;
@@ -1256,7 +1263,7 @@ xfs_mod_incore_sb_unlocked(
                scounter += delta;
                if (scounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_rbmblocks = scounter;
                return 0;
@@ -1265,7 +1272,7 @@ xfs_mod_incore_sb_unlocked(
                lcounter += delta;
                if (lcounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_rblocks = lcounter;
                return 0;
@@ -1274,7 +1281,7 @@ xfs_mod_incore_sb_unlocked(
                lcounter += delta;
                if (lcounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_rextents = lcounter;
                return 0;
@@ -1283,13 +1290,13 @@ xfs_mod_incore_sb_unlocked(
                scounter += delta;
                if (scounter < 0) {
                        ASSERT(0);
-                       return XFS_ERROR(EINVAL);
+                       return -EINVAL;
                }
                mp->m_sb.sb_rextslog = scounter;
                return 0;
        default:
                ASSERT(0);
-               return XFS_ERROR(EINVAL);
+               return -EINVAL;
        }
 }
 
@@ -1452,7 +1459,7 @@ xfs_dev_is_read_only(
            (mp->m_rtdev_targp && xfs_readonly_buftarg(mp->m_rtdev_targp))) {
                xfs_notice(mp, "%s required on read-only device.", message);
                xfs_notice(mp, "write access unavailable, cannot proceed.");
-               return EROFS;
+               return -EROFS;
        }
        return 0;
 }
@@ -1995,7 +2002,7 @@ slow_path:
         * (e.g. lots of space just got freed). After that
         * we are done.
         */
-       if (ret != ENOSPC)
+       if (ret != -ENOSPC)
                xfs_icsb_balance_counter(mp, field, 0);
        xfs_icsb_unlock(mp);
        return ret;