[RFC 2/3] vfs: get_next_ino(), support for the uniqueness

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

 



From: "J. R. Okajima" <hooanon05g@xxxxxxxxx>

Add a feature to keep the uniqueness of inum in the superblock.
In this commit, the parameter superblock sets NULL, so the feature is
OFF. It will be ON individually be thier maintainer.

Signed-off-by: J. R. Okajima <hooanon05g@xxxxxxxxx>
---
 arch/powerpc/platforms/cell/spufs/inode.c |    2 +-
 arch/s390/hypfs/inode.c                   |    2 +-
 drivers/infiniband/hw/ipath/ipath_fs.c    |    2 +-
 drivers/infiniband/hw/qib/qib_fs.c        |    2 +-
 drivers/misc/ibmasm/ibmasmfs.c            |    2 +-
 drivers/oprofile/oprofilefs.c             |    2 +-
 drivers/usb/gadget/f_fs.c                 |    2 +-
 drivers/usb/gadget/inode.c                |    2 +-
 fs/autofs4/inode.c                        |    2 +-
 fs/binfmt_misc.c                          |    2 +-
 fs/configfs/inode.c                       |    2 +-
 fs/debugfs/inode.c                        |    2 +-
 fs/efivarfs/inode.c                       |    2 +-
 fs/freevxfs/vxfs_inode.c                  |    2 +-
 fs/fuse/control.c                         |    2 +-
 fs/hugetlbfs/inode.c                      |    4 +--
 fs/inode.c                                |   55 +++++++++++++++++++++++++++--
 fs/libfs.c                                |    2 +-
 fs/ocfs2/dlmfs/dlmfs.c                    |    4 +--
 fs/pipe.c                                 |    2 +-
 fs/proc/base.c                            |    2 +-
 fs/proc/proc_sysctl.c                     |    2 +-
 fs/pstore/inode.c                         |    2 +-
 fs/ramfs/inode.c                          |    2 +-
 include/linux/fs.h                        |    2 +-
 ipc/mqueue.c                              |    2 +-
 mm/shmem.c                                |    2 +-
 net/socket.c                              |    2 +-
 net/sunrpc/rpc_pipe.c                     |    2 +-
 security/inode.c                          |    2 +-
 30 files changed, 84 insertions(+), 33 deletions(-)

diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c
index 87ba7cf..9f4c575 100644
--- a/arch/powerpc/platforms/cell/spufs/inode.c
+++ b/arch/powerpc/platforms/cell/spufs/inode.c
@@ -99,7 +99,7 @@ spufs_new_inode(struct super_block *sb, umode_t mode)
 	if (!inode)
 		goto out;
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mode = mode;
 	inode->i_uid = current_fsuid();
 	inode->i_gid = current_fsgid();
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c
index c952b98..224b731 100644
--- a/arch/s390/hypfs/inode.c
+++ b/arch/s390/hypfs/inode.c
@@ -100,7 +100,7 @@ static struct inode *hypfs_make_inode(struct super_block *sb, umode_t mode)
 
 	if (ret) {
 		struct hypfs_sb_info *hypfs_info = sb->s_fs_info;
-		ret->i_ino = get_next_ino();
+		ret->i_ino = get_next_ino(NULL);
 		ret->i_mode = mode;
 		ret->i_uid = hypfs_info->uid;
 		ret->i_gid = hypfs_info->gid;
diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c
index e0c404b..f69eee1 100644
--- a/drivers/infiniband/hw/ipath/ipath_fs.c
+++ b/drivers/infiniband/hw/ipath/ipath_fs.c
@@ -57,7 +57,7 @@ static int ipathfs_mknod(struct inode *dir, struct dentry *dentry,
 		goto bail;
 	}
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mode = mode;
 	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 	inode->i_private = data;
diff --git a/drivers/infiniband/hw/qib/qib_fs.c b/drivers/infiniband/hw/qib/qib_fs.c
index cab610c..2eccd83 100644
--- a/drivers/infiniband/hw/qib/qib_fs.c
+++ b/drivers/infiniband/hw/qib/qib_fs.c
@@ -59,7 +59,7 @@ static int qibfs_mknod(struct inode *dir, struct dentry *dentry,
 		goto bail;
 	}
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mode = mode;
 	inode->i_uid = GLOBAL_ROOT_UID;
 	inode->i_gid = GLOBAL_ROOT_GID;
diff --git a/drivers/misc/ibmasm/ibmasmfs.c b/drivers/misc/ibmasm/ibmasmfs.c
index e8b9331..a9a090f 100644
--- a/drivers/misc/ibmasm/ibmasmfs.c
+++ b/drivers/misc/ibmasm/ibmasmfs.c
@@ -142,7 +142,7 @@ static struct inode *ibmasmfs_make_inode(struct super_block *sb, int mode)
 	struct inode *ret = new_inode(sb);
 
 	if (ret) {
-		ret->i_ino = get_next_ino();
+		ret->i_ino = get_next_ino(NULL);
 		ret->i_mode = mode;
 		ret->i_atime = ret->i_mtime = ret->i_ctime = CURRENT_TIME;
 	}
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c
index 3f49345..3d85783 100644
--- a/drivers/oprofile/oprofilefs.c
+++ b/drivers/oprofile/oprofilefs.c
@@ -28,7 +28,7 @@ static struct inode *oprofilefs_get_inode(struct super_block *sb, int mode)
 	struct inode *inode = new_inode(sb);
 
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode->i_mode = mode;
 		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 	}
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c
index 1e12b3e..088387f 100644
--- a/drivers/usb/gadget/f_fs.c
+++ b/drivers/usb/gadget/f_fs.c
@@ -1096,7 +1096,7 @@ ffs_sb_make_inode(struct super_block *sb, void *data,
 	if (likely(inode)) {
 		struct timespec current_time = CURRENT_TIME;
 
-		inode->i_ino	 = get_next_ino();
+		inode->i_ino	 = get_next_ino(NULL);
 		inode->i_mode    = perms->mode;
 		inode->i_uid     = perms->uid;
 		inode->i_gid     = perms->gid;
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c
index a925d0c..20f5676 100644
--- a/drivers/usb/gadget/inode.c
+++ b/drivers/usb/gadget/inode.c
@@ -1990,7 +1990,7 @@ gadgetfs_make_inode (struct super_block *sb,
 	struct inode *inode = new_inode (sb);
 
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode->i_mode = mode;
 		inode->i_uid = make_kuid(&init_user_ns, default_uid);
 		inode->i_gid = make_kgid(&init_user_ns, default_gid);
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c
index d7bd395..2a05cae 100644
--- a/fs/autofs4/inode.c
+++ b/fs/autofs4/inode.c
@@ -356,7 +356,7 @@ struct inode *autofs4_get_inode(struct super_block *sb, umode_t mode)
 		inode->i_gid = sb->s_root->d_inode->i_gid;
 	}
 	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 
 	if (S_ISDIR(mode)) {
 		set_nlink(inode, 2);
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
index b605003..1ac7d3b 100644
--- a/fs/binfmt_misc.c
+++ b/fs/binfmt_misc.c
@@ -476,7 +476,7 @@ static struct inode *bm_get_inode(struct super_block *sb, int mode)
 	struct inode * inode = new_inode(sb);
 
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode->i_mode = mode;
 		inode->i_atime = inode->i_mtime = inode->i_ctime =
 			current_fs_time(inode->i_sb);
diff --git a/fs/configfs/inode.c b/fs/configfs/inode.c
index a9d35b0..06034b3 100644
--- a/fs/configfs/inode.c
+++ b/fs/configfs/inode.c
@@ -135,7 +135,7 @@ struct inode *configfs_new_inode(umode_t mode, struct configfs_dirent *sd,
 {
 	struct inode * inode = new_inode(s);
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode->i_mapping->a_ops = &configfs_aops;
 		inode->i_mapping->backing_dev_info = &configfs_backing_dev_info;
 		inode->i_op = &configfs_inode_operations;
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index 8c41b52..d29eeb8 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -41,7 +41,7 @@ static struct inode *debugfs_get_inode(struct super_block *sb, umode_t mode, dev
 	struct inode *inode = new_inode(sb);
 
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode->i_mode = mode;
 		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 		switch (mode & S_IFMT) {
diff --git a/fs/efivarfs/inode.c b/fs/efivarfs/inode.c
index 07ab497..3be77f2 100644
--- a/fs/efivarfs/inode.c
+++ b/fs/efivarfs/inode.c
@@ -20,7 +20,7 @@ struct inode *efivarfs_get_inode(struct super_block *sb,
 	struct inode *inode = new_inode(sb);
 
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode->i_mode = mode;
 		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 		switch (mode & S_IFMT) {
diff --git a/fs/freevxfs/vxfs_inode.c b/fs/freevxfs/vxfs_inode.c
index 363e3ae..3976e7f 100644
--- a/fs/freevxfs/vxfs_inode.c
+++ b/fs/freevxfs/vxfs_inode.c
@@ -260,7 +260,7 @@ vxfs_get_fake_inode(struct super_block *sbp, struct vxfs_inode_info *vip)
 	struct inode			*ip = NULL;
 
 	if ((ip = new_inode(sbp))) {
-		ip->i_ino = get_next_ino();
+		ip->i_ino = get_next_ino(NULL);
 		vxfs_iinit(ip, vip);
 		ip->i_mapping->a_ops = &vxfs_aops;
 	}
diff --git a/fs/fuse/control.c b/fs/fuse/control.c
index 205e0d5..5ee65d4 100644
--- a/fs/fuse/control.c
+++ b/fs/fuse/control.c
@@ -216,7 +216,7 @@ static struct dentry *fuse_ctl_add_dentry(struct dentry *parent,
 	if (!inode)
 		return NULL;
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mode = mode;
 	inode->i_uid = fc->user_id;
 	inode->i_gid = fc->group_id;
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index e19d4c0..ca48178 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -453,7 +453,7 @@ static struct inode *hugetlbfs_get_root(struct super_block *sb,
 	inode = new_inode(sb);
 	if (inode) {
 		struct hugetlbfs_inode_info *info;
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode->i_mode = S_IFDIR | config->mode;
 		inode->i_uid = config->uid;
 		inode->i_gid = config->gid;
@@ -491,7 +491,7 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb,
 	inode = new_inode(sb);
 	if (inode) {
 		struct hugetlbfs_inode_info *info;
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode_init_owner(inode, dir, mode);
 		lockdep_set_class(&inode->i_mapping->i_mmap_mutex,
 				&hugetlbfs_i_mmap_mutex_key);
diff --git a/fs/inode.c b/fs/inode.c
index a3e274a..1412607 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -834,8 +834,9 @@ repeat:
 #define LAST_INO_BATCH 1024
 static DEFINE_PER_CPU(unsigned int, last_ino);
 
-unsigned int get_next_ino(void)
+static unsigned int do_get_next_ino(struct super_block *sb, int *pwrapped)
 {
+	static int wrapped;
 	unsigned int *p = &get_cpu_var(last_ino);
 	unsigned int res = *p;
 
@@ -850,10 +851,60 @@ unsigned int get_next_ino(void)
 
 	res++;
 	/* never zero */
-	if (unlikely(!res))
+	if (unlikely(!res)) {
 		res++;
+		wrapped = 1;
+	}
 	*p = res;
 	put_cpu_var(last_ino);
+	*pwrapped = wrapped;
+	return res;
+}
+
+static int test_ino_sb(struct super_block *sb, unsigned long ino)
+{
+	int in_use;
+	struct inode *inode, *next;
+
+	in_use = 0;
+	spin_lock(&inode_sb_list_lock);
+	list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) {
+		if (inode->i_ino != ino)
+			continue;
+		in_use = 1;
+		break;
+	}
+	spin_unlock(&inode_sb_list_lock);
+
+	return in_use;
+}
+
+unsigned int get_next_ino(struct super_block *sb)
+{
+	unsigned int res, ui;
+	int wrapped, used;
+
+	res = do_get_next_ino(sb, &wrapped);
+	if (!sb || !wrapped)
+		goto out;
+
+	/*
+	 * the inode-numbers wrapped around, but we need to keep its uniqueness.
+	 * test_inode_iunique() doesn't suit for filesystem which doesn't insert
+	 * i_hash in creating its inode such like tmpfs, so we search the
+	 * duplication on sb->s_inodes here.
+	 */
+	for (ui = 0; ui < UINT_MAX; ui++) {
+		used = test_ino_sb(sb, res);
+		if (!used)
+			break;
+		res = do_get_next_ino(sb, &wrapped);
+	}
+	WARN_ONCE(used,
+		  "<%x>: the uniqueness of the inode-number is lost\n",
+		  sb->s_dev);
+
+out:
 	return res;
 }
 EXPORT_SYMBOL(get_next_ino);
diff --git a/fs/libfs.c b/fs/libfs.c
index a184424..1c091ff 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1029,7 +1029,7 @@ struct inode *alloc_anon_inode(struct super_block *s)
 	if (!inode)
 		return ERR_PTR(-ENOMEM);
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mapping->a_ops = &anon_aops;
 
 	/*
diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
index 09b7d9d..3b151ca 100644
--- a/fs/ocfs2/dlmfs/dlmfs.c
+++ b/fs/ocfs2/dlmfs/dlmfs.c
@@ -402,7 +402,7 @@ static struct inode *dlmfs_get_root_inode(struct super_block *sb)
 	umode_t mode = S_IFDIR | 0755;
 
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode_init_owner(inode, NULL, mode);
 		inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info;
 		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
@@ -426,7 +426,7 @@ static struct inode *dlmfs_get_inode(struct inode *parent,
 	if (!inode)
 		return NULL;
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode_init_owner(inode, parent, mode);
 	inode->i_mapping->backing_dev_info = &dlmfs_backing_dev_info;
 	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
diff --git a/fs/pipe.c b/fs/pipe.c
index 034bffa..00ee690 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -740,7 +740,7 @@ static struct inode * get_pipe_inode(void)
 	if (!inode)
 		goto fail_inode;
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 
 	pipe = alloc_pipe_info();
 	if (!pipe)
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 2d696b0..d43b2be 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -1518,7 +1518,7 @@ struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *t
 
 	/* Common stuff */
 	ei = PROC_I(inode);
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
 	inode->i_op = &proc_def_inode_operations;
 
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
index 7129046..7457bde 100644
--- a/fs/proc/proc_sysctl.c
+++ b/fs/proc/proc_sysctl.c
@@ -402,7 +402,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb,
 	if (!inode)
 		goto out;
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 
 	sysctl_head_get(head);
 	ei = PROC_I(inode);
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c
index 192297b..f7d03df 100644
--- a/fs/pstore/inode.c
+++ b/fs/pstore/inode.c
@@ -207,7 +207,7 @@ static struct inode *pstore_get_inode(struct super_block *sb)
 {
 	struct inode *inode = new_inode(sb);
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 	}
 	return inode;
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c
index d365b1c..0eff96e 100644
--- a/fs/ramfs/inode.c
+++ b/fs/ramfs/inode.c
@@ -64,7 +64,7 @@ struct inode *ramfs_get_inode(struct super_block *sb,
 	struct inode * inode = new_inode(sb);
 
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode_init_owner(inode, dir, mode);
 		inode->i_mapping->a_ops = &ramfs_aops;
 		inode->i_mapping->backing_dev_info = &ramfs_backing_dev_info;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8780312..807a55f 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2364,7 +2364,7 @@ extern void lockdep_annotate_inode_mutex_key(struct inode *inode);
 static inline void lockdep_annotate_inode_mutex_key(struct inode *inode) { };
 #endif
 extern void unlock_new_inode(struct inode *);
-extern unsigned int get_next_ino(void);
+extern unsigned int get_next_ino(struct super_block *);
 
 extern void __iget(struct inode * inode);
 extern void iget_failed(struct inode *);
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index 4fcf39a..6e456c9 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -225,7 +225,7 @@ static struct inode *mqueue_get_inode(struct super_block *sb,
 	if (!inode)
 		goto err;
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mode = mode;
 	inode->i_uid = current_fsuid();
 	inode->i_gid = current_fsgid();
diff --git a/mm/shmem.c b/mm/shmem.c
index 9f70e02..7dc9f19 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -1306,7 +1306,7 @@ static struct inode *shmem_get_inode(struct super_block *sb, const struct inode
 
 	inode = new_inode(sb);
 	if (inode) {
-		inode->i_ino = get_next_ino();
+		inode->i_ino = get_next_ino(NULL);
 		inode_init_owner(inode, dir, mode);
 		inode->i_blocks = 0;
 		inode->i_mapping->backing_dev_info = &shmem_backing_dev_info;
diff --git a/net/socket.c b/net/socket.c
index abf56b2..bb4b3a2 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -548,7 +548,7 @@ static struct socket *sock_alloc(void)
 	sock = SOCKET_I(inode);
 
 	kmemcheck_annotate_bitfield(sock, type);
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mode = S_IFSOCK | S_IRWXUGO;
 	inode->i_uid = current_fsuid();
 	inode->i_gid = current_fsgid();
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index b185548..a38610b 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -475,7 +475,7 @@ rpc_get_inode(struct super_block *sb, umode_t mode)
 	struct inode *inode = new_inode(sb);
 	if (!inode)
 		return NULL;
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mode = mode;
 	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 	switch (mode & S_IFMT) {
diff --git a/security/inode.c b/security/inode.c
index 43ce6e1..6bd4cdcc 100644
--- a/security/inode.c
+++ b/security/inode.c
@@ -120,7 +120,7 @@ struct dentry *securityfs_create_file(const char *name, umode_t mode,
 		goto out1;
 	}
 
-	inode->i_ino = get_next_ino();
+	inode->i_ino = get_next_ino(NULL);
 	inode->i_mode = mode;
 	inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
 	inode->i_private = data;
-- 
1.7.10.4

--
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