linux/fs/xfs/linux-2.6/xfs_super.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2006 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#include "xfs.h"
  19#include "xfs_bit.h"
  20#include "xfs_log.h"
  21#include "xfs_clnt.h"
  22#include "xfs_inum.h"
  23#include "xfs_trans.h"
  24#include "xfs_sb.h"
  25#include "xfs_ag.h"
  26#include "xfs_dir2.h"
  27#include "xfs_alloc.h"
  28#include "xfs_dmapi.h"
  29#include "xfs_quota.h"
  30#include "xfs_mount.h"
  31#include "xfs_bmap_btree.h"
  32#include "xfs_alloc_btree.h"
  33#include "xfs_ialloc_btree.h"
  34#include "xfs_dir2_sf.h"
  35#include "xfs_attr_sf.h"
  36#include "xfs_dinode.h"
  37#include "xfs_inode.h"
  38#include "xfs_btree.h"
  39#include "xfs_ialloc.h"
  40#include "xfs_bmap.h"
  41#include "xfs_rtalloc.h"
  42#include "xfs_error.h"
  43#include "xfs_itable.h"
  44#include "xfs_rw.h"
  45#include "xfs_acl.h"
  46#include "xfs_cap.h"
  47#include "xfs_mac.h"
  48#include "xfs_attr.h"
  49#include "xfs_buf_item.h"
  50#include "xfs_utils.h"
  51#include "xfs_version.h"
  52
  53#include <linux/namei.h>
  54#include <linux/init.h>
  55#include <linux/mount.h>
  56#include <linux/mempool.h>
  57#include <linux/writeback.h>
  58#include <linux/kthread.h>
  59
  60STATIC struct quotactl_ops xfs_quotactl_operations;
  61STATIC struct super_operations xfs_super_operations;
  62STATIC kmem_zone_t *xfs_vnode_zone;
  63STATIC kmem_zone_t *xfs_ioend_zone;
  64mempool_t *xfs_ioend_pool;
  65
  66STATIC struct xfs_mount_args *
  67xfs_args_allocate(
  68        struct super_block      *sb,
  69        int                     silent)
  70{
  71        struct xfs_mount_args   *args;
  72
  73        args = kmem_zalloc(sizeof(struct xfs_mount_args), KM_SLEEP);
  74        args->logbufs = args->logbufsize = -1;
  75        strncpy(args->fsname, sb->s_id, MAXNAMELEN);
  76
  77        /* Copy the already-parsed mount(2) flags we're interested in */
  78        if (sb->s_flags & MS_DIRSYNC)
  79                args->flags |= XFSMNT_DIRSYNC;
  80        if (sb->s_flags & MS_SYNCHRONOUS)
  81                args->flags |= XFSMNT_WSYNC;
  82        if (silent)
  83                args->flags |= XFSMNT_QUIET;
  84        args->flags |= XFSMNT_32BITINODES;
  85
  86        return args;
  87}
  88
  89__uint64_t
  90xfs_max_file_offset(
  91        unsigned int            blockshift)
  92{
  93        unsigned int            pagefactor = 1;
  94        unsigned int            bitshift = BITS_PER_LONG - 1;
  95
  96        /* Figure out maximum filesize, on Linux this can depend on
  97         * the filesystem blocksize (on 32 bit platforms).
  98         * __block_prepare_write does this in an [unsigned] long...
  99         *      page->index << (PAGE_CACHE_SHIFT - bbits)
 100         * So, for page sized blocks (4K on 32 bit platforms),
 101         * this wraps at around 8Tb (hence MAX_LFS_FILESIZE which is
 102         *      (((u64)PAGE_CACHE_SIZE << (BITS_PER_LONG-1))-1)
 103         * but for smaller blocksizes it is less (bbits = log2 bsize).
 104         * Note1: get_block_t takes a long (implicit cast from above)
 105         * Note2: The Large Block Device (LBD and HAVE_SECTOR_T) patch
 106         * can optionally convert the [unsigned] long from above into
 107         * an [unsigned] long long.
 108         */
 109
 110#if BITS_PER_LONG == 32
 111# if defined(CONFIG_LBD)
 112        ASSERT(sizeof(sector_t) == 8);
 113        pagefactor = PAGE_CACHE_SIZE;
 114        bitshift = BITS_PER_LONG;
 115# else
 116        pagefactor = PAGE_CACHE_SIZE >> (PAGE_CACHE_SHIFT - blockshift);
 117# endif
 118#endif
 119
 120        return (((__uint64_t)pagefactor) << bitshift) - 1;
 121}
 122
 123STATIC __inline__ void
 124xfs_set_inodeops(
 125        struct inode            *inode)
 126{
 127        switch (inode->i_mode & S_IFMT) {
 128        case S_IFREG:
 129                inode->i_op = &xfs_inode_operations;
 130                inode->i_fop = &xfs_file_operations;
 131                inode->i_mapping->a_ops = &xfs_address_space_operations;
 132                break;
 133        case S_IFDIR:
 134                inode->i_op = &xfs_dir_inode_operations;
 135                inode->i_fop = &xfs_dir_file_operations;
 136                break;
 137        case S_IFLNK:
 138                inode->i_op = &xfs_symlink_inode_operations;
 139                if (inode->i_blocks)
 140                        inode->i_mapping->a_ops = &xfs_address_space_operations;
 141                break;
 142        default:
 143                inode->i_op = &xfs_inode_operations;
 144                init_special_inode(inode, inode->i_mode, inode->i_rdev);
 145                break;
 146        }
 147}
 148
 149STATIC __inline__ void
 150xfs_revalidate_inode(
 151        xfs_mount_t             *mp,
 152        bhv_vnode_t             *vp,
 153        xfs_inode_t             *ip)
 154{
 155        struct inode            *inode = vn_to_inode(vp);
 156
 157        inode->i_mode   = ip->i_d.di_mode;
 158        inode->i_nlink  = ip->i_d.di_nlink;
 159        inode->i_uid    = ip->i_d.di_uid;
 160        inode->i_gid    = ip->i_d.di_gid;
 161
 162        switch (inode->i_mode & S_IFMT) {
 163        case S_IFBLK:
 164        case S_IFCHR:
 165                inode->i_rdev =
 166                        MKDEV(sysv_major(ip->i_df.if_u2.if_rdev) & 0x1ff,
 167                              sysv_minor(ip->i_df.if_u2.if_rdev));
 168                break;
 169        default:
 170                inode->i_rdev = 0;
 171                break;
 172        }
 173
 174        inode->i_blksize = xfs_preferred_iosize(mp);
 175        inode->i_generation = ip->i_d.di_gen;
 176        i_size_write(inode, ip->i_d.di_size);
 177        inode->i_blocks =
 178                XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks);
 179        inode->i_atime.tv_sec   = ip->i_d.di_atime.t_sec;
 180        inode->i_atime.tv_nsec  = ip->i_d.di_atime.t_nsec;
 181        inode->i_mtime.tv_sec   = ip->i_d.di_mtime.t_sec;
 182        inode->i_mtime.tv_nsec  = ip->i_d.di_mtime.t_nsec;
 183        inode->i_ctime.tv_sec   = ip->i_d.di_ctime.t_sec;
 184        inode->i_ctime.tv_nsec  = ip->i_d.di_ctime.t_nsec;
 185        if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
 186                inode->i_flags |= S_IMMUTABLE;
 187        else
 188                inode->i_flags &= ~S_IMMUTABLE;
 189        if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
 190                inode->i_flags |= S_APPEND;
 191        else
 192                inode->i_flags &= ~S_APPEND;
 193        if (ip->i_d.di_flags & XFS_DIFLAG_SYNC)
 194                inode->i_flags |= S_SYNC;
 195        else
 196                inode->i_flags &= ~S_SYNC;
 197        if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME)
 198                inode->i_flags |= S_NOATIME;
 199        else
 200                inode->i_flags &= ~S_NOATIME;
 201        vp->v_flag &= ~VMODIFIED;
 202}
 203
 204void
 205xfs_initialize_vnode(
 206        bhv_desc_t              *bdp,
 207        bhv_vnode_t             *vp,
 208        bhv_desc_t              *inode_bhv,
 209        int                     unlock)
 210{
 211        xfs_inode_t             *ip = XFS_BHVTOI(inode_bhv);
 212        struct inode            *inode = vn_to_inode(vp);
 213
 214        if (!inode_bhv->bd_vobj) {
 215                vp->v_vfsp = bhvtovfs(bdp);
 216                bhv_desc_init(inode_bhv, ip, vp, &xfs_vnodeops);
 217                bhv_insert(VN_BHV_HEAD(vp), inode_bhv);
 218        }
 219
 220        /*
 221         * We need to set the ops vectors, and unlock the inode, but if
 222         * we have been called during the new inode create process, it is
 223         * too early to fill in the Linux inode.  We will get called a
 224         * second time once the inode is properly set up, and then we can
 225         * finish our work.
 226         */
 227        if (ip->i_d.di_mode != 0 && unlock && (inode->i_state & I_NEW)) {
 228                xfs_revalidate_inode(XFS_BHVTOM(bdp), vp, ip);
 229                xfs_set_inodeops(inode);
 230
 231                ip->i_flags &= ~XFS_INEW;
 232                barrier();
 233
 234                unlock_new_inode(inode);
 235        }
 236}
 237
 238int
 239xfs_blkdev_get(
 240        xfs_mount_t             *mp,
 241        const char              *name,
 242        struct block_device     **bdevp)
 243{
 244        int                     error = 0;
 245
 246        *bdevp = open_bdev_excl(name, 0, mp);
 247        if (IS_ERR(*bdevp)) {
 248                error = PTR_ERR(*bdevp);
 249                printk("XFS: Invalid device [%s], error=%d\n", name, error);
 250        }
 251
 252        return -error;
 253}
 254
 255void
 256xfs_blkdev_put(
 257        struct block_device     *bdev)
 258{
 259        if (bdev)
 260                close_bdev_excl(bdev);
 261}
 262
 263/*
 264 * Try to write out the superblock using barriers.
 265 */
 266STATIC int
 267xfs_barrier_test(
 268        xfs_mount_t     *mp)
 269{
 270        xfs_buf_t       *sbp = xfs_getsb(mp, 0);
 271        int             error;
 272
 273        XFS_BUF_UNDONE(sbp);
 274        XFS_BUF_UNREAD(sbp);
 275        XFS_BUF_UNDELAYWRITE(sbp);
 276        XFS_BUF_WRITE(sbp);
 277        XFS_BUF_UNASYNC(sbp);
 278        XFS_BUF_ORDERED(sbp);
 279
 280        xfsbdstrat(mp, sbp);
 281        error = xfs_iowait(sbp);
 282
 283        /*
 284         * Clear all the flags we set and possible error state in the
 285         * buffer.  We only did the write to try out whether barriers
 286         * worked and shouldn't leave any traces in the superblock
 287         * buffer.
 288         */
 289        XFS_BUF_DONE(sbp);
 290        XFS_BUF_ERROR(sbp, 0);
 291        XFS_BUF_UNORDERED(sbp);
 292
 293        xfs_buf_relse(sbp);
 294        return error;
 295}
 296
 297void
 298xfs_mountfs_check_barriers(xfs_mount_t *mp)
 299{
 300        int error;
 301
 302        if (mp->m_logdev_targp != mp->m_ddev_targp) {
 303                xfs_fs_cmn_err(CE_NOTE, mp,
 304                  "Disabling barriers, not supported with external log device");
 305                mp->m_flags &= ~XFS_MOUNT_BARRIER;
 306                return;
 307        }
 308
 309        if (mp->m_ddev_targp->bt_bdev->bd_disk->queue->ordered ==
 310                                        QUEUE_ORDERED_NONE) {
 311                xfs_fs_cmn_err(CE_NOTE, mp,
 312                  "Disabling barriers, not supported by the underlying device");
 313                mp->m_flags &= ~XFS_MOUNT_BARRIER;
 314                return;
 315        }
 316
 317        if (xfs_readonly_buftarg(mp->m_ddev_targp)) {
 318                xfs_fs_cmn_err(CE_NOTE, mp,
 319                  "Disabling barriers, underlying device is readonly");
 320                mp->m_flags &= ~XFS_MOUNT_BARRIER;
 321                return;
 322        }
 323
 324        error = xfs_barrier_test(mp);
 325        if (error) {
 326                xfs_fs_cmn_err(CE_NOTE, mp,
 327                  "Disabling barriers, trial barrier write failed");
 328                mp->m_flags &= ~XFS_MOUNT_BARRIER;
 329                return;
 330        }
 331}
 332
 333void
 334xfs_blkdev_issue_flush(
 335        xfs_buftarg_t           *buftarg)
 336{
 337        blkdev_issue_flush(buftarg->bt_bdev, NULL);
 338}
 339
 340STATIC struct inode *
 341xfs_fs_alloc_inode(
 342        struct super_block      *sb)
 343{
 344        bhv_vnode_t             *vp;
 345
 346        vp = kmem_zone_alloc(xfs_vnode_zone, KM_SLEEP);
 347        if (unlikely(!vp))
 348                return NULL;
 349        return vn_to_inode(vp);
 350}
 351
 352STATIC void
 353xfs_fs_destroy_inode(
 354        struct inode            *inode)
 355{
 356        kmem_zone_free(xfs_vnode_zone, vn_from_inode(inode));
 357}
 358
 359STATIC void
 360xfs_fs_inode_init_once(
 361        void                    *vnode,
 362        kmem_zone_t             *zonep,
 363        unsigned long           flags)
 364{
 365        if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
 366                      SLAB_CTOR_CONSTRUCTOR)
 367                inode_init_once(vn_to_inode((bhv_vnode_t *)vnode));
 368}
 369
 370STATIC int
 371xfs_init_zones(void)
 372{
 373        xfs_vnode_zone = kmem_zone_init_flags(sizeof(bhv_vnode_t), "xfs_vnode",
 374                                        KM_ZONE_HWALIGN | KM_ZONE_RECLAIM |
 375                                        KM_ZONE_SPREAD,
 376                                        xfs_fs_inode_init_once);
 377        if (!xfs_vnode_zone)
 378                goto out;
 379
 380        xfs_ioend_zone = kmem_zone_init(sizeof(xfs_ioend_t), "xfs_ioend");
 381        if (!xfs_ioend_zone)
 382                goto out_destroy_vnode_zone;
 383
 384        xfs_ioend_pool = mempool_create_slab_pool(4 * MAX_BUF_PER_PAGE,
 385                                                  xfs_ioend_zone);
 386        if (!xfs_ioend_pool)
 387                goto out_free_ioend_zone;
 388        return 0;
 389
 390 out_free_ioend_zone:
 391        kmem_zone_destroy(xfs_ioend_zone);
 392 out_destroy_vnode_zone:
 393        kmem_zone_destroy(xfs_vnode_zone);
 394 out:
 395        return -ENOMEM;
 396}
 397
 398STATIC void
 399xfs_destroy_zones(void)
 400{
 401        mempool_destroy(xfs_ioend_pool);
 402        kmem_zone_destroy(xfs_vnode_zone);
 403        kmem_zone_destroy(xfs_ioend_zone);
 404}
 405
 406/*
 407 * Attempt to flush the inode, this will actually fail
 408 * if the inode is pinned, but we dirty the inode again
 409 * at the point when it is unpinned after a log write,
 410 * since this is when the inode itself becomes flushable.
 411 */
 412STATIC int
 413xfs_fs_write_inode(
 414        struct inode            *inode,
 415        int                     sync)
 416{
 417        bhv_vnode_t             *vp = vn_from_inode(inode);
 418        int                     error = 0, flags = FLUSH_INODE;
 419
 420        if (vp) {
 421                vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
 422                if (sync)
 423                        flags |= FLUSH_SYNC;
 424                error = bhv_vop_iflush(vp, flags);
 425                if (error == EAGAIN)
 426                        error = sync? bhv_vop_iflush(vp, flags | FLUSH_LOG) : 0;
 427        }
 428        return -error;
 429}
 430
 431STATIC void
 432xfs_fs_clear_inode(
 433        struct inode            *inode)
 434{
 435        bhv_vnode_t             *vp = vn_from_inode(inode);
 436
 437        vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
 438
 439        XFS_STATS_INC(vn_rele);
 440        XFS_STATS_INC(vn_remove);
 441        XFS_STATS_INC(vn_reclaim);
 442        XFS_STATS_DEC(vn_active);
 443
 444        /*
 445         * This can happen because xfs_iget_core calls xfs_idestroy if we
 446         * find an inode with di_mode == 0 but without IGET_CREATE set.
 447         */
 448        if (VNHEAD(vp))
 449                bhv_vop_inactive(vp, NULL);
 450
 451        VN_LOCK(vp);
 452        vp->v_flag &= ~VMODIFIED;
 453        VN_UNLOCK(vp, 0);
 454
 455        if (VNHEAD(vp))
 456                if (bhv_vop_reclaim(vp))
 457                        panic("%s: cannot reclaim 0x%p\n", __FUNCTION__, vp);
 458
 459        ASSERT(VNHEAD(vp) == NULL);
 460
 461#ifdef XFS_VNODE_TRACE
 462        ktrace_free(vp->v_trace);
 463#endif
 464}
 465
 466/*
 467 * Enqueue a work item to be picked up by the vfs xfssyncd thread.
 468 * Doing this has two advantages:
 469 * - It saves on stack space, which is tight in certain situations
 470 * - It can be used (with care) as a mechanism to avoid deadlocks.
 471 * Flushing while allocating in a full filesystem requires both.
 472 */
 473STATIC void
 474xfs_syncd_queue_work(
 475        struct bhv_vfs  *vfs,
 476        void            *data,
 477        void            (*syncer)(bhv_vfs_t *, void *))
 478{
 479        struct bhv_vfs_sync_work *work;
 480
 481        work = kmem_alloc(sizeof(struct bhv_vfs_sync_work), KM_SLEEP);
 482        INIT_LIST_HEAD(&work->w_list);
 483        work->w_syncer = syncer;
 484        work->w_data = data;
 485        work->w_vfs = vfs;
 486        spin_lock(&vfs->vfs_sync_lock);
 487        list_add_tail(&work->w_list, &vfs->vfs_sync_list);
 488        spin_unlock(&vfs->vfs_sync_lock);
 489        wake_up_process(vfs->vfs_sync_task);
 490}
 491
 492/*
 493 * Flush delayed allocate data, attempting to free up reserved space
 494 * from existing allocations.  At this point a new allocation attempt
 495 * has failed with ENOSPC and we are in the process of scratching our
 496 * heads, looking about for more room...
 497 */
 498STATIC void
 499xfs_flush_inode_work(
 500        bhv_vfs_t       *vfs,
 501        void            *inode)
 502{
 503        filemap_flush(((struct inode *)inode)->i_mapping);
 504        iput((struct inode *)inode);
 505}
 506
 507void
 508xfs_flush_inode(
 509        xfs_inode_t     *ip)
 510{
 511        struct inode    *inode = vn_to_inode(XFS_ITOV(ip));
 512        struct bhv_vfs  *vfs = XFS_MTOVFS(ip->i_mount);
 513
 514        igrab(inode);
 515        xfs_syncd_queue_work(vfs, inode, xfs_flush_inode_work);
 516        delay(msecs_to_jiffies(500));
 517}
 518
 519/*
 520 * This is the "bigger hammer" version of xfs_flush_inode_work...
 521 * (IOW, "If at first you don't succeed, use a Bigger Hammer").
 522 */
 523STATIC void
 524xfs_flush_device_work(
 525        bhv_vfs_t       *vfs,
 526        void            *inode)
 527{
 528        sync_blockdev(vfs->vfs_super->s_bdev);
 529        iput((struct inode *)inode);
 530}
 531
 532void
 533xfs_flush_device(
 534        xfs_inode_t     *ip)
 535{
 536        struct inode    *inode = vn_to_inode(XFS_ITOV(ip));
 537        struct bhv_vfs  *vfs = XFS_MTOVFS(ip->i_mount);
 538
 539        igrab(inode);
 540        xfs_syncd_queue_work(vfs, inode, xfs_flush_device_work);
 541        delay(msecs_to_jiffies(500));
 542        xfs_log_force(ip->i_mount, (xfs_lsn_t)0, XFS_LOG_FORCE|XFS_LOG_SYNC);
 543}
 544
 545STATIC void
 546vfs_sync_worker(
 547        bhv_vfs_t       *vfsp,
 548        void            *unused)
 549{
 550        int             error;
 551
 552        if (!(vfsp->vfs_flag & VFS_RDONLY))
 553                error = bhv_vfs_sync(vfsp, SYNC_FSDATA | SYNC_BDFLUSH | \
 554                                        SYNC_ATTR | SYNC_REFCACHE, NULL);
 555        vfsp->vfs_sync_seq++;
 556        wmb();
 557        wake_up(&vfsp->vfs_wait_single_sync_task);
 558}
 559
 560STATIC int
 561xfssyncd(
 562        void                    *arg)
 563{
 564        long                    timeleft;
 565        bhv_vfs_t               *vfsp = (bhv_vfs_t *) arg;
 566        bhv_vfs_sync_work_t     *work, *n;
 567        LIST_HEAD               (tmp);
 568
 569        timeleft = xfs_syncd_centisecs * msecs_to_jiffies(10);
 570        for (;;) {
 571                timeleft = schedule_timeout_interruptible(timeleft);
 572                /* swsusp */
 573                try_to_freeze();
 574                if (kthread_should_stop() && list_empty(&vfsp->vfs_sync_list))
 575                        break;
 576
 577                spin_lock(&vfsp->vfs_sync_lock);
 578                /*
 579                 * We can get woken by laptop mode, to do a sync -
 580                 * that's the (only!) case where the list would be
 581                 * empty with time remaining.
 582                 */
 583                if (!timeleft || list_empty(&vfsp->vfs_sync_list)) {
 584                        if (!timeleft)
 585                                timeleft = xfs_syncd_centisecs *
 586                                                        msecs_to_jiffies(10);
 587                        INIT_LIST_HEAD(&vfsp->vfs_sync_work.w_list);
 588                        list_add_tail(&vfsp->vfs_sync_work.w_list,
 589                                        &vfsp->vfs_sync_list);
 590                }
 591                list_for_each_entry_safe(work, n, &vfsp->vfs_sync_list, w_list)
 592                        list_move(&work->w_list, &tmp);
 593                spin_unlock(&vfsp->vfs_sync_lock);
 594
 595                list_for_each_entry_safe(work, n, &tmp, w_list) {
 596                        (*work->w_syncer)(vfsp, work->w_data);
 597                        list_del(&work->w_list);
 598                        if (work == &vfsp->vfs_sync_work)
 599                                continue;
 600                        kmem_free(work, sizeof(struct bhv_vfs_sync_work));
 601                }
 602        }
 603
 604        return 0;
 605}
 606
 607STATIC int
 608xfs_fs_start_syncd(
 609        bhv_vfs_t               *vfsp)
 610{
 611        vfsp->vfs_sync_work.w_syncer = vfs_sync_worker;
 612        vfsp->vfs_sync_work.w_vfs = vfsp;
 613        vfsp->vfs_sync_task = kthread_run(xfssyncd, vfsp, "xfssyncd");
 614        if (IS_ERR(vfsp->vfs_sync_task))
 615                return -PTR_ERR(vfsp->vfs_sync_task);
 616        return 0;
 617}
 618
 619STATIC void
 620xfs_fs_stop_syncd(
 621        bhv_vfs_t               *vfsp)
 622{
 623        kthread_stop(vfsp->vfs_sync_task);
 624}
 625
 626STATIC void
 627xfs_fs_put_super(
 628        struct super_block      *sb)
 629{
 630        bhv_vfs_t               *vfsp = vfs_from_sb(sb);
 631        int                     error;
 632
 633        xfs_fs_stop_syncd(vfsp);
 634        bhv_vfs_sync(vfsp, SYNC_ATTR | SYNC_DELWRI, NULL);
 635        error = bhv_vfs_unmount(vfsp, 0, NULL);
 636        if (error) {
 637                printk("XFS: unmount got error=%d\n", error);
 638                printk("%s: vfs=0x%p left dangling!\n", __FUNCTION__, vfsp);
 639        } else {
 640                vfs_deallocate(vfsp);
 641        }
 642}
 643
 644STATIC void
 645xfs_fs_write_super(
 646        struct super_block      *sb)
 647{
 648        if (!(sb->s_flags & MS_RDONLY))
 649                bhv_vfs_sync(vfs_from_sb(sb), SYNC_FSDATA, NULL);
 650        sb->s_dirt = 0;
 651}
 652
 653STATIC int
 654xfs_fs_sync_super(
 655        struct super_block      *sb,
 656        int                     wait)
 657{
 658        bhv_vfs_t               *vfsp = vfs_from_sb(sb);
 659        int                     error;
 660        int                     flags;
 661
 662        if (unlikely(sb->s_frozen == SB_FREEZE_WRITE))
 663                flags = SYNC_QUIESCE;
 664        else
 665                flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0);
 666
 667        error = bhv_vfs_sync(vfsp, flags, NULL);
 668        sb->s_dirt = 0;
 669
 670        if (unlikely(laptop_mode)) {
 671                int     prev_sync_seq = vfsp->vfs_sync_seq;
 672
 673                /*
 674                 * The disk must be active because we're syncing.
 675                 * We schedule xfssyncd now (now that the disk is
 676                 * active) instead of later (when it might not be).
 677                 */
 678                wake_up_process(vfsp->vfs_sync_task);
 679                /*
 680                 * We have to wait for the sync iteration to complete.
 681                 * If we don't, the disk activity caused by the sync
 682                 * will come after the sync is completed, and that
 683                 * triggers another sync from laptop mode.
 684                 */
 685                wait_event(vfsp->vfs_wait_single_sync_task,
 686                                vfsp->vfs_sync_seq != prev_sync_seq);
 687        }
 688
 689        return -error;
 690}
 691
 692STATIC int
 693xfs_fs_statfs(
 694        struct dentry           *dentry,
 695        struct kstatfs          *statp)
 696{
 697        return -bhv_vfs_statvfs(vfs_from_sb(dentry->d_sb), statp,
 698                                vn_from_inode(dentry->d_inode));
 699}
 700
 701STATIC int
 702xfs_fs_remount(
 703        struct super_block      *sb,
 704        int                     *flags,
 705        char                    *options)
 706{
 707        bhv_vfs_t               *vfsp = vfs_from_sb(sb);
 708        struct xfs_mount_args   *args = xfs_args_allocate(sb, 0);
 709        int                     error;
 710
 711        error = bhv_vfs_parseargs(vfsp, options, args, 1);
 712        if (!error)
 713                error = bhv_vfs_mntupdate(vfsp, flags, args);
 714        kmem_free(args, sizeof(*args));
 715        return -error;
 716}
 717
 718STATIC void
 719xfs_fs_lockfs(
 720        struct super_block      *sb)
 721{
 722        bhv_vfs_freeze(vfs_from_sb(sb));
 723}
 724
 725STATIC int
 726xfs_fs_show_options(
 727        struct seq_file         *m,
 728        struct vfsmount         *mnt)
 729{
 730        return -bhv_vfs_showargs(vfs_from_sb(mnt->mnt_sb), m);
 731}
 732
 733STATIC int
 734xfs_fs_quotasync(
 735        struct super_block      *sb,
 736        int                     type)
 737{
 738        return -bhv_vfs_quotactl(vfs_from_sb(sb), Q_XQUOTASYNC, 0, NULL);
 739}
 740
 741STATIC int
 742xfs_fs_getxstate(
 743        struct super_block      *sb,
 744        struct fs_quota_stat    *fqs)
 745{
 746        return -bhv_vfs_quotactl(vfs_from_sb(sb), Q_XGETQSTAT, 0, (caddr_t)fqs);
 747}
 748
 749STATIC int
 750xfs_fs_setxstate(
 751        struct super_block      *sb,
 752        unsigned int            flags,
 753        int                     op)
 754{
 755        return -bhv_vfs_quotactl(vfs_from_sb(sb), op, 0, (caddr_t)&flags);
 756}
 757
 758STATIC int
 759xfs_fs_getxquota(
 760        struct super_block      *sb,
 761        int                     type,
 762        qid_t                   id,
 763        struct fs_disk_quota    *fdq)
 764{
 765        return -bhv_vfs_quotactl(vfs_from_sb(sb),
 766                                 (type == USRQUOTA) ? Q_XGETQUOTA :
 767                                  ((type == GRPQUOTA) ? Q_XGETGQUOTA :
 768                                   Q_XGETPQUOTA), id, (caddr_t)fdq);
 769}
 770
 771STATIC int
 772xfs_fs_setxquota(
 773        struct super_block      *sb,
 774        int                     type,
 775        qid_t                   id,
 776        struct fs_disk_quota    *fdq)
 777{
 778        return -bhv_vfs_quotactl(vfs_from_sb(sb),
 779                                 (type == USRQUOTA) ? Q_XSETQLIM :
 780                                  ((type == GRPQUOTA) ? Q_XSETGQLIM :
 781                                   Q_XSETPQLIM), id, (caddr_t)fdq);
 782}
 783
 784STATIC int
 785xfs_fs_fill_super(
 786        struct super_block      *sb,
 787        void                    *data,
 788        int                     silent)
 789{
 790        struct bhv_vnode        *rootvp;
 791        struct bhv_vfs          *vfsp = vfs_allocate(sb);
 792        struct xfs_mount_args   *args = xfs_args_allocate(sb, silent);
 793        struct kstatfs          statvfs;
 794        int                     error;
 795
 796        bhv_insert_all_vfsops(vfsp);
 797
 798        error = bhv_vfs_parseargs(vfsp, (char *)data, args, 0);
 799        if (error) {
 800                bhv_remove_all_vfsops(vfsp, 1);
 801                goto fail_vfsop;
 802        }
 803
 804        sb_min_blocksize(sb, BBSIZE);
 805        sb->s_export_op = &xfs_export_operations;
 806        sb->s_qcop = &xfs_quotactl_operations;
 807        sb->s_op = &xfs_super_operations;
 808
 809        error = bhv_vfs_mount(vfsp, args, NULL);
 810        if (error) {
 811                bhv_remove_all_vfsops(vfsp, 1);
 812                goto fail_vfsop;
 813        }
 814
 815        error = bhv_vfs_statvfs(vfsp, &statvfs, NULL);
 816        if (error)
 817                goto fail_unmount;
 818
 819        sb->s_dirt = 1;
 820        sb->s_magic = statvfs.f_type;
 821        sb->s_blocksize = statvfs.f_bsize;
 822        sb->s_blocksize_bits = ffs(statvfs.f_bsize) - 1;
 823        sb->s_maxbytes = xfs_max_file_offset(sb->s_blocksize_bits);
 824        sb->s_time_gran = 1;
 825        set_posix_acl_flag(sb);
 826
 827        error = bhv_vfs_root(vfsp, &rootvp);
 828        if (error)
 829                goto fail_unmount;
 830
 831        sb->s_root = d_alloc_root(vn_to_inode(rootvp));
 832        if (!sb->s_root) {
 833                error = ENOMEM;
 834                goto fail_vnrele;
 835        }
 836        if (is_bad_inode(sb->s_root->d_inode)) {
 837                error = EINVAL;
 838                goto fail_vnrele;
 839        }
 840        if ((error = xfs_fs_start_syncd(vfsp)))
 841                goto fail_vnrele;
 842        vn_trace_exit(rootvp, __FUNCTION__, (inst_t *)__return_address);
 843
 844        kmem_free(args, sizeof(*args));
 845        return 0;
 846
 847fail_vnrele:
 848        if (sb->s_root) {
 849                dput(sb->s_root);
 850                sb->s_root = NULL;
 851        } else {
 852                VN_RELE(rootvp);
 853        }
 854
 855fail_unmount:
 856        bhv_vfs_unmount(vfsp, 0, NULL);
 857
 858fail_vfsop:
 859        vfs_deallocate(vfsp);
 860        kmem_free(args, sizeof(*args));
 861        return -error;
 862}
 863
 864STATIC int
 865xfs_fs_get_sb(
 866        struct file_system_type *fs_type,
 867        int                     flags,
 868        const char              *dev_name,
 869        void                    *data,
 870        struct vfsmount         *mnt)
 871{
 872        return get_sb_bdev(fs_type, flags, dev_name, data, xfs_fs_fill_super,
 873                           mnt);
 874}
 875
 876STATIC struct super_operations xfs_super_operations = {
 877        .alloc_inode            = xfs_fs_alloc_inode,
 878        .destroy_inode          = xfs_fs_destroy_inode,
 879        .write_inode            = xfs_fs_write_inode,
 880        .clear_inode            = xfs_fs_clear_inode,
 881        .put_super              = xfs_fs_put_super,
 882        .write_super            = xfs_fs_write_super,
 883        .sync_fs                = xfs_fs_sync_super,
 884        .write_super_lockfs     = xfs_fs_lockfs,
 885        .statfs                 = xfs_fs_statfs,
 886        .remount_fs             = xfs_fs_remount,
 887        .show_options           = xfs_fs_show_options,
 888};
 889
 890STATIC struct quotactl_ops xfs_quotactl_operations = {
 891        .quota_sync             = xfs_fs_quotasync,
 892        .get_xstate             = xfs_fs_getxstate,
 893        .set_xstate             = xfs_fs_setxstate,
 894        .get_xquota             = xfs_fs_getxquota,
 895        .set_xquota             = xfs_fs_setxquota,
 896};
 897
 898STATIC struct file_system_type xfs_fs_type = {
 899        .owner                  = THIS_MODULE,
 900        .name                   = "xfs",
 901        .get_sb                 = xfs_fs_get_sb,
 902        .kill_sb                = kill_block_super,
 903        .fs_flags               = FS_REQUIRES_DEV,
 904};
 905
 906
 907STATIC int __init
 908init_xfs_fs( void )
 909{
 910        int                     error;
 911        struct sysinfo          si;
 912        static char             message[] __initdata = KERN_INFO \
 913                XFS_VERSION_STRING " with " XFS_BUILD_OPTIONS " enabled\n";
 914
 915        printk(message);
 916
 917        si_meminfo(&si);
 918        xfs_physmem = si.totalram;
 919
 920        ktrace_init(64);
 921
 922        error = xfs_init_zones();
 923        if (error < 0)
 924                goto undo_zones;
 925
 926        error = xfs_buf_init();
 927        if (error < 0)
 928                goto undo_buffers;
 929
 930        vn_init();
 931        xfs_init();
 932        uuid_init();
 933        vfs_initquota();
 934
 935        error = register_filesystem(&xfs_fs_type);
 936        if (error)
 937                goto undo_register;
 938        return 0;
 939
 940undo_register:
 941        xfs_buf_terminate();
 942
 943undo_buffers:
 944        xfs_destroy_zones();
 945
 946undo_zones:
 947        return error;
 948}
 949
 950STATIC void __exit
 951exit_xfs_fs( void )
 952{
 953        vfs_exitquota();
 954        unregister_filesystem(&xfs_fs_type);
 955        xfs_cleanup();
 956        xfs_buf_terminate();
 957        xfs_destroy_zones();
 958        ktrace_uninit();
 959}
 960
 961module_init(init_xfs_fs);
 962module_exit(exit_xfs_fs);
 963
 964MODULE_AUTHOR("Silicon Graphics, Inc.");
 965MODULE_DESCRIPTION(XFS_VERSION_STRING " with " XFS_BUILD_OPTIONS " enabled");
 966MODULE_LICENSE("GPL");
 967
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.