回写失败的处理:Handle_write_error

        这个函数处理处理writepage的返回值,writepage函数调用文件系统写入的函数,然后返回写入的状态。通过内核源码的查看:

  res = mapping->a_ops->writepage(page, &wbc);		
  if (res < 0)
			handle_write_error(mapping, page, res);
		if (res == WRITEPAGE_ACTIVATE) {
			ClearPageReclaim(page);
			return PAGE_ACTIVATE;
		}
		if (!PageWriteback(page)) {
			/* synchronous write or broken a_ops? */
			ClearPageReclaim(page);
		}

如下是handle_write_error函数:

 lock_page(page);
 	if (page_mapping(page) == mapping) {
		if (error == -ENOSPC)
			set_bit(AS_ENOSPC, &mapping->flags);
		else
			set_bit(AS_EIO, &mapping->flags);
	}
	unlock_page(page);

从这里我们接收到一个错误:ENOSPC no space没有空间

                                                    AS_EIO  一个写入错误

假设写入错误有以下情况:磁盘离线,磁盘线路中断等等。但是我们回顾到上面,当我们发现IO写入异常,我们什么也没有做,只是简单做了PageWriteback是否是写入的检查,如果不写入,那这个页是否可以被释放,显然,没有。

        如果页既不能够写入,也没有被释放,那就是永久不能够被系统回收利用,这就会导致物理内存耗尽,导致系统崩溃的异常。

你可能感兴趣的:(崩溃,系统写入)