- fdpic-add-coredump-capability-for-the-elf-fdpic-binfmt-cleanup.patch removed from -mm tree

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

 



The patch titled

     fdpic-add-coredump-capability-for-the-elf-fdpic-binfmt cleanup

has been removed from the -mm tree.  Its filename is

     fdpic-add-coredump-capability-for-the-elf-fdpic-binfmt-cleanup.patch

This patch was dropped because it's being redone

------------------------------------------------------
Subject: fdpic-add-coredump-capability-for-the-elf-fdpic-binfmt cleanup
From: Andrew Morton <akpm@xxxxxxxx>

- 80 col fixes

- coding style fixes

- Use IS_ERR_VALUE, lose a typecast.

- Note that the gfs2 tree(!) has DIV_ROUND_UP() in kernel.h.  We should
  steal that from them and remove the private roundup().

Cc: David Howells <dhowells@xxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 fs/binfmt_elf_fdpic.c |  188 +++++++++++++++++++++++-----------------
 1 files changed, 110 insertions(+), 78 deletions(-)

diff -puN fs/binfmt_elf_fdpic.c~fdpic-add-coredump-capability-for-the-elf-fdpic-binfmt-cleanup fs/binfmt_elf_fdpic.c
--- a/fs/binfmt_elf_fdpic.c~fdpic-add-coredump-capability-for-the-elf-fdpic-binfmt-cleanup
+++ a/fs/binfmt_elf_fdpic.c
@@ -58,9 +58,11 @@ typedef char *elf_caddr_t;
 
 MODULE_LICENSE("GPL");
 
-static int load_elf_fdpic_binary(struct linux_binprm *bprm, struct pt_regs *regs);
+static int load_elf_fdpic_binary(struct linux_binprm *bprm,
+				struct pt_regs *regs);
 //static int load_elf_fdpic_library(struct file *);
