]> bbs.cooldavid.org Git - net-next-2.6.git/commit - fs/xfs/xfs_fsops.c
[XFS] Concurrent Multi-File Data Streams
authorDavid Chinner <dgc@sgi.com>
Wed, 11 Jul 2007 01:09:12 +0000 (11:09 +1000)
committerTim Shimmin <tes@chook.melbourne.sgi.com>
Sat, 14 Jul 2007 05:40:53 +0000 (15:40 +1000)
commit2a82b8be8a8dacb48cb7371449a7a9daa558b4a8
tree44e6a81dd0e7d7dc634e04b9230b5262a254c5ee
parent0892ccd6fe13e08ad9e57007afbb78fe02d66005
[XFS] Concurrent Multi-File Data Streams

In media spaces, video is often stored in a frame-per-file format. When
dealing with uncompressed realtime HD video streams in this format, it is
crucial that files do not get fragmented and that multiple files a placed
contiguously on disk.

When multiple streams are being ingested and played out at the same time,
it is critical that the filesystem does not cross the streams and
interleave them together as this creates seek and readahead cache miss
latency and prevents both ingest and playout from meeting frame rate
targets.

This patch set creates a "stream of files" concept into the allocator to
place all the data from a single stream contiguously on disk so that RAID
array readahead can be used effectively. Each additional stream gets
placed in different allocation groups within the filesystem, thereby
ensuring that we don't cross any streams. When an AG fills up, we select a
new AG for the stream that is not in use.

The core of the functionality is the stream tracking - each inode that we
create in a directory needs to be associated with the directories' stream.
Hence every time we create a file, we look up the directories' stream
object and associate the new file with that object.

Once we have a stream object for a file, we use the AG that the stream
object point to for allocations. If we can't allocate in that AG (e.g. it
is full) we move the entire stream to another AG. Other inodes in the same
stream are moved to the new AG on their next allocation (i.e. lazy
update).

Stream objects are kept in a cache and hold a reference on the inode.
Hence the inode cannot be reclaimed while there is an outstanding stream
reference. This means that on unlink we need to remove the stream
association and we also need to flush all the associations on certain
events that want to reclaim all unreferenced inodes (e.g. filesystem
freeze).

SGI-PV: 964469
SGI-Modid: xfs-linux-melb:xfs-kern:29096a

Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Barry Naujok <bnaujok@sgi.com>
Signed-off-by: Donald Douwsma <donaldd@sgi.com>
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Tim Shimmin <tes@sgi.com>
Signed-off-by: Vlad Apostolov <vapo@sgi.com>
21 files changed:
fs/xfs/Makefile-linux-2.6
fs/xfs/linux-2.6/xfs_globals.c
fs/xfs/linux-2.6/xfs_linux.h
fs/xfs/linux-2.6/xfs_sysctl.c
fs/xfs/linux-2.6/xfs_sysctl.h
fs/xfs/xfs.h
fs/xfs/xfs_ag.h
fs/xfs/xfs_bmap.c
fs/xfs/xfs_clnt.h
fs/xfs/xfs_dinode.h
fs/xfs/xfs_filestream.c [new file with mode: 0644]
fs/xfs/xfs_filestream.h [new file with mode: 0644]
fs/xfs/xfs_fs.h
fs/xfs/xfs_fsops.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_mount.h
fs/xfs/xfs_mru_cache.c [new file with mode: 0644]
fs/xfs/xfs_mru_cache.h [new file with mode: 0644]
fs/xfs/xfs_vfsops.c
fs/xfs/xfs_vnodeops.c