Staging: Pohmelfs: Extend remount option.
Signed-off-by: Evgeniy Polyakov <zbr@ioremap.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
872dc5e500
commit
e504342448
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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:
|
||||||
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)
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue