Merge branch 'generic' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
Pull quota, reiserfs, udf and ext2 updates from Jan Kara: "The branch contains changes to quota code so that it does not modify persistent flags in inode->i_flags (it was the only place in kernel doing that) and handle it inside filesystem's quotaon/off handlers instead. The branch also contains two UDF cleanups, a couple of reiserfs fixes and one fix for ext2 quota locking" * 'generic' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: ext4: Improve comments in ext4_quota_{on|off}() udf: use kmap_atomic for memcpy copying udf: use octal for permissions quota: Remove dquot_quotactl_ops reiserfs: Remove i_attrs_to_sd_attrs() reiserfs: Remove useless setting of i_flags jfs: Remove jfs_get_inode_flags() ext2: Remove ext2_get_inode_flags() ext4: Remove ext4_get_inode_flags() quota: Stop setting IMMUTABLE and NOATIME flags on quota files jfs: Set flags on quota files directly ext2: Set flags on quota files directly reiserfs: Set flags on quota files directly ext4: Set flags on quota files directly reiserfs: Protect dquot_writeback_dquots() by s_umount semaphore reiserfs: Make cancel_old_flush() reliable ext2: Call dquot_writeback_dquots() with s_umount held reiserfs: avoid a -Wmaybe-uninitialized warning
This commit is contained in:
Коммит
a3719f34fd
|
@ -779,7 +779,6 @@ extern void ext2_evict_inode(struct inode *);
|
|||
extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int);
|
||||
extern int ext2_setattr (struct dentry *, struct iattr *);
|
||||
extern void ext2_set_inode_flags(struct inode *inode);
|
||||
extern void ext2_get_inode_flags(struct ext2_inode_info *);
|
||||
extern int ext2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
u64 start, u64 len);
|
||||
|
||||
|
@ -796,7 +795,8 @@ void ext2_error(struct super_block *, const char *, const char *, ...);
|
|||
extern __printf(3, 4)
|
||||
void ext2_msg(struct super_block *, const char *, const char *, ...);
|
||||
extern void ext2_update_dynamic_rev (struct super_block *sb);
|
||||
extern void ext2_write_super (struct super_block *);
|
||||
extern void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es,
|
||||
int wait);
|
||||
|
||||
/*
|
||||
* Inodes and files operations
|
||||
|
|
|
@ -1384,25 +1384,6 @@ void ext2_set_inode_flags(struct inode *inode)
|
|||
inode->i_flags |= S_DAX;
|
||||
}
|
||||
|
||||
/* Propagate flags from i_flags to EXT2_I(inode)->i_flags */
|
||||
void ext2_get_inode_flags(struct ext2_inode_info *ei)
|
||||
{
|
||||
unsigned int flags = ei->vfs_inode.i_flags;
|
||||
|
||||
ei->i_flags &= ~(EXT2_SYNC_FL|EXT2_APPEND_FL|
|
||||
EXT2_IMMUTABLE_FL|EXT2_NOATIME_FL|EXT2_DIRSYNC_FL);
|
||||
if (flags & S_SYNC)
|
||||
ei->i_flags |= EXT2_SYNC_FL;
|
||||
if (flags & S_APPEND)
|
||||
ei->i_flags |= EXT2_APPEND_FL;
|
||||
if (flags & S_IMMUTABLE)
|
||||
ei->i_flags |= EXT2_IMMUTABLE_FL;
|
||||
if (flags & S_NOATIME)
|
||||
ei->i_flags |= EXT2_NOATIME_FL;
|
||||
if (flags & S_DIRSYNC)
|
||||
ei->i_flags |= EXT2_DIRSYNC_FL;
|
||||
}
|
||||
|
||||
struct inode *ext2_iget (struct super_block *sb, unsigned long ino)
|
||||
{
|
||||
struct ext2_inode_info *ei;
|
||||
|
@ -1563,7 +1544,6 @@ static int __ext2_write_inode(struct inode *inode, int do_sync)
|
|||
if (ei->i_state & EXT2_STATE_NEW)
|
||||
memset(raw_inode, 0, EXT2_SB(sb)->s_inode_size);
|
||||
|
||||
ext2_get_inode_flags(ei);
|
||||
raw_inode->i_mode = cpu_to_le16(inode->i_mode);
|
||||
if (!(test_opt(sb, NO_UID32))) {
|
||||
raw_inode->i_uid_low = cpu_to_le16(low_16_bits(uid));
|
||||
|
@ -1615,7 +1595,7 @@ static int __ext2_write_inode(struct inode *inode, int do_sync)
|
|||
EXT2_SET_RO_COMPAT_FEATURE(sb,
|
||||
EXT2_FEATURE_RO_COMPAT_LARGE_FILE);
|
||||
spin_unlock(&EXT2_SB(sb)->s_lock);
|
||||
ext2_write_super(sb);
|
||||
ext2_sync_super(sb, EXT2_SB(sb)->s_es, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,7 +29,6 @@ long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
|
||||
switch (cmd) {
|
||||
case EXT2_IOC_GETFLAGS:
|
||||
ext2_get_inode_flags(ei);
|
||||
flags = ei->i_flags & EXT2_FL_USER_VISIBLE;
|
||||
return put_user(flags, (int __user *) arg);
|
||||
case EXT2_IOC_SETFLAGS: {
|
||||
|
|
|
@ -36,8 +36,7 @@
|
|||
#include "xattr.h"
|
||||
#include "acl.h"
|
||||
|
||||
static void ext2_sync_super(struct super_block *sb,
|
||||
struct ext2_super_block *es, int wait);
|
||||
static void ext2_write_super(struct super_block *sb);
|
||||
static int ext2_remount (struct super_block * sb, int * flags, char * data);
|
||||
static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf);
|
||||
static int ext2_sync_fs(struct super_block *sb, int wait);
|
||||
|
@ -123,13 +122,29 @@ void ext2_update_dynamic_rev(struct super_block *sb)
|
|||
*/
|
||||
}
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
static int ext2_quota_off(struct super_block *sb, int type);
|
||||
|
||||
static void ext2_quota_off_umount(struct super_block *sb)
|
||||
{
|
||||
int type;
|
||||
|
||||
for (type = 0; type < MAXQUOTAS; type++)
|
||||
ext2_quota_off(sb, type);
|
||||
}
|
||||
#else
|
||||
static inline void ext2_quota_off_umount(struct super_block *sb)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void ext2_put_super (struct super_block * sb)
|
||||
{
|
||||
int db_count;
|
||||
int i;
|
||||
struct ext2_sb_info *sbi = EXT2_SB(sb);
|
||||
|
||||
dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
|
||||
ext2_quota_off_umount(sb);
|
||||
|
||||
if (sbi->s_mb_cache) {
|
||||
ext2_xattr_destroy_cache(sbi->s_mb_cache);
|
||||
|
@ -314,10 +329,23 @@ static int ext2_show_options(struct seq_file *seq, struct dentry *root)
|
|||
#ifdef CONFIG_QUOTA
|
||||
static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data, size_t len, loff_t off);
|
||||
static ssize_t ext2_quota_write(struct super_block *sb, int type, const char *data, size_t len, loff_t off);
|
||||
static int ext2_quota_on(struct super_block *sb, int type, int format_id,
|
||||
const struct path *path);
|
||||
static struct dquot **ext2_get_dquots(struct inode *inode)
|
||||
{
|
||||
return EXT2_I(inode)->i_dquot;
|
||||
}
|
||||
|
||||
static const struct quotactl_ops ext2_quotactl_ops = {
|
||||
.quota_on = ext2_quota_on,
|
||||
.quota_off = ext2_quota_off,
|
||||
.quota_sync = dquot_quota_sync,
|
||||
.get_state = dquot_get_state,
|
||||
.set_info = dquot_set_dqinfo,
|
||||
.get_dqblk = dquot_get_dqblk,
|
||||
.set_dqblk = dquot_set_dqblk,
|
||||
.get_nextdqblk = dquot_get_next_dqblk,
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct super_operations ext2_sops = {
|
||||
|
@ -1117,7 +1145,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
|
|||
|
||||
#ifdef CONFIG_QUOTA
|
||||
sb->dq_op = &dquot_operations;
|
||||
sb->s_qcop = &dquot_quotactl_ops;
|
||||
sb->s_qcop = &ext2_quotactl_ops;
|
||||
sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
|
||||
#endif
|
||||
|
||||
|
@ -1194,8 +1222,8 @@ static void ext2_clear_super_error(struct super_block *sb)
|
|||
}
|
||||
}
|
||||
|
||||
static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es,
|
||||
int wait)
|
||||
void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es,
|
||||
int wait)
|
||||
{
|
||||
ext2_clear_super_error(sb);
|
||||
spin_lock(&EXT2_SB(sb)->s_lock);
|
||||
|
@ -1270,7 +1298,7 @@ static int ext2_unfreeze(struct super_block *sb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void ext2_write_super(struct super_block *sb)
|
||||
static void ext2_write_super(struct super_block *sb)
|
||||
{
|
||||
if (!(sb->s_flags & MS_RDONLY))
|
||||
ext2_sync_fs(sb, 1);
|
||||
|
@ -1548,6 +1576,51 @@ out:
|
|||
return len - towrite;
|
||||
}
|
||||
|
||||
static int ext2_quota_on(struct super_block *sb, int type, int format_id,
|
||||
const struct path *path)
|
||||
{
|
||||
int err;
|
||||
struct inode *inode;
|
||||
|
||||
err = dquot_quota_on(sb, type, format_id, path);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
inode = d_inode(path->dentry);
|
||||
inode_lock(inode);
|
||||
EXT2_I(inode)->i_flags |= EXT2_NOATIME_FL | EXT2_IMMUTABLE_FL;
|
||||
inode_set_flags(inode, S_NOATIME | S_IMMUTABLE,
|
||||
S_NOATIME | S_IMMUTABLE);
|
||||
inode_unlock(inode);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ext2_quota_off(struct super_block *sb, int type)
|
||||
{
|
||||
struct inode *inode = sb_dqopt(sb)->files[type];
|
||||
int err;
|
||||
|
||||
if (!inode || !igrab(inode))
|
||||
goto out;
|
||||
|
||||
err = dquot_quota_off(sb, type);
|
||||
if (err)
|
||||
goto out_put;
|
||||
|
||||
inode_lock(inode);
|
||||
EXT2_I(inode)->i_flags &= ~(EXT2_NOATIME_FL | EXT2_IMMUTABLE_FL);
|
||||
inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE);
|
||||
inode_unlock(inode);
|
||||
mark_inode_dirty(inode);
|
||||
out_put:
|
||||
iput(inode);
|
||||
return err;
|
||||
out:
|
||||
return dquot_quota_off(sb, type);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static struct file_system_type ext2_fs_type = {
|
||||
|
|
|
@ -2477,7 +2477,6 @@ extern int ext4_truncate(struct inode *);
|
|||
extern int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length);
|
||||
extern int ext4_truncate_restart_trans(handle_t *, struct inode *, int nblocks);
|
||||
extern void ext4_set_inode_flags(struct inode *);
|
||||
extern void ext4_get_inode_flags(struct ext4_inode_info *);
|
||||
extern int ext4_alloc_da_blocks(struct inode *inode);
|
||||
extern void ext4_set_aops(struct inode *inode);
|
||||
extern int ext4_writepage_trans_blocks(struct inode *);
|
||||
|
|
|
@ -4502,31 +4502,6 @@ void ext4_set_inode_flags(struct inode *inode)
|
|||
S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|S_DAX);
|
||||
}
|
||||
|
||||
/* Propagate flags from i_flags to EXT4_I(inode)->i_flags */
|
||||
void ext4_get_inode_flags(struct ext4_inode_info *ei)
|
||||
{
|
||||
unsigned int vfs_fl;
|
||||
unsigned long old_fl, new_fl;
|
||||
|
||||
do {
|
||||
vfs_fl = ei->vfs_inode.i_flags;
|
||||
old_fl = ei->i_flags;
|
||||
new_fl = old_fl & ~(EXT4_SYNC_FL|EXT4_APPEND_FL|
|
||||
EXT4_IMMUTABLE_FL|EXT4_NOATIME_FL|
|
||||
EXT4_DIRSYNC_FL);
|
||||
if (vfs_fl & S_SYNC)
|
||||
new_fl |= EXT4_SYNC_FL;
|
||||
if (vfs_fl & S_APPEND)
|
||||
new_fl |= EXT4_APPEND_FL;
|
||||
if (vfs_fl & S_IMMUTABLE)
|
||||
new_fl |= EXT4_IMMUTABLE_FL;
|
||||
if (vfs_fl & S_NOATIME)
|
||||
new_fl |= EXT4_NOATIME_FL;
|
||||
if (vfs_fl & S_DIRSYNC)
|
||||
new_fl |= EXT4_DIRSYNC_FL;
|
||||
} while (cmpxchg(&ei->i_flags, old_fl, new_fl) != old_fl);
|
||||
}
|
||||
|
||||
static blkcnt_t ext4_inode_blocks(struct ext4_inode *raw_inode,
|
||||
struct ext4_inode_info *ei)
|
||||
{
|
||||
|
@ -4963,7 +4938,6 @@ static int ext4_do_update_inode(handle_t *handle,
|
|||
if (ext4_test_inode_state(inode, EXT4_STATE_NEW))
|
||||
memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
|
||||
|
||||
ext4_get_inode_flags(ei);
|
||||
raw_inode->i_mode = cpu_to_le16(inode->i_mode);
|
||||
i_uid = i_uid_read(inode);
|
||||
i_gid = i_gid_read(inode);
|
||||
|
|
|
@ -500,7 +500,6 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
|
||||
switch (cmd) {
|
||||
case EXT4_IOC_GETFLAGS:
|
||||
ext4_get_inode_flags(ei);
|
||||
flags = ei->i_flags & EXT4_FL_USER_VISIBLE;
|
||||
return put_user(flags, (int __user *) arg);
|
||||
case EXT4_IOC_SETFLAGS: {
|
||||
|
@ -888,7 +887,6 @@ resizefs_out:
|
|||
struct fsxattr fa;
|
||||
|
||||
memset(&fa, 0, sizeof(struct fsxattr));
|
||||
ext4_get_inode_flags(ei);
|
||||
fa.fsx_xflags = ext4_iflags_to_xflags(ei->i_flags & EXT4_FL_USER_VISIBLE);
|
||||
|
||||
if (ext4_has_feature_project(inode->i_sb)) {
|
||||
|
|
|
@ -839,6 +839,28 @@ static void dump_orphan_list(struct super_block *sb, struct ext4_sb_info *sbi)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
static int ext4_quota_off(struct super_block *sb, int type);
|
||||
|
||||
static inline void ext4_quota_off_umount(struct super_block *sb)
|
||||
{
|
||||
int type;
|
||||
|
||||
if (ext4_has_feature_quota(sb)) {
|
||||
dquot_disable(sb, -1,
|
||||
DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
|
||||
} else {
|
||||
/* Use our quota_off function to clear inode flags etc. */
|
||||
for (type = 0; type < EXT4_MAXQUOTAS; type++)
|
||||
ext4_quota_off(sb, type);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void ext4_quota_off_umount(struct super_block *sb)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void ext4_put_super(struct super_block *sb)
|
||||
{
|
||||
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
||||
|
@ -847,7 +869,7 @@ static void ext4_put_super(struct super_block *sb)
|
|||
int i, err;
|
||||
|
||||
ext4_unregister_li_request(sb);
|
||||
dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
|
||||
ext4_quota_off_umount(sb);
|
||||
|
||||
flush_workqueue(sbi->rsv_conversion_wq);
|
||||
destroy_workqueue(sbi->rsv_conversion_wq);
|
||||
|
@ -1218,7 +1240,6 @@ static int ext4_mark_dquot_dirty(struct dquot *dquot);
|
|||
static int ext4_write_info(struct super_block *sb, int type);
|
||||
static int ext4_quota_on(struct super_block *sb, int type, int format_id,
|
||||
const struct path *path);
|
||||
static int ext4_quota_off(struct super_block *sb, int type);
|
||||
static int ext4_quota_on_mount(struct super_block *sb, int type);
|
||||
static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data,
|
||||
size_t len, loff_t off);
|
||||
|
@ -5344,11 +5365,33 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id,
|
|||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
lockdep_set_quota_inode(path->dentry->d_inode, I_DATA_SEM_QUOTA);
|
||||
err = dquot_quota_on(sb, type, format_id, path);
|
||||
if (err)
|
||||
if (err) {
|
||||
lockdep_set_quota_inode(path->dentry->d_inode,
|
||||
I_DATA_SEM_NORMAL);
|
||||
} else {
|
||||
struct inode *inode = d_inode(path->dentry);
|
||||
handle_t *handle;
|
||||
|
||||
/*
|
||||
* Set inode flags to prevent userspace from messing with quota
|
||||
* files. If this fails, we return success anyway since quotas
|
||||
* are already enabled and this is not a hard failure.
|
||||
*/
|
||||
inode_lock(inode);
|
||||
handle = ext4_journal_start(inode, EXT4_HT_QUOTA, 1);
|
||||
if (IS_ERR(handle))
|
||||
goto unlock_inode;
|
||||
EXT4_I(inode)->i_flags |= EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL;
|
||||
inode_set_flags(inode, S_NOATIME | S_IMMUTABLE,
|
||||
S_NOATIME | S_IMMUTABLE);
|
||||
ext4_mark_inode_dirty(handle, inode);
|
||||
ext4_journal_stop(handle);
|
||||
unlock_inode:
|
||||
inode_unlock(inode);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -5422,24 +5465,39 @@ static int ext4_quota_off(struct super_block *sb, int type)
|
|||
{
|
||||
struct inode *inode = sb_dqopt(sb)->files[type];
|
||||
handle_t *handle;
|
||||
int err;
|
||||
|
||||
/* Force all delayed allocation blocks to be allocated.
|
||||
* Caller already holds s_umount sem */
|
||||
if (test_opt(sb, DELALLOC))
|
||||
sync_filesystem(sb);
|
||||
|
||||
if (!inode)
|
||||
if (!inode || !igrab(inode))
|
||||
goto out;
|
||||
|
||||
/* Update modification times of quota files when userspace can
|
||||
* start looking at them */
|
||||
err = dquot_quota_off(sb, type);
|
||||
if (err)
|
||||
goto out_put;
|
||||
|
||||
inode_lock(inode);
|
||||
/*
|
||||
* Update modification times of quota files when userspace can
|
||||
* start looking at them. If we fail, we return success anyway since
|
||||
* this is not a hard failure and quotas are already disabled.
|
||||
*/
|
||||
handle = ext4_journal_start(inode, EXT4_HT_QUOTA, 1);
|
||||
if (IS_ERR(handle))
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
EXT4_I(inode)->i_flags &= ~(EXT4_NOATIME_FL | EXT4_IMMUTABLE_FL);
|
||||
inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE);
|
||||
inode->i_mtime = inode->i_ctime = current_time(inode);
|
||||
ext4_mark_inode_dirty(handle, inode);
|
||||
ext4_journal_stop(handle);
|
||||
|
||||
out_unlock:
|
||||
inode_unlock(inode);
|
||||
out_put:
|
||||
iput(inode);
|
||||
return err;
|
||||
out:
|
||||
return dquot_quota_off(sb, type);
|
||||
}
|
||||
|
|
|
@ -64,7 +64,6 @@ long jfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
|
||||
switch (cmd) {
|
||||
case JFS_IOC_GETFLAGS:
|
||||
jfs_get_inode_flags(jfs_inode);
|
||||
flags = jfs_inode->mode2 & JFS_FL_USER_VISIBLE;
|
||||
flags = jfs_map_ext2(flags, 0);
|
||||
return put_user(flags, (int __user *) arg);
|
||||
|
@ -98,7 +97,6 @@ long jfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
/* Lock against other parallel changes of flags */
|
||||
inode_lock(inode);
|
||||
|
||||
jfs_get_inode_flags(jfs_inode);
|
||||
oldflags = jfs_inode->mode2;
|
||||
|
||||
/*
|
||||
|
|
|
@ -3148,7 +3148,6 @@ static void copy_to_dinode(struct dinode * dip, struct inode *ip)
|
|||
else
|
||||
dip->di_gid = cpu_to_le32(from_kgid(&init_user_ns,
|
||||
jfs_ip->saved_gid));
|
||||
jfs_get_inode_flags(jfs_ip);
|
||||
/*
|
||||
* mode2 is only needed for storing the higher order bits.
|
||||
* Trust i_mode for the lower order ones
|
||||
|
|
|
@ -45,24 +45,6 @@ void jfs_set_inode_flags(struct inode *inode)
|
|||
S_DIRSYNC | S_SYNC);
|
||||
}
|
||||
|
||||
void jfs_get_inode_flags(struct jfs_inode_info *jfs_ip)
|
||||
{
|
||||
unsigned int flags = jfs_ip->vfs_inode.i_flags;
|
||||
|
||||
jfs_ip->mode2 &= ~(JFS_IMMUTABLE_FL | JFS_APPEND_FL | JFS_NOATIME_FL |
|
||||
JFS_DIRSYNC_FL | JFS_SYNC_FL);
|
||||
if (flags & S_IMMUTABLE)
|
||||
jfs_ip->mode2 |= JFS_IMMUTABLE_FL;
|
||||
if (flags & S_APPEND)
|
||||
jfs_ip->mode2 |= JFS_APPEND_FL;
|
||||
if (flags & S_NOATIME)
|
||||
jfs_ip->mode2 |= JFS_NOATIME_FL;
|
||||
if (flags & S_DIRSYNC)
|
||||
jfs_ip->mode2 |= JFS_DIRSYNC_FL;
|
||||
if (flags & S_SYNC)
|
||||
jfs_ip->mode2 |= JFS_SYNC_FL;
|
||||
}
|
||||
|
||||
/*
|
||||
* NAME: ialloc()
|
||||
*
|
||||
|
|
|
@ -33,7 +33,6 @@ extern void jfs_truncate(struct inode *);
|
|||
extern void jfs_truncate_nolock(struct inode *, loff_t);
|
||||
extern void jfs_free_zero_link(struct inode *);
|
||||
extern struct dentry *jfs_get_parent(struct dentry *dentry);
|
||||
extern void jfs_get_inode_flags(struct jfs_inode_info *);
|
||||
extern struct dentry *jfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
|
||||
int fh_len, int fh_type);
|
||||
extern struct dentry *jfs_fh_to_parent(struct super_block *sb, struct fid *fid,
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include "jfs_acl.h"
|
||||
#include "jfs_debug.h"
|
||||
#include "jfs_xattr.h"
|
||||
#include "jfs_dinode.h"
|
||||
|
||||
MODULE_DESCRIPTION("The Journaled Filesystem (JFS)");
|
||||
MODULE_AUTHOR("Steve Best/Dave Kleikamp/Barry Arndt, IBM");
|
||||
|
@ -181,6 +182,35 @@ static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
static int jfs_quota_off(struct super_block *sb, int type);
|
||||
static int jfs_quota_on(struct super_block *sb, int type, int format_id,
|
||||
const struct path *path);
|
||||
|
||||
static void jfs_quota_off_umount(struct super_block *sb)
|
||||
{
|
||||
int type;
|
||||
|
||||
for (type = 0; type < MAXQUOTAS; type++)
|
||||
jfs_quota_off(sb, type);
|
||||
}
|
||||
|
||||
static const struct quotactl_ops jfs_quotactl_ops = {
|
||||
.quota_on = jfs_quota_on,
|
||||
.quota_off = jfs_quota_off,
|
||||
.quota_sync = dquot_quota_sync,
|
||||
.get_state = dquot_get_state,
|
||||
.set_info = dquot_set_dqinfo,
|
||||
.get_dqblk = dquot_get_dqblk,
|
||||
.set_dqblk = dquot_set_dqblk,
|
||||
.get_nextdqblk = dquot_get_next_dqblk,
|
||||
};
|
||||
#else
|
||||
static inline void jfs_quota_off_umount(struct super_block *sb)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void jfs_put_super(struct super_block *sb)
|
||||
{
|
||||
struct jfs_sb_info *sbi = JFS_SBI(sb);
|
||||
|
@ -188,7 +218,7 @@ static void jfs_put_super(struct super_block *sb)
|
|||
|
||||
jfs_info("In jfs_put_super");
|
||||
|
||||
dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
|
||||
jfs_quota_off_umount(sb);
|
||||
|
||||
rc = jfs_umount(sb);
|
||||
if (rc)
|
||||
|
@ -536,7 +566,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
|
|||
sb->s_xattr = jfs_xattr_handlers;
|
||||
#ifdef CONFIG_QUOTA
|
||||
sb->dq_op = &dquot_operations;
|
||||
sb->s_qcop = &dquot_quotactl_ops;
|
||||
sb->s_qcop = &jfs_quotactl_ops;
|
||||
sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
|
||||
#endif
|
||||
|
||||
|
@ -840,6 +870,51 @@ static struct dquot **jfs_get_dquots(struct inode *inode)
|
|||
{
|
||||
return JFS_IP(inode)->i_dquot;
|
||||
}
|
||||
|
||||
static int jfs_quota_on(struct super_block *sb, int type, int format_id,
|
||||
const struct path *path)
|
||||
{
|
||||
int err;
|
||||
struct inode *inode;
|
||||
|
||||
err = dquot_quota_on(sb, type, format_id, path);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
inode = d_inode(path->dentry);
|
||||
inode_lock(inode);
|
||||
JFS_IP(inode)->mode2 |= JFS_NOATIME_FL | JFS_IMMUTABLE_FL;
|
||||
inode_set_flags(inode, S_NOATIME | S_IMMUTABLE,
|
||||
S_NOATIME | S_IMMUTABLE);
|
||||
inode_unlock(inode);
|
||||
mark_inode_dirty(inode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int jfs_quota_off(struct super_block *sb, int type)
|
||||
{
|
||||
struct inode *inode = sb_dqopt(sb)->files[type];
|
||||
int err;
|
||||
|
||||
if (!inode || !igrab(inode))
|
||||
goto out;
|
||||
|
||||
err = dquot_quota_off(sb, type);
|
||||
if (err)
|
||||
goto out_put;
|
||||
|
||||
inode_lock(inode);
|
||||
JFS_IP(inode)->mode2 &= ~(JFS_NOATIME_FL | JFS_IMMUTABLE_FL);
|
||||
inode_set_flags(inode, 0, S_NOATIME | S_IMMUTABLE);
|
||||
inode_unlock(inode);
|
||||
mark_inode_dirty(inode);
|
||||
out_put:
|
||||
iput(inode);
|
||||
return err;
|
||||
out:
|
||||
return dquot_quota_off(sb, type);
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct super_operations jfs_super_operations = {
|
||||
|
|
|
@ -2188,8 +2188,7 @@ int dquot_disable(struct super_block *sb, int type, unsigned int flags)
|
|||
/* This can happen when suspending quotas on remount-ro... */
|
||||
if (toputinode[cnt] && !sb_has_quota_loaded(sb, cnt)) {
|
||||
inode_lock(toputinode[cnt]);
|
||||
toputinode[cnt]->i_flags &= ~(S_IMMUTABLE |
|
||||
S_NOATIME | S_NOQUOTA);
|
||||
toputinode[cnt]->i_flags &= ~S_NOQUOTA;
|
||||
truncate_inode_pages(&toputinode[cnt]->i_data, 0);
|
||||
inode_unlock(toputinode[cnt]);
|
||||
mark_inode_dirty_sync(toputinode[cnt]);
|
||||
|
@ -2237,7 +2236,6 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
|
|||
struct super_block *sb = inode->i_sb;
|
||||
struct quota_info *dqopt = sb_dqopt(sb);
|
||||
int error;
|
||||
int oldflags = -1;
|
||||
|
||||
if (!fmt)
|
||||
return -ESRCH;
|
||||
|
@ -2285,9 +2283,7 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
|
|||
* possible) Also nobody should write to the file - we use
|
||||
* special IO operations which ignore the immutable bit. */
|
||||
inode_lock(inode);
|
||||
oldflags = inode->i_flags & (S_NOATIME | S_IMMUTABLE |
|
||||
S_NOQUOTA);
|
||||
inode->i_flags |= S_NOQUOTA | S_NOATIME | S_IMMUTABLE;
|
||||
inode->i_flags |= S_NOQUOTA;
|
||||
inode_unlock(inode);
|
||||
/*
|
||||
* When S_NOQUOTA is set, remove dquot references as no more
|
||||
|
@ -2329,14 +2325,9 @@ out_file_init:
|
|||
dqopt->files[type] = NULL;
|
||||
iput(inode);
|
||||
out_file_flags:
|
||||
if (oldflags != -1) {
|
||||
inode_lock(inode);
|
||||
/* Set the flags back (in the case of accidental quotaon()
|
||||
* on a wrong file we don't want to mess up the flags) */
|
||||
inode->i_flags &= ~(S_NOATIME | S_NOQUOTA | S_IMMUTABLE);
|
||||
inode->i_flags |= oldflags;
|
||||
inode_unlock(inode);
|
||||
}
|
||||
inode_lock(inode);
|
||||
inode->i_flags &= ~S_NOQUOTA;
|
||||
inode_unlock(inode);
|
||||
out_fmt:
|
||||
put_quota_format(fmt);
|
||||
|
||||
|
@ -2780,18 +2771,6 @@ int dquot_set_dqinfo(struct super_block *sb, int type, struct qc_info *ii)
|
|||
}
|
||||
EXPORT_SYMBOL(dquot_set_dqinfo);
|
||||
|
||||
const struct quotactl_ops dquot_quotactl_ops = {
|
||||
.quota_on = dquot_quota_on,
|
||||
.quota_off = dquot_quota_off,
|
||||
.quota_sync = dquot_quota_sync,
|
||||
.get_state = dquot_get_state,
|
||||
.set_info = dquot_set_dqinfo,
|
||||
.get_dqblk = dquot_get_dqblk,
|
||||
.get_nextdqblk = dquot_get_next_dqblk,
|
||||
.set_dqblk = dquot_set_dqblk
|
||||
};
|
||||
EXPORT_SYMBOL(dquot_quotactl_ops);
|
||||
|
||||
const struct quotactl_ops dquot_quotactl_sysfile_ops = {
|
||||
.quota_enable = dquot_quota_enable,
|
||||
.quota_disable = dquot_quota_disable,
|
||||
|
|
|
@ -1375,7 +1375,6 @@ static void init_inode(struct inode *inode, struct treepath *path)
|
|||
static void inode2sd(void *sd, struct inode *inode, loff_t size)
|
||||
{
|
||||
struct stat_data *sd_v2 = (struct stat_data *)sd;
|
||||
__u16 flags;
|
||||
|
||||
set_sd_v2_mode(sd_v2, inode->i_mode);
|
||||
set_sd_v2_nlink(sd_v2, inode->i_nlink);
|
||||
|
@ -1390,9 +1389,7 @@ static void inode2sd(void *sd, struct inode *inode, loff_t size)
|
|||
set_sd_v2_rdev(sd_v2, new_encode_dev(inode->i_rdev));
|
||||
else
|
||||
set_sd_v2_generation(sd_v2, inode->i_generation);
|
||||
flags = REISERFS_I(inode)->i_attrs;
|
||||
i_attrs_to_sd_attrs(inode, &flags);
|
||||
set_sd_v2_attrs(sd_v2, flags);
|
||||
set_sd_v2_attrs(sd_v2, REISERFS_I(inode)->i_attrs);
|
||||
}
|
||||
|
||||
/* used to copy inode's fields to old stat data */
|
||||
|
@ -2002,10 +1999,6 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
|
|||
|
||||
/* uid and gid must already be set by the caller for quota init */
|
||||
|
||||
/* symlink cannot be immutable or append only, right? */
|
||||
if (S_ISLNK(inode->i_mode))
|
||||
inode->i_flags &= ~(S_IMMUTABLE | S_APPEND);
|
||||
|
||||
inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode);
|
||||
inode->i_size = i_size;
|
||||
inode->i_blocks = 0;
|
||||
|
@ -3095,28 +3088,6 @@ void sd_attrs_to_i_attrs(__u16 sd_attrs, struct inode *inode)
|
|||
}
|
||||
}
|
||||
|
||||
void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs)
|
||||
{
|
||||
if (reiserfs_attrs(inode->i_sb)) {
|
||||
if (inode->i_flags & S_IMMUTABLE)
|
||||
*sd_attrs |= REISERFS_IMMUTABLE_FL;
|
||||
else
|
||||
*sd_attrs &= ~REISERFS_IMMUTABLE_FL;
|
||||
if (inode->i_flags & S_SYNC)
|
||||
*sd_attrs |= REISERFS_SYNC_FL;
|
||||
else
|
||||
*sd_attrs &= ~REISERFS_SYNC_FL;
|
||||
if (inode->i_flags & S_NOATIME)
|
||||
*sd_attrs |= REISERFS_NOATIME_FL;
|
||||
else
|
||||
*sd_attrs &= ~REISERFS_NOATIME_FL;
|
||||
if (REISERFS_I(inode)->i_flags & i_nopack_mask)
|
||||
*sd_attrs |= REISERFS_NOTAIL_FL;
|
||||
else
|
||||
*sd_attrs &= ~REISERFS_NOTAIL_FL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* decide if this buffer needs to stay around for data logging or ordered
|
||||
* write purposes
|
||||
|
|
|
@ -47,7 +47,6 @@ long reiserfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
}
|
||||
|
||||
flags = REISERFS_I(inode)->i_attrs;
|
||||
i_attrs_to_sd_attrs(inode, (__u16 *) & flags);
|
||||
err = put_user(flags, (int __user *)arg);
|
||||
break;
|
||||
case REISERFS_IOC_SETFLAGS:{
|
||||
|
|
|
@ -1961,7 +1961,7 @@ static int do_journal_release(struct reiserfs_transaction_handle *th,
|
|||
* will be requeued because superblock is being shutdown and doesn't
|
||||
* have MS_ACTIVE set.
|
||||
*/
|
||||
cancel_delayed_work_sync(&REISERFS_SB(sb)->old_work);
|
||||
reiserfs_cancel_old_flush(sb);
|
||||
/* wait for all commits to finish */
|
||||
cancel_delayed_work_sync(&SB_JOURNAL(sb)->j_work);
|
||||
|
||||
|
|
|
@ -475,7 +475,7 @@ static void leaf_item_bottle(struct buffer_info *dest_bi,
|
|||
* 'cpy_bytes'; create new item header;
|
||||
* n_ih = new item_header;
|
||||
*/
|
||||
memcpy(&n_ih, ih, SHORT_KEY_SIZE);
|
||||
memcpy(&n_ih.ih_key, &ih->ih_key, KEY_SIZE);
|
||||
|
||||
/* Endian safe, both le */
|
||||
n_ih.ih_version = ih->ih_version;
|
||||
|
|
|
@ -1326,7 +1326,6 @@ struct cpu_key {
|
|||
#define KEY_NOT_FOUND 0
|
||||
|
||||
#define KEY_SIZE (sizeof(struct reiserfs_key))
|
||||
#define SHORT_KEY_SIZE (sizeof (__u32) + sizeof (__u32))
|
||||
|
||||
/* return values for search_by_key and clones */
|
||||
#define ITEM_FOUND 1
|
||||
|
@ -2949,6 +2948,7 @@ int reiserfs_allocate_list_bitmaps(struct super_block *s,
|
|||
struct reiserfs_list_bitmap *, unsigned int);
|
||||
|
||||
void reiserfs_schedule_old_flush(struct super_block *s);
|
||||
void reiserfs_cancel_old_flush(struct super_block *s);
|
||||
void add_save_link(struct reiserfs_transaction_handle *th,
|
||||
struct inode *inode, int truncate);
|
||||
int remove_save_link(struct inode *inode, int truncate);
|
||||
|
@ -3099,7 +3099,6 @@ static inline void reiserfs_update_sd(struct reiserfs_transaction_handle *th,
|
|||
}
|
||||
|
||||
void sd_attrs_to_i_attrs(__u16 sd_attrs, struct inode *inode);
|
||||
void i_attrs_to_sd_attrs(struct inode *inode, __u16 * sd_attrs);
|
||||
int reiserfs_setattr(struct dentry *dentry, struct iattr *attr);
|
||||
|
||||
int __reiserfs_write_begin(struct page *page, unsigned from, unsigned len);
|
||||
|
|
|
@ -89,11 +89,27 @@ static void flush_old_commits(struct work_struct *work)
|
|||
sbi = container_of(work, struct reiserfs_sb_info, old_work.work);
|
||||
s = sbi->s_journal->j_work_sb;
|
||||
|
||||
/*
|
||||
* We need s_umount for protecting quota writeback. We have to use
|
||||
* trylock as reiserfs_cancel_old_flush() may be waiting for this work
|
||||
* to complete with s_umount held.
|
||||
*/
|
||||
if (!down_read_trylock(&s->s_umount)) {
|
||||
/* Requeue work if we are not cancelling it */
|
||||
spin_lock(&sbi->old_work_lock);
|
||||
if (sbi->work_queued == 1)
|
||||
queue_delayed_work(system_long_wq, &sbi->old_work, HZ);
|
||||
spin_unlock(&sbi->old_work_lock);
|
||||
return;
|
||||
}
|
||||
spin_lock(&sbi->old_work_lock);
|
||||
sbi->work_queued = 0;
|
||||
/* Avoid clobbering the cancel state... */
|
||||
if (sbi->work_queued == 1)
|
||||
sbi->work_queued = 0;
|
||||
spin_unlock(&sbi->old_work_lock);
|
||||
|
||||
reiserfs_sync_fs(s, 1);
|
||||
up_read(&s->s_umount);
|
||||
}
|
||||
|
||||
void reiserfs_schedule_old_flush(struct super_block *s)
|
||||
|
@ -117,21 +133,22 @@ void reiserfs_schedule_old_flush(struct super_block *s)
|
|||
spin_unlock(&sbi->old_work_lock);
|
||||
}
|
||||
|
||||
static void cancel_old_flush(struct super_block *s)
|
||||
void reiserfs_cancel_old_flush(struct super_block *s)
|
||||
{
|
||||
struct reiserfs_sb_info *sbi = REISERFS_SB(s);
|
||||
|
||||
cancel_delayed_work_sync(&REISERFS_SB(s)->old_work);
|
||||
spin_lock(&sbi->old_work_lock);
|
||||
sbi->work_queued = 0;
|
||||
/* Make sure no new flushes will be queued */
|
||||
sbi->work_queued = 2;
|
||||
spin_unlock(&sbi->old_work_lock);
|
||||
cancel_delayed_work_sync(&REISERFS_SB(s)->old_work);
|
||||
}
|
||||
|
||||
static int reiserfs_freeze(struct super_block *s)
|
||||
{
|
||||
struct reiserfs_transaction_handle th;
|
||||
|
||||
cancel_old_flush(s);
|
||||
reiserfs_cancel_old_flush(s);
|
||||
|
||||
reiserfs_write_lock(s);
|
||||
if (!(s->s_flags & MS_RDONLY)) {
|
||||
|
@ -152,7 +169,13 @@ static int reiserfs_freeze(struct super_block *s)
|
|||
|
||||
static int reiserfs_unfreeze(struct super_block *s)
|
||||
{
|
||||
struct reiserfs_sb_info *sbi = REISERFS_SB(s);
|
||||
|
||||
reiserfs_allow_writes(s);
|
||||
spin_lock(&sbi->old_work_lock);
|
||||
/* Allow old_work to run again */
|
||||
sbi->work_queued = 0;
|
||||
spin_unlock(&sbi->old_work_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -547,12 +570,28 @@ static void reiserfs_kill_sb(struct super_block *s)
|
|||
kill_block_super(s);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_QUOTA
|
||||
static int reiserfs_quota_off(struct super_block *sb, int type);
|
||||
|
||||
static void reiserfs_quota_off_umount(struct super_block *s)
|
||||
{
|
||||
int type;
|
||||
|
||||
for (type = 0; type < REISERFS_MAXQUOTAS; type++)
|
||||
reiserfs_quota_off(s, type);
|
||||
}
|
||||
#else
|
||||
static inline void reiserfs_quota_off_umount(struct super_block *s)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void reiserfs_put_super(struct super_block *s)
|
||||
{
|
||||
struct reiserfs_transaction_handle th;
|
||||
th.t_trans_id = 0;
|
||||
|
||||
dquot_disable(s, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED);
|
||||
reiserfs_quota_off_umount(s);
|
||||
|
||||
reiserfs_write_lock(s);
|
||||
|
||||
|
@ -817,7 +856,7 @@ static const struct dquot_operations reiserfs_quota_operations = {
|
|||
|
||||
static const struct quotactl_ops reiserfs_qctl_operations = {
|
||||
.quota_on = reiserfs_quota_on,
|
||||
.quota_off = dquot_quota_off,
|
||||
.quota_off = reiserfs_quota_off,
|
||||
.quota_sync = dquot_quota_sync,
|
||||
.get_state = dquot_get_state,
|
||||
.set_info = dquot_set_dqinfo,
|
||||
|
@ -2194,7 +2233,7 @@ error_unlocked:
|
|||
if (sbi->commit_wq)
|
||||
destroy_workqueue(sbi->commit_wq);
|
||||
|
||||
cancel_delayed_work_sync(&REISERFS_SB(s)->old_work);
|
||||
reiserfs_cancel_old_flush(s);
|
||||
|
||||
reiserfs_free_bitmap_cache(s);
|
||||
if (SB_BUFFER_WITH_SB(s))
|
||||
|
@ -2405,12 +2444,47 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id,
|
|||
goto out;
|
||||
}
|
||||
reiserfs_write_unlock(sb);
|
||||
return dquot_quota_on(sb, type, format_id, path);
|
||||
err = dquot_quota_on(sb, type, format_id, path);
|
||||
if (!err) {
|
||||
inode_lock(inode);
|
||||
REISERFS_I(inode)->i_attrs |= REISERFS_IMMUTABLE_FL |
|
||||
REISERFS_NOATIME_FL;
|
||||
inode_set_flags(inode, S_IMMUTABLE | S_NOATIME,
|
||||
S_IMMUTABLE | S_NOATIME);
|
||||
inode_unlock(inode);
|
||||
mark_inode_dirty(inode);
|
||||
}
|
||||
return err;
|
||||
out:
|
||||
reiserfs_write_unlock(sb);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int reiserfs_quota_off(struct super_block *sb, int type)
|
||||
{
|
||||
int err;
|
||||
struct inode *inode = sb_dqopt(sb)->files[type];
|
||||
|
||||
if (!inode || !igrab(inode))
|
||||
goto out;
|
||||
|
||||
err = dquot_quota_off(sb, type);
|
||||
if (err)
|
||||
goto out_put;
|
||||
|
||||
inode_lock(inode);
|
||||
REISERFS_I(inode)->i_attrs &= ~(REISERFS_IMMUTABLE_FL |
|
||||
REISERFS_NOATIME_FL);
|
||||
inode_set_flags(inode, 0, S_IMMUTABLE | S_NOATIME);
|
||||
inode_unlock(inode);
|
||||
mark_inode_dirty(inode);
|
||||
out_put:
|
||||
iput(inode);
|
||||
return err;
|
||||
out:
|
||||
return dquot_quota_off(sb, type);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read data from quotafile - avoid pagecache and such because we cannot afford
|
||||
* acquiring the locks... As quota files are never truncated and quota code
|
||||
|
|
|
@ -44,12 +44,12 @@ static void __udf_adinicb_readpage(struct page *page)
|
|||
char *kaddr;
|
||||
struct udf_inode_info *iinfo = UDF_I(inode);
|
||||
|
||||
kaddr = kmap(page);
|
||||
kaddr = kmap_atomic(page);
|
||||
memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, inode->i_size);
|
||||
memset(kaddr + inode->i_size, 0, PAGE_SIZE - inode->i_size);
|
||||
flush_dcache_page(page);
|
||||
SetPageUptodate(page);
|
||||
kunmap(page);
|
||||
kunmap_atomic(kaddr);
|
||||
}
|
||||
|
||||
static int udf_adinicb_readpage(struct file *file, struct page *page)
|
||||
|
@ -70,11 +70,11 @@ static int udf_adinicb_writepage(struct page *page,
|
|||
|
||||
BUG_ON(!PageLocked(page));
|
||||
|
||||
kaddr = kmap(page);
|
||||
kaddr = kmap_atomic(page);
|
||||
memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr, inode->i_size);
|
||||
mark_inode_dirty(inode);
|
||||
SetPageUptodate(page);
|
||||
kunmap(page);
|
||||
kunmap_atomic(kaddr);
|
||||
mark_inode_dirty(inode);
|
||||
unlock_page(page);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -276,14 +276,14 @@ int udf_expand_file_adinicb(struct inode *inode)
|
|||
return -ENOMEM;
|
||||
|
||||
if (!PageUptodate(page)) {
|
||||
kaddr = kmap(page);
|
||||
kaddr = kmap_atomic(page);
|
||||
memset(kaddr + iinfo->i_lenAlloc, 0x00,
|
||||
PAGE_SIZE - iinfo->i_lenAlloc);
|
||||
memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr,
|
||||
iinfo->i_lenAlloc);
|
||||
flush_dcache_page(page);
|
||||
SetPageUptodate(page);
|
||||
kunmap(page);
|
||||
kunmap_atomic(kaddr);
|
||||
}
|
||||
down_write(&iinfo->i_data_sem);
|
||||
memset(iinfo->i_ext.i_data + iinfo->i_lenEAttr, 0x00,
|
||||
|
@ -300,11 +300,11 @@ int udf_expand_file_adinicb(struct inode *inode)
|
|||
if (err) {
|
||||
/* Restore everything back so that we don't lose data... */
|
||||
lock_page(page);
|
||||
kaddr = kmap(page);
|
||||
down_write(&iinfo->i_data_sem);
|
||||
kaddr = kmap_atomic(page);
|
||||
memcpy(iinfo->i_ext.i_data + iinfo->i_lenEAttr, kaddr,
|
||||
inode->i_size);
|
||||
kunmap(page);
|
||||
kunmap_atomic(kaddr);
|
||||
unlock_page(page);
|
||||
iinfo->i_alloc_type = ICBTAG_FLAG_AD_IN_ICB;
|
||||
inode->i_data.a_ops = &udf_adinicb_aops;
|
||||
|
@ -1535,7 +1535,7 @@ reread:
|
|||
inode->i_data.a_ops = &udf_symlink_aops;
|
||||
inode->i_op = &udf_symlink_inode_operations;
|
||||
inode_nohighmem(inode);
|
||||
inode->i_mode = S_IFLNK | S_IRWXUGO;
|
||||
inode->i_mode = S_IFLNK | 0777;
|
||||
break;
|
||||
case ICBTAG_FILE_TYPE_MAIN:
|
||||
udf_debug("METADATA FILE-----\n");
|
||||
|
@ -1591,9 +1591,9 @@ static umode_t udf_convert_permissions(struct fileEntry *fe)
|
|||
permissions = le32_to_cpu(fe->permissions);
|
||||
flags = le16_to_cpu(fe->icbTag.flags);
|
||||
|
||||
mode = ((permissions) & S_IRWXO) |
|
||||
((permissions >> 2) & S_IRWXG) |
|
||||
((permissions >> 4) & S_IRWXU) |
|
||||
mode = ((permissions) & 0007) |
|
||||
((permissions >> 2) & 0070) |
|
||||
((permissions >> 4) & 0700) |
|
||||
((flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) |
|
||||
((flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) |
|
||||
((flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0);
|
||||
|
@ -1669,9 +1669,9 @@ static int udf_update_inode(struct inode *inode, int do_sync)
|
|||
else
|
||||
fe->gid = cpu_to_le32(i_gid_read(inode));
|
||||
|
||||
udfperms = ((inode->i_mode & S_IRWXO)) |
|
||||
((inode->i_mode & S_IRWXG) << 2) |
|
||||
((inode->i_mode & S_IRWXU) << 4);
|
||||
udfperms = ((inode->i_mode & 0007)) |
|
||||
((inode->i_mode & 0070) << 2) |
|
||||
((inode->i_mode & 0700) << 4);
|
||||
|
||||
udfperms |= (le32_to_cpu(fe->permissions) &
|
||||
(FE_PERM_O_DELETE | FE_PERM_O_CHATTR |
|
||||
|
|
|
@ -906,7 +906,7 @@ out:
|
|||
static int udf_symlink(struct inode *dir, struct dentry *dentry,
|
||||
const char *symname)
|
||||
{
|
||||
struct inode *inode = udf_new_inode(dir, S_IFLNK | S_IRWXUGO);
|
||||
struct inode *inode = udf_new_inode(dir, S_IFLNK | 0777);
|
||||
struct pathComponent *pc;
|
||||
const char *compstart;
|
||||
struct extent_position epos = {};
|
||||
|
|
|
@ -162,7 +162,6 @@ static inline bool sb_has_quota_active(struct super_block *sb, int type)
|
|||
* Operations supported for diskquotas.
|
||||
*/
|
||||
extern const struct dquot_operations dquot_operations;
|
||||
extern const struct quotactl_ops dquot_quotactl_ops;
|
||||
extern const struct quotactl_ops dquot_quotactl_sysfile_ops;
|
||||
|
||||
#else
|
||||
|
|
Загрузка…
Ссылка в новой задаче