You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
This commit is contained in:
@@ -427,6 +427,8 @@ v9fs_create(struct inode *dir,
|
||||
|
||||
v9fs_mistat2inode(fcall->params.rstat.stat, file_inode, sb);
|
||||
kfree(fcall);
|
||||
fcall = NULL;
|
||||
file_dentry->d_op = &v9fs_dentry_operations;
|
||||
d_instantiate(file_dentry, file_inode);
|
||||
|
||||
if (perm & V9FS_DMDIR) {
|
||||
|
||||
@@ -1513,10 +1513,16 @@ int vfs_quota_on_mount(struct super_block *sb, char *qf_name,
|
||||
if (IS_ERR(dentry))
|
||||
return PTR_ERR(dentry);
|
||||
|
||||
if (!dentry->d_inode) {
|
||||
error = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
error = security_quota_on(dentry);
|
||||
if (!error)
|
||||
error = vfs_quota_on_inode(dentry->d_inode, type, format_id);
|
||||
|
||||
out:
|
||||
dput(dentry);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -306,9 +306,6 @@ void install_arg_page(struct vm_area_struct *vma,
|
||||
struct page *page, unsigned long address)
|
||||
{
|
||||
struct mm_struct *mm = vma->vm_mm;
|
||||
pgd_t * pgd;
|
||||
pud_t * pud;
|
||||
pmd_t * pmd;
|
||||
pte_t * pte;
|
||||
spinlock_t *ptl;
|
||||
|
||||
@@ -316,14 +313,7 @@ void install_arg_page(struct vm_area_struct *vma,
|
||||
goto out;
|
||||
|
||||
flush_dcache_page(page);
|
||||
pgd = pgd_offset(mm, address);
|
||||
pud = pud_alloc(mm, pgd, address);
|
||||
if (!pud)
|
||||
goto out;
|
||||
pmd = pmd_alloc(mm, pud, address);
|
||||
if (!pmd)
|
||||
goto out;
|
||||
pte = pte_alloc_map_lock(mm, pmd, address, &ptl);
|
||||
pte = get_locked_pte(mm, address, &ptl);
|
||||
if (!pte)
|
||||
goto out;
|
||||
if (!pte_none(*pte)) {
|
||||
|
||||
@@ -767,6 +767,7 @@ int ext3_group_add(struct super_block *sb, struct ext3_new_group_data *input)
|
||||
if (input->group != EXT3_SB(sb)->s_groups_count) {
|
||||
ext3_warning(sb, __FUNCTION__,
|
||||
"multiple resizers run on filesystem!\n");
|
||||
err = -EBUSY;
|
||||
goto exit_journal;
|
||||
}
|
||||
|
||||
|
||||
+25
-12
@@ -74,6 +74,24 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int dir_alias(struct inode *inode)
|
||||
{
|
||||
if (S_ISDIR(inode->i_mode)) {
|
||||
/* Don't allow creating an alias to a directory */
|
||||
struct dentry *alias = d_find_alias(inode);
|
||||
if (alias) {
|
||||
dput(alias);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int invalid_nodeid(u64 nodeid)
|
||||
{
|
||||
return !nodeid || nodeid == FUSE_ROOT_ID;
|
||||
}
|
||||
|
||||
static struct dentry_operations fuse_dentry_operations = {
|
||||
.d_revalidate = fuse_dentry_revalidate,
|
||||
};
|
||||
@@ -97,7 +115,7 @@ static int fuse_lookup_iget(struct inode *dir, struct dentry *entry,
|
||||
fuse_lookup_init(req, dir, entry, &outarg);
|
||||
request_send(fc, req);
|
||||
err = req->out.h.error;
|
||||
if (!err && (!outarg.nodeid || outarg.nodeid == FUSE_ROOT_ID))
|
||||
if (!err && invalid_nodeid(outarg.nodeid))
|
||||
err = -EIO;
|
||||
if (!err) {
|
||||
inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
|
||||
@@ -193,7 +211,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry, int mode,
|
||||
}
|
||||
|
||||
err = -EIO;
|
||||
if (!S_ISREG(outentry.attr.mode))
|
||||
if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid))
|
||||
goto out_free_ff;
|
||||
|
||||
inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation,
|
||||
@@ -250,7 +268,7 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
|
||||
fuse_put_request(fc, req);
|
||||
return err;
|
||||
}
|
||||
if (!outarg.nodeid || outarg.nodeid == FUSE_ROOT_ID) {
|
||||
if (invalid_nodeid(outarg.nodeid)) {
|
||||
fuse_put_request(fc, req);
|
||||
return -EIO;
|
||||
}
|
||||
@@ -263,7 +281,7 @@ static int create_new_entry(struct fuse_conn *fc, struct fuse_req *req,
|
||||
fuse_put_request(fc, req);
|
||||
|
||||
/* Don't allow userspace to do really stupid things... */
|
||||
if ((inode->i_mode ^ mode) & S_IFMT) {
|
||||
if (((inode->i_mode ^ mode) & S_IFMT) || dir_alias(inode)) {
|
||||
iput(inode);
|
||||
return -EIO;
|
||||
}
|
||||
@@ -874,14 +892,9 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
|
||||
err = fuse_lookup_iget(dir, entry, &inode);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
if (inode && S_ISDIR(inode->i_mode)) {
|
||||
/* Don't allow creating an alias to a directory */
|
||||
struct dentry *alias = d_find_alias(inode);
|
||||
if (alias) {
|
||||
dput(alias);
|
||||
iput(inode);
|
||||
return ERR_PTR(-EIO);
|
||||
}
|
||||
if (inode && dir_alias(inode)) {
|
||||
iput(inode);
|
||||
return ERR_PTR(-EIO);
|
||||
}
|
||||
d_add(entry, inode);
|
||||
return NULL;
|
||||
|
||||
@@ -151,6 +151,7 @@ struct hfsplus_sb_info {
|
||||
|
||||
#define HFSPLUS_SB_WRITEBACKUP 0x0001
|
||||
#define HFSPLUS_SB_NODECOMPOSE 0x0002
|
||||
#define HFSPLUS_SB_FORCE 0x0004
|
||||
|
||||
|
||||
struct hfsplus_inode_info {
|
||||
|
||||
@@ -123,11 +123,13 @@ struct hfsplus_vh {
|
||||
} __packed;
|
||||
|
||||
/* HFS+ volume attributes */
|
||||
#define HFSPLUS_VOL_UNMNT (1 << 8)
|
||||
#define HFSPLUS_VOL_SPARE_BLK (1 << 9)
|
||||
#define HFSPLUS_VOL_NOCACHE (1 << 10)
|
||||
#define HFSPLUS_VOL_INCNSTNT (1 << 11)
|
||||
#define HFSPLUS_VOL_SOFTLOCK (1 << 15)
|
||||
#define HFSPLUS_VOL_UNMNT (1 << 8)
|
||||
#define HFSPLUS_VOL_SPARE_BLK (1 << 9)
|
||||
#define HFSPLUS_VOL_NOCACHE (1 << 10)
|
||||
#define HFSPLUS_VOL_INCNSTNT (1 << 11)
|
||||
#define HFSPLUS_VOL_NODEID_REUSED (1 << 12)
|
||||
#define HFSPLUS_VOL_JOURNALED (1 << 13)
|
||||
#define HFSPLUS_VOL_SOFTLOCK (1 << 15)
|
||||
|
||||
/* HFS+ BTree node descriptor */
|
||||
struct hfs_bnode_desc {
|
||||
|
||||
@@ -22,7 +22,7 @@ enum {
|
||||
opt_umask, opt_uid, opt_gid,
|
||||
opt_part, opt_session, opt_nls,
|
||||
opt_nodecompose, opt_decompose,
|
||||
opt_err
|
||||
opt_force, opt_err
|
||||
};
|
||||
|
||||
static match_table_t tokens = {
|
||||
@@ -36,6 +36,7 @@ static match_table_t tokens = {
|
||||
{ opt_nls, "nls=%s" },
|
||||
{ opt_decompose, "decompose" },
|
||||
{ opt_nodecompose, "nodecompose" },
|
||||
{ opt_force, "force" },
|
||||
{ opt_err, NULL }
|
||||
};
|
||||
|
||||
@@ -145,6 +146,9 @@ int hfsplus_parse_options(char *input, struct hfsplus_sb_info *sbi)
|
||||
case opt_nodecompose:
|
||||
sbi->flags |= HFSPLUS_SB_NODECOMPOSE;
|
||||
break;
|
||||
case opt_force:
|
||||
sbi->flags |= HFSPLUS_SB_FORCE;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -251,16 +251,28 @@ static int hfsplus_remount(struct super_block *sb, int *flags, char *data)
|
||||
return 0;
|
||||
if (!(*flags & MS_RDONLY)) {
|
||||
struct hfsplus_vh *vhdr = HFSPLUS_SB(sb).s_vhdr;
|
||||
struct hfsplus_sb_info sbi;
|
||||
|
||||
memset(&sbi, 0, sizeof(struct hfsplus_sb_info));
|
||||
sbi.nls = HFSPLUS_SB(sb).nls;
|
||||
if (!hfsplus_parse_options(data, &sbi))
|
||||
return -EINVAL;
|
||||
|
||||
if (!(vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_UNMNT))) {
|
||||
printk("HFS+-fs warning: Filesystem was not cleanly unmounted, "
|
||||
"running fsck.hfsplus is recommended. leaving read-only.\n");
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
*flags |= MS_RDONLY;
|
||||
} else if (sbi.flags & HFSPLUS_SB_FORCE) {
|
||||
/* nothing */
|
||||
} else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_SOFTLOCK)) {
|
||||
printk("HFS+-fs: Filesystem is marked locked, leaving read-only.\n");
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
*flags |= MS_RDONLY;
|
||||
} else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_JOURNALED)) {
|
||||
printk("HFS+-fs: Filesystem is marked journaled, leaving read-only.\n");
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
*flags |= MS_RDONLY;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -352,11 +364,19 @@ static int hfsplus_fill_super(struct super_block *sb, void *data, int silent)
|
||||
printk("HFS+-fs warning: Filesystem was not cleanly unmounted, "
|
||||
"running fsck.hfsplus is recommended. mounting read-only.\n");
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
} else if (sbi->flags & HFSPLUS_SB_FORCE) {
|
||||
/* nothing */
|
||||
} else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_SOFTLOCK)) {
|
||||
if (!silent)
|
||||
printk("HFS+-fs: Filesystem is marked locked, mounting read-only.\n");
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
} else if (vhdr->attributes & cpu_to_be32(HFSPLUS_VOL_JOURNALED)) {
|
||||
if (!silent)
|
||||
printk("HFS+-fs: write access to a jounaled filesystem is not supported, "
|
||||
"use the force option at your own risk, mounting read-only.\n");
|
||||
sb->s_flags |= MS_RDONLY;
|
||||
}
|
||||
sbi->flags &= ~HFSPLUS_SB_FORCE;
|
||||
|
||||
/* Load metadata objects (B*Trees) */
|
||||
HFSPLUS_SB(sb).ext_tree = hfs_btree_open(sb, HFSPLUS_EXT_CNID);
|
||||
|
||||
@@ -234,6 +234,7 @@ void jffs2_read_inode (struct inode *inode)
|
||||
c = JFFS2_SB_INFO(inode->i_sb);
|
||||
|
||||
jffs2_init_inode_info(f);
|
||||
down(&f->sem);
|
||||
|
||||
ret = jffs2_do_read_inode(c, f, inode->i_ino, &latest_node);
|
||||
|
||||
@@ -400,6 +401,7 @@ struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_i
|
||||
|
||||
f = JFFS2_INODE_INFO(inode);
|
||||
jffs2_init_inode_info(f);
|
||||
down(&f->sem);
|
||||
|
||||
memset(ri, 0, sizeof(*ri));
|
||||
/* Set OS-specific defaults for new inodes */
|
||||
|
||||
+1
-1
@@ -51,7 +51,7 @@ static void jffs2_i_init_once(void * foo, kmem_cache_t * cachep, unsigned long f
|
||||
|
||||
if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
|
||||
SLAB_CTOR_CONSTRUCTOR) {
|
||||
init_MUTEX_LOCKED(&ei->sem);
|
||||
init_MUTEX(&ei->sem);
|
||||
inode_init_once(&ei->vfs_inode);
|
||||
}
|
||||
}
|
||||
|
||||
+3
-4
@@ -402,12 +402,11 @@ struct numa_maps {
|
||||
/*
|
||||
* Calculate numa node maps for a vma
|
||||
*/
|
||||
static struct numa_maps *get_numa_maps(const struct vm_area_struct *vma)
|
||||
static struct numa_maps *get_numa_maps(struct vm_area_struct *vma)
|
||||
{
|
||||
int i;
|
||||
struct page *page;
|
||||
unsigned long vaddr;
|
||||
struct mm_struct *mm = vma->vm_mm;
|
||||
int i;
|
||||
struct numa_maps *md = kmalloc(sizeof(struct numa_maps), GFP_KERNEL);
|
||||
|
||||
if (!md)
|
||||
@@ -420,7 +419,7 @@ static struct numa_maps *get_numa_maps(const struct vm_area_struct *vma)
|
||||
md->node[i] =0;
|
||||
|
||||
for (vaddr = vma->vm_start; vaddr < vma->vm_end; vaddr += PAGE_SIZE) {
|
||||
page = follow_page(mm, vaddr, 0);
|
||||
page = follow_page(vma, vaddr, 0);
|
||||
if (page) {
|
||||
int count = page_mapcount(page);
|
||||
|
||||
|
||||
+1
-1
@@ -2194,7 +2194,7 @@ static int map_block_for_writepage(struct inode *inode,
|
||||
INITIALIZE_PATH(path);
|
||||
int pos_in_item;
|
||||
int jbegin_count = JOURNAL_PER_BALANCE_CNT;
|
||||
loff_t byte_offset = (block << inode->i_sb->s_blocksize_bits) + 1;
|
||||
loff_t byte_offset = ((loff_t)block << inode->i_sb->s_blocksize_bits)+1;
|
||||
int retval;
|
||||
int use_get_block = 0;
|
||||
int bytes_copied = 0;
|
||||
|
||||
@@ -2757,6 +2757,15 @@ int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
|
||||
journal->j_cnode_used = 0;
|
||||
journal->j_must_wait = 0;
|
||||
|
||||
if (journal->j_cnode_free == 0) {
|
||||
reiserfs_warning(p_s_sb, "journal-2004: Journal cnode memory "
|
||||
"allocation failed (%ld bytes). Journal is "
|
||||
"too large for available memory. Usually "
|
||||
"this is due to a journal that is too large.",
|
||||
sizeof (struct reiserfs_journal_cnode) * num_cnodes);
|
||||
goto free_and_return;
|
||||
}
|
||||
|
||||
init_journal_hash(p_s_sb);
|
||||
jl = journal->j_current_jl;
|
||||
jl->j_list_bitmap = get_list_bitmap(p_s_sb, jl);
|
||||
|
||||
Reference in New Issue
Block a user