linux-stable-rt/fs/ocfs2
Mark Fasheh 97b8f4a9df ocfs2: Fix orphan add in ocfs2_create_inode_in_orphan
ocfs2_create_inode_in_orphan() is used by reflink to create the newly
reflinked inode simultaneously in the orphan dir. This allows us to easily
handle partially-reflinked files during recovery cleanup.

We have a problem though - the orphan dir stringifies inode # to determine
a unique name under which the orphan entry dirent can be created. Since
ocfs2_create_inode_in_orphan() needs the space allocated in the orphan dir
before it can allocate the inode, we currently call into the orphan code:

       /*
        * We give the orphan dir the root blkno to fake an orphan name,
        * and allocate enough space for our insertion.
        */
       status = ocfs2_prepare_orphan_dir(osb, &orphan_dir,
                                         osb->root_blkno,
                                         orphan_name, &orphan_insert);

Using osb->root_blkno might work fine on unindexed directories, but the
orphan dir can have an index.  When it has that index, the above code fails
to allocate the proper index entry.  Later, when we try to remove the file
from the orphan dir (using the actual inode #), the reflink operation will
fail.

To fix this, I created a function ocfs2_alloc_orphaned_file() which uses the
newly split out orphan and inode alloc code to figure out what the inode
block number will be (once allocated) and then prepare the orphan dir from
that data.

Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Signed-off-by: Tao Ma <tao.ma@oracle.com>
2010-09-08 14:26:00 +08:00
..
cluster O2net: Disallow o2net accept connection request from itself. 2010-08-07 10:50:33 -07:00
dlm Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2 2010-08-13 10:43:50 -07:00
dlmfs Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 2010-08-10 11:26:52 -07:00
Kconfig
Makefile
acl.c Fix the nested PR lock calling issue in ACL 2010-08-07 10:46:46 -07:00
acl.h
alloc.c ocfs2: Fix deadlock when allocating page 2010-09-08 14:25:57 +08:00
alloc.h
aops.c sort out blockdev_direct_IO variants 2010-08-09 16:47:29 -04:00
aops.h
blockcheck.c ocfs2: Fix metaecc error messages 2010-09-08 14:25:53 +08:00
blockcheck.h
buffer_head_io.c
buffer_head_io.h
dcache.c
dcache.h
dir.c
dir.h
dlmglue.c
dlmglue.h
export.c
export.h
extent_map.c
extent_map.h
file.c Ocfs2: Fix a regression bug from mainline commit(6b933c8e6f). 2010-09-08 14:25:57 +08:00
file.h
heartbeat.c
heartbeat.h
inode.c ocfs2: Fix incorrect checksum validation error 2010-09-08 14:25:54 +08:00
inode.h Make ->drop_inode() just return whether inode needs to be dropped 2010-08-09 16:48:35 -04:00
ioctl.c
ioctl.h
journal.c Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 2010-08-07 13:03:53 -07:00
journal.h
localalloc.c
localalloc.h
locks.c
locks.h
mmap.c ocfs2: make __ocfs2_page_mkwrite handle file end properly. 2010-09-08 14:25:55 +08:00
mmap.h
namei.c ocfs2: Fix orphan add in ocfs2_create_inode_in_orphan 2010-09-08 14:26:00 +08:00
namei.h
ocfs1_fs_compat.h
ocfs2.h
ocfs2_fs.h
ocfs2_ioctl.h
ocfs2_lockid.h
ocfs2_lockingver.h
quota.h
quota_global.c
quota_local.c
refcounttree.c ocfs2: Fix deadlock when allocating page 2010-09-08 14:25:57 +08:00
refcounttree.h
reservations.c
reservations.h
resize.c
resize.h
slot_map.c
slot_map.h
stack_o2cb.c
stack_user.c
stackglue.c
stackglue.h
suballoc.c ocfs2: allow return of new inode block location before allocation of the inode 2010-09-08 14:25:59 +08:00
suballoc.h ocfs2: allow return of new inode block location before allocation of the inode 2010-09-08 14:25:59 +08:00
super.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6 2010-08-10 11:26:52 -07:00
super.h
symlink.c
symlink.h
sysfile.c
sysfile.h
uptodate.c
uptodate.h
ver.c
ver.h
xattr.c
xattr.h