[Cluster-devel] [PATCH] gfs2: Dirty source inode during rename
Steven Whitehouse
swhiteho at redhat.com
Mon Mar 5 10:36:36 UTC 2018
Acked-by: Steven Whitehouse <swhiteho at redhat.com>
Looks good. Thanks,
Steve.
On 27/02/18 11:50, Andreas Gruenbacher wrote:
> Mark the source inode dirty during a rename instead of just updating the
> underlying buffer head. Otherwise, fsync may find the inode clean and
> will then skip flushing the journal. A subsequent power failure will
> cause the rename to be lost. This happens in command sequences like:
>
> xfs_io -f -c 'pwrite 0 4096' -c 'fsync' foo
> mv foo bar
> xfs_io -c 'fsync' bar
> # power failure
>
> Signed-off-by: Andreas Gruenbacher <agruenba at redhat.com>
> ---
> fs/gfs2/dir.c | 13 ++-----------
> fs/gfs2/inode.c | 10 +---------
> 2 files changed, 3 insertions(+), 20 deletions(-)
>
> diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
> index 7c21aea0266b..d9fb0ad6cc30 100644
> --- a/fs/gfs2/dir.c
> +++ b/fs/gfs2/dir.c
> @@ -1940,7 +1940,6 @@ int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
> {
> struct buffer_head *bh;
> struct gfs2_dirent *dent;
> - int error;
>
> dent = gfs2_dirent_search(&dip->i_inode, filename, gfs2_dirent_find, &bh);
> if (!dent) {
> @@ -1953,18 +1952,10 @@ int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
> gfs2_trans_add_meta(dip->i_gl, bh);
> gfs2_inum_out(nip, dent);
> dent->de_type = cpu_to_be16(new_type);
> -
> - if (dip->i_diskflags & GFS2_DIF_EXHASH) {
> - brelse(bh);
> - error = gfs2_meta_inode_buffer(dip, &bh);
> - if (error)
> - return error;
> - gfs2_trans_add_meta(dip->i_gl, bh);
> - }
> + brelse(bh);
>
> dip->i_inode.i_mtime = dip->i_inode.i_ctime = current_time(&dip->i_inode);
> - gfs2_dinode_out(dip, bh->b_data);
> - brelse(bh);
> + mark_inode_dirty_sync(&dip->i_inode);
> return 0;
> }
>
> diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
> index 59e0560180ec..8700eb815638 100644
> --- a/fs/gfs2/inode.c
> +++ b/fs/gfs2/inode.c
> @@ -1326,19 +1326,11 @@ static int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to)
> static int update_moved_ino(struct gfs2_inode *ip, struct gfs2_inode *ndip,
> int dir_rename)
> {
> - int error;
> - struct buffer_head *dibh;
> -
> if (dir_rename)
> return gfs2_dir_mvino(ip, &gfs2_qdotdot, ndip, DT_DIR);
>
> - error = gfs2_meta_inode_buffer(ip, &dibh);
> - if (error)
> - return error;
> ip->i_inode.i_ctime = current_time(&ip->i_inode);
> - gfs2_trans_add_meta(ip->i_gl, dibh);
> - gfs2_dinode_out(ip, dibh->b_data);
> - brelse(dibh);
> + mark_inode_dirty_sync(&ip->i_inode);
> return 0;
> }
>
More information about the Cluster-devel
mailing list