diff options
Diffstat (limited to 'fs/ubifs')
| -rw-r--r-- | fs/ubifs/debug.c | 11 | ||||
| -rw-r--r-- | fs/ubifs/debug.h | 5 | ||||
| -rw-r--r-- | fs/ubifs/dir.c | 6 | ||||
| -rw-r--r-- | fs/ubifs/orphan.c | 4 | ||||
| -rw-r--r-- | fs/ubifs/replay.c | 20 | ||||
| -rw-r--r-- | fs/ubifs/sb.c | 8 | ||||
| -rw-r--r-- | fs/ubifs/super.c | 3 | 
7 files changed, 34 insertions, 23 deletions
diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index 92df3b08153..bb3167257aa 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c @@ -2802,6 +2802,8 @@ static ssize_t dfs_file_read(struct file *file, char __user *u, size_t count,  		val = d->chk_fs;  	else if (dent == d->dfs_tst_rcvry)  		val = d->tst_rcvry; +	else if (dent == d->dfs_ro_error) +		val = c->ro_error;  	else  		return -EINVAL; @@ -2885,6 +2887,8 @@ static ssize_t dfs_file_write(struct file *file, const char __user *u,  		d->chk_fs = val;  	else if (dent == d->dfs_tst_rcvry)  		d->tst_rcvry = val; +	else if (dent == d->dfs_ro_error) +		c->ro_error = !!val;  	else  		return -EINVAL; @@ -2996,6 +3000,13 @@ int dbg_debugfs_init_fs(struct ubifs_info *c)  		goto out_remove;  	d->dfs_tst_rcvry = dent; +	fname = "ro_error"; +	dent = debugfs_create_file(fname, S_IRUSR | S_IWUSR, d->dfs_dir, c, +				   &dfs_fops); +	if (IS_ERR_OR_NULL(dent)) +		goto out_remove; +	d->dfs_ro_error = dent; +  	return 0;  out_remove: diff --git a/fs/ubifs/debug.h b/fs/ubifs/debug.h index 486a8e024fb..8b8cc4e945f 100644 --- a/fs/ubifs/debug.h +++ b/fs/ubifs/debug.h @@ -79,6 +79,10 @@ typedef int (*dbg_znode_callback)(struct ubifs_info *c,   * @dfs_chk_lprops: debugfs knob to enable UBIFS LEP properties extra checks   * @dfs_chk_fs: debugfs knob to enable UBIFS contents extra checks   * @dfs_tst_rcvry: debugfs knob to enable UBIFS recovery testing + * @dfs_ro_error: debugfs knob to switch UBIFS to R/O mode (different to + *                re-mounting to R/O mode because it does not flush any buffers + *                and UBIFS just starts returning -EROFS on all write + *               operations)   */  struct ubifs_debug_info {  	struct ubifs_zbranch old_zroot; @@ -122,6 +126,7 @@ struct ubifs_debug_info {  	struct dentry *dfs_chk_lprops;  	struct dentry *dfs_chk_fs;  	struct dentry *dfs_tst_rcvry; +	struct dentry *dfs_ro_error;  };  /** diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c index a6d42efc76d..c95681cf1b7 100644 --- a/fs/ubifs/dir.c +++ b/fs/ubifs/dir.c @@ -184,7 +184,7 @@ static int dbg_check_name(const struct ubifs_info *c,  }  static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, -				   struct nameidata *nd) +				   unsigned int flags)  {  	int err;  	union ubifs_key key; @@ -246,7 +246,7 @@ out:  }  static int ubifs_create(struct inode *dir, struct dentry *dentry, umode_t mode, -			struct nameidata *nd) +			bool excl)  {  	struct inode *inode;  	struct ubifs_info *c = dir->i_sb->s_fs_info; @@ -969,7 +969,7 @@ static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry,  	struct ubifs_budget_req ino_req = { .dirtied_ino = 1,  			.dirtied_ino_d = ALIGN(old_inode_ui->data_len, 8) };  	struct timespec time; -	unsigned int saved_nlink; +	unsigned int uninitialized_var(saved_nlink);  	/*  	 * Budget request settings: deletion direntry, new direntry, removing diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c index b02734db187..cebf17ea045 100644 --- a/fs/ubifs/orphan.c +++ b/fs/ubifs/orphan.c @@ -176,7 +176,7 @@ int ubifs_orphan_start_commit(struct ubifs_info *c)  		*last = orphan;  		last = &orphan->cnext;  	} -	*last = orphan->cnext; +	*last = NULL;  	c->cmt_orphans = c->new_orphans;  	c->new_orphans = 0;  	dbg_cmt("%d orphans to commit", c->cmt_orphans); @@ -382,7 +382,7 @@ static int consolidate(struct ubifs_info *c)  			last = &orphan->cnext;  			cnt += 1;  		} -		*last = orphan->cnext; +		*last = NULL;  		ubifs_assert(cnt == c->tot_orphans - c->new_orphans);  		c->cmt_orphans = cnt;  		c->ohead_lnum = c->orph_first; diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c index 3a2da7e476e..eba46d4a761 100644 --- a/fs/ubifs/replay.c +++ b/fs/ubifs/replay.c @@ -1007,7 +1007,7 @@ out:   */  int ubifs_replay_journal(struct ubifs_info *c)  { -	int err, i, lnum, offs, free; +	int err, lnum, free;  	BUILD_BUG_ON(UBIFS_TRUN_KEY > 5); @@ -1025,25 +1025,17 @@ int ubifs_replay_journal(struct ubifs_info *c)  	dbg_mnt("start replaying the journal");  	c->replaying = 1;  	lnum = c->ltail_lnum = c->lhead_lnum; -	offs = c->lhead_offs; -	for (i = 0; i < c->log_lebs; i++, lnum++) { -		if (lnum >= UBIFS_LOG_LNUM + c->log_lebs) { -			/* -			 * The log is logically circular, we reached the last -			 * LEB, switch to the first one. -			 */ -			lnum = UBIFS_LOG_LNUM; -			offs = 0; -		} -		err = replay_log_leb(c, lnum, offs, c->sbuf); +	lnum = UBIFS_LOG_LNUM; +	do { +		err = replay_log_leb(c, lnum, 0, c->sbuf);  		if (err == 1)  			/* We hit the end of the log */  			break;  		if (err)  			goto out; -		offs = 0; -	} +		lnum = ubifs_next_log_lnum(c, lnum); +	} while (lnum != UBIFS_LOG_LNUM);  	err = replay_buds(c);  	if (err) diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c index ef3d1ba6d99..15e2fc5aa60 100644 --- a/fs/ubifs/sb.c +++ b/fs/ubifs/sb.c @@ -718,8 +718,12 @@ static int fixup_free_space(struct ubifs_info *c)  		lnum = ubifs_next_log_lnum(c, lnum);  	} -	/* Fixup the current log head */ -	err = fixup_leb(c, c->lhead_lnum, c->lhead_offs); +	/* +	 * Fixup the log head which contains the only a CS node at the +	 * beginning. +	 */ +	err = fixup_leb(c, c->lhead_lnum, +			ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size));  	if (err)  		goto out; diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 5862dd9d278..1c766c39c03 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -2136,7 +2136,7 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags,  	dbg_gen("opened ubi%d_%d", c->vi.ubi_num, c->vi.vol_id); -	sb = sget(fs_type, sb_test, sb_set, c); +	sb = sget(fs_type, sb_test, sb_set, flags, c);  	if (IS_ERR(sb)) {  		err = PTR_ERR(sb);  		kfree(c); @@ -2153,7 +2153,6 @@ static struct dentry *ubifs_mount(struct file_system_type *fs_type, int flags,  			goto out_deact;  		}  	} else { -		sb->s_flags = flags;  		err = ubifs_fill_super(sb, data, flags & MS_SILENT ? 1 : 0);  		if (err)  			goto out_deact;  |