]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/xfs/linux-2.6/xfs_super.c
[XFS] rename error2 goto label in xfs_fs_fill_super
[linux-2.6-omap-h63xx.git] / fs / xfs / linux-2.6 / xfs_super.c
index 055faa06ca2283d05c1a1dceba4bb6a0978eed1a..4c662d63d6262c8d6ad3a1626f137bba918be0cb 100644 (file)
@@ -75,7 +75,10 @@ xfs_args_allocate(
 {
        struct xfs_mount_args   *args;
 
-       args = kmem_zalloc(sizeof(struct xfs_mount_args), KM_SLEEP);
+       args = kzalloc(sizeof(struct xfs_mount_args), GFP_KERNEL);
+       if (!args)
+               return NULL;
+
        args->logbufs = args->logbufsize = -1;
        strncpy(args->fsname, sb->s_id, MAXNAMELEN);
 
@@ -861,7 +864,41 @@ xfs_open_devices(
        return error;
 }
 
+/*
+ * Setup xfs_mount buffer target pointers based on superblock
+ */
+STATIC int
+xfs_setup_devices(
+       struct xfs_mount        *mp)
+{
+       int                     error;
 
+       error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize,
+                                   mp->m_sb.sb_sectsize);
+       if (error)
+               return error;
+
+       if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
+               unsigned int    log_sector_size = BBSIZE;
+
+               if (xfs_sb_version_hassector(&mp->m_sb))
+                       log_sector_size = mp->m_sb.sb_logsectsize;
+               error = xfs_setsize_buftarg(mp->m_logdev_targp,
+                                           mp->m_sb.sb_blocksize,
+                                           log_sector_size);
+               if (error)
+                       return error;
+       }
+       if (mp->m_rtdev_targp) {
+               error = xfs_setsize_buftarg(mp->m_rtdev_targp,
+                                           mp->m_sb.sb_blocksize,
+                                           mp->m_sb.sb_sectsize);
+               if (error)
+                       return error;
+       }
+
+       return 0;
+}
 
 /*
  * XFS AIL push thread support
@@ -1236,10 +1273,11 @@ xfs_fs_put_super(
        }
 
        xfs_unmountfs(mp);
+       xfs_icsb_destroy_counters(mp);
        xfs_close_devices(mp);
        xfs_qmops_put(mp);
        xfs_dmops_put(mp);
-       kmem_free(mp);
+       kfree(mp);
 }
 
 STATIC void
@@ -1362,9 +1400,13 @@ xfs_fs_remount(
        char                    *options)
 {
        struct xfs_mount        *mp = XFS_M(sb);
-       struct xfs_mount_args   *args = xfs_args_allocate(sb, 0);
+       struct xfs_mount_args   *args;
        int                     error;
 
+       args = xfs_args_allocate(sb, 0);
+       if (!args)
+               return -ENOMEM;
+
        error = xfs_parseargs(mp, options, args, 1);
        if (error)
                goto out_free_args;
@@ -1386,7 +1428,7 @@ xfs_fs_remount(
        }
 
  out_free_args:
-       kmem_free(args);
+       kfree(args);
        return -error;
 }
 
@@ -1691,11 +1733,21 @@ xfs_fs_fill_super(
 {
        struct inode            *root;
        struct xfs_mount        *mp = NULL;
-       struct xfs_mount_args   *args = xfs_args_allocate(sb, silent);
-       int                     flags = 0, error;
+       struct xfs_mount_args   *args;
+       int                     flags = 0, error = ENOMEM;
+
+       args = xfs_args_allocate(sb, silent);
+       if (!args)
+               return -ENOMEM;
 
-       mp = xfs_mount_init();
+       mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL);
+       if (!mp)
+               goto out_free_args;
 
+       spin_lock_init(&mp->m_sb_lock);
+       mutex_init(&mp->m_ilock);
+       mutex_init(&mp->m_growlock);
+       atomic_set(&mp->m_active_trans, 0);
        INIT_LIST_HEAD(&mp->m_sync_list);
        spin_lock_init(&mp->m_sync_lock);
        init_waitqueue_head(&mp->m_wait_single_sync_task);
@@ -1708,7 +1760,7 @@ xfs_fs_fill_super(
 
        error = xfs_parseargs(mp, (char *)data, args, 0);
        if (error)
-               goto fail_vfsop;
+               goto out_free_mp;
 
        sb_min_blocksize(sb, BBSIZE);
        sb->s_export_op = &xfs_export_operations;
@@ -1717,7 +1769,7 @@ xfs_fs_fill_super(
 
        error = xfs_dmops_get(mp, args);
        if (error)
-               goto fail_vfsop;
+               goto out_free_mp;
        error = xfs_qmops_get(mp, args);
        if (error)
                goto out_put_dmops;
@@ -1729,55 +1781,36 @@ xfs_fs_fill_super(
        if (error)
                goto out_put_qmops;
 
+       if (xfs_icsb_init_counters(mp))
+               mp->m_flags |= XFS_MOUNT_NO_PERCPU_SB;
+
        /*
         * Setup flags based on mount(2) options and then the superblock
         */
        error = xfs_start_flags(args, mp);
        if (error)
-               goto error1;
+               goto out_destroy_counters;
        error = xfs_readsb(mp, flags);
        if (error)
-               goto error1;
+               goto out_destroy_counters;
        error = xfs_finish_flags(args, mp);
        if (error)
-               goto error2;
+               goto out_free_sb;
 
-       /*
-        * Setup xfs_mount buffer target pointers based on superblock
-        */
-       error = xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize,
-                                   mp->m_sb.sb_sectsize);
+       error = xfs_setup_devices(mp);
        if (error)
-               goto error2;
-       if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
-               unsigned int    log_sector_size = BBSIZE;
-
-               if (xfs_sb_version_hassector(&mp->m_sb))
-                       log_sector_size = mp->m_sb.sb_logsectsize;
-               error = xfs_setsize_buftarg(mp->m_logdev_targp,
-                                           mp->m_sb.sb_blocksize,
-                                           log_sector_size);
-               if (error)
-                       goto error2;
-       }
-       if (mp->m_rtdev_targp) {
-               error = xfs_setsize_buftarg(mp->m_rtdev_targp,
-                                           mp->m_sb.sb_blocksize,
-                                           mp->m_sb.sb_sectsize);
-               if (error)
-                       goto error2;
-       }
+               goto out_free_sb;
 
        if (mp->m_flags & XFS_MOUNT_BARRIER)
                xfs_mountfs_check_barriers(mp);
 
        error = xfs_filestream_mount(mp);
        if (error)
-               goto error2;
+               goto out_free_sb;
 
        error = xfs_mountfs(mp, flags);
        if (error)
-               goto error2;
+               goto out_free_sb;
 
        XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, args->mtpt, args->fsname);
 
@@ -1814,24 +1847,23 @@ xfs_fs_fill_super(
 
        xfs_itrace_exit(XFS_I(sb->s_root->d_inode));
 
-       kmem_free(args);
+       kfree(args);
        return 0;
 
- error2:
-       if (mp->m_sb_bp)
-               xfs_freesb(mp);
- error1:
-       xfs_binval(mp->m_ddev_targp);
-       if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp)
-               xfs_binval(mp->m_logdev_targp);
-       if (mp->m_rtdev_targp)
-               xfs_binval(mp->m_rtdev_targp);
+ out_free_sb:
+       xfs_freesb(mp);
+ out_destroy_counters:
+       xfs_icsb_destroy_counters(mp);
        xfs_close_devices(mp);
  out_put_qmops:
        xfs_qmops_put(mp);
  out_put_dmops:
        xfs_dmops_put(mp);
-       goto fail_vfsop;
+ out_free_mp:
+       kfree(mp);
+ out_free_args:
+       kfree(args);
+       return -error;
 
  fail_vnrele:
        if (sb->s_root) {
@@ -1856,14 +1888,7 @@ xfs_fs_fill_super(
        IRELE(mp->m_rootip);
 
        xfs_unmountfs(mp);
-       xfs_close_devices(mp);
-       xfs_qmops_put(mp);
-       xfs_dmops_put(mp);
-       kmem_free(mp);
-
- fail_vfsop:
-       kmem_free(args);
-       return -error;
+       goto out_destroy_counters;
 }
 
 STATIC int