2012-03-05 33 views
5

Xin chào Tôi là một newbie để lập trình hạt nhân. Tôi đang viết một mô-đun hạt nhân nhỏ dựa trên mẫu wrapfs để triển khai cơ chế dự phòng. Đây là hoàn toàn là cơ sở học tập.lưu trữ một số dữ liệu trong cấu trúc inode

Tôi đang mở rộng wrapfs để khi cuộc gọi viết được thực hiện wrapfs rõ ràng sao chép tệp đó trong một thư mục riêng và sau đó viết được thực hiện trên tệp. Nhưng tôi không muốn tôi tạo một bản sao cho mọi cuộc gọi viết.

Cách tiếp cận ngây thơ có thể là tôi kiểm tra sự tồn tại của tệp trong thư mục đó. Nhưng Tôi nghĩ rằng đối với mỗi cuộc gọi, việc kiểm tra này có thể là một hình phạt nghiêm trọng.

Tôi cũng có thể kiểm tra cuộc gọi viết đầu tiên và sau đó lưu trữ giá trị cho tệp cụ thể đó bằng thuộc tính private_data. Nhưng điều đó sẽ không được lưu trữ trên đĩa . Vì vậy, tôi sẽ cần phải kiểm tra lại.

Tôi cũng đang nghĩ đến việc sử dụng thời gian sửa đổi. Tôi có thể tiết kiệm thời gian sửa đổi . Nếu thời gian sửa đổi cũ hơn trước thời điểm đó thì chỉ một bản sao được tạo ra nếu không tôi sẽ không làm gì cả. Tôi đã cố gắng sử dụng inode.i_mtime cho điều này nhưng nó đã được sửa đổi thời gian ngay cả trước khi viết được gọi là, cũng ứng dụng có thể sửa đổi thời gian đó.

Vì vậy, tôi đã nghĩ đến việc lưu trữ một số giá trị inode trên đĩa cho biết bản sao lưu của nó đã được tạo hay chưa. Điều đó có thể không? Bất kỳ đề xuất nào khác hoặc cách tiếp cận đều được hoan nghênh.

+2

Định dạng blob của bạn sẽ giúp bạn nhận được câu hỏi ngay cả _read_. – sehe

Trả lời

0

Về cơ bản, bạn đang nói rằng bạn muốn thực hiện lớp hệ thống tệp ảo Sao chép trên ghi.

IMO, một số trong số này đã được thực hiện và sẽ dễ dàng hơn để triển khai chúng trong vùng người dùng (sử dụng libfuse và mô-đun cầu chì, ví dụ:). Bằng cách đó, bạn có thể làm vua của lâu đài của bạn và thêm siêu dữ liệu của bạn trong bất kỳ cách mà bạn cảm thấy là appriate:

  • chỉ cần thêm (ẩn) metadata file cho mỗi thư mục
  • sử dụng mở rộng POSIX thuộc tính (setfattr và bạn bè)
  • quái, thậm chí bạn có thể sử dụng một cơ sở dữ liệu SQLite

Nếu bạn thực sự nhấn mạnh vào làm những việc này trong kernel, bạn sẽ phải làm việc rất nhiều kể từ khi truy cập vào siêu dữ liệu từ kernel mode được goind để tận nhiều nỗ lực hơn (bạn có thể muốn mô phỏng cơ sở dữ liệu của riêng bạn bằng cách sử dụng bộ nhớ ánh xạ tập tin để giảm thiểu số lượng 'userland (phong cách)' công việc cần thiết và để làm cho nó tương đối dễ dàng để có được nguyên tử và độ tin cậy ngay .


On How Everybody Gets File IO Wrong: see also here

+0

Cảm ơn bạn đã trả lời. Tôi sẽ xem xét sử dụng cầu chì. Nhưng thực ra tôi đã bắt đầu với việc sử dụng wrapfs. Tôi đã thay đổi hủy liên kết mã để gọi đổi tên thay vì hủy liên kết vì vậy Nếu một cái gì đó tôi có thể làm như thao tác bất kỳ cấu trúc inode thuộc tính cho phù hợp với nhu cầu của tôi – gaurav

0

Bạn có thể sử dụng thay vì atimemtime. Trong trường hợp đó, đặt cờ S_NOATIME trên nút inode ngăn không cho cập nhật (xem touch_atime() chức năng tại inode.c). Điều duy nhất bạn cần là gắn kết hệ thống tập tin của bạn với tùy chọn noatime.

+0

@ liya: Tại sao tôi không thể sử dụng mtime? Nhưng vấn đề với việc sử dụng atime là nó sẽ được sửa đổi nếu tập tin được đọc để có thể là một vấn đề với cách tiếp cận này. – gaurav

+0

@gaurav: Với tùy chọn 'noatime' mount không có cập nhật 'atime' khi truy cập. –

+0

Ohh Tôi thấy lựa chọn tốt Tôi thấy, Nhưng tôi không thấy lý do tại sao atime hoạt động và mtime thì không. Cũng sẽ atime của FS thấp hơn cũng sẽ không thay đổi? – gaurav