clear_inode: no
put_super: yes yes maybe (see below)
write_super: no yes maybe (see below)
-statfs: yes no no
+statfs: no no no
remount_fs: yes yes maybe (see below)
umount_begin: yes no maybe (see below)
[mandatory]
->lookup(), ->truncate(), ->create(), ->unlink(), ->mknod(), ->mkdir(),
-->rmdir(), ->link(), ->lseek(), ->symlink(), ->rename(), ->permission()
+->rmdir(), ->link(), ->lseek(), ->symlink(), ->rename()
and ->readdir() are called without BKL now. Grab it on entry, drop upon return
- that will guarantee the same locking you used to have. If your method or its
parts do not need BKL - better yet, now you can shift lock_kernel() and
Use bdev_read_only(bdev) instead of is_read_only(kdev). The latter
is still alive, but only because of the mess in drivers/s390/block/dasd.c.
As soon as it gets fixed is_read_only() will die.
+
+---
+[mandatory]
+
+->permission() is called without BKL now. Grab it on entry, drop upon
+return - that will guarantee the same locking you used to have. If
+your method or its parts do not need BKL - better yet, now you can
+shift lock_kernel() and unlock_kernel() so that they would protect
+exactly what needs to be protected.
+
+---
+[mandatory]
+
+->statfs() is now called without BKL held. BKL should have been
+shifted into individual fs sb_op functions where it's not clear that
+it's safe to remove it. If you don't need it, remove it.
kfree(sbi);
}
-static int capifs_statfs(struct super_block *sb, struct statfs *buf);
-
static struct super_operations capifs_sops = {
put_super: capifs_put_super,
- statfs: capifs_statfs,
+ statfs: simple_statfs,
};
static int capifs_parse_options(char *options, struct capifs_sb_info *sbi)
return -EINVAL;
}
-static int capifs_statfs(struct super_block *sb, struct statfs *buf)
-{
- buf->f_type = CAPIFS_SUPER_MAGIC;
- buf->f_bsize = 1024;
- buf->f_blocks = 0;
- buf->f_bfree = 0;
- buf->f_bavail = 0;
- buf->f_files = 0;
- buf->f_ffree = 0;
- buf->f_namelen = NAME_MAX;
- return 0;
-}
-
static struct inode *capifs_new_inode(struct super_block *sb)
{
struct inode *inode = new_inode(sb);
static int coda_statfs(struct super_block *sb, struct statfs *buf)
{
int error;
+
+ lock_kernel();
error = venus_statfs(sb, buf);
+ unlock_kernel();
+
if (error) {
/* fake something like AFS does */
buf->f_blocks = 9000000;
write_super: ext3_write_super, /* BKL not held. We take it. Needed? */
write_super_lockfs: ext3_write_super_lockfs, /* BKL not held. Take it */
unlockfs: ext3_unlockfs, /* BKL not held. We take it */
- statfs: ext3_statfs, /* BKL held */
+ statfs: ext3_statfs, /* BKL not held. */
remount_fs: ext3_remount, /* BKL held */
};
* Zero.
*
* Locking:
- * We are under bkl and @sbp->s_lock.
+ * No locks held.
*
* Notes:
* This is everything but complete...
int hpfs_statfs(struct super_block *s, struct statfs *buf)
{
+ lock_kernel();
+
/*if (s->s_hpfs_n_free == -1) {*/
s->s_hpfs_n_free = count_bitmaps(s);
s->s_hpfs_n_free_dnodes = hpfs_count_one_bitmap(s, s->s_hpfs_dmap);
buf->f_files = s->s_hpfs_dirband_size / 4;
buf->f_ffree = s->s_hpfs_n_free_dnodes;
buf->f_namelen = 254;
+
+ unlock_kernel();
+
return 0;
}
jffs_statfs(struct super_block *sb, struct statfs *buf)
{
struct jffs_control *c = (struct jffs_control *) sb->u.generic_sbp;
- struct jffs_fmcontrol *fmc = c->fmc;
+ struct jffs_fmcontrol *fmc;
+
+ lock_kernel();
+
+ fmc = c->fmc;
D2(printk("jffs_statfs()\n"));
buf->f_ffree = buf->f_bfree;
/* buf->f_fsid = 0; */
buf->f_namelen = JFFS_MAX_NAME_LEN;
+
+ unlock_kernel();
+
return 0;
}
struct nfs_fsinfo res;
int error;
+ lock_kernel();
+
error = server->rpc_ops->statfs(server, NFS_FH(sb->s_root->d_inode), &res);
buf->f_type = NFS_SUPER_MAGIC;
if (error < 0)
if (res.namelen == 0 || res.namelen > server->namelen)
res.namelen = server->namelen;
buf->f_namelen = res.namelen;
+
+ out:
+ unlock_kernel();
+
return 0;
+
out_err:
- printk("nfs_statfs: statfs error = %d\n", -error);
+ printk(KERN_WARNING "nfs_statfs: statfs error = %d\n", -error);
buf->f_bsize = buf->f_blocks = buf->f_bfree = buf->f_bavail = -1;
- return 0;
+ goto out;
+
}
static int nfs_show_options(struct seq_file *m, struct vfsmount *mnt)
retval = -ENOSYS;
if (sb->s_op && sb->s_op->statfs) {
memset(buf, 0, sizeof(struct statfs));
- lock_kernel();
retval = sb->s_op->statfs(sb, buf);
- unlock_kernel();
}
}
return retval;
static int qnx4_statfs(struct super_block *sb, struct statfs *buf)
{
+ lock_kernel();
+
buf->f_type = sb->s_magic;
buf->f_bsize = sb->s_blocksize;
buf->f_blocks = le32_to_cpu(qnx4_sb(sb)->BitMap->di_size) * 8;
buf->f_bavail = buf->f_bfree;
buf->f_namelen = QNX4_NAME_MAX;
+ unlock_kernel();
+
return 0;
}
static int
smb_statfs(struct super_block *sb, struct statfs *buf)
{
- int result = smb_proc_dskattr(sb, buf);
+ int result;
+
+ lock_kernel();
+
+ result = smb_proc_dskattr(sb, buf);
+
+ unlock_kernel();
buf->f_type = SMB_SUPER_MAGIC;
buf->f_namelen = SMB_MAXPATHLEN;
static int
udf_statfs(struct super_block *sb, struct statfs *buf)
{
+ lock_kernel();
+
buf->f_type = UDF_SUPER_MAGIC;
buf->f_bsize = sb->s_blocksize;
buf->f_blocks = UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb));
/* __kernel_fsid_t f_fsid */
buf->f_namelen = UDF_NAME_LEN;
+ unlock_kernel();
+
return 0;
}
struct ufs_sb_private_info * uspi;
struct ufs_super_block_first * usb1;
+ lock_kernel();
+
uspi = sb->u.ufs_sb.s_uspi;
usb1 = ubh_get_usb_first (USPI_UBH);
buf->f_files = uspi->s_ncg * uspi->s_ipg;
buf->f_ffree = fs32_to_cpu(sb, usb1->fs_cstotal.cs_nifree);
buf->f_namelen = UFS_MAXNAMLEN;
+
+ unlock_kernel();
+
return 0;
}