Commit e5043424 authored by Evgeniy Polyakov's avatar Evgeniy Polyakov Committed by Greg Kroah-Hartman

Staging: Pohmelfs: Extend remount option.

Signed-off-by: default avatarEvgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 872dc5e5
...@@ -1169,16 +1169,17 @@ err_out_put: ...@@ -1169,16 +1169,17 @@ err_out_put:
static int pohmelfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) static int pohmelfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
#if 0
struct pohmelfs_inode *pi = POHMELFS_I(inode); struct pohmelfs_inode *pi = POHMELFS_I(inode);
int err; int err;
#if 0
err = pohmelfs_data_lock(pi, 0, ~0, POHMELFS_READ_LOCK); err = pohmelfs_data_lock(pi, 0, ~0, POHMELFS_READ_LOCK);
if (err) if (err)
return err; return err;
#endif
dprintk("%s: ino: %llu, mode: %o, uid: %u, gid: %u, size: %llu.\n", dprintk("%s: ino: %llu, mode: %o, uid: %u, gid: %u, size: %llu.\n",
__func__, pi->ino, inode->i_mode, inode->i_uid, __func__, pi->ino, inode->i_mode, inode->i_uid,
inode->i_gid, inode->i_size); inode->i_gid, inode->i_size);
#endif
generic_fillattr(inode, stat); generic_fillattr(inode, stat);
return 0; return 0;
...@@ -1346,12 +1347,6 @@ static void pohmelfs_put_super(struct super_block *sb) ...@@ -1346,12 +1347,6 @@ static void pohmelfs_put_super(struct super_block *sb)
pohmelfs_ftrans_exit(); 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) static int pohmelfs_statfs(struct dentry *dentry, struct kstatfs *buf)
{ {
struct super_block *sb = dentry->d_sb; struct super_block *sb = dentry->d_sb;
...@@ -1394,42 +1389,33 @@ static int pohmelfs_show_options(struct seq_file *seq, struct vfsmount *vfs) ...@@ -1394,42 +1389,33 @@ static int pohmelfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
return 0; 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 { enum {
pohmelfs_opt_idx, 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_trans_scan_timeout,
pohmelfs_opt_drop_scan_timeout, pohmelfs_opt_drop_scan_timeout,
pohmelfs_opt_wait_on_page_timeout, pohmelfs_opt_wait_on_page_timeout,
pohmelfs_opt_trans_retries, pohmelfs_opt_trans_retries,
pohmelfs_opt_crypto_thread_num,
pohmelfs_opt_trans_max_pages,
pohmelfs_opt_crypto_fail_unsupported,
pohmelfs_opt_mcache_timeout, pohmelfs_opt_mcache_timeout,
}; };
static struct match_token pohmelfs_tokens[] = { static struct match_token pohmelfs_tokens[] = {
{pohmelfs_opt_idx, "idx=%u"}, {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_trans_scan_timeout, "trans_scan_timeout=%u"},
{pohmelfs_opt_drop_scan_timeout, "drop_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_wait_on_page_timeout, "wait_on_page_timeout=%u"},
{pohmelfs_opt_trans_retries, "trans_retries=%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"}, {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; char *p;
substring_t args[MAX_OPT_ARGS]; substring_t args[MAX_OPT_ARGS];
...@@ -1449,6 +1435,9 @@ static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb) ...@@ -1449,6 +1435,9 @@ static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb)
if (err) if (err)
return err; return err;
if (remount && token <= pohmelfs_opt_crypto_fail_unsupported)
continue;
switch (token) { switch (token) {
case pohmelfs_opt_idx: case pohmelfs_opt_idx:
psb->idx = option; psb->idx = option;
...@@ -1485,6 +1474,25 @@ static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb) ...@@ -1485,6 +1474,25 @@ static int pohmelfs_parse_options(char *options, struct pohmelfs_sb *psb)
return 0; 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) static void pohmelfs_flush_inode(struct pohmelfs_inode *pi, unsigned int count)
{ {
struct inode *inode = &pi->vfs_inode; struct inode *inode = &pi->vfs_inode;
...@@ -1753,6 +1761,17 @@ err_out_exit: ...@@ -1753,6 +1761,17 @@ err_out_exit:
return err; 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. * Allocate private superblock and create root dir.
*/ */
...@@ -1816,7 +1835,7 @@ static int pohmelfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -1816,7 +1835,7 @@ static int pohmelfs_fill_super(struct super_block *sb, void *data, int silent)
mutex_init(&psb->state_lock); mutex_init(&psb->state_lock);
INIT_LIST_HEAD(&psb->state_list); INIT_LIST_HEAD(&psb->state_list);
err = pohmelfs_parse_options((char *) data, psb); err = pohmelfs_parse_options((char *) data, psb, 0);
if (err) if (err)
goto err_out_free_sb; goto err_out_free_sb;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment