]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/xfs/linux-2.6/xfs_super.c
[XFS] merge xfs_mntupdate into xfs_fs_remount
[linux-2.6-omap-h63xx.git] / fs / xfs / linux-2.6 / xfs_super.c
index 8831d95187904f0ecf4a1aa1ac5b77cc767aec77..a3ecdf44246585fe33b45341ace0c7329cbbf8b0 100644 (file)
@@ -52,6 +52,7 @@
 #include "xfs_version.h"
 #include "xfs_log_priv.h"
 #include "xfs_trans_priv.h"
+#include "xfs_filestream.h"
 
 #include <linux/namei.h>
 #include <linux/init.h>
@@ -314,6 +315,7 @@ xfs_parseargs(
                        args->flags |= XFSMNT_ATTR2;
                } else if (!strcmp(this_char, MNTOPT_NOATTR2)) {
                        args->flags &= ~XFSMNT_ATTR2;
+                       args->flags |= XFSMNT_NOATTR2;
                } else if (!strcmp(this_char, MNTOPT_FILESTREAM)) {
                        args->flags2 |= XFSMNT2_FILESTREAMS;
                } else if (!strcmp(this_char, MNTOPT_NOQUOTA)) {
@@ -843,7 +845,6 @@ xfs_fs_destroy_inode(
 
 STATIC void
 xfs_fs_inode_init_once(
-       kmem_zone_t             *zonep,
        void                    *vnode)
 {
        inode_init_once(vn_to_inode((bhv_vnode_t *)vnode));
@@ -896,7 +897,8 @@ xfs_fs_write_inode(
        struct inode            *inode,
        int                     sync)
 {
-       int                     error = 0, flags = FLUSH_INODE;
+       int                     error = 0;
+       int                     flags = 0;
 
        xfs_itrace_entry(XFS_I(inode));
        if (sync) {
@@ -934,7 +936,7 @@ xfs_fs_clear_inode(
                xfs_inactive(ip);
                xfs_iflags_clear(ip, XFS_IMODIFIED);
                if (xfs_reclaim(ip))
-                       panic("%s: cannot reclaim 0x%p\n", __FUNCTION__, inode);
+                       panic("%s: cannot reclaim 0x%p\n", __func__, inode);
        }
 
        ASSERT(XFS_I(inode) == NULL);
@@ -1027,8 +1029,7 @@ xfs_sync_worker(
        int             error;
 
        if (!(mp->m_flags & XFS_MOUNT_RDONLY))
-               error = xfs_sync(mp, SYNC_FSDATA | SYNC_BDFLUSH | SYNC_ATTR |
-                                    SYNC_REFCACHE | SYNC_SUPER);
+               error = xfs_sync(mp, SYNC_FSDATA | SYNC_BDFLUSH | SYNC_ATTR);
        mp->m_sync_seq++;
        wake_up(&mp->m_wait_single_sync_task);
 }
@@ -1074,7 +1075,7 @@ xfssyncd(
                        list_del(&work->w_list);
                        if (work == &mp->m_sync_work)
                                continue;
-                       kmem_free(work, sizeof(struct bhv_vfs_sync_work));
+                       kmem_free(work);
                }
        }
 
@@ -1181,7 +1182,7 @@ xfs_fs_statfs(
        statp->f_fsid.val[0] = (u32)id;
        statp->f_fsid.val[1] = (u32)(id >> 32);
 
-       xfs_icsb_sync_counters_flags(mp, XFS_ICSB_LAZY_COUNT);
+       xfs_icsb_sync_counters(mp, XFS_ICSB_LAZY_COUNT);
 
        spin_lock(&mp->m_sb_lock);
        statp->f_bsize = sbp->sb_blocksize;
@@ -1220,9 +1221,27 @@ xfs_fs_remount(
        int                     error;
 
        error = xfs_parseargs(mp, options, args, 1);
-       if (!error)
-               error = xfs_mntupdate(mp, flags, args);
-       kmem_free(args, sizeof(*args));
+       if (error)
+               goto out_free_args;
+
+       if (!(*flags & MS_RDONLY)) {                    /* rw/ro -> rw */
+               if (mp->m_flags & XFS_MOUNT_RDONLY)
+               mp->m_flags &= ~XFS_MOUNT_RDONLY;
+               if (args->flags & XFSMNT_BARRIER) {
+                       mp->m_flags |= XFS_MOUNT_BARRIER;
+                       xfs_mountfs_check_barriers(mp);
+               } else {
+                       mp->m_flags &= ~XFS_MOUNT_BARRIER;
+               }
+       } else if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { /* rw -> ro */
+               xfs_filestream_flush(mp);
+               xfs_sync(mp, SYNC_DATA_QUIESCE);
+               xfs_attr_quiesce(mp);
+               mp->m_flags |= XFS_MOUNT_RDONLY;
+       }
+
+ out_free_args:
+       kmem_free(args);
        return -error;
 }
 
@@ -1306,7 +1325,7 @@ xfs_fs_fill_super(
        void                    *data,
        int                     silent)
 {
-       struct inode            *rootvp;
+       struct inode            *root;
        struct xfs_mount        *mp = NULL;
        struct xfs_mount_args   *args = xfs_args_allocate(sb, silent);
        int                     error;
@@ -1344,19 +1363,18 @@ xfs_fs_fill_super(
        sb->s_time_gran = 1;
        set_posix_acl_flag(sb);
 
-       rootvp = igrab(mp->m_rootip->i_vnode);
-       if (!rootvp) {
+       root = igrab(mp->m_rootip->i_vnode);
+       if (!root) {
                error = ENOENT;
                goto fail_unmount;
        }
-
-       sb->s_root = d_alloc_root(vn_to_inode(rootvp));
-       if (!sb->s_root) {
-               error = ENOMEM;
+       if (is_bad_inode(root)) {
+               error = EINVAL;
                goto fail_vnrele;
        }
-       if (is_bad_inode(sb->s_root->d_inode)) {
-               error = EINVAL;
+       sb->s_root = d_alloc_root(root);
+       if (!sb->s_root) {
+               error = ENOMEM;
                goto fail_vnrele;
        }
 
@@ -1370,7 +1388,7 @@ xfs_fs_fill_super(
 
        xfs_itrace_exit(XFS_I(sb->s_root->d_inode));
 
-       kmem_free(args, sizeof(*args));
+       kmem_free(args);
        return 0;
 
 fail_vnrele:
@@ -1378,14 +1396,14 @@ fail_vnrele:
                dput(sb->s_root);
                sb->s_root = NULL;
        } else {
-               VN_RELE(rootvp);
+               iput(root);
        }
 
 fail_unmount:
        xfs_unmount(mp, 0, NULL);
 
 fail_vfsop:
-       kmem_free(args, sizeof(*args));
+       kmem_free(args);
        return -error;
 }