summaryrefslogtreecommitdiffstats
path: root/GFS2-Make-rename-not-save-dirent-location.patch
diff options
context:
space:
mode:
Diffstat (limited to 'GFS2-Make-rename-not-save-dirent-location.patch')
-rw-r--r--GFS2-Make-rename-not-save-dirent-location.patch90
1 files changed, 0 insertions, 90 deletions
diff --git a/GFS2-Make-rename-not-save-dirent-location.patch b/GFS2-Make-rename-not-save-dirent-location.patch
deleted file mode 100644
index adb4e6d73..000000000
--- a/GFS2-Make-rename-not-save-dirent-location.patch
+++ /dev/null
@@ -1,90 +0,0 @@
-From: Bob Peterson <rpeterso@redhat.com>
-Date: Mon, 29 Sep 2014 08:52:04 -0400
-Subject: [PATCH] GFS2: Make rename not save dirent location
-
-This patch fixes a regression in the patch "GFS2: Remember directory
-insert point", commit 2b47dad866d04f14c328f888ba5406057b8c7d33.
-The problem had to do with the rename function: The function found
-space for the new dirent, and remembered that location. But then the
-old dirent was removed, which often moved the eligible location for
-the renamed dirent. Putting the new dirent at the saved location
-caused file system corruption.
-
-This patch adds a new "save_loc" variable to struct gfs2_diradd.
-If 1, the dirent location is saved. If 0, the dirent location is not
-saved and the buffer_head is released as per previous behavior.
-
-Signed-off-by: Bob Peterson <rpeterso@redhat.com>
-Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
----
- fs/gfs2/dir.c | 9 +++++++--
- fs/gfs2/dir.h | 1 +
- fs/gfs2/inode.c | 6 +++---
- 3 files changed, 11 insertions(+), 5 deletions(-)
-
-diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
-index 1a349f9a9685..5d4261ff5d23 100644
---- a/fs/gfs2/dir.c
-+++ b/fs/gfs2/dir.c
-@@ -2100,8 +2100,13 @@ int gfs2_diradd_alloc_required(struct inode *inode, const struct qstr *name,
- }
- if (IS_ERR(dent))
- return PTR_ERR(dent);
-- da->bh = bh;
-- da->dent = dent;
-+
-+ if (da->save_loc) {
-+ da->bh = bh;
-+ da->dent = dent;
-+ } else {
-+ brelse(bh);
-+ }
- return 0;
- }
-
-diff --git a/fs/gfs2/dir.h b/fs/gfs2/dir.h
-index 126c65dda028..e1b309c24dab 100644
---- a/fs/gfs2/dir.h
-+++ b/fs/gfs2/dir.h
-@@ -23,6 +23,7 @@ struct gfs2_diradd {
- unsigned nr_blocks;
- struct gfs2_dirent *dent;
- struct buffer_head *bh;
-+ int save_loc;
- };
-
- extern struct inode *gfs2_dir_search(struct inode *dir,
-diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
-index fc8ac2ee0667..7d2723ce067e 100644
---- a/fs/gfs2/inode.c
-+++ b/fs/gfs2/inode.c
-@@ -600,7 +600,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
- int error, free_vfs_inode = 0;
- u32 aflags = 0;
- unsigned blocks = 1;
-- struct gfs2_diradd da = { .bh = NULL, };
-+ struct gfs2_diradd da = { .bh = NULL, .save_loc = 1, };
-
- if (!name->len || name->len > GFS2_FNAMESIZE)
- return -ENAMETOOLONG;
-@@ -899,7 +899,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
- struct gfs2_inode *ip = GFS2_I(inode);
- struct gfs2_holder ghs[2];
- struct buffer_head *dibh;
-- struct gfs2_diradd da = { .bh = NULL, };
-+ struct gfs2_diradd da = { .bh = NULL, .save_loc = 1, };
- int error;
-
- if (S_ISDIR(inode->i_mode))
-@@ -1337,7 +1337,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
- struct gfs2_rgrpd *nrgd;
- unsigned int num_gh;
- int dir_rename = 0;
-- struct gfs2_diradd da = { .nr_blocks = 0, };
-+ struct gfs2_diradd da = { .nr_blocks = 0, .save_loc = 0, };
- unsigned int x;
- int error;
-
---
-1.9.3
-