void (* cl_delete_inode)(struct inode *inode);
int (* fs_journal_data)(struct file *file);
int (* fs_set_last_rcvd)(struct mds_obd *mds, void *handle);
+ int (* fs_statfs)(struct super_block *sb, struct statfs *sfs);
};
extern int mds_register_fs_type(struct mds_fs_operations *op, const char *name);
return mds->mds_fsops->fs_journal_data(file);
}
+static inline int mds_fs_statfs(struct mds_obd *mds, struct statfs *sfs)
+{
+ if (mds->mds_fsops->fs_statfs)
+ return mds->mds_fsops->fs_statfs(mds->mds_sb, sfs);
+
+ return vfs_statfs(mds->mds_sb, sfs);
+}
+
#define MDS_FSOP_UNLINK 1
#define MDS_FSOP_RMDIR 2
#define MDS_FSOP_RENAME 3
static int ll_statfs(struct super_block *sb, struct statfs *sfs)
{
struct ptlrpc_request *request = NULL;
- struct statfs obd_sfs;
struct ll_sb_info *sbi = ll_s2sbi(sb);
int rc;
ENTRY;
memset(sfs, 0, sizeof(*sfs));
rc = mdc_statfs(&sbi->ll_mdc_conn, sfs, &request);
ptlrpc_req_finished(request);
- if (rc) {
+ if (rc)
CERROR("obd_statfs fails: rc = %d\n", rc);
- GOTO(out, rc);
- }
- CDEBUG(D_SUPER, "statfs returns blocks %ld/%ld objects %ld/%ld\n",
- sfs->f_bavail, sfs->f_blocks, sfs->f_files,sfs->f_ffree);
+ else
+ CDEBUG(D_SUPER, "statfs shows blocks %ld/%ld objects %ld/%ld\n",
+ sfs->f_bavail, sfs->f_blocks, sfs->f_files,sfs->f_ffree);
/* temporary until mds_statfs returns statfs info for all OSTs */
- rc = obd_statfs(&sbi->ll_osc_conn, &obd_sfs);
- if (rc) {
- CERROR("obd_statfs fails: rc = %d\n", rc);
- GOTO(out, rc);
- }
- CDEBUG(D_SUPER, "obd_statfs returns blocks %ld/%ld\n",
- obd_sfs.f_bavail, obd_sfs.f_blocks);
+ if (!rc) {
+ struct statfs obd_sfs;
- sfs->f_bfree = obd_sfs.f_bfree;
- sfs->f_bavail = obd_sfs.f_bavail;
- sfs->f_blocks = obd_sfs.f_blocks;
+ rc = obd_statfs(&sbi->ll_osc_conn, &obd_sfs);
+ if (rc) {
+ CERROR("obd_statfs fails: rc = %d\n", rc);
+ GOTO(out, rc);
+ }
+ CDEBUG(D_SUPER, "obd_statfs returns blocks %ld/%ld, "
+ "objects %ld/%ld\n",
+ obd_sfs.f_bavail, obd_sfs.f_blocks,
+ obd_sfs.f_ffree, obd_sfs.f_files);
+
+ sfs->f_bfree = obd_sfs.f_bfree;
+ sfs->f_bavail = obd_sfs.f_bavail;
+ sfs->f_blocks = obd_sfs.f_blocks;
+ if (obd_sfs.f_ffree < sfs->f_ffree)
+ sfs->f_ffree = obd_sfs.f_ffree;
+ }
out:
RETURN(rc);
static int __init init_lustre_lite(void)
{
- printk(KERN_INFO "Lustre Lite 0.0.1, braam@clusterfs.com\n");
+ printk(KERN_INFO "Lustre Lite 0.0.1, info@clusterfs.com\n");
ll_file_data_slab = kmem_cache_create("ll_file_data",
sizeof(struct ll_file_data), 0,
SLAB_HWCACHE_ALIGN, NULL, NULL);
kmem_cache_destroy(ll_file_data_slab);
}
-MODULE_AUTHOR("Peter J. Braam <braam@clusterfs.com>");
+MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
MODULE_DESCRIPTION("Lustre Lite Client File System v1.0");
MODULE_LICENSE("GPL");
RETURN(0);
}
-int mdc_enqueue(struct lustre_handle *conn, int lock_type, struct lookup_intent *it,
- int lock_mode, struct inode *dir, struct dentry *de,
- struct lustre_handle *lockh, __u64 id, char *tgt, int tgtlen,
- void *data, int datalen)
+int mdc_enqueue(struct lustre_handle *conn, int lock_type,
+ struct lookup_intent *it, int lock_mode, struct inode *dir,
+ struct dentry *de, struct lustre_handle *lockh, __u64 id,
+ char *tgt, int tgtlen, void *data, int datalen)
{
struct ptlrpc_request *req;
struct obd_device *obddev = class_conn2obd(conn);
return 0;
}
+/*
+ * We need to hack the return value for the free inode counts because
+ * the current EA code requires one filesystem block per inode with EAs,
+ * so it is possible to run out of blocks before we run out of inodes.
+ *
+ * This can be removed when the extN EA code is fixed.
+ */
+static int mds_extN_statfs(struct super_block *sb, struct statfs *sfs)
+{
+ int rc = vfs_statfs(sb, sfs);
+
+ if (!rc && sfs->f_bfree < sfs->f_ffree)
+ sfs->f_ffree = sfs->f_bfree;
+
+ return rc;
+}
+
static struct mds_fs_operations mds_extN_fs_ops = {
fs_start: mds_extN_start,
fs_commit: mds_extN_commit,
cl_delete_inode: clear_inode,
fs_journal_data: mds_extN_journal_data,
fs_set_last_rcvd: mds_extN_set_last_rcvd,
+ fs_statfs: mds_extN_statfs,
};
static int __init mds_extN_init(void)
//rc = extN_xattr_unregister();
}
-MODULE_AUTHOR("Cluster File Systems, Inc. <adilger@clusterfs.com>");
+MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
MODULE_DESCRIPTION("Lustre MDS extN Filesystem Helper v0.1");
MODULE_LICENSE("GPL");
ino_t res = 0;
struct ext2_dir_entry_2 * de;
struct page *page;
-
+
de = ext2_find_entry (dir, dentry, &page);
if (de) {
res = le32_to_cpu(de->inode);
OBD_FAIL_RETURN(OBD_FAIL_OST_DISCONNECT_NET, 0);
rc = target_handle_disconnect(req);
break;
- case OST_GET_INFO:
- CDEBUG(D_INODE, "get_info\n");
- OBD_FAIL_RETURN(OBD_FAIL_OST_GET_INFO_NET, 0);
- rc = ost_get_info(req);
- break;
case OST_CREATE:
CDEBUG(D_INODE, "create\n");
OBD_FAIL_RETURN(OBD_FAIL_OST_CREATE_NET, 0);
class_unregister_type(LUSTRE_OST_NAME);
}
-MODULE_AUTHOR("Peter J. Braam <braam@clusterfs.com>");
+MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
MODULE_DESCRIPTION("Lustre Object Storage Target (OST) v0.01");
MODULE_LICENSE("GPL");