kernel: replace mini_fo with overlayfs for 2.6.37
SVN-Revision: 26209
This commit is contained in:
parent
a3b9971d84
commit
334ea34d35
15 changed files with 2995 additions and 8490 deletions
|
@ -582,8 +582,9 @@ CONFIG_EXPERIMENTAL=y
|
||||||
# CONFIG_EXT3_FS_XATTR is not set
|
# CONFIG_EXT3_FS_XATTR is not set
|
||||||
# CONFIG_EXT4_DEBUG is not set
|
# CONFIG_EXT4_DEBUG is not set
|
||||||
# CONFIG_EXT4_FS 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_SECURITY is not set
|
||||||
# CONFIG_EXT4_FS_XATTR is not set
|
CONFIG_EXT4_FS_XATTR=y
|
||||||
CONFIG_EXT4_USE_FOR_EXT23=y
|
CONFIG_EXT4_USE_FOR_EXT23=y
|
||||||
CONFIG_EXTRA_FIRMWARE=""
|
CONFIG_EXTRA_FIRMWARE=""
|
||||||
CONFIG_EXTRA_TARGETS=""
|
CONFIG_EXTRA_TARGETS=""
|
||||||
|
@ -1122,9 +1123,11 @@ CONFIG_JFFS2_CMODE_PRIORITY=y
|
||||||
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
|
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
|
||||||
CONFIG_JFFS2_FS=y
|
CONFIG_JFFS2_FS=y
|
||||||
CONFIG_JFFS2_FS_DEBUG=0
|
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_WBUF_VERIFY is not set
|
||||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||||
# CONFIG_JFFS2_FS_XATTR is not set
|
CONFIG_JFFS2_FS_XATTR=y
|
||||||
CONFIG_JFFS2_LZMA=y
|
CONFIG_JFFS2_LZMA=y
|
||||||
# CONFIG_JFFS2_LZO is not set
|
# CONFIG_JFFS2_LZO is not set
|
||||||
CONFIG_JFFS2_RTIME=y
|
CONFIG_JFFS2_RTIME=y
|
||||||
|
@ -1301,7 +1304,6 @@ CONFIG_MII=y
|
||||||
# CONFIG_MIKROTIK_RB532 is not set
|
# CONFIG_MIKROTIK_RB532 is not set
|
||||||
# CONFIG_MINIX_FS is not set
|
# CONFIG_MINIX_FS is not set
|
||||||
# CONFIG_MINIX_SUBPARTITION is not set
|
# CONFIG_MINIX_SUBPARTITION is not set
|
||||||
CONFIG_MINI_FO=y
|
|
||||||
# CONFIG_MIPS_ALCHEMY is not set
|
# CONFIG_MIPS_ALCHEMY is not set
|
||||||
# CONFIG_MIPS_COBALT is not set
|
# CONFIG_MIPS_COBALT is not set
|
||||||
# CONFIG_MIPS_FPU_EMU 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_OMFS_FS is not set
|
||||||
# CONFIG_ORION_WATCHDOG is not set
|
# CONFIG_ORION_WATCHDOG is not set
|
||||||
# CONFIG_OSF_PARTITION is not set
|
# CONFIG_OSF_PARTITION is not set
|
||||||
|
CONFIG_OVERLAYFS_FS=y
|
||||||
# CONFIG_P54_COMMON is not set
|
# CONFIG_P54_COMMON is not set
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
# CONFIG_PAGE_POISONING is not set
|
# 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 a new issue