mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 07:46:48 +00:00
kernel: replace mini_fo with overlayfs for 2.6.37
SVN-Revision: 26209
This commit is contained in:
parent
a3b9971d84
commit
334ea34d35
@ -582,8 +582,9 @@ CONFIG_EXPERIMENTAL=y
|
||||
# CONFIG_EXT3_FS_XATTR is not set
|
||||
# CONFIG_EXT4_DEBUG is not set
|
||||
# CONFIG_EXT4_FS is not set
|
||||
# CONFIG_EXT4_FS_POSIX_ACL is not set
|
||||
# CONFIG_EXT4_FS_SECURITY is not set
|
||||
# CONFIG_EXT4_FS_XATTR is not set
|
||||
CONFIG_EXT4_FS_XATTR=y
|
||||
CONFIG_EXT4_USE_FOR_EXT23=y
|
||||
CONFIG_EXTRA_FIRMWARE=""
|
||||
CONFIG_EXTRA_TARGETS=""
|
||||
@ -1122,9 +1123,11 @@ CONFIG_JFFS2_CMODE_PRIORITY=y
|
||||
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
# CONFIG_JFFS2_FS_POSIX_ACL is not set
|
||||
# CONFIG_JFFS2_FS_SECURITY is not set
|
||||
# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_FS_XATTR is not set
|
||||
CONFIG_JFFS2_FS_XATTR=y
|
||||
CONFIG_JFFS2_LZMA=y
|
||||
# CONFIG_JFFS2_LZO is not set
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
@ -1301,7 +1304,6 @@ CONFIG_MII=y
|
||||
# CONFIG_MIKROTIK_RB532 is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_MINIX_SUBPARTITION is not set
|
||||
CONFIG_MINI_FO=y
|
||||
# CONFIG_MIPS_ALCHEMY is not set
|
||||
# CONFIG_MIPS_COBALT is not set
|
||||
# CONFIG_MIPS_FPU_EMU is not set
|
||||
@ -1715,6 +1717,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
# CONFIG_OMFS_FS is not set
|
||||
# CONFIG_ORION_WATCHDOG is not set
|
||||
# CONFIG_OSF_PARTITION is not set
|
||||
CONFIG_OVERLAYFS_FS=y
|
||||
# CONFIG_P54_COMMON is not set
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PAGE_POISONING is not set
|
||||
|
File diff suppressed because it is too large
Load Diff
2787
target/linux/generic/patches-2.6.37/209-overlayfs.patch
Normal file
2787
target/linux/generic/patches-2.6.37/209-overlayfs.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,143 +0,0 @@
|
||||
--- a/fs/mini_fo/main.c
|
||||
+++ b/fs/mini_fo/main.c
|
||||
@@ -79,6 +79,7 @@ mini_fo_tri_interpose(dentry_t *hidden_d
|
||||
* of the new inode's fields
|
||||
*/
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
|
||||
/*
|
||||
* original: inode = iget(sb, hidden_inode->i_ino);
|
||||
*/
|
||||
@@ -87,6 +88,13 @@ mini_fo_tri_interpose(dentry_t *hidden_d
|
||||
err = -EACCES; /* should be impossible??? */
|
||||
goto out;
|
||||
}
|
||||
+#else
|
||||
+ inode = mini_fo_iget(sb, iunique(sb, 25));
|
||||
+ if (IS_ERR(inode)) {
|
||||
+ err = PTR_ERR(inode);
|
||||
+ goto out;
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
/*
|
||||
* interpose the inode if not already interposed
|
||||
@@ -184,9 +192,9 @@ mini_fo_parse_options(super_block_t *sb,
|
||||
hidden_root = ERR_PTR(err);
|
||||
goto out;
|
||||
}
|
||||
- hidden_root = nd.dentry;
|
||||
- stopd(sb)->base_dir_dentry = nd.dentry;
|
||||
- stopd(sb)->hidden_mnt = nd.mnt;
|
||||
+ hidden_root = nd_get_dentry(&nd);
|
||||
+ stopd(sb)->base_dir_dentry = nd_get_dentry(&nd);
|
||||
+ stopd(sb)->hidden_mnt = nd_get_mnt(&nd);
|
||||
|
||||
} else if(!strncmp("sto=", options, 4)) {
|
||||
/* parse the storage dir */
|
||||
@@ -204,9 +212,9 @@ mini_fo_parse_options(super_block_t *sb,
|
||||
hidden_root2 = ERR_PTR(err);
|
||||
goto out;
|
||||
}
|
||||
- hidden_root2 = nd2.dentry;
|
||||
- stopd(sb)->storage_dir_dentry = nd2.dentry;
|
||||
- stopd(sb)->hidden_mnt2 = nd2.mnt;
|
||||
+ hidden_root2 = nd_get_dentry(&nd2);
|
||||
+ stopd(sb)->storage_dir_dentry = nd_get_dentry(&nd2);
|
||||
+ stopd(sb)->hidden_mnt2 = nd_get_mnt(&nd2);
|
||||
stohs2(sb) = hidden_root2->d_sb;
|
||||
|
||||
/* validate storage dir, this is done in
|
||||
--- a/fs/mini_fo/mini_fo.h
|
||||
+++ b/fs/mini_fo/mini_fo.h
|
||||
@@ -302,6 +302,10 @@ extern int mini_fo_tri_interpose(dentry_
|
||||
extern int mini_fo_cp_cont(dentry_t *tgt_dentry, struct vfsmount *tgt_mnt,
|
||||
dentry_t *src_dentry, struct vfsmount *src_mnt);
|
||||
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
|
||||
+extern struct inode *mini_fo_iget(struct super_block *sb, unsigned long ino);
|
||||
+#endif
|
||||
+
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
extern int mini_fo_create(inode_t *dir, dentry_t *dentry, int mode, struct nameidata *nd);
|
||||
|
||||
@@ -501,6 +505,29 @@ static inline void double_unlock(struct
|
||||
#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
+
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
|
||||
+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
|
||||
+{
|
||||
+ return (nd->path.dentry);
|
||||
+}
|
||||
+
|
||||
+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
|
||||
+{
|
||||
+ return (nd->path.mnt);
|
||||
+}
|
||||
+#else
|
||||
+static inline dentry_t *nd_get_dentry(struct nameidata *nd)
|
||||
+{
|
||||
+ return (nd->dentry);
|
||||
+}
|
||||
+
|
||||
+static inline struct vfsmount *nd_get_mnt(struct nameidata *nd)
|
||||
+{
|
||||
+ return (nd->mnt);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
/*
|
||||
* Definitions for user and kernel code
|
||||
*/
|
||||
--- a/fs/mini_fo/super.c
|
||||
+++ b/fs/mini_fo/super.c
|
||||
@@ -266,10 +266,31 @@ mini_fo_umount_begin(super_block_t *sb)
|
||||
}
|
||||
#endif
|
||||
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
|
||||
+struct inode *
|
||||
+mini_fo_iget(struct super_block *sb, unsigned long ino)
|
||||
+{
|
||||
+ struct inode *inode;
|
||||
+
|
||||
+ inode = iget_locked(sb, ino);
|
||||
+ if (!inode)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ if (!(inode->i_state & I_NEW))
|
||||
+ return inode;
|
||||
+
|
||||
+ mini_fo_read_inode(inode);
|
||||
+
|
||||
+ unlock_new_inode(inode);
|
||||
+ return inode;
|
||||
+}
|
||||
+#endif /* if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25) */
|
||||
|
||||
struct super_operations mini_fo_sops =
|
||||
{
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25)
|
||||
read_inode: mini_fo_read_inode,
|
||||
+#endif
|
||||
#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
|
||||
write_inode: mini_fo_write_inode,
|
||||
#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
|
||||
--- a/fs/mini_fo/aux.c
|
||||
+++ b/fs/mini_fo/aux.c
|
||||
@@ -164,11 +164,11 @@ dentry_t *bpath_walk(super_block_t *sb,
|
||||
err = vfs_path_lookup(mnt->mnt_root, mnt, bpath+1, 0, &nd);
|
||||
|
||||
/* validate */
|
||||
- if (err || !nd.dentry || !nd.dentry->d_inode) {
|
||||
+ if (err || !nd_get_dentry(&nd) || !nd_get_dentry(&nd)->d_inode) {
|
||||
printk(KERN_CRIT "mini_fo: bpath_walk: path_walk failed.\n");
|
||||
return NULL;
|
||||
}
|
||||
- return nd.dentry;
|
||||
+ return nd_get_dentry(&nd);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,78 @@
|
||||
--- a/fs/overlayfs/overlayfs.c
|
||||
+++ b/fs/overlayfs/overlayfs.c
|
||||
@@ -28,13 +28,8 @@ struct ovl_fs {
|
||||
struct ovl_entry {
|
||||
struct dentry *__upperdentry;
|
||||
struct dentry *lowerdentry;
|
||||
- union {
|
||||
- struct {
|
||||
- u64 version;
|
||||
- bool opaque;
|
||||
- };
|
||||
- struct rcu_head rcu;
|
||||
- };
|
||||
+ u64 version;
|
||||
+ bool opaque;
|
||||
};
|
||||
|
||||
static const char *ovl_whiteout_xattr = "trusted.overlay.whiteout";
|
||||
@@ -632,12 +627,6 @@ static const struct file_operations ovl_
|
||||
|
||||
static const struct inode_operations ovl_dir_inode_operations;
|
||||
|
||||
-static void ovl_entry_free(struct rcu_head *head)
|
||||
-{
|
||||
- struct ovl_entry *oe = container_of(head, struct ovl_entry, rcu);
|
||||
- kfree(oe);
|
||||
-}
|
||||
-
|
||||
static void ovl_dentry_release(struct dentry *dentry)
|
||||
{
|
||||
struct ovl_entry *oe = dentry->d_fsdata;
|
||||
@@ -645,7 +634,7 @@ static void ovl_dentry_release(struct de
|
||||
if (oe) {
|
||||
dput(oe->__upperdentry);
|
||||
dput(oe->lowerdentry);
|
||||
- call_rcu(&oe->rcu, ovl_entry_free);
|
||||
+ kfree(oe);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1338,7 +1327,7 @@ static int ovl_dir_getattr(struct vfsmou
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int ovl_permission(struct inode *inode, int mask, unsigned int flags)
|
||||
+static int ovl_permission(struct inode *inode, int mask)
|
||||
{
|
||||
struct ovl_entry *oe;
|
||||
struct dentry *alias = NULL;
|
||||
@@ -1349,8 +1338,6 @@ static int ovl_permission(struct inode *
|
||||
|
||||
if (S_ISDIR(inode->i_mode)) {
|
||||
oe = inode->i_private;
|
||||
- } else if (flags & IPERM_FLAG_RCU) {
|
||||
- return -ECHILD;
|
||||
} else {
|
||||
/*
|
||||
* For non-directories find an alias and get the info
|
||||
@@ -1377,7 +1364,6 @@ static int ovl_permission(struct inode *
|
||||
/* Careful in RCU walk mode */
|
||||
realinode = ACCESS_ONCE(realdentry->d_inode);
|
||||
if (!realinode) {
|
||||
- WARN_ON(!(flags & IPERM_FLAG_RCU));
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
@@ -1402,9 +1388,9 @@ static int ovl_permission(struct inode *
|
||||
}
|
||||
|
||||
if (realinode->i_op->permission)
|
||||
- err = realinode->i_op->permission(realinode, mask, flags);
|
||||
+ err = realinode->i_op->permission(realinode, mask);
|
||||
else
|
||||
- err = generic_permission(realinode, mask, flags,
|
||||
+ err = generic_permission(realinode, mask,
|
||||
realinode->i_op->check_acl);
|
||||
out_dput:
|
||||
dput(alias);
|
@ -1,66 +0,0 @@
|
||||
--- a/fs/mini_fo/meta.c
|
||||
+++ b/fs/mini_fo/meta.c
|
||||
@@ -442,6 +442,11 @@ int meta_write_d_entry(dentry_t *dentry,
|
||||
S_IRUSR | S_IWUSR);
|
||||
#endif
|
||||
}
|
||||
+
|
||||
+ /* $%& err, is this correct? */
|
||||
+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
|
||||
+ mntget(meta_mnt);
|
||||
+
|
||||
/* open META-file for writing */
|
||||
meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
@@ -535,6 +540,11 @@ int meta_write_r_entry(dentry_t *dentry,
|
||||
meta_dentry, S_IRUSR | S_IWUSR);
|
||||
#endif
|
||||
}
|
||||
+
|
||||
+ /* $%& err, is this correct? */
|
||||
+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
|
||||
+ mntget(meta_mnt);
|
||||
+
|
||||
/* open META-file for writing */
|
||||
meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
@@ -671,14 +681,16 @@ int meta_sync_d_list(dentry_t *dentry, i
|
||||
}
|
||||
}
|
||||
|
||||
+ /* $%& err, is this correct? */
|
||||
+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
|
||||
+ mntget(meta_mnt);
|
||||
+
|
||||
/* open META-file for writing */
|
||||
meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
|
||||
ERROR opening meta file.\n");
|
||||
- /* we don't mntget so we dont't mntput (for now)
|
||||
- * mntput(meta_mnt);
|
||||
- */
|
||||
+ mntput(meta_mnt);
|
||||
dput(meta_dentry);
|
||||
err = -1;
|
||||
goto out;
|
||||
@@ -811,14 +823,16 @@ int meta_sync_r_list(dentry_t *dentry, i
|
||||
}
|
||||
}
|
||||
|
||||
+ /* $%& err, is this correct? */
|
||||
+ meta_mnt = stopd(dentry->d_inode->i_sb)->hidden_mnt2;
|
||||
+ mntget(meta_mnt);
|
||||
+
|
||||
/* open META-file for writing */
|
||||
meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
|
||||
ERROR opening meta file.\n");
|
||||
- /* we don't mntget so we dont't mntput (for now)
|
||||
- * mntput(meta_mnt);
|
||||
- */
|
||||
+ mntput(meta_mnt);
|
||||
dput(meta_dentry);
|
||||
err = -1;
|
||||
goto out;
|
@ -0,0 +1,124 @@
|
||||
--- a/fs/overlayfs/overlayfs.c
|
||||
+++ b/fs/overlayfs/overlayfs.c
|
||||
@@ -248,8 +248,7 @@ static struct ovl_cache_entry *ovl_cache
|
||||
}
|
||||
|
||||
static struct ovl_cache_entry *ovl_cache_entry_new(const char *name, int len,
|
||||
- u64 ino, unsigned int d_type,
|
||||
- bool is_whiteout)
|
||||
+ u64 ino, unsigned int d_type)
|
||||
{
|
||||
struct ovl_cache_entry *p;
|
||||
|
||||
@@ -262,7 +261,7 @@ static struct ovl_cache_entry *ovl_cache
|
||||
p->len = len;
|
||||
p->type = d_type;
|
||||
p->ino = ino;
|
||||
- p->is_whiteout = is_whiteout;
|
||||
+ p->is_whiteout = false;
|
||||
}
|
||||
|
||||
return p;
|
||||
@@ -270,7 +269,7 @@ static struct ovl_cache_entry *ovl_cache
|
||||
|
||||
static int ovl_cache_entry_add_rb(struct ovl_readdir_data *rdd,
|
||||
const char *name, int len, u64 ino,
|
||||
- unsigned int d_type, bool is_whiteout)
|
||||
+ unsigned int d_type)
|
||||
{
|
||||
struct rb_node **newp = &rdd->root->rb_node;
|
||||
struct rb_node *parent = NULL;
|
||||
@@ -291,11 +290,18 @@ static int ovl_cache_entry_add_rb(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
- p = ovl_cache_entry_new(name, len, ino, d_type, is_whiteout);
|
||||
+ p = ovl_cache_entry_new(name, len, ino, d_type);
|
||||
if (p == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
- list_add_tail(&p->l_node, rdd->list);
|
||||
+ /*
|
||||
+ * Add links before other types to be able to quicky mark
|
||||
+ * any whiteout entries
|
||||
+ */
|
||||
+ if (d_type == DT_LNK)
|
||||
+ list_add(&p->l_node, rdd->list);
|
||||
+ else
|
||||
+ list_add_tail(&p->l_node, rdd->list);
|
||||
rb_link_node(&p->node, parent, newp);
|
||||
rb_insert_color(&p->node, rdd->root);
|
||||
|
||||
@@ -313,7 +319,7 @@ static int ovl_fill_lower(void *buf, con
|
||||
if (p) {
|
||||
list_move_tail(&p->l_node, rdd->middle);
|
||||
} else {
|
||||
- p = ovl_cache_entry_new(name, namelen, ino, d_type, false);
|
||||
+ p = ovl_cache_entry_new(name, namelen, ino, d_type);
|
||||
if (p == NULL)
|
||||
rdd->err = -ENOMEM;
|
||||
else
|
||||
@@ -338,26 +344,9 @@ static int ovl_fill_upper(void *buf, con
|
||||
loff_t offset, u64 ino, unsigned int d_type)
|
||||
{
|
||||
struct ovl_readdir_data *rdd = buf;
|
||||
- bool is_whiteout = false;
|
||||
|
||||
rdd->count++;
|
||||
- if (d_type == DT_LNK) {
|
||||
- struct dentry *dentry;
|
||||
-
|
||||
- dentry = lookup_one_len(name, rdd->dir, namelen);
|
||||
- if (IS_ERR(dentry)) {
|
||||
- rdd->err = PTR_ERR(dentry);
|
||||
- goto out;
|
||||
- }
|
||||
- is_whiteout = ovl_is_whiteout(dentry);
|
||||
- dput(dentry);
|
||||
- }
|
||||
-
|
||||
- rdd->err = ovl_cache_entry_add_rb(rdd, name, namelen, ino, d_type,
|
||||
- is_whiteout);
|
||||
-
|
||||
-out:
|
||||
- return rdd->err;
|
||||
+ return ovl_cache_entry_add_rb(rdd, name, namelen, ino, d_type);
|
||||
}
|
||||
|
||||
static int ovl_dir_read(struct path *realpath, struct ovl_readdir_data *rdd,
|
||||
@@ -423,6 +412,26 @@ static void ovl_dir_reset(struct file *f
|
||||
}
|
||||
}
|
||||
|
||||
+static void ovl_dir_mark_whiteouts(struct ovl_readdir_data *rdd)
|
||||
+{
|
||||
+ struct ovl_cache_entry *p;
|
||||
+ struct dentry *dentry;
|
||||
+
|
||||
+ mutex_lock(&rdd->dir->d_inode->i_mutex);
|
||||
+ list_for_each_entry(p, rdd->list, l_node) {
|
||||
+ if (p->type != DT_LNK)
|
||||
+ break;
|
||||
+
|
||||
+ dentry = lookup_one_len(p->name, rdd->dir, p->len);
|
||||
+ if (IS_ERR(dentry))
|
||||
+ continue;
|
||||
+
|
||||
+ p->is_whiteout = ovl_is_whiteout(dentry);
|
||||
+ dput(dentry);
|
||||
+ }
|
||||
+ mutex_unlock(&rdd->dir->d_inode->i_mutex);
|
||||
+}
|
||||
+
|
||||
static int ovl_dir_read_merged(struct path *upperpath, struct path *lowerpath,
|
||||
struct ovl_readdir_data *rdd)
|
||||
{
|
||||
@@ -436,6 +445,8 @@ static int ovl_dir_read_merged(struct pa
|
||||
err = ovl_dir_read(upperpath, rdd, ovl_fill_upper);
|
||||
if (err)
|
||||
goto out;
|
||||
+
|
||||
+ ovl_dir_mark_whiteouts(rdd);
|
||||
}
|
||||
/*
|
||||
* Insert lowerpath entries before upperpath ones, this allows
|
@ -1,37 +0,0 @@
|
||||
--- a/fs/mini_fo/super.c
|
||||
+++ b/fs/mini_fo/super.c
|
||||
@@ -84,6 +84,7 @@ mini_fo_write_inode(inode_t *inode, int
|
||||
#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
|
||||
|
||||
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
|
||||
STATIC void
|
||||
mini_fo_put_inode(inode_t *inode)
|
||||
{
|
||||
@@ -99,6 +100,7 @@ mini_fo_put_inode(inode_t *inode)
|
||||
if (atomic_read(&inode->i_count) == 1)
|
||||
inode->i_nlink = 0;
|
||||
}
|
||||
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
|
||||
|
||||
|
||||
#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
|
||||
@@ -242,7 +244,7 @@ mini_fo_clear_inode(inode_t *inode)
|
||||
* dies.
|
||||
*/
|
||||
STATIC void
|
||||
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26))
|
||||
mini_fo_umount_begin(struct vfsmount *mnt, int flags)
|
||||
{
|
||||
struct vfsmount *hidden_mnt;
|
||||
@@ -294,7 +296,9 @@ struct super_operations mini_fo_sops =
|
||||
#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
|
||||
write_inode: mini_fo_write_inode,
|
||||
#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
|
||||
put_inode: mini_fo_put_inode,
|
||||
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
|
||||
#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
|
||||
delete_inode: mini_fo_delete_inode,
|
||||
#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
|
@ -1,41 +0,0 @@
|
||||
--- a/fs/mini_fo/inode.c
|
||||
+++ b/fs/mini_fo/inode.c
|
||||
@@ -439,7 +439,7 @@ mini_fo_symlink(inode_t *dir, dentry_t *
|
||||
int err=0;
|
||||
dentry_t *hidden_sto_dentry;
|
||||
dentry_t *hidden_sto_dir_dentry;
|
||||
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
|
||||
umode_t mode;
|
||||
#endif
|
||||
|
||||
@@ -466,7 +466,7 @@ mini_fo_symlink(inode_t *dir, dentry_t *
|
||||
down(&hidden_sto_dir_dentry->d_inode->i_sem);
|
||||
#endif
|
||||
|
||||
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
|
||||
mode = S_IALLUGO;
|
||||
err = vfs_symlink(hidden_sto_dir_dentry->d_inode,
|
||||
hidden_sto_dentry, symname, mode);
|
||||
@@ -1128,7 +1128,7 @@ void mini_fo_put_link(struct dentry *den
|
||||
#endif
|
||||
|
||||
STATIC int
|
||||
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
|
||||
mini_fo_permission(inode_t *inode, int mask, struct nameidata *nd)
|
||||
#else
|
||||
mini_fo_permission(inode_t *inode, int mask)
|
||||
@@ -1150,8 +1150,9 @@ mini_fo_permission(inode_t *inode, int m
|
||||
* if (err)
|
||||
* goto out;
|
||||
*/
|
||||
-
|
||||
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
|
||||
+ err = inode_permission(hidden_inode, mask);
|
||||
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
err = permission(hidden_inode, mask, nd);
|
||||
#else
|
||||
err = permission(hidden_inode, mask);
|
@ -1,96 +0,0 @@
|
||||
--- a/fs/mini_fo/aux.c
|
||||
+++ b/fs/mini_fo/aux.c
|
||||
@@ -236,7 +236,7 @@ int mini_fo_cp_cont(dentry_t *tgt_dentry
|
||||
mntget(src_mnt);
|
||||
|
||||
/* open file write only */
|
||||
- tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1);
|
||||
+ tgt_file = dentry_open(tgt_dentry, tgt_mnt, 0x1, current_cred());
|
||||
if(!tgt_file || IS_ERR(tgt_file)) {
|
||||
printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening target file.\n");
|
||||
err = PTR_ERR(tgt_file);
|
||||
@@ -244,7 +244,7 @@ int mini_fo_cp_cont(dentry_t *tgt_dentry
|
||||
}
|
||||
|
||||
/* open file read only */
|
||||
- src_file = dentry_open(src_dentry, src_mnt, 0x0);
|
||||
+ src_file = dentry_open(src_dentry, src_mnt, 0x0, current_cred());
|
||||
if(!src_file || IS_ERR(src_file)) {
|
||||
printk(KERN_CRIT "mini_fo_cp_cont: ERROR opening source file.\n");
|
||||
err = PTR_ERR(src_file);
|
||||
--- a/fs/mini_fo/file.c
|
||||
+++ b/fs/mini_fo/file.c
|
||||
@@ -437,7 +437,7 @@ mini_fo_open(inode_t *inode, file_t *fil
|
||||
mntget(stopd(inode->i_sb)->hidden_mnt);
|
||||
hidden_file = dentry_open(hidden_dentry,
|
||||
stopd(inode->i_sb)->hidden_mnt,
|
||||
- hidden_flags);
|
||||
+ hidden_flags, file->f_cred);
|
||||
if (IS_ERR(hidden_file)) {
|
||||
err = PTR_ERR(hidden_file);
|
||||
dput(hidden_dentry);
|
||||
@@ -479,7 +479,7 @@ mini_fo_open(inode_t *inode, file_t *fil
|
||||
mntget(stopd(inode->i_sb)->hidden_mnt);
|
||||
hidden_file = dentry_open(hidden_dentry,
|
||||
stopd(inode->i_sb)->hidden_mnt,
|
||||
- hidden_flags);
|
||||
+ hidden_flags, file->f_cred);
|
||||
if (IS_ERR(hidden_file)) {
|
||||
err = PTR_ERR(hidden_file);
|
||||
dput(hidden_dentry);
|
||||
@@ -512,7 +512,7 @@ mini_fo_open(inode_t *inode, file_t *fil
|
||||
mntget(stopd(inode->i_sb)->hidden_mnt2);
|
||||
hidden_sto_file = dentry_open(hidden_sto_dentry,
|
||||
stopd(inode->i_sb)->hidden_mnt2,
|
||||
- hidden_flags);
|
||||
+ hidden_flags, file->f_cred);
|
||||
|
||||
/* dentry_open dputs the dentry if it fails */
|
||||
if (IS_ERR(hidden_sto_file)) {
|
||||
--- a/fs/mini_fo/meta.c
|
||||
+++ b/fs/mini_fo/meta.c
|
||||
@@ -56,7 +56,7 @@ int meta_build_lists(dentry_t *dentry)
|
||||
|
||||
|
||||
/* open META-file for reading */
|
||||
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x0);
|
||||
+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x0, current_cred());
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
printk(KERN_CRIT "mini_fo: meta_build_lists: \
|
||||
ERROR opening META file.\n");
|
||||
@@ -448,7 +448,7 @@ int meta_write_d_entry(dentry_t *dentry,
|
||||
mntget(meta_mnt);
|
||||
|
||||
/* open META-file for writing */
|
||||
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
|
||||
+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
printk(KERN_CRIT "mini_fo: meta_write_d_entry: \
|
||||
ERROR opening meta file.\n");
|
||||
@@ -546,7 +546,7 @@ int meta_write_r_entry(dentry_t *dentry,
|
||||
mntget(meta_mnt);
|
||||
|
||||
/* open META-file for writing */
|
||||
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
|
||||
+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
printk(KERN_CRIT "mini_fo: meta_write_r_entry: \
|
||||
ERROR opening meta file.\n");
|
||||
@@ -686,7 +686,7 @@ int meta_sync_d_list(dentry_t *dentry, i
|
||||
mntget(meta_mnt);
|
||||
|
||||
/* open META-file for writing */
|
||||
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
|
||||
+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
printk(KERN_CRIT "mini_fo: meta_sync_d_list: \
|
||||
ERROR opening meta file.\n");
|
||||
@@ -828,7 +828,7 @@ int meta_sync_r_list(dentry_t *dentry, i
|
||||
mntget(meta_mnt);
|
||||
|
||||
/* open META-file for writing */
|
||||
- meta_file = dentry_open(meta_dentry, meta_mnt, 0x1);
|
||||
+ meta_file = dentry_open(meta_dentry, meta_mnt, 0x1, current_cred());
|
||||
if(!meta_file || IS_ERR(meta_file)) {
|
||||
printk(KERN_CRIT "mini_fo: meta_sync_r_list: \
|
||||
ERROR opening meta file.\n");
|
@ -1,157 +0,0 @@
|
||||
--- a/fs/mini_fo/aux.c
|
||||
+++ b/fs/mini_fo/aux.c
|
||||
@@ -86,8 +86,10 @@ int get_neg_sto_dentry(dentry_t *dentry)
|
||||
len = dentry->d_name.len;
|
||||
name = dentry->d_name.name;
|
||||
|
||||
+ mutex_lock(&dtohd2(dentry->d_parent)->d_inode->i_mutex);
|
||||
dtohd2(dentry) =
|
||||
lookup_one_len(name, dtohd2(dentry->d_parent), len);
|
||||
+ mutex_unlock(&dtohd2(dentry->d_parent)->d_inode->i_mutex);
|
||||
|
||||
out:
|
||||
return err;
|
||||
@@ -426,7 +428,9 @@ int build_sto_structure(dentry_t *dir, d
|
||||
const unsigned char *name;
|
||||
len = dtohd(dentry)->d_name.len;
|
||||
name = dtohd(dentry)->d_name.name;
|
||||
+ mutex_lock(&dtohd2(dir)->d_inode->i_mutex);
|
||||
hidden_sto_dentry = lookup_one_len(name, dtohd2(dir), len);
|
||||
+ mutex_unlock(&dtohd2(dir)->d_inode->i_mutex);
|
||||
dtohd2(dentry) = hidden_sto_dentry;
|
||||
}
|
||||
|
||||
--- a/fs/mini_fo/inode.c
|
||||
+++ b/fs/mini_fo/inode.c
|
||||
@@ -113,17 +113,23 @@ mini_fo_lookup(inode_t *dir, dentry_t *d
|
||||
hidden_dir_dentry = hidden_dentry->d_parent;
|
||||
kfree(bpath);
|
||||
}
|
||||
- else if(hidden_dir_dentry && hidden_dir_dentry->d_inode)
|
||||
+ else if(hidden_dir_dentry && hidden_dir_dentry->d_inode) {
|
||||
+ mutex_lock(&hidden_dir_dentry->d_inode->i_mutex);
|
||||
hidden_dentry =
|
||||
lookup_one_len(name, hidden_dir_dentry, namelen);
|
||||
- else
|
||||
+ mutex_unlock(&hidden_dir_dentry->d_inode->i_mutex);
|
||||
+ } else {
|
||||
hidden_dentry = NULL;
|
||||
+ }
|
||||
|
||||
- if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode)
|
||||
+ if(hidden_sto_dir_dentry && hidden_sto_dir_dentry->d_inode) {
|
||||
+ mutex_lock(&hidden_sto_dir_dentry->d_inode->i_mutex);
|
||||
hidden_sto_dentry =
|
||||
lookup_one_len(name, hidden_sto_dir_dentry, namelen);
|
||||
- else
|
||||
+ mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
|
||||
+ } else {
|
||||
hidden_sto_dentry = NULL;
|
||||
+ }
|
||||
|
||||
/* catch error in lookup */
|
||||
if (IS_ERR(hidden_dentry) || IS_ERR(hidden_sto_dentry)) {
|
||||
@@ -553,9 +559,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
|
||||
#endif
|
||||
|
||||
/* Delete an old WOL file contained in the storage dir */
|
||||
+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
hidden_sto_dentry,
|
||||
strlen(META_FILENAME));
|
||||
+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
|
||||
if(meta_dentry->d_inode) {
|
||||
err = vfs_unlink(hidden_sto_dentry->d_inode, meta_dentry);
|
||||
dput(meta_dentry);
|
||||
@@ -643,9 +651,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
|
||||
#endif
|
||||
|
||||
/* Delete an old WOL file contained in the storage dir */
|
||||
+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
hidden_sto_dentry,
|
||||
strlen(META_FILENAME));
|
||||
+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
|
||||
if(meta_dentry->d_inode) {
|
||||
/* is this necessary? dget(meta_dentry); */
|
||||
err = vfs_unlink(hidden_sto_dentry->d_inode,
|
||||
@@ -688,9 +698,11 @@ mini_fo_rmdir(inode_t *dir, dentry_t *de
|
||||
#endif
|
||||
|
||||
/* Delete an old WOL file contained in the storage dir */
|
||||
+ mutex_lock(&hidden_sto_dentry->d_inode->i_mutex);
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
hidden_sto_dentry,
|
||||
strlen(META_FILENAME));
|
||||
+ mutex_unlock(&hidden_sto_dentry->d_inode->i_mutex);
|
||||
if(meta_dentry->d_inode) {
|
||||
/* is this necessary? dget(meta_dentry); */
|
||||
err = vfs_unlink(hidden_sto_dentry->d_inode,
|
||||
--- a/fs/mini_fo/meta.c
|
||||
+++ b/fs/mini_fo/meta.c
|
||||
@@ -43,9 +43,11 @@ int meta_build_lists(dentry_t *dentry)
|
||||
|
||||
/* might there be a META-file? */
|
||||
if(dtohd2(dentry) && dtohd2(dentry)->d_inode) {
|
||||
+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
dtohd2(dentry),
|
||||
strlen(META_FILENAME));
|
||||
+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
if(!meta_dentry->d_inode) {
|
||||
dput(meta_dentry);
|
||||
goto out_ok;
|
||||
@@ -426,8 +428,11 @@ int meta_write_d_entry(dentry_t *dentry,
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
dtohd2(dentry), strlen (META_FILENAME));
|
||||
+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
|
||||
/* We need to create a META-file */
|
||||
if(!meta_dentry->d_inode) {
|
||||
@@ -527,9 +532,13 @@ int meta_write_r_entry(dentry_t *dentry,
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
dtohd2(dentry),
|
||||
strlen (META_FILENAME));
|
||||
+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
+
|
||||
if(!meta_dentry->d_inode) {
|
||||
/* We need to create a META-file */
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
@@ -641,9 +650,13 @@ int meta_sync_d_list(dentry_t *dentry, i
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
dtohd2(dentry),
|
||||
strlen(META_FILENAME));
|
||||
+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
+
|
||||
if(!meta_dentry->d_inode) {
|
||||
/* We need to create a META-file */
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
@@ -784,9 +797,13 @@ int meta_sync_r_list(dentry_t *dentry, i
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ mutex_lock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
dtohd2(dentry),
|
||||
strlen(META_FILENAME));
|
||||
+ mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
+
|
||||
if(!meta_dentry->d_inode) {
|
||||
/* We need to create a META-file */
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
@ -1,25 +0,0 @@
|
||||
--- a/fs/mini_fo/state.c
|
||||
+++ b/fs/mini_fo/state.c
|
||||
@@ -537,17 +537,17 @@ int nondir_mod_to_del(dentry_t *dentry)
|
||||
dtohd(dentry) = NULL;
|
||||
dtost(dentry) = DELETED;
|
||||
|
||||
- /* add deleted file to META-file */
|
||||
- meta_add_d_entry(dentry->d_parent,
|
||||
- dentry->d_name.name,
|
||||
- dentry->d_name.len);
|
||||
-
|
||||
/* was: unlock_dir(hidden_sto_dir_dentry); */
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
|
||||
mutex_unlock(&hidden_sto_dir_dentry->d_inode->i_mutex);
|
||||
#else
|
||||
up(&hidden_sto_dir_dentry->d_inode->i_sem);
|
||||
#endif
|
||||
+ /* add deleted file to META-file */
|
||||
+ meta_add_d_entry(dentry->d_parent,
|
||||
+ dentry->d_name.name,
|
||||
+ dentry->d_name.len);
|
||||
+
|
||||
dput(hidden_sto_dir_dentry);
|
||||
|
||||
out:
|
@ -1,45 +0,0 @@
|
||||
--- a/fs/mini_fo/file.c
|
||||
+++ b/fs/mini_fo/file.c
|
||||
@@ -599,7 +599,7 @@ mini_fo_release(inode_t *inode, file_t *
|
||||
}
|
||||
|
||||
STATIC int
|
||||
-mini_fo_fsync(file_t *file, dentry_t *dentry, int datasync)
|
||||
+mini_fo_fsync(file_t *file, int datasync)
|
||||
{
|
||||
int err1 = 0;
|
||||
int err2 = 0;
|
||||
@@ -609,14 +609,14 @@ mini_fo_fsync(file_t *file, dentry_t *de
|
||||
check_mini_fo_file(file);
|
||||
|
||||
if ((hidden_file = ftohf(file)) != NULL) {
|
||||
- hidden_dentry = dtohd(dentry);
|
||||
+ hidden_dentry = dtohd(file->f_path.dentry);
|
||||
if (hidden_file->f_op && hidden_file->f_op->fsync) {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
|
||||
mutex_lock(&hidden_dentry->d_inode->i_mutex);
|
||||
#else
|
||||
down(&hidden_dentry->d_inode->i_sem);
|
||||
#endif
|
||||
- err1 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
|
||||
+ err1 = hidden_file->f_op->fsync(hidden_file, datasync);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
|
||||
mutex_unlock(&hidden_dentry->d_inode->i_mutex);
|
||||
#else
|
||||
@@ -626,14 +626,14 @@ mini_fo_fsync(file_t *file, dentry_t *de
|
||||
}
|
||||
|
||||
if ((hidden_file = ftohf2(file)) != NULL) {
|
||||
- hidden_dentry = dtohd2(dentry);
|
||||
+ hidden_dentry = dtohd2(file->f_path.dentry);
|
||||
if (hidden_file->f_op && hidden_file->f_op->fsync) {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
|
||||
mutex_lock(&hidden_dentry->d_inode->i_mutex);
|
||||
#else
|
||||
down(&hidden_dentry->d_inode->i_sem);
|
||||
#endif
|
||||
- err2 = hidden_file->f_op->fsync(hidden_file, hidden_dentry, datasync);
|
||||
+ err2 = hidden_file->f_op->fsync(hidden_file, datasync);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
|
||||
mutex_unlock(&hidden_dentry->d_inode->i_mutex);
|
||||
#else
|
@ -1,43 +0,0 @@
|
||||
--- a/fs/mini_fo/super.c
|
||||
+++ b/fs/mini_fo/super.c
|
||||
@@ -76,7 +76,7 @@ mini_fo_read_inode(inode_t *inode)
|
||||
* to write some of our own stuff to disk.
|
||||
*/
|
||||
STATIC void
|
||||
-mini_fo_write_inode(inode_t *inode, int sync)
|
||||
+mini_fo_write_inode(inode_t *inode, struct writeback_control *wbc)
|
||||
{
|
||||
print_entry_location();
|
||||
print_exit_location();
|
||||
@@ -112,13 +112,14 @@ mini_fo_put_inode(inode_t *inode)
|
||||
* on our and the lower inode.
|
||||
*/
|
||||
STATIC void
|
||||
-mini_fo_delete_inode(inode_t *inode)
|
||||
+mini_fo_evict_inode(inode_t *inode)
|
||||
{
|
||||
print_entry_location();
|
||||
|
||||
- fist_checkinode(inode, "mini_fo_delete_inode IN");
|
||||
- inode->i_size = 0; /* every f/s seems to do that */
|
||||
- clear_inode(inode);
|
||||
+ fist_checkinode(inode, "mini_fo_evict_inode IN");
|
||||
+ truncate_inode_pages(&inode->i_data, 0); /* FIXME: do we need this? */
|
||||
+ invalidate_inode_buffers(inode);
|
||||
+ end_writeback(inode);
|
||||
|
||||
print_exit_location();
|
||||
}
|
||||
@@ -300,11 +301,10 @@ struct super_operations mini_fo_sops =
|
||||
put_inode: mini_fo_put_inode,
|
||||
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) */
|
||||
#if defined(FIST_DEBUG) || defined(FIST_FILTER_SCA)
|
||||
- delete_inode: mini_fo_delete_inode,
|
||||
+ evict_inode: mini_fo_evict_inode,
|
||||
#endif /* defined(FIST_DEBUG) || defined(FIST_FILTER_SCA) */
|
||||
put_super: mini_fo_put_super,
|
||||
statfs: mini_fo_statfs,
|
||||
remount_fs: mini_fo_remount_fs,
|
||||
- clear_inode: mini_fo_clear_inode,
|
||||
umount_begin: mini_fo_umount_begin,
|
||||
};
|
@ -1,48 +0,0 @@
|
||||
--- a/fs/mini_fo/meta.c
|
||||
+++ b/fs/mini_fo/meta.c
|
||||
@@ -48,6 +48,9 @@ int meta_build_lists(dentry_t *dentry)
|
||||
dtohd2(dentry),
|
||||
strlen(META_FILENAME));
|
||||
mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
+ if (IS_ERR(meta_dentry))
|
||||
+ goto out_ok;
|
||||
+
|
||||
if(!meta_dentry->d_inode) {
|
||||
dput(meta_dentry);
|
||||
goto out_ok;
|
||||
@@ -433,6 +436,8 @@ int meta_write_d_entry(dentry_t *dentry,
|
||||
meta_dentry = lookup_one_len(META_FILENAME,
|
||||
dtohd2(dentry), strlen (META_FILENAME));
|
||||
mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
+ if (IS_ERR(meta_dentry))
|
||||
+ return PTR_ERR(meta_dentry);
|
||||
|
||||
/* We need to create a META-file */
|
||||
if(!meta_dentry->d_inode) {
|
||||
@@ -538,6 +543,8 @@ int meta_write_r_entry(dentry_t *dentry,
|
||||
dtohd2(dentry),
|
||||
strlen (META_FILENAME));
|
||||
mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
+ if (IS_ERR(meta_dentry))
|
||||
+ return PTR_ERR(meta_dentry);
|
||||
|
||||
if(!meta_dentry->d_inode) {
|
||||
/* We need to create a META-file */
|
||||
@@ -656,6 +663,8 @@ int meta_sync_d_list(dentry_t *dentry, i
|
||||
dtohd2(dentry),
|
||||
strlen(META_FILENAME));
|
||||
mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
+ if (IS_ERR(meta_dentry))
|
||||
+ return PTR_ERR(meta_dentry);
|
||||
|
||||
if(!meta_dentry->d_inode) {
|
||||
/* We need to create a META-file */
|
||||
@@ -803,6 +812,8 @@ int meta_sync_r_list(dentry_t *dentry, i
|
||||
dtohd2(dentry),
|
||||
strlen(META_FILENAME));
|
||||
mutex_unlock(&dtohd2(dentry)->d_inode->i_mutex);
|
||||
+ if (IS_ERR(meta_dentry))
|
||||
+ return PTR_ERR(meta_dentry);
|
||||
|
||||
if(!meta_dentry->d_inode) {
|
||||
/* We need to create a META-file */
|
Loading…
Reference in New Issue
Block a user