Whamcloud - gitweb
Revert the reservation part of the bug 2059 changes. This seems to have
authoradilger <adilger>
Wed, 17 Mar 2004 11:46:23 +0000 (11:46 +0000)
committeradilger <adilger>
Wed, 17 Mar 2004 11:46:23 +0000 (11:46 +0000)
been causing problems on the OSTs and wasn't the primary reason for applying
this patch to 1.2.
b=2059

lustre/include/linux/lustre_fsfilt.h
lustre/include/linux/obd.h
lustre/obdclass/obd_config.c
lustre/obdfilter/filter_io.c

index 6fd4527..40e9914 100644 (file)
@@ -93,128 +93,31 @@ extern void fsfilt_put_ops(struct fsfilt_operations *fs_ops);
 #define FSFILT_OP_LINK           9
 #define FSFILT_OP_CANCEL_UNLINK 10
 
-struct obd_handle {
-        void *orh_filt_handle;
-        int orh_reserve;
-};
-
-/* very similar to obd_statfs(), but caller already holds obd_osfs_lock */
-static inline int fsfilt_statfs(struct obd_device *obd, struct super_block *sb,
-                                unsigned long max_age)
-{
-        int rc = 0;
-
-        CDEBUG(D_SUPER, "osfs %lu, max_age %lu\n", obd->obd_osfs_age, max_age);
-        if (time_before(obd->obd_osfs_age, max_age)) {
-                rc = obd->obd_fsops->fs_statfs(sb, &obd->obd_osfs);
-                if (rc == 0) /* N.B. statfs can't really fail */
-                        obd->obd_osfs_age = jiffies;
-        } else {
-                CDEBUG(D_SUPER, "using cached obd_statfs data\n");
-        }
-
-        return rc;
-}
-
-static inline int fsfilt_reserve(struct obd_device *obd, struct super_block *sb,
-                                 int reserve, struct obd_handle **h)
-{
-        struct obd_handle *handle;
-
-        OBD_ALLOC(handle, sizeof(*handle));
-        if (!handle)
-                return -ENOMEM;
-
-        /* Perform space reservation if needed */
-        if (reserve) {
-                spin_lock(&obd->obd_osfs_lock);
-                obd->obd_reserve_freespace_estimated -= reserve;
-                if (obd->obd_reserve_freespace_estimated < 0) {
-                        int rc = fsfilt_statfs(obd, sb, jiffies - 1);
-                        if (rc) {
-                                CERROR("statfs failed during reservation\n");
-                                spin_unlock(&obd->obd_osfs_lock);
-                                OBD_FREE(handle, sizeof(*handle));
-                                return rc;
-                        }
-                        /* Some filesystems (e.g. reiserfs) report more space
-                         * available compared to what is really available
-                         * (reiserfs reserves 1996K for itself).
-                         */
-                        obd->obd_reserve_freespace_estimated =
-                                obd->obd_osfs.os_bfree-obd->obd_reserve_space;
-                        if (obd->obd_reserve_freespace_estimated < reserve) {
-                                spin_unlock(&obd->obd_osfs_lock);
-                                OBD_FREE(handle, sizeof(*handle));
-                                return -ENOSPC;
-                        }
-                        obd->obd_reserve_freespace_estimated -= reserve;
-                }
-                obd->obd_reserve_space += reserve;
-                handle->orh_reserve = reserve;
-                spin_unlock(&obd->obd_osfs_lock);
-        }
-        *h = handle;
-        return 0;
-}
-
-static inline void fsfilt_release(struct obd_device *obd,
-                                  struct obd_handle *handle)
-{
-        struct obd_handle *h = handle;
-
-        spin_lock(&obd->obd_osfs_lock);
-        obd->obd_reserve_space -= h->orh_reserve;
-        LASSERT(obd->obd_reserve_space >= 0);
-        spin_unlock(&obd->obd_osfs_lock);
-
-        OBD_FREE(h, sizeof(*h));
-}
-
 static inline void *fsfilt_start_log(struct obd_device *obd,
                                      struct inode *inode, int op,
                                      struct obd_trans_info *oti, int logs)
 {
         unsigned long now = jiffies;
-        struct obd_handle *parent_handle = oti ? oti->oti_handle : NULL, *h;
-        int reserve = 0;
-        int rc;
-
-        if (obd->obd_fsops->fs_get_op_len)
-                reserve = obd->obd_fsops->fs_get_op_len(op, NULL, logs);
-
-        rc = fsfilt_reserve(obd, inode->i_sb, reserve, &h);
-        if (rc)
-                return ERR_PTR(rc);
-
-        h->orh_filt_handle = obd->obd_fsops->fs_start(inode, op, parent_handle,
-                                                      logs);
-        CDEBUG(D_HA, "started handle %p (%p)\n", h->orh_filt_handle,
-               parent_handle);
-        if (IS_ERR(h->orh_filt_handle)) {
-                rc = PTR_ERR(h->orh_filt_handle);
-                fsfilt_release(obd, h);
-                RETURN(ERR_PTR(rc));
-        }
+        void *parent_handle = oti ? oti->oti_handle : NULL;
+        void *handle = obd->obd_fsops->fs_start(inode, op, parent_handle, logs);
+        CDEBUG(D_HA, "started handle %p (%p)\n", handle, parent_handle);
 
         if (oti != NULL) {
                 if (parent_handle == NULL) {
-                        oti->oti_handle = h;
-                } else if (h->orh_filt_handle != parent_handle) {
+                        oti->oti_handle = handle;
+                } else if (handle != parent_handle) {
                         CERROR("mismatch: parent %p, handle %p, oti %p\n",
-                               parent_handle->orh_filt_handle,
-                               h->orh_filt_handle, oti);
+                               parent_handle, handle, oti);
                         LBUG();
                 }
         }
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("long journal start time %lus\n", (jiffies - now) / HZ);
-        return h;
+        return handle;
 }
 
