Re: [PATCH 1/5] fs: add netlink notification interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 18 Aug 2011, Randy Dunlap wrote:

> On Thu, 18 Aug 2011 14:18:22 +0200 Lukas Czerner wrote:
> 
> 
> >  fs/Makefile        |    2 +-
> >  fs/netlink.c       |  107 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  include/linux/fs.h |   11 +++++
> >  3 files changed, 119 insertions(+), 1 deletions(-)
> >  create mode 100644 fs/netlink.c
> 
> Hi,
> 
> Does this build OK when CONFIG_NET is not enabled?

Good point :), it does not. I'll fix that once I have more comments.

> 
> and also for kernels that do not have CONFIG_NET enabled:  are these
> new netlink messages basically duplicates of printk() calls that are
> already there and will remain there?

No they are not. There is not a single printk I am duplicating right
now.

Thanks!
-Lukas

> 
> Thanks.
> 
> > diff --git a/fs/Makefile b/fs/Makefile
> > index afc1096..7e9c61f 100644
> > --- a/fs/Makefile
> > +++ b/fs/Makefile
> > @@ -11,7 +11,7 @@ obj-y :=	open.o read_write.o file_table.o super.o \
> >  		attr.o bad_inode.o file.o filesystems.o namespace.o \
> >  		seq_file.o xattr.o libfs.o fs-writeback.o \
> >  		pnode.o drop_caches.o splice.o sync.o utimes.o \
> > -		stack.o fs_struct.o statfs.o
> > +		stack.o fs_struct.o statfs.o netlink.o
> >  
> >  ifeq ($(CONFIG_BLOCK),y)
> >  obj-y +=	buffer.o bio.o block_dev.o direct-io.o mpage.o ioprio.o
> > diff --git a/fs/netlink.c b/fs/netlink.c
> > new file mode 100644
> > index 0000000..15c44a1
> > --- /dev/null
> > +++ b/fs/netlink.c
> > @@ -0,0 +1,107 @@
> > +#include <linux/fs.h>
> > +#include <linux/cred.h>
> > +#include <linux/init.h>
> > +#include <linux/module.h>
> > +#include <linux/kernel.h>
> > +#include <linux/sched.h>
> > +#include <linux/slab.h>
> > +#include <net/netlink.h>
> > +#include <net/genetlink.h>
> > +
> > +enum {
> > +	FS_NL_A_UNSPEC,
> > +	FS_NL_A_WARNING,
> > +	FS_NL_A_DEV_MAJOR,
> > +	FS_NL_A_DEV_MINOR,
> > +	FS_NL_A_CAUSED_ID,
> > +	__FS_NL_A_MAX,
> > +};
> > +#define FS_NL_A_MAX (__FS_NL_A_MAX - 1)
> > +
> > +enum {
> > +	FS_NL_C_UNSPEC,
> > +	FS_NL_C_WARNING,
> > +	__FS_NL_C_MAX,
> > +};
> > +#define FS_NL_C_MAX (__FS_NL_C_MAX - 1)
> > +
> > +
> > +static struct genl_family fs_genl_family = {
> > +	.id = GENL_ID_GENERATE,
> > +	.hdrsize = 0,
> > +	.name = "FS_MSG",
> > +	.version = 1,
> > +	.maxattr = FS_NL_A_MAX,
> > +};
> > +static int registered;
> > +
> > +/**
> > + * fs_nl_send_warning - Send warning from file system to userspace
> > + * @dev: The device on which the fs is mounted
> > + * @warntype: The type of the warning
> > + *
> > + * This can be used by file systems to send a warning message to the
> > + * userspace.
> > + */
> > +
> > +void fs_nl_send_warning(dev_t dev, unsigned int warntype)
> > +{
> > +	static atomic_t seq;
> > +	struct sk_buff *skb;
> > +	void *msg_head;
> > +	int ret;
> > +	int msg_size = nla_total_size(sizeof(u64)) +
> > +			3 * nla_total_size(sizeof(u32));
> > +
> > +	/* We have to allocate using GFP_NOFS as we are called from a
> > +	 * filesystem performing write and thus further recursion into
> > +	 * the fs to free some data could cause deadlocks. */
> > +	skb = genlmsg_new(msg_size, GFP_NOFS);
> > +	if (!skb) {
> > +		printk(KERN_ERR
> > +		  "VFS: Not enough memory to send fs warning.\n");
> > +		return;
> > +	}
> > +	msg_head = genlmsg_put(skb, 0, atomic_add_return(1, &seq),
> > +			&fs_genl_family, 0, FS_NL_C_WARNING);
> > +	if (!msg_head) {
> > +		printk(KERN_ERR
> > +		  "VFS: Cannot store netlink header in fs warning.\n");
> > +		goto err_out;
> > +	}
> > +	ret = nla_put_u32(skb, FS_NL_A_WARNING, warntype);
> > +	if (ret)
> > +		goto attr_err_out;
> > +	ret = nla_put_u32(skb, FS_NL_A_DEV_MAJOR, MAJOR(dev));
> > +	if (ret)
> > +		goto attr_err_out;
> > +	ret = nla_put_u32(skb, FS_NL_A_DEV_MINOR, MINOR(dev));
> > +	if (ret)
> > +		goto attr_err_out;
> > +	ret = nla_put_u64(skb, FS_NL_A_CAUSED_ID, current_uid());
> > +	if (ret)
> > +		goto attr_err_out;
> > +	genlmsg_end(skb, msg_head);
> > +	genlmsg_multicast(skb, 0, fs_genl_family.id, GFP_NOFS);
> > +	return;
> > +attr_err_out:
> > +	printk(KERN_ERR "VFS: Not enough space to compose "
> > +			"fs netlink message!\n");
> > +err_out:
> > +	kfree_skb(skb);
> > +}
> > +EXPORT_SYMBOL(fs_nl_send_warning);
> > +
> > +void init_fs_nl_family(void)
> > +{
> > +	if (registered)
> > +		return;
> > +
> > +	if (genl_register_family(&fs_genl_family) != 0) {
> > +		printk(KERN_ERR
> > +		       "VFS: Failed to create fs netlink interface.\n");
> > +		return;
> > +	}
> > +	registered = 1;
> > +}
> > +EXPORT_SYMBOL(init_fs_nl_family);
> 
> 
> ---
> ~Randy
> *** Remember to use Documentation/SubmitChecklist when testing your code ***
> 

-- 
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux