aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Phillips <daniel@tux3.org>2014-02-19 03:08:26 +0900
committerDaniel Phillips <daniel@tux3.org>2014-02-19 03:08:26 +0900
commit2cf5a1ee41b90b512210ead4b74df173cd445b0b (patch)
treeeb558ebc7383b4e993ba0e8efa07bc049aee2400
parent5134138d223dc2500a22c97f1ce0697f162aa8da (diff)
downloadlinux-tux3-2cf5a1ee41b90b512210ead4b74df173cd445b0b.tar.gz
tux3: Choose and assign inum after creating dirent
Refactoring towards choosing inode after creating directory entry. If tux_create_dirent sees an inode with TUX_INVALID_INO then it knows this is an inode create and it must choose the inode number. This is a slightly obscure way to do things, so insert a paranoia check in the create_link caller, where it is not completely obvious that the inode always has a valid inode number. At this point the inode choosing is done after the directory entry create, so we have the opportunity to use directory entry position as part of the inode number selection heuristics. Signed-off-by: Daniel Phillips <d.phillips@partner.samsung.com> Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
-rw-r--r--fs/tux3/dir.c10
-rw-r--r--fs/tux3/namei.c4
-rw-r--r--fs/tux3/tux3.h1
3 files changed, 9 insertions, 6 deletions
diff --git a/fs/tux3/dir.c b/fs/tux3/dir.c
index 134475ffbf4ba8..5340d5375dac22 100644
--- a/fs/tux3/dir.c
+++ b/fs/tux3/dir.c
@@ -202,7 +202,6 @@ int tux_create_dirent(struct inode *dir, const struct qstr *qstr,
struct inode *inode)
{
inum_t inum = tux_inode(inode)->inum;
- umode_t mode = inode->i_mode;
struct buffer_head *buffer;
loff_t i_size, where;
@@ -213,8 +212,15 @@ int tux_create_dirent(struct inode *dir, const struct qstr *qstr,
if (where < 0)
return where;
+ if (inum == TUX_INVALID_INO) {
+ int err = tux_assign_inum(inode);
+ if (err)
+ return err;
+ inum = tux_inode(inode)->inum;
+ }
+
/* This releases buffer */
- tux_set_entry(buffer, bufdata(buffer) + (where & tux_sb(dir->i_sb)->blockmask), inum, mode);
+ tux_set_entry(buffer, bufdata(buffer) + (where & tux_sb(dir->i_sb)->blockmask), inum, inode->i_mode);
tux3_iattrdirty(dir);
if (dir->i_size != i_size)
diff --git a/fs/tux3/namei.c b/fs/tux3/namei.c
index 804f675105103a..0d0570e3362b46 100644
--- a/fs/tux3/namei.c
+++ b/fs/tux3/namei.c
@@ -41,8 +41,6 @@ static int tux_add_dirent(struct inode *dir, struct dentry *dentry,
return err;
}
-int tux_assign_inum(struct inode *inode);
-
static int __tux3_mknod(struct inode *dir, struct dentry *dentry,
struct tux_iattr *iattr, dev_t rdev)
{
@@ -59,7 +57,6 @@ static int __tux3_mknod(struct inode *dir, struct dentry *dentry,
inode = tux_create_inode(dir, iattr, rdev);
err = PTR_ERR(inode);
if (!IS_ERR(inode)) {
- tux_assign_inum(inode); // !!! error handling
err = tux_add_dirent(dir, dentry, inode);
if (!err) {
unlock_new_inode(inode);
@@ -145,7 +142,6 @@ static int __tux3_symlink(struct inode *dir, struct dentry *dentry,
if (!IS_ERR(inode)) {
err = page_symlink(inode, symname, len);
if (!err) {
- tux_assign_inum(inode); // !!! error handling
err = tux_add_dirent(dir, dentry, inode);
if (!err) {
unlock_new_inode(inode);
diff --git a/fs/tux3/tux3.h b/fs/tux3/tux3.h
index 67c7c3680c9401..148f7a6013be81 100644
--- a/fs/tux3/tux3.h
+++ b/fs/tux3/tux3.h
@@ -846,6 +846,7 @@ struct inode *tux_new_logmap(struct sb *sb);
void del_defer_alloc_inum(struct inode *inode);
struct inode *tux_create_inode(struct inode *dir, struct tux_iattr *iattr,
dev_t rdev);
+int tux_assign_inum(struct inode *inode);
struct inode *tux_create_specific_inode(struct inode *dir, inum_t inum,
struct tux_iattr *iattr, dev_t rdev);
struct inode *tux3_iget(struct sb *sb, inum_t inum);