-static inline void *fsfilt_start(struct obd_device *obd,
-                                        struct inode *inode, int op,
-                                        struct obd_trans_info *oti)
+static inline void *fsfilt_start(struct obd_device *obd, struct inode *inode,
+                                 int op, struct obd_trans_info *oti)
 {
         return fsfilt_start_log(obd, inode, op, oti, 0);
 }
@@ -226,38 +129,24 @@ static inline void *fsfilt_brw_start_log(struct obd_device *obd,
                                          struct obd_trans_info *oti, int logs)
 {
         unsigned long now = jiffies;
-        struct obd_handle *parent_handle = oti ? oti->oti_handle : NULL, *h;
-        int reserve = 0;
-        int rc;
-
-        if (obd->obd_fsops->fs_get_op_len)
-                reserve = obd->obd_fsops->fs_get_op_len(objcount, fso, logs);
-
-        rc = fsfilt_reserve(obd, fso->fso_dentry->d_inode->i_sb, reserve, &h);
-        if (rc)
-                return ERR_PTR(rc);
-
-        h->orh_filt_handle = obd->obd_fsops->fs_brw_start(objcount, fso,
-                                                          niocount, nb,
-                                                          parent_handle, logs);
-        CDEBUG(D_HA, "started handle %p (%p)\n", h->orh_filt_handle,
-                                                 parent_handle);
+        void *parent_handle = oti ? oti->oti_handle : NULL;
+        void *handle = obd->obd_fsops->fs_brw_start(objcount, fso, niocount, nb,
+                                                    parent_handle, logs);
+        CDEBUG(D_HA, "started handle %p (%p)\n", handle, parent_handle);
 
         if (oti != NULL) {
                 if (parent_handle == NULL) {
-                        oti->oti_handle = h;
-                } else if (h->orh_filt_handle !=
-                           parent_handle->orh_filt_handle) {
+                        oti->oti_handle = handle;
+                } else if (handle != parent_handle) {
                         CERROR("mismatch: parent %p, handle %p, oti %p\n",
-                               parent_handle->orh_filt_handle,
-                               h->orh_filt_handle, oti);
+                               parent_handle, handle, oti);
                         LBUG();
                 }
         }
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("long journal start time %lus\n", (jiffies - now) / HZ);
 
