Commit 8fef72dc authored by J. R. Okajima's avatar J. R. Okajima
Browse files

Merge branch 'aufs5.x-rcN/30stdalone' into aufs5.x-rcN/39public

parents 51a0d3a9 274a824c
......@@ -249,6 +249,13 @@ optional. When you meet some problems, they will help you.
Supports a nested loopback mount in a branch-fs. This patch is
unnecessary until aufs produces a message like "you may want to try
another patch for loopback file".
- proc_mounts.patch
When there are many mountpoints and many mount(2)/umount(2) are
running, then /proc/mounts may not show the all mountpoints. This
patch makes /proc/mounts always show the full mountpoints list.
If you don't want to apply this patch and meet such problem, then you
need to increase the value of 'ProcMounts_Times' make-variable in
aufs-util.git as a second best solution.
- vfs-ino.patch
Modifies a system global kernel internal function get_next_ino() in
order to stop assigning 0 for an inode-number. Not directly related to
......
......@@ -225,7 +225,8 @@ int au_br_stfs(struct au_branch *br, struct aufs_stfs *stfs);
static const loff_t au_loff_max = LLONG_MAX;
aufs_bindex_t au_xi_root(struct super_block *sb, struct dentry *dentry);
struct file *au_xino_create(struct super_block *sb, char *fpath, int silent);
struct file *au_xino_create(struct super_block *sb, char *fpath, int silent,
int wbrtop);
struct file *au_xino_create2(struct super_block *sb, struct path *base,
struct file *copy_src);
struct au_xi_new {
......
......@@ -162,13 +162,12 @@ static void au_hfsn_free_group(struct fsnotify_group *group)
static int au_hfsn_handle_event(struct fsnotify_group *group,
struct inode *inode,
u32 mask, const void *data, int data_type,
const unsigned char *file_name, u32 cookie,
const struct qstr *file_name, u32 cookie,
struct fsnotify_iter_info *iter_info)
{
int err;
struct au_hnotify *hnotify;
struct inode *h_dir, *h_inode;
struct qstr h_child_qstr = QSTR_INIT(file_name, strlen(file_name));
struct fsnotify_mark *inode_mark;
AuDebugOn(data_type != FSNOTIFY_EVENT_INODE);
......@@ -196,7 +195,7 @@ static int au_hfsn_handle_event(struct fsnotify_group *group,
inode_mark = fsnotify_iter_inode_mark(iter_info);
AuDebugOn(!inode_mark);
hnotify = container_of(inode_mark, struct au_hnotify, hn_mark);
err = au_hnotify(h_dir, hnotify, mask, &h_child_qstr, h_inode);
err = au_hnotify(h_dir, hnotify, mask, file_name, h_inode);
out:
return err;
......
......@@ -548,7 +548,7 @@ out:
/* ---------------------------------------------------------------------- */
int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask,
struct qstr *h_child_qstr, struct inode *h_child_inode)
const struct qstr *h_child_qstr, struct inode *h_child_inode)
{
int err, len;
unsigned int flags[AuHnLast], f;
......
......@@ -613,7 +613,7 @@ void au_hn_free(struct au_hinode *hinode);
void au_hn_ctl(struct au_hinode *hinode, int do_set);
void au_hn_reset(struct inode *inode, unsigned int flags);
int au_hnotify(struct inode *h_dir, struct au_hnotify *hnotify, u32 mask,
struct qstr *h_child_qstr, struct inode *h_child_inode);
const struct qstr *h_child_qstr, struct inode *h_child_inode);
int au_hnotify_reset_br(unsigned int udba, struct au_branch *br, int perm);
int au_hnotify_init_br(struct au_branch *br, int perm);
void au_hnotify_fin_br(struct au_branch *br);
......
......@@ -40,7 +40,7 @@ void au_warn_loopback(struct super_block *h_sb);
int au_loopback_init(void);
void au_loopback_fin(void);
#else
AuStub(struct file *, loop_backing_file, return NULL)
AuStub(struct file *, loop_backing_file, return NULL, struct super_block *sb)
AuStubInt0(au_test_loopback_overlap, struct super_block *sb,
struct dentry *h_adding)
......
......@@ -918,7 +918,7 @@ static int au_opts_parse_xino(struct super_block *sb, struct au_opt_xino *xino,
int err;
struct file *file;
file = au_xino_create(sb, args[0].from, /*silent*/0);
file = au_xino_create(sb, args[0].from, /*silent*/0, /*wbrtop*/0);
err = PTR_ERR(file);
if (IS_ERR(file))
goto out;
......
......@@ -44,18 +44,15 @@ static struct inode *aufs_alloc_inode(struct super_block *sb __maybe_unused)
return NULL;
}
static void aufs_destroy_inode_cb(struct rcu_head *head)
{
struct inode *inode = container_of(head, struct inode, i_rcu);
au_cache_free_icntnr(container_of(inode, struct au_icntnr, vfs_inode));
}
static void aufs_destroy_inode(struct inode *inode)
{
if (!au_is_bad_inode(inode))
au_iinfo_fin(inode);
call_rcu(&inode->i_rcu, aufs_destroy_inode_cb);
}
static void aufs_free_inode(struct inode *inode)
{
au_cache_free_icntnr(container_of(inode, struct au_icntnr, vfs_inode));
}
struct inode *au_iget_locked(struct super_block *sb, ino_t ino)
......@@ -853,6 +850,7 @@ out:
static const struct super_operations aufs_sop = {
.alloc_inode = aufs_alloc_inode,
.destroy_inode = aufs_destroy_inode,
.free_inode = aufs_free_inode,
/* always deleting, no clearing */
.drop_inode = generic_delete_inode,
.show_options = aufs_show_options,
......
......@@ -160,22 +160,28 @@ static void au_xino_unlock_dir(struct au_xino_lock_dir *ldir)
/*
* create and set a new xino file
*/
struct file *au_xino_create(struct super_block *sb, char *fpath, int silent)
struct file *au_xino_create(struct super_block *sb, char *fpath, int silent,
int wbrtop)
{
struct file *file;
struct dentry *h_parent, *d;
struct inode *h_dir, *inode;
int err;
static DEFINE_MUTEX(mtx);
/*
* at mount-time, and the xino file is the default path,
* hnotify is disabled so we have no notify events to ignore.
* when a user specified the xino, we cannot get au_hdir to be ignored.
*/
if (!wbrtop)
mutex_lock(&mtx);
file = vfsub_filp_open(fpath, O_RDWR | O_CREAT | O_EXCL | O_LARGEFILE
/* | __FMODE_NONOTIFY */,
0666);
if (IS_ERR(file)) {
if (!wbrtop)
mutex_unlock(&mtx);
if (!silent)
pr_err("open %s(%ld)\n", fpath, PTR_ERR(file));
return file;
......@@ -185,6 +191,8 @@ struct file *au_xino_create(struct super_block *sb, char *fpath, int silent)
err = 0;
d = file->f_path.dentry;
h_parent = au_dget_parent_lock(d, AuLsc_I_PARENT);
if (!wbrtop)
mutex_unlock(&mtx);
/* mnt_want_write() is unnecessary here */
h_dir = d_inode(h_parent);
inode = file_inode(file);
......@@ -1667,11 +1675,12 @@ struct file *au_xino_def(struct super_block *sb)
if (!IS_ERR(p)) {
strcat(p, "/" AUFS_XINO_FNAME);
AuDbg("%s\n", p);
file = au_xino_create(sb, p, /*silent*/0);
file = au_xino_create(sb, p, /*silent*/0, /*wbrtop*/1);
}
free_page((unsigned long)page);
} else {
file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0);
file = au_xino_create(sb, AUFS_XINO_DEFPATH, /*silent*/0,
/*wbrtop*/0);
if (IS_ERR(file))
goto out;
h_sb = file->f_path.dentry->d_sb;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment