用NETLINK实现磁盘满通知
1,363 views| 2008-11-06| 李先静| Linux Mobile, Uncategorized| | 3 条评论转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli@gmail.com>
手机内置FLASH容量有限,在磁盘空间不足的情况下,应该提醒用户进行磁盘清理。这个处理在哪里做比较好呢?每次写入数据时由调用者检测显然是不合理的,因为处理的太多了,何况修改SQLITE等第三方程序也是不明智的,那样会给升级版本带来麻烦。比较好的办法是在文件系统中做处理,最近同事修改了yaffs2支持磁盘满通知功能。做法如下:
在yaffs_fs.c中: #include <net/sock.h> #include <linux/netlink.h> #define DISK_FULL_MSG_SIZE 128 #define NETLINK_DISK_FULL 2 static struct sock * yaffs_sock; 在init_yaffs_fs中: if((yaffs_sock = netlink_kernel_create(NETLINK_DISK_FULL, 1, NULL, THIS_MODULE)) == NULL) { printk(KERN_INFO"netlink_kernel_create fail.\n"); } 在exit_yaffs_fs中: if(yaffs_sock != NULL) { sock_release(yaffs_sock); yaffs_sock = NULL; } 增加两个函数: void yaffs_notify_space_full(const char* partition, const char* type, int totalchunk, int freechunk) { size_t len = 0; char *scratch = NULL; struct sk_buff *skb = NULL; totalchunk >>= 10; freechunk >>= 10; len = DISK_FULL_MSG_SIZE; skb = alloc_skb(len, GFP_KERNEL); if (skb) { scratch = skb_put(skb, len); sprintf(scratch, "diskevent: type=%s total=%dKB free=%dKB partition=%s", type, totalchunk, freechunk, partition); NETLINK_CB(skb).dst_group = 1; netlink_broadcast(yaffs_sock, skb, 0, 1, GFP_KERNEL); } return; } void yaffs_notify_app_if_space_full(yaffs_Device * dev) { if (yaffs_sock) { const char* type = NULL; int totalchunk = (dev->endBlock - dev->startBlock + 1) * dev->nChunksPerBlock * dev->nDataBytesPerChunk; int freechunk = yaffs_GetNumberOfFreeChunks(dev) * dev->nDataBytesPerChunk; if (freechunk < totalchunk / 100) { type = "full"; } else if (freechunk < totalchunk * 5 / 100) { type = "low"; } if(type != NULL) { yaffs_notify_space_full(dev->name, type, totalchunk, freechunk); } } return; }
在yaffs_AllocateChunk中:
yaffs_notify_app_if_space_full(dev);
NETLINK是Linux提供的一种用于内核与用户空间进程通信的方式,使用简单,传输效率高,hotplug事件也是通过这种方式通知udev的。
用户空间监听磁盘满事件的实现很简单,我提供了一个示例,有兴趣的朋友可以到这里下载。
Share
Comments
Tags
Recent Posts
Most Viewed
- 系统程序员成长计划写作提纲 - 19,605 views
- Android IPC机制详解 - 6,277 views
- 系统程序员成长计划-走近专业程序员(上) - 6,253 views
- 系统程序员成长计划-写得又快又好的秘诀(一) - 5,391 views
- 系统程序员成长计划-背景知识 - 5,070 views
- i++循环与i–循环的执行效率 - 4,712 views
- 系统程序员成长计划-Write once, run anywhere(WORA)(上) - 4,701 views
- 系统程序员成长计划-走近专业程序员(下) - 4,254 views
- Linux下的调试工具 - 4,017 views
- Advanced Linux Sound Architecture (ALSA) 研究笔记 - 4,017 views
- 系统程序员成长计划-序 - 3,985 views
- 系统程序员成长计划-写得又快又好的秘诀(三) - 3,930 views
- 中国人与自由软件文化研究(搞笑版) - 3,735 views
- Android中的MessageQueue,Handler,Looper和Thread - 3,686 views
- 答复:我不会OOO,仍然可以XXX - 3,659 views
Categories
- Android (28)
- Broncho-A1-Hack (6)
- DirectFB (7)
- FTK(嵌入式GUI) (24)
- GTK+ (29)
- KVM hack notes (8)
- Linux Mobile (65)
- Management (5)
- Mozilla (9)
- Open Source (5)
- Programming (34)
- Tools (9)
- Uncategorized (23)
- Win32 (3)
- X Windows (31)
- 沉思录 (29)
- 系统程序员成长计划 (67)
Blogroll
gallery
Linux guru
推荐网站
Recent Comments
- Dig on 嵌入式GUI FTK设计与实现-事件源(FtkSource)
- 用心生活每一天 » GNU gprof: linux profiling tools 使用 on gcc profiling的工作原理
- JavaScript for: i++ vs i–-传播、沟通、分享-一直“有你” on i++循环与i–循环的执行效率
- Frankly Law on 嵌入式GUI FTK介绍(11)-交叉编译
- tracing on Linux下的调试工具
- ndljsn on FTK移植指南(初稿)
- tracing on 爬塘朗山
- tracing on GTK+(基于DirectFB)的字体处理
- Kely on 系统程序员成长计划写作提纲
- tracing on 爬塘朗山



November 6th, 2008
jack_fangdb
November 8th, 2008
俺当年在使用netlink是因为比较了copy_to_user 有两种,一种是小数据,一种是大数据,比较啰嗦,烦琐,效率低,不是于手机这样的实时性通信系统,或者传媒这样实时类传输的终端.觉得netlink 这样的钩子的确妙不可言.
但是兄弟不知道测试国没有,反正我是尝试了,我在2.4.x上跑的好好的,后来到了2.6.x系统上,都需要再次移植,但是因为没有精力了,我转岗了,我去作windows mobile 系统去了,所以这些东西再没有人来接手.
admin
November 9th, 2008
呵,你们以前用的montavista linux吧,估计现在很少有人用2.4的内核了。
hezhiroy
November 10th, 2008
很不错的文, 用一个简单明了小例子勾勒出netlink的用途. 希望多有这样的文章,让大家不费劲地学习, 呵呵.