13 Jun, 2009

1 commit


12 Jun, 2009

39 commits

  • This will remove every bd_mount_sem use in nilfs.

    The intended exclusion control was replaced by the previous patch
    ("nilfs2: correct exclusion control in nilfs_remount function") for
    nilfs_remount(), and this patch will replace remains with a new mutex
    that this inserts in nilfs object.

    Signed-off-by: Ryusuke Konishi
    Cc: Christoph Hellwig
    Signed-off-by: Al Viro

    Ryusuke Konishi
     
  • nilfs_remount() changes mount state of a superblock instance. Even
    though nilfs accesses other superblock instances during mount or
    remount, the mount state was not properly protected in
    nilfs_remount().

    Moreover, nilfs_remount() has a lock order reversal problem;
    nilfs_get_sb() holds:

    1. bdev->bd_mount_sem
    2. sb->s_umount (sget acquires)

    and nilfs_remount() holds:

    1. sb->s_umount (locked by the caller in vfs)
    2. bdev->bd_mount_sem

    To avoid these problems, this patch divides a semaphore protecting
    super block instances from nilfs->ns_sem, and applies it to the mount
    state protection in nilfs_remount().

    With this change, bd_mount_sem use is removed from nilfs_remount() and
    the lock order reversal will be resolved. And the new rw-semaphore,
    nilfs->ns_super_sem will properly protect the mount state except the
    modification from nilfs_error function.

    Signed-off-by: Ryusuke Konishi
    Signed-off-by: Al Viro

    Ryusuke Konishi
     
  • This simplifies the test function passed on the remaining sget()
    callsite in nilfs.

    Instead of checking mount type (i.e. ro-mount/rw-mount/snapshot mount)
    in the test function passed to sget(), this patch first looks up the
    nilfs_sb_info struct which the given mount type matches, and then
    acquires the super block instance holding the nilfs_sb_info.

    Signed-off-by: Ryusuke Konishi
    Cc: Al Viro
    Signed-off-by: Al Viro

    Ryusuke Konishi
     
  • This stops using sget() for checking if an r/w-mount or an r/o-mount
    exists on the device. This elimination uses a back pointer to the
    current mount added to nilfs object.

    Signed-off-by: Ryusuke Konishi
    Cc: Al Viro
    Signed-off-by: Al Viro

    Ryusuke Konishi
     
  • This will change the way to obtain nilfs object in nilfs_get_sb()
    function.

    Previously, a preliminary sget() call was performed, and the nilfs
    object was acquired from a super block instance found by the sget()
    call.

    This patch, instead, instroduces a new dedicated function
    find_or_create_nilfs(); as the name implies, the function finds an
    existent nilfs object from a global list or creates a new one if no
    object is found on the device.

    Signed-off-by: Ryusuke Konishi
    Cc: Al Viro
    Signed-off-by: Al Viro

    Ryusuke Konishi
     
  • The following EBUSY case in nilfs_get_sb() is meaningless. Indeed,
    this error code is never returned to the caller.

    if (!s->s_root) {
    ...
    } else if (!(s->s_flags & MS_RDONLY)) {
    err = -EBUSY;
    }

    This simply removes the else case.

    Signed-off-by: Ryusuke Konishi
    Signed-off-by: Al Viro

    Ryusuke Konishi
     
  • Now that all filesystems provide ->sync_fs methods we can change
    __sync_filesystem to only call ->sync_fs.

    This gives us a clear separation between periodic writeouts which
    are driven by ->write_super and data integrity syncs that go
    through ->sync_fs. (modulo file_fsync which is also going away)

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • The call to ->write_super from __sync_filesystem will go away, so make
    sure nilfs2 performs the same actions from inside ->sync_fs.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • The call to ->write_super from __sync_filesystem will go away, so make
    sure jffs2 performs the same actions from inside ->sync_fs.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs, and reimplement
    ->write_super ontop of it.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs, and reimplement
    ->write_super ontop of it.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs, and reimplement
    ->write_super ontop of it.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs, and reimplement
    ->write_super ontop of it.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs, and reimplement
    ->write_super ontop of it.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs, and reimplement
    ->write_super ontop of it.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • Add a ->sync_fs method for data integrity syncs. Factor out common code
    between affs_put_super, affs_write_super and the new affs_sync_fs into
    a helper.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • unfortunately, for affs (especially for affs directories) we have
    no real way to keep track of metadata ownership. So we have to
    do more or less what file_fsync() does, but we do *not* need to
    call write_super() there.

    Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • Missing conversion to host-endian before doing shifts

    Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • * get minix_write_inode() to honour the second argument
    * now we can use simple_fsync() for minixfs

    Signed-off-by: Al Viro

    Al Viro
     
  • kill ext2_sync_file() (along with ext2/fsync.c), get rid of
    ext2_update_inode() - it's an alias of ext2_write_inode().

    Signed-off-by: Al Viro

    Al Viro
     
  • * mark directory data blocks as assoc. metadata
    * add new inode to deal with FAT, mark FAT blocks as assoc. metadata of that
    * now ->fsync() is trivial both for files and directories

    Signed-off-by: Al Viro

    Al Viro
     
  • fs-internal parts of qnx4_fs.h taken to fs/qnx4/qnx4.h, includes adjusted,
    qnx4_fs.h doesn't need unifdef anymore.

    Signed-off-by: Al Viro

    Al Viro
     
  • * have directory operations use mark_buffer_dirty_inode(),
    so that sync_mapping_buffers() would get those.
    * make qnx4_write_inode() honour its last argument.
    * get rid of insane copies of very ancient "walk the indirect blocks"
    in qnx4/fsync - they never matched the actual fs layout and, fortunately,
    never'd been called. Again, all this junk is not needed; ->fsync()
    should just do sync_mapping_buffers + sync_inode (and if we implement
    block allocation for qnx4, we'll need to use mark_buffer_dirty_inode()
    for extent blocks)

    Signed-off-by: Al Viro

    Al Viro
     
  • writes associated buffers, then does sync_inode() to write
    the inode itself (and to make it clean). Depends on
    ->write_inode() honouring the second argument.

    Signed-off-by: Al Viro

    Al Viro
     
  • [xfs, btrfs, capifs, shmem don't need BKL, exempt]

    Signed-off-by: Alessio Igor Bogani
    Signed-off-by: Al Viro

    Alessio Igor Bogani
     
  • I think the block_dump output in __mark_inode_dirty is missing dentry locking.
    Surely the i_dentry list can change any time, so we may not even *get* a
    dentry there. If we do get one by chance, then it would appear to be able to
    go away or get renamed at any time...

    Signed-off-by: Al Viro

    Nick Piggin
     
  • Some filesystems can call in to sync an inode that is still in the
    I_NEW state (eg. ext family, when mounted with -osync). This is OK
    because the filesystem has sole access to the new inode, so it can
    modify i_state without races (because no other thread should be
    modifying it, by definition of I_NEW). Ie. a false positive, so
    remove the warnings.

    The races are described here 7ef0d7377cb287e08f3ae94cebc919448e1f5dff,
    which is also where the warnings were introduced.

    Reported-by: Stephen Hemminger
    Signed-off-by: Nick Piggin
    Signed-off-by: Al Viro

    Nick Piggin
     
  • the write_super method is used for

    (1) writing back the superblock periodically from pdflush
    (2) called just before ->sync_fs for data integerity syncs

    We don't need (1) because we have our own peridoc writeout through xfssyncd,
    and we don't need (2) because xfs_fs_sync_fs performs a proper synchronous
    superblock writeout after all other data and metadata has been written out.

    Also remove ->s_dirt tracking as it's only used to decide when too call
    ->write_super.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Eric Sandeen
    Signed-off-by: Al Viro

    Christoph Hellwig
     
  • This should not trigger anymore, so kill it.

    Acked-by: Anton Altaparmakov
    Signed-off-by: Jens Axboe
    Signed-off-by: Al Viro

    Jens Axboe
     
  • The only user of the i_cindex element in the inode structure is used
    is by the firewire drivers. As part of an attempt to slim down the
    inode structure to save memory --- since a typical Linux system will
    have hundreds of thousands if not millions of inodes cached, a
    reduction in the size inode has high leverage.

    The firewire driver does not need i_cindex in any fast path, so it's
    simple enough to calculate when it is needed, instead of wasting space
    in the inode structure.

    Signed-off-by: "Theodore Ts'o"
    Cc: krh@redhat.com
    Cc: stefanr@s5r6.in-berlin.de
    Cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: Al Viro

    Theodore Ts'o
     
  • Push down lock_super into ->write_super instances and remove it from the
    caller.

    Following filesystem don't need ->s_lock in ->write_super and are skipped:

    * bfs, nilfs2 - no other uses of s_lock and have internal locks in
    ->write_super
    * ext2 - uses BKL in ext2_write_super and has internal calls without s_lock
    * reiserfs - no other uses of s_lock as has reiserfs_write_lock (BKL) in
    ->write_super
    * xfs - no other uses of s_lock and uses internal lock (buffer lock on
    superblock buffer) to serialize ->write_super. Also xfs_fs_write_super
    is superflous and will go away in the next merge window

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig