diff options
| author | Evgeniy Polyakov <zbr@ioremap.net> | 2009-03-27 15:04:23 +0300 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-04-17 11:06:30 -0700 | 
| commit | e504342448375ffd73dec2b540a5aaf5da6f8439 (patch) | |
| tree | d60321eb21b56d4e7e9c1d774a0aad51fcafc990 /drivers | |
| parent | 872dc5e500cc25e3c35d83510dfbd6fb8d78221b (diff) | |
| download | linux-e504342448375ffd73dec2b540a5aaf5da6f8439.tar.bz2 | |
Staging: Pohmelfs: Extend remount option.
Signed-off-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/staging/pohmelfs/inode.c | 73 | 
1 files changed, 46 insertions, 27 deletions
| diff --git a/drivers/staging/pohmelfs/inode.c b/drivers/staging/pohmelfs/inode.c index 00570d9c265a..3fef09fd712c 100644 --- a/drivers/staging/pohmelfs/inode.c +++ b/drivers/staging/pohmelfs/inode.c @@ -1169,16 +1169,17 @@ err_out_put:  static int pohmelfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)  {  	struct inode *inode = dentry->d_inode; +#if 0  	struct pohmelfs_inode *pi = POHMELFS_I(inode);  	int err; -#if 0 +  	err = pohmelfs_data_lock(pi, 0, ~0, POHMELFS_READ_LOCK);  	if (err)  		return err; -#endif  	dprintk("%s: ino: %llu, mode: %o, uid: %u, gid: %u, size: %llu.\n",  			__func__, pi->ino, inode->i_mode, inode->i_uid,  			inode->i_gid, inode->i_size); +#endif  	generic_fillattr(inode, stat);  	return 0; @@ -1346,12 +1347,6 @@ static void pohmelfs_put_super(struct super_block *sb)  	pohmelfs_ftrans_exit();  } -static int pohmelfs_remount(struct super_block *sb, int *flags, char *data) -{ -	*flags |= MS_RDONLY; -	return 0; -} -  static int pohmelfs_statfs(struct dentry *dentry, struct kstatfs *buf)  {  	struct super_block *sb = dentry->d_sb; @@ -1394,42 +1389,33 @@ static int pohmelfs_show_options(struct seq_file *seq, struct vfsmount *vfs)  	return 0;  } -static const struct super_operations pohmelfs_sb_ops = { -	.alloc_inode	= pohmelfs_alloc_inode, -	.destroy_inode	= pohmelfs_destroy_inode, -	.drop_inode	= pohmelfs_drop_inode, -	.write_inode	= pohmelfs_write_inode, -	.put_super	= pohmelfs_put_super, -	.remount_fs	= pohmelfs_remount, -	.statfs		= pohmelfs_statfs, -	.show_options	= pohmelfs_show_options, -}; -  enum {  	pohmelfs_opt_idx, +	pohmelfs_opt_crypto_thread_num, +	pohmelfs_opt_trans_max_pages, +	pohmelfs_opt_crypto_fail_unsupported, + +	/* Remountable options */  	pohmelfs_opt_trans_scan_timeout,  	pohmelfs_opt_drop_scan_timeout,  	pohmelfs_opt_wait_on_page_timeout,  	pohmelfs_opt_trans_retries, -	pohmelfs_opt_crypto_thread_num, -	pohmelfs_opt_trans_max_pages, -	pohmelfs_opt_crypto_fail_unsupported,  	pohmelfs_opt_mcache_timeout,  };  static struct match_token pohmelfs_tokens[] = {  	{pohmelfs_opt_idx, "idx=%u"}, +	{pohmelfs_opt_crypto_thread_num, "crypto_thread_num=%u"}, +	{pohmelfs_opt_trans_max_pages, "trans_max_pages=%u"}, +	{pohmelfs_opt_crypto_fail_unsupported, "crypto_fail_unsupported"},  	{pohmelfs_opt_trans_scan_timeout, "trans_scan_timeout=%u"},  	{pohmelfs_opt_drop_scan_timeout, "drop_scan_timeout=%u"},  	{pohmelfs_opt_wait_on_page_timeout, "wait_on_page_timeout=%u"},  	{pohmelfs_opt_trans_retries, "trans_retries=%u"}, -	{pohmelfs_opt_crypto_thread_num, "crypto_thread_num=%u"}, -	{pohmelfs_opt_trans_max_pages, "trans_max_pages=%u"}, -	{pohmelfs_opt_crypto_fail_unsupported, "crypto_fail_unsupported"},  	{pohmelfs_opt_mcache_timeout, "mcache_timeout=%u"},  }; -static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb) +static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb, int remount)  {  	char *p;  	substring_t args[MAX_OPT_ARGS]; @@ -1449,6 +1435,9 @@ static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb)  		if (err)  			return err; +		if (remount && token <= pohmelfs_opt_crypto_fail_unsupported) +			continue; +  		switch (token) {  			case pohmelfs_opt_idx:  				psb->idx = option; @@ -1485,6 +1474,25 @@ static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb)  	return 0;  } +static int pohmelfs_remount(struct super_block *sb, int *flags, char *data) +{ +	int err; +	struct pohmelfs_sb *psb = POHMELFS_SB(sb); +	unsigned long old_sb_flags = sb->s_flags; + +	err = pohmelfs_parse_options(data, psb, 1); +	if (err) +		goto err_out_restore; + +	if (!(*flags & MS_RDONLY)) +		sb->s_flags &= ~MS_RDONLY; +	return 0; + +err_out_restore: +	sb->s_flags = old_sb_flags; +	return err; +} +  static void pohmelfs_flush_inode(struct pohmelfs_inode *pi, unsigned int count)  {  	struct inode *inode = &pi->vfs_inode; @@ -1753,6 +1761,17 @@ err_out_exit:  	return err;  } +static const struct super_operations pohmelfs_sb_ops = { +	.alloc_inode	= pohmelfs_alloc_inode, +	.destroy_inode	= pohmelfs_destroy_inode, +	.drop_inode	= pohmelfs_drop_inode, +	.write_inode	= pohmelfs_write_inode, +	.put_super	= pohmelfs_put_super, +	.remount_fs	= pohmelfs_remount, +	.statfs		= pohmelfs_statfs, +	.show_options	= pohmelfs_show_options, +}; +  /*   * Allocate private superblock and create root dir.   */ @@ -1816,7 +1835,7 @@ static int pohmelfs_fill_super(struct super_block *sb, void *data, int silent)  	mutex_init(&psb->state_lock);  	INIT_LIST_HEAD(&psb->state_list); -	err = pohmelfs_parse_options((char *) data, psb); +	err = pohmelfs_parse_options((char *) data, psb, 0);  	if (err)  		goto err_out_free_sb; |