-static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params, struct file *file);
+static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params,
+				struct file *file);
 static int elf_fdpic_map_file(struct elf_fdpic_params *params,
 			      struct file *file,
 			      struct mm_struct *mm,
@@ -72,10 +74,11 @@ static int create_elf_fdpic_tables(struc
 				   struct elf_fdpic_params *interp_params);
 
 #ifndef CONFIG_MMU
-static int elf_fdpic_transfer_args_to_stack(struct linux_binprm *bprm, unsigned long *_sp);
-static int elf_fdpic_map_file_constdisp_on_uclinux(struct elf_fdpic_params *params,
-						   struct file *file,
-						   struct mm_struct *mm);
+static int elf_fdpic_transfer_args_to_stack(struct linux_binprm *bprm,
+				unsigned long *_sp);
+static int
+elf_fdpic_map_file_constdisp_on_uclinux(struct elf_fdpic_params *params,
+				struct file *file, struct mm_struct *mm);
 #endif
 
 static int elf_fdpic_map_file_by_direct_mmap(struct elf_fdpic_params *params,
@@ -83,7 +86,8 @@ static int elf_fdpic_map_file_by_direct_
 					     struct mm_struct *mm);
 
 #if defined(USE_ELF_CORE_DUMP) && defined(CONFIG_ELF_CORE)
-static int elf_fdpic_core_dump(long signr, struct pt_regs *regs, struct file *file);
+static int elf_fdpic_core_dump(long signr, struct pt_regs *regs,
+				struct file *file);
 #endif
 
 static struct linux_binfmt elf_fdpic_format = {
@@ -96,8 +100,15 @@ static struct linux_binfmt elf_fdpic_for
 	.min_coredump	= ELF_EXEC_PAGESIZE,
 };
 
-static int __init init_elf_fdpic_binfmt(void)  { return register_binfmt(&elf_fdpic_format); }
-static void __exit exit_elf_fdpic_binfmt(void) { unregister_binfmt(&elf_fdpic_format); }
+static int __init init_elf_fdpic_binfmt(void)
+{
+	return register_binfmt(&elf_fdpic_format);
+}
+
+static void __exit exit_elf_fdpic_binfmt(void)
+{
+	unregister_binfmt(&elf_fdpic_format);
+}
 
 core_initcall(init_elf_fdpic_binfmt);
 module_exit(exit_elf_fdpic_binfmt);
@@ -119,7 +130,8 @@ static int is_elf_fdpic(struct elfhdr *h
 /*
  * read the program headers table into memory
  */
-static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params, struct file *file)
+static int elf_fdpic_fetch_phdrs(struct elf_fdpic_params *params,
+				struct file *file)
 {
 	struct elf32_phdr *phdr;
 	unsigned long size;
@@ -135,7 +147,8 @@ static int elf_fdpic_fetch_phdrs(struct 
 	if (!params->phdrs)
 		return -ENOMEM;
 
-	retval = kernel_read(file, params->hdr.e_phoff, (char *) params->phdrs, size);
+	retval = kernel_read(file, params->hdr.e_phoff,
+				(char *)params->phdrs, size);
 	if (retval < 0)
 		return retval;
 
@@ -161,7 +174,8 @@ static int elf_fdpic_fetch_phdrs(struct 
 /*
  * load an fdpic binary into various bits of memory
  */
-static int load_elf_fdpic_binary(struct linux_binprm *bprm, struct pt_regs *regs)
+static int load_elf_fdpic_binary(struct linux_binprm *bprm,
+				struct pt_regs *regs)
 {
 	struct elf_fdpic_params exec_params, interp_params;
 	struct elf_phdr *phdr;
@@ -226,11 +240,12 @@ static int load_elf_fdpic_binary(struct 
 				goto error;
 			}
 
-			retval = kernel_read(interpreter, 0, bprm->buf, BINPRM_BUF_SIZE);
+			retval = kernel_read(interpreter, 0, bprm->buf,
+						BINPRM_BUF_SIZE);
 			if (retval < 0)
 				goto error;
 
-			interp_params.hdr = *((struct elfhdr *) bprm->buf);
+			interp_params.hdr = *((struct elfhdr *)bprm->buf);
 			break;
 
 		case PT_LOAD:
@@ -309,7 +324,8 @@ static int load_elf_fdpic_binary(struct 
 				  &current->mm->start_stack,
 				  &current->mm->start_brk);
 
-	retval = setup_arg_pages(bprm, current->mm->start_stack, executable_stack);
+	retval = setup_arg_pages(bprm, current->mm->start_stack,
+				executable_stack);
 	if (retval < 0) {
 		send_sig(SIGKILL, current, 0);
 		goto error_kill;
@@ -317,7 +333,8 @@ static int load_elf_fdpic_binary(struct 
 #endif
 
 	/* load the executable and interpreter into memory */
-	retval = elf_fdpic_map_file(&exec_params, bprm->file, current->mm, "executable");
+	retval = elf_fdpic_map_file(&exec_params, bprm->file, current->mm,
+					"executable");
 	if (retval < 0)
 		goto error_kill;
 
@@ -357,31 +374,30 @@ static int load_elf_fdpic_binary(struct 
 					 MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN,
 					 0);
 
-	if (IS_ERR((void *) current->mm->start_brk)) {
+	if (IS_ERR_VALUE(current->mm->start_brk)) {
 		up_write(&current->mm->mmap_sem);
 		retval = current->mm->start_brk;
 		current->mm->start_brk = 0;
 		goto error_kill;
 	}
 
-	if (do_mremap(current->mm->start_brk,
-		      stack_size,
-		      ksize((char *) current->mm->start_brk),
-		      0, 0
-		      ) == current->mm->start_brk
-	    )
+	if (do_mremap(current->mm->start_brk, stack_size,
+		      ksize((char *) current->mm->start_brk), 0, 0) ==
+				current->mm->start_brk)
 		stack_size = ksize((char *) current->mm->start_brk);
 	up_write(&current->mm->mmap_sem);
 
 	current->mm->brk = current->mm->start_brk;
 	current->mm->context.end_brk = current->mm->start_brk;
-	current->mm->context.end_brk += (stack_size > PAGE_SIZE) ? (stack_size - PAGE_SIZE) : 0;
+	current->mm->context.end_brk +=
+			(stack_size > PAGE_SIZE) ? (stack_size - PAGE_SIZE) : 0;
 	current->mm->start_stack = current->mm->start_brk + stack_size;
 #endif
 
 	compute_creds(bprm);
 	current->flags &= ~PF_FORKNOEXEC;
-	if (create_elf_fdpic_tables(bprm, current->mm, &exec_params, &interp_params) < 0)
+	if (create_elf_fdpic_tables(bprm, current->mm, &exec_params,
+					&interp_params) < 0)
 		goto error_kill;
 
 	kdebug("- start_code  %lx",	(long) current->mm->start_code);
@@ -512,11 +528,13 @@ static int create_elf_fdpic_tables(struc
 
 	if (interp_params->loadmap) {
 		len = sizeof(struct elf32_fdpic_loadmap);
-		len += sizeof(struct elf32_fdpic_loadseg) * interp_params->loadmap->nsegs;
+		len += sizeof(struct elf32_fdpic_loadseg) *
+				interp_params->loadmap->nsegs;
 		sp = (sp - len) & ~7UL;
 		interp_params->map_addr = sp;
 
-		if (copy_to_user((void __user *) sp, interp_params->loadmap, len) != 0)
+		if (copy_to_user((void __user *)sp,
+				interp_params->loadmap, len) != 0)
 			return -EFAULT;
 
 		current->mm->context.interp_fdpic_loadmap = (unsigned long) sp;
@@ -540,11 +558,11 @@ static int create_elf_fdpic_tables(struc
 	sp -= sp & 15UL;
 
 	/* put the ELF interpreter info on the stack */
-#define NEW_AUX_ENT(nr, id, val)						\
-	do {									\
+#define NEW_AUX_ENT(nr, id, val)					\
+	do {								\
 		struct { unsigned long _id, _val; } __user *ent = (void __user *) csp;	\
-		__put_user((id), &ent[nr]._id);					\
-		__put_user((val), &ent[nr]._val);				\
+		__put_user((id), &ent[nr]._id);				\
+		__put_user((val), &ent[nr]._val);			\
 	} while (0)
 
 	csp -= 2 * sizeof(unsigned long);
@@ -593,7 +611,8 @@ static int create_elf_fdpic_tables(struc
 #ifdef CONFIG_MMU
 	current->mm->arg_start = bprm->p;
 #else
-	current->mm->arg_start = current->mm->start_stack - (MAX_ARG_PAGES * PAGE_SIZE - bprm->p);
+	current->mm->arg_start = current->mm->start_stack -
+				(MAX_ARG_PAGES * PAGE_SIZE - bprm->p);
 #endif
 
 	p = (char __user *) current->mm->arg_start;
@@ -629,7 +648,8 @@ static int create_elf_fdpic_tables(struc
  * the stack
  */
 #ifndef CONFIG_MMU
-static int elf_fdpic_transfer_args_to_stack(struct linux_binprm *bprm, unsigned long *_sp)
+static int elf_fdpic_transfer_args_to_stack(struct linux_binprm *bprm,
+						unsigned long *_sp)
 {
 	unsigned long index, stop, sp;
 	char *src;
@@ -660,7 +680,8 @@ static int elf_fdpic_transfer_args_to_st
  * load the appropriate binary image (executable or interpreter) into memory
  * - we assume no MMU is available
  * - if no other PIC bits are set in params->hdr->e_flags
- *   - we assume that the LOADable segments in the binary are independently relocatable
+ *   - we assume that the LOADable segments in the binary are independently
+ *     relocatable
  *   - we assume R/O executable segments are shareable
  * - else
  *   - we assume the loadable parts of the image to require fixed displacement
@@ -737,7 +758,8 @@ static int elf_fdpic_map_file(struct elf
 	}
 
 	/* determine where the program header table has wound up if mapped */
-	stop = params->hdr.e_phoff + params->hdr.e_phnum * sizeof (struct elf_phdr);
+	stop = params->hdr.e_phoff +
+			params->hdr.e_phnum * sizeof (struct elf_phdr);
 	phdr = params->phdrs;
 
 	for (loop = 0; loop < params->hdr.e_phnum; loop++, phdr++) {
@@ -751,10 +773,11 @@ static int elf_fdpic_map_file(struct elf
 		seg = loadmap->segs;
 		for (loop = loadmap->nsegs; loop > 0; loop--, seg++) {
 			if (phdr->p_vaddr >= seg->p_vaddr &&
-			    phdr->p_vaddr + phdr->p_filesz <= seg->p_vaddr + seg->p_memsz
-			    ) {
-				params->ph_addr = (phdr->p_vaddr - seg->p_vaddr) + seg->addr +
-					params->hdr.e_phoff - phdr->p_offset;
+			    phdr->p_vaddr + phdr->p_filesz <=
+				seg->p_vaddr + seg->p_memsz) {
+				params->ph_addr = (phdr->p_vaddr-seg->p_vaddr) +
+					seg->addr + params->hdr.e_phoff -
+					phdr->p_offset;
 				break;
 			}
 		}
@@ -770,18 +793,21 @@ static int elf_fdpic_map_file(struct elf
 		seg = loadmap->segs;
 		for (loop = loadmap->nsegs; loop > 0; loop--, seg++) {
 			if (phdr->p_vaddr >= seg->p_vaddr &&
-			    phdr->p_vaddr + phdr->p_memsz <= seg->p_vaddr + seg->p_memsz
-			    ) {
+			    phdr->p_vaddr + phdr->p_memsz <=
+				seg->p_vaddr + seg->p_memsz) {
 				params->dynamic_addr = (phdr->p_vaddr - seg->p_vaddr) + seg->addr;
 
-				/* check the dynamic section contains at least one item, and that
-				 * the last item is a NULL entry */
+				/*
+				 * check the dynamic section contains at least
+				 * one item, and that the last item is a NULL
+				 * entry
+				 */
 				if (phdr->p_memsz == 0 ||
 				    phdr->p_memsz % sizeof(Elf32_Dyn) != 0)
 					goto dynamic_error;
 
 				tmp = phdr->p_memsz / sizeof(Elf32_Dyn);
-				if (((Elf32_Dyn *) params->dynamic_addr)[tmp - 1].d_tag != 0)
+				if (((Elf32_Dyn *)params->dynamic_addr)[tmp - 1].d_tag != 0)
 					goto dynamic_error;
 				break;
 			}
@@ -802,7 +828,8 @@ static int elf_fdpic_map_file(struct elf
 		if (seg->p_vaddr - mseg->p_vaddr == seg->addr - mseg->addr) {
 			load_addr = PAGE_ALIGN(mseg->addr + mseg->p_memsz);
 			if (load_addr == (seg->addr & PAGE_MASK)) {
-				mseg->p_memsz += load_addr - (mseg->addr + mseg->p_memsz);
+				mseg->p_memsz += load_addr -
+						(mseg->addr + mseg->p_memsz);
 				mseg->p_memsz += seg->addr & ~PAGE_MASK;
 				mseg->p_memsz += seg->p_memsz;
 				loadmap->nsegs--;
@@ -854,7 +881,10 @@ static int elf_fdpic_map_file_constdisp_
 	load_addr = params->load_addr;
 	seg = params->loadmap->segs;
 
-	/* determine the bounds of the contiguous overall allocation we must make */
+	/*
+	 * determine the bounds of the contiguous overall allocation we must
+	 * make
+	 */
 	phdr = params->phdrs;
 	for (loop = 0; loop < params->hdr.e_phnum; loop++, phdr++) {
 		if (params->phdrs[loop].p_type != PT_LOAD)
@@ -893,7 +923,8 @@ static int elf_fdpic_map_file_constdisp_
 		seg->p_vaddr = phdr->p_vaddr;
 		seg->p_memsz = phdr->p_memsz;
 
-		ret = file->f_op->read(file, (void *) seg->addr, phdr->p_filesz, &fpos);
+		ret = file->f_op->read(file, (void *)seg->addr,
+					phdr->p_filesz, &fpos);
 		if (ret < 0)
 			return ret;
 
@@ -910,8 +941,7 @@ static int elf_fdpic_map_file_constdisp_
 			if (phdr->p_flags & PF_X) {
 				mm->start_code = seg->addr;
 				mm->end_code = seg->addr + phdr->p_memsz;
-			}
-			else if (!mm->start_data) {
+			} else if (!mm->start_data) {
 				mm->start_data = seg->addr;
 #ifndef CONFIG_MMU
 				mm->end_data = seg->addr + phdr->p_memsz;
@@ -989,14 +1019,14 @@ static int elf_fdpic_map_file_by_direct_
 
 		case ELF_FDPIC_FLAG_CONSTDISP:
 			/* constant displacement
-			 * - can be mapped anywhere, but must be mapped as a unit
+			 * - can be mapped anywhere, but must be mapped as a
+			 *   unit
 			 */
 			if (!dvset) {
 				maddr = load_addr;
 				delta_vaddr = phdr->p_vaddr;
 				dvset = 1;
-			}
-			else {
+			} else {
 				maddr = load_addr + phdr->p_vaddr - delta_vaddr;
 				flags |= MAP_FIXED;
 			}
@@ -1020,13 +1050,14 @@ static int elf_fdpic_map_file_by_direct_
 		up_write(&mm->mmap_sem);
 
 		kdebug("mmap[%d] <file> sz=%lx pr=%x fl=%x of=%lx --> %08lx",
-		       loop, phdr->p_memsz + disp, prot, flags, phdr->p_offset - disp,
-		       maddr);
+			loop, phdr->p_memsz + disp, prot, flags,
+			phdr->p_offset - disp, maddr);
 
-		if (IS_ERR((void *) maddr))
+		if (IS_ERR_VALUE(maddr))
 			return (int) maddr;
 
-		if ((params->flags & ELF_FDPIC_FLAG_ARRANGEMENT) == ELF_FDPIC_FLAG_CONTIGUOUS)
+		if ((params->flags & ELF_FDPIC_FLAG_ARRANGEMENT) ==
+				ELF_FDPIC_FLAG_CONTIGUOUS)
 			load_addr += PAGE_ALIGN(phdr->p_memsz + disp);
 
 		seg->addr = maddr + disp;
@@ -1037,7 +1068,10 @@ static int elf_fdpic_map_file_by_direct_
 		if (phdr->p_offset == 0)
 			params->elfhdr_addr = seg->addr;
 
-		/* clear the bit between beginning of mapping and beginning of PT_LOAD */
+		/*
+		 * clear the bit between beginning of mapping and beginning of
+		 * PT_LOAD
+		 */
 		if (prot & PROT_WRITE && disp > 0) {
 			kdebug("clear[%d] ad=%lx sz=%lx", loop, maddr, disp);
 			clear_user((void __user *) maddr, disp);
@@ -1074,7 +1108,8 @@ static int elf_fdpic_map_file_by_direct_
 		if (prot & PROT_WRITE && excess1 > 0) {
 			kdebug("clear[%d] ad=%lx sz=%lx",
 			       loop, maddr + phdr->p_filesz, excess1);
-			clear_user((void __user *) maddr + phdr->p_filesz, excess1);
+			clear_user((void __user *) maddr + phdr->p_filesz,
+					excess1);
 		}
 
 #else
@@ -1089,8 +1124,7 @@ static int elf_fdpic_map_file_by_direct_
 			if (phdr->p_flags & PF_X) {
 				mm->start_code = maddr;
 				mm->end_code = maddr + phdr->p_memsz;
-			}
-			else if (!mm->start_data) {
+			} else if (!mm->start_data) {
 				mm->start_data = maddr;
 				mm->end_data = maddr + phdr->p_memsz;
 			}
@@ -1152,25 +1186,26 @@ static inline int maydump(struct vm_area
 	 * them either. "dump_write()" can't handle it anyway.
 	 */
 	if (!(vma->vm_flags & VM_READ)) {
-		kdcore("%08lx: %08lx: no (!read)", vma->vm_start, vma->vm_flags);
+		kdcore("%08lx: %08lx: no (!read)",vma->vm_start,vma->vm_flags);
 		return 0;
 	}
 
 	/* Dump shared memory only if mapped from an anonymous file. */
 	if (vma->vm_flags & VM_SHARED) {
 		if (vma->vm_file->f_dentry->d_inode->i_nlink == 0) {
-			kdcore("%08lx: %08lx: no (share)", vma->vm_start, vma->vm_flags);
+			kdcore("%08lx: %08lx: no (share)", vma->vm_start,
+				vma->vm_flags);
 			return 1;
 		}
 
-		kdcore("%08lx: %08lx: no (share)", vma->vm_start, vma->vm_flags);
+		kdcore("%08lx: %08lx: no (share)",vma->vm_start,vma->vm_flags);
 		return 0;
 	}
 
 #ifdef CONFIG_MMU
 	/* If it hasn't been written to, don't write it out */
 	if (!vma->anon_vma) {
-		kdcore("%08lx: %08lx: no (!anon)", vma->vm_start, vma->vm_flags);
+		kdcore("%08lx: %08lx: no (!anon)",vma->vm_start,vma->vm_flags);
 		return 0;
 	}
 #endif
@@ -1260,7 +1295,8 @@ static inline void fill_elf_fdpic_header
 	return;
 }
 
-static inline void fill_elf_note_phdr(struct elf_phdr *phdr, int sz, off_t offset)
+static inline void fill_elf_note_phdr(struct elf_phdr *phdr, int sz,
+					off_t offset)
 {
 	phdr->p_type = PT_NOTE;
 	phdr->p_offset = offset;
@@ -1273,8 +1309,8 @@ static inline void fill_elf_note_phdr(st
 	return;
 }
 
-static inline void fill_note(struct memelfnote *note, const char *name, int type,
-		unsigned int sz, void *data)
+static inline void fill_note(struct memelfnote *note, const char *name,
+			int type, unsigned int sz, void *data)
 {
 	note->name = name;
 	note->type = type;
@@ -1428,29 +1464,24 @@ static int elf_fdpic_dump_segments(struc
 		if (!maydump(vma))
 			continue;
 
-		for (addr = vma->vm_start;
-		     addr < vma->vm_end;
-		     addr += PAGE_SIZE
-		     ) {
+		for (addr = vma->vm_start; addr < vma->vm_end;
+				addr += PAGE_SIZE) {
 			struct vm_area_struct *vma;
 			struct page *page;
 
 			if (get_user_pages(current, current->mm, addr, 1, 0, 1,
 					   &page, &vma) <= 0) {
 				DUMP_SEEK(file->f_pos + PAGE_SIZE);
-			}
-			else if (page == ZERO_PAGE(addr)) {
+			} else if (page == ZERO_PAGE(addr)) {
 				DUMP_SEEK(file->f_pos + PAGE_SIZE);
 				page_cache_release(page);
-			}
-			else {
+			} else {
 				void *kaddr;
 
 				flush_cache_page(vma, addr, page_to_pfn(page));
 				kaddr = kmap(page);
 				if ((*size += PAGE_SIZE) > *limit ||
-				    !dump_write(file, kaddr, PAGE_SIZE)
-				    ) {
+				    !dump_write(file, kaddr, PAGE_SIZE)) {
 					kunmap(page);
 					page_cache_release(page);
 					return -EIO;
@@ -1502,7 +1533,8 @@ static int elf_fdpic_dump_segments(struc
  * and then they are actually written out.  If we run out of core limit
  * we just truncate.
  */
-static int elf_fdpic_core_dump(long signr, struct pt_regs *regs, struct file *file)
+static int elf_fdpic_core_dump(long signr, struct pt_regs *regs,
+				struct file *file)
 {
 #define	NUM_NOTES	6
 	int has_dumped = 0;
_

Patches currently in -mm which might be from akpm@xxxxxxxx are

dont-select-config_hotplug.patch
x86_64-e820c-needs-pgtableh.patch
count_vm_events-fix.patch
add-computone-intelliport-plus-serial-hotplug-support.patch
add-specialix-io8-card-support-hotplug-support.patch
fadvise-remove-dead-comments.patch
vt-remove-vt-specific-declarations-and-definitions-from.patch
tty-remove-include-of-screen_infoh-from-ttyh.patch
md-include-sector-number-in-messages-about-corrected-read-errors.patch
md-oops-workaround.patch

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

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux