Merge tag 'afs-next-20190507' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
Pull AFS updates from David Howells: "A set of fix and development patches for AFS for 5.2. Summary: - Fix the AFS file locking so that sqlite can run on an AFS mount and also so that firefox and gnome can use a homedir that's mounted through AFS. This required emulation of fine-grained locking when the server will only support whole-file locks and no upgrade/downgrade. Four modes are provided, settable by mount parameter: "flock=local" - No reference to the server "flock=openafs" - Fine-grained locks are local-only, whole-file locks require sufficient server locks "flock=strict" - All locks require sufficient server locks "flock=write" - Always get an exclusive server lock If the volume is a read-only or backup volume, then flock=local for that volume. - Log extra information for a couple of cases where the client mucks up somehow: AFS vnode with undefined type and dir check failure - in both cases we seem to end up with unfilled data, but the issues happen infrequently and are difficult to reproduce at will. - Implement silly rename for unlink() and rename(). - Set i_blocks so that du can get some information about usage. - Fix xattr handlers to return the right amount of data and to not overflow buffers. - Implement getting/setting raw AFS and YFS ACLs as xattrs" * tag 'afs-next-20190507' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs: afs: Implement YFS ACL setting afs: Get YFS ACLs and information through xattrs afs: implement acl setting afs: Get an AFS3 ACL as an xattr afs: Fix getting the afs.fid xattr afs: Fix the afs.cell and afs.volume xattr handlers afs: Calculate i_blocks based on file size afs: Log more information for "kAFS: AFS vnode with undefined type\n" afs: Provide mount-time configurable byte-range file locking emulation afs: Add more tracepoints afs: Implement sillyrename for unlink and rename afs: Add directory reload tracepoint afs: Handle lock rpc ops failing on a file that got deleted afs: Improve dir check failure reports afs: Add file locking tracepoints afs: Further fix file locking afs: Fix AFS file locking to allow fine grained locks afs: Calculate lock extend timer from set/extend reply reception afs: Split wait from afs_make_call()
This commit is contained in:
@@ -46,7 +46,7 @@ struct file_system_type afs_fs_type = {
|
||||
.init_fs_context = afs_init_fs_context,
|
||||
.parameters = &afs_fs_parameters,
|
||||
.kill_sb = afs_kill_super,
|
||||
.fs_flags = 0,
|
||||
.fs_flags = FS_RENAME_DOES_D_MOVE,
|
||||
};
|
||||
MODULE_ALIAS_FS("afs");
|
||||
|
||||
@@ -69,19 +69,30 @@ static atomic_t afs_count_active_inodes;
|
||||
enum afs_param {
|
||||
Opt_autocell,
|
||||
Opt_dyn,
|
||||
Opt_flock,
|
||||
Opt_source,
|
||||
};
|
||||
|
||||
static const struct fs_parameter_spec afs_param_specs[] = {
|
||||
fsparam_flag ("autocell", Opt_autocell),
|
||||
fsparam_flag ("dyn", Opt_dyn),
|
||||
fsparam_enum ("flock", Opt_flock),
|
||||
fsparam_string("source", Opt_source),
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct fs_parameter_enum afs_param_enums[] = {
|
||||
{ Opt_flock, "local", afs_flock_mode_local },
|
||||
{ Opt_flock, "openafs", afs_flock_mode_openafs },
|
||||
{ Opt_flock, "strict", afs_flock_mode_strict },
|
||||
{ Opt_flock, "write", afs_flock_mode_write },
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct fs_parameter_description afs_fs_parameters = {
|
||||
.name = "kAFS",
|
||||
.specs = afs_param_specs,
|
||||
.enums = afs_param_enums,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -184,11 +195,22 @@ static int afs_show_devname(struct seq_file *m, struct dentry *root)
|
||||
static int afs_show_options(struct seq_file *m, struct dentry *root)
|
||||
{
|
||||
struct afs_super_info *as = AFS_FS_S(root->d_sb);
|
||||
const char *p = NULL;
|
||||
|
||||
if (as->dyn_root)
|
||||
seq_puts(m, ",dyn");
|
||||
if (test_bit(AFS_VNODE_AUTOCELL, &AFS_FS_I(d_inode(root))->flags))
|
||||
seq_puts(m, ",autocell");
|
||||
switch (as->flock_mode) {
|
||||
case afs_flock_mode_unset: break;
|
||||
case afs_flock_mode_local: p = "local"; break;
|
||||
case afs_flock_mode_openafs: p = "openafs"; break;
|
||||
case afs_flock_mode_strict: p = "strict"; break;
|
||||
case afs_flock_mode_write: p = "write"; break;
|
||||
}
|
||||
if (p)
|
||||
seq_printf(m, ",flock=%s", p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -317,6 +339,10 @@ static int afs_parse_param(struct fs_context *fc, struct fs_parameter *param)
|
||||
ctx->dyn_root = true;
|
||||
break;
|
||||
|
||||
case Opt_flock:
|
||||
ctx->flock_mode = result.uint_32;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -429,7 +455,7 @@ static int afs_fill_super(struct super_block *sb, struct afs_fs_context *ctx)
|
||||
fid.vnode = 1;
|
||||
fid.vnode_hi = 0;
|
||||
fid.unique = 1;
|
||||
inode = afs_iget(sb, ctx->key, &fid, NULL, NULL, NULL);
|
||||
inode = afs_iget(sb, ctx->key, &fid, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
if (IS_ERR(inode))
|
||||
@@ -468,6 +494,7 @@ static struct afs_super_info *afs_alloc_sbi(struct fs_context *fc)
|
||||
as = kzalloc(sizeof(struct afs_super_info), GFP_KERNEL);
|
||||
if (as) {
|
||||
as->net_ns = get_net(fc->net_ns);
|
||||
as->flock_mode = ctx->flock_mode;
|
||||
if (ctx->dyn_root) {
|
||||
as->dyn_root = true;
|
||||
} else {
|
||||
@@ -552,6 +579,7 @@ static int afs_get_tree(struct fs_context *fc)
|
||||
}
|
||||
|
||||
fc->root = dget(sb->s_root);
|
||||
trace_afs_get_tree(as->cell, as->volume);
|
||||
_leave(" = 0 [%p]", sb);
|
||||
return 0;
|
||||
|
||||
@@ -658,6 +686,8 @@ static struct inode *afs_alloc_inode(struct super_block *sb)
|
||||
vnode->cb_type = 0;
|
||||
vnode->lock_state = AFS_VNODE_LOCK_NONE;
|
||||
|
||||
init_rwsem(&vnode->rmdir_lock);
|
||||
|
||||
_leave(" = %p", &vnode->vfs_inode);
|
||||
return &vnode->vfs_inode;
|
||||
}
|
||||
|
Reference in New Issue
Block a user