-        return h;
+        return handle;
 }
 
 static inline void *fsfilt_brw_start(struct obd_device *obd, int objcount,
@@ -272,17 +161,12 @@ static inline int fsfilt_commit(struct obd_device *obd, struct inode *inode,
                                 void *handle, int force_sync)
 {
         unsigned long now = jiffies;
-        struct obd_handle *h = handle;
-        int rc;
-
-        rc = obd->obd_fsops->fs_commit(inode, h->orh_filt_handle, force_sync);
-        CDEBUG(D_HA, "committing handle %p\n", h->orh_filt_handle);
+        int rc = obd->obd_fsops->fs_commit(inode, handle, force_sync);
+        CDEBUG(D_HA, "committing handle %p\n", handle);
 
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("long journal start time %lus\n", (jiffies - now) / HZ);
 
-        fsfilt_release(obd, h);
-
         return rc;
 }
 
@@ -291,18 +175,12 @@ static inline int fsfilt_commit_async(struct obd_device *obd,
                                       void **wait_handle)
 {
         unsigned long now = jiffies;
-        struct obd_handle *h = handle;
-        int rc;
-
-        rc = obd->obd_fsops->fs_commit_async(inode, h->orh_filt_handle,
-                                             wait_handle);
+        int rc = obd->obd_fsops->fs_commit_async(inode, handle, wait_handle);
 
         CDEBUG(D_HA, "committing handle %p (async)\n", *wait_handle);
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("long journal start time %lus\n", (jiffies - now) / HZ);
 
-        fsfilt_release(obd, h);
-
         return rc;
 }
 
@@ -321,9 +199,8 @@ static inline int fsfilt_setattr(struct obd_device *obd, struct dentry *dentry,
                                  void *handle, struct iattr *iattr,int do_trunc)
 {
         unsigned long now = jiffies;
-        struct obd_handle *h = handle;
         int rc;
-        rc = obd->obd_fsops->fs_setattr(dentry, h->orh_filt_handle, iattr, do_trunc);
+        rc = obd->obd_fsops->fs_setattr(dentry, handle, iattr, do_trunc);
         if (time_after(jiffies, now + 15 * HZ))
                 CERROR("long setattr time %lus\n", (jiffies - now) / HZ);
         return rc;
@@ -339,8 +216,7 @@ static inline int fsfilt_iocontrol(struct obd_device *obd, struct inode *inode,
 static inline int fsfilt_set_md(struct obd_device *obd, struct inode *inode,
                                 void *handle, void *md, int size)
 {
-        struct obd_handle *h = handle;
-        return obd->obd_fsops->fs_set_md(inode, h->orh_filt_handle, md, size);
+        return obd->obd_fsops->fs_set_md(inode, handle, md, size);
 }
 
 static inline int fsfilt_get_md(struct obd_device *obd, struct inode *inode,
@@ -360,10 +236,26 @@ static inline int fsfilt_add_journal_cb(struct obd_device *obd, __u64 last_rcvd,
                                         void *handle, fsfilt_cb_t cb_func,
                                         void *cb_data)
 {
-        struct obd_handle *h = handle;
         return obd->obd_fsops->fs_add_journal_cb(obd, last_rcvd,
-                                                 h->orh_filt_handle, cb_func,
-                                                 cb_data);
+                                                 handle, cb_func, cb_data);
+}
+
+/* very similar to obd_statfs(), but caller already holds obd_osfs_lock */
+static inline int fsfilt_statfs(struct obd_device *obd, struct super_block *sb,
+                                unsigned long max_age)
+{
+        int rc = 0;
+
+        CDEBUG(D_SUPER, "osfs %lu, max_age %lu\n", obd->obd_osfs_age, max_age);
+        if (time_before(obd->obd_osfs_age, max_age)) {
+                rc = obd->obd_fsops->fs_statfs(sb, &obd->obd_osfs);
+                if (rc == 0) /* N.B. statfs can't really fail */
+                        obd->obd_osfs_age = jiffies;
+        } else {
+                CDEBUG(D_SUPER, "using cached obd_statfs data\n");
+        }
+
+        return rc;
 }
 
 static inline int fsfilt_sync(struct obd_device *obd, struct super_block *sb)
index 561bfe4..d25ca30 100644 (file)
@@ -518,14 +518,6 @@ struct obd_device {
         struct lprocfs_stats  *obd_stats;
         struct proc_dir_entry *obd_svc_procroot;
         struct lprocfs_stats  *obd_svc_stats;
-        /* Fields used for fsfilt reservations. */
-        int  obd_reserve_space;        /* protected by obd_osfs_lock */
-        /* This field contains cached statfs(2) amount of free blocks,
-           each time reservation is made, we substract reserved amount from this
-           field until zero is reached. Then we call statfs(2) again. This
-           allows to minimize statfs(2) calls on filesystems with lots of free
-           space. */
-        long obd_reserve_freespace_estimated;
 };
 
 #define OBD_OPT_FORCE           0x0001
index 956f8fb..41f2258 100644 (file)
@@ -125,7 +125,6 @@ int class_attach(struct lustre_cfg *lcfg)
         spin_lock_init(&obd->obd_osfs_lock);
         obd->obd_osfs_age = jiffies - 1000 * HZ;
         init_waitqueue_head(&obd->obd_refcount_waitq);
-        obd->obd_reserve_freespace_estimated = -1;
 
         /* XXX belongs in setup not attach  */
         /* recovery data */
@@ -234,9 +233,6 @@ int class_detach(struct obd_device *obd, struct lustre_cfg *lcfg)
                 CERROR("OBD device %d not attached\n", obd->obd_minor);
                 RETURN(-ENODEV);
         }
-        if (obd->obd_reserve_space != 0)
-                CERROR("Reserved space on class_detach is %d\n",
-                       obd->obd_reserve_space);
         if (OBP(obd, detach))
                 err = OBP(obd,detach)(obd);
 
index 3dce898..b9e6600 100644 (file)
@@ -151,7 +151,7 @@ static void filter_grant_incoming(struct obd_export *exp, struct obdo *oa)
         EXIT;
 }
 
-#define GRANT_FOR_LLOG(obd) (obd->obd_reserve_space)
+#define GRANT_FOR_LLOG(obd) 16
 
 /* Figure out how much space is available between what we've granted
  * and what remains in the filesystem.  Compensate for ext3 indirect