]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge branch 'generic' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 May 2017 18:35:47 +0000 (11:35 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 May 2017 18:35:47 +0000 (11:35 -0700)
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

24 files changed:
fs/ext2/ext2.h
fs/ext2/inode.c
fs/ext2/ioctl.c
fs/ext2/super.c
fs/ext4/ext4.h
fs/ext4/inode.c
fs/ext4/ioctl.c
fs/ext4/super.c
fs/jfs/ioctl.c
fs/jfs/jfs_imap.c
fs/jfs/jfs_inode.c
fs/jfs/jfs_inode.h
fs/jfs/super.c
fs/quota/dquot.c
fs/reiserfs/inode.c
fs/reiserfs/ioctl.c
fs/reiserfs/journal.c
fs/reiserfs/lbalance.c
fs/reiserfs/reiserfs.h
fs/reiserfs/super.c
fs/udf/file.c
fs/udf/inode.c
fs/udf/namei.c
include/linux/quotaops.h

index 5e64de9c5093fa5d3a3e361305f8c648284c4e24..03f5ce1d3dbe1c334958c1de072ff88ce1cdeb8a 100644 (file)
@@ -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
index 128cce5406455716172a88a50cbeddd6edf046f2..3a38c1b84e3cd992b165aed306f2d9f04e6e135b 100644 (file)
@@ -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);
                        }
                }
        }
index 191e02b28ce8ff0329646313a7e8445b36ef7b93..087f122cca42063a796367364e09874581fba90d 100644 (file)
@@ -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: {
index 9e25a71fe1a27e584ab3754f0a70b26e94f9a44c..8ac673c71a3612dcf1fbac84dc653253e0550a1b 100644 (file)
@@ -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 = {
index fb69ee2388dba0b83b4f29c57b37ec5cb0aefb34..f7b465b4fb69c5a186a7f0629d58971695ea1770 100644 (file)
@@ -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 *);
index b9ffa9f4191f4cb3a122c215894ef76689fd9604..10b574ab354bd7060b995080dd89dd47e7fff36b 100644 (file)
@@ -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);
index a4273ddb992232e1587e33fd7f3a23ea926aaa7e..184e74eb3004a6eadcff415959cc5410b77a514b 100644 (file)
@@ -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)) {
index a9448db1cf7e87c2bd41daac6fbab7729bc87ecc..a9c72e39a4eef288f433836c50f32d8d2aabaed0 100644 (file)
@@ -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);
 }
index fc89f94367842583d7dd9f9d8d93707e5bd1a50c..5c5ac5b3aec33baf1da1af89f762d62275a59916 100644 (file)
@@ -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;
 
                /*
index 6aca224a5d6847ac29104f41053f4b1de9f9de8f..f36ef68905a74d830e75e7566c1145c8f55fc0cf 100644 (file)
@@ -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
index 375dd257a34fe343b1b25a0176b4dd863aeae0c4..5e9b7bb3aabf9d5827d367d35ee1bd4740af90e3 100644 (file)
@@ -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()
  *
index 9271cfe4a1490ca88785a7973ecd22fd88000e73..7b0b3a40788ffd0a834df3651a24b66551b71f99 100644 (file)
@@ -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,
index c64c2574a0aad7eecf4922a6a005341c26b3fa24..e8aad7d87b8c938aad4a51db500684950df73944 100644 (file)
@@ -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 = {
index 74b489e3714d51cb66de83d4a9f3510c250456fe..ebf80c7739e15ebdd2bc55896d66943f3aecef9a 100644 (file)
@@ -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,
index a6ab9d64ea1b32777fa79a42f6396f9f52bcab08..873fc04e9403aa7d6ca9c2d13a7d045dd963fe75 100644 (file)
@@ -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
index 1f4692a505a0c08af54f388d09a7fb9a2f0d75fd..acbbaf7a0bb26be8e25039ca4fee2a64a0db02be 100644 (file)
@@ -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:{
index aa40c242f1db3d9901c02eee0fd3e13a351a3c1b..da01f497180a165d163935c4744ef82521bf9151 100644 (file)
@@ -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);
 
index 249594a821e0a5e8c60d96c7cad0cd841fccd70b..f5cebd70d9038571a69ab24ef25af0d4779c600f 100644 (file)
@@ -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;
index 2adcde137c3fb8d569cddcdf83dfd443a11f693f..1d34377fef97624e2ca695b4a552f01e94e84712 100644 (file)
@@ -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);
index feabcde0290d27103a11813682091abd1a191661..685f1e05699868cf59237cec9d3821b1ae2e1a61 100644 (file)
@@ -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
index e04cc0cdca9d736683c4fc5ac647e7fbdcc872c4..f5eb2d5b3bac86d91eaaddddbec6237dbbadfa38 100644 (file)
@@ -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;
index a8d8f71ef8bdb577675284e9cb5f03d38f1d34f7..98c510e172032df27a92b296507a3c1cb3017cdb 100644 (file)
@@ -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 |
index babf48d0e55330ec798460c2a7500878b90eeb06..385ee89d58242d9ffc920b9d2cb6db55999d073b 100644 (file)
@@ -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 = {};
index 799a63d0e1a823e38c0c54f52e5e297cde9bb60c..9c6f768b7d32f66db0b05e0b5500f4b71ecebde7 100644 (file)
@@ -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