Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
d1ffa566
Commit
d1ffa566
authored
Feb 03, 2006
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'upstream-linus' of
git://oss.oracle.com/home/sourcebo/git/ocfs2
parents
d6c8f6aa
6eff5790
Changes
30
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
30 changed files
with
507 additions
and
158 deletions
+507
-158
Documentation/filesystems/configfs/configfs_example.c
Documentation/filesystems/configfs/configfs_example.c
+2
-0
Documentation/filesystems/ocfs2.txt
Documentation/filesystems/ocfs2.txt
+1
-0
MAINTAINERS
MAINTAINERS
+2
-1
fs/Kconfig
fs/Kconfig
+0
-2
fs/configfs/configfs_internal.h
fs/configfs/configfs_internal.h
+8
-3
fs/configfs/dir.c
fs/configfs/dir.c
+26
-10
fs/configfs/file.c
fs/configfs/file.c
+10
-9
fs/configfs/inode.c
fs/configfs/inode.c
+109
-11
fs/configfs/mount.c
fs/configfs/mount.c
+23
-5
fs/configfs/symlink.c
fs/configfs/symlink.c
+2
-2
fs/ocfs2/buffer_head_io.c
fs/ocfs2/buffer_head_io.c
+5
-5
fs/ocfs2/cluster/heartbeat.c
fs/ocfs2/cluster/heartbeat.c
+3
-2
fs/ocfs2/cluster/tcp.c
fs/ocfs2/cluster/tcp.c
+9
-7
fs/ocfs2/dlm/dlmcommon.h
fs/ocfs2/dlm/dlmcommon.h
+1
-0
fs/ocfs2/dlm/dlmdomain.c
fs/ocfs2/dlm/dlmdomain.c
+17
-1
fs/ocfs2/dlm/dlmmaster.c
fs/ocfs2/dlm/dlmmaster.c
+13
-11
fs/ocfs2/dlm/dlmrecovery.c
fs/ocfs2/dlm/dlmrecovery.c
+213
-37
fs/ocfs2/dlm/dlmunlock.c
fs/ocfs2/dlm/dlmunlock.c
+13
-0
fs/ocfs2/dlm/userdlm.c
fs/ocfs2/dlm/userdlm.c
+1
-1
fs/ocfs2/extent_map.c
fs/ocfs2/extent_map.c
+5
-7
fs/ocfs2/file.c
fs/ocfs2/file.c
+6
-4
fs/ocfs2/inode.c
fs/ocfs2/inode.c
+3
-3
fs/ocfs2/inode.h
fs/ocfs2/inode.h
+2
-2
fs/ocfs2/journal.c
fs/ocfs2/journal.c
+16
-16
fs/ocfs2/ocfs2.h
fs/ocfs2/ocfs2.h
+2
-1
fs/ocfs2/super.c
fs/ocfs2/super.c
+5
-6
fs/ocfs2/sysfile.c
fs/ocfs2/sysfile.c
+2
-4
fs/ocfs2/uptodate.c
fs/ocfs2/uptodate.c
+6
-6
fs/ocfs2/uptodate.h
fs/ocfs2/uptodate.h
+1
-1
include/linux/configfs.h
include/linux/configfs.h
+1
-1
No files found.
Documentation/filesystems/configfs/configfs_example.c
View file @
d1ffa566
...
...
@@ -320,6 +320,7 @@ static struct config_item_type simple_children_type = {
.
ct_item_ops
=
&
simple_children_item_ops
,
.
ct_group_ops
=
&
simple_children_group_ops
,
.
ct_attrs
=
simple_children_attrs
,
.
ct_owner
=
THIS_MODULE
,
};
static
struct
configfs_subsystem
simple_children_subsys
=
{
...
...
@@ -403,6 +404,7 @@ static struct config_item_type group_children_type = {
.
ct_item_ops
=
&
group_children_item_ops
,
.
ct_group_ops
=
&
group_children_group_ops
,
.
ct_attrs
=
group_children_attrs
,
.
ct_owner
=
THIS_MODULE
,
};
static
struct
configfs_subsystem
group_children_subsys
=
{
...
...
Documentation/filesystems/ocfs2.txt
View file @
d1ffa566
...
...
@@ -35,6 +35,7 @@ Features which OCFS2 does not support yet:
be cluster coherent.
- quotas
- cluster aware flock
- cluster aware lockf
- Directory change notification (F_NOTIFY)
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
- POSIX ACLs
...
...
MAINTAINERS
View file @
d1ffa566
...
...
@@ -557,7 +557,8 @@ S: Supported
CONFIGFS
P: Joel Becker
M: Joel Becker <joel.becker@oracle.com>
M: joel.becker@oracle.com
L: linux-kernel@vger.kernel.org
S: Supported
CIRRUS LOGIC GENERIC FBDEV DRIVER
...
...
fs/Kconfig
View file @
d1ffa566
...
...
@@ -883,8 +883,6 @@ config CONFIGFS_FS
Both sysfs and configfs can and should exist together on the
same system. One is not a replacement for the other.
If unsure, say N.
endmenu
menu "Miscellaneous filesystems"
...
...
fs/configfs/configfs_internal.h
View file @
d1ffa566
...
...
@@ -36,6 +36,7 @@ struct configfs_dirent {
int
s_type
;
umode_t
s_mode
;
struct
dentry
*
s_dentry
;
struct
iattr
*
s_iattr
;
};
#define CONFIGFS_ROOT 0x0001
...
...
@@ -48,10 +49,11 @@ struct configfs_dirent {
#define CONFIGFS_NOT_PINNED (CONFIGFS_ITEM_ATTR)
extern
struct
vfsmount
*
configfs_mount
;
extern
kmem_cache_t
*
configfs_dir_cachep
;
extern
int
configfs_is_root
(
struct
config_item
*
item
);
extern
struct
inode
*
configfs_new_inode
(
mode_t
mode
);
extern
struct
inode
*
configfs_new_inode
(
mode_t
mode
,
struct
configfs_dirent
*
);
extern
int
configfs_create
(
struct
dentry
*
,
int
mode
,
int
(
*
init
)(
struct
inode
*
));
extern
int
configfs_create_file
(
struct
config_item
*
,
const
struct
configfs_attribute
*
);
...
...
@@ -63,6 +65,7 @@ extern void configfs_hash_and_remove(struct dentry * dir, const char * name);
extern
const
unsigned
char
*
configfs_get_name
(
struct
configfs_dirent
*
sd
);
extern
void
configfs_drop_dentry
(
struct
configfs_dirent
*
sd
,
struct
dentry
*
parent
);
extern
int
configfs_setattr
(
struct
dentry
*
dentry
,
struct
iattr
*
iattr
);
extern
int
configfs_pin_fs
(
void
);
extern
void
configfs_release_fs
(
void
);
...
...
@@ -120,8 +123,10 @@ static inline struct config_item *configfs_get_config_item(struct dentry *dentry
static
inline
void
release_configfs_dirent
(
struct
configfs_dirent
*
sd
)
{
if
(
!
(
sd
->
s_type
&
CONFIGFS_ROOT
))
kfree
(
sd
);
if
(
!
(
sd
->
s_type
&
CONFIGFS_ROOT
))
{
kfree
(
sd
->
s_iattr
);
kmem_cache_free
(
configfs_dir_cachep
,
sd
);
}
}
static
inline
struct
configfs_dirent
*
configfs_get
(
struct
configfs_dirent
*
sd
)
...
...
fs/configfs/dir.c
View file @
d1ffa566
...
...
@@ -72,7 +72,7 @@ static struct configfs_dirent *configfs_new_dirent(struct configfs_dirent * pare
{
struct
configfs_dirent
*
sd
;
sd
=
km
alloc
(
sizeof
(
*
sd
)
,
GFP_KERNEL
);
sd
=
km
em_cache_alloc
(
configfs_dir_cachep
,
GFP_KERNEL
);
if
(
!
sd
)
return
NULL
;
...
...
@@ -136,13 +136,19 @@ static int create_dir(struct config_item * k, struct dentry * p,
int
error
;
umode_t
mode
=
S_IFDIR
|
S_IRWXU
|
S_IRUGO
|
S_IXUGO
;
error
=
configfs_create
(
d
,
mode
,
init_dir
);
error
=
configfs_make_dirent
(
p
->
d_fsdata
,
d
,
k
,
mode
,
CONFIGFS_DIR
);
if
(
!
error
)
{
error
=
configfs_make_dirent
(
p
->
d_fsdata
,
d
,
k
,
mode
,
CONFIGFS_DIR
);
error
=
configfs_create
(
d
,
mode
,
init_dir
);
if
(
!
error
)
{
p
->
d_inode
->
i_nlink
++
;
(
d
)
->
d_op
=
&
configfs_dentry_ops
;
}
else
{
struct
configfs_dirent
*
sd
=
d
->
d_fsdata
;
if
(
sd
)
{
list_del_init
(
&
sd
->
s_sibling
);
configfs_put
(
sd
);
}
}
}
return
error
;
...
...
@@ -182,12 +188,19 @@ int configfs_create_link(struct configfs_symlink *sl,
int
err
=
0
;
umode_t
mode
=
S_IFLNK
|
S_IRWXUGO
;
err
=
configfs_create
(
dentry
,
mode
,
init_symlink
);
err
=
configfs_make_dirent
(
parent
->
d_fsdata
,
dentry
,
sl
,
mode
,
CONFIGFS_ITEM_LINK
);
if
(
!
err
)
{
err
=
configfs_make_dirent
(
parent
->
d_fsdata
,
dentry
,
sl
,
mode
,
CONFIGFS_ITEM_LINK
);
err
=
configfs_create
(
dentry
,
mode
,
init_symlink
);
if
(
!
err
)
dentry
->
d_op
=
&
configfs_dentry_ops
;
else
{
struct
configfs_dirent
*
sd
=
dentry
->
d_fsdata
;
if
(
sd
)
{
list_del_init
(
&
sd
->
s_sibling
);
configfs_put
(
sd
);
}
}
}
return
err
;
}
...
...
@@ -241,13 +254,15 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den
struct
configfs_attribute
*
attr
=
sd
->
s_element
;
int
error
;
dentry
->
d_fsdata
=
configfs_get
(
sd
);
sd
->
s_dentry
=
dentry
;
error
=
configfs_create
(
dentry
,
(
attr
->
ca_mode
&
S_IALLUGO
)
|
S_IFREG
,
init_file
);
if
(
error
)
if
(
error
)
{
configfs_put
(
sd
);
return
error
;
}
dentry
->
d_op
=
&
configfs_dentry_ops
;
dentry
->
d_fsdata
=
configfs_get
(
sd
);
sd
->
s_dentry
=
dentry
;
d_rehash
(
dentry
);
return
0
;
...
...
@@ -839,6 +854,7 @@ struct inode_operations configfs_dir_inode_operations = {
.
symlink
=
configfs_symlink
,
.
unlink
=
configfs_unlink
,
.
lookup
=
configfs_lookup
,
.
setattr
=
configfs_setattr
,
};
#if 0
...
...
fs/configfs/file.c
View file @
d1ffa566
...
...
@@ -26,7 +26,6 @@
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/dnotify.h>
#include <linux/slab.h>
#include <asm/uaccess.h>
#include <asm/semaphore.h>
...
...
@@ -150,7 +149,7 @@ configfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *pp
/**
* fill_write_buffer - copy buffer from userspace.
* @buffer: data buffer for file.
* @
userbuf:
data from user.
* @
buf:
data from user.
* @count: number of bytes in @userbuf.
*
* Allocate @buffer->page if it hasn't been already, then
...
...
@@ -177,8 +176,9 @@ fill_write_buffer(struct configfs_buffer * buffer, const char __user * buf, size
/**
* flush_write_buffer - push buffer to config_item.
* @
file: file pointer.
* @
dentry: dentry to the attribute
* @buffer: data buffer for file.
* @count: number of bytes
*
* Get the correct pointers for the config_item and the attribute we're
* dealing with, then call the store() method for the attribute,
...
...
@@ -217,15 +217,16 @@ static ssize_t
configfs_write_file
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
struct
configfs_buffer
*
buffer
=
file
->
private_data
;
ssize_t
len
;
down
(
&
buffer
->
sem
);
count
=
fill_write_buffer
(
buffer
,
buf
,
count
);
if
(
count
>
0
)
count
=
flush_write_buffer
(
file
->
f_dentry
,
buffer
,
count
);
if
(
count
>
0
)
*
ppos
+=
count
;
len
=
fill_write_buffer
(
buffer
,
buf
,
count
);
if
(
len
>
0
)
len
=
flush_write_buffer
(
file
->
f_dentry
,
buffer
,
count
);
if
(
len
>
0
)
*
ppos
+=
len
;
up
(
&
buffer
->
sem
);
return
count
;
return
len
;
}
static
int
check_perm
(
struct
inode
*
inode
,
struct
file
*
file
)
...
...
fs/configfs/inode.c
View file @
d1ffa566
...
...
@@ -31,6 +31,7 @@
#include <linux/pagemap.h>
#include <linux/namei.h>
#include <linux/backing-dev.h>
#include <linux/capability.h>
#include <linux/configfs.h>
#include "configfs_internal.h"
...
...
@@ -48,18 +49,107 @@ static struct backing_dev_info configfs_backing_dev_info = {
.
capabilities
=
BDI_CAP_NO_ACCT_DIRTY
|
BDI_CAP_NO_WRITEBACK
,
};
struct
inode
*
configfs_new_inode
(
mode_t
mode
)
static
struct
inode_operations
configfs_inode_operations
=
{
.
setattr
=
configfs_setattr
,
};
int
configfs_setattr
(
struct
dentry
*
dentry
,
struct
iattr
*
iattr
)
{
struct
inode
*
inode
=
dentry
->
d_inode
;
struct
configfs_dirent
*
sd
=
dentry
->
d_fsdata
;
struct
iattr
*
sd_iattr
;
unsigned
int
ia_valid
=
iattr
->
ia_valid
;
int
error
;
if
(
!
sd
)
return
-
EINVAL
;
sd_iattr
=
sd
->
s_iattr
;
error
=
inode_change_ok
(
inode
,
iattr
);
if
(
error
)
return
error
;
error
=
inode_setattr
(
inode
,
iattr
);
if
(
error
)
return
error
;
if
(
!
sd_iattr
)
{
/* setting attributes for the first time, allocate now */
sd_iattr
=
kmalloc
(
sizeof
(
struct
iattr
),
GFP_KERNEL
);
if
(
!
sd_iattr
)
return
-
ENOMEM
;
/* assign default attributes */
memset
(
sd_iattr
,
0
,
sizeof
(
struct
iattr
));
sd_iattr
->
ia_mode
=
sd
->
s_mode
;
sd_iattr
->
ia_uid
=
0
;
sd_iattr
->
ia_gid
=
0
;
sd_iattr
->
ia_atime
=
sd_iattr
->
ia_mtime
=
sd_iattr
->
ia_ctime
=
CURRENT_TIME
;
sd
->
s_iattr
=
sd_iattr
;
}
/* attributes were changed atleast once in past */
if
(
ia_valid
&
ATTR_UID
)
sd_iattr
->
ia_uid
=
iattr
->
ia_uid
;
if
(
ia_valid
&
ATTR_GID
)
sd_iattr
->
ia_gid
=
iattr
->
ia_gid
;
if
(
ia_valid
&
ATTR_ATIME
)
sd_iattr
->
ia_atime
=
timespec_trunc
(
iattr
->
ia_atime
,
inode
->
i_sb
->
s_time_gran
);
if
(
ia_valid
&
ATTR_MTIME
)
sd_iattr
->
ia_mtime
=
timespec_trunc
(
iattr
->
ia_mtime
,
inode
->
i_sb
->
s_time_gran
);
if
(
ia_valid
&
ATTR_CTIME
)
sd_iattr
->
ia_ctime
=
timespec_trunc
(
iattr
->
ia_ctime
,
inode
->
i_sb
->
s_time_gran
);
if
(
ia_valid
&
ATTR_MODE
)
{
umode_t
mode
=
iattr
->
ia_mode
;
if
(
!
in_group_p
(
inode
->
i_gid
)
&&
!
capable
(
CAP_FSETID
))
mode
&=
~
S_ISGID
;
sd_iattr
->
ia_mode
=
sd
->
s_mode
=
mode
;
}
return
error
;
}
static
inline
void
set_default_inode_attr
(
struct
inode
*
inode
,
mode_t
mode
)
{
inode
->
i_mode
=
mode
;
inode
->
i_uid
=
0
;
inode
->
i_gid
=
0
;
inode
->
i_atime
=
inode
->
i_mtime
=
inode
->
i_ctime
=
CURRENT_TIME
;
}
static
inline
void
set_inode_attr
(
struct
inode
*
inode
,
struct
iattr
*
iattr
)
{
inode
->
i_mode
=
iattr
->
ia_mode
;
inode
->
i_uid
=
iattr
->
ia_uid
;
inode
->
i_gid
=
iattr
->
ia_gid
;
inode
->
i_atime
=
iattr
->
ia_atime
;
inode
->
i_mtime
=
iattr
->
ia_mtime
;
inode
->
i_ctime
=
iattr
->
ia_ctime
;
}
struct
inode
*
configfs_new_inode
(
mode_t
mode
,
struct
configfs_dirent
*
sd
)
{
struct
inode
*
inode
=
new_inode
(
configfs_sb
);
if
(
inode
)
{
inode
->
i_mode
=
mode
;
inode
->
i_uid
=
0
;
inode
->
i_gid
=
0
;
inode
->
i_blksize
=
PAGE_CACHE_SIZE
;
inode
->
i_blocks
=
0
;
inode
->
i_atime
=
inode
->
i_mtime
=
inode
->
i_ctime
=
CURRENT_TIME
;
inode
->
i_mapping
->
a_ops
=
&
configfs_aops
;
inode
->
i_mapping
->
backing_dev_info
=
&
configfs_backing_dev_info
;
inode
->
i_op
=
&
configfs_inode_operations
;
if
(
sd
->
s_iattr
)
{
/* sysfs_dirent has non-default attributes
* get them for the new inode from persistent copy
* in sysfs_dirent
*/
set_inode_attr
(
inode
,
sd
->
s_iattr
);
}
else
set_default_inode_attr
(
inode
,
mode
);
}
return
inode
;
}
...
...
@@ -70,7 +160,8 @@ int configfs_create(struct dentry * dentry, int mode, int (*init)(struct inode *
struct
inode
*
inode
=
NULL
;
if
(
dentry
)
{
if
(
!
dentry
->
d_inode
)
{
if
((
inode
=
configfs_new_inode
(
mode
)))
{
struct
configfs_dirent
*
sd
=
dentry
->
d_fsdata
;
if
((
inode
=
configfs_new_inode
(
mode
,
sd
)))
{
if
(
dentry
->
d_parent
&&
dentry
->
d_parent
->
d_inode
)
{
struct
inode
*
p_inode
=
dentry
->
d_parent
->
d_inode
;
p_inode
->
i_mtime
=
p_inode
->
i_ctime
=
CURRENT_TIME
;
...
...
@@ -103,10 +194,9 @@ int configfs_create(struct dentry * dentry, int mode, int (*init)(struct inode *
*/
const
unsigned
char
*
configfs_get_name
(
struct
configfs_dirent
*
sd
)
{
struct
attribute
*
attr
;
struct
configfs_attribute
*
attr
;
if
(
!
sd
||
!
sd
->
s_element
)
BUG
();
BUG_ON
(
!
sd
||
!
sd
->
s_element
);
/* These always have a dentry, so use that */
if
(
sd
->
s_type
&
(
CONFIGFS_DIR
|
CONFIGFS_ITEM_LINK
))
...
...
@@ -114,7 +204,7 @@ const unsigned char * configfs_get_name(struct configfs_dirent *sd)
if
(
sd
->
s_type
&
CONFIGFS_ITEM_ATTR
)
{
attr
=
sd
->
s_element
;
return
attr
->
name
;
return
attr
->
ca_
name
;
}
return
NULL
;
}
...
...
@@ -130,13 +220,17 @@ void configfs_drop_dentry(struct configfs_dirent * sd, struct dentry * parent)
if
(
dentry
)
{
spin_lock
(
&
dcache_lock
);
spin_lock
(
&
dentry
->
d_lock
);
if
(
!
(
d_unhashed
(
dentry
)
&&
dentry
->
d_inode
))
{
dget_locked
(
dentry
);
__d_drop
(
dentry
);
spin_unlock
(
&
dentry
->
d_lock
);
spin_unlock
(
&
dcache_lock
);
simple_unlink
(
parent
->
d_inode
,
dentry
);
}
else
}
else
{
spin_unlock
(
&
dentry
->
d_lock
);
spin_unlock
(
&
dcache_lock
);
}
}
}
...
...
@@ -145,6 +239,10 @@ void configfs_hash_and_remove(struct dentry * dir, const char * name)
struct
configfs_dirent
*
sd
;
struct
configfs_dirent
*
parent_sd
=
dir
->
d_fsdata
;
if
(
dir
->
d_inode
==
NULL
)
/* no inode means this hasn't been made visible yet */
return
;
mutex_lock
(
&
dir
->
d_inode
->
i_mutex
);
list_for_each_entry
(
sd
,
&
parent_sd
->
s_children
,
s_sibling
)
{
if
(
!
sd
->
s_element
)
...
...
fs/configfs/mount.c
View file @
d1ffa566
...
...
@@ -38,6 +38,7 @@
struct
vfsmount
*
configfs_mount
=
NULL
;
struct
super_block
*
configfs_sb
=
NULL
;
kmem_cache_t
*
configfs_dir_cachep
;
static
int
configfs_mnt_count
=
0
;
static
struct
super_operations
configfs_ops
=
{
...
...
@@ -62,6 +63,7 @@ static struct configfs_dirent configfs_root = {
.
s_children
=
LIST_HEAD_INIT
(
configfs_root
.
s_children
),
.
s_element
=
&
configfs_root_group
.
cg_item
,
.
s_type
=
CONFIGFS_ROOT
,
.
s_iattr
=
NULL
,
};
static
int
configfs_fill_super
(
struct
super_block
*
sb
,
void
*
data
,
int
silent
)
...
...
@@ -73,9 +75,11 @@ static int configfs_fill_super(struct super_block *sb, void *data, int silent)
sb
->
s_blocksize_bits
=
PAGE_CACHE_SHIFT
;
sb
->
s_magic
=
CONFIGFS_MAGIC
;
sb
->
s_op
=
&
configfs_ops
;
sb
->
s_time_gran
=
1
;
configfs_sb
=
sb
;
inode
=
configfs_new_inode
(
S_IFDIR
|
S_IRWXU
|
S_IRUGO
|
S_IXUGO
);
inode
=
configfs_new_inode
(
S_IFDIR
|
S_IRWXU
|
S_IRUGO
|
S_IXUGO
,
&
configfs_root
);
if
(
inode
)
{
inode
->
i_op
=
&
configfs_dir_inode_operations
;
inode
->
i_fop
=
&
configfs_dir_operations
;
...
...
@@ -128,19 +132,31 @@ static decl_subsys(config, NULL, NULL);
static
int
__init
configfs_init
(
void
)
{
int
err
;
int
err
=
-
ENOMEM
;
configfs_dir_cachep
=
kmem_cache_create
(
"configfs_dir_cache"
,
sizeof
(
struct
configfs_dirent
),
0
,
0
,
NULL
,
NULL
);
if
(
!
configfs_dir_cachep
)
goto
out
;
kset_set_kset_s
(
&
config_subsys
,
kernel_subsys
);
err
=
subsystem_register
(
&
config_subsys
);
if
(
err
)
return
err
;
if
(
err
)
{
kmem_cache_destroy
(
configfs_dir_cachep
);
configfs_dir_cachep
=
NULL
;
goto
out
;
}
err
=
register_filesystem
(
&
configfs_fs_type
);
if
(
err
)
{
printk
(
KERN_ERR
"configfs: Unable to register filesystem!
\n
"
);
subsystem_unregister
(
&
config_subsys
);
kmem_cache_destroy
(
configfs_dir_cachep
);
configfs_dir_cachep
=
NULL
;
}
out:
return
err
;
}
...
...
@@ -148,11 +164,13 @@ static void __exit configfs_exit(void)
{
unregister_filesystem
(
&
configfs_fs_type
);
subsystem_unregister
(
&
config_subsys
);
kmem_cache_destroy
(
configfs_dir_cachep
);
configfs_dir_cachep
=
NULL
;
}
MODULE_AUTHOR
(
"Oracle"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_VERSION
(
"0.0.
1
"
);
MODULE_VERSION
(
"0.0.
2
"
);
MODULE_DESCRIPTION
(
"Simple RAM filesystem for user driven kernel subsystem configuration."
);
module_init
(
configfs_init
);
...
...
fs/configfs/symlink.c
View file @
d1ffa566
...
...
@@ -162,8 +162,7 @@ int configfs_unlink(struct inode *dir, struct dentry *dentry)
if
(
!
(
sd
->
s_type
&
CONFIGFS_ITEM_LINK
))
goto
out
;
if
(
dentry
->
d_parent
==
configfs_sb
->
s_root
)
BUG
();
BUG_ON
(
dentry
->
d_parent
==
configfs_sb
->
s_root
);
sl
=
sd
->
s_element
;
...
...
@@ -277,5 +276,6 @@ struct inode_operations configfs_symlink_inode_operations = {
.
follow_link
=
configfs_follow_link
,
.
readlink
=
generic_readlink
,
.
put_link
=
configfs_put_link
,
.
setattr
=
configfs_setattr
,
};
fs/ocfs2/buffer_head_io.c
View file @
d1ffa566
...
...
@@ -58,7 +58,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh,
goto
out
;
}
down
(
&
OCFS2_I
(
inode
)
->
ip_io_sem
);
mutex_lock
(
&
OCFS2_I
(
inode
)
->
ip_io_mutex
);
lock_buffer
(
bh
);
set_buffer_uptodate
(
bh
);
...
...
@@ -82,7 +82,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh,
brelse
(
bh
);
}
up
(
&
OCFS2_I
(
inode
)
->
ip_io_sem
);
mutex_unlock
(
&
OCFS2_I
(
inode
)
->
ip_io_mutex
);
out:
mlog_exit
(
ret
);
return
ret
;
...
...
@@ -125,13 +125,13 @@ int ocfs2_read_blocks(struct ocfs2_super *osb, u64 block, int nr,
flags
&=
~
OCFS2_BH_CACHED
;
if
(
inode
)
down
(
&
OCFS2_I
(
inode
)
->
ip_io_sem
);
mutex_lock
(
&
OCFS2_I
(
inode
)
->
ip_io_mutex
);
for
(
i
=
0
;
i
<
nr
;
i
++
)
{
if
(
bhs
[
i
]
==
NULL
)
{
bhs
[
i
]
=
sb_getblk
(
sb
,
block
++
);
if
(
bhs
[
i
]
==
NULL
)
{
if
(
inode
)
up
(
&
OCFS2_I
(
inode
)
->
ip_io_sem
);
mutex_unlock
(
&
OCFS2_I
(
inode
)
->
ip_io_mutex
);
status
=
-
EIO
;
mlog_errno
(
status
);
goto
bail
;
...
...
@@ -220,7 +220,7 @@ int ocfs2_read_blocks(struct ocfs2_super *osb, u64 block, int nr,
ocfs2_set_buffer_uptodate
(
inode
,
bh
);
}
if
(
inode
)
up
(
&
OCFS2_I
(
inode
)
->
ip_io_sem
);
mutex_unlock
(
&
OCFS2_I
(
inode
)
->
ip_io_mutex
);
mlog
(
ML_BH_IO
,
"block=(%"
MLFu64
"), nr=(%d), cached=%s
\n
"
,
block
,
nr
,
(
!
(
flags
&
OCFS2_BH_CACHED
)
||
ignore_cache
)
?
"no"
:
"yes"
);
...
...
fs/ocfs2/cluster/heartbeat.c
View file @
d1ffa566
...
...
@@ -917,8 +917,9 @@ static int o2hb_thread(void *data)
elapsed_msec
=
o2hb_elapsed_msecs
(
&
before_hb
,
&
after_hb
);
mlog
(
0
,
"start = %lu.%lu, end = %lu.%lu, msec = %u
\n
"
,
before_hb
.
tv_sec
,
before_hb
.
tv_usec
,
after_hb
.
tv_sec
,
after_hb
.
tv_usec
,
elapsed_msec
);
before_hb
.
tv_sec
,
(
unsigned
long
)
before_hb
.
tv_usec
,
after_hb
.
tv_sec
,
(
unsigned
long
)
after_hb
.
tv_usec
,
elapsed_msec
);
if
(
elapsed_msec
<
reg
->
hr_timeout_ms
)
{
/* the kthread api has blocked signals for us so no
...
...
fs/ocfs2/cluster/tcp.c
View file @
d1ffa566
...
...
@@ -1285,14 +1285,16 @@ static void o2net_idle_timer(unsigned long data)
mlog
(
ML_NOTICE
,
"here are some times that might help debug the "
"situation: (tmr %ld.%ld now %ld.%ld dr %ld.%ld adv "
"%ld.%ld:%ld.%ld func (%08x:%u) %ld.%ld:%ld.%ld)
\n
"
,
sc
->
sc_tv_timer
.
tv_sec
,
sc
->
sc_tv_timer
.
tv_usec
,
now
.
tv_sec
,
now
.
tv_usec
,
sc
->
sc_tv_data_ready
.
tv_sec
,
sc
->
sc_tv_data_ready
.
tv_usec
,
sc
->
sc_tv_advance_start
.
tv_sec
,
sc
->
sc_tv_advance_start
.
tv_usec
,
sc
->
sc_tv_advance_stop
.
tv_sec
,
sc
->
sc_tv_advance_stop
.
tv_usec
,
sc
->
sc_tv_timer
.
tv_sec
,
(
long
)
sc
->
sc_tv_timer
.
tv_usec
,
now
.
tv_sec
,
(
long
)
now
.
tv_usec
,
sc
->
sc_tv_data_ready
.
tv_sec
,
(
long
)
sc
->
sc_tv_data_ready
.
tv_usec
,
sc
->
sc_tv_advance_start
.
tv_sec
,
(
long
)
sc
->
sc_tv_advance_start
.
tv_usec
,
sc
->
sc_tv_advance_stop
.
tv_sec
,
(
long
)
sc
->
sc_tv_advance_stop
.
tv_usec
,
sc
->
sc_msg_key
,
sc
->
sc_msg_type
,
sc
->
sc_tv_func_start
.
tv_sec
,
sc
->
sc_tv_func_start
.
tv_usec
,
sc
->
sc_tv_func_stop
.
tv_sec
,
sc
->
sc_tv_func_stop
.
tv_usec
);
sc
->
sc_tv_func_start
.
tv_sec
,
(
long
)
sc
->
sc_tv_func_start
.
tv_usec
,
sc
->
sc_tv_func_stop
.
tv_sec
,
(
long
)
sc
->
sc_tv_func_stop
.
tv_usec
);
o2net_sc_queue_work
(
sc
,
&
sc
->
sc_shutdown_work
);
}
...
...
fs/ocfs2/dlm/dlmcommon.h
View file @
d1ffa566
...
...
@@ -657,6 +657,7 @@ void dlm_complete_thread(struct dlm_ctxt *dlm);
int
dlm_launch_recovery_thread
(
struct
dlm_ctxt
*
dlm
);
void
dlm_complete_recovery_thread
(
struct
dlm_ctxt
*
dlm
);
void
dlm_wait_for_recovery
(
struct
dlm_ctxt
*
dlm
);
int
dlm_is_node_dead
(
struct
dlm_ctxt
*
dlm
,
u8
node
);
void
dlm_put
(
struct
dlm_ctxt
*
dlm
);
struct
dlm_ctxt
*
dlm_grab
(
struct
dlm_ctxt
*
dlm
);
...
...
fs/ocfs2/dlm/dlmdomain.c
View file @
d1ffa566
...
...
@@ -573,8 +573,11 @@ static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data)
spin_lock
(
&
dlm_domain_lock
);
dlm
=
__dlm_lookup_domain_full
(
query
->
domain
,
query
->
name_len
);
/* Once the dlm ctxt is marked as leaving then we don't want
* to be put in someone's domain map. */
* to be put in someone's domain map.
* Also, explicitly disallow joining at certain troublesome
* times (ie. during recovery). */
if
(
dlm
&&
dlm
->
dlm_state
!=
DLM_CTXT_LEAVING
)
{
int
bit
=
query
->
node_idx
;
spin_lock
(
&
dlm
->
spinlock
);
if
(
dlm
->
dlm_state
==
DLM_CTXT_NEW
&&
...
...
@@ -586,6 +589,19 @@ static int dlm_query_join_handler(struct o2net_msg *msg, u32 len, void *data)
}
else
if
(
dlm
->
joining_node
!=
DLM_LOCK_RES_OWNER_UNKNOWN
)
{
/* Disallow parallel joins. */
response
=
JOIN_DISALLOW
;
}
else
if
(
dlm
->
reco
.
state
&
DLM_RECO_STATE_ACTIVE
)
{
mlog
(
ML_NOTICE
,
"node %u trying to join, but recovery "
"is ongoing.
\n
"
,
bit
);
response
=
JOIN_DISALLOW
;
}
else
if
(
test_bit
(
bit
,
dlm
->
recovery_map
))
{
mlog
(
ML_NOTICE
,
"node %u trying to join, but it "
"still needs recovery.
\n
"
,
bit
);
response
=
JOIN_DISALLOW
;
}
else
if
(
test_bit
(
bit
,
dlm
->
domain_map
))
{
mlog
(
ML_NOTICE
,
"node %u trying to join, but it "
"is still in the domain! needs recovery?
\n
"
,
bit
);
response
=
JOIN_DISALLOW
;
}
else
{
/* Alright we're fully a part of this domain
* so we keep some state as to who's joining
...
...
fs/ocfs2/dlm/dlmmaster.c
View file @
d1ffa566
...
...
@@ -1050,17 +1050,10 @@ static int dlm_restart_lock_mastery(struct dlm_ctxt *dlm,
node
=
dlm_bitmap_diff_iter_next
(
&
bdi
,
&
sc
);
while
(
node
>=
0
)
{
if
(
sc
==
NODE_UP
)
{
/* a node came up. easy. might not even need
* to talk to it if its node number is higher
* or if we are already blocked. */
mlog
(
0
,
"node up! %d
\n
"
,
node
);
if
(
blocked
)
goto
next
;
if
(
node
>
dlm
->
node_num
)
{
mlog
(
0
,
"node > this node. skipping.
\n
"
);
goto
next
;
}
/* a node came up. clear any old vote from
* the response map and set it in the vote map
* then restart the mastery. */
mlog
(
ML_NOTICE
,
"node %d up while restarting
\n
"
,
node
);
/* redo the master request, but only for the new node */
mlog
(
0
,
"sending request to new node
\n
"
);
...
...
@@ -2005,6 +1998,15 @@ int dlm_migrate_lockres(struct dlm_ctxt *dlm, struct dlm_lock_resource *res,
break
;
mlog
(
0
,
"timed out during migration
\n
"
);
/* avoid hang during shutdown when migrating lockres
* to a node which also goes down */
if
(
dlm_is_node_dead
(
dlm
,
target
))
{
mlog
(
0
,
"%s:%.*s: expected migration target %u "
"is no longer up. restarting.
\n
"
,
dlm
->
name
,
res
->
lockname
.
len
,
res
->
lockname
.
name
,
target
);
ret
=
-
ERESTARTSYS
;
}
}
if
(
ret
==
-
ERESTARTSYS
)
{
/* migration failed, detach and clean up mle */
...
...
fs/ocfs2/dlm/dlmrecovery.c
View file @
d1ffa566
This diff is collapsed.
Click to expand it.
fs/ocfs2/dlm/dlmunlock.c
View file @
d1ffa566
...
...
@@ -188,6 +188,19 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm,
actions
&=
~
(
DLM_UNLOCK_REMOVE_LOCK
|
DLM_UNLOCK_REGRANT_LOCK
|
DLM_UNLOCK_CLEAR_CONVERT_TYPE
);
}
else
if
(
status
==
DLM_RECOVERING
||
status
==
DLM_MIGRATING
||
status
==
DLM_FORWARD
)
{
/* must clear the actions because this unlock
* is about to be retried. cannot free or do
* any list manipulation. */
mlog
(
0
,
"%s:%.*s: clearing actions, %s
\n
"
,
dlm
->
name
,
res
->
lockname
.
len
,
res
->
lockname
.
name
,
status
==
DLM_RECOVERING
?
"recovering"
:
(
status
==
DLM_MIGRATING
?
"migrating"
:
"forward"
));
actions
=
0
;
}
if
(
flags
&
LKM_CANCEL
)
lock
->
cancel_pending
=
0
;
...
...
fs/ocfs2/dlm/userdlm.c
View file @
d1ffa566
...
...
@@ -27,7 +27,7 @@
* Boston, MA 021110-1307, USA.
*/
#include <
asm
/signal.h>
#include <
linux
/signal.h>
#include <linux/module.h>
#include <linux/fs.h>
...
...
fs/ocfs2/extent_map.c
View file @
d1ffa566
...
...
@@ -262,8 +262,7 @@ static int ocfs2_extent_map_find_leaf(struct inode *inode,
el
=
&
eb
->
h_list
;
}
if
(
el
->
l_tree_depth
)
BUG
();
BUG_ON
(
el
->
l_tree_depth
);
for
(
i
=
0
;
i
<
le16_to_cpu
(
el
->
l_next_free_rec
);
i
++
)
{
rec
=
&
el
->
l_recs
[
i
];
...
...
@@ -364,8 +363,8 @@ static int ocfs2_extent_map_lookup_read(struct inode *inode,
return
ret
;
}
if
(
ent
->
e_tree_depth
)
BUG
();
/* FIXME: Make sure this isn't a corruption */
/* FIXME: Make sure this isn't a corruption */
BUG_ON
(
ent
->
e_tree_depth
);
*
ret_ent
=
ent
;
...
...
@@ -423,8 +422,7 @@ static int ocfs2_extent_map_try_insert(struct inode *inode,
le32_to_cpu
(
rec
->
e_clusters
),
NULL
,
NULL
);
if
(
!
old_ent
)
BUG
();
BUG_ON
(
!
old_ent
);
ret
=
-
EEXIST
;
if
(
old_ent
->
e_tree_depth
<
tree_depth
)
...
...
@@ -988,7 +986,7 @@ int __init init_ocfs2_extent_maps(void)
return
0
;
}
void
__exit
exit_ocfs2_extent_maps
(
void
)
void
exit_ocfs2_extent_maps
(
void
)
{
kmem_cache_destroy
(
ocfs2_em_ent_cachep
);
}
fs/ocfs2/file.c
View file @
d1ffa566
...
...
@@ -1022,8 +1022,9 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
}
newsize
=
count
+
saved_pos
;
mlog
(
0
,
"pos=%lld newsize=%"
MLFu64
" cursize=%lld
\n
"
,
saved_pos
,
newsize
,
i_size_read
(
inode
));
mlog
(
0
,
"pos=%lld newsize=%lld cursize=%lld
\n
"
,
(
long
long
)
saved_pos
,
(
long
long
)
newsize
,
(
long
long
)
i_size_read
(
inode
));
/* No need for a higher level metadata lock if we're
* never going past i_size. */
...
...
@@ -1042,8 +1043,9 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
spin_unlock
(
&
OCFS2_I
(
inode
)
->
ip_lock
);
mlog
(
0
,
"Writing at EOF, may need more allocation: "
"i_size = %lld, newsize = %"
MLFu64
", need %u clusters
\n
"
,
i_size_read
(
inode
),
newsize
,
clusters
);
"i_size = %lld, newsize = %lld, need %u clusters
\n
"
,
(
long
long
)
i_size_read
(
inode
),
(
long
long
)
newsize
,
clusters
);
/* We only want to continue the rest of this loop if
* our extend will actually require more
...
...
fs/ocfs2/inode.c
View file @
d1ffa566
...
...
@@ -903,10 +903,10 @@ void ocfs2_clear_inode(struct inode *inode)
"Clear inode of %"
MLFu64
", inode is locked
\n
"
,
oi
->
ip_blkno
);
mlog_bug_on_msg
(
down_trylock
(
&
oi
->
ip_io_sem
),
"Clear inode of %"
MLFu64
", io_
sem
is locked
\n
"
,
mlog_bug_on_msg
(
!
mutex_trylock
(
&
oi
->
ip_io_mutex
),
"Clear inode of %"
MLFu64
", io_
mutex
is locked
\n
"
,
oi
->
ip_blkno
);
up
(
&
oi
->
ip_io_sem
);
mutex_unlock
(
&
oi
->
ip_io_mutex
);
/*
* down_trylock() returns 0, down_write_trylock() returns 1
...
...
fs/ocfs2/inode.h
View file @
d1ffa566
...
...
@@ -46,10 +46,10 @@ struct ocfs2_inode_info
struct
list_head
ip_io_markers
;
int
ip_orphaned_slot
;
struct
semaphore
ip_io_sem
;
struct
mutex
ip_io_mutex
;
/* Used by the journalling code to attach an inode to a
* handle. These are protected by ip_io_
sem
in order to lock
* handle. These are protected by ip_io_
mutex
in order to lock
* out other I/O to the inode until we either commit or
* abort. */
struct
list_head
ip_handle_list
;
...
...
fs/ocfs2/journal.c
View file @
d1ffa566
...
...
@@ -147,8 +147,7 @@ struct ocfs2_journal_handle *ocfs2_start_trans(struct ocfs2_super *osb,
mlog_entry
(
"(max_buffs = %d)
\n
"
,
max_buffs
);
if
(
!
osb
||
!
osb
->
journal
->
j_journal
)
BUG
();
BUG_ON
(
!
osb
||
!
osb
->
journal
->
j_journal
);
if
(
ocfs2_is_hard_readonly
(
osb
))
{
ret
=
-
EROFS
;
...
...
@@ -401,7 +400,7 @@ int ocfs2_journal_access(struct ocfs2_journal_handle *handle,
* j_trans_barrier for us. */
ocfs2_set_inode_lock_trans
(
OCFS2_SB
(
inode
->
i_sb
)
->
journal
,
inode
);
down
(
&
OCFS2_I
(
inode
)
->
ip_io_sem
);
mutex_lock
(
&
OCFS2_I
(
inode
)
->
ip_io_mutex
);
switch
(
type
)
{
case
OCFS2_JOURNAL_ACCESS_CREATE
:
case
OCFS2_JOURNAL_ACCESS_WRITE
:
...
...
@@ -416,7 +415,7 @@ int ocfs2_journal_access(struct ocfs2_journal_handle *handle,
status
=
-
EINVAL
;
mlog
(
ML_ERROR
,
"Uknown access type!
\n
"
);
}
up
(
&
OCFS2_I
(
inode
)
->
ip_io_sem
);
mutex_unlock
(
&
OCFS2_I
(
inode
)
->
ip_io_mutex
);
if
(
status
<
0
)
mlog
(
ML_ERROR
,
"Error %d getting %d access to buffer!
\n
"
,
...
...
@@ -561,7 +560,11 @@ int ocfs2_journal_init(struct ocfs2_journal *journal, int *dirty)
SET_INODE_JOURNAL
(
inode
);
OCFS2_I
(
inode
)
->
ip_open_count
++
;
status
=
ocfs2_meta_lock
(
inode
,
NULL
,
&
bh
,
1
);
/* Skip recovery waits here - journal inode metadata never
* changes in a live cluster so it can be considered an
* exception to the rule. */
status
=
ocfs2_meta_lock_full
(
inode
,
NULL
,
&
bh
,
1
,
OCFS2_META_LOCK_RECOVERY
);
if
(
status
<
0
)
{
if
(
status
!=
-
ERESTARTSYS
)
mlog
(
ML_ERROR
,
"Could not get lock on journal!
\n
"
);
...
...
@@ -672,8 +675,7 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb)
mlog_entry_void
();
if
(
!
osb
)
BUG
();
BUG_ON
(
!
osb
);
journal
=
osb
->
journal
;
if
(
!
journal
)
...
...
@@ -805,8 +807,7 @@ int ocfs2_journal_wipe(struct ocfs2_journal *journal, int full)
mlog_entry_void
();
if
(
!
journal
)
BUG
();
BUG_ON
(
!
journal
);
status
=
journal_wipe
(
journal
->
j_journal
,
full
);
if
(
status
<
0
)
{
...
...
@@ -1072,10 +1073,10 @@ static int __ocfs2_recovery_thread(void *arg)
NULL
);
bail:
down
(
&
osb
->
recovery_lock
);
mutex_lock
(
&
osb
->
recovery_lock
);
if
(
!
status
&&
!
ocfs2_node_map_is_empty
(
osb
,
&
osb
->
recovery_map
))
{
up
(
&
osb
->
recovery_lock
);
mutex_unlock
(
&
osb
->
recovery_lock
);
goto
restart
;
}
...
...
@@ -1083,7 +1084,7 @@ static int __ocfs2_recovery_thread(void *arg)
mb
();
/* sync with ocfs2_recovery_thread_running */
wake_up
(
&
osb
->
recovery_event
);
up
(
&
osb
->
recovery_lock
);
mutex_unlock
(
&
osb
->
recovery_lock
);
mlog_exit
(
status
);
/* no one is callint kthread_stop() for us so the kthread() api
...
...
@@ -1098,7 +1099,7 @@ void ocfs2_recovery_thread(struct ocfs2_super *osb, int node_num)
mlog_entry
(
"(node_num=%d, osb->node_num = %d)
\n
"
,
node_num
,
osb
->
node_num
);
down
(
&
osb
->
recovery_lock
);
mutex_lock
(
&
osb
->
recovery_lock
);
if
(
osb
->
disable_recovery
)
goto
out
;
...
...
@@ -1120,7 +1121,7 @@ void ocfs2_recovery_thread(struct ocfs2_super *osb, int node_num)
}
out:
up
(
&
osb
->
recovery_lock
);
mutex_unlock
(
&
osb
->
recovery_lock
);
wake_up
(
&
osb
->
recovery_event
);
mlog_exit_void
();
...
...
@@ -1271,8 +1272,7 @@ static int ocfs2_recover_node(struct ocfs2_super *osb,
/* Should not ever be called to recover ourselves -- in that
* case we should've called ocfs2_journal_load instead. */
if
(
osb
->
node_num
==
node_num
)
BUG
();
BUG_ON
(
osb
->
node_num
==
node_num
);
slot_num
=
ocfs2_node_num_to_slot
(
si
,
node_num
);
if
(
slot_num
==
OCFS2_INVALID_SLOT
)
{
...
...
fs/ocfs2/ocfs2.h
View file @
d1ffa566
...
...
@@ -33,6 +33,7 @@
#include <linux/rbtree.h>
#include <linux/workqueue.h>
#include <linux/kref.h>
#include <linux/mutex.h>
#include "cluster/nodemanager.h"
#include "cluster/heartbeat.h"
...
...
@@ -233,7 +234,7 @@ struct ocfs2_super
struct
proc_dir_entry
*
proc_sub_dir
;
/* points to /proc/fs/ocfs2/<maj_min> */
atomic_t
vol_state
;
struct
semaphore
recovery_lock
;
struct
mutex
recovery_lock
;
struct
task_struct
*
recovery_thread_task
;
int
disable_recovery
;
wait_queue_head_t
checkpoint_event
;
...
...
fs/ocfs2/super.c
View file @
d1ffa566
...
...
@@ -932,7 +932,7 @@ static void ocfs2_inode_init_once(void *data,
oi
->
ip_dir_start_lookup
=
0
;
init_rwsem
(
&
oi
->
ip_alloc_sem
);
init_MUTEX
(
&
(
oi
->
ip_io_sem
)
);
mutex_init
(
&
oi
->
ip_io_mutex
);
oi
->
ip_blkno
=
0ULL
;
oi
->
ip_clusters
=
0
;
...
...
@@ -1137,9 +1137,9 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err)
/* disable any new recovery threads and wait for any currently
* running ones to exit. Do this before setting the vol_state. */
down
(
&
osb
->
recovery_lock
);
mutex_lock
(
&
osb
->
recovery_lock
);
osb
->
disable_recovery
=
1
;
up
(
&
osb
->
recovery_lock
);
mutex_unlock
(
&
osb
->
recovery_lock
);
wait_event
(
osb
->
recovery_event
,
!
ocfs2_recovery_thread_running
(
osb
));
/* At this point, we know that no more recovery threads can be
...
...
@@ -1254,8 +1254,7 @@ static int ocfs2_initialize_super(struct super_block *sb,
osb
->
sb
=
sb
;
/* Save off for ocfs2_rw_direct */
osb
->
s_sectsize_bits
=
blksize_bits
(
sector_size
);
if
(
!
osb
->
s_sectsize_bits
)
BUG
();
BUG_ON
(
!
osb
->
s_sectsize_bits
);
osb
->
net_response_ids
=
0
;
spin_lock_init
(
&
osb
->
net_response_lock
);
...
...
@@ -1283,7 +1282,7 @@ static int ocfs2_initialize_super(struct super_block *sb,
snprintf
(
osb
->
dev_str
,
sizeof
(
osb
->
dev_str
),
"%u,%u"
,
MAJOR
(
osb
->
sb
->
s_dev
),
MINOR
(
osb
->
sb
->
s_dev
));
init_MUTEX
(
&
osb
->
recovery_lock
);
mutex_init
(
&
osb
->
recovery_lock
);
osb
->
disable_recovery
=
0
;
osb
->
recovery_thread_task
=
NULL
;
...
...
fs/ocfs2/sysfile.c
View file @
d1ffa566
...
...
@@ -77,8 +77,7 @@ struct inode *ocfs2_get_system_file_inode(struct ocfs2_super *osb,
if
(
arr
&&
((
inode
=
*
arr
)
!=
NULL
))
{
/* get a ref in addition to the array ref */
inode
=
igrab
(
inode
);
if
(
!
inode
)
BUG
();
BUG_ON
(
!
inode
);
return
inode
;
}
...
...
@@ -89,8 +88,7 @@ struct inode *ocfs2_get_system_file_inode(struct ocfs2_super *osb,
/* add one more if putting into array for first time */
if
(
arr
&&
inode
)
{
*
arr
=
igrab
(
inode
);
if
(
!*
arr
)
BUG
();
BUG_ON
(
!*
arr
);
}
return
inode
;
}
...
...
fs/ocfs2/uptodate.c
View file @
d1ffa566
...
...
@@ -388,7 +388,7 @@ static void __ocfs2_set_buffer_uptodate(struct ocfs2_inode_info *oi,
}
}
/* Item insertion is guarded by ip_io_
sem
, so the insertion path takes
/* Item insertion is guarded by ip_io_
mutex
, so the insertion path takes
* advantage of this by not rechecking for a duplicate insert during
* the slow case. Additionally, if the cache needs to be bumped up to
* a tree, the code will not recheck after acquiring the lock --
...
...
@@ -418,7 +418,7 @@ void ocfs2_set_buffer_uptodate(struct inode *inode,
(
unsigned
long
long
)
bh
->
b_blocknr
);
/* No need to recheck under spinlock - insertion is guarded by
* ip_io_
sem
*/
* ip_io_
mutex
*/
spin_lock
(
&
oi
->
ip_lock
);
if
(
ocfs2_insert_can_use_array
(
oi
,
ci
))
{
/* Fast case - it's an array and there's a free
...
...
@@ -440,7 +440,7 @@ void ocfs2_set_buffer_uptodate(struct inode *inode,
/* Called against a newly allocated buffer. Most likely nobody should
* be able to read this sort of metadata while it's still being
* allocated, but this is careful to take ip_io_
sem
anyway. */
* allocated, but this is careful to take ip_io_
mutex
anyway. */
void
ocfs2_set_new_buffer_uptodate
(
struct
inode
*
inode
,
struct
buffer_head
*
bh
)
{
...
...
@@ -451,9 +451,9 @@ void ocfs2_set_new_buffer_uptodate(struct inode *inode,
set_buffer_uptodate
(
bh
);
down
(
&
oi
->
ip_io_sem
);
mutex_lock
(
&
oi
->
ip_io_mutex
);
ocfs2_set_buffer_uptodate
(
inode
,
bh
);
up
(
&
oi
->
ip_io_sem
);
mutex_unlock
(
&
oi
->
ip_io_mutex
);
}
/* Requires ip_lock. */
...
...
@@ -537,7 +537,7 @@ int __init init_ocfs2_uptodate_cache(void)
return
0
;
}
void
__exit
exit_ocfs2_uptodate_cache
(
void
)
void
exit_ocfs2_uptodate_cache
(
void
)
{
if
(
ocfs2_uptodate_cachep
)
kmem_cache_destroy
(
ocfs2_uptodate_cachep
);
...
...
fs/ocfs2/uptodate.h
View file @
d1ffa566
...
...
@@ -27,7 +27,7 @@
#define OCFS2_UPTODATE_H
int
__init
init_ocfs2_uptodate_cache
(
void
);
void
__exit
exit_ocfs2_uptodate_cache
(
void
);
void
exit_ocfs2_uptodate_cache
(
void
);
void
ocfs2_metadata_cache_init
(
struct
inode
*
inode
);
void
ocfs2_metadata_cache_purge
(
struct
inode
*
inode
);
...
...
include/linux/configfs.h
View file @
d1ffa566
...
...
@@ -126,7 +126,7 @@ extern struct config_item *config_group_find_obj(struct config_group *, const ch
struct
configfs_attribute
{
c
har
*
ca_name
;
c
onst
char
*
ca_name
;
struct
module
*
ca_owner
;
mode_t
ca_mode
;
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment