Thread (6 messages) 6 messages, 3 authors, 2014-07-18

RE: [PATCH 3/3] ext4: Add support IOC_MOV_DATA ioctl

From: Namjae Jeon <hidden>
Date: 2014-07-18 08:50:55
Also in: linux-fsdevel, linux-xfs, lkml

On Tue, 8 Jul 2014 16:02:28 +0200 (CEST), Lukáš Czerner [off-list ref] wrote:
Non-text part: MULTIPART/MIXED
quoted
On Tue, 8 Jul 2014, Namjae Jeon wrote:
quoted
Date: Tue, 08 Jul 2014 21:00:02 +0900
From: Namjae Jeon <redacted>
To: Dave Chinner <david@fromorbit.com>, Theodore Ts'o <tytso@mit.edu>
Cc: linux-ext4 <redacted>, linux-fsdevel@vger.kernel.org,
    linux-kernel@vger.kernel.org, Lukáš Czerner [off-list ref],
    Brian Foster [off-list ref], Christoph Hellwig [off-list ref],
    Ashish Sangwan [off-list ref], xfs@oss.sgi.com
Subject: [PATCH 3/3] ext4: Add support IOC_MOV_DATA ioctl

This patch implements fs ioctl's IOC_MOV_DATA for Ext4.
Hmm isn't this basically what ext4_move_extents() does ? eg.
EXT4_IOC_MOVE_EXT ?

I guess that the intention here is to do the move, without actually
moving the data right ? But nevertheless maybe some code can be
shared with ext4_move_extents() ?
It definitely can be shared, because it has specific case for unwritten
data see move_extent_per_page().
If I understand correctly, mov_extent_per_page calls mext_replace_branches to
_replace_ extents from 1 inode to other inode. Please correct me if I am wrong.
ioc_mov_data will not replace extents, but it will actually _move_ extents into
hole from donor to receiver, leaving a hole at the place from where extents are
moved.
Could you elaborate more how it can be shared for unwritten data case ?
But I think we can observe another way to unify this two things.
An idea inspired by the fact that ioc_move_data works only for
regular inodes, where orig_offset == donor_offset. 
Could you elaborate this point? 
This is showstopper
for  my utility e4defrag2 ( new version of e4defrag which is able defragment
pack small files as described here :
http://lists.openwall.net/linux-ext4/2014/04/28/3)

Proposed API is very similar to ext4_ext_migrate:
Args:
  orig_file: inode which we want to defragment
  donor_file: a file which will be used as a donor of blocks
1) fallocate big donor_file
2) a) Create tmp inode wich nlink = 0
   b) move extents required extents from  donor to tmp_donor_inode
   c) return file descriptor (tmp_fd) to that tmp_donor_inode
4) Mark orig_file's inode with EXT4_STATE_EXT_MIGRATE state
5) Copy data from orig_file to tmp_fd
6) IOC_SWAP_EX: atomically swap  orig_file->i_data and tmp_fd->i_data
   if EXT4_STATE_EXT_MIGRATE was not cleared.

This approach can works not only for regular file w/o journaling
enabled, but also for journaled ones, and directories.



quoted
-Lukas
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help