aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext3
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-09-06 12:06:02 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-06 12:06:02 -0400
commitec0ad730802173ec17e942f4b652a1819b1025b2 (patch)
tree25020c312014f1028447f981b0014f90c36b158a /fs/ext3
parenteb97a784f02991cc3736d787511e788f32f0627f (diff)
parent97a2847d064e2fdd2e3cd4ff14cad2f377f0677a (diff)
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
Pull ext3, reiserfs, udf & isofs fixes from Jan Kara: "The contains a bunch of ext3 cleanups and minor improvements, major reiserfs locking changes which should hopefully fix deadlocks introduced by BKL removal, and udf/isofs changes to refuse mounting fs rw instead of mounting it ro automatically which makes eject button work as expected for all media (see the changelog for why userspace should be ok with this change)" * 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs: jbd: use a single printk for jbd_debug() reiserfs: locking, release lock around quota operations reiserfs: locking, handle nested locks properly reiserfs: locking, push write lock out of xattr code jbd: relocate assert after state lock in journal_commit_transaction() udf: Refuse RW mount of the filesystem instead of making it RO udf: Standardize return values in mount sequence isofs: Refuse RW mount of the filesystem instead of making it RO ext3: allow specifying external journal by pathname mount option jbd: remove unneeded semicolon
Diffstat (limited to 'fs/ext3')
-rw-r--r--fs/ext3/super.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c
index c47f14750722..c50c76190373 100644
--- a/fs/ext3/super.c
+++ b/fs/ext3/super.c
@@ -27,6 +27,7 @@
27#include <linux/seq_file.h> 27#include <linux/seq_file.h>
28#include <linux/log2.h> 28#include <linux/log2.h>
29#include <linux/cleancache.h> 29#include <linux/cleancache.h>
30#include <linux/namei.h>
30 31
31#include <asm/uaccess.h> 32#include <asm/uaccess.h>
32 33
@@ -819,6 +820,7 @@ enum {
819 Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, 820 Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl,
820 Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, Opt_bh, 821 Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, Opt_bh,
821 Opt_commit, Opt_journal_update, Opt_journal_inum, Opt_journal_dev, 822 Opt_commit, Opt_journal_update, Opt_journal_inum, Opt_journal_dev,
823 Opt_journal_path,
822 Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, 824 Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
823 Opt_data_err_abort, Opt_data_err_ignore, 825 Opt_data_err_abort, Opt_data_err_ignore,
824 Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, 826 Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota,
@@ -860,6 +862,7 @@ static const match_table_t tokens = {
860 {Opt_journal_update, "journal=update"}, 862 {Opt_journal_update, "journal=update"},
861 {Opt_journal_inum, "journal=%u"}, 863 {Opt_journal_inum, "journal=%u"},
862 {Opt_journal_dev, "journal_dev=%u"}, 864 {Opt_journal_dev, "journal_dev=%u"},
865 {Opt_journal_path, "journal_path=%s"},
863 {Opt_abort, "abort"}, 866 {Opt_abort, "abort"},
864 {Opt_data_journal, "data=journal"}, 867 {Opt_data_journal, "data=journal"},
865 {Opt_data_ordered, "data=ordered"}, 868 {Opt_data_ordered, "data=ordered"},
@@ -975,6 +978,11 @@ static int parse_options (char *options, struct super_block *sb,
975 int option; 978 int option;
976 kuid_t uid; 979 kuid_t uid;
977 kgid_t gid; 980 kgid_t gid;
981 char *journal_path;
982 struct inode *journal_inode;
983 struct path path;
984 int error;
985
978#ifdef CONFIG_QUOTA 986#ifdef CONFIG_QUOTA
979 int qfmt; 987 int qfmt;
980#endif 988#endif
@@ -1129,6 +1137,41 @@ static int parse_options (char *options, struct super_block *sb,
1129 return 0; 1137 return 0;
1130 *journal_devnum = option; 1138 *journal_devnum = option;
1131 break; 1139 break;
1140 case Opt_journal_path:
1141 if (is_remount) {
1142 ext3_msg(sb, KERN_ERR, "error: cannot specify "
1143 "journal on remount");
1144 return 0;
1145 }
1146
1147 journal_path = match_strdup(&args[0]);
1148 if (!journal_path) {
1149 ext3_msg(sb, KERN_ERR, "error: could not dup "
1150 "journal device string");
1151 return 0;
1152 }
1153
1154 error = kern_path(journal_path, LOOKUP_FOLLOW, &path);
1155 if (error) {
1156 ext3_msg(sb, KERN_ERR, "error: could not find "
1157 "journal device path: error %d", error);
1158 kfree(journal_path);
1159 return 0;
1160 }
1161
1162 journal_inode = path.dentry->d_inode;
1163 if (!S_ISBLK(journal_inode->i_mode)) {
1164 ext3_msg(sb, KERN_ERR, "error: journal path %s "
1165 "is not a block device", journal_path);
1166 path_put(&path);
1167 kfree(journal_path);
1168 return 0;
1169 }
1170
1171 *journal_devnum = new_encode_dev(journal_inode->i_rdev);
1172 path_put(&path);
1173 kfree(journal_path);
1174 break;
1132 case Opt_noload: 1175 case Opt_noload:
1133 set_opt (sbi->s_mount_opt, NOLOAD); 1176 set_opt (sbi->s_mount_opt, NOLOAD);
1134 break; 1177